◆ Sapport for developers API reference Error catalog OpenAPI
Sections

Articles

Methods in this section: 2. All methods

MethodPathDescriptionScopesStatus
GET/articlesList articlesarticles:readAvailable
GET/articles/{id}Get an articlearticles:readAvailable
GET /articles Available

#List articles

Articles of your tenant (the SEO section) without their content, by descending updated_at. Articles of the shared platform blog are not included. include_deleted=true returns 422 not_supported: deleted articles are not stored.

Scopes
articles:read
Rate limit
read
Idempotency
not required
Successful response
200 A page of articles.

Parameters

FieldTypeDescription
limitinteger
optional
In: query. Page size: 1 to 100, default 25.
cursorstring
optional
In: query. The next_cursor value from the previous response. Valid for 24 hours; start over when filters change.
statusstring
optional
In: query. Article status.
updated_afterstring
optional
In: query. Only articles updated strictly after the moment. ISO 8601: a date or a date-time.
include_deletedboolean
optional
In: query. true — also return tombstones {id, deleted_at} of deleted records (kept for 30 days).

Response body

FieldTypeDescription
dataarray<ArticleSummary>
required
next_cursorstring
required, may be null
Cursor of the next page; null — the list is exhausted. Valid for 24 hours.

Examples

Request
curl -X GET 'https://wfacademy.org/api/public/v1/articles' \
  -H 'Authorization: Bearer '"$SAPPORT_API_KEY"
Response 200
{
  "data": [
    {
      "id": "EXAMPLE_ID",
      "title": "string",
      "slug": null,
      "status": "string",
      "locale": null,
      "keyword": null,
      "meta_title": null,
      "meta_description": null,
      "cover_image_url": null,
      "word_count": 0,
      "created_at": null,
      "updated_at": null,
      "published_at": null
    }
  ],
  "next_cursor": "EXAMPLE_CURSOR"
}
Error example
{
  "type": "https://wfacademy.org/developers/errors#scope_missing",
  "title": "Scope is missing",
  "status": 403,
  "code": "scope_missing",
  "detail": "EXAMPLE",
  "request_id": "req_EXAMPLE"
}

Examples are illustrative: the key in them is a placeholder (EXAMPLE), field values are made up.

Possible errors

invalid_api_key wrong_cell integration_inactive tenant_inactive ip_not_allowed feature_not_in_plan rate_limited wallet_suspended service_unavailable internal_error scope_missing validation_failed

GET /articles/{id} Available

#Get an article

An article with its content as html (default), markdown or blocks, and its publication state (publication). The HTML is stripped of scripts; a body over 2,000,000 bytes returns 422.

Scopes
articles:read
Rate limit
read
Idempotency
not required
Successful response
200 The article.

Parameters

FieldTypeDescription
idstring
required
In: path. Article id.
formatstring
optional
In: query. Content format.

Response body

FieldTypeDescription
idstring
required
Article id.
titlestring
required
slugstring
required, may be null
statusstring
required
draft — a draft; review — in review; approved — approved; published — published; rejected — rejected; transferred — moved to the blog; external — external.
localestring
required, may be null
Article language (ru, en, id).
keywordstring
required, may be null
The main query of the article.
meta_titlestring
required, may be null
meta_descriptionstring
required, may be null
cover_image_urlstring
required, may be null
word_countinteger
required
created_atstring
required, may be null
ISO 8601 UTC.
updated_atstring
required, may be null
ISO 8601 UTC.
published_atstring
required, may be null
ISO 8601 UTC.
contentobject
required
The article body in the requested format: html and markdown — a string; blocks — an array of {type, html} blocks. The HTML is stripped of scripts, dangerous links and event handlers. For an article whose body moved to the platform blog the content is empty.
publicationArticlePublication
required, may be null
null — the article has not been published through the site module yet.

Examples

Request
curl -X GET 'https://wfacademy.org/api/public/v1/articles/EXAMPLE_ID' \
  -H 'Authorization: Bearer '"$SAPPORT_API_KEY"
Response 200
{
  "id": "EXAMPLE_ID",
  "title": "string",
  "slug": "string",
  "status": "string",
  "locale": "string",
  "keyword": "string",
  "meta_title": "string",
  "meta_description": "string",
  "cover_image_url": "https://example.com/hooks/sapport",
  "word_count": 0,
  "created_at": "2026-10-11T09:00:00Z",
  "updated_at": "2026-10-11T09:00:00Z",
  "published_at": "2026-10-11T09:00:00Z",
  "content": "string",
  "publication": {
    "target": "string",
    "state": "queued",
    "published_url": null,
    "error": null
  }
}
Error example
{
  "type": "https://wfacademy.org/developers/errors#scope_missing",
  "title": "Scope is missing",
  "status": 403,
  "code": "scope_missing",
  "detail": "EXAMPLE",
  "request_id": "req_EXAMPLE"
}

Examples are illustrative: the key in them is a placeholder (EXAMPLE), field values are made up.

Possible errors

invalid_api_key wrong_cell integration_inactive tenant_inactive ip_not_allowed feature_not_in_plan rate_limited wallet_suspended service_unavailable internal_error scope_missing not_found validation_failed