Migrating from Storyblok
A field-by-field account of what stays identical, what differs, and what is not implemented yet.
Exacta is designed so that migration is a configuration change. This page is the honest version of that claim: what is identical, what differs, and what is not implemented yet.
What you change
- endpoint: 'https://api.storyblok.com/v2/cdn'
- accessToken: '<storyblok-delivery-token>'
+ endpoint: 'https://api.exacta.im/v2/cdn'
+ accessToken: '<exacta-delivery-token>'What stays identical
- The story object — all 23 documented fields, with the same names and types, including ones Exacta has no data for. Those carry Storyblok’s own defaults rather than being omitted.
- The response envelope:
stories,story,cv,rels,links. - Query parameters on
/storiesand/links, includingstarts_with,by_uuids,by_slugs,excluding_slugs,search_term,content_type,sort_byandresolve_relations. - Pagination semantics:
per_pagedefaults to 25 and caps at 100, andtotalcomes back as a header. - Authentication by query parameter, and JSON error bodies.
What differs
| Parameter | Type | Description |
|---|---|---|
Story ids | behavioural | Branch-local, so a story’s id under Exacta will not match its Storyblok id. This is the same rule Storyblok applies across pipeline stages. Key on uuid. |
Freshness | behavioural | Content reflects the last sync or promotion rather than Storyblok’s live state. That delay is the feature — it is what makes a stage stable. |
by_uuids_ordered | parameter | Accepted, but does not currently preserve the order of the uuids you passed. |
cv | parameter | Accepted and ignored on input. Responses are versioned per branch, so passing it changes nothing. |
Story idsbehaviouralBranch-local, so a story’s id under Exacta will not match its Storyblok id. This is the same rule Storyblok applies across pipeline stages. Key on uuid.
FreshnessbehaviouralContent reflects the last sync or promotion rather than Storyblok’s live state. That delay is the feature — it is what makes a stage stable.
by_uuids_orderedparameterAccepted, but does not currently preserve the order of the uuids you passed.
cvparameterAccepted and ignored on input. Responses are versioned per branch, so passing it changes nothing.
What is not implemented yet
| Parameter | Type | Description |
|---|---|---|
Datasources and tags | endpoint | /datasources, /datasource_entries and /tags authenticate and return empty envelopes. They are not synced. |
Localisation | feature | Stories are served as lang: "default", with empty translated_slugs and alternates. Multi-language spaces are not reproduced. |
Releases | feature | release_id is always null. Storyblok releases are not modelled. |
Story-level metadata | field | tag_list, meta_data, group_id and sort_by_date carry defaults rather than your space’s values. |
is_startpage | field | Always false. Folder index entries are not distinguished. |
Datasources and tagsendpoint/datasources, /datasource_entries and /tags authenticate and return empty envelopes. They are not synced.
LocalisationfeatureStories are served as lang: "default", with empty translated_slugs and alternates. Multi-language spaces are not reproduced.
Releasesfeaturerelease_id is always null. Storyblok releases are not modelled.
Story-level metadatafieldtag_list, meta_data, group_id and sort_by_date carry defaults rather than your space’s values.
is_startpagefieldAlways false. Folder index entries are not distinguished.
Rolling back
There is nothing to undo. Your content never left Storyblok, and Exacta only ever read from it. Point the endpoint and token back at Storyblok and your site behaves as it did before.