Skip to content

Resolve a path

GET
/content/delivery/v1/path/{path}
curl --request GET \
--url https://api.ebitex.io/content/delivery/v1/path/example \
--header 'Authorization: Bearer <token>'

Returns whatever is published at a path. kind says what you got:

  • presentation: a page, with its Template, settings and bound component, plus the page’s title and titleSource, and its classification when it has one: the ids of the categories the page was published in, each with all of its ancestors, so a site can say which categories a view was in without a second request. The member is absent for a page with no categories, and it holds ids only (a category’s name is read separately, because a rename should not need a republish).
  • redirect: follow targetPath yourself. Chains are collapsed server-side, and a renamed page’s old path answers with a redirect to the new one.

Name the site with site (a root node id from /sites) or host (the hostname you serve the page under). On a site with locale addressing the locale comes from the address, so locale= is refused. A site that arranges its own languages refuses a locale it does not serve with 400 locale_not_in_site. resolve sets how many levels of references are expanded into content, and ctx carries the visitor context used for personalization.

With an X-Ebitex-Preview-Session header, the page being previewed answers with its draft and X-Ebitex-Preview: draft; every other path answers what is published.

annotate=true adds a preview object to a draft answer, naming the entity and fields each part of the page came from — what a server-rendered site emits so the preview script can draw pins and click-to-edit. It is ignored, not refused, on anything answered as published, so one request shape serves both.

Audiences. Audiences are never read from ctx: a request that sends audiences there is refused with 400 audiences_not_in_ctx. Send the signed audience token from POST /audience/delivery/v1/resolve in the X-Ebitex-Audiences header instead (the SDKs do). A variant on an audience is delivered only to a token that grants it; with no token, or one that is malformed, tampered with, for another organization or expired, you get the default as for a visitor in no audiences. An expired or invalid token also sets the X-Ebitex-Audiences-Status response header so a client can renew.

Gated pages. A page, section or site can be restricted to an audience. Such a page is never returned to a visitor whose token does not grant it. Every response that depends on a token, and every response about a gated page (the page itself or the 403 below), is Cache-Control: private, no-store, so keep it out of shared caches.

Key: a delivery key (content.delivery.read).

path
required
string
site
string format: uuid
host
string
locale
string
resolve
integer | string format: int32
/^-?(?:0|[1-9]\d*)$/
raw
boolean
ctx
string
annotate
boolean
include
Array<string>

OK

locale_not_addressable: the site takes its locale from the address. validation_failed: an unsupported parameter value. audiences_not_in_ctx: ctx carries audiences. preview_raw_unsupported: raw=true with a preview session.

missing_api_key or invalid_api_key: no key was sent, or it is unknown, revoked or expired.

key_realm_mismatch: the key is limited to one realm and this site belongs to a realm outside it. A key with no realm serves every site; one with a realm serves the sites that realm and the realms below it own. preview_site_mismatch: the path is in a different site from the page being previewed. members_only: the page is restricted and the request carries no valid claim for its audience (or one without the verification the audience requires). The body is { "error": "members_only", "gate": { "audienceId", "access": "verified" | "open", "door": { "kind": "signIn" | "form" | "none", "formId"? } }, "unlock": { … } }, where unlock is the Experience to show instead (resolved like any page, in the request’s locale) or { "kind": "builtin", "heading", "message", "doorLabel" } when none is chosen. It never contains the withheld page.

scope_denied: the key lacks this route’s scope. origin_denied or ip_denied: a browser-safe key was used from an origin or address outside its restrictions. app_not_available: Content is not enabled for the organization.

path_not_found: nothing is published at this path. site_not_found: no site matches site or host.

Quota exceeded; Retry-After says how long to wait. too_many_failed_authentications: too many bad keys from this address.