Content Intelligence API
Aggregated reports on score, freshness, and linking per project — one API.
The content intelligence API is the catch-all endpoint for everything that measures content quality at the project level: average score, outdated articles, orphan pages, style profile coverage, and the current internal linking state. Instead of one call per sub-system, a single GET gives you a consolidated view — perfect for dashboards and external reporting tools.
Module context: Content Freshness · Internal Linking · Storylines.
Overview endpoint
| Method | Endpoint | Description | Credits |
|---|---|---|---|
| GET | /v1/content-intelligence?project_id={id} |
Aggregated report across all content sub-systems of a project | — |
| GET | /v1/content-freshness?project_id={id} |
Project-wide freshness list (which articles are stale) | — |
curl "$BASE/content-intelligence?project_id=12" \
-H "Authorization: Bearer $TOKEN" | jq
Response (truncated):
{
"data": {
"project_id": 12,
"articles": {"total": 142, "avg_score": 78, "below_60": 9},
"freshness": {"checked": 120, "stale": 14, "last_run_at": "2026-04-29T09:00:00Z"},
"linking": {"orphans": 3, "suggestions_open": 27},
"style_profiles": {"active": 2, "coverage_pct": 91}
}
}
Storylines
Storylines bundle related articles into a topic cluster with shared pillar content.
| Method | Endpoint | Description |
|---|---|---|
| GET | /v1/projects/{project}/storylines |
List of all storylines |
| POST | /v1/projects/{project}/storylines |
Create new storyline |
| GET | /v1/storylines/{id} |
Detail including associated articles |
| PUT | /v1/storylines/{id} |
Update |
| DELETE | /v1/storylines/{id} |
Delete |
Style Profiles
Define tonality, brand voice, and writing rules that generate/optimize will apply.
| Method | Endpoint | Description | Credits |
|---|---|---|---|
| GET | /v1/projects/{project}/style-profiles |
List (includes source_type, source_url, pending_review, scraped_pages, failure_reason, reviewed_at) |
— |
| POST | /v1/projects/{project}/style-profiles |
Create manually | — |
| GET | /v1/style-profiles/{id} |
Detail (same extra fields) | — |
| PUT | /v1/style-profiles/{id} |
Update (if pending_review=true, implicitly sets it to false and records reviewed_at) |
— |
| DELETE | /v1/style-profiles/{id} |
Delete | — |
| POST | /v1/projects/{project}/style-profiles/from-url |
Start URL-based style analysis as background job. HTTP 202 → { data: { id, status: "pending", source_url, message } } |
25 |
| GET | /v1/style-profiles/{id}/scrape-status |
Poll job status → { status, source_url, scraped_pages, failure_reason, pending_review } |
— |
| POST | /v1/style-profiles/{id}/accept |
Accept profile: sets pending_review=false, reviewed_at=now(). Response: { data: <StyleProfile> } |
— |
| POST | /v1/style-profiles/{id}/discard |
Discard (soft-delete). Only if pending_review=true, else 422. Response: { deleted: true } |
— |
Knowledge Base
Additional context (PDFs, texts, URLs) that generation pulls in as a source.
| Method | Endpoint | Description |
|---|---|---|
| GET | /v1/projects/{project}/knowledge-base |
All entries |
| POST | /v1/projects/{project}/knowledge-base |
Add entry |
| DELETE | /v1/knowledge-base/{id} |
Remove |
Link Lists
Whitelists/blacklists for internal link generation.
| Method | Endpoint |
|---|---|
| GET | /v1/projects/{project}/link-lists |
| POST | /v1/projects/{project}/link-lists |
| DELETE | /v1/link-lists/{id} |
Orphan Scans
Finds articles with no incoming internal links (SEO problem).
| Method | Endpoint | Description |
|---|---|---|
| POST | /v1/projects/{project}/orphan-scans/discover |
Dispatch scan (async) |
| POST | /v1/orphan-scans/{id}/start |
Restart |
| GET | /v1/orphan-scans/{id} |
Status + summary |
| GET | /v1/orphan-scans/{id}/pages |
List of orphan pages |
| DELETE | /v1/orphan-scans/{id} |
Delete |
SCAN=$(curl -s -X POST "$BASE/projects/12/orphan-scans/discover" \
-H "Authorization: Bearer $TOKEN" | jq -r .data.id)
# Poll until status == "completed"
curl -s "$BASE/orphan-scans/$SCAN" -H "Authorization: Bearer $TOKEN" \
| jq '{status, orphans_found}'
curl -s "$BASE/orphan-scans/$SCAN/pages" \
-H "Authorization: Bearer $TOKEN" | jq '.data[].url'
Notes
- The overview endpoint caches internally for 60 s — reports load fast, but values can lag by up to one minute.
freshness.staleonly counts articles with a completed freshness check. Articles that have never had a check do not show up in the stale ratio — see Articles API forPOST /articles/{id}/freshness/check.- Orphan scans are async, but cheap (no credit cost) and idempotent per project — parallel discovers are deduplicated server-side.
- Style profiles only take effect on the next generate/optimize run, not retroactively on existing content.
Related: Articles API · Content Freshness · Internal Linking · Storylines.