Stories

Retrieve one story or many, with filtering, pagination, sorting and resolved relations.

Retrieve multiple stories

GET/v2/cdn/stories
shell
curl "https://api.exacta.im/v2/cdn/stories?token=$EXACTA_TOKEN&starts_with=blog/&per_page=25"

Query parameters

tokenrequiredstring

Delivery token. Selects the branch.

versionpublished | draft

Defaults to published. Draft requires a preview token on the preview branch.

pageinteger

Page number, starting at 1.

per_pageinteger

Page size. Defaults to 25 and is capped at 100, matching Storyblok.

starts_withstring

Restrict to a path prefix, e.g. blog/. This is how you scope a query to a folder.

by_uuidsstring

Comma-separated uuids. Returns only those stories.

by_uuids_orderedstring

Accepted as an alias of by_uuids. See the ordering note below.

by_slugsstring

Comma-separated full slugs.

excluding_slugsstring

Comma-separated full slugs to omit from the result.

search_termstring

Case-insensitive match against the story name.

content_typestring

Restrict to a single component type.

with_folders1

Include folders. Omitted by default, as in Storyblok — folders are structure, and /links is the endpoint for them.

sort_bystring

field:asc or field:desc. Supported fields: name, slug, position, created_at, updated_at, published_at. Defaults to position, then full slug.

resolve_relationsstring

Comma-separated relation field names. Referenced stories are returned in rels, which is how the official clients hydrate relations.

Retrieve a single story

GET/v2/cdn/stories/{full_slug}

The path is the story’s full slug, including any folders. A numeric path segment is treated as a story id instead, matching Storyblok’s behaviour.

shell
curl "https://api.exacta.im/v2/cdn/stories/blog/hello-world?token=$EXACTA_TOKEN"

Returns 404 when the slug does not exist on that branch — including when the story exists but is unpublished and you did not ask for drafts with a preview token.

Response

json
{
  "story": {
    "name": "Hello world",
    "created_at": "2026-01-14T09:21:04.000Z",
    "published_at": "2026-02-02T11:03:55.000Z",
    "id": 4183,
    "uuid": "6b2c9b8a-1f43-4a0e-8f2e-2b7a0d5c1e33",
    "content": { "component": "page", "body": [] },
    "slug": "hello-world",
    "full_slug": "blog/hello-world",
    "sort_by_date": null,
    "position": 10,
    "tag_list": [],
    "is_startpage": false,
    "parent_id": 4180,
    "meta_data": null,
    "group_id": null,
    "first_published_at": "2026-02-02T11:03:55.000Z",
    "release_id": null,
    "lang": "default",
    "path": null,
    "alternates": [],
    "default_full_slug": null,
    "translated_slugs": null,
    "updated_at": "2026-02-02T11:03:55.000Z"
  },
  "cv": 1754236800,
  "rels": [],
  "links": []
}