Gentic Landing Pages — Documentation
Let any AI agent generate landing-page HTML with Claude Opus 4.7, promote drafts to live URLs on per-brand subdomains under gentic.run (or your own custom domain), iterate with cheap targeted patches, roll back to any prior version, and capture leads — all through one MCP server. No code editors, no hosting config, no CMS. Describe what you want and ship it.
1. Getting Started
Sign Up & Get Your API Key
Before you can use Gentic Landing Pages, you need an API key to authenticate your requests.
- Go to gentic.co/landing-pages and create an account.
- Create an organization from your dashboard. API keys and billing are scoped to the organization.
- Generate an API key and use it as a Bearer token in your MCP client.
2. Connecting to the MCP Server
The server is available at https://mcp.gentic.co/landing-pages. For Claude Code:
claude mcp add gentic-landing-pages \
--transport http \
https://mcp.gentic.co/landing-pages \
--header "Authorization: Bearer YOUR_API_KEY"For Claude Web and ChatGPT you can also connect via OAuth — no API key needed. See the connect section on the landing page for other MCP clients (n8n, OpenClaw).
3. Agent Skill
For the best results, pair the MCP server with the Gentic Landing Pages agent skill. The MCP server gives your agent tool access; the skill teaches it the optimal workflow order. Both the raw SKILL.md and a ready-to-upload .skill bundle are generated on demand from the live manifest, so they always reflect the current tools and pricing.
Add the skill directly via URL:
https://gentic.co/landing-pages/SKILL.mdOr upload a .skill bundle to Claude Managed Agents:
https://gentic.co/landing-pages/gentic-landing-pages.skillDownload this file and upload it wherever Claude Managed Agents asks for a .skill file. It's a zip bundle generated on demand from the latest SKILL.md.
4. When to Apply
- User wants to create a landing page, splash page, or coming-soon page.
- User wants the agent to generate the landing-page HTML from a brief (rather than pasting hand-written markup).
- User wants to deploy a page to a live URL without setting up hosting.
- User wants to clone or remix an existing web page as a landing page.
- User wants to collect email leads from a landing page.
- User wants to query or export leads collected from their pages.
- User wants to make small targeted edits to a live page (copy fixes, image swaps, color tweaks).
- User describes a change in prose — e.g. 'add a testimonial section after the hero', 'remove the pricing block' — rather than spelling out the exact strings to replace.
- User wants to fully rewrite or restructure a live landing page.
- User wants to see the version history of a deployed page, inspect a prior HTML revision, or roll back to a previous version.
- User wants brand colors, fonts, and voice applied consistently across all landing pages for an idea.
- User wants to extract a canonical brand guidelines document (colors, typography, voice, imagery, aesthetic) from a brand's public website, or look up a previously extracted record to inform page design.
- User wants to serve landing pages from their own custom domain (e.g. launch.acme.com) instead of a gentic.run subdomain.
- User wants to claim a brand subdomain under gentic.run (e.g. `pistash.gentic.run`) so different brands the user runs each get their own host.
- User wants to see which subdomains the org has already claimed, or release a brand subdomain that's no longer in use.
5. Workflow
1. Pull brand guidelines from an existing site (optional)
If the user already has a brand online (their own, or a reference), call `get_brand_guidelines` (free) with a `domain` or `url` to read an existing record. If nothing is stored, run `extract_brand_guidelines` (**$3/call, async — pass `webhook_url`**) to crawl key pages of the brand's public site, combine HTML/CSS parsing with vision-model analysis, and write a canonical document (colors, typography, voice, imagery, aesthetic direction, heritage, generative guardrails with source + confidence + evidence per field). Feed the returned colors/fonts/voice into `save_brand_style_guide` for an idea, or directly into the landing page HTML prompt.
2. Set up a brand style guide with `save_brand_style_guide` (free, optional)
Pass an `idea_slug` plus any subset of brand fields — `primary_color`, `secondary_color`, `accent_color`, `heading_font`, `body_font`, `voice`, `personality_traits`, `visual_mood`, `logo_direction`. Omitted fields keep their current value (if a guide already exists). Once saved, any landing page deployed (or replaced) with that `idea_slug` automatically gets the brand CSS injected. This is the same tool exposed by the Startup MCP — set the guide there while exploring the idea, then reuse it for every page.
3. Fetch a reference page with `fetch_rendered_page` (10¢/call)
Renders the target URL with full JavaScript execution and returns the complete DOM HTML. Use this when the user wants to clone or draw inspiration from an existing page. The rendered HTML can be passed directly to `deploy_landing_page` after modification. Unlike plain fetch, this captures SPAs, dynamic content, and JS-rendered layouts.
4. Manage brand subdomains: `claim_subdomain`, `list_subdomains`, `release_subdomain` (free)
Each org gets its original slug auto-claimed as its default subdomain (`{org-slug}.gentic.run`). Call `claim_subdomain` with a `subdomain` label (3-63 chars, lowercase alphanumeric + hyphens; reserved labels like `www`, `api`, `app`, `admin`, `mail`, `assets`, `static`, `cdn`, `mcp`, `auth`, `docs`, `blog`, `dashboard`, `console` are rejected) to reserve additional brand hosts under gentic.run — useful when one org runs multiple brands and wants each on its own subdomain. Subdomains are globally unique across orgs; collisions return a structured `taken` error so the agent can suggest a variant. Use `list_subdomains` to see everything the org owns (the entry with `is_default: true` is the auto-claimed org slug and cannot be released; each entry includes `created_at`). `release_subdomain` frees a label, but refuses if any active landing page is still pinned to it — delete or migrate those pages first.
5. Generate HTML with `generate_landing_page` ($7.50/call, async)
Pass a freeform `brief` describing the page — purpose, audience, sections, voice, calls-to-action — and Claude Opus 4.7 produces a complete, self-contained HTML document on a Modal worker. Returns immediately with a `job_id` and a `draft_id`. Polls aren't required; the user is emailed when the job completes (typically 1–5 minutes), and the draft can be inspected via `list_asset_jobs(type='landing_page')`. Optionally pass `idea_slug` (drives colors/fonts/tone from the saved brand style guide), `reference_url` (preferred — uses canonical brand guidelines and reproduces the original's structure when cloning), `base_html` (iterate on existing markup instead of regenerating), and `style_hints` (free-form overrides). $7.50 is charged **only when generation succeeds**. Promote the draft with `deploy_landing_page(draft_id=...)` (25¢) or `replace_landing_page(draft_id=...)` (25¢).
6. Deploy with `deploy_landing_page` (25¢ from a draft, $7.50 from raw HTML)
Provide a `slug` (lowercase, alphanumeric + hyphens, 3–64 chars) and a `title`. Then either pass `draft_id` from `generate_landing_page` (**preferred — 25¢**, the server fetches the draft HTML from S3 and promotes it live) or pass complete self-contained `html` directly (legacy raw-html path — $7.50). `draft_id` and `html` are mutually exclusive. Optionally pass `subdomain` to host the page under a specific brand host (must be claimed by your org). Subdomain precedence when omitted: (1) the idea's auto-claimed subdomain when `idea_slug` is provided and the idea has one, (2) the org's default subdomain. Pass `idea_slug` to inject the idea's brand style guide CSS, or `ignore_brand_style_guide: true` to skip. Also optional: `description` for metadata and `reference_url` for provenance. On the raw-html path, the document must be complete — inline all styles and scripts. The page goes live immediately at `{subdomain}.gentic.run/{slug}` and the response includes `subdomain` + `url` reflecting the actual host. Slug collisions are scoped per subdomain. Pass `on_conflict`: `"fail"` (default) throws a structured `slug_taken` error with `suggested_slug` + `existing_page_id`; `"suffix"` auto-appends `-2`, `-3`, … and returns `original_slug` + `slug_resolution: "suffix"`.
7. Fetch current HTML with `get_landing_page_html` (free)
Pass a `page_id` to read back the live HTML plus a `content_hash`. Always call this before `patch_landing_page` so your edits are authored against the current version — and pass the returned `content_hash` as `expected_content_hash` on the patch for optimistic concurrency (prevents clobbering edits from another agent).
8. Apply small mechanical edits with `patch_landing_page` (50¢/call)
Use this when **you can spell out the exact old/new strings** — copy fixes, image src swaps, color tweaks. Pass `page_id` and an `edits` array of `{ old_string, new_string, replace_all? }`. Each `old_string` must appear exactly once in the HTML (or set `replace_all: true`) — include enough surrounding context to make it unique. Pass `new_string: ""` to delete the matched substring. Edits apply sequentially; each sees the result of prior edits. Optionally pass `expected_content_hash` from `get_landing_page_html` for concurrency safety. For prose-described changes ("add a testimonial section after the hero"), reach for `edit_landing_page` ($1) instead — it has Gemini compute the diff for you.
9. Describe edits in prose with `edit_landing_page` ($1/call)
Use this when the user describes a change in natural language — "add a 3-card testimonial section after the hero", "remove the pricing block", "swap the CTA from 'Sign up' to 'Get early access' everywhere". Pass `page_id` and a freeform `brief`. The server fetches the live HTML, asks Gemini to compute minimal-diff string-replacement edits, and applies them. Cheaper than `replace_landing_page` (full Opus rewrite, 25¢ from a draft / $7.50 raw) and more capable than `patch_landing_page` (50¢, mechanical only). Optionally pass `expected_content_hash` from `get_landing_page_html` for concurrency safety. **Tier picker:** mechanical and you know the strings → `patch_landing_page` (50¢). Prose-described targeted change → `edit_landing_page` ($1). Layout overhaul or full rewrite → `replace_landing_page`.
10. Full rewrites with `replace_landing_page` (25¢ from a draft, $7.50 from raw HTML)
For layout changes, major restructures, or metadata-only updates, pass `page_id` plus either a `draft_id` from `generate_landing_page` (**preferred — 25¢**) or complete `html` (legacy — $7.50). `title` and `description` are optional. Omit both `draft_id` and `html` to update just metadata. Supports `idea_slug` and `ignore_brand_style_guide` for brand CSS injection. Reach for this only when `patch_landing_page` (50¢) won't cut it.
11. Browse history with `list_landing_page_versions` and `get_landing_page_version` (free)
Every `deploy`, `replace`, `patch`, and `restore` writes an immutable HTML version. Call `list_landing_page_versions` with a `page_id` to get every version's `version_id`, `created_at`, content hash, byte size, and `source` (`deploy` / `replace` / `patch` / `restore`). Call `get_landing_page_version` with `page_id` + `version_id` to fetch the historical HTML for inspection or diffing — useful before deciding what to roll back to.
12. Roll back with `restore_landing_page_version` (25¢/call)
Pass `page_id` + `version_id` (from `list_landing_page_versions`) to revert the page to that historical HTML. The restore writes a **new** immutable version (`source: "restore"`) pointing at the historical content and promotes it to the live URL — the prior current version stays in history, so a restore is itself reversible.
13. Deprecated: `update_landing_page` ($7.50/call)
An alias for `replace_landing_page`, kept temporarily for backwards compatibility. It will be removed in the next release — migrate agents and skills to call `replace_landing_page` (for rewrites) or `patch_landing_page` (for small edits) directly.
14. List pages with `list_landing_pages` (free)
Returns all pages for the organization with metadata, lead counts, and the `subdomain` each page is hosted on (so you can see at a glance which brand a page lives under). Pass `subdomain` to filter to a single brand host, or `include_deleted: true` to see soft-deleted pages. Use this to check what's currently deployed before creating new pages or to find page IDs for other operations.
15. Query leads with `get_landing_page_leads` (free)
Pass a `page_id` to retrieve collected email leads in reverse chronological order. Supports `limit` (default 100, max 500) and `offset` for pagination. Use this to review lead quality inline or to check submission volume.
16. Export leads with `export_landing_page_leads` (free)
Returns a signed CSV download URL that expires in **1 hour**. Pass `page_id` to export leads from a specific page, or omit it to export leads across all pages. Mention the 1-hour expiry to the user.
17. Delete pages with `delete_landing_page` (free)
Soft-deletes a page — removes it from public hosting but **preserves all lead data**. Leads remain queryable and exportable after deletion. Use this when a campaign ends or a page needs to be taken down.
18. Connect a custom domain with `connect_custom_domain` (25¢/call)
Serve pages from the customer's own domain (e.g. `launch.acme.com`) instead of a `{subdomain}.gentic.run` host. Pass the `domain` and the tool provisions a Let's Encrypt cert via Fly and returns the CNAME record the customer must add at their DNS provider. Once the CNAME propagates (usually a few minutes), call `verify_custom_domain` to finalize. Use `list_custom_domains` (free) at any point to see connected domains and their verification status, and `disconnect_custom_domain` (free) to remove a domain — it tears down the Fly cert and stops serving pages on it.
19. Lead capture REST endpoint (not an MCP tool)
Deployed pages can submit leads to `POST /api/leads/:orgSlug/:pageId` with a JSON body containing `email` (required) and optional `name`, `source`, and `metadata` fields. This endpoint is built into the hosting infrastructure — it's not called via MCP but should be referenced when building page HTML with forms.
6. Tool Reference
26 tools, rendered live from the Gentic MCP manifest. Parameter tables come directly from each tool's JSON Schema.
claim_subdomain
Claim an additional subdomain under gentic.run for this organization. Landing pages deployed to the claimed subdomain will serve at {subdomain}.gentic.run. Subdomains are globally unique across all organizations — the call fails with a structured "taken" error if another org already owns it. An org's original slug is auto-claimed as its default subdomain; use this tool when the org runs multiple brands and wants each to have its own subdomain (e.g. a holdco with brands "rhodeandfrond" and "pistash").
| Parameter | Type | Description |
|---|---|---|
subdomainrequired | string | Subdomain label to claim, e.g. 'pistash' for pistash.gentic.run. Lowercase alphanumeric + hyphens, 3-63 chars, cannot start or end with a hyphen. Reserved words (www, api, app, admin, mail, assets, static, cdn, mcp, auth, docs, blog, dashboard, console) are rejected. |
connect_custom_domain
Connect a customer-owned domain (e.g. acme.com) to serve this org's landing pages. Provisions a Let's Encrypt cert via Fly and returns the CNAME record the customer must add. After the CNAME propagates (usually a few minutes), call verify_custom_domain to finalize.
| Parameter | Type | Description |
|---|---|---|
domainrequired | string | Fully-qualified domain the customer wants to use, e.g. 'acme.com' or 'www.acme.com' |
subdomain | string | gentic.run subdomain whose pages this custom domain should serve, e.g. 'theivoryshell' to serve pages from theivoryshell.gentic.run. Must be claimed by this org (see claim_subdomain). Defaults to the org's default subdomain when omitted — required when pages live on a non-default subdomain. |
delete_landing_page
Remove a landing page from public hosting. Lead data is preserved and still queryable.
| Parameter | Type | Description |
|---|---|---|
page_idrequired | string | Page ID to delete |
deploy_landing_page
Deploy a landing page to a live URL at {subdomain}.gentic.run/{page-slug}. Either pass a draft_id from a generate_landing_page job (preferred — 25¢, server promotes the draft to live) OR pass complete html directly (legacy — $7.50). The page is publicly accessible immediately. Subdomain precedence: (1) explicit `subdomain` input when provided, (2) the idea's auto-claimed subdomain when `idea_slug` is provided and the idea has one (see startup_create_idea), (3) the org's default subdomain. Call `claim_subdomain` first for brand hosts you haven't reserved yet. Slug collisions are scoped per subdomain — the same path slug can exist on two different subdomains without conflict. If the slug is already in use on the chosen subdomain, behavior depends on on_conflict — by default the call fails with a structured error payload that includes suggested_slug and existing_page_id so the caller can retry with the suggested slug or switch to replace_landing_page with the existing_page_id.
Pricing: $0.25 when promoting a generate_landing_page draft (draft_id), $7.50 on the legacy raw-html path.
| Parameter | Type | Description |
|---|---|---|
slugrequired | string | URL path segment (lowercase, alphanumeric + hyphens, 3-64 chars) |
titlerequired | string | Page title for display and metadata |
draft_id | string | Draft ID returned by generate_landing_page — server fetches the HTML from S3 and deploys it. Cheapest path (25¢) and the recommended way to publish a generated page. Mutually exclusive with html. |
html | string | Complete, self-contained HTML document. Legacy path ($7.50) — only use when you don't have a draft_id. Mutually exclusive with draft_id. |
description | string | Brief description of the page's purpose |
reference_url | string | Original reference URL used for generation |
brand_domain | string | Explicit brand-domain key for canonical brand-guidelines lookup (e.g. 'irestore.com'). Use whenever the user names a brand and `reference_url` is a template / asset URL — without this, the lookup uses `reference_url` as the key and can never match a stored record. |
subdomain | string | Subdomain label to host this page under, e.g. 'pistash' for pistash.gentic.run. Must be a subdomain claimed by this org (see `claim_subdomain` / `list_subdomains`). Defaults to the org's default subdomain when omitted. |
idea_slug | string | Idea slug to pull brand style guide from. If provided, injects the idea's brand CSS into the page. |
ignore_brand_style_guiderequired | boolean | Skip injecting the brand style guide CSS into this page (default: false) default: false |
on_conflictrequired | string | Behavior when the slug is already taken on the chosen subdomain. 'fail' (default) returns a structured slug_taken error with suggested_slug + existing_page_id so the caller can retry in one call. 'suffix' auto-appends -2, -3, ... until it finds a free slug and deploys under that. Use 'suffix' only when the user didn't name the slug; keep 'fail' when the slug is meaningful. enum: fail, suffix · default: "fail" |
disconnect_custom_domain
Disconnect a custom domain. Removes the Fly-issued cert, deletes the DB mapping, and stops serving landing pages on this domain.
| Parameter | Type | Description |
|---|---|---|
domainrequired | string | The custom domain to disconnect |
edit_landing_page
Edit a landing page from a freeform brief, e.g. 'add a testimonial section after the hero' or 'remove the pricing block'. Targets either a deployed page (page_id) or an undeployed generation draft (draft_id) — pass exactly one. The server fetches the HTML, asks Gemini to compute minimal-diff string-replacement edits, and applies them. $1.00 — cheaper than replace_landing_page ($7.50, full rewrite via Opus) and more capable than patch_landing_page (FREE, mechanical substitution where the caller already knows the strings). For trivial swaps where you can spell out the exact old/new strings yourself, prefer patch_landing_page. When editing a draft (draft_id), the result is saved as a NEW draft with a fresh draft_id returned in the response — chain these calls to iterate before deploying.
| Parameter | Type | Description |
|---|---|---|
page_id | string | Page ID of a deployed landing page. Mutually exclusive with draft_id. |
draft_id | string | Draft ID from generate_landing_page or a prior draft-targeted patch/edit. Must be a UUID. Mutually exclusive with page_id. The edited HTML is written to a NEW draft; the response includes the new draft_id. |
briefrequired | string | Freeform description of the change. Be specific about location and intent — e.g. 'add a 3-card testimonial section after the hero, with names and photo URLs as placeholders'. |
expected_content_hash | string | Optional sha256 of the HTML the brief was authored against (from get_landing_page_html). If provided and the stored content has changed, the edit fails without writing. |
export_landing_page_leads
Export collected leads as a downloadable CSV file. Returns a signed URL that expires in 1 hour.
| Parameter | Type | Description |
|---|---|---|
page_id | string | Specific page ID (if omitted, exports leads from all pages) |
extract_brand_guidelines
Extract comprehensive, production-grade brand guidelines from a brand's public website. Crawls key pages, captures screenshots, and combines HTML/CSS parsing with vision-model analysis to produce a canonical brand document with colors, typography, voice, imagery, aesthetic direction, heritage, and generative guardrails. Every field includes source, confidence, and evidence. Pass webhook_url for async execution.
| Parameter | Type | Description |
|---|---|---|
urlrequired | string | The brand's public website URL. Homepage is always crawled; sub-pages auto-selected from links. |
brand_name | string | Optional override. If omitted, extracted from meta tags / <title>. |
force_refreshrequired | boolean | If true, bypass the 30-day cache and run a fresh extraction. Default false. default: false |
webhook_url | string | If provided, the tool returns immediately with a job_id and POSTs results here on completion. |
depthrequired | integer | Max number of pages to crawl. Default 4 (homepage + about + product + collection). Capped at 6. 1 – 6 · default: 4 |
fetch_rendered_page
Fetch a web page with full JavaScript rendering and return the rendered HTML source code. Use this to capture the structure and content of a reference landing page for cloning — unlike fetch_page which returns only text, this returns the full rendered DOM.
| Parameter | Type | Description |
|---|---|---|
urlrequired | string | URL to fetch and render |
generate_landing_page
Generate a landing page HTML document via Claude Opus 4.7. Async — returns a job_id and draft_id immediately and runs ~1–5 minutes on a Modal worker. The result lands as an immutable draft in S3; promote to a live URL with deploy_landing_page(draft_id=...) once the job reports complete via list_asset_jobs (filter type='landing_page'). $7.50 for generation, charged only when generation succeeds. When reference_url is set, the server auto-fetches the rendered HTML via ScrapingBee so the model has source to clone — that adds a separate $0.10 surcharge (same price as fetch_rendered_page). Pass base_html instead if you've already fetched the source page yourself.
| Parameter | Type | Description |
|---|---|---|
briefrequired | string | Freeform description of the page you want — purpose, audience, sections, voice, calls-to-action. The more specific, the better. |
idea_slug | string | Idea slug whose saved brand style guide should drive colors, fonts, and tone. Falls back to canonical brand guidelines (when reference_url is set) if the idea has none. |
reference_url | string | Clone target — when set, the server fetches this page and the model reproduces every section in full with brand-substituted copy. Used as a fallback brand-domain key only when `brand_domain` is not supplied AND this URL points at a real brand site (not an asset host like *.s3.amazonaws.com or *.gentic.run). Pass `brand_domain` separately when the clone target is a template / asset URL. |
brand_domain | string | Explicit brand-domain key for canonical brand-guidelines lookup (e.g. 'irestore.com' or 'https://irestore.com'). Use whenever the user names a brand — even if `reference_url` is set, since `reference_url` is often a template/asset URL that won't match any stored brand record. Takes precedence over deriving the key from `reference_url`. Normalised the same way as records inserted by `extract_brand_guidelines`. |
base_html | string | Existing HTML to revise. Pass when you want to iterate on a current page rather than generate from scratch. |
style_hints | object | Free-form overrides on top of the brand guide (tone, density, color overrides, etc.). |
webhook_url | string | Optional callback URL fired when the draft completes (or fails). Receives a JSON payload with job_id, status, draft_id, draft_url (S3), byte_length, stop_reason, prompt, error. Used by gentic-computer to post the completion notice back to the originating Slack / Telegram thread. |
get_brand_guidelines
Look up canonical brand guidelines for your organization. Pass `domain` or `url` to fetch a specific record. With no arguments, returns the single brand on file if the org has exactly one; returns a `candidates` list to disambiguate if there are several; returns a friendly not-found message if there are none. All responses use a `{ found: true/false, ... }` envelope. Free.
| Parameter | Type | Description |
|---|---|---|
domain | string | Brand domain, e.g. 'beekman1802.com'. Optional — if omitted, the server resolves to the org's single extracted brand (or returns a candidate list to disambiguate). |
url | string | Any URL on the brand's site; domain is normalized from this. Optional — see `domain` for the no-args resolution behavior. |
get_landing_page_html
Fetch the current HTML of either a deployed landing page (by page_id) or an undeployed generation draft (by draft_id). Pass exactly one. Pair with patch_landing_page to make small targeted edits — the returned content_hash can be passed back as expected_content_hash for optimistic concurrency. Use the draft_id form to QA a generated page before paying to deploy it.
| Parameter | Type | Description |
|---|---|---|
page_id | string | Page ID of a deployed landing page. Mutually exclusive with draft_id. |
draft_id | string | Draft ID returned by generate_landing_page (or by a prior draft-targeted patch_landing_page / edit_landing_page call). Must be a UUID. Mutually exclusive with page_id. |
get_landing_page_leads
Query collected leads (email submissions) for a specific landing page. Returns results in reverse chronological order with pagination.
| Parameter | Type | Description |
|---|---|---|
page_idrequired | string | Page ID to query leads for |
limit | number | Max results (default: 100, max: 500) max 500 · default: 100 |
offset | number | Pagination offset (default: 0) default: 0 |
get_landing_page_version
Fetch the HTML for a specific historical version of a landing page. Use list_landing_page_versions to discover version_ids. Pair with restore_landing_page_version to roll back.
| Parameter | Type | Description |
|---|---|---|
page_idrequired | string | Page ID |
version_idrequired | string | Version ID returned by list_landing_page_versions (the {ISO8601}-{short_hash} stem) |
list_asset_jobs
List recent asset generation jobs (images, videos, and landing pages). Returns job IDs, statuses, prompts, output URLs, and (for landing-page jobs) draft_id + content_hash you can pass to deploy_landing_page. Pass job_id to fetch a single job (useful for polling a specific generation). Use this to check on generation progress.
| Parameter | Type | Description |
|---|---|---|
job_id | string | Fetch a specific job by id. Use this when polling a generate_landing_page / generate_ad_asset / generate_video job you just kicked off — returns the same row shape as listing, just filtered to one. Other filters (limit/status/type) are ignored when set. |
limitrequired | integer | Number of recent jobs to return (1-100, default 20) 1 – 100 · default: 20 |
status | string | Filter by job status. Omit to return all statuses. enum: processing, completed, failed |
type | string | Filter by asset type. Omit to return all types. enum: image, video, video_edit, voice_replace, landing_page |
list_custom_domains
List all custom domains connected to this organization along with their verification status and the gentic.run subdomain each one serves from.
This tool takes no parameters.
list_landing_page_versions
List the immutable HTML version history for a deployed landing page. Each entry includes a version_id, created_at timestamp, content hash, byte size, and source ('deploy', 'replace', 'patch', or 'restore'). Pair with get_landing_page_version to inspect historical content or restore_landing_page_version to revert.
| Parameter | Type | Description |
|---|---|---|
page_idrequired | string | Page ID to list versions for |
list_landing_pages
List landing pages for the organization with metadata, lead counts, and the subdomain each page is hosted on. Optional `subdomain` filter restricts results to a single brand host.
| Parameter | Type | Description |
|---|---|---|
include_deleted | boolean | Include deleted pages (default: false) default: false |
subdomain | string | Filter to pages under a specific claimed subdomain. Omit to list pages across all the org's subdomains. |
list_subdomains
List all subdomains claimed by this organization under gentic.run. The "is_default" entry is the org's original slug (auto-claimed) and is used as the default for landing-page deploys when no explicit subdomain is given.
This tool takes no parameters.
patch_landing_page
Apply small, targeted string-replacement edits to a landing page HTML without regenerating it. Targets either a deployed page (page_id) or an undeployed generation draft (draft_id) — pass exactly one. Call get_landing_page_html first to fetch current content. Each edit's old_string must appear exactly once in the HTML (or set replace_all: true) — include enough surrounding context to make it unique. Pass new_string: '' to delete the matched substring. Use this for copy fixes, image src swaps, color tweaks where you can spell out the exact strings yourself. For prose-described changes ('add a testimonial section after the hero'), prefer edit_landing_page. For full rewrites, use replace_landing_page. When patching a draft (draft_id), the result is saved as a NEW draft with a fresh draft_id returned in the response — chain these calls to iterate on a generation before deploying.
| Parameter | Type | Description |
|---|---|---|
page_id | string | Page ID of a deployed landing page. Mutually exclusive with draft_id. |
draft_id | string | Draft ID from generate_landing_page or a prior draft-targeted patch/edit. Must be a UUID. Mutually exclusive with page_id. The patched HTML is written to a NEW draft; the response includes the new draft_id. |
editsrequired | object[] | Sequential edits. Each sees the result of prior edits. |
expected_content_hash | string | Optional sha256 of the HTML the edits were authored against (from get_landing_page_html). If provided and the stored content has changed, the patch fails without writing. Detects stale reads — not a lock; concurrent patches between the hash check and write are still possible. |
release_subdomain
Release a subdomain claim owned by this organization. The org's default subdomain (its original slug) cannot be released. Refuses if any active landing page is still pinned to the subdomain — delete or migrate those pages first.
| Parameter | Type | Description |
|---|---|---|
subdomainrequired | string | Subdomain label to release, e.g. 'pistash'. |
replace_landing_page
Replace an existing landing page's HTML with a full new document and/or update its metadata. Either pass draft_id from a generate_landing_page job (preferred — 25¢) OR pass complete html ($7.50). Use this for layout changes, major restructures, or metadata-only updates (title, description). For small edits (copy fixes, image swaps, color tweaks), prefer patch_landing_page — it is much cheaper and faster because it does not require regenerating the whole page.
Pricing: $0.25 when promoting a draft (draft_id), $7.50 on the legacy raw-html or metadata-only path.
| Parameter | Type | Description |
|---|---|---|
page_idrequired | string | Page ID to replace |
draft_id | string | Draft ID returned by generate_landing_page — server fetches the HTML from S3 and replaces the page with it. Cheapest path (25¢). Mutually exclusive with html. |
html | string | New full HTML content. Legacy path ($7.50). Mutually exclusive with draft_id. If both html and draft_id are omitted, existing content is unchanged (metadata-only update). |
title | string | New title |
description | string | New description |
idea_slug | string | Idea slug to pull brand style guide from. If provided, injects the idea's brand CSS into the page. |
ignore_brand_style_guiderequired | boolean | Skip injecting the brand style guide CSS into this page (default: false) default: false |
restore_landing_page_version
Roll a landing page back to a previous version's HTML. Discover version_ids via list_landing_page_versions. The restore writes a new immutable version (source='restore') pointing at the historical content, then promotes it to the live URL — the prior version remains in history.
| Parameter | Type | Description |
|---|---|---|
page_idrequired | string | Page ID to restore |
version_idrequired | string | Version ID to restore (from list_landing_page_versions) |
save_brand_style_guide
Save or update a brand style guide for a specific idea. Sets brand colors, fonts, and tone that are automatically applied to future landing pages. You can set individual fields — any field you omit keeps its current value (if a guide already exists).
| Parameter | Type | Description |
|---|---|---|
idea_slugrequired | string | The idea this style guide belongs to |
primary_color | string | Primary brand color (hex, e.g. '#2D5A3D') |
secondary_color | string | Secondary brand color (hex) |
accent_color | string | Accent brand color (hex) |
primary_color_name | string | Name for the primary color (e.g. 'Forest Green') |
secondary_color_name | string | Name for the secondary color |
accent_color_name | string | Name for the accent color |
heading_font | string | Font family for headings (e.g. 'DM Serif Display') |
body_font | string | Font family for body text (e.g. 'Inter') |
voice | string | Brand voice description (e.g. 'Warm, approachable, and confident') |
personality_traits | string[] | Personality trait keywords (e.g. ['friendly', 'minimal', 'bold']) |
visual_mood | string[] | Visual mood keywords (e.g. ['warm', 'organic', 'handcrafted']) |
logo_direction | string | Logo direction notes |
update_landing_page
[DEPRECATED — use replace_landing_page] Alias for replace_landing_page. For small edits use patch_landing_page; for full rewrites use replace_landing_page. This alias will be removed in the next release.
Pricing: Mirrors replace_landing_page pricing.
| Parameter | Type | Description |
|---|---|---|
page_idrequired | string | Page ID to replace |
draft_id | string | Draft ID returned by generate_landing_page — server fetches the HTML from S3 and replaces the page with it. Cheapest path (25¢). Mutually exclusive with html. |
html | string | New full HTML content. Legacy path ($7.50). Mutually exclusive with draft_id. If both html and draft_id are omitted, existing content is unchanged (metadata-only update). |
title | string | New title |
description | string | New description |
idea_slug | string | Idea slug to pull brand style guide from. If provided, injects the idea's brand CSS into the page. |
ignore_brand_style_guiderequired | boolean | Skip injecting the brand style guide CSS into this page (default: false) default: false |
verify_custom_domain
Check whether a pending custom domain's Fly-issued Let's Encrypt cert has been provisioned. Flips the mapping to 'verified' and starts serving landing pages on the custom domain once ready.
| Parameter | Type | Description |
|---|---|---|
domainrequired | string | The domain previously registered via connect_custom_domain |
7. Pricing
Pricing is pulled live from the Gentic MCP manifest. All prices are per call and deducted from your Gentic credits.
| Tool | Cost |
|---|---|
| claim_subdomain | Free |
| connect_custom_domain | 25¢ / call |
| delete_landing_page | Free |
| deploy_landing_page | 25¢–$7.50 |
| disconnect_custom_domain | Free |
| edit_landing_page | 100¢ / call |
| export_landing_page_leads | Free |
| extract_brand_guidelines | 300¢ / call |
| fetch_rendered_page | 10¢ / call |
| generate_landing_page | 750¢ / call |
| get_brand_guidelines | Free |
| get_landing_page_html | Free |
| get_landing_page_leads | Free |
| get_landing_page_version | Free |
| list_asset_jobs | Free |
| list_custom_domains | Free |
| list_landing_page_versions | Free |
| list_landing_pages | Free |
| list_subdomains | Free |
| patch_landing_page | Free |
| release_subdomain | Free |
| replace_landing_page | 25¢–$7.50 |
| restore_landing_page_version | 25¢ / call |
| save_brand_style_guide | Free |
| update_landing_page | 25¢–$7.50 |
| verify_custom_domain | Free |
8. Notes
- Pages are deployed to `{subdomain}.gentic.run/{page-slug}`. Every org's original slug is auto-claimed as its default subdomain; additional brand subdomains can be reserved with `claim_subdomain`. Deploy precedence when no `subdomain` is passed: explicit input → idea's auto-claimed subdomain (when `idea_slug` is provided) → org default. The `url` and `subdomain` fields on every deploy/list/replace/get response reflect the actual host — never reconstruct URLs from `org_slug + slug`.
- Slug uniqueness is **scoped per subdomain** — the same path slug (e.g. `/launch`) can exist on two different brand subdomains without collision.
- **Generate-then-promote is the cheapest path.** `generate_landing_page` ($7.50, async, charged only on success) writes an immutable draft via Claude Opus 4.7 and returns a `draft_id`. Promote with `deploy_landing_page(draft_id=...)` or `replace_landing_page(draft_id=...)` for **25¢**. Pass `html` directly only when you already have hand-written markup (legacy $7.50 path).
- On the raw-html path, HTML must be **complete and self-contained** — inline all CSS and JS. External resources may break or load slowly. Generated drafts are already self-contained.
- **Three tiers for editing a live page, by intent and cost.** `patch_landing_page` (50¢) — mechanical string replacement when you already know the exact old/new strings (typos, image swaps, color tweaks). `edit_landing_page` ($1) — describe the change in prose and Gemini computes the minimal diff ("add a testimonial section after the hero", "remove the pricing block"). `replace_landing_page` (25¢ from a draft, $7.50 raw) — layout changes and full rewrites only.
- Always call `get_landing_page_html` before `patch_landing_page` and pass the returned `content_hash` as `expected_content_hash` to avoid clobbering concurrent edits.
- **Every change is versioned.** `deploy`, `replace`, `patch`, and `restore` each write an immutable version row (with content hash, byte size, and `source`). Inspect history with `list_landing_page_versions` (free) and `get_landing_page_version` (free); roll back with `restore_landing_page_version` (25¢) — restores themselves are reversible because they create a new version rather than overwriting history.
- Pass `idea_slug` to `deploy_landing_page` or `replace_landing_page` to auto-inject brand CSS from a style guide saved via `save_brand_style_guide`. Set `ignore_brand_style_guide: true` to opt out.
- `update_landing_page` is **deprecated** — it's an alias for `replace_landing_page` and will be removed in the next release. Migrate now.
- Lead capture is built in. The REST endpoint `POST /api/leads/:orgSlug/:pageId` accepts `email` (required), `name`, `source`, and `metadata`.
- Soft-deleted pages preserve all lead data — leads remain queryable and exportable.
- Export CSV download links expire in **1 hour**.
- Slugs must be lowercase, alphanumeric with hyphens, 3–64 characters, and cannot start or end with a hyphen. Subdomain labels follow the same rules with a 63-char max and a reserved-words denylist (`www`, `api`, `app`, `admin`, `mail`, `assets`, `static`, `cdn`, `mcp`, `auth`, `docs`, `blog`, `dashboard`, `console`).
- Brand subdomains: use `claim_subdomain` to reserve a brand host (free), `list_subdomains` to see what's owned (the `is_default` entry is the auto-claimed org slug and cannot be released), and `release_subdomain` to free a label. `release_subdomain` refuses if any active landing page is still pinned to that subdomain — delete or migrate those pages first.
- Slug collisions on `deploy_landing_page`: if the user didn't pin a specific slug, pass `on_conflict: "suffix"` so the server auto-picks a free variant (`-2`, `-3`, …) and returns it as `slug_resolution: "suffix"` with the `original_slug`. Otherwise leave `on_conflict` as `"fail"` (default) and, on a `slug_taken` error (payload: `{ error: "slug_taken", suggested_slug, existing_page_id, message }`), either retry `deploy_landing_page` with `suggested_slug` or switch to `replace_landing_page` against `existing_page_id` — whichever matches user intent.
- Custom domains: after `connect_custom_domain`, the customer must add the returned CNAME record at their DNS provider. Call `verify_custom_domain` once DNS has propagated (usually a few minutes) to flip the mapping to verified and start serving pages on that domain.
- Brand guidelines: `extract_brand_guidelines` costs **$3/call** and is async — pass `webhook_url` to avoid blocking. The record is keyed by domain and org-scoped; re-reading via `get_brand_guidelines` is always free.
- All tools are organization-scoped — users only see their own pages, leads, and custom domains.