List landing pages
List landing pages (newest first) with per-page stats: views, attributed orders, revenue — orders count as placed regardless of status (cancelled/returned included). Filter by product or status. limit/offset are opt-in pagination; omitting them returns the full list.
query Parameters
productIdFilter by product UUID
Filter by product UUID
statusFilter by lifecycle status
Filter by lifecycle status
limitOpt-in page size (1-200). Omitted → the full list (the dashboard fetches everything; LLM-facing clients should set a limit).
Opt-in page size (1-200). Omitted → the full list (the dashboard fetches everything; LLM-facing clients should set a limit).
offsetOpt-in page offset — pair with limit. Rows are newest-first.
Opt-in page offset — pair with limit. Rows are newest-first.
List landing pages › Responses
List of landing pages
successcountNumber of items returned
Create landing page
Create a draft landing page for a product. The slug defaults to lp-<8 chars> and is editable later. The page charges the product's catalog price — there is no price override (the price story lives in the images).
Validation: the product must exist; a taken slug returns 409.
Create landing page › Request Body
nameproductIdslug^[a-z0-9-]{3,60}$imageGapmetaTitlemetaDescriptionCreate landing page › Responses
Landing page created (draft)
successCompare landing pages of one product
The A/B view: every landing page of one product side by side with views, orders, revenue — orders count as placed regardless of status (cancelled/returned included). Conversion rate = orders / views (undefined on zero views — compute client-side).
query Parameters
productIdProduct UUID to compare pages for
Product UUID to compare pages for
Compare landing pages of one product › Responses
Landing pages of the product with stats
successcountNumber of items returned
Get landing page
Full landing page detail: settings, the ordered image stack, the linked product, and stats.
path Parameters
idLanding Page UUID
Landing Page UUID
Get landing page › Responses
Landing page details
successUpdate landing page
Partial update — send only the fields you want to change (name, slug, spacing settings, SEO meta). A taken slug returns 409.
path Parameters
idLanding Page UUID
Landing Page UUID
Update landing page › Request Body
nameslug^[a-z0-9-]{3,60}$imageGapmetaTitlemetaDescriptionUpdate landing page › Responses
Landing page updated
successDelete landing page
Permanently delete a landing page with NO attributed orders. Refused with LANDING_PAGE_HAS_ORDERS otherwise — archive instead so history stays intact. Images cascade.
path Parameters
idLanding Page UUID
Landing Page UUID
Delete landing page › Responses
Landing page deleted
successDuplicate landing page
Create a quick copy: a fresh DRAFT with a new slug, the same product, spacing, SEO meta, and image stack (images share the original immutable R2 objects — deleting an image elsewhere only removes the storage object when the last reference goes). Views, orders, revenue, and published state are never copied — a duplicate is a fresh creative test.
path Parameters
idLanding Page UUID
Landing Page UUID
Duplicate landing page › Responses
Landing page duplicated (draft)
successPublish landing page
Make the page live at /lp/
path Parameters
idLanding Page UUID
Landing Page UUID
Publish landing page › Responses
Landing page published
successUnpublish landing page
Return the page to draft — the link stops resolving (404) but history stays.
path Parameters
idLanding Page UUID
Landing Page UUID
Unpublish landing page › Responses
Landing page unpublished
successList landing page images
The image stack ordered by position (1 = top of the page).
path Parameters
idLanding Page UUID
Landing Page UUID
List landing page images › Responses
Image stack
successSave landing page image
Appends an uploaded image to the stack by its Media Key. Upload it first (POST /api/media/uploads with folder landing, send the file, complete the upload); its size comes from the upload.
path Parameters
idLanding Page UUID
Landing Page UUID
Save landing page image › Request Body
mediaKeyA Media Key: the image's identity in the store's media. Never a URL.
altTextAlt text for accessibility
positionWhere it goes, 1 = top of the page; the images from there move down one. Omitted or past the end: last
Save landing page image › Responses
Image added — returns the full reordered stack
successReorder landing page images
Set the stack order. Send the complete ordered array of image IDs — every existing image ID exactly once.
path Parameters
idLanding Page UUID
Landing Page UUID
Reorder landing page images › Request Body
imageIdsComplete ordered list of all image IDs for this landing page — no duplicates, no omissions.
Reorder landing page images › Responses
Images reordered — returns the stack in new order
successDelete landing page image
Remove an image from the stack. The R2 object is deleted first — a storage failure aborts so no DB row points at a missing object.
path Parameters
idLanding Page UUID
Landing Page UUID
imageIdLanding Page Image UUID
Landing Page Image UUID
Delete landing page image › Responses
Image deleted
successGet landing page tracking
This page's tracking: config is its own Meta Pixel + Conversions API configuration (null when it inherits the store's, which is the default for every page), and lastEvent is the most recent Conversions API attempt for an order this page produced — proof that a campaign is reporting, including Meta's own message when one failed. The access token is never returned, only a masked hint.
path Parameters
idLanding Page UUID
Landing Page UUID
Get landing page tracking › Responses
The page's tracking configuration and its most recent Conversions API attempt
successSave landing page tracking
Give this page its own pixel, REPLACING the store's for its visitors and for the orders attributed to it — never adding to it. Takes effect only while the Meta App's per-page tracking switch is on (the Meta App's page).
accessToken is required when creating the override and optional afterwards: an empty value keeps the stored token, because the dashboard only ever holds a masked hint.
conversionEvent is required — which moment counts as a conversion is a spend decision and is never defaulted for the merchant.
testMode requires a testEventCode, or the events reach production measurement instead of Meta's test stream.
path Parameters
idLanding Page UUID
Landing Page UUID
Save landing page tracking › Request Body
pixelIdconversionEventaccessTokenadAccountNametestEventCodetestModeenabledSave landing page tracking › Responses
Saved tracking configuration
successdataThe page's own pixel, or null when it inherits the store's.