Two ways to drive Mondovo programmatically: connect your AI assistant (included on every plan), or automate headlessly with the REST API (part of the Agency add-on).
Add Mondovo as a connector in Claude, ChatGPT, or Claude Desktop and build, find, edit, and publish websites by chatting. You sign in to Mondovo and approve access — no API keys, no configuration files. The connector exposes 18 self-describing tools, so your assistant discovers what it can do on its own.
https://app.mondovo.com/api/mcp/sitesSettings → Connectors → Add custom connector → paste the URL → sign in and approve.
Settings → Connectors (or Apps) → Add connector → paste the URL → sign in and approve.
Settings → Connectors → Add custom connector → paste the URL. Same OAuth sign-in — no key needed.
create_site — Create a new site from a structured briefget_site — Check status and get preview/live URLslist_sites — Find your existing sitesrefine_site — Edit a site in natural languagepublish_site — Publish a site to the webadd_page — Add one inner page, generated to match the themeadd_pages — Add up to 10 inner pages in one callget_intake_questions — Fetch the brief questions Mondovo asksvalidate_design — Validate an externally-authored design payloadcreate_site_from_design — Create a site from an authored designimport_design_variation — Import an authored design as a new variationgenerate_design_variation — Generate an additional design variationlist_variations — List a site’s design variationsswitch_variation — Switch the active design variationlist_boards — List design boardspin_design_to_board — Pin a design to a boardshare_board — Share a board with a clientupload_asset — Store an image or video permanentlyStep-by-step walkthrough with screenshots: mondovo.com/connectors
The v1 REST API is for headless automation — scripts, backends, and CI pipelines that create, refine, and publish sites without a human in the chat. It uses static API keys, which are part of the Agency add-on. If you just want an AI assistant to use Mondovo, use the connector above instead — it needs no key.
Create a key at Dashboard → Settings → API Keys (organization owners and admins; up to 10 active keys). The full key is shown once. Send it as a Bearer token on every request:
Authorization: Bearer mk_live_...Keys are organization-scoped with scopes sites:create sites:read sites:refine sites:publish sites:delete by default (sites:refine also covers asset uploads). The add-on is verified on every request — if it lapses, existing keys return 403 addon_required.
/api/v1/sitesscope: sites:createCreates a site from a structured brief and starts generation in the background (~60s). Returns 202 immediately — poll the site until status is ready. Pass an idempotency_key so a retried timeout returns the original site instead of creating a duplicate.
curl -X POST https://app.mondovo.com/api/v1/sites \
-H "Authorization: Bearer mk_live_..." \
-H "Content-Type: application/json" \
-d '{
"name": "Bright Path Physio",
"business": {
"industry": "physiotherapy",
"location": "Austin, TX",
"description": "Sports injury and rehab clinic."
},
"design": { "style": "clean, modern", "color_palette": { "primary": "#0f766e" } },
"goal": "book an appointment",
"idempotency_key": "3f9d2c1a-7e54-4b0e-9a1f-2b6c8d0e4f5a"
}'HTTP/1.1 202 Accepted
{
"site_id": "5f8a1c2e-1234-4b6f-9d3e-0a1b2c3d4e5f",
"status": "generating",
"estimated_seconds": 60,
"poll_url": "/api/v1/sites/5f8a1c2e-1234-4b6f-9d3e-0a1b2c3d4e5f"
}/api/v1/sitesscope: sites:readLists your organization’s sites, most recent first (up to 50).
curl https://app.mondovo.com/api/v1/sites \
-H "Authorization: Bearer mk_live_..."HTTP/1.1 200 OK
{
"sites": [
{
"site_id": "5f8a1c2e-1234-4b6f-9d3e-0a1b2c3d4e5f",
"name": "Bright Path Physio",
"status": "ready",
"preview_url": "https://app.mondovo.com/preview/abc123",
"pages": ["/", "/about", "/contact"],
"created_at": "2026-07-24T10:00:00Z"
}
],
"total": 1
}/api/v1/sites/{id}scope: sites:readReturns status, generation progress, a shareable preview_url, an editor_url, the live deployment_url once published, and page slugs. Use this to poll while status is generating or publishing.
curl https://app.mondovo.com/api/v1/sites/5f8a1c2e-... \
-H "Authorization: Bearer mk_live_..."/api/v1/sites/{id}/refinescope: sites:refineApplies an AI edit to one page (page defaults to the homepage). Counts against your monthly AI-edit allowance; if the change can’t be saved, no allowance is consumed.
curl -X POST https://app.mondovo.com/api/v1/sites/5f8a1c2e-.../refine \
-H "Authorization: Bearer mk_live_..." \
-H "Content-Type: application/json" \
-d '{ "instruction": "Make the hero headline more confident and add a FAQ section", "page": "/" }'HTTP/1.1 200 OK
{
"site_id": "5f8a1c2e-1234-4b6f-9d3e-0a1b2c3d4e5f",
"status": "refined",
"message": "Site has been refined successfully.",
"poll_url": "/api/v1/sites/5f8a1c2e-1234-4b6f-9d3e-0a1b2c3d4e5f"
}/api/v1/sites/{id}/publishscope: sites:publishDeploys the site to https://<subdomain>.mondovo.site (custom domains attach in the dashboard). If the site still carries AI-generated placeholder contact details you’ll get a 422 — fix them via refine, or resend with confirm_contact_info: true. See billing notes for the first-publish 402.
curl -X POST https://app.mondovo.com/api/v1/sites/5f8a1c2e-.../publish \
-H "Authorization: Bearer mk_live_..." \
-H "Content-Type: application/json" \
-d '{ "subdomain": "bright-path-physio" }'HTTP/1.1 200 OK
{
"site_id": "5f8a1c2e-1234-4b6f-9d3e-0a1b2c3d4e5f",
"status": "published",
"deployment_url": "https://bright-path-physio.mondovo.site",
"message": "Site published successfully."
}/api/v1/sites/{id}/assetsscope: assets:write or sites:refinePass any HTTPS URL — including an expiring signed URL — and Mondovo downloads the file, stores it permanently on our CDN, adds it to the site’s asset library, and returns a stable URL. Images (JPG/PNG/WebP/GIF, max 20 MB) and video (MP4/WebM/MOV, max 80 MB; optimized for the web after upload).
curl -X POST https://app.mondovo.com/api/v1/sites/5f8a1c2e-.../assets \
-H "Authorization: Bearer mk_live_..." \
-H "Content-Type: application/json" \
-d '{ "url": "https://example.com/clinic-hero.jpg", "alt_text": "Clinic reception" }'HTTP/1.1 200 OK
{
"site_id": "5f8a1c2e-1234-4b6f-9d3e-0a1b2c3d4e5f",
"asset_id": "9c2d4e6f-...",
"url": "https://site-assets.mondovo.com/sites/5f8a1c2e-.../uploads/aB3xY9....jpg",
"type": "image",
"mime_type": "image/jpeg",
"bytes": 482113,
"message": "Stored the image permanently. Use the returned url — it will not expire."
}/api/v1/sites/{id}scope: sites:deleteSoft-deletes a draft site. Published sites can’t be deleted via the API — unpublish first from the dashboard.
curl -X DELETE https://app.mondovo.com/api/v1/sites/5f8a1c2e-... \
-H "Authorization: Bearer mk_live_..."HTTP/1.1 200 OK
{ "deleted": true, "site_id": "5f8a1c2e-1234-4b6f-9d3e-0a1b2c3d4e5f" }Agency add-on workspaces can also point MCP clients at the connector with a static key instead of OAuth — useful for shared automation accounts:
{
"mcpServers": {
"mondovo": {
"type": "streamable-http",
"url": "https://app.mondovo.com/api/mcp/sites",
"headers": { "Authorization": "Bearer mk_live_..." }
}
}
}Every API response includes the current window’s state; a 429 adds Retry-After:
X-RateLimit-Limit: 10
X-RateLimit-Remaining: 7
X-RateLimit-Reset: 1784102460Every non-2xx response uses one envelope — a stable error code, a human-readable message, and usually a suggestion phrased so an AI agent can relay the next step:
{
"error": "addon_required",
"message": "API keys are part of the Agency add-on on this workspace",
"suggestion": "To use Mondovo from an AI assistant, connect via the Mondovo connector instead — it is included on every plan and needs no API key. ..."
}| Status | Code | Meaning |
|---|---|---|
| 401 | invalid_api_key | Missing or unrecognized key. Send Authorization: Bearer mk_live_... |
| 401 | key_revoked / key_expired | The key was revoked or has passed its expiry — create a new one. |
| 403 | addon_required | The workspace no longer has the Agency add-on. Checked on every request, not just at key creation. |
| 403 | missing_scope | The key lacks the scope this endpoint needs. |
| 402 | plan_limit_reached | A plan allowance is used up (draft sites, monthly AI refinements, or published sites). Includes limit_type and upgrade_url. |
| 402 | billing_confirmation_required | Publishing this site starts a monthly per-site charge that must be confirmed once in the Mondovo editor. The API cannot approve new recurring billing. |
| 404 | site_not_found | No site with that ID in your organization. |
| 409 | site_busy / generation_conflict | Generation is in progress — poll GET /sites/{id} and retry once idle. |
| 409 | subdomain_taken | Choose a different subdomain. |
| 409 | duplicate_request | A create with this idempotency_key is still running. |
| 422 | contact_info_needs_confirmation | The site still carries AI-generated placeholder contact details. Fix them via refine, or resend publish with confirm_contact_info: true. |
| 413 | file_too_large | Asset over the 20 MB (image) / 80 MB (video) cap. |
| 429 | rate_limit_exceeded | Too many requests. Body includes retry_after_seconds; a Retry-After header is also set. |
| 500 | internal_error | Unexpected failure — safe to retry. |
API publishes follow the same per-site pricing as the app: taking a site live adds $20/month to the subscription.
The API cannot consent to new recurring charges. The first publish of a billable site returns a structured 402 billing_confirmation_required (with price_per_site_monthly) — the account owner confirms the charge once by publishing from the Mondovo editor. After that, API publishes of the site go straight through.
Site creation and AI edits draw on your plan’s normal allowances — the API never bypasses them.
The full machine-readable spec (OpenAPI 3.1) — import it into your HTTP client, code generator, or a custom GPT action:
https://app.mondovo.com/api/v1/openapi.json