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
Requires an API key or active session.
Authorization: Bearer msk_...
Endpoints
| Method | Path | Description |
|---|---|---|
GET | /v1/landing-pages | List landing pages |
POST | /v1/landing-pages | Create a landing page |
GET | /v1/landing-pages/:id | Get a single page |
PATCH | /v1/landing-pages/:id | Update a page |
DELETE | /v1/landing-pages/:id | Delete a page |
Block types
Pages are composed from an ordered array of blocks. Each block has an id, type, content, 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
GET /v1/landing-pages
| Parameter | Type | Default | Description |
|---|---|---|---|
status | all | draft | published | all | Filter by publish status |
limit | integer | 50 | Results per page (max 100) |
offset | integer | 0 | Pagination offset |
curl "https://api.misar.io/mail/v1/landing-pages?status=published&limit=10" \
-H "Authorization: Bearer msk_..."const res = await fetch(
"https://api.misar.io/mail/v1/landing-pages?status=published&limit=10",
{ headers: { Authorization: "Bearer msk_..." } }
);
const { data } = await res.json();Response
{
"success": true,
"data": {
"pages": [
{
"id": "lp_01hvabc",
"title": "Summer Sale 2026",
"slug": "summer-sale-2026",
"status": "published",
"visits": 4210,
"conversions": 389,
"conversion_rate": 9.24,
"published_url": "https://mail.misar.io/p/summer-sale-2026",
"created_at": "2026-05-01T09:00:00Z",
"updated_at": "2026-05-20T14:30:00Z"
}
],
"total": 3,
"limit": 10,
"offset": 0
}
}Create a landing page
POST /v1/landing-pages
| Field | Type | Required | Description |
|---|---|---|---|
title | string | Yes | Page title (also used to auto-generate slug if omitted) |
slug | string | No | URL slug — lowercase alphanumeric and hyphens only, must be unique |
description | string | No | Internal description |
blocks | array | Yes | Ordered array of block objects |
meta_title | string | No | SEO <title> tag |
meta_description | string | No | SEO <meta name="description"> |
og_image_url | string | No | Open Graph image URL |
custom_css | string | No | Raw CSS injected into the page |
form_id | string | No | Embed a MisarMail form on the page |
campaign_id | string | No | Link this page to a campaign for attribution |
curl -X POST https://api.misar.io/mail/v1/landing-pages \
-H "Authorization: Bearer msk_..." \
-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": "frm_01hvabc",
"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": {}
},
{
"id": "divider-1",
"type": "divider",
"content": {},
"style": {}
}
]
}'const res = await fetch("https://api.misar.io/mail/v1/landing-pages", {
method: "POST",
headers: {
Authorization: "Bearer msk_...",
"Content-Type": "application/json",
},
body: JSON.stringify({
title: "Summer Sale 2026",
slug: "summer-sale-2026",
meta_title: "Summer Sale 2026 — Up to 40% off",
form_id: "frm_01hvabc",
blocks: [
{
id: "hero-1",
type: "hero",
content: {
heading: "Summer Sale is here",
cta: "Shop now",
cta_url: "https://yoursite.com/sale",
},
style: {},
},
],
}),
});
const { data } = await res.json();Response
{
"success": true,
"data": {
"id": "lp_01hvabc",
"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": "frm_01hvabc",
"campaign_id": null,
"visits": 0,
"conversions": 0,
"conversion_rate": 0,
"published_url": "https://mail.misar.io/p/summer-sale-2026",
"created_at": "2026-05-27T10:00:00Z",
"updated_at": "2026-05-27T10:00:00Z"
}
}Get a landing page
GET /v1/landing-pages/:id
Returns the full page object including all blocks, SEO fields, and live analytics (visits, conversions, conversion_rate).
Update a landing page
PATCH /v1/landing-pages/:id
Send only the fields to change. Updating blocks replaces the full blocks array. Updating slug will change the published URL immediately.
Delete a landing page
DELETE /v1/landing-pages/:id
Returns { "success": true }. The published URL becomes a 404 immediately.
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 a page with a duplicate or invalid slug returns HTTP 409.
Your plan includes a limit on the number of active landing pages. Attempting to publish beyond your plan limit returns HTTP 402. Check your current usage on the billing page.