Delivery API

Read published content with plain GET requests under /api/p/{ref}/. No auth, open CORS, only published (non-archived) content is exposed. {ref} is a project id or slug.

Nodes

GET /api/p/{ref}/nodes/by-path/*

Resolve a node by its slug path, e.g. /nodes/by-path/blog/about. Accepts ?locale=xx (defaults to the project’s default_locale; 400 invalid_locale otherwise).

Returns the renderable node:

{ "data": {
  "id", "parent_id?", "slug", "type", "title", "locale", "path",
  "blocks": [ { "id", "type", "order", "data" } ],  // locale overrides merged
  "seo": { canonical, robots, og, twitter, hreflang, jsonld, breadcrumbs },
  "translated": true|false
} }

GET /api/p/{ref}/nodes/{id}

Same renderable shape, resolved by node id. Also accepts ?locale.

GET /api/p/{ref}/nodes

List all published nodes (raw rows).

Collection entries

GET /api/p/{ref}/entries

Paginated published entries of a collection. Query: collection (required, slug path), page (1), per_page (20, max 100), q, sort.

{ "data": [ { "id", "slug", "title", "path", "updated_at" } ],
  "total", "page", "per_page" }

Localised read (translations module)

GET /api/p/{ref}/translations/nodes/{nodeId}

The published node merged with a locale’s meta + per-block overrides. Query ?locale=xx (required).

SEO & branding

GET /api/p/{ref}/sitemap.xml

A urlset (or a sitemapindex referencing sitemap-{n}.xml shards above 5000 nodes). One entry per locale with hreflang alternates. Needs the project’s public_base_url.

GET /api/p/{ref}/robots.txt

Standard robots with a Sitemap: line when a base URL is set.

GET /api/p/{ref}/theme

Tenant brand for the login screen (pre-auth): { logo_url, favicon_url, accent_color, name_override }.