Skip to content

Articles

An article is a long-form post published on Civitai — a guide, workflow write-up, changelog, or announcement. These endpoints expose the same public article feed that powers the website.

Public, edge-cached, rate-limited

Both endpoints are public — they work anonymously and always evaluate the request as anonymous, so a token is optional and never changes the data you get back (the result is a pure function of the URL + your region). Responses are edge-cached (public, s-maxage=300) and conservatively rate-limited; on a 429 respect the Retry-After header. Only published, scanned, non-private articles are ever returned; drafts and private articles are invisible (a private article is indistinguishable from a missing one). Mature content is clamped to the SFW ceiling in restricted regions regardless of the nsfw param.

List articles

GET /api/v1/articles

Auth: Public.

Query parameters

NameTypeDefaultDescription
limitinteger (1–100)100Number of items per page.
cursorstringOpaque keyset cursor ("<v>|<id>"). Use metadata.nextCursor from the previous response. Articles use cursor-based pagination only (no page).
querystringFull-text search over the article title.
tagscomma-separated integersFilter by tag IDs (not names), e.g. tags=5,12.
usernamestringFilter by author username.
sortNewest | Recently Updated | Most Reactions | Most Comments | Most Bookmarks | Most CollectedNewestSort order.
nsfwbooleanfalseIf true, include mature content. Ignored (clamped to SFW) in restricted regions.

A malformed cursor or an invalid param returns 400.

Response

Envelope: { items, metadata: { nextCursor, nextPage } }. Each item mirrors the article feed shape (key fields shown):

json
{
  "items": [
    {
      "id": 15342,
      "title": "Getting started with ComfyUI",
      "publishedAt": "2025-12-18T09:16:12.062Z",
      "createdAt": "2025-12-17T20:02:00.000Z",
      "updatedAt": "2025-12-18T09:16:12.062Z",
      "nsfwLevel": 1,
      "availability": "Public",
      "status": "Published",
      "stats": {
        "favoriteCount": 812,
        "collectedCount": 240,
        "commentCount": 37,
        "likeCount": 640,
        "heartCount": 210,
        "viewCount": 51200,
        "tippedAmountCount": 1450
      },
      "user": {
        "id": 4021,
        "username": "some-creator",
        "image": "https://image.civitai.com/.../avatar.jpeg"
      },
      "tags": [
        { "id": 5, "name": "comfyui", "isCategory": false }
      ],
      "coverImage": {
        "id": 88213,
        "url": "https://image.civitai.com/.../cover.jpeg",
        "nsfwLevel": 1,
        "width": 1024,
        "height": 1024
      }
    }
  ],
  "metadata": {
    "nextCursor": "1734512172|15320",
    "nextPage": "https://civitai.com/api/v1/articles?limit=100&cursor=1734512172%7C15320"
  }
}

metadata.nextCursor / metadata.nextPage are omitted on the last page.

Example

bash
curl "https://civitai.com/api/v1/articles?limit=5&sort=Most%20Reactions&query=comfyui"
GET

Get an article

GET /api/v1/articles/{id}

Auth: Public.

Path parameters

NameTypeDescription
idinteger (1–2147483647)Article ID.

Response

Returns the full article object — the same fields as a list item plus the article body/content — with the moderator-only moderatorNsfwLevel field stripped and the coverImage clamped to the region's public browsing ceiling (a cover above the ceiling is dropped).

Returns 404 if the article doesn't exist or is a draft / unpublished / private article (the two cases are indistinguishable):

json
{ "error": "No article with id 0" }

Example

bash
curl "https://civitai.com/api/v1/articles/4797"
GET

Civitai Developer Documentation