Pages (about pages) are the pages built in the editor or by the AI builder: a landing page, an "About us", a contact page, a legal page. A page is a list of containers - full-width sections - each holding columns, and each column holds components: text, headings, buttons, images, galleries, sliders, forms, and embeds of the site's products, services, blog posts and more. Pages also serve as reusable parts: the banner above the header, the content shown on a product page, the landing page behind a popup.
Endpoints that need a token: the site owner creates it in their admin (Developers > API reference). AI assistants: how to ask the user for one.
44 endpoints in 5 parts: About Page, About Page Import, Custom Page, Publish, AI builder.
A page's containers hold columns, and each column a list of components, each with a type and a size from 1 to 12 on the column's grid. These are the types.
Empty space, for spacing.
A horizontal line across the component's width.
A heading.
Rich text, stored as HTML in innerHTML.
An accordion: questions or titles that open to show their answer - FAQs, details. Its look is in collapsible_container_settings. Settings in collapsible_container.
Tabs: the same items as an accordion, shown one at a time behind tab buttons. Settings in tabs.
A strip of phrases scrolling across endlessly - a marquee. Settings in text_auto_slider.
A button linking to an address (href) or a page of the site (router_link); its label is innerHTML, its look buttonOptions.
An icon with optional heading, sub-heading and text, in ten layouts (centred, left, right).
One image or video, optionally linking somewhere.
A grid of images that open larger when clicked.
One large image with thumbnails below to switch it.
Images shown one at a time, with arrows and dots.
Images shown several at a time, sliding.
An image that changes to another when the pointer is over it. Settings in hoverable_media.
Two images on top of each other with a handle to drag between them - before and after. Settings in image_dragger.
A strip of images scrolling across endlessly. Settings in image_auto_slider.
One of the site's products, with its price and a button to buy. Settings in products.
A grid or slider of the site's products - the ones listed in products. Settings in products.
One of the site's services, with a button to book it. Settings in services.
A grid or slider of the site's services - the ones listed in services. Settings in services.
One blog post, as a card linking to it. Settings in blogposts.
A grid or slider of the site's blog posts - the ones listed in blogposts. Settings in blogposts.
One of the site's videos. Settings in videos.
A gallery of the site's videos. Settings in videos.
A contact form; what visitors send arrives as a lead. Its fields are in contactForm. Settings in contactForm.
A newsletter sign-up: name, email and a button. Settings in contactForm.
A map, from embed code (usually Google Maps). Settings in map.
A quiz: questions with answers, an explanation for each and a result by score. Settings in quiz.
A slider whose slides are other pages' sections. Settings in swiper.
An embedded Facebook page or post. Settings in facebook.
A custom block with its own HTML (innerHTML), CSS (innerCSS) and JavaScript (innerJS).
A countdown to a date, in boxes of days, hours, minutes and seconds; then a text of your choice. Settings in countdown.
Search over the site's content, with filters by kind, price and date and an optional AI answer. Settings in smart_search.
The booking flow on a page: choose a service, a day, a time and a staff member, then confirm.
The site's price plans, side by side to compare and subscribe. Settings in price_plans.
An image sequence that plays as the visitor scrolls. Settings in scroll_sequence.
Every page's title, url and settings (no content); ?no_cache skips the cache. Answers an array of every record.
Public - no token needed.
Returns a list of AboutPage objects.
curl -X GET 'http://hristovtintdetailng.com/about-pages?ionic=true'
[
{
"requiresLogin": false,
"requiresSubscription": false,
"price_plan_ids": [
"example"
],
"title": "Example",
"url": "example-item",
"redirectUrl": "example",
"legal_kind": "example",
"isPartial": false,
"showTo": "0",
"showHeader": true,
"showFooter": true,
"ai_context_v2": {},
"ai_surfaces_v2": {},
"ai_overview": "example",
"ai_generation_metadata": {},
"containers": [
{
"isFluid": false,
"parallaxEnabled": false,
"parallaxAmount": 49.9,
"parallaxZoom": 1,
"continuousEnabled": false,
"continuousEffect": "none",
"continuousDuration": 2400,
"continuousIntensity": 4,
"backgroundImage": "example",
"backgroundSize": "example",
"backgroundPosition": "example",
"backgroundRepeat": "example",
"backgroundVideo": "example",
"backgroundColor": "#3557c4",
"backgroundParallax": false,
"minHeight": 1,
"minHeightMobile": 1,
"allowOffset": false,
"offsetX": 0,
"offsetY": 0,
"offsetMobileX": 0,
"offsetMobileY": 0,
"zIndex": 0,
"wrap_reverse": false,
"backgroundGradient": {
"enabled": false,
"type": "example",
"degrees": 0,
"radialShape": "example",
"radialPosition": "example",
"colors": "#3557c4",
"css": "example"
},
"padding_top": {
"value": "example",
"unit": "example",
"mobile_value": "example",
"mobile_unit": "example"
},
"padding_right": {
"value": "example"
}
}
],
"suitability_price_plans": [
"6543210fedcba98765432101"
],
"isSuitable": false,
"archived": false,
"archivedAt": "2026-11-04T12:00:00.000Z",
"_id": "6543210fedcba98765432100",
"updatedAt": "2026-11-04T12:00:00.000Z",
"createdAt": "2026-11-04T12:00:00.000Z"
}
]Creates a page, with its meta tags; a homepage replaces the home page's blocks. Answers 201 with { _id, url } only, not the whole page. addToIndex: true also shows the new page on the home page, as its last block (for a page that already exists, use POST /index-components/append). A homepage takes the home page's place: its blocks are replaced by this page.
Needs a site admin token.
The page's title, shown in the browser tab and in the admin.
The page's content: sections, each with columns of components.
The page's create navlink.
The page's add to index.
The page's apply startup prompt.
Returns the AboutPage object.
curl -X POST 'http://hristovtintdetailng.com/about-pages?ionic=true' \
-H 'Authorization: Bearer <TOKEN>' \
-H 'Content-Type: application/json' \
-d '{ "title": "...", "containers": "...", "createNavlink": "...", "addToIndex": "...", "apply_startup_prompt": "..." }'{
"requiresLogin": false,
"requiresSubscription": false,
"price_plan_ids": [
"example"
],
"title": "Example",
"url": "example-item",
"redirectUrl": "example",
"legal_kind": "example",
"isPartial": false,
"showTo": "0",
"showHeader": true,
"showFooter": true,
"ai_context_v2": {},
"ai_surfaces_v2": {},
"ai_overview": "example",
"ai_generation_metadata": {},
"containers": [
{
"isFluid": false,
"parallaxEnabled": false,
"parallaxAmount": 49.9,
"parallaxZoom": 1,
"continuousEnabled": false,
"continuousEffect": "none",
"continuousDuration": 2400,
"continuousIntensity": 4,
"backgroundImage": "example",
"backgroundSize": "example",
"backgroundPosition": "example",
"backgroundRepeat": "example",
"backgroundVideo": "example",
"backgroundColor": "#3557c4",
"backgroundParallax": false,
"minHeight": 1,
"minHeightMobile": 1,
"allowOffset": false,
"offsetX": 0,
"offsetY": 0,
"offsetMobileX": 0,
"offsetMobileY": 0,
"zIndex": 0,
"wrap_reverse": false,
"backgroundGradient": {
"enabled": false,
"type": "example",
"degrees": 0,
"radialShape": "example",
"radialPosition": "example",
"colors": "#3557c4",
"css": "example"
},
"padding_top": {
"value": "example",
"unit": "example",
"mobile_value": "example",
"mobile_unit": "example"
},
"padding_right": {
"value": "example"
}
}
],
"suitability_price_plans": [
"6543210fedcba98765432101"
],
"isSuitable": false,
"archived": false,
"archivedAt": "2026-11-04T12:00:00.000Z",
"_id": "6543210fedcba98765432100",
"updatedAt": "2026-11-04T12:00:00.000Z",
"createdAt": "2026-11-04T12:00:00.000Z"
}A page by its id: the rendered page, or JSON with ?ionic. 404 when there is no such page; a page with redirectUrl answers 301 to it.
Needs a signed-in user whose plan grants access.
The ID of the page.
Returns the AboutPage object.
curl -X GET 'http://hristovtintdetailng.com/about-pages-by-id/{id}?ionic=true' \
-H 'Authorization: Bearer <TOKEN>'{
"requiresLogin": false,
"requiresSubscription": false,
"price_plan_ids": [
"example"
],
"title": "Example",
"url": "example-item",
"redirectUrl": "example",
"legal_kind": "example",
"isPartial": false,
"showTo": "0",
"showHeader": true,
"showFooter": true,
"ai_context_v2": {},
"ai_surfaces_v2": {},
"ai_overview": "example",
"ai_generation_metadata": {},
"containers": [
{
"isFluid": false,
"parallaxEnabled": false,
"parallaxAmount": 49.9,
"parallaxZoom": 1,
"continuousEnabled": false,
"continuousEffect": "none",
"continuousDuration": 2400,
"continuousIntensity": 4,
"backgroundImage": "example",
"backgroundSize": "example",
"backgroundPosition": "example",
"backgroundRepeat": "example",
"backgroundVideo": "example",
"backgroundColor": "#3557c4",
"backgroundParallax": false,
"minHeight": 1,
"minHeightMobile": 1,
"allowOffset": false,
"offsetX": 0,
"offsetY": 0,
"offsetMobileX": 0,
"offsetMobileY": 0,
"zIndex": 0,
"wrap_reverse": false,
"backgroundGradient": {
"enabled": false,
"type": "example",
"degrees": 0,
"radialShape": "example",
"radialPosition": "example",
"colors": "#3557c4",
"css": "example"
},
"padding_top": {
"value": "example",
"unit": "example",
"mobile_value": "example",
"mobile_unit": "example"
},
"padding_right": {
"value": "example"
}
}
],
"suitability_price_plans": [
"6543210fedcba98765432101"
],
"isSuitable": false,
"archived": false,
"archivedAt": "2026-11-04T12:00:00.000Z",
"_id": "6543210fedcba98765432100",
"updatedAt": "2026-11-04T12:00:00.000Z",
"createdAt": "2026-11-04T12:00:00.000Z"
}Updates a page. Fields outside the allowed list are ignored. Writes the live page directly; the editor saves through POST /about-pages/:id/draft instead. Answers the page, or 404.
Needs a site admin token.
The ID of the page.
The page's content: sections, each with columns of components.
Returns the AboutPage object.
curl -X PATCH 'http://hristovtintdetailng.com/about-pages/{id}?ionic=true' \
-H 'Authorization: Bearer <TOKEN>' \
-H 'Content-Type: application/json' \
-d '{ "containers": "..." }'{
"requiresLogin": false,
"requiresSubscription": false,
"price_plan_ids": [
"example"
],
"title": "Example",
"url": "example-item",
"redirectUrl": "example",
"legal_kind": "example",
"isPartial": false,
"showTo": "0",
"showHeader": true,
"showFooter": true,
"ai_context_v2": {},
"ai_surfaces_v2": {},
"ai_overview": "example",
"ai_generation_metadata": {},
"containers": [
{
"isFluid": false,
"parallaxEnabled": false,
"parallaxAmount": 49.9,
"parallaxZoom": 1,
"continuousEnabled": false,
"continuousEffect": "none",
"continuousDuration": 2400,
"continuousIntensity": 4,
"backgroundImage": "example",
"backgroundSize": "example",
"backgroundPosition": "example",
"backgroundRepeat": "example",
"backgroundVideo": "example",
"backgroundColor": "#3557c4",
"backgroundParallax": false,
"minHeight": 1,
"minHeightMobile": 1,
"allowOffset": false,
"offsetX": 0,
"offsetY": 0,
"offsetMobileX": 0,
"offsetMobileY": 0,
"zIndex": 0,
"wrap_reverse": false,
"backgroundGradient": {
"enabled": false,
"type": "example",
"degrees": 0,
"radialShape": "example",
"radialPosition": "example",
"colors": "#3557c4",
"css": "example"
},
"padding_top": {
"value": "example",
"unit": "example",
"mobile_value": "example",
"mobile_unit": "example"
},
"padding_right": {
"value": "example"
}
}
],
"suitability_price_plans": [
"6543210fedcba98765432101"
],
"isSuitable": false,
"archived": false,
"archivedAt": "2026-11-04T12:00:00.000Z",
"_id": "6543210fedcba98765432100",
"updatedAt": "2026-11-04T12:00:00.000Z",
"createdAt": "2026-11-04T12:00:00.000Z"
}Deletes a page. Clears every cached copy of the site's pages, since menus and links may have pointed to it. Answers the deleted page.
Needs a site admin token.
The ID of the page.
Returns an empty answer on success.
curl -X DELETE 'http://hristovtintdetailng.com/about-pages/{id}?ionic=true' \
-H 'Authorization: Bearer <TOKEN>'The editor's save: content goes to the draft, access settings to the live page. Answers the page's versioning state (draft, live and rollout).
Needs a site admin token.
The ID of the page.
curl -X POST 'http://hristovtintdetailng.com/about-pages/{id}/draft?ionic=true' \
-H 'Authorization: Bearer <TOKEN>'Throw the draft away. Answers the page's versioning state.
Needs a site admin token.
The ID of the page.
Returns an empty answer on success.
curl -X DELETE 'http://hristovtintdetailng.com/about-pages/{id}/draft?ionic=true' \
-H 'Authorization: Bearer <TOKEN>'A short-lived link query that shows one version on the public page. Answers { token, query }: add query to the page's address to see that version. 404 when there is no such version.
Needs a site admin token.
The ID of the page.
The page's version id.
curl -X POST 'http://hristovtintdetailng.com/about-pages/{id}/preview-token?ionic=true' \
-H 'Authorization: Bearer <TOKEN>' \
-H 'Content-Type: application/json' \
-d '{ "version_id": "..." }'Make the draft the live page. Answers { version_id, versioning }. The old live version is kept as archived.
Needs a site admin token.
The ID of the page.
curl -X POST 'http://hristovtintdetailng.com/about-pages/{id}/publish?ionic=true' \
-H 'Authorization: Bearer <TOKEN>'Publish a copy of an earlier version. The copy becomes a new version; the history is not rewritten. Answers { version_id, versioning }.
Needs a site admin token.
The ID of the page.
The page's version id.
curl -X POST 'http://hristovtintdetailng.com/about-pages/{id}/revert?ionic=true' \
-H 'Authorization: Bearer <TOKEN>' \
-H 'Content-Type: application/json' \
-d '{ "version_id": "..." }'Show a version (the draft or an older one) to a share of the visitors, or. change the share. Ends a rollout of any other version of the page.
Needs a site admin token.
The ID of the page.
The page's version id.
The page's percent.
curl -X POST 'http://hristovtintdetailng.com/about-pages/{id}/rollout?ionic=true' \
-H 'Authorization: Bearer <TOKEN>' \
-H 'Content-Type: application/json' \
-d '{ "version_id": "...", "percent": "..." }'Stop the rollout: everyone sees the live page again; the version stays. Answers the page's versioning state.
Needs a site admin token.
The ID of the page.
Returns an empty answer on success.
curl -X DELETE 'http://hristovtintdetailng.com/about-pages/{id}/rollout?ionic=true' \
-H 'Authorization: Bearer <TOKEN>'The page's versions, newest first, without their content. For the version history panel.
Needs a site admin token.
The ID of the page.
curl -X GET 'http://hristovtintdetailng.com/about-pages/{id}/versions?ionic=true' \
-H 'Authorization: Bearer <TOKEN>'Name a version; named versions are never pruned. Answers { _id, label }.
Needs a site admin token.
The ID of the page.
The page's version id.
The page's label.
curl -X PATCH 'http://hristovtintdetailng.com/about-pages/{id}/versions/{versionId}?ionic=true' \
-H 'Authorization: Bearer <TOKEN>' \
-H 'Content-Type: application/json' \
-d '{ "label": "..." }'A page by its url: the rendered page, or JSON with ?ionic; serves a rollout version to its share of visitors and a version preview to the admin. Sends a page that asks for sign-in or a plan to visitors who lack it. Cached for an hour, apart from version previews.
Pages limited to some users check the token when one is sent.
The page's URL slug, as in its address on the site.
Returns the AboutPage object.
curl -X GET 'http://hristovtintdetailng.com/about-pages/{url}?ionic=true'{
"requiresLogin": false,
"requiresSubscription": false,
"price_plan_ids": [
"example"
],
"title": "Example",
"url": "example-item",
"redirectUrl": "example",
"legal_kind": "example",
"isPartial": false,
"showTo": "0",
"showHeader": true,
"showFooter": true,
"ai_context_v2": {},
"ai_surfaces_v2": {},
"ai_overview": "example",
"ai_generation_metadata": {},
"containers": [
{
"isFluid": false,
"parallaxEnabled": false,
"parallaxAmount": 49.9,
"parallaxZoom": 1,
"continuousEnabled": false,
"continuousEffect": "none",
"continuousDuration": 2400,
"continuousIntensity": 4,
"backgroundImage": "example",
"backgroundSize": "example",
"backgroundPosition": "example",
"backgroundRepeat": "example",
"backgroundVideo": "example",
"backgroundColor": "#3557c4",
"backgroundParallax": false,
"minHeight": 1,
"minHeightMobile": 1,
"allowOffset": false,
"offsetX": 0,
"offsetY": 0,
"offsetMobileX": 0,
"offsetMobileY": 0,
"zIndex": 0,
"wrap_reverse": false,
"backgroundGradient": {
"enabled": false,
"type": "example",
"degrees": 0,
"radialShape": "example",
"radialPosition": "example",
"colors": "#3557c4",
"css": "example"
},
"padding_top": {
"value": "example",
"unit": "example",
"mobile_value": "example",
"mobile_unit": "example"
},
"padding_right": {
"value": "example"
}
}
],
"suitability_price_plans": [
"6543210fedcba98765432101"
],
"isSuitable": false,
"archived": false,
"archivedAt": "2026-11-04T12:00:00.000Z",
"_id": "6543210fedcba98765432100",
"updatedAt": "2026-11-04T12:00:00.000Z",
"createdAt": "2026-11-04T12:00:00.000Z"
}Imported page files. Answers an array of every record.
Public - no token needed.
curl -X GET 'http://hristovtintdetailng.com/about-section-imports?ionic=true'
Uploads an imported page file with up to 5 pictures (medias). Multipart upload. Answers 201 with no body.
Needs a site admin token.
The section import's body.
curl -X POST 'http://hristovtintdetailng.com/about-section-imports?ionic=true' \
-H 'Authorization: Bearer <TOKEN>' \
-H 'Content-Type: application/json' \
-d '{ "body": "..." }'One imported page file. 404 when there is no such record.
Public - no token needed.
The ID of the section import.
curl -X GET 'http://hristovtintdetailng.com/about-section-imports/{id}?ionic=true'The custom code pages. Answers an array of every record.
Public - no token needed.
Returns a list of CustomPage objects.
curl -X GET 'http://hristovtintdetailng.com/custom_pages?ionic=true'
[
{
"title": "Example",
"url": "example-item",
"html_content": "Text shown on the site.",
"css_content": "Text shown on the site.",
"js_content": "Text shown on the site.",
"_id": "6543210fedcba98765432100"
}
]One custom code page. 404 when there is no such record.
Public - no token needed.
The ID of the custom page.
Returns the CustomPage object.
curl -X GET 'http://hristovtintdetailng.com/custom_pages/{id}?ionic=true'{
"title": "Example",
"url": "example-item",
"html_content": "Text shown on the site.",
"css_content": "Text shown on the site.",
"js_content": "Text shown on the site.",
"_id": "6543210fedcba98765432100"
}Updates a custom code page. Fields outside the allowed list are silently ignored. Answers the updated record, or 404.
Needs a site admin token.
The ID of the custom page.
Returns the CustomPage object.
curl -X PATCH 'http://hristovtintdetailng.com/custom_pages/{id}?ionic=true' \
-H 'Authorization: Bearer <TOKEN>'{
"title": "Example",
"url": "example-item",
"html_content": "Text shown on the site.",
"css_content": "Text shown on the site.",
"js_content": "Text shown on the site.",
"_id": "6543210fedcba98765432100"
}Deletes a custom code page. Answers the deleted record, or 404. Records that point to it are not changed.
Needs a site admin token.
The ID of the custom page.
Returns an empty answer on success.
curl -X DELETE 'http://hristovtintdetailng.com/custom_pages/{id}?ionic=true' \
-H 'Authorization: Bearer <TOKEN>'Get publish settings. Reads no token: the app reads it at start.
Public - no token needed.
Returns the Publish object.
curl -X GET 'http://hristovtintdetailng.com/publish?ionic=true'
{
"web": false,
"ios": false,
"android": false,
"pwaSwitch": "example",
"android_app_id": "example",
"ios_app_id": "example",
"_id": "6543210fedcba98765432100"
}Set new publish settings. A site has one; update it with PATCH instead. Answers 201.
Needs a site admin token.
Returns the Publish object.
curl -X POST 'http://hristovtintdetailng.com/publish?ionic=true' \ -H 'Authorization: Bearer <TOKEN>'
{
"web": false,
"ios": false,
"android": false,
"pwaSwitch": "example",
"android_app_id": "example",
"ios_app_id": "example",
"_id": "6543210fedcba98765432100"
}The publishing settings (web, iOS, Android, install prompt). 404 when there is no such record.
Public - no token needed.
The ID of the publish.
Returns the Publish object.
curl -X GET 'http://hristovtintdetailng.com/publish/{id}?ionic=true'{
"web": false,
"ios": false,
"android": false,
"pwaSwitch": "example",
"android_app_id": "example",
"ios_app_id": "example",
"_id": "6543210fedcba98765432100"
}Updates a publishing settings record. Fields outside the allowed list are silently ignored. Answers the updated record, or 404.
Needs a site admin token.
The ID of the publish.
Returns the Publish object.
curl -X PATCH 'http://hristovtintdetailng.com/publish/{id}?ionic=true' \
-H 'Authorization: Bearer <TOKEN>'{
"web": false,
"ios": false,
"android": false,
"pwaSwitch": "example",
"android_app_id": "example",
"ios_app_id": "example",
"_id": "6543210fedcba98765432100"
}AI: adds a section to a page where the owner asked, from the section catalogue or a prompt. Answers { action: 'JOB', async_job } at once; the admin polls GET /async-jobs/:id, and the result arrives in the chat as a message when the job ends.
Needs a site admin token.
What the AI should do with the add section, in plain words - any language.
The AI chat this request belongs to; its history and language carry over. Leave it out to start a new chat.
Which version of the AI builder to use; leave it out for the current one.
The current add section, as JSON - the AI changes it and returns the result.
The add section's current page url.
The add section's section blueprint.
The add section's section style blueprint.
The add section's explicit target.
The add section's parsed intent.
curl -X POST 'http://hristovtintdetailng.com/add-section?ionic=true' \
-H 'Authorization: Bearer <TOKEN>' \
-H 'Content-Type: application/json' \
-d '{ "prompt": "...", "chatId": "...", "aiVersion": "...", "item_data": "...", "current_page_url": "..." }'{
"chat_id": "6543210fedcba98765432100",
"role": "user",
"text": "Text shown on the site.",
"target_url": "example-item",
"action": "RESPONSE",
"options": [
"example"
],
"medias": [
{
"media": "6543210fedcba98765432100",
"gcs_url": "example-item",
"gemini_uri": "example",
"gemini_interaction_id": "example",
"_id": "6543210fedcba98765432100"
}
],
"products": [
"6543210fedcba98765432101"
],
"services": [
"6543210fedcba98765432101"
],
"blogposts": [
"6543210fedcba98765432101"
],
"programs": [
"6543210fedcba98765432101"
],
"suggestions": [
{
"text": "Text shown on the site.",
"route": "example",
"item_id": "6543210fedcba98765432100",
"medias": [],
"picture": "6543210fedcba98765432100",
"_id": "6543210fedcba98765432100"
}
],
"is_system": false,
"_id": "6543210fedcba98765432100",
"updatedAt": "2026-11-04T12:00:00.000Z",
"createdAt": "2026-11-04T12:00:00.000Z",
"data": {
"object": "example",
"object_type": "example",
"edit_summary": "example",
"edit_diff": "example",
"undo_record": "example",
"hero_animation_offer": "example",
"preview_state": "example",
"pending_credit_cost": 0,
"target_restore": "example",
"media_request": "example",
"item_request": "example",
"reference_request": "example"
}
}AI: keeps a previewed page change, charges its credits and marks the preview applied. Charges the preview's pending credit cost and clears it; other pending previews of the same redesign are marked superseded. 404 when the preview message is gone.
Needs a site admin token.
The AI chat this request belongs to; its history and language carry over. Leave it out to start a new chat.
The commit page's message id.
curl -X POST 'http://hristovtintdetailng.com/commit-about-page-preview?ionic=true' \
-H 'Authorization: Bearer <TOKEN>' \
-H 'Content-Type: application/json' \
-d '{ "chatId": "...", "messageId": "..." }'{
"chat_id": "6543210fedcba98765432100",
"role": "user",
"text": "Text shown on the site.",
"target_url": "example-item",
"action": "RESPONSE",
"options": [
"example"
],
"medias": [
{
"media": "6543210fedcba98765432100",
"gcs_url": "example-item",
"gemini_uri": "example",
"gemini_interaction_id": "example",
"_id": "6543210fedcba98765432100"
}
],
"products": [
"6543210fedcba98765432101"
],
"services": [
"6543210fedcba98765432101"
],
"blogposts": [
"6543210fedcba98765432101"
],
"programs": [
"6543210fedcba98765432101"
],
"suggestions": [
{
"text": "Text shown on the site.",
"route": "example",
"item_id": "6543210fedcba98765432100",
"medias": [],
"picture": "6543210fedcba98765432100",
"_id": "6543210fedcba98765432100"
}
],
"is_system": false,
"_id": "6543210fedcba98765432100",
"updatedAt": "2026-11-04T12:00:00.000Z",
"createdAt": "2026-11-04T12:00:00.000Z",
"data": {
"object": "example",
"object_type": "example",
"edit_summary": "example",
"edit_diff": "example",
"undo_record": "example",
"hero_animation_offer": "example",
"preview_state": "example",
"pending_credit_cost": 0,
"target_restore": "example",
"media_request": "example",
"item_request": "example",
"reference_request": "example"
}
}AI: the owner accepted or declined a proposed action in the chat (a plan, a replacement); runs or drops it. Send messageId and confirmed; skip_steps lists the plan steps the owner unticked. confirmed false answers { cancelled: true } and drops the pending plan. Otherwise 400 when every step is unticked, 403 "Insufficient credits", 409 when the plan is gone. Pressing twice runs it once.
Needs a site admin token.
The AI action's message id.
The AI action's confirmed.
The AI action's skip steps.
The AI action's choice.
The current AI action, as JSON - the AI changes it and returns the result.
curl -X POST 'http://hristovtintdetailng.com/confirm-ai-action?ionic=true' \
-H 'Authorization: Bearer <TOKEN>' \
-H 'Content-Type: application/json' \
-d '{ "messageId": "...", "confirmed": "...", "skip_steps": "...", "choice": "...", "item_data": "..." }'{
"chat_id": "6543210fedcba98765432100",
"role": "user",
"text": "Text shown on the site.",
"target_url": "example-item",
"action": "RESPONSE",
"options": [
"example"
],
"medias": [
{
"media": "6543210fedcba98765432100",
"gcs_url": "example-item",
"gemini_uri": "example",
"gemini_interaction_id": "example",
"_id": "6543210fedcba98765432100"
}
],
"products": [
"6543210fedcba98765432101"
],
"services": [
"6543210fedcba98765432101"
],
"blogposts": [
"6543210fedcba98765432101"
],
"programs": [
"6543210fedcba98765432101"
],
"suggestions": [
{
"text": "Text shown on the site.",
"route": "example",
"item_id": "6543210fedcba98765432100",
"medias": [],
"picture": "6543210fedcba98765432100",
"_id": "6543210fedcba98765432100"
}
],
"is_system": false,
"_id": "6543210fedcba98765432100",
"updatedAt": "2026-11-04T12:00:00.000Z",
"createdAt": "2026-11-04T12:00:00.000Z",
"data": {
"object": "example",
"object_type": "example",
"edit_summary": "example",
"edit_diff": "example",
"undo_record": "example",
"hero_animation_offer": "example",
"preview_state": "example",
"pending_credit_cost": 0,
"target_restore": "example",
"media_request": "example",
"item_request": "example",
"reference_request": "example"
}
}AI: the owner accepted a proposed page layout; starts building it, once, if the account has credits. Send messageId (the proposal's chat message). 403 "Insufficient credits". Pressing twice starts it once: the second call answers { started: true, duplicate: true }.
Needs a site admin token.
The page plan's message id.
curl -X POST 'http://hristovtintdetailng.com/confirm-page-plan?ionic=true' \
-H 'Authorization: Bearer <TOKEN>' \
-H 'Content-Type: application/json' \
-d '{ "messageId": "..." }'{
"chat_id": "6543210fedcba98765432100",
"role": "user",
"text": "Text shown on the site.",
"target_url": "example-item",
"action": "RESPONSE",
"options": [
"example"
],
"medias": [
{
"media": "6543210fedcba98765432100",
"gcs_url": "example-item",
"gemini_uri": "example",
"gemini_interaction_id": "example",
"_id": "6543210fedcba98765432100"
}
],
"products": [
"6543210fedcba98765432101"
],
"services": [
"6543210fedcba98765432101"
],
"blogposts": [
"6543210fedcba98765432101"
],
"programs": [
"6543210fedcba98765432101"
],
"suggestions": [
{
"text": "Text shown on the site.",
"route": "example",
"item_id": "6543210fedcba98765432100",
"medias": [],
"picture": "6543210fedcba98765432100",
"_id": "6543210fedcba98765432100"
}
],
"is_system": false,
"_id": "6543210fedcba98765432100",
"updatedAt": "2026-11-04T12:00:00.000Z",
"createdAt": "2026-11-04T12:00:00.000Z",
"data": {
"object": "example",
"object_type": "example",
"edit_summary": "example",
"edit_diff": "example",
"undo_record": "example",
"hero_animation_offer": "example",
"preview_state": "example",
"pending_credit_cost": 0,
"target_restore": "example",
"media_request": "example",
"item_request": "example",
"reference_request": "example"
}
}AI: builds a new page from a planned layout as a recoverable background job. Answers { action: 'JOB', async_job } at once; the admin polls GET /async-jobs/:id, and the result arrives in the chat as a message when the job ends.
Needs a site admin token.
What the AI should do with the page, in plain words - any language.
The AI chat this request belongs to; its history and language carry over. Leave it out to start a new chat.
Which version of the AI builder to use; leave it out for the current one.
The page's socket id.
curl -X POST 'http://hristovtintdetailng.com/create-new-page?ionic=true' \
-H 'Authorization: Bearer <TOKEN>' \
-H 'Content-Type: application/json' \
-d '{ "prompt": "...", "chatId": "...", "aiVersion": "...", "socketId": "..." }'AI: builds a new page from the owner's prompt as a background job; answers the job to poll. Answers { action: 'JOB', async_job } at once; the admin polls GET /async-jobs/:id, and the result arrives in the chat as a message when the job ends.
Needs a site admin token.
What the AI should do with the page, in plain words - any language.
The AI chat this request belongs to; its history and language carry over. Leave it out to start a new chat.
Which version of the AI builder to use; leave it out for the current one.
The page's socket id.
curl -X POST 'http://hristovtintdetailng.com/generate-page?ionic=true' \
-H 'Authorization: Bearer <TOKEN>' \
-H 'Content-Type: application/json' \
-d '{ "prompt": "...", "chatId": "...", "aiVersion": "...", "socketId": "..." }'AI: routes a header request to update-header. Does no AI work itself: answers { action: 'REDIRECT', target_url, response } and the chat client calls target_url next with response as the prompt.
Needs a site admin token.
What the AI should do with the header, in plain words - any language.
The current header, as JSON - the AI changes it and returns the result.
The AI chat this request belongs to; its history and language carry over. Leave it out to start a new chat.
curl -X POST 'http://hristovtintdetailng.com/modify-header?ionic=true' \
-H 'Authorization: Bearer <TOKEN>' \
-H 'Content-Type: application/json' \
-d '{ "prompt": "...", "item_data": "...", "chatId": "..." }'AI: routes a request to change a page to update-page, carrying the page it is about. Does no AI work itself: answers { action: 'REDIRECT', target_url, response } and the chat client calls target_url next with response as the prompt.
Needs a site admin token.
What the AI should do with the page, in plain words - any language.
The AI chat this request belongs to; its history and language carry over. Leave it out to start a new chat.
The ID of the page to change.
The page's item ids.
curl -X POST 'http://hristovtintdetailng.com/modify-page?ionic=true' \
-H 'Authorization: Bearer <TOKEN>' \
-H 'Content-Type: application/json' \
-d '{ "prompt": "...", "chatId": "...", "item_id": "...", "item_ids": "..." }'Use it to require login to access content sections, or set up a paywall when social mode is off. Makes products, services, blogposts, videos, programs, or custom pages require login or subscription.
Needs a site admin token.
What the AI should do with the page permission, in plain words - any language.
The AI chat this request belongs to; its history and language carry over. Leave it out to start a new chat.
Which version of the AI builder to use; leave it out for the current one.
The ID of the page permission to change.
curl -X POST 'http://hristovtintdetailng.com/modify-page-permissions?ionic=true' \
-H 'Authorization: Bearer <TOKEN>' \
-H 'Content-Type: application/json' \
-d '{ "prompt": "...", "chatId": "...", "aiVersion": "...", "item_id": "..." }'{
"chat_id": "6543210fedcba98765432100",
"role": "user",
"text": "Text shown on the site.",
"target_url": "example-item",
"action": "RESPONSE",
"options": [
"example"
],
"medias": [
{
"media": "6543210fedcba98765432100",
"gcs_url": "example-item",
"gemini_uri": "example",
"gemini_interaction_id": "example",
"_id": "6543210fedcba98765432100"
}
],
"products": [
"6543210fedcba98765432101"
],
"services": [
"6543210fedcba98765432101"
],
"blogposts": [
"6543210fedcba98765432101"
],
"programs": [
"6543210fedcba98765432101"
],
"suggestions": [
{
"text": "Text shown on the site.",
"route": "example",
"item_id": "6543210fedcba98765432100",
"medias": [],
"picture": "6543210fedcba98765432100",
"_id": "6543210fedcba98765432100"
}
],
"is_system": false,
"_id": "6543210fedcba98765432100",
"updatedAt": "2026-11-04T12:00:00.000Z",
"createdAt": "2026-11-04T12:00:00.000Z",
"data": {
"object": "example",
"object_type": "example",
"edit_summary": "example",
"edit_diff": "example",
"undo_record": "example",
"hero_animation_offer": "example",
"preview_state": "example",
"pending_credit_cost": 0,
"target_restore": "example",
"media_request": "example",
"item_request": "example",
"reference_request": "example"
}
}AI: routes a theme request to update-theme with the current theme values. Does no AI work itself: answers { action: 'REDIRECT', target_url, response } and the chat client calls target_url next with response as the prompt.
Needs a site admin token.
What the AI should do with the theme, in plain words - any language.
The current theme, as JSON - the AI changes it and returns the result.
The AI chat this request belongs to; its history and language carry over. Leave it out to start a new chat.
curl -X POST 'http://hristovtintdetailng.com/modify-theme?ionic=true' \
-H 'Authorization: Bearer <TOKEN>' \
-H 'Content-Type: application/json' \
-d '{ "prompt": "...", "item_data": "...", "chatId": "..." }'AI: rewrites one component of a page, or its picture. Answers { action: 'JOB', async_job } at once; the admin polls GET /async-jobs/:id, and the result arrives in the chat as a message when the job ends.
Needs a site admin token.
What the AI should do with the regenerate component, in plain words - any language.
The AI chat this request belongs to; its history and language carry over. Leave it out to start a new chat.
Which version of the AI builder to use; leave it out for the current one.
The current regenerate component, as JSON - the AI changes it and returns the result.
The regenerate component's current page url.
The regenerate component's explicit target.
The regenerate component's save user message.
The regenerate component's preview only.
curl -X POST 'http://hristovtintdetailng.com/regenerate-component?ionic=true' \
-H 'Authorization: Bearer <TOKEN>' \
-H 'Content-Type: application/json' \
-d '{ "prompt": "...", "chatId": "...", "aiVersion": "...", "item_data": "...", "current_page_url": "..." }'AI: rewrites one section of a page. Answers { action: 'JOB', async_job } at once; the admin polls GET /async-jobs/:id, and the result arrives in the chat as a message when the job ends. The AI work is charged to the account's credits.
Needs a site admin token.
What the AI should do with the regenerate section, in plain words - any language.
The AI chat this request belongs to; its history and language carry over. Leave it out to start a new chat.
Which version of the AI builder to use; leave it out for the current one.
The current regenerate section, as JSON - the AI changes it and returns the result.
The regenerate section's current page url.
The regenerate section's explicit target.
The regenerate section's save user message.
The regenerate section's section blueprint.
The regenerate section's section style blueprint.
The regenerate section's preview only.
The regenerate section's regeneration mode.
The regenerate section's replacement strategy.
The regenerate section's source small target.
curl -X POST 'http://hristovtintdetailng.com/regenerate-section?ionic=true' \
-H 'Authorization: Bearer <TOKEN>' \
-H 'Content-Type: application/json' \
-d '{ "prompt": "...", "chatId": "...", "aiVersion": "...", "item_data": "...", "current_page_url": "..." }'{
"chat_id": "6543210fedcba98765432100",
"role": "user",
"text": "Text shown on the site.",
"target_url": "example-item",
"action": "RESPONSE",
"options": [
"example"
],
"medias": [
{
"media": "6543210fedcba98765432100",
"gcs_url": "example-item",
"gemini_uri": "example",
"gemini_interaction_id": "example",
"_id": "6543210fedcba98765432100"
}
],
"products": [
"6543210fedcba98765432101"
],
"services": [
"6543210fedcba98765432101"
],
"blogposts": [
"6543210fedcba98765432101"
],
"programs": [
"6543210fedcba98765432101"
],
"suggestions": [
{
"text": "Text shown on the site.",
"route": "example",
"item_id": "6543210fedcba98765432100",
"medias": [],
"picture": "6543210fedcba98765432100",
"_id": "6543210fedcba98765432100"
}
],
"is_system": false,
"_id": "6543210fedcba98765432100",
"updatedAt": "2026-11-04T12:00:00.000Z",
"createdAt": "2026-11-04T12:00:00.000Z",
"data": {
"object": "example",
"object_type": "example",
"edit_summary": "example",
"edit_diff": "example",
"undo_record": "example",
"hero_animation_offer": "example",
"preview_state": "example",
"pending_credit_cost": 0,
"target_restore": "example",
"media_request": "example",
"item_request": "example",
"reference_request": "example"
}
}AI: reopens an applied page preview so it can be applied again. 404 when that version is no longer in the chat; 409 when it is already applied.
Needs a site admin token.
The AI chat this request belongs to; its history and language carry over. Leave it out to start a new chat.
The reopen page's message id.
curl -X POST 'http://hristovtintdetailng.com/reopen-about-page-preview?ionic=true' \
-H 'Authorization: Bearer <TOKEN>' \
-H 'Content-Type: application/json' \
-d '{ "chatId": "...", "messageId": "..." }'{
"chat_id": "6543210fedcba98765432100",
"role": "user",
"text": "Text shown on the site.",
"target_url": "example-item",
"action": "RESPONSE",
"options": [
"example"
],
"medias": [
{
"media": "6543210fedcba98765432100",
"gcs_url": "example-item",
"gemini_uri": "example",
"gemini_interaction_id": "example",
"_id": "6543210fedcba98765432100"
}
],
"products": [
"6543210fedcba98765432101"
],
"services": [
"6543210fedcba98765432101"
],
"blogposts": [
"6543210fedcba98765432101"
],
"programs": [
"6543210fedcba98765432101"
],
"suggestions": [
{
"text": "Text shown on the site.",
"route": "example",
"item_id": "6543210fedcba98765432100",
"medias": [],
"picture": "6543210fedcba98765432100",
"_id": "6543210fedcba98765432100"
}
],
"is_system": false,
"_id": "6543210fedcba98765432100",
"updatedAt": "2026-11-04T12:00:00.000Z",
"createdAt": "2026-11-04T12:00:00.000Z",
"data": {
"object": "example",
"object_type": "example",
"edit_summary": "example",
"edit_diff": "example",
"undo_record": "example",
"hero_animation_offer": "example",
"preview_state": "example",
"pending_credit_cost": 0,
"target_restore": "example",
"media_request": "example",
"item_request": "example",
"reference_request": "example"
}
}AI: changes the site's header as the owner asked, as a background job. Answers { action: 'JOB', async_job } at once; the admin polls GET /async-jobs/:id, and the result arrives in the chat as a message when the job ends. The AI work is charged to the account's credits.
Needs a site admin token.
What the AI should do with the header, in plain words - any language.
The AI chat this request belongs to; its history and language carry over. Leave it out to start a new chat.
Which version of the AI builder to use; leave it out for the current one.
curl -X POST 'http://hristovtintdetailng.com/update-header?ionic=true' \
-H 'Authorization: Bearer <TOKEN>' \
-H 'Content-Type: application/json' \
-d '{ "prompt": "...", "chatId": "...", "aiVersion": "..." }'AI: changes a page as the owner asked (copy, layout or a redesign) and answers the preview. Answers { action: 'JOB', async_job } at once; the admin polls GET /async-jobs/:id, and the result arrives in the chat as a message when the job ends. The AI work is charged to the account's credits.
Needs a site admin token.
What the AI should do with the page, in plain words - any language.
The AI chat this request belongs to; its history and language carry over. Leave it out to start a new chat.
Which version of the AI builder to use; leave it out for the current one.
The current page, as JSON - the AI changes it and returns the result.
The page's current page url.
The page's explicit target.
The ID of the page to change.
The page's pending selection intent.
The page's save user message.
The page's preview only.
The page's regeneration mode.
The page's force targeted modifier.
The page's redesign another.
curl -X POST 'http://hristovtintdetailng.com/update-page?ionic=true' \
-H 'Authorization: Bearer <TOKEN>' \
-H 'Content-Type: application/json' \
-d '{ "prompt": "...", "chatId": "...", "aiVersion": "...", "item_data": "...", "current_page_url": "..." }'{
"chat_id": "6543210fedcba98765432100",
"role": "user",
"text": "Text shown on the site.",
"target_url": "example-item",
"action": "RESPONSE",
"options": [
"example"
],
"medias": [
{
"media": "6543210fedcba98765432100",
"gcs_url": "example-item",
"gemini_uri": "example",
"gemini_interaction_id": "example",
"_id": "6543210fedcba98765432100"
}
],
"products": [
"6543210fedcba98765432101"
],
"services": [
"6543210fedcba98765432101"
],
"blogposts": [
"6543210fedcba98765432101"
],
"programs": [
"6543210fedcba98765432101"
],
"suggestions": [
{
"text": "Text shown on the site.",
"route": "example",
"item_id": "6543210fedcba98765432100",
"medias": [],
"picture": "6543210fedcba98765432100",
"_id": "6543210fedcba98765432100"
}
],
"is_system": false,
"_id": "6543210fedcba98765432100",
"updatedAt": "2026-11-04T12:00:00.000Z",
"createdAt": "2026-11-04T12:00:00.000Z",
"data": {
"object": "example",
"object_type": "example",
"edit_summary": "example",
"edit_diff": "example",
"undo_record": "example",
"hero_animation_offer": "example",
"preview_state": "example",
"pending_credit_cost": 0,
"target_restore": "example",
"media_request": "example",
"item_request": "example",
"reference_request": "example"
}
}AI: changes the site's or app's theme as the owner asked, as a background job. Answers { action: 'JOB', async_job } at once; the admin polls GET /async-jobs/:id, and the result arrives in the chat as a message when the job ends. The AI work is charged to the account's credits.
Needs a site admin token.
What the AI should do with the theme, in plain words - any language.
The AI chat this request belongs to; its history and language carry over. Leave it out to start a new chat.
Which version of the AI builder to use; leave it out for the current one.
curl -X POST 'http://hristovtintdetailng.com/update-theme?ionic=true' \
-H 'Authorization: Bearer <TOKEN>' \
-H 'Content-Type: application/json' \
-d '{ "prompt": "...", "chatId": "...", "aiVersion": "..." }'