Overview

Base URL, the response envelope, cache versions and the caching model behind every delivery response.

Base URL

text
https://api.exacta.im/v2/cdn

Every path below Storyblok’s /v2/cdn keeps its name, its parameters and its response shape. That is deliberate: the migration is a base URL change, so anything that forced you to edit a query would defeat the point.

Endpoints

GET/v2/cdn/stories
GET/v2/cdn/stories/{full_slug}
GET/v2/cdn/links
GET/v2/cdn/spaces/me
GET/v2/cdn/datasources
GET/v2/cdn/datasource_entries
GET/v2/cdn/tags

Common parameters

tokenrequiredstring

Your Exacta delivery token. Selects the branch.

versionpublished | draft

Defaults to published. draft requires a preview token on the preview branch; anywhere else it falls back to published.

cvinteger

Cache version. Accepted for compatibility and ignored — responses are already versioned per branch.

Cache versions

Every response carries a cv field: a unix timestamp that changes only when the branch’s content changes. For a stage branch that means a promotion; for preview it means a sync.

json
{
  "stories": [ /* … */ ],
  "cv": 1754236800,
  "rels": [],
  "links": []
}

Because content on a branch is immutable between promotions, delivery responses are safe to cache hard. Exacta sends a long s-maxage alongside stale-while-revalidate and stale-if-error, so a CDN in front of your site serves almost everything from cache and keeps serving during an origin incident.

http
Cache-Control: public, max-age=0, s-maxage=31536000, stale-while-revalidate=60, stale-if-error=86400
Access-Control-Allow-Origin: *

Response headers

totalinteger

Total matching records, ignoring pagination. Present on list endpoints.

per-pageinteger

Page size actually applied, after the cap.

CORS

  • Delivery responses send Access-Control-Allow-Origin: *. A public token is designed to be read from a browser, so any origin may call these endpoints.
  • This applies to the delivery API only. Dashboard endpoints are session-authenticated and restrict origins.