Digitalyser.io for developers
API referenceEditorial

Content items for this project

The editorial pieces produced for this project, paginated — their topic, the formats derived from them, and the production status of each.

The editorial pieces produced for this project, paginated — their topic, the formats derived from them, and the production status of each.

These are produced pieces, not the crawled pages of GET /audits/content. The two are different populations and they do not overlap: this endpoint lists what the content engine wrote, the other counts what the crawler found on the site. A project that has audited sixty-eight pages and produced nothing returns an empty list here — that is an accurate answer, not an error.

This is the list behind GET /contents/{contentId}. It carries enough to choose a piece, not the piece's body.

GET/v1/projects/{projectId}/contents

Authorization

agent-token
AuthorizationBearer <token>

An agent project token. Obtained by OAuth consent for an AI client, or derived per project from an organisation service key for a machine. A scoped API key authenticates the transport but opens no capability: a capability takes its project from the credential.

In: header

Path Parameters

projectId*string

The project this call is about. A routing hint, not an authorisation. The project comes from the credential; this segment exists so multi-project code stays uniform. If it names a project outside the token, the call is refused with routing_hint_mismatch.

Formatuuid

Query Parameters

pageSize?integer

Items per page. Values above 50 are silently reduced to 50 — the response is not an error, it is simply shorter than asked. Read the returned length rather than assuming it.

Range1 <= value <= 50
Default20
page?integer

Page to read, 1-based.

Range1 <= value
Default1

Response Body

application/json

application/json

application/json

application/json

application/json

curl -X GET "https://app.digitalyser.io/api/v1/projects/550e8400-e29b-41d4-a716-446655440000/contents" \  -H "Authorization: Bearer <token>"
{  "contents": [    {      "topic": {        "id": "6b1d8e35-4c70-4a92-8f16-2d9c7a0b5e48",        "projectId": "8f14e45f-ea0e-4b1e-9b7a-2c3d4e5f6071",        "title": "Why an incomplete Google listing costs calls",        "description": "How the three fields readers check before calling — hours, photos, answered reviews — decide whether a listing converts.",        "strategic_note": "Ranks for the queries the audit found unanswered, and the proof is already on hand.",        "marketing_goal": "Get a first audit request from a local business owner",        "target_problem": "People find me but never call",        "keywords": [          "fiche google incomplète",          "visibilité locale artisan"        ],        "intent": "informationnelle",        "persona": "P1 restaurateur",        "category": "actionable_advice",        "cluster": "visibilité locale",        "funnelStage": "TOFU",        "personaRelevance": {          "P1 restaurateur": 0.82,          "P2 artisan": 0.47        },        "recommendedFormats": [          "how_to",          "checklist"        ],        "recommendedCTA": "Check your own listing in two minutes",        "seoTitle": "Incomplete Google listing: the 3 fields that cost you calls",        "status": "approved",        "archivedAt": "2026-09-12T16:20:05.000Z",        "archiveReason": "Covered by a piece published in July; keeping both would split the same query.",        "createdAt": "2026-08-30T10:22:41.000Z",        "updatedAt": "2026-09-19T04:31:52.000Z"      },      "topicId": "6b1d8e35-4c70-4a92-8f16-2d9c7a0b5e48",      "canonicalTitle": "Why an incomplete Google listing costs calls",      "clusterName": "visibilité locale",      "pillarName": "SEO local",      "personaLabel": "P1 restaurateur",      "category": "actionable_advice",      "centralMessage": "Three fields decide whether a listing gets called.",      "selectedAngle": "show_common_mistake",      "desiredImpact": "motivate_to_act",      "targetProblem": "People find me but never call",      "marketingGoal": "Get a first audit request from a local business owner",      "possibleAngles": [        "show_common_mistake",        "propose_solution",        "illustrate_with_example"      ],      "recommendedFormats": [        "how_to",        "checklist"      ],      "keywords": [        "fiche google incomplète",        "visibilité locale artisan"      ],      "strategicNote": "Lead with the search that ends without a call; the audit has the figure.",      "recommendedStructure": [        "What a reader checks first",        "What a complete listing changes",        "What the numbers say"      ],      "recommendedPhrases": [        "dit autrement",        "ce que ça change concrètement"      ],      "recommendedCTA": "Check your own listing in two minutes",      "intent": "informationnelle",      "funnelStage": "TOFU",      "generationProvenance": {        "sourceType": "ai-assisted",        "auditAligned": true      },      "generationStatus": "ready",      "formats": [        {          "id": "f1c07a49-3b82-4d16-9a5e-8c4d2b6f7013",          "contentId": "d94b2f60-1a77-4c85-9e13-6b0f2a7c8d41",          "format": "how_to",          "status": "published",          "platform": "linkedin",          "format_family": "long_form",          "format_variant": "article",          "title": "Incomplete Google listing: the three fields that cost you calls",          "subtitle": "What a reader checks before picking up the phone",          "summary": "Opening hours, photos and answered reviews decide the call. Here is how to check each one.",          "createdAt": "2026-09-16T11:52:44.000Z",          "updatedAt": "2026-09-24T08:15:27.000Z"        }      ]    }  ],  "pagination": {    "page": 1,    "pageSize": 20,    "totalPages": 3,    "totalItems": 47  }}

Generated from the capability registry — API version 1, 18 paths, from 4815355 (2026-10-12).

Was this page helpful?