Delivery API
The public, unauthenticated API that sites use to read content and submit forms.
This page covers the delivery API's response envelope, its endpoints, and example requests.
The delivery API is the public API that sites read content from. It needs no authentication, and every path starts with /api/v1. The panel uses a separate management API that requires a session and is out of scope here.
In the examples below, replace the https://api.example.com placeholder with your CMS address.
Response envelope
Every response uses the same envelope. The payload lives in data.
{
"data": { },
"errorCode": 0,
"errorMessage": "",
"errorId": null,
"requestId": "…",
"hasError": false
}| Field | Meaning |
|---|---|
data | The payload. May be empty on error. |
hasError | true means the request failed. Check this first. |
errorCode | 0 means success. Other values are domain codes, not HTTP status codes. |
errorMessage | An error message you can show to the user. |
errorId | The record ID in error tracking. Share it when asking for support. |
requestId | The request ID. |
Each endpoint group has its own rate limit. A rate-limited request gets HTTP 429 with a Retry-After header. Respect the header and retry later.
Endpoints
| Method | Path | Returns |
|---|---|---|
GET | /page/detail/{language}?path= | Page, SEO, schemas, entities, and component tree |
GET | /page/menu/{language} | Menu tree |
GET | /page/sitemap-pages/{language}?path= | Page tree for the sitemap |
GET | /page/get-page-language-variants/{uniqueName} | The page's counterparts in other languages (for hreflang and language switchers) |
GET | /page/search?searchKey=&languageId=&path= | On-site search results |
GET | /page/public-revision | Fingerprint of the published content |
GET | /redirect/all/{language} | Redirect list |
GET | /template/detail/{id} | A template and its components |
GET | /template/list | Template list |
GET | /language/list | Languages: code, locale, URL prefix, default |
GET | /parameter/list | Public parameters only |
GET | /page-list/component-data/{definitionId} | Published entries of a list |
GET | /form/captcha-config | Captcha provider and site key |
POST | /form/submit/{componentId} | Form submission |
POST | /form/upload/{componentId} | Form file upload |
GET | /health | Health check (outside the /api/v1 prefix) |
{language} is a language code such as tr or en.
Page detail
curl "https://api.example.com/api/v1/page/detail/tr?path=kurumsal/hakkimizda"For the home page, pass the site's home page slug as path. In the site template this is the HOME_SLUG constant. The response shape is described in Page JSON.
If the page does not exist, the envelope comes back with hasError: true, and the site renders a 404.
Menu and sitemap
curl "https://api.example.com/api/v1/page/menu/tr"
curl "https://api.example.com/api/v1/page/sitemap-pages/tr?path="Both return a tree, not a flat list. Subpages arrive under children. Use the href the API returns for links. Don't build URLs from path by hand.
Language variants and languages
curl "https://api.example.com/api/v1/language/list"
curl "https://api.example.com/api/v1/page/get-page-language-variants/{uniqueName}"Take html lang, og:locale, and the URL prefix from the language record's locale and basePath. Don't derive a locale from the language code.
Search
curl "https://api.example.com/api/v1/page/search?searchKey=contact&languageId=en"searchKey must be 3 to 100 characters long. Otherwise the envelope returns an error.
Publication fingerprint
curl "https://api.example.com/api/v1/page/public-revision"data is a string that represents the published content. When it changes, the published content has changed. A site can watch this value and drop its own cache.
Templates and parameters
curl "https://api.example.com/api/v1/template/detail/0"
curl "https://api.example.com/api/v1/parameter/list"ID 0 returns the default template for the requested language. The parameter list contains public values only, such as organization details, site texts, robots settings, and verification codes.
Forms
curl "https://api.example.com/api/v1/form/captcha-config"
curl -X POST "https://api.example.com/api/v1/form/submit/42" \
-H "Content-Type: application/json" \
-d '{
"formData": { "Full name": "Ada Smith", "Email": "[email protected]" },
"languageId": "en",
"pagePath": "contact",
"pageId": 123
}'42 is the ID of the form component on the page. The full flow is described in Forms.
Health check
curl "https://api.example.com/health"