Stories
Retrieve one story or many, with filtering, pagination, sorting and resolved relations.
Retrieve multiple stories
/v2/cdn/storiescurl "https://api.exacta.im/v2/cdn/stories?token=$EXACTA_TOKEN&starts_with=blog/&per_page=25"Query parameters
| Parameter | Type | Description |
|---|---|---|
tokenrequired | string | Delivery token. Selects the branch. |
version | published | draft | Defaults to published. Draft requires a preview token on the preview branch. |
page | integer | Page number, starting at 1. |
per_page | integer | Page size. Defaults to 25 and is capped at 100, matching Storyblok. |
starts_with | string | Restrict to a path prefix, e.g. blog/. This is how you scope a query to a folder. |
by_uuids | string | Comma-separated uuids. Returns only those stories. |
by_uuids_ordered | string | Accepted as an alias of by_uuids. See the ordering note below. |
by_slugs | string | Comma-separated full slugs. |
excluding_slugs | string | Comma-separated full slugs to omit from the result. |
search_term | string | Case-insensitive match against the story name. |
content_type | string | Restrict to a single component type. |
with_folders | 1 | Include folders. Omitted by default, as in Storyblok — folders are structure, and /links is the endpoint for them. |
sort_by | string | field:asc or field:desc. Supported fields: name, slug, position, created_at, updated_at, published_at. Defaults to position, then full slug. |
resolve_relations | string | Comma-separated relation field names. Referenced stories are returned in rels, which is how the official clients hydrate relations. |
tokenrequiredstringDelivery token. Selects the branch.
versionpublished | draftDefaults to published. Draft requires a preview token on the preview branch.
pageintegerPage number, starting at 1.
per_pageintegerPage size. Defaults to 25 and is capped at 100, matching Storyblok.
starts_withstringRestrict to a path prefix, e.g. blog/. This is how you scope a query to a folder.
by_uuidsstringComma-separated uuids. Returns only those stories.
by_uuids_orderedstringAccepted as an alias of by_uuids. See the ordering note below.
by_slugsstringComma-separated full slugs.
excluding_slugsstringComma-separated full slugs to omit from the result.
search_termstringCase-insensitive match against the story name.
content_typestringRestrict to a single component type.
with_folders1Include folders. Omitted by default, as in Storyblok — folders are structure, and /links is the endpoint for them.
sort_bystringfield:asc or field:desc. Supported fields: name, slug, position, created_at, updated_at, published_at. Defaults to position, then full slug.
resolve_relationsstringComma-separated relation field names. Referenced stories are returned in rels, which is how the official clients hydrate relations.
Retrieve a single story
/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.
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
{
"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": []
}