Content Studio
Articles, commentaires et images. Lire, écrire et publier.
GET/api/v1/websites/{websiteId}/articlesList articles
Lists the Content Studio articles for one website, newest first, with pagination. Use view=public to get only the articles that belong on your public blog, with their last published title, description and meta fields. visualCoverage.rate and claimCoverage.rate are null when the writer reported no brands or claims, which means unmeasured, not zero.
Demandearticles:read
Paramètres
Réponses
{
"success": true,
"data": {
"articles": [
{
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"title": "Best AI visibility tools in 2026",
"slug": "best-ai-visibility-tools-2026",
"description": "How the top AI visibility platforms compare on price, engines tracked and setup time.",
"metaTitle": "Best AI visibility tools (2026)",
"metaDescription": "Side-by-side comparison of the top AI visibility platforms in 2026.",
"status": "published",
"tags": [
"blog"
],
"qualityScore": 87,
"visualCoverage": {
"named": 4,
"captured": 3,
"missing": 1,
"rate": 75
},
"claimCoverage": {
"stated": 6,
"verified": 5,
"unverified": 1,
"rate": 83,
"unsourcedAttributions": 0
},
"opportunityId": "5e6f7a8b-1c2d-4e3f-9a0b-c1d2e3f4a5b6",
"language": "en",
"translationOfId": null,
"alternates": [
{
"language": "en",
"slug": "best-ai-visibility-tools-2026",
"isOriginal": true
},
{
"language": "fr",
"slug": "meilleurs-outils-visibilite-ia-2026",
"isOriginal": false
}
],
"createdAt": "2026-05-12T14:08:00.000Z",
"updatedAt": "2026-05-20T09:32:00.000Z",
"publishedAt": "2026-05-15T10:00:00.000Z",
"publishedUrl": "https://example.com/blog/best-ai-visibility-tools-2026"
}
],
"pagination": {
"page": 1,
"pageSize": 20,
"total": 47,
"totalPages": 3,
"hasNextPage": true,
"hasPreviousPage": false
}
}
}POST/api/v1/websites/{websiteId}/articlesCreate or update an article
Creates an article in Content Studio, or updates the existing one when an article with the same slug already exists on this website (200 with updated: true instead of 201). When opportunityId is omitted, the article is matched to an open action on your plan by keyword or title. Raw HTML links in the body are converted to Markdown links. Sending status "published" snapshots the article for the public blog and fills publishedUrl from your blog base URL, but does not push it to a connected CMS; use the update endpoint for that. New articles count against your monthly article quota (429 when it is reached); updates never do.
Demandearticles:write
Paramètres
Corps de la requête
application/jsonRéponses
{
"success": true,
"data": {
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"title": "Best AI visibility tools in 2026",
"slug": "best-ai-visibility-tools-2026",
"status": "draft",
"qualityScore": null,
"visualCoverage": {
"named": 0,
"captured": 0,
"missing": 0,
"rate": null
},
"claimCoverage": {
"stated": 3,
"verified": 3,
"unverified": 0,
"rate": 100,
"unsourcedAttributions": 0
},
"createdAt": "2026-05-29T15:42:00.000Z"
},
"updated": false
}GET/api/v1/websites/{websiteId}/articles/{articleId}Get an article
Returns one article with its full Markdown body, schema markup and generation details. Add view=public to read the last published version instead of the working draft; in that mode an article that is not on the public blog (or is a writing brief) returns 404.
Demandearticles:read
Paramètres
Réponses
{
"success": true,
"data": {
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"title": "Best AI visibility tools in 2026",
"slug": "best-ai-visibility-tools-2026",
"metaDescription": "Side-by-side comparison of the top AI visibility platforms in 2026.",
"content": null,
"contentMarkdown": "# Best AI visibility tools in 2026\n\nAI engines now answer...",
"brief": "Compare the top 8 platforms by price, engines tracked and setup time.",
"schemaMarkup": "{\"@context\":\"https://schema.org\",\"@type\":\"Article\"}",
"status": "published",
"qualityScore": 87,
"generationSteps": null,
"opportunityId": "5e6f7a8b-1c2d-4e3f-9a0b-c1d2e3f4a5b6",
"createdAt": "2026-05-12T14:08:00.000Z",
"updatedAt": "2026-05-20T09:32:00.000Z",
"publishedAt": "2026-05-15T10:00:00.000Z"
}
}PATCH/api/v1/websites/{websiteId}/articles/{articleId}Update an article
Updates any subset of an article's fields. Setting status "published", or sending a publishedUrl for an article never published before, publishes it: title, body, meta description and schema markup are snapshotted for the public blog, the article is pushed to every connected CMS (502 if every CMS fails), publishedUrl is filled from your blog base URL when the article has none, and the linked action is marked completed. Publishing needs the articles:publish privilege, which API keys holding articles:write already include. Changing the title keeps the existing slug so live URLs never break. A content or title change saves the previous version to the revision history.
Demandearticles:write
Paramètres
Corps de la requête
application/jsonRéponses
{
"success": true,
"data": {
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"title": "Best AI visibility tools in 2026",
"slug": "best-ai-visibility-tools-2026",
"status": "published",
"qualityScore": 92,
"publishedUrl": "https://example.com/blog/best-ai-visibility-tools-2026",
"updatedAt": "2026-05-29T16:01:00.000Z"
}
}GET/api/v1/websites/{websiteId}/articles/by-slug/{slug}Get an article by slug
Returns one article looked up by its slug, which is what a blog front end uses to render a page. Same fields as the by-id endpoint plus language, translationOfId and alternates (every language version, itself included) for hreflang tags. With view=public, an article that is not on the public blog (or is a writing brief) returns 404, and translations that are not on the blog are left out of alternates.
Demandearticles:read
Paramètres
Réponses
{
"success": true,
"data": {
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"title": "Best AI visibility tools in 2026",
"slug": "best-ai-visibility-tools-2026",
"metaDescription": "Side-by-side comparison of the top AI visibility platforms in 2026.",
"content": null,
"contentMarkdown": "# Best AI visibility tools in 2026\n\nAI engines now answer...",
"brief": null,
"schemaMarkup": "{\"@context\":\"https://schema.org\",\"@type\":\"Article\"}",
"status": "published",
"qualityScore": 87,
"generationSteps": null,
"opportunityId": "5e6f7a8b-1c2d-4e3f-9a0b-c1d2e3f4a5b6",
"language": "en",
"translationOfId": null,
"alternates": [
{
"language": "en",
"slug": "best-ai-visibility-tools-2026",
"isOriginal": true
},
{
"language": "fr",
"slug": "meilleurs-outils-visibilite-ia-2026",
"isOriginal": false
}
],
"createdAt": "2026-05-12T14:08:00.000Z",
"updatedAt": "2026-05-20T09:32:00.000Z",
"publishedAt": "2026-05-15T10:00:00.000Z"
}
}GET/api/v1/websites/{websiteId}/articles/{articleId}/commentsList article comments
Lists the editorial comments on an article, newest first. Each comment is anchored to a passage of the Markdown body (selectedText plus startOffset and endOffset), so a writer or an assistant can apply the change and then resolve it.
Demandearticles:read
Paramètres
Réponses
{
"success": true,
"data": {
"comments": [
{
"id": "c1d2e3f4-1111-2222-3333-aabbccddeeff",
"articleId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"userId": "user_123",
"userName": "Marc-Olivier",
"selectedText": "AI visibility platforms typically charge per query",
"startOffset": 1240,
"endOffset": 1290,
"comment": "Lead with the price range instead.",
"resolved": false,
"createdAt": "2026-05-22T11:14:00.000Z"
}
]
}
}POST/api/v1/websites/{websiteId}/articles/{articleId}/commentsAdd an article comment
Adds an editorial comment anchored to a passage of the article's Markdown body. API keys have no user, so the comment is attributed to the organization owner. Returns the stored comment with status 201.
Demandearticles:write
Paramètres
Corps de la requête
application/jsonRéponses
{
"success": true,
"data": {
"id": "c1d2e3f4-1111-2222-3333-aabbccddeeff",
"articleId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"userId": "user_owner_123",
"parentId": null,
"selectedText": "AI visibility platforms typically charge per query",
"startOffset": 1240,
"endOffset": 1290,
"comment": "Lead with the price range instead.",
"resolved": false,
"resolvedByUserId": null,
"resolvedAt": null,
"createdAt": "2026-05-29T16:22:00.000Z"
}
}PATCH/api/v1/websites/{websiteId}/articles/{articleId}/commentsResolve an article comment
Marks a comment as resolved, or reopens it. Pass the comment id and the new state in the body. Returns success without the comment.
Demandearticles:write
Paramètres
Corps de la requête
application/jsonRéponses
{
"success": true
}POST/api/v1/websites/{websiteId}/imagesUpload or capture an image
Stores an image for use in an article and returns a public xseek.io URL to embed as . Send multipart/form-data with a file, or JSON with a url to have xSeek take a screenshot of that page (or, with mode "product", fetch the page's own product image first). PNG, JPEG, WebP, GIF and AVIF up to 5 MB. A failed capture returns 502 with captured: false; carry on without the image.
Demandeimages:write
Paramètres
Corps de la requête
application/jsonRéponses
{
"data": {
"id": "7f3a2b1c-4d5e-4f60-8a9b-0c1d2e3f4a5b",
"url": "https://www.xseek.io/images/7f3a2b1c-4d5e-4f60-8a9b-0c1d2e3f4a5b/hubspot-pricing-page.jpg",
"pathname": "web_123/article-images/9c1e2f3a4b5d-screenshot.jpg",
"contentType": "image/jpeg",
"size": 184213,
"alt": "HubSpot pricing page",
"source": "screenshot:https://www.hubspot.com/pricing"
}
}GET/api/v1/websites/{websiteId}/content/searchSearch your site's content
Answers "does my site already cover this?" by searching your articles, crawled pages and knowledge notes by meaning and by keyword. Judge each result on similarity (above about 0.6 the page covers the same ground), not on score, which only orders the list. Without q it returns only the shape of what is indexed (counts by kind and languages). A non-zero pendingIndexing means part of the site is still being indexed, so a missing result is not yet a no.
Demandearticles:read
Paramètres
Réponses
{
"query": "global staffing agencies",
"indexed": {
"total": 412,
"byKind": {
"article": 73,
"page": 331,
"knowledge": 8
},
"languages": [
"en",
"fr"
]
},
"pendingIndexing": 0,
"minSimilarity": 0.45,
"results": [
{
"kind": "article",
"sourceId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"url": "https://example.com/blog/affordable-recruiting-agencies",
"title": "Top 10 Affordable Recruiting Agencies for International Teams",
"excerpt": "Global staffing agencies help you hire abroad without opening an entity...",
"score": 0.0325,
"similarity": 0.66,
"language": "en",
"status": "published",
"keywordTerms": [
"global staffing agencies"
],
"translationOfId": null
}
],
"scoring": {
"similarity": "cosine, -1..1. Judge on this. Above ~0.6 the page covers the same ground.",
"score": "rank fusion, ordinal only. Orders the list. Never threshold on it."
}
}