# Global Blocks in LanderLab: Build Once, Update Everywhere
Source: https://docs.landerlab.io/add-global-block
Learn what global blocks are in LanderLab and how to reuse navbars, footers, and CTAs across every landing page. Edit once and update all pages instantly.
Global blocks let you build a block one time and reuse it across as many landing pages as you want. Because the block stays global, any change you make to the original updates every page it appears on automatically. There is no need to edit each page by hand.
Global blocks stay connected across pages. Editing the original updates every copy instantly. This is different from saving a section as a component, where each copy is independent and changes are not shared.
## What are global blocks?
A global block is a reusable block, like a navbar or footer, that you design once and place on multiple pages. Every instance points back to the same source, so the content, links, and styling stay in sync everywhere.
When you update the source block, for example changing a link in your navbar, that update applies to every page that uses it. You never have to open each page and change it manually.
## Why use global blocks
* **Edit once, update everywhere.** Change a link or a line of text in one place and every page updates automatically.
* **Consistency across pages.** Navigation, links, and messaging stay identical on every landing page.
* **Faster workflow.** Reuse the same building blocks instead of rebuilding or copy-pasting them for each new page.
* **Fewer mistakes.** One source of truth means no broken or outdated links left behind on older pages.
## Common use cases
Global blocks work best for anything that should look and behave the same across every page.
**Navigation and structure**
* **Navbar.** Keep the same menu, logo, and links on every page. Update one link and it changes everywhere.
* **Footer.** Maintain consistent contact details, social links, and legal links across your whole site.
**For media buyers and performance marketers**
* **Offer CTA blocks.** Reuse the same call-to-action section across a campaign. When you rotate or swap an offer, update the link once and every landing page points to the new offer instantly.
* **Compliance and legal blocks.** Keep advertiser disclosures, privacy links, and terms consistent across every page. When a network or regulation requires a wording change, update it in one place.
* **Promo and announcement bars.** Run the same limited-time offer or announcement across all pages, then update or remove it everywhere at once when the promotion ends.
* **Trust blocks.** Reuse testimonial rows, review badges, or partner logos so every page in a funnel carries the same social proof.
For affiliate and paid traffic campaigns, put your offer link inside a global block. Swapping offers later becomes a one-click change across every page instead of a manual edit on each lander.
Editing a global block changes it on every page where it appears. If you need a one-off version for a single page, use a regular saved component instead so your change stays local to that page.
# LanderLab API Overview
Source: https://docs.landerlab.io/api-overview
Learn how the LanderLab REST API works, how to authenticate, and what resources you can manage programmatically, from landing pages and leads to A/B testing and analytics.
The LanderLab API gives you programmatic access to your entire account. You can create and publish landers, pull lead data, read analytics, manage A/B test variants, configure integrations, and more, all over HTTP.
If you prefer working in plain English instead of writing raw API calls, the [MCP server](/mcp/overview) connects your AI assistant directly to LanderLab using the same underlying API. It signs in with your LanderLab account, so no API key is needed.
## Base URL
All API requests go to:
```text theme={null}
https://api.landerlab.dev
```
The current API version is **v2**. Every endpoint is prefixed with `/api/v2/`.
## Authentication
The API uses API key authentication. Include your key in the `X-API-Key` header on every request.
```text theme={null}
X-API-Key: ll_live_YOUR_KEY_HERE
```
Your key starts with `ll_live_` and is tied to your organization. All requests are scoped to the organization the key belongs to, so you do not need to pass an organization ID separately in most calls.
API keys are shown only once at creation. If you lose yours, you need to generate a new one. See [Generate an API Key](/mcp/generate-api-key) for steps.
### Error responses
All endpoints return standard HTTP status codes.
| Code | Meaning |
| ----- | ------------------------------------------------------ |
| `200` | Success |
| `400` | Bad request (invalid parameters or plan limit reached) |
| `401` | Unauthorized (missing or invalid API key) |
| `403` | Forbidden (key does not have access to this resource) |
| `404` | Not found |
Error responses include an `error` string in the response body with a description of the problem.
## Resource Groups
The API is organized around the following resource groups. Each group maps to a section in the API reference.
### Workspaces
List, create, and rename workspaces within your organization. Workspaces are the top-level container for landers, leads, and domains.
| Endpoint | Description |
| --------------------------------------------------------------- | ------------------- |
| `GET /api/v2/organizations/{organizationId}/workspaces/get` | List all workspaces |
| `POST /api/v2/organizations/{organizationId}/workspaces/create` | Create a workspace |
| `POST /api/v2/workspaces/{workspaceId}/rename` | Rename a workspace |
### Landers
Manage landing pages: list, create, rename, publish, unpublish, and delete. Publishing requires a domain and path and will return a `400` if plan limits are exceeded or the path is already taken.
| Endpoint | Description |
| ------------------------------------------------------ | ------------------------------------ |
| `GET /api/v2/workspaces/{workspaceId}/landers/get` | List landers in a workspace |
| `POST /api/v2/workspaces/{workspaceId}/landers/create` | Create a lander |
| `POST /api/v2/landers/{landerId}/publish` | Publish a lander |
| `POST /api/v2/landers/{landerId}/unpublish` | Unpublish a lander |
| `DELETE /api/v2/landers/{landerId}` | Delete a lander and all its variants |
Deleting a lander removes all associated variants, files, and integrations permanently.
### A/B Testing (Variants)
Each lander has one or more variants. The master variant is the one that receives traffic when A/B testing is off. When A/B testing is enabled, traffic is split across variants according to the weights you set.
| Endpoint | Description |
| ---------------------------------------------------- | --------------------------- |
| `GET /api/v2/landers/{landerId}/variants` | List all variants |
| `POST /api/v2/variants/{variantId}/clone` | Clone a variant |
| `POST /api/v2/landers/{landerId}/ab-testing/enable` | Enable A/B testing |
| `POST /api/v2/landers/{landerId}/ab-testing/disable` | Disable A/B testing |
| `POST /api/v2/landers/{landerId}/ab-testing/weights` | Set traffic split weights |
| `POST /api/v2/variants/{variantId}/set-master` | Promote a variant to master |
| `DELETE /api/v2/variants/{variantId}` | Delete a variant |
You cannot delete the master variant. Promote a different variant to master first.
### Editor
Load and save the HTML content and settings for a specific variant. Saving HTML handles base64 image extraction and versioning automatically.
| Endpoint | Description |
| --------------------------------------------------- | --------------------------------------------------- |
| `GET /api/v2/variants/{variantId}/editor/load` | Load HTML, settings, forms, and metadata |
| `POST /api/v2/variants/{variantId}/editor/save` | Save HTML content |
| `POST /api/v2/variants/{variantId}/editor/settings` | Save variant settings (integrations, SEO, tracking) |
### Leads
Pull leads at workspace or organization level. Leads are paginated and can be filtered by date range, status (`complete` or `partial`), lander, and search query. The maximum page size is 1000 per request.
| Endpoint | Description |
| ------------------------------------------------------ | ---------------------------------------- |
| `GET /api/v2/workspaces/{workspaceId}/leads/get` | List leads for a workspace |
| `GET /api/v2/organizations/{organizationId}/leads/get` | List leads across the organization |
| `GET /api/v2/landers/{landerId}/lead-schema` | Get the JSON Schema for a lander's leads |
| `POST /api/v2/landers/lead-schema` | Get the JSON Schema for multiple landers |
The lead schema endpoints return a [Draft-07 JSON Schema](https://json-schema.org/specification-links#draft-7) describing all possible fields a lead from that lander can contain, including form fields, quiz answers, system fields, and integration fields.
### Analytics
A single flexible endpoint covers all analytics needs. Filter by workspace, lander, or variant. The most specific filter wins: if you pass `variantIds`, workspace and lander filters are ignored.
| Endpoint | Description |
| ----------------------------------------------------------- | -------------------------------------------------------------- |
| `POST /api/v2/organizations/{organizationId}/analytics/get` | Get analytics with date range, timezone, and optional group-by |
**Required parameters:** `startDate`, `endDate`, `timezone` (IANA format, e.g. `America/New_York`).
**Optional filters:** `workspaceIds`, `landerIds`, `variantIds`.
**Group by:** `date`, `lander`, `variant`, or `workspace`. Defaults to `date`.
### Domains
List domains at workspace or organization level.
| Endpoint | Description |
| -------------------------------------------------------- | ---------------------------------------- |
| `GET /api/v2/workspaces/{workspaceId}/domains/get` | List domains in a workspace |
| `GET /api/v2/organizations/{organizationId}/domains/get` | List all domains across the organization |
### Folders
Organize landers into folders within a workspace.
| Endpoint | Description |
| ------------------------------------------------------ | ---------------- |
| `GET /api/v2/workspaces/{workspaceId}/folders` | List all folders |
| `POST /api/v2/workspaces/{workspaceId}/folders/create` | Create a folder |
| `POST /api/v2/folders/{folderId}/rename` | Rename a folder |
### Integrations
Create and list org-level integrations, then enable or disable them per lander. OAuth-based integrations (Mailchimp, HubSpot, Google Sheets, AWeber) require an interactive OAuth flow and cannot be created via the API directly.
| Endpoint | Description |
| ----------------------------------------------------------------- | ----------------------------------- |
| `GET /api/v2/organizations/{organizationId}/integrations` | List all integrations |
| `POST /api/v2/organizations/{organizationId}/integrations/create` | Create an integration |
| `POST /api/v2/lander-integrations/{id}/enable` | Enable a lander integration |
| `POST /api/v2/lander-integrations/{id}/disable` | Disable a lander integration |
| `DELETE /api/v2/lander-integrations/{id}` | Remove an integration from a lander |
## OpenAPI Spec and Interactive Docs
The full OpenAPI 3.1 spec is available at:
```text theme={null}
https://backend-v2.landerlab.workers.dev/api/v2/openapi.json
```
Interactive API documentation (with a built-in request tester) is at:
```text theme={null}
https://api.landerlab.dev/api/v2/docs
```
## Using the API with an AI Assistant (MCP)
If you want to manage your LanderLab account using plain English instead of writing API calls, the LanderLab MCP server is built on the same API and exposes 30+ tools to any MCP-compatible AI assistant, including Claude, ChatGPT, Cursor, and Windsurf.
The MCP server URL is:
```text theme={null}
https://api.landerlab.dev/mcp
```
It authenticates through a browser sign-in rather than the `X-API-Key` header, so no API key is required. See [Connect AI Assistants via MCP](/mcp/overview) for setup instructions.
# Clone a variant (create new A/B test variant)
Source: https://docs.landerlab.io/api-reference/ab-testing/clone-a-variant-create-new-ab-test-variant
https://backend-v2.landerlab.workers.dev/api/v2/openapi.json post /api/v2/workspaces/{workspaceId}/landers/{landerId}/variants/create
Create a new variant by cloning an existing one. The new variant is a copy of the source `variantId` with a new name. Use this to create variants for A/B testing.
# Delete variant
Source: https://docs.landerlab.io/api-reference/ab-testing/delete-variant
https://backend-v2.landerlab.workers.dev/api/v2/openapi.json delete /api/v2/workspaces/{workspaceId}/landers/{landerId}/variants/{variantId}/delete
Delete a variant. Fails if the variant is the master variant — promote a different variant to master first via setMaster.
# Disable A/B testing
Source: https://docs.landerlab.io/api-reference/ab-testing/disable-ab-testing
https://backend-v2.landerlab.workers.dev/api/v2/openapi.json post /api/v2/workspaces/{workspaceId}/landers/{landerId}/variants/disable
Turn off multi-variant traffic splitting; only the master variant will receive traffic.
# Enable A/B testing
Source: https://docs.landerlab.io/api-reference/ab-testing/enable-ab-testing
https://backend-v2.landerlab.workers.dev/api/v2/openapi.json post /api/v2/workspaces/{workspaceId}/landers/{landerId}/variants/enable
Turn on multi-variant traffic splitting for the lander.
# Get variant settings
Source: https://docs.landerlab.io/api-reference/ab-testing/get-variant-settings
https://backend-v2.landerlab.workers.dev/api/v2/openapi.json get /api/v2/workspaces/{workspaceId}/landers/{landerId}/variants/{variantId}/settings
Returns the settings for a single variant. Fetched on demand when the settings panel is opened, rather than shipped with the full lander list.
# List variants
Source: https://docs.landerlab.io/api-reference/ab-testing/list-variants
https://backend-v2.landerlab.workers.dev/api/v2/openapi.json get /api/v2/workspaces/{workspaceId}/landers/{landerId}/variants/get
Returns all variants for a lander.
# Set master variant
Source: https://docs.landerlab.io/api-reference/ab-testing/set-master-variant
https://backend-v2.landerlab.workers.dev/api/v2/openapi.json post /api/v2/workspaces/{workspaceId}/landers/{landerId}/variants/{variantId}/setMaster
Promote this variant to be the master variant of its lander. If A/B testing is disabled, weights collapse to 100% on the new master.
# Set variant weights (A/B traffic split)
Source: https://docs.landerlab.io/api-reference/ab-testing/set-variant-weights-ab-traffic-split
https://backend-v2.landerlab.workers.dev/api/v2/openapi.json post /api/v2/workspaces/{workspaceId}/landers/{landerId}/variants/setWeights
Set the traffic distribution weights across variants. Weights must sum sensibly (typically to 100).
# Get current context
Source: https://docs.landerlab.io/api-reference/account/get-current-context
https://backend-v2.landerlab.workers.dev/api/v2/openapi.json get /api/v2/me
Returns the organization and workspaces this API key can access. Call this first to discover the organizationId and workspaceIds required by the other endpoints.
# Get unified analytics
Source: https://docs.landerlab.io/api-reference/analytics/get-unified-analytics
https://backend-v2.landerlab.workers.dev/api/v2/openapi.json post /api/v2/organizations/{organizationId}/analytics/get
Flexible analytics endpoint scoped to the organization. Filter by any combination of workspaceIds, landerIds, or variantIds. The most-specific filter wins (variantIds > landerIds > workspaceIds). Returns aggregate totals plus a breakdown grouped by date / lander / variant / workspace.
# Reset lander analytics
Source: https://docs.landerlab.io/api-reference/analytics/reset-lander-analytics
https://backend-v2.landerlab.workers.dev/api/v2/openapi.json post /api/v2/workspaces/{workspaceId}/landers/{landerId}/analytics/reset
Sets the analytics reset point for a lander and all of its variants. Visits, clicks, conversions and lead counts recorded before this moment are excluded from analytics. Leads remain visible in the leads list.
# Clone component
Source: https://docs.landerlab.io/api-reference/components/clone-component
https://backend-v2.landerlab.workers.dev/api/v2/openapi.json post /api/v2/workspaces/{workspaceId}/components/{componentId}/clone
Duplicate a global component. The clone gets a fresh id and its scoped CSS is re-scoped to it.
# Create component
Source: https://docs.landerlab.io/api-reference/components/create-component
https://backend-v2.landerlab.workers.dev/api/v2/openapi.json post /api/v2/workspaces/{workspaceId}/components/create
Create a new global component in the workspace.
# Delete component
Source: https://docs.landerlab.io/api-reference/components/delete-component
https://backend-v2.landerlab.workers.dev/api/v2/openapi.json delete /api/v2/workspaces/{workspaceId}/components/{componentId}/delete
Soft delete a global component. Existing instances keep their last snapshot and stop receiving updates.
# Get component
Source: https://docs.landerlab.io/api-reference/components/get-component
https://backend-v2.landerlab.workers.dev/api/v2/openapi.json get /api/v2/workspaces/{workspaceId}/components/{componentId}/get
Returns a single global component by id.
# Get component version
Source: https://docs.landerlab.io/api-reference/components/get-component-version
https://backend-v2.landerlab.workers.dev/api/v2/openapi.json get /api/v2/workspaces/{workspaceId}/components/{componentId}/versions/{versionId}/get
Returns a single component version including its content and css.
# List component versions
Source: https://docs.landerlab.io/api-reference/components/list-component-versions
https://backend-v2.landerlab.workers.dev/api/v2/openapi.json get /api/v2/workspaces/{workspaceId}/components/{componentId}/versions/get
Returns the version history of a global component, newest first, without content.
# List components
Source: https://docs.landerlab.io/api-reference/components/list-components
https://backend-v2.landerlab.workers.dev/api/v2/openapi.json get /api/v2/workspaces/{workspaceId}/components/get
Returns all global components in the workspace, newest first, including content and css.
# Move component to another workspace
Source: https://docs.landerlab.io/api-reference/components/move-component-to-another-workspace
https://backend-v2.landerlab.workers.dev/api/v2/openapi.json post /api/v2/workspaces/{workspaceId}/components/{componentId}/move-to-workspace
Move a global component to another workspace in the same organization. Only allowed when the component is not used on any lander.
# Restore component version
Source: https://docs.landerlab.io/api-reference/components/restore-component-version
https://backend-v2.landerlab.workers.dev/api/v2/openapi.json post /api/v2/workspaces/{workspaceId}/components/{componentId}/versions/{versionId}/restore
Restore the content and css of a global component from a version. The restored state is saved as a new version.
# Update component
Source: https://docs.landerlab.io/api-reference/components/update-component
https://backend-v2.landerlab.workers.dev/api/v2/openapi.json patch /api/v2/workspaces/{workspaceId}/components/{componentId}/update
Partially update a global component. Only the provided fields are applied.
# List organization domains
Source: https://docs.landerlab.io/api-reference/domains/list-organization-domains
https://backend-v2.landerlab.workers.dev/api/v2/openapi.json get /api/v2/organizations/{organizationId}/domains/get
Returns all domains across the organization with published lander counts and workspace info.
# List workspace domains
Source: https://docs.landerlab.io/api-reference/domains/list-workspace-domains
https://backend-v2.landerlab.workers.dev/api/v2/openapi.json get /api/v2/workspaces/{workspaceId}/domains/get
Returns all domains assigned to the workspace.
# Delete a variant file
Source: https://docs.landerlab.io/api-reference/editor/delete-a-variant-file
https://backend-v2.landerlab.workers.dev/api/v2/openapi.json post /api/v2/workspaces/{workspaceId}/editors/{variantId}/deleteFile
Delete a single file from the variant (the variants/unpublished R2 scope).
# Discard unpublished changes
Source: https://docs.landerlab.io/api-reference/editor/discard-unpublished-changes
https://backend-v2.landerlab.workers.dev/api/v2/openapi.json post /api/v2/workspaces/{workspaceId}/editors/{variantId}/discardChanges
Overwrite the variant's draft state (files, settings, quizzes) with its live published state, discarding all unpublished changes. Returns 400 if the lander is not published or has no published files for this variant.
# Get AI translation job status
Source: https://docs.landerlab.io/api-reference/editor/get-ai-translation-job-status
https://backend-v2.landerlab.workers.dev/api/v2/openapi.json get /api/v2/workspaces/{workspaceId}/editors/{variantId}/translate/jobs/{jobId}
Status of a translation job started with translate/page. `variantId` is the id of the variant being translated (returned by translate/page). `pending` while the job runs, then `success` with the agent's summary and the version it produced, or `failed` with an error reason.
# Get AI translation status
Source: https://docs.landerlab.io/api-reference/editor/get-ai-translation-status
https://backend-v2.landerlab.workers.dev/api/v2/openapi.json get /api/v2/workspaces/{workspaceId}/editors/{variantId}/translate/status
Status of the most recent AI translation started for this variant: generating, finished or canceled, the agent's closing summary, and the version it produced.
# List variant files
Source: https://docs.landerlab.io/api-reference/editor/list-variant-files
https://backend-v2.landerlab.workers.dev/api/v2/openapi.json get /api/v2/workspaces/{workspaceId}/editors/{variantId}/files
List the relative paths of all files stored for a variant (the variants/unpublished R2 scope). Use loadFile to fetch a specific file's content.
# Load editor HTML
Source: https://docs.landerlab.io/api-reference/editor/load-editor-html
https://backend-v2.landerlab.workers.dev/api/v2/openapi.json get /api/v2/workspaces/{workspaceId}/editors/{variantId}/load
Load the HTML content, settings, forms, and metadata for a variant in the editor.
# Read a variant file
Source: https://docs.landerlab.io/api-reference/editor/read-a-variant-file
https://backend-v2.landerlab.workers.dev/api/v2/openapi.json get /api/v2/workspaces/{workspaceId}/editors/{variantId}/loadFile
Return the text content of a single file stored for the variant (the variants/unpublished R2 scope).
# Rename a variant file
Source: https://docs.landerlab.io/api-reference/editor/rename-a-variant-file
https://backend-v2.landerlab.workers.dev/api/v2/openapi.json post /api/v2/workspaces/{workspaceId}/editors/{variantId}/renameFile
Rename/move a single file within the variant (the variants/unpublished R2 scope). Updates the index file reference when the entry file is renamed.
# Save editor HTML
Source: https://docs.landerlab.io/api-reference/editor/save-editor-html
https://backend-v2.landerlab.workers.dev/api/v2/openapi.json post /api/v2/workspaces/{workspaceId}/editors/{variantId}/save
Save HTML content for a variant. Handles base64 image extraction, gallery cloning, and versioning automatically.
# Save variant settings
Source: https://docs.landerlab.io/api-reference/editor/save-variant-settings
https://backend-v2.landerlab.workers.dev/api/v2/openapi.json post /api/v2/workspaces/{workspaceId}/editors/{variantId}/saveSettings
Save settings (integrations, tracking, SEO, etc.) for a variant.
# Translate a whole page with AI
Source: https://docs.landerlab.io/api-reference/editor/translate-a-whole-page-with-ai
https://backend-v2.landerlab.workers.dev/api/v2/openapi.json post /api/v2/workspaces/{workspaceId}/editors/{variantId}/translate/page
Start a durable AI translation job for the variant's saved draft. The agent rewrites every user-visible string in the page files into the target language and updates the page language, title and SEO settings. `destination` picks where the translation lands: `this_variant` edits the variant in place, `new_variant` clones it into a new variant of the same lander first, `new_lander` clones the whole lander and translates the matching variant there; `name` names the new variant or lander. Returns 202 with a `jobId` and the id of the variant being translated; the job runs to completion regardless of the client and cannot be cancelled. Poll translate/jobs/{jobId} on that variant until its status is success or failed, then reload the variant.
# Unpublished changes diff
Source: https://docs.landerlab.io/api-reference/editor/unpublished-changes-diff
https://backend-v2.landerlab.workers.dev/api/v2/openapi.json get /api/v2/workspaces/{workspaceId}/editors/{variantId}/changes
Compare the variant's draft state (files, settings, quizzes, A/B traffic weights) against its live published state and return a git-like diff: added, modified and deleted entries, with unified hunks and per-line changes for text content. Returns 400 if the lander is not published or has no changes to be published.
# Upload a variant file
Source: https://docs.landerlab.io/api-reference/editor/upload-a-variant-file
https://backend-v2.landerlab.workers.dev/api/v2/openapi.json post /api/v2/workspaces/{workspaceId}/editors/{variantId}/uploadFile
Upload a single binary or text file for the variant as multipart/form-data. Best option for large files (up to 20 MB).
# Upload a variant file as base64
Source: https://docs.landerlab.io/api-reference/editor/upload-a-variant-file-as-base64
https://backend-v2.landerlab.workers.dev/api/v2/openapi.json post /api/v2/workspaces/{workspaceId}/editors/{variantId}/uploadFileBase64
Store a base64-encoded file under the given path in the variant. Intended for small files (up to 5 MB decoded); for larger files use uploadFileFromUrl or the multipart uploadFile endpoint. Returns the stored file path and its CDN URL.
# Upload a variant file from a URL
Source: https://docs.landerlab.io/api-reference/editor/upload-a-variant-file-from-a-url
https://backend-v2.landerlab.workers.dev/api/v2/openapi.json post /api/v2/workspaces/{workspaceId}/editors/{variantId}/uploadFileFromUrl
Download a file from a public http(s) URL server-side and store it under the given path in the variant (up to 20 MB). Returns the stored file path and its CDN URL.
# Write a variant file
Source: https://docs.landerlab.io/api-reference/editor/write-a-variant-file
https://backend-v2.landerlab.workers.dev/api/v2/openapi.json post /api/v2/workspaces/{workspaceId}/editors/{variantId}/saveFile
Create or overwrite a single text file (HTML/CSS/JS) for the variant. For the main page HTML prefer the /save endpoint, which also handles base64 image extraction, search indexing and preview sync.
# Create folder
Source: https://docs.landerlab.io/api-reference/folders/create-folder
https://backend-v2.landerlab.workers.dev/api/v2/openapi.json post /api/v2/workspaces/{workspaceId}/folders/create
Create a new folder in the workspace, optionally nested inside a parent folder. Fails if a sibling folder with the same name already exists.
# List folders
Source: https://docs.landerlab.io/api-reference/folders/list-folders
https://backend-v2.landerlab.workers.dev/api/v2/openapi.json get /api/v2/workspaces/{workspaceId}/folders/get
Returns all folders in the workspace owned by the authenticated principal.
# Move folder into another folder
Source: https://docs.landerlab.io/api-reference/folders/move-folder-into-another-folder
https://backend-v2.landerlab.workers.dev/api/v2/openapi.json post /api/v2/workspaces/{workspaceId}/folders/{folderId}/move-to-folder
Move a folder inside another folder, or to the workspace root by passing a null parentId. Fails when moving a folder into itself or one of its subfolders, or when the destination already contains a folder with the same name.
# Rename folder
Source: https://docs.landerlab.io/api-reference/folders/rename-folder
https://backend-v2.landerlab.workers.dev/api/v2/openapi.json post /api/v2/workspaces/{workspaceId}/folders/{folderId}/update
Rename an existing folder. Fails if a sibling folder already uses the new name.
# Create integration
Source: https://docs.landerlab.io/api-reference/integrations/create-integration
https://backend-v2.landerlab.workers.dev/api/v2/openapi.json post /api/v2/organizations/{organizationId}/integrations/create
Create a new organization integration. The body shape depends on the integration type (e.g. RedTrack, ClickFlare, Brevo, Klaviyo, MetaPixel, GoogleTagManager). OAuth-based types (MailChimp, HubSpot, Gmail, Sheets, AWeber) require an OAuth `code` from the interactive flow and are not practical to call directly via API.
# Delete integration
Source: https://docs.landerlab.io/api-reference/integrations/delete-integration
https://backend-v2.landerlab.workers.dev/api/v2/openapi.json delete /api/v2/organizations/{organizationId}/integrations/{integrationId}/delete
Delete an organization integration. It is also detached from every lander that used it (their previews and published integrations are refreshed).
# Get Cloudflare OAuth authorize URL
Source: https://docs.landerlab.io/api-reference/integrations/get-cloudflare-oauth-authorize-url
https://backend-v2.landerlab.workers.dev/api/v2/openapi.json get /api/v2/organizations/{organizationId}/integrations/cloudflare/oauth/authorize-url
Returns the Cloudflare consent-screen URL for connecting a Cloudflare account as an integration. The OAuth state is server-minted; the callback creates or updates the integration and redirects back to the dashboard.
# Get integration type catalog entry
Source: https://docs.landerlab.io/api-reference/integrations/get-integration-type-catalog-entry
https://backend-v2.landerlab.workers.dev/api/v2/openapi.json get /api/v2/organizations/{organizationId}/integrations/catalog/{provider}
Full catalog entry for one integration type (by provider id or typeName): per-action config schemas and selectable data resources with their param dependencies.
# List integration type catalog
Source: https://docs.landerlab.io/api-reference/integrations/list-integration-type-catalog
https://backend-v2.landerlab.workers.dev/api/v2/openapi.json get /api/v2/organizations/{organizationId}/integrations/catalog
Static catalog of available integration types (credential-free metadata). Pass `full=true` for complete entries with per-action config schemas and data resources.
# List integrations
Source: https://docs.landerlab.io/api-reference/integrations/list-integrations
https://backend-v2.landerlab.workers.dev/api/v2/openapi.json get /api/v2/organizations/{organizationId}/integrations/get
Returns all integrations in the organization (credentials excluded).
# List lander-integration connect configs
Source: https://docs.landerlab.io/api-reference/integrations/list-lander-integration-connect-configs
https://backend-v2.landerlab.workers.dev/api/v2/openapi.json get /api/v2/organizations/{organizationId}/integrations/connect-config
Declarative per-type configs describing how a lander integration is configured (resource selects, tags, field-mapping semantics, payload assembly). Consumed by the mobile app so the connect flows stay server-defined.
# Attach integration to lander
Source: https://docs.landerlab.io/api-reference/lander-integrations/attach-integration-to-lander
https://backend-v2.landerlab.workers.dev/api/v2/openapi.json post /api/v2/workspaces/{workspaceId}/landers/{landerId}/integrations/create
Create a lander integration. For page integrations (pixels, tag managers) pass `{ integrationId, variantIds? }`. For lead integrations pass `{ type, name, data, integrationId? }` where `data` is the type-specific config (field mappings, audience/list selection, etc.).
# Detach integration from lander
Source: https://docs.landerlab.io/api-reference/lander-integrations/detach-integration-from-lander
https://backend-v2.landerlab.workers.dev/api/v2/openapi.json delete /api/v2/workspaces/{workspaceId}/landers/{landerId}/integrations/{landerIntegrationId}/delete
Remove a lander integration link.
# Disable lander integration
Source: https://docs.landerlab.io/api-reference/lander-integrations/disable-lander-integration
https://backend-v2.landerlab.workers.dev/api/v2/openapi.json post /api/v2/workspaces/{workspaceId}/landers/{landerId}/integrations/{landerIntegrationId}/disable
Deactivate a lander integration.
# Enable lander integration
Source: https://docs.landerlab.io/api-reference/lander-integrations/enable-lander-integration
https://backend-v2.landerlab.workers.dev/api/v2/openapi.json post /api/v2/workspaces/{workspaceId}/landers/{landerId}/integrations/{landerIntegrationId}/enable
Activate a lander integration so it processes leads/events.
# Get integration data for lander setup
Source: https://docs.landerlab.io/api-reference/lander-integrations/get-integration-data-for-lander-setup
https://backend-v2.landerlab.workers.dev/api/v2/openapi.json get /api/v2/workspaces/{workspaceId}/landers/{landerId}/integrations/getIntegrationData
Fetch provider-side resources (audiences, lists, fields, spreadsheets, etc.) plus the lander's local lead fields, used to build a lander integration config. Pass `source` (integration type), `required` (resource key) and, for credential-based providers, `integrationId`.
# List lander integration delivery logs
Source: https://docs.landerlab.io/api-reference/lander-integrations/list-lander-integration-delivery-logs
https://backend-v2.landerlab.workers.dev/api/v2/openapi.json get /api/v2/organizations/{organizationId}/logs/landerIntegrations/get
Paginated request/response logs for lead deliveries to integrations across the organization. Filter by `landerIds` (JSON array string, empty = all owned landers), integration `type`, date range, and free-text `q` (searches request/response). Use this to verify leads are reaching an integration and to debug failures.
# List lander integrations
Source: https://docs.landerlab.io/api-reference/lander-integrations/list-lander-integrations
https://backend-v2.landerlab.workers.dev/api/v2/openapi.json get /api/v2/workspaces/{workspaceId}/landers/{landerId}/integrations/get
Returns all integrations attached to a lander.
# Update lander integration
Source: https://docs.landerlab.io/api-reference/lander-integrations/update-lander-integration
https://backend-v2.landerlab.workers.dev/api/v2/openapi.json put /api/v2/workspaces/{workspaceId}/landers/{landerId}/integrations/{landerIntegrationId}/update
Update a lander integration. Same body shape as create: `{ integrationId, variantIds? }` for page integrations, `{ type, name, data, integrationId? }` for lead integrations.
# Clone lander
Source: https://docs.landerlab.io/api-reference/landers/clone-lander
https://backend-v2.landerlab.workers.dev/api/v2/openapi.json post /api/v2/workspaces/{workspaceId}/landers/{landerId}/clone
Duplicate a lander as a new, separate page in the same workspace/folder. All of each variant's files (HTML, images, CSS, JS, fonts, videos, and any other assets) are copied into the new variant; URLs inside HTML files are rewritten to point at the copy, other files are copied as-is (relative references keep working). The clone is unpublished and auto-named. Ideal for creating a new page based on an existing one, e.g. translations.
# Create lander
Source: https://docs.landerlab.io/api-reference/landers/create-lander
https://backend-v2.landerlab.workers.dev/api/v2/openapi.json post /api/v2/workspaces/{workspaceId}/landers/create
Create a new lander. If `templateId` is omitted, a default template is used. Optionally place the lander in a folder or attach it to a website.
# Create lander from URL
Source: https://docs.landerlab.io/api-reference/landers/create-lander-from-url
https://backend-v2.landerlab.workers.dev/api/v2/openapi.json post /api/v2/workspaces/{workspaceId}/landers/create/url
Import an existing web page by URL and create a new editable lander from it. Rate limited to 25 imports per day per organization when called with an API key. Optionally place the lander in a folder
# Delete lander
Source: https://docs.landerlab.io/api-reference/landers/delete-lander
https://backend-v2.landerlab.workers.dev/api/v2/openapi.json delete /api/v2/workspaces/{workspaceId}/landers/{landerId}/delete
Delete a lander and all of its variants, files, and integrations. If the lander is a website master, master is reassigned to another lander in the website when possible.
# Get lead JSON Schema for a lander
Source: https://docs.landerlab.io/api-reference/landers/get-lead-json-schema-for-a-lander
https://backend-v2.landerlab.workers.dev/api/v2/openapi.json get /api/v2/workspaces/{workspaceId}/landers/{landerId}/lead-schema
Returns a Draft-07 JSON Schema describing all fields a lead from this lander can contain, including form fields, quiz answers, system fields, and active integration fields.
# Get lead JSON Schema for multiple landers
Source: https://docs.landerlab.io/api-reference/landers/get-lead-json-schema-for-multiple-landers
https://backend-v2.landerlab.workers.dev/api/v2/openapi.json get /api/v2/workspaces/{workspaceId}/landers/lead-schemas
Returns a Draft-07 JSON Schema for the leads collected across multiple landers. By default all fields are merged into a single object schema (later landers override earlier ones on key collision). Pass `union=true` to instead return a `oneOf` of per-lander schemas, each labeled by lander name.
# List workspace landers
Source: https://docs.landerlab.io/api-reference/landers/list-workspace-landers
https://backend-v2.landerlab.workers.dev/api/v2/openapi.json get /api/v2/workspaces/{workspaceId}/landers/get
Returns all landers in the workspace with computed preview URL and status.
# List workspace landers (slim)
Source: https://docs.landerlab.io/api-reference/landers/list-workspace-landers-slim
https://backend-v2.landerlab.workers.dev/api/v2/openapi.json get /api/v2/workspaces/{workspaceId}/landers/list
Lightweight lander listing: id, name, live/preview URLs and publish status.
# Move landers to folder
Source: https://docs.landerlab.io/api-reference/landers/move-landers-to-folder
https://backend-v2.landerlab.workers.dev/api/v2/openapi.json post /api/v2/workspaces/{workspaceId}/landers/move-to-folder
Move one or more landers into a folder. Fails if any lander belongs to a website. Returns a single `lander` when one id is passed, otherwise the full `landers` list.
# Publish lander
Source: https://docs.landerlab.io/api-reference/landers/publish-lander
https://backend-v2.landerlab.workers.dev/api/v2/openapi.json post /api/v2/workspaces/{workspaceId}/landers/{landerId}/publish
Publish a lander on the given domain and path. Returns 400 if plan limits are exceeded or the path is taken.
# Remove lander from folder
Source: https://docs.landerlab.io/api-reference/landers/remove-lander-from-folder
https://backend-v2.landerlab.workers.dev/api/v2/openapi.json post /api/v2/workspaces/{workspaceId}/landers/{landerId}/remove-from-folder
Detach a lander from its folder (sets folderId to null). Returns 404 if the lander is not currently in a folder.
# Rename lander
Source: https://docs.landerlab.io/api-reference/landers/rename-lander
https://backend-v2.landerlab.workers.dev/api/v2/openapi.json put /api/v2/workspaces/{workspaceId}/landers/{landerId}/update
Rename an existing lander.
# Unpublish lander
Source: https://docs.landerlab.io/api-reference/landers/unpublish-lander
https://backend-v2.landerlab.workers.dev/api/v2/openapi.json post /api/v2/workspaces/{workspaceId}/landers/{landerId}/unpublish
Unpublish a lander, removing it from its current domain.
# List organization leads
Source: https://docs.landerlab.io/api-reference/leads/list-organization-leads
https://backend-v2.landerlab.workers.dev/api/v2/openapi.json get /api/v2/organizations/{organizationId}/leads/get
Returns paginated leads across the entire organization with lander and workspace context, each with the integrations it was sent to and its phone / email verification and OTP status.
# List workspace leads
Source: https://docs.landerlab.io/api-reference/leads/list-workspace-leads
https://backend-v2.landerlab.workers.dev/api/v2/openapi.json get /api/v2/workspaces/{workspaceId}/leads/get
Returns paginated leads for the workspace, each with the integrations it was sent to and its phone / email verification and OTP status. Supports filtering and search.
# Mcp
Source: https://docs.landerlab.io/api-reference/mcp
## MCP Server
Connect AI assistants to LanderLab via the [Model Context Protocol](https://modelcontextprotocol.io). Manage landing pages, analytics, leads, and A/B tests from Claude, Cursor, Windsurf, Manus, ChatGPT, or any MCP-compatible client.
```text theme={null}
https://api.landerlab.dev/mcp
```
OAuth sign-in · 30+ tools · Works everywhere
## Overview
The LanderLab MCP server gives AI assistants the ability to list landers, pull analytics, publish and unpublish pages, manage leads, run A/B tests, and more on your behalf. Instead of switching between your AI tool and the LanderLab dashboard, your assistant handles it in one conversation.
**Who is this for?** Performance marketers, media buyers, and teams who want to manage their LanderLab account faster. Ask your AI assistant what you need in plain English and it calls the right API for you.
**How it works.** The MCP server exposes tools that your AI assistant can call during a conversation. When you say "list my landers in workspace 1," the assistant calls `landers_list` and returns the results.
***
## Connect
In Claude, search for LanderLab under **Settings > Connectors > Browse connectors** and click **Connect**. In every other client, add `https://api.landerlab.dev/mcp` as a remote MCP server. Either way, you complete a LanderLab sign-in prompt in your browser. There is no API key and no header.
Step-by-step guides for each client:
* [Claude.ai](/mcp/ai-assistants/claude)
* [Claude Desktop](/mcp/ai-assistants/claude-desktop)
* [Claude Code](/mcp/ai-assistants/claude-code)
* [Cursor](/mcp/ai-assistants/cursor)
* [Windsurf](/mcp/ai-assistants/windsurf)
* [Manus](/mcp/ai-assistants/manus)
* [ChatGPT](/mcp/ai-assistants/chatgpt)
* [Gemini CLI](/mcp/ai-assistants/gemini-cli)
For any other client that supports the MCP HTTP transport, the minimal config is:
```json theme={null}
{
"mcpServers": {
"landerlab": {
"type": "http",
"url": "https://api.landerlab.dev/mcp"
}
}
}
```
The previous endpoint, `https://api.landerlab.dev/api/v2/mcp` with an `X-API-Key` header, is being retired. Remove it from your config and reconnect using the URL above.
***
## Tools Reference
Your organization is auto-resolved from your signed-in account. No need to pass an organization ID.
### Read-Only
| Tool | Description |
| --------------------- | ---------------------------------------- |
| `workspaces_list` | List all workspaces |
| `landers_list` | List landing pages in a workspace |
| `domains_list` | List domains in a workspace |
| `domains_list_global` | List all domains across the organization |
| `integrations_list` | List configured integrations |
| `leads_list` | List leads for a lander |
| `leads_list_org` | List leads across the organization |
| `variants_list` | List A/B test variants |
| `api_key_list` | List API keys |
| `dashboard_get` | Get visits, conversions, and leads stats |
| `analytics_graphs` | Get graph data for a lander |
| `analytics_stats` | Get detailed stats for a lander |
| `analytics_reports` | Generate reports for a lander |
| `reporting_get` | Run multi-lander reporting |
| `editor_load` | Load HTML and settings for a variant |
### Mutations
| Tool | Description |
| ---------------------------- | ----------------------------------- |
| `lander_publish` | Publish a landing page |
| `lander_unpublish` | Unpublish a landing page |
| `editor_save` | Save HTML content for a variant |
| `editor_save_settings` | Save variant settings |
| `variants_set_weights` | Set A/B test traffic split |
| `variants_enable` | Enable a variant |
| `variants_disable` | Disable a variant |
| `leads_update` | Update a lead |
| `leads_delete` | Delete a lead |
| `leads_update_org` | Update a lead (org-level) |
| `leads_delete_org` | Delete a lead (org-level) |
| `lander_integration_enable` | Enable an integration on a lander |
| `lander_integration_disable` | Disable an integration on a lander |
| `lander_integration_delete` | Remove an integration from a lander |
| `integration_create` | Create an org-level integration |
| `api_key_revoke` | Revoke an API key |
| `api_key_update` | Update an API key |
Full schemas and parameters: [API documentation](https://api.landerlab.dev/api/v2/docs)
***
## Authentication
The MCP server uses OAuth. On first connection, your client sends you to a LanderLab sign-in page. You approve the access request once, and the client stores and refreshes the token on its own.
Access is tied to the account you sign in with, and your organization is resolved automatically. To revoke access, open **Settings > Connected Apps** in LanderLab, or remove the connector in your AI tool.
API keys are still used for direct REST API calls. See [Generate an API Key](/mcp/generate-api-key).
***
## Example Prompts
Once connected, just talk to your AI assistant in plain English:
> **"List all my landers and their status"** Calls `landers_list` and returns page names, URLs, and publish status.
> **"Show me analytics for lander X over the last 7 days"** Calls `analytics_stats` with the date range and returns visits, conversions, and leads.
> **"Unpublish lander X"** Calls `lander_unpublish` to take the page offline.
> **"Set A/B test weights to 70/30 for lander X"** Calls `variants_set_weights` to adjust traffic distribution between variants.
> **"Show me all leads from workspace 1"** Calls `leads_list` and returns lead data for that workspace.
***
## Troubleshooting
**Sign-in window does not open** - Your client or browser is blocking the pop-up. Allow pop-ups for your AI tool and reconnect.
**Connected but no tools appear** - Restart your AI tool. Most clients only load the tool list at the start of a session.
**401 Unauthorized** - Your session expired or access was revoked. Remove the connector and add it again to sign in fresh.
**Not Acceptable** - The `Accept` header must include both `application/json` and `text/event-stream`. This usually shows up when testing with curl or a custom client.
**Still using the old endpoint** - Configs pointing at `https://api.landerlab.dev/api/v2/mcp` with an `X-API-Key` header should be replaced with `https://api.landerlab.dev/mcp`.
# Create workspace
Source: https://docs.landerlab.io/api-reference/workspaces/create-workspace
https://backend-v2.landerlab.workers.dev/api/v2/openapi.json post /api/v2/organizations/{organizationId}/workspaces/create
Create a new workspace within the organization. Fails if the workspace name is already taken or the plan limit is reached.
# List workspaces
Source: https://docs.landerlab.io/api-reference/workspaces/list-workspaces
https://backend-v2.landerlab.workers.dev/api/v2/openapi.json get /api/v2/organizations/{organizationId}/workspaces/get
Returns all workspaces the API key has access to within the organization.
# Rename workspace
Source: https://docs.landerlab.io/api-reference/workspaces/rename-workspace
https://backend-v2.landerlab.workers.dev/api/v2/openapi.json post /api/v2/organizations/{organizationId}/workspaces/{workspaceId}/update
Rename an existing workspace. Fails if another workspace in the organization already uses that name.
# LanderLab Changelog
Source: https://docs.landerlab.io/changelog
LanderLab changelog and product updates. Stay up to date with new features, improvements, and bug fixes shipped in LanderLab.
### Formulas in Quiz Funnels
You can now calculate values from quiz answers and show the result anywhere in your funnel. Combine answers with math to build things like a live savings estimate, a running total, or a personalized score, then drop the result straight into a step title, paragraph, or button.
**How to use it**
* Open your quiz and click the **Formulas** icon in the left sidebar
* Click **Add Formula**, give it a clear name, and build the calculation in the **Expression** field
* Insert any number field as a variable with the `{ }` button, then set your decimals and a fallback
* Check the result live in the **Test** section
* Add the formula to any text field with the `{{=Formula Name}}` syntax, or pick it from the variable menu
[Learn more](/features/quizzes/formulas)
### MCP Now Uses OAuth
Connecting an AI assistant no longer requires an API key. Add `https://api.landerlab.dev/mcp` as a connector, sign in to LanderLab in your browser, and you are done. No headers, no keys stored in config files.
**What changed**
* New MCP server URL: `https://api.landerlab.dev/mcp`
* Authentication happens through a browser sign-in instead of the `X-API-Key` header
* Your organization is resolved from the account you sign in with
* In Claude, LanderLab is now a listed connector: search for it under **Settings > Connectors > Browse connectors** instead of adding a custom connector
**If you already have MCP set up**
Existing setups using `https://api.landerlab.dev/api/v2/mcp` with an `X-API-Key` header should be removed and re-added with the new URL. API keys continue to work for direct REST API calls.
[Learn more](/mcp/overview)
### Two-Factor Authentication and Active Sessions
Your LanderLab account now has two new security controls: two-factor authentication and a list of every device signed in to your account.
**Two-Factor Authentication**
Add a second step to your login. After entering your password, LanderLab asks for a one-time code from your authenticator app, so a stolen password is not enough to get in.
* Works with any authenticator app, such as Google Authenticator, Authy, or 1Password
* Scan the QR code once and confirm with a code to turn it on
* Save your recovery codes somewhere safe in case you lose your phone
**Sessions**
See every device currently signed in to your account, with the browser, operating system, location, and last active time for each one.
* Click **Sign out** on any device you do not recognize
* Click **Sign out everywhere** to end every session at once, including your current one
* Expand a session to see more detail about the device
**How to use it**
* Go to **Settings** and open **Security**
* Under **Two-Factor Authentication**, click **Enable** and follow the setup steps
* Under **Sessions**, review your signed in devices and sign out of anything unfamiliar
### Global Blocks
You can now build a block once and reuse it across every landing page. Edit it in one place and every page using it updates automatically, so navbars, footers, and offer sections stay consistent without repeating the same work on each page.
Unlike saved components, which create an independent copy each time you use them, a global block stays connected everywhere it is placed.
**How to use it**
* In the left sidebar, under **Assets**, click **Global Blocks**
* Click **Add Global Block**
* Describe what you want with AI, pick a preset like Navbar, Footer, Testimonials, FAQ section, or CTA banner, or click **Create From Scratch**
* Refine the block in the editor, then click **Save & Publish**
Add the block to any landing page from your global blocks list. To update it later, open it, make your change, and publish again.
[Learn more](/features/global-blocks/get-started)
### Version History
You can now go back to an earlier version of your landing page and restore it in one click. As you build and edit, LanderLab keeps a record of previous versions, so nothing you worked on is ever truly lost.
Changed your mind about an edit? Prefer how a section looked before? Removed something by mistake? Open Version History, find the version you want, and bring it back.
**How to use it**
* Open your landing page in the editor
* Click the **Version History icon** in the left sidebar, near the bottom
* Select any previous version and click **Restore**
[Learn more](/features/editor/version-history)
### Workflows (BETA)
LanderLab now lets you automate what happens after a visitor becomes a lead. Build a visual flow that triggers on every new lead, branches with conditions, and sends data wherever you need it, from Google Sheets to any CRM or API. Go to **Workflows**, click **Add Workflow**, and connect your trigger, conditions, and actions on the canvas. Track every lead's path, including failed steps, in the Runs view. [Learn more](/features/workflow/getting-started)
### System Activity Logs
LanderLab now has a full audit log under Settings. Every change made across your organization is recorded, including who made it, when, and from which device and IP address.
Go to **Settings** and click **Logs** to view the audit trail. [Learn more](/features/multi-user/system-logs)
### In-App Notifications
LanderLab now has a notification center. You will get updates directly inside the app whenever something happens across your account.
Click the **Bell icon** in the top navigation bar to open your notifications.
### Live Mode
Live Mode lets you preview all JavaScript on your landing page exactly as visitors will see it. The editor normally blocks JS to keep editing clean, but features like popups, mouse effects, and scroll animations need it to run. Live Mode is how you check all of that without leaving the editor.
When active, the editor panel is disabled. You can still use AI mode to keep iterating.
**How to enter Live Mode**
Click the **Play icon** in the bottom toolbar.
The editor also switches to Live Mode automatically every time the AI mode applies a refinement, so you can immediately see the full result including any JS effects.
**How to return to Edit Mode**
* Click the **Pencil icon** in the bottom toolbar
* Hover over the **Live Mode** button in the top-right corner and click **Go to Edit Mode**
[Learn more](/features/editor/toolbar/live-mode)
### Domain-Level Custom Code
You can now inject global scripts, tracking pixels, and custom styles across every landing page on a domain from a single place, without editing each page individually.
A new **Custom Code** tab is available inside domain settings with two injection points:
* **Inside head before ``** - for tracking pixels, tag managers, and analytics scripts that need to load early
* **Inside body before `