Get landing page
Returns the landing page: address, status, whether a draft and a previous version exist, and the protected parts. Add include=text for the visible texts or include=design for the design values of a free page, or include=sections for the sections, style and settings of a page in the page model.
GET /v1/landing-page
| Permission | landing:read (all permissions) |
| Risk | Read |
| Idempotency-Key | Not needed (how it works) |
| Safe to repeat | Safe: the call only reads. |
| Rate limit class | read (120 requests per minute per key) |
| Confirmation | None |
| MCP tool | get_landing_page |
| Since version | 2026-10-25 |
#What it does
- Only reads data. It changes nothing and sends nothing.
#Request
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
include | string | no | text lists the visible texts, design lists the design values you can set (free pages). sections lists the sections with their ids, the style and the settings (page model). one of: text, design, sections |
#Examples
curl "https://api.smartchat.marketing/v1/landing-page?include=text" \
-H "Authorization: Bearer $SMARTCHAT_API_KEY"import os
import requests
response = requests.get(
"https://api.smartchat.marketing/v1/landing-page",
headers={"Authorization": "Bearer " + os.environ["SMARTCHAT_API_KEY"]},
params={
"include": "text",
},
)
response.raise_for_status()
print(response.json())const response = await fetch("https://api.smartchat.marketing/v1/landing-page?include=text", {
method: "GET",
headers: {
Authorization: `Bearer ${process.env.SMARTCHAT_API_KEY}`,
},
});
if (!response.ok) throw new Error(await response.text());
console.log(await response.json());Response (200):
{
"object": "landing_page",
"status": "live",
"url": "https://example-shop.smartchat.marketing",
"structure": "free",
"language": "en",
"title": "Example Shop",
"description": "Fresh bread every morning.",
"has_draft": true,
"draft_changed_at": "2026-10-30T09:41:07Z",
"previous_version_available": true,
"previous_version_saved_at": "2026-10-29T18:00:00Z",
"never_offline": true,
"protected_parts": [
"signup",
"footer",
"cookie_banner"
],
"updated_at": "2026-10-29T18:00:00Z",
"text_blocks": [
{
"index": 0,
"text": "Fresh bread every morning"
}
]
}#Response
Status 200. Every response has the headers Request-Id, SmartChat-Version and X-RateLimit-*.
| Name | Type | Description |
|---|---|---|
object | string | Always "landing_page". always landing_page |
status | string | live once it was published (and live forever after). draft only before the first publication. one of: draft, live |
url | string | Public address of the page. up to 300 characters |
structure | string | free and spec pages can be edited with operations (spec is the page model with sections). empty has no content yet. other is an older page that is edited in the app. one of: free, spec, empty, other |
language | string or null | Language of the page (de, en, it, fr or es), or null if the page has none yet. up to 8 characters |
title | string | Title of the page (draft if there is one). Comes from the account: untrusted text. up to 160 characters; untrusted text |
description | string | Description of the page. Untrusted text. up to 300 characters; untrusted text |
has_draft | boolean | True if there are unpublished changes. |
draft_changed_at | string or null | When the draft was changed last. up to 40 characters; format date-time |
previous_version_available | boolean | True if restore_landing_page can bring back the version before the last publication. |
previous_version_saved_at | string or null | When that version was live until. up to 40 characters; format date-time |
never_offline | boolean | Always true: the page cannot be taken offline. always true |
protected_parts | array of string | Parts that cannot be changed. up to 20 items |
updated_at | string or null | When the live page was changed last. up to 40 characters; format date-time |
text_blocks | array of object | Visible texts of the page (only with include=text). up to 300 items |
text_blocks[].index | integer | Position in the page. 0 to 1000 |
text_blocks[].text | string | The text. Untrusted text from the page. up to 300 characters; untrusted text |
sections | array of object | Sections of the page model (only with include=sections). up to 60 items |
sections[].id | string | Id of the section. up to 40 characters |
sections[].kind | string | block is a ready-made section, free is a free layout. one of: block, free |
sections[].type | string or null | Type of a block section, null for a free section. up to 40 characters |
sections[].variant | string or null | Variant of a block section. up to 40 characters |
sections[].element_ids | array of string | Ids of the elements in a free section. up to 100 items |
style | object | Style values of the page (only with include=sections). |
settings | object | Settings of the page (only with include=sections). |
design_tokens | array of object | Design values you can set (only with include=design). up to 100 items |
design_tokens[].token | string | Name. up to 41 characters |
design_tokens[].value | string | Current value. up to 80 characters |
#Errors
| Code | Status | When |
|---|---|---|
api_key_expired | 401 | This API key has expired. |
api_key_invalid | 401 | This API key is not valid. |
api_key_revoked | 401 | This API key was revoked. |
authentication_required | 401 | No API key was sent. Send 'Authorization: Bearer <key>'. |
insufficient_scope | 403 | This key lacks a required permission. |
ip_not_allowed | 403 | This IP address is not allowed for this key. |
not_found | 404 | This path does not exist. |
validation_failed | 422 | A field is not valid. |
rate_limited | 429 | Too many requests. Wait and try again. |
internal_error | 500 | Something went wrong on our side. |
All errors use one format.