Misar IO Docs
MisarMailApi Reference

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

MethodPathDescription
GET/v1/landing-pagesList landing pages
POST/v1/landing-pagesCreate a landing page
GET/v1/landing-pages/:idGet a single page
PATCH/v1/landing-pages/:idUpdate a page
DELETE/v1/landing-pages/:idDelete a page

Block types

Pages are composed from an ordered array of blocks. Each block has an id, type, content, and optional style object.

TypeDescription
heroFull-width header with heading and CTA button
textRich text body section
imageFull-width or contained image
formEmbedded MisarMail signup form
ctaCall-to-action banner with button
featuresFeature grid with icons and descriptions
testimonialQuote block with attribution
countdownLive countdown timer to a target date
dividerHorizontal rule / spacer
videoEmbedded video (YouTube, Vimeo, or direct URL)

List landing pages

GET /v1/landing-pages

ParameterTypeDefaultDescription
statusall | draft | publishedallFilter by publish status
limitinteger50Results per page (max 100)
offsetinteger0Pagination 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

FieldTypeRequiredDescription
titlestringYesPage title (also used to auto-generate slug if omitted)
slugstringNoURL slug — lowercase alphanumeric and hyphens only, must be unique
descriptionstringNoInternal description
blocksarrayYesOrdered array of block objects
meta_titlestringNoSEO <title> tag
meta_descriptionstringNoSEO <meta name="description">
og_image_urlstringNoOpen Graph image URL
custom_cssstringNoRaw CSS injected into the page
form_idstringNoEmbed a MisarMail form on the page
campaign_idstringNoLink 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.