Landing Pages
Create and manage hosted landing pages with drag-and-drop blocks for lead capture and campaign promotions
Landing pages are hosted by MisarMail and published at https://mail.misar.io/p/:slug. Build them from composable blocks — no external hosting required.
Authentication
All landing-page endpoints use session (cookie-based) authentication. They are intended for dashboard use and do not accept API keys. Base URL: https://api.misar.io/mail.
Block types
Pages are composed from an ordered array of blocks. Each block has an id, type, content (a record), and optional style object.
| Type | Description |
|---|---|
hero | Full-width header with heading and CTA button |
text | Rich text body section |
image | Full-width or contained image |
form | Embedded MisarMail signup form |
cta | Call-to-action banner with button |
features | Feature grid with icons and descriptions |
testimonial | Quote block with attribution |
countdown | Live countdown timer to a target date |
divider | Horizontal rule / spacer |
video | Embedded video (YouTube, Vimeo, or direct URL) |
List landing pages
/mail/api/landing-pagesList landing pages for the authenticated account, newest first.
Query parameters
statusall | draft | publishedquerydefault: allFilter by publish status.
limitintegerquerydefault: 50Maximum rows to return (max 100).
offsetintegerquerydefault: 0Pagination offset.
Response fields
successbooleantrue when the request succeeded.
dataArray<LandingPage>Flat array of landing pages. Each includes id, title, slug, description, status, blocks, visits, conversions, conversion_rate, published_at, form_id, campaign_id, created_at, and updated_at.
curl "https://api.misar.io/mail/api/landing-pages?status=published&limit=10" \
-H "Cookie: session=..."{
"success": true,
"data": [
{
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"title": "Summer Sale 2026",
"slug": "summer-sale-2026",
"description": null,
"status": "published",
"blocks": [],
"visits": 4210,
"conversions": 389,
"conversion_rate": 9.24,
"published_at": "2026-05-20T14:30:00Z",
"form_id": null,
"campaign_id": null,
"created_at": "2026-05-01T09:00:00Z",
"updated_at": "2026-05-20T14:30:00Z"
}
]
}Create a landing page
/mail/api/landing-pagesCreate a landing page. New pages are created as draft. If slug is omitted it is auto-generated from the title. Subject to your plan's landing-page quota.
Request body
titlestringbodyrequiredPage title, 1–200 characters (also used to auto-generate slug if omitted).
slugstringbodyURL slug — lowercase alphanumeric and hyphens only (^[a-z0-9-]+$). Auto-generated from title when omitted; must be unique.
descriptionstringbodyInternal description (max 500 chars).
blocksarraybodyOrdered array of block objects. Defaults to an empty array.
settingsobjectbodyPage-level settings object.
meta_titlestringbodySEO <title> tag (max 200 chars).
meta_descriptionstringbodySEO <meta name="description"> (max 500 chars).
og_image_urlstringbodyOpen Graph image URL.
custom_cssstringbodyRaw CSS injected into the page (max 50,000 chars).
form_idstringbodyUUID of a MisarMail form to embed on the page.
campaign_idstringbodyUUID of a campaign to link this page to for attribution.
Response fields
successbooleantrue when the page was created.
dataobjectThe created landing page, including id, slug, status, blocks, SEO fields, and analytics counters.
curl -X POST https://api.misar.io/mail/api/landing-pages \
-H "Cookie: session=..." \
-H "Content-Type: application/json" \
-d '{
"title": "Summer Sale 2026",
"slug": "summer-sale-2026",
"meta_title": "Summer Sale 2026 — Up to 40% off",
"meta_description": "Shop our biggest sale of the year.",
"og_image_url": "https://cdn.example.com/summer-sale-og.jpg",
"form_id": "b2c3d4e5-f6a7-8901-bcde-f23456789012",
"blocks": [
{
"id": "hero-1",
"type": "hero",
"content": {
"heading": "Summer Sale is here",
"subheading": "Up to 40% off — limited time only",
"cta": "Shop now",
"cta_url": "https://yoursite.com/sale"
},
"style": { "background": "#f0fdf4", "textAlign": "center" }
},
{
"id": "form-1",
"type": "form",
"content": { "heading": "Get early access deals" },
"style": {}
}
]
}'{
"success": true,
"data": {
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"title": "Summer Sale 2026",
"slug": "summer-sale-2026",
"status": "draft",
"blocks": [],
"meta_title": "Summer Sale 2026 — Up to 40% off",
"meta_description": "Shop our biggest sale of the year.",
"og_image_url": "https://cdn.example.com/summer-sale-og.jpg",
"form_id": "b2c3d4e5-f6a7-8901-bcde-f23456789012",
"campaign_id": null,
"visits": 0,
"conversions": 0,
"conversion_rate": 0,
"published_at": null,
"created_at": "2026-05-27T10:00:00Z",
"updated_at": "2026-05-27T10:00:00Z"
}
}Get a landing page
/mail/api/landing-pages/:idReturns the full page object including all blocks, SEO fields, and live analytics (visits, conversions, conversion_rate).
Path parameters
idstringpathrequiredUUID of the landing page.
curl https://api.misar.io/mail/api/landing-pages/a1b2c3d4-e5f6-7890-abcd-ef1234567890 \
-H "Cookie: session=..."Update a landing page
/mail/api/landing-pages/:idSend only the fields to change. Updating blocks replaces the full blocks array. Setting status to published sets published_at and makes the page live; updating slug changes the published URL immediately.
Path parameters
idstringpathrequiredUUID of the landing page to update.
Request body
statusdraft | publishedbodyPublish status. Setting published sets published_at.
All create fields (title, slug, description, blocks, settings, meta_title, meta_description, og_image_url, custom_css, form_id, campaign_id) may also be sent; each is optional.
curl -X PATCH https://api.misar.io/mail/api/landing-pages/a1b2c3d4-e5f6-7890-abcd-ef1234567890 \
-H "Cookie: session=..." \
-H "Content-Type: application/json" \
-d '{ "status": "published" }'Delete a landing page
/mail/api/landing-pages/:idDelete a landing page. The published URL becomes a 404 immediately.
Path parameters
idstringpathrequiredUUID of the landing page to delete.
Response fields
successbooleantrue when the page was deleted.
curl -X DELETE https://api.misar.io/mail/api/landing-pages/a1b2c3d4-e5f6-7890-abcd-ef1234567890 \
-H "Cookie: session=..."{ "success": true }Published URL
Pages are live at:
https://mail.misar.io/p/:slug
New pages are created as draft and are not publicly accessible until published via the dashboard or a PATCH setting "status": "published".
slug must be unique across your account, lowercase, and contain only alphanumeric characters and hyphens. Attempting to create or update a page with a duplicate slug returns HTTP 409; an invalid slug format returns 400.
Your plan includes a limit on the number of landing pages. Attempting to create a page beyond your plan limit returns HTTP 402. Check your current usage on the billing page.
Status codes
| Code | Meaning |
|---|---|
200 | Request succeeded (list / get / update / delete) |
201 | Landing page created |
400 | Validation failed or invalid slug/ID |
401 | Not authenticated |
402 | Landing-page quota reached for your plan |
404 | Landing page not found |
409 | Slug already taken |