Overview
Mondovo is a website design and creation tool for business owners, creators and agencies. Turn a description of your business into three distinct website designs, compare visual previews and choose the direction you prefer. Build a landing page or a business website without writing code. Refine your chosen design in plain language: change colors, typography, images, copy and page layout, or add new pages. Interactive cards show your designs, previews and progress in the conversation. When you are ready, ask Mondovo to publish the chosen website and share its live link. Your projects and revision history are saved in your Mondovo account. To support work on your website, you can also browse saved Creative Studio images and videos, review social post drafts, check video project progress and view contacts collected by your website. A Mondovo account is required. Access is limited to the workspace and permissions you approve when connecting.
Tools
add_collection_items
ChatGPTadd_page
ChatGPTcode: • MONDOVO WRITES IT (no code): Mondovo's AI generates the page to match the site's theme, header and footer. Give a description of what the page is for. Optional nav_placement ("main" header menu — the default, "footer", or "none") and nav_label: only this page's link is added; existing menu items are never changed. Returns a job_id immediately; poll get_job every ~10s until "completed" (~45-90s). Runs server-side even if this conversation ends. Counts as an AI refinement. • YOU WROTE IT (pass code): the page you authored is added as-is — no AI, no credits, no job. Send the COMPLETE TSX (same authoring contract as update_variation_file). Nothing wraps your page in the site's chrome, so build it the way this design's existing pages are built — read_design and copy an existing page's imports (usually <ThemeStyles />, <Header /> and <Footer /> from './ThemeStyles', './Header', './Footer'). Put the page's own text in content under NEW top-level keys, conventionally one key page_<slug> (e.g. { "page_marketing": {...} } for /marketing); the code reads them as content.page_marketing. Your code may also read keys the site already has, but content may not redefine them. Optional seo (title, description), nav_placement ("main" header menu — the default, "footer", or "none") and nav_label. variation_id picks the design (from list_variations); omit it for the site's chosen design. The page is validated with the same checks update_variation_file runs (content first, then code); a refusal writes NOTHING and returns the issues. A slug, file name or content key the design already has is refused — to change an EXISTING page use update_variation_file / patch_variation_content instead. On success it returns the page's slug, file and content key plus how_to_edit, and lands as one entry in version history (version; history_warning means it saved but was not recorded). Nothing is live until publish_site. To try an alternative version of an EXISTING page without touching the live one, use create_page_draft, not this tool.add_pages
ChatGPTjob_id immediately; poll get_job every ~10s until its status is "completed". Pages are generated with bounded parallelism, so a batch of 10 takes minutes, not 10x one page. Per-page failures are reported individually in the job's failed array — one bad page does not abort the rest, so a "completed" job can still carry failures worth reporting to the user. These pages are NOT added to the site's menu — to link them, patch_variation_content navigation with the full edited array (or use add_page per page with nav_placement).answer_studio_video_look_sheet
ChatGPTlook_sheet with approved: false, show the user the picture at look_sheet.url (the people, place and style every scene is filmed to) and send their answer: approved: true when it is right, or notes saying what to change (it is drawn again with everything said so far). Free — the film is priced and bought later, as always.apply_theme
ChatGPTapprove_studio_video_plan
ChatGPTpending_plan.proposal_id and its quoted_credits as expected_credit_cost; a mismatch is refused. Plans quoted at 0 (captions, end cards, trims, library music) are free; drawn beats, a custom music track, text behind the speaker and re-voicing are priced on the plan. A paid plan spends Creative Credits against this connection's daily cap: NEVER approve one without the user's explicit go-ahead on that price. Optional resolution picks one of pending_plan.alternatives — then send that alternative's credits. A plan with pack: true is separate shots: optional shots (its shots[].shot_id values) approves only those, and expected_credit_cost is then the sum of their credits; unchosen shots are not made or charged. If the plan cannot be applied (request_failed), its message says why, anything it charged is refunded, and the plan stays waiting to be approved again. Afterwards poll get_studio_video until ready.attach_video_to_post
ChatGPTpending — try again later. Attaching clears any cover already set, so call set_post_cover afterwards.attach_visual_to_post
ChatGPTcancel_queued_post
ChatGPTcapture_design_screenshot
ChatGPTforce: true after an edit to render it again). Use this instead of waiting when list_variations says thumbnails are pending or get_render_diagnostics has no screenshot. Omit index for the active design.claim_domain
ChatGPTclone_site
ChatGPTcreate_collection
ChatGPTalready_existed) — add items to it instead. Publish the site for its pages to go live.create_content_pack
ChatGPTcredits as expected_credit_cost, plus a stable idempotency_key. This connection also has a daily spend cap. Blocks until the drafts land (about two minutes) — do not poll get_job. Ads are create_visual, not this.create_logo
ChatGPTcredits (or refine_credits with refine) as expected_credit_cost and a stable idempotency_key; a different price is refused with nothing charged, and a retry with the same key never charges twice. Poll get_job with the returned job_id; the logo lands in the brand library.create_motion_project
ChatGPTproject.id. Optional, as on the Video tool's start screen: kind (ad, reel, explainer, talking_head, polish) brings that kind's usual length, shape, voice and captions; format is a ready format's slug and recipe_id one of the brand's saved recipes, both from list_studio_video_templates (a recipe carries its own kind, so do not send both); look is what the film is made of — filmed (generated footage), photo (the photos of the brand moving in 3D), motion (motion graphics — the director decides from the brief whether to draw it scene by scene or cut it to the music as one film, and can show the product in use), kinetic (motion graphics cut to the music, chosen outright), website (the real site of the brand on screen) or auto (decided per scene, the default). Next, describe the film with studio_video_message: the director writes its storyboard, edits to it are free and undoable, and get_studio_video shows it with the price of making it; make_studio_video makes it once the user agrees to that price. Poll get_studio_video until ready. The same film is visible to the owner in Creative Studio. THEIR OWN VIDEO (a talking head, a recording, clips to cut together): send from instead of kind/format/recipe/look — one of video_url (an https link to an MP4, WebM or MOV up to 80 MB; it is stored in the brand's Library first), asset_id (a video from list_brand_assets), asset_ids (several, in order: a rough cut, joined with join_studio_video_cut — a finished film's project_id counts as a clip too, its export joined as it is, so two finished films are joined without re-opening either), post_id (a calendar post's video) or cut_of (a joined cut's project id). Free: the clip is read and put on the timeline; then studio_video_message says what to do with it (clean the voice, captions, motion graphics cut to what they say, a new background, presenter or voice, or NEW SCENES before or after their clip — drawn motion-graphics beats on the same timeline, joined into one export, never a separate film) and the director prices it — nothing is charged until approve_studio_video_plan. title names the film (otherwise it is named after the clip).create_page_draft
ChatGPTcontent_key), so editing it never changes what visitors see. Shared blocks — header, footer, theme — stay shared: editing those changes every page. Returns the draft's slug and the exact calls that edit it (how_to_edit): patch_variation_content under content_key for copy, update_variation_file with file = the draft slug for code, or refine_site with page = the draft slug. Up to 4 drafts per page. If Mondovo cannot keep a copy separate from the live page it refuses and says why in message — pass that sentence to the user as it is. Recorded in version history.create_site
ChatGPTbusiness.tone_of_voice (put the voice spec here, not in the description — it drives the copy voice directly); and a goal — the site's primary conversion objective ("free trial signups from agencies", "book a consultation") which drives the conversion narrative, section flow, and CTAs. All of that helps all three designs equally. The DESIGN inputs are a deliberate TRADEOFF, because they bind all three lanes to the same look: a stated design.color_palette fixes the colors for every design, a heavily-specified mood/creative direction fixes the whole aesthetic, and content you supply (headline, tagline, per-section copy) is used as written in all three — so the three come back differing only in layout and typography. Send them when the user wants ONE look executed well; leave color_palette and mood open, and omit sections/pages/per-section content, when the user wants genuinely different alternatives to compare (Mondovo's strategist then plans the section arc and page architecture around your goal, and each design picks its own palette and voice). Whatever you do send should be concrete, never generic placeholder text — reference real design styles if the user has a taste (e.g. "editorial serif, warm cream + terracotta, generous whitespace, Aesop-like"). To CLONE or closely reference a live site, set design.source_url to its HTTPS URL — Mondovo scrapes the page (screenshot + structure) and adopts its visual design (use design.source_copy: "preserve" to also keep its wording, default "rewrite"); this is stronger than describing it in design.references text. When source_url is set, do NOT send design.color_palette — the scraped design drives the colors and an explicit palette is ignored. To recreate from a design SCREENSHOT you already have (not a live URL), pass its HTTPS image URL(s) in design.reference_images and set design.reference_fidelity: "replicate" reproduces the reference faithfully (its section structure/order and imagery), "inspire" (default) honors its palette/typography/mood while adapting the structure to your business. Returns a site_id; poll get_site every 10s — it reports "generating" for the whole round (typically 3-15 min) and "ready" only when every design has landed. Then call list_variations to see the three. (For a design YOU author end-to-end, use create_site_from_design instead.) To set up a READY-MADE BUSINESS rather than generate a site — a directory, for instance, that arrives with its listings, its submission and claim flows and its pages already working — call list_packs, then pass that pack's pack_slug here with its questions answered in pack_intake. That path COPIES a curated design instead of generating one, so it costs no generation credits, finishes in about two minutes, and ignores business/design/content/pages/goal entirely.create_site_from_design
ChatGPTbusiness (name + industry + description), content (structured, keyed by section), files (self-contained TSX components; exactly one page with slug "/"), and optional collections (catalog types like menu/products with sampleItems). Mondovo validates, rehosts images to its CDN, and stands the site up in the design-selection phase — the user compares/confirms designs there (add alternatives via import_design_variation or generate_design_variation) before the site is forked to build. Returns a site_id; poll get_site until status is "ready". For a normal brief-based site, use create_site instead. AUTHORING CONTRACT (see files[].code): author brand colors as var(--color-) CSS variables so the design is theme-swappable, and prefer @/components/Runtime platform components (forms, catalog, gallery) over hand-built equivalents — workflow components (portal/funnel/cart/payment/booking) need owner activation, so add those via refine_site rather than authoring them here.create_support_ticket
ChatGPTcreate_visual
ChatGPTvisual_type and references_count (the length of references) — and send its credits as expected_credit_cost, plus a stable idempotency_key so a retry cannot double-charge. This connection also has a daily spend cap set at consent — if you hit it, wait until UTC midnight or tell the user to reconnect with a higher cap. SETS, as Creative Studio makes them — ONE job, ONE generation's price, cut into separate pictures (output_urls): by default you get 4 versions of your prompt (3 for a thumbnail) to choose from, as the Studio shows; batch changes how many (1-4). options (2-4 directions, each its own prompt and optionally its own words) gives competing alternatives instead. Never call this repeatedly for more choices. CAROUSELS: creative_kind "carousel" with slides (2-8, in swipe order: the first is the cover — headline + optional subhead; the last is the ask — cta + optional headline; the ones between are content frames — title, a frame_type and its fields) and optional preset (portrait 4:5, the default, or square). The whole deck is drawn as ONE picture and cut into its slides, at one flat price; the words on each slide are the words you send. Keep slides SHORT — big type renders cleanly, small dense type does not: a few words per line, list bullets of one short line. One call = one deck; do NOT make a carousel slide by slide. The answer (or get_job, while it runs) carries slides: the slide URLs in order. Look at them: a slide whose words came out wrong is fixed with redo_carousel_slides (one free redo per slide), not by remaking the deck. WORDS ON THE PICTURE: put the exact words to render in exact_copy (headline, offer = the sub-headline or supporting line, cta, brand_name); when you leave it out, the words the prompt quotes for the picture are lifted from it, and a prompt with none renders no text. ART DIRECTION, as the Studio's brief sets it: typography (how the words are set: weight, case, style), layout (where the copy sits), goal, objective, awareness_stage; thumbnail_surface for a thumbnail. REAL PHOTOS, LOGOS, PEOPLE: pass brand Library asset ids (list_brand_assets, or upload_brand_asset for a file at a URL) as references, with reference_roles saying what each is for. BRAND CONTEXT — decide it every time: by default the brand workspace's own business description, colours and logo are written into the brief, so the picture is ABOUT that business. When the piece is about anything else — a topic, an opinion, a how-to, an industry point, or another company — send brand_context: "prompt_only" so only your prompt (and exact_copy) is used, or the output reads as an advert for the workspace. For another company's work, use ITS brand (get_site_brand for its website, or create_brand). Output URLs are public CDN links.delete_page
ChatGPTdelete_page_draft
ChatGPTpage_slug is optional — it is worked out from the draft.delete_social_post
ChatGPTdescribe_brand_kit
ChatGPTdisable_chat_widget
ChatGPTdraft_collection_items
ChatGPTduplicate_social_post
ChatGPTedit_studio_video_script
ChatGPTedit_studio_video_storyboard
ChatGPTbutton, and only make_studio_video spends). Send ONE of: ops with the storyboard version you read as expected_version; undo: true with expected_version to take back the latest edit; or revert_turn: { turn_id, keep? } to take back what one studio_video_message turn changed (keep lists that turn's change ids to leave in place). Ops: edit_scene (scene_id + see / say / on_screen / seconds; on a filmed scene with somebody on camera, say is their line as the storyboard shows it, "Riley: …", and replaces it — it is never narration there; fit on a scene showing their clip: frame|pan|split|crop — a device frame, a pan across it, under the presenter, or cropped to its subject), remove_scene, reorder (scene_ids in the new order), set_music (off, track_id, energy upbeat|steady|calm, mood, volume 0–1, level quieter|louder), set_captions (on, style), set_caption_tier (scene_id + tier heading|body: that scene's spoken words emphasised in the captions, scene 1's also as the title at the top, or ordinary captions; filmed or photo scenes only), set_follow_stretch (scene_id + from + to: a scene that copies a video's moves follows another part of it — exactly one of that scene's follow.choices; the scene then reads changed and is made again on the button), redraw_storyboard (scene_id + optional note, e.g. "she holds the laptop lower": a filmed scene's storyboard — its storyboard_sheet_url — drawn again, free; the scene is then made from the new one), set_voice (source library|own + id, or voice_name; source none turns the narrating voice off — lines said on camera stay), set_voiceover (on: true|false), set_style (bold|elegant|playful|minimal — a feel; it never changes colours), set_colours (mode brand|designer|custom, and for custom hex as #rrggbb, most important first: the film's own colours, which every drawn scene and caption uses), trim_to (seconds, on its own), set_thing (thing_id + confirm or asset_id), add_scene_action (scene_id, action remake|change_person|change_thing|bring_to_life|cutaway|longer|language|redraw, note, asset_ids, language as a BCP-47 tag) — a paid change that goes on the button — and remove_scene_action, pick_script_option (option_id from storyboard.script_options), place_media (scene_id + asset_id: that scene shows one of THEIR files — a media[].id from add_studio_video_media or one already on the film — free; for a clip, optional from + to in seconds pick the stretch shown, else its first usable part as long as the scene), clear_media (scene_id + as filmed|drawn: the reverse — a scene showing their file becomes a filmed or drawn scene again, its words kept), insert_media_scene (after_scene_id, null for first, + asset_id: a new scene of their file), and set_format (aspect 9:16|4:5|1:1|16:9 and/or resolution 720p|1080p; before anything is made only the price moves, after it drawn scenes are redrawn and filmed scenes reframed, for free where the shot covers the new frame). If the storyboard changed since version, nothing is applied and the answer carries the current storyboard to try again against. Returns changes ({ id, summary }), the new version, and the storyboard and button.enable_chat_widget
ChatGPTcode: "embed_install_failed") and the widget stays on: tell the owner it is not yet on the site. Visitors see it after the next publish. Appearance, chat flows and knowledge are set in the editor.find_creation
ChatGPTfind_images_at_url
ChatGPTintent ("team headshots"). Writes nothing. Show the user the candidates, then import the ones they pick with import_images_from_url. Only use pages the user has the right to take images from.generate_design_variation
ChatGPTclone_index and Mondovo generates a design deliberately DIFFERENT from every existing one (the user is collecting options to compare). Pass clone_index and Mondovo builds a SIBLING of that specific design instead — same style personality, palette and type, varying layout and composition. THIS IS THE RIGHT TOOL FOR "make another one like design N" or "same look, different layout". You do not need to read a design's source to build on it: name its index here and Mondovo generates from it server-side. Call get_render_diagnostics first if you want to SEE the design you are building on. Returns 202; poll get_site until status is "ready".generate_favicon_options
ChatGPTregenerate is true. Ideas whose lettering does not match the brand are dropped. Returns preview URLs — show them, then call set_favicon with the chosen id.get_appointments_status
ChatGPTinclude_setup_defaults: true before set_up_appointments: it adds the defaults a first setup would use for this business (appointment name and length, mode, weekly hours, time zone, channels). Changes nothing.get_brand
ChatGPTget_calendar
ChatGPTfrom and to (YYYY-MM-DD, inclusive). Max 400 days.get_chat_widget_status
ChatGPTget_contact
ChatGPTget_credit_balance
ChatGPTget_form
ChatGPTget_intake_questions
ChatGPTget_job
ChatGPTjob_id those tools returned until status is "completed" or "failed". IMPORTANT: a "completed" job can still carry per-item failures — check the failed array and tell the user about anything in it, because one failed page never aborts the rest of the batch. Use get_site (not this tool) to poll create_site and publish_site — those run a design generation round, which is tracked separately. Creative jobs require creative:read; site build jobs require sites:read.get_site
ChatGPTstatus is one of: generating (a round is running — this covers every phase, and is also what you get while the state is momentarily unknown, so keep polling) | ready | publishing | published | publish_held | error. "publish_held" means the last publish crashed or loaded blank in a browser check before going live, so it was NOT made live (any earlier version is still what visitors see) — tell the user publish_message, fix the page it names, then publish again. Only "ready"/"published" mean the work is finished; generation_progress is informational and is NOT a completion signal on its own.get_site_settings
ChatGPTfavicon_url is the RESOLVED value, i.e. what a publish would actually ship, including one inherited from the brand kit. A crawler absent from ai_crawlers/search_crawlers has never been decided about and is allowed by default.get_studio_video
ChatGPTstoryboard: its version (send it to edit_studio_video_storyboard), scenes (each id, n, type, seconds, what we see, what is say-d, the on_screen words, status made / changed / making / failed / new, a picture_url, on a filmed scene its storyboard_sheet_url (the sheet of its key moments the scene is made from — show it; redraw it free with edit_studio_video_storyboard redraw_storyboard), and on a scene that copies a video's moves follow: the part it copies (from/to), its line and the other parts it may follow (choices)), things (people, places, products, style), layers (music, voice — with voice.take { url, seconds, stale } once the voiceover is recorded, to play to the user — captions, and the film's pace, punchy or calm), script_options (other versions of the script; pick one with edit_studio_video_storyboard pick_script_option), still_missing (what the director will choose if nobody does) and undo. button: the film's one button — its label and hint exactly as the user sees them, its price in credits with the lines it is made of, the quote_hash, step (a narrated film is made in TWO presses: voice = this press records only the voiceover — the film after it costs about film_after_voice_credits — then film = the film, cut to that recorded read; voice_after = an ad or reel shot picture-first: its picture is done and this press records the voiceover fitted to it and puts it on the film, with any lines_too_long to shorten first), nothing_to_make, the allowance for fixes (budget) and making.stoppable while a press is making. Before make_studio_video the user must see that price: in a chat with approval cards, propose make_studio_video and the card shows it (never write the label as text); otherwise show them the label and the lines first. Also: status, the timeline (each clip's kind, duration, status, its file as url and a file_name to save it under; for a transparent drawn graphic transparent.mov_url / transparent.webm_url; a separate-clips shot is delivered trimmed to its planned length and usually without sound, so url is that delivered file only once it is ready, full_take_url/full_take_file_name the take as generated, and delivery.state one of finishing, finishing_late, delivered, as_generated), an older film's plan waiting for approval (pending_plan with proposal_id, quoted_credits and its price_lines), drawn_on_film (motion_graphics: playing = a motion-graphics edit plays with its captions and closing card in the picture, kept = taken off and kept to put back, null = none; layers: each overlay layer — captions, end_card, hook_title, lower_third, logo, drawing — with what it shows; put_back_available: what the last removal took off. To change any of it, ask in studio_video_message — "remove the motion graphics", "put the graphics back", "remove the extra captions" — free, at once), the director's last reply (last_reply, written at last_reply_at) and question, a rough_cut (several of their clips: joined or not, and what next), and export.url once the film is put together (ready: true). On a connection with a daily Creative Credit cap, daily_cap shows remaining_today and whether it covers_button / covers_pending_plan, and max_budget_credits — the largest make_studio_video budget_credits it can hold (a press reserves the larger of its price and that allowance) — check it before asking the user to agree to a price. Poll about every 30 seconds while making. Does not spend.import_design_variation
ChatGPTmake_active: false to only add it); on a BUILT site it is only added — the site keeps its chosen design, because that is what publish ships — unless you pass make_active: true, which you should do only when the user has explicitly asked to switch to it. The response says which happened (made_active). This is a WHOLE-SITE design: to try a different version of ONE page (the home page included) without touching the live page, use create_page_draft instead. Same payload shape as create_site_from_design, plus site_id. The site must already have a design. Same authoring contract: brand colors as var(--color-) CSS variables (theme-swappable), and prefer @/components/Runtime components over hand-built ones (workflow components need owner activation — add those via refine_site). To change ONE file of an existing design, use update_variation_file instead, and to add ONE new page you wrote, use add_page with code — this tool burns a variation slot. The import is recorded in version history and the previous active design stays intact, so it can be undone with restore_version or switch_variation. To instead have MONDOVO generate an alternative variation, use generate_design_variation.import_images_from_url
ChatGPTjoin_studio_video_cut
ChatGPTfrom.asset_ids; get_studio_video shows rough_cut) — into one film, as the Video tool's Join does. Also PUTS A FINISHED STORYBOARD FILM TOGETHER AGAIN (nothing being made), so a change to its captions or overlays that needs no new scene reaches its file. Free: nothing is generated or charged, the clips are joined as they are, in order, and an unchanged film answers with the file it already has. Answers joined: true with export_url, or joining: true (poll get_studio_video until ready with export.url). A cut is not a film the director edits: to change the joined film (captions, motion graphics, a voice, new scenes), open it as one film with create_motion_project from: { cut_of: <this project_id> } and talk to that film with studio_video_message.list_appointments
ChatGPTview: "upcoming" (default), "pending" (waiting for the owner to confirm), "needs_time" (people who asked for an appointment and are waiting for the owner to pick a time — returned as requests), "past", "cancelled", or "registrations" / "enrolments" (event registrations / course enrolments, each with a claim_id, status, places and payment). Or pass week_of (any YYYY-MM-DD in the week) for a Monday–Sunday calendar: each day's open hours, time off and appointments. Personal data: never copy it into a site or anywhere the user did not ask.list_boards
ChatGPTsite_id or client_id only when you want to focus the list on one client. Returns each board's name, design count, public share link status/link, and whether a design has been chosen. Returns metadata only. Read-only.list_brand_assets
ChatGPTlist_brands
ChatGPTquery filters by name). Use a returned id as brand_id on every other creative tool. Restricted members only see brands for sites they were granted. With creative:generate, also returns websites_without_brand: websites (e.g. one you just built) whose brand is made on first use — call get_site_brand with one's site_id to open it. For a client or pitch with no website here, create_brand. Make a client's work under THEIR brand, never another client's.list_collection_items
ChatGPTlist_collections
ChatGPTlist_contact_fields
ChatGPTstatus will accept. Call this BEFORE upsert_contacts when importing: it tells you which custom-field keys already exist, so you map a spreadsheet onto the site's own vocabulary instead of inventing a second key for something it already tracks.list_contacts
ChatGPTstatus, tags (a contact must carry EVERY tag listed), free-text search across name/email/company, acquisition source or campaign, and a created-at window. Returns full contact records including tags and custom fields, so this is PERSONAL DATA: use it to answer the owner's question and do not copy it into site content or anywhere else. Paginated — check total against limit/offset before concluding you have seen everyone.list_content_drafts
ChatGPTlist_creations
ChatGPTsearch filters by title.list_events
ChatGPTnext_since on your next call to continue from there. Defaults to the last 7 days. This is how you stay current across conversations: events accumulate while nobody is connected, and you collect them when you reconnect.list_forms
ChatGPTpopup_forms lists the popup forms buttons can open; pass one's id as link_cta's form_id, and its slug to get_form / update_form_settings like any other form slug.list_packs
ChatGPTslug and the intake_questions it asks (with which are required); pass those to create_site as pack_slug and pack_intake (or to spin_up_pack) to set one up. Prefer this over create_site whenever the user describes a business shape we already ship — it copies a curated design instead of generating one, so it costs no generation credits and finishes in about two minutes.list_page_drafts
ChatGPTpage_slug, every page in the design that has drafts. Each draft comes back with its slug (what update_variation_file / refine_site target), its name, the live page_slug it belongs to, and its content_key (the draft's own text, for patch_variation_content). design.variation_index is the index to pass to those edit tools. Read-only.list_review_queue
ChatGPTlist_site_assets
ChatGPTlist_sites
ChatGPTquery to match a site by name instead of paging through everything. Each row is a compact summary (site_id, name, status, page_count, variation_count, preview/live links, thumbnail) — call get_site for a site's pages and list_variations for its designs and per-design preview links. total is the number of matching sites; when has_more is true, call again with offset = next_offset. Source design rows represented by accessible builds are folded by default; set include_design_sources to true when you need to choose or inspect those designs. Reuse the site_id of a matching site already returned. Do not repeat list_sites or expand source designs when that site is already identified; each call opens another gallery in interactive hosts.list_social_accounts
ChatGPTconnection_id queueing takes and whether it can publish now. Pass post_id to get exactly the accounts that post may go to. Call this before queueing, and ask the user which accounts when it is not clear — a platform name is not an account.list_studio_video_templates
ChatGPTkind (ad, reel, explainer, talking_head, polish) with its ready formats (slug, name, one line on what the film says), and — with brand_id — the brand's own saved recipes ("make another like this one": id, title, kind, scenes, seconds). Pass the choice to create_motion_project. Does not spend.list_submissions
ChatGPTstatus, form slug, free-text search on email/name, a submitted-at window, or arrival source. Test-mode submissions are left out unless include_test is true. PERSONAL DATA: answer the owner's question with it; do not copy it into site content or anywhere the user did not ask for. Paginated — compare total with limit/offset before concluding you have seen everyone.list_variations
ChatGPTthumbnails field in the response says exactly what to expect (ready | partial | pending | unavailable) and whether a capture run was queued — when it says pending/partial, show the available preview links and explain that screenshots are still rendering. In hosts with an interactive design card, that card refreshes screenshots itself: do not call list_variations again just to poll thumbnails or reopen the same card. Without an interactive card, a later metadata refresh is appropriate. Each design carries a variation_id — the stable UUID, and the ONLY identifier safe to store or pass to another call, because index/slot/variation_number renumber or gap when a design is deleted. Pass it to publish_site to say which design to publish. Use this to compare the alternatives before re-activating one with switch_variation or building on one with generate_design_variation.list_versions
ChatGPTmake_studio_video
ChatGPTbutton.step is "voice", this press records ONLY the voiceover and makes no picture (voice_only: true) — tell the user, poll until storyboard.layers.voice.take.url is set, let them listen to the read and its pacing, then (with their go-ahead on the new button price, step "film") press again to make the film cut to that read. If they change a spoken line after it, the take goes stale and the button re-reads it first. An ad or reel shot picture-first gets its voiceover LAST: once the picture is done the button's step is "voice_after" — this press records the voiceover fitted to the finished scenes and puts it on the film by itself (poll until storyboard.layers.voice.take is set and ready again). This is the ONLY way a storyboard film spends Creative Credits, against this connection's daily cap. NEVER call it without the user's explicit go-ahead on that price: in a chat with approval cards, proposing it puts that price on the card and the Approve is the go-ahead (do not also write the label as text); elsewhere, first show them get_studio_video button.label and button.lines. Send button.quote_hash and button.credits as expected_credit_cost. If the storyboard changed since, nothing is made or charged and the answer carries the new button to confirm again; a cost that is not the button's is refused. Optional budget_credits allows up to that many credits IN TOTAL (this press included) for retakes of scenes that fail, without asking again — only set it when the user chose an amount; omitted, every fix comes back to the user. It answers within about 40 seconds: started: true (with credits_charged: null) means the press is under way and did not finish answering in time — do NOT press again; poll get_studio_video. Afterwards poll get_studio_video until ready.manage_appointments
ChatGPTenabled false pauses bookings (nothing is deleted) and true resumes; mode; the default appointment title / duration_minutes; hours (the whole weekly schedule); timezone; where people can book (website, chat, voice — voice needs the voice add-on); limits (max_per_slot, min_notice_minutes, max_advance_days, buffer_minutes); days off (time_off_add, time_off_remove); emails (remind_day_before / remind_hour_before — reminders to the visitor before a confirmed appointment, on by default; morning_agenda_email — the owner's morning email of the day's appointments). Provided hours replace the whole weekly schedule, time_off_remove deletes selected time-off rows, and supplied settings/reminder switches overwrite those values. Confirm before changing existing schedules or notifications. The result lists what changed in plain words.patch_variation_content
ChatGPTversion in the response) and can be undone with restore_version; a history_warning means it saved but was not recorded. Omit index to patch the active design. NOTE: form definitions (forms, modalForms) are site-global — a form id the site already defines is ONE definition shared by every design, so editing it applies site-wide regardless of index, and the response echoes the key in site_global_keys so you can say so rather than reporting a per-design change. Send the full edited form entry (same id); new form ids stay with this design. PAGE DRAFTS: a draft's text lives under its own content_key (from create_page_draft / list_page_drafts) — patch ONLY that key, with the draft's design index, to change the draft without touching the live page. Patching the live page's keys (hero, page_about, …) changes the live site.pin_design_to_board
ChatGPTvariation_index (from list_variations) — or variation_id if you already have it. By default the design lands on the source site's client's main board; pass board_name to add it to a named board for that client (matched if one with that name exists, created if not), or board_id to target any specific existing board in your organization, including a board owned by another client. Optional display_label sets the client-facing name shown for the design on the board (e.g. "Bold & Dark"). Pinning the same design twice is a harmless no-op. Returns the board id/name, the pinned item id, and the board's public share link when it has one.plan_logo
ChatGPTcredits, and refine_credits for a premium refinement). Show the directions, ask which to render, then call create_logo with that direction and price.plan_video
ChatGPTbutton.credits), not this number: make the film with create_motion_project → studio_video_message → make_studio_video.plan_visual
ChatGPTcredits as expected_credit_cost on create_visual. A mismatch is refused. Send the same creative_kind, tier, batch, visual_type and references_count you will send to create_visual. A set (batch 2-4, or 2-4 options) costs the same as one picture; a carousel (creative_kind "carousel") is one flat price for the whole deck, however many slides.promote_page_draft
ChatGPTkeep_previous: true) the version it replaces is kept as a draft called "Previous version", so putting it back is one more promote; the swap is also one entry in the page's version history, undoable with restore_version (file_slug = the page). Like every edit this changes the site's design, not what visitors see: publish_site ships it. warnings lists images the new version dropped or links that match no page — tell the user.publish_site
ChatGPTdeployment_url in the response is the exact live URL — report that, never guess a host). Choose a subdomain matching the business name (lowercase, hyphens). IF THE SITE STILL HOLDS SEVERAL DESIGNS you MUST pass variation_id — the design to publish, taken from list_variations (a UUID, not an index). Do not choose for the user: list_variations attaches a thumbnail of each design, so show them and let the user pick. Publishing a design turns it into its own site: Mondovo builds the chosen design into a new site and publishes THAT, so the response carries a different site_id — use that id from then on (the original id stays the design draft, and get_site on it will keep saying unpublished). Calling publish twice reuses the same built site rather than creating another. Sites that already have one design ignore variation_id. A design only has its home page, but its menu links to the rest of the site: when it does, publish_site first BUILDS those pages and then publishes automatically — it returns status "building" with pages_being_built, a job_id and the new site_id. Before publishing a design, tell the user which pages its menu links to and that they will be built. On "building", tell the user which pages are being built, poll get_job with the job_id until "completed" (failed lists pages that could not be built — their menu links are removed; publish says whether the site went live), then poll get_site until "published". Do not call publish_site again meanwhile. If a response carries missing_pages, those menu links have no page and 404 on the live site: tell the user and offer add_pages for them. This tool RETURNS IMMEDIATELY with status "publishing" once the site is accepted for deployment — it does NOT wait for the deploy. Compiling and deploying takes 1-3 minutes and continues server-side even if this conversation ends. Poll get_site (with the returned site_id) every ~15s until status is "published" to get the live URL — or "publish_held", which means the new build crashed in a browser check before going live and was not published (tell the user its publish_message). NEVER call publish_site a second time to check on or hurry along a publish you already started: while one is in flight the publish lock rejects the call, and a transport timeout on this tool does NOT mean the publish failed — it is almost always still running, so poll get_site before concluding anything. If the response is contact_info_needs_confirmation, the site still has AI-invented placeholder contact details — either refine them to the real values first, or (if they are already correct) call again with confirm_contact_info: true to proceed. Retrying with the same arguments will NOT clear that warning. Success responses carry after_publish (plan, custom domain, editor link): once get_site reports "published", relay its tell_user to the user.queue_post_for_publishing
ChatGPTscheduled_at). Name every account by its connection_id from list_social_accounts — there is no default and it never goes to all connected accounts. Moving a date or marking a post ready does not publish; this does. Free (no Creative Credits). Queueing the same post again re-arms it and never posts twice; cancel_queued_post stops it before it goes out.queue_week_for_publishing
ChatGPTquote_content_pack
ChatGPTcredits as expected_credit_cost on create_content_pack.read_design
ChatGPTfiles: you get the design's file manifest — each file's name, slug, type and size in bytes — and its content keys with their sizes, but no code. Page drafts are left out unless include_drafts is true. (2) Call it again with files set to the name(s) or slug(s) you need (the same names update_variation_file accepts, e.g. "Header", "/" for the homepage): you get exactly those files' current code, plus the content keys those files read (or the ones you list in content_keys). One response carries at most ~200 KB; anything that did not fit is named in truncated_files / truncated_content_keys — request those in another call. ALWAYS do step 2 before update_variation_file: edit the real current file rather than reconstructing it, or you will drop sections, props and content keys the page depends on. Code is only returned when this connection has been granted the source:read scope; without it you get structure only (pages, blocks, content keys), which is enough to reason about a site — use refine_site for changes in that case. Omit index for the active design.refine_site
ChatGPTsource:read and you can author the exact change yourself, prefer read_design → update_variation_file — both are instant, deterministic, and land in the same version history as a refinement. Pass image_urls to attach REFERENCE images the change should be modelled on — a screenshot of a layout to match, a mockup, a competitor's section — and say what to do with them in the instruction ("make the hero section match this layout"). They are shown to the model as pictures, so use them whenever the target is easier to show than to describe; a described layout is reproduced far less faithfully than one the model can see. The images are a REFERENCE for the design, not content to insert — to place an actual photo on the page, describe where it goes and pass its url in the instruction. URLs must be on Mondovo storage: call upload_asset first and pass the permanent url it returns. For retry safety, reuse the same optional idempotency_key for one refinement attempt. Returns a job_id immediately; poll get_job every ~10s until its status is "completed" (a refinement typically takes 30-120s). The work runs server-side and completes even if this conversation ends, so a lost connection is not a failed refinement. If the site already has another operation running you get site_busy with that operation's job_id — poll it, then retry. page targets one page by slug — including a PAGE DRAFT's slug (from create_page_draft), which edits the draft and leaves the live page alone. refine_site always edits the site's chosen (active) design, so a draft that lives in a different design is edited with patch_variation_content / update_variation_file instead.remember_preference
ChatGPTrename_page
ChatGPTnew_name) and/or move its URL (new_slug). Supply either or both — omitting new_slug derives it from the new name. Every internal link across the site is rewritten to the new URL, the navigation is re-synced, and link TEXT naming the old page is updated too, so this is the ONLY safe way to move a page: editing the file's name through update_variation_file leaves every link pointing at a URL that no longer exists. The homepage's URL cannot be changed. The page's content survives the move — its content namespace is deliberately not recomputed. Publish the site for the change to reach visitors; until then the live site keeps the old URL.rename_page_draft
ChatGPTpage_slug is optional — it is worked out from the draft.rename_site
ChatGPTreschedule_social_post
ChatGPTrestore_version
ChatGPTfile_slug) or one design variation (variation_index). Tell the user which version you are rolling back to and why before calling this.rewrite_content_draft
ChatGPTschedule_social_post
ChatGPTpublish_to it is only a plan (a draft the owner sees in Creative Studio) — nothing is published. WITH publish_to (connection ids from list_social_accounts) the post is added AND scheduled to publish publicly on those accounts at that day and time, in one step, exactly as queue_post_for_publishing would. Name the time as scheduled_date + scheduled_time (the owner's wall-clock time; the brand's time zone is applied), or scheduled_at. A day or time already passed is refused. Free. To give it a picture, make one with create_visual and then attach_visual_to_post. Use get_calendar to see what is already planned.set_collection_item_display
ChatGPTtradeoffs — relay them to the owner. The preview shows the change at once; the live site updates on the next publish_site. list_collections reports each collection's current item_display.set_favicon
ChatGPTset_post_cover
ChatGPTset_studio_video_intent
ChatGPTfilm (the default): one edited film. pack: separate shots they can use one by one (an asset pack) — the plan then lists shots and approve_studio_video_plan can buy only the ones they tick (shots). A film made from their own video stays one film. Set it before the director plans. Free.set_up_appointments
ChatGPTinclude_setup_defaults: true and show the owner those defaults (appointment name and length, instant or request mode, weekly hours, time zone, where people can book) in ONE message, asking only what you cannot know — usually just "does this look right?". Then call this, passing only the fields they changed; anything omitted takes the proposed default. Provided hours replace the whole weekly schedule and supplied settings overwrite those values. Chat and voice take appointments at once; the website's booking form goes live on the next publish. Confirm the owner wants these changes before calling. Never creates items in the Services list.share_board
ChatGPTboard_id, or by site_id/client_id (uses that client's main board, or a named board via board_name). Set enabled: false to turn sharing off, or rotate: true to issue a fresh link that invalidates the old one. Optionally allow the client to vote (allow_votes) or comment (allow_comments) on options. Returns the public share_url (on the agency's own branded domain when configured) and whether sharing is on. The board must already exist — pin a design first if it doesn't.spin_up_pack
ChatGPTstop_studio_video
ChatGPTbutton.making.stoppable). Scenes that have not started are called off and their credits refunded; scenes already being made finish, and the film is put together from what is made. Does not spend.studio_video_message
ChatGPTundo, or revert_turn with the turn_id this returns). Nothing is made or charged here: what costs money collects on the film's one button, which get_studio_video shows with its price, and only make_studio_video presses it. If the user says "make it" in chat: where approval cards exist, propose make_studio_video with the button's quote_hash and credits so the price is shown ON the card; otherwise confirm the price with them in words first, then call it. On a film made from their own video, ask here for new scenes before or after their clip (e.g. "a 14-second motion-graphics ending after my clip"): the director adds them to the same film at their price, joined into one export — never a second film to join. On their own talking footage, ask here for words on screen too — e.g. "split the big words around me, behind me": one phrase they say, set huge in two halves that frame them and pass behind them (the cut-out behind them is the one priced part of that plan). Returns the director's reply, changes (the edits it applied, each { id, summary }), turn_id when it changed anything, and ask when it has a question: answer with answer: { question_id, option_id }. ask.ideas offers three ideas (pick one by its option_id, or ignore them and keep talking); ask.scope asks whether a change is for one scene or all like it (scope:this / scope:all); ask.intake_form asks everything still missing at once (see its how_to_answer). Answers within about 40 seconds: a turn that takes longer answers still_working: true with asked_at — do NOT send the message again; poll get_studio_video until last_reply_at is later than asked_at, and read the reply, question, storyboard and button there.suggest_keywords
ChatGPTswitch_variation
ChatGPTupdate_collection_item
ChatGPTitem_id, or by collection_type plus its slug or exact title in item. Only the fields you send change, and there is no restore snapshot in this tool. Publishing a visible item sends the change to the public site by collection auto-publish; drafting hides it, so confirm public visibility changes before calling. Never creates an item. Blog posts show up to three related posts, picked automatically: to choose them send fields {"related_mode":"manual","related_ids":[item ids]}, to hide them on that post {"related_mode":"off"}.update_page_seo
ChatGPTtitle (the browser-tab text and search headline for that page), description, target keywords, social image, canonical URL, and the noindex/nofollow flags. Only the fields you supply change. This is the PER-PAGE half of SEO and it WINS over the site-wide default — use update_site_settings for the site-wide title/description that pages fall back to. Like the site settings, none of this is in the site's code: Mondovo writes it into the page's head at publish, so refine_site cannot set it. Call get_site first if you need the list of page slugs; a wrong slug comes back with the real ones attached. Publish the site for the change to reach visitors.update_site_settings
ChatGPTtitle, the meta description, the social sharing image (og_image_url), the browser-tab icon (favicon_url), which AI crawlers (ai_crawlers) and search engines (search_crawlers) may read the site, the llms_txt content, and custom robots.txt rules (robots_txt_rules, robots_txt_custom). Only the fields you supply change; pass null to clear one. USE THIS RATHER THAN refine_site FOR ALL OF THEM. They live outside the site's code — Mondovo writes them straight into every published page's head, or serves them as /robots.txt and /llms.txt — so a refinement cannot set them, and asking one to try costs an AI round-trip and may put a stray tag in a component where it does nothing. This tool is instant and deterministic. favicon_url should be a square PNG, SVG or ICO under 500KB (32x32 or 64x64 is ideal); Mondovo downloads it and stores it permanently, so a temporary, generated or third-party URL is fine — you do not need to call upload_asset first. Crawler fields are per-crawler and independent: sending one leaves the others as they were. Blocking search_crawlers.googlebot removes the site from Google — confirm that with the user before doing it. Nothing here reaches visitors until the site is published: call publish_site afterwards for a live site.update_social_post
ChatGPTupdate_variation_file
ChatGPTcode. Use this for targeted code edits — a colour, a layout tweak, one section — instead of resending the whole design through import_design_variation, which burns a variation slot and re-uploads everything. Start from the current code returned by read_design (requires source:read) — send the COMPLETE file, not a fragment. The patched file is run through the same validation a full import gets; if it fails, NOTHING is written and the issues come back. On success the edit is recorded in version history (version in the response) so it shows in list_versions and can be undone with restore_version; a history_warning means it saved but was not recorded. Omit index to patch the site's active design. PAGE DRAFTS: pass the draft's slug (from create_page_draft / list_page_drafts) as file and its design's index to edit the draft instead of the live page. A draft must keep reading its own text (content.<content_key>); code that reads the live page's key is refused, because the draft would then edit the live page.upload_asset
ChatGPTsite_id and an HTTPS url pointing at the media (a generated image/video, a stock URL, or a temporary/expiring signed URL) — Mondovo downloads it, stores it permanently, and returns the permanent url. Use this when you have media at a link that might expire, or that you generated elsewhere, and you want it to live with the site. Supported: images (JPG, PNG, WebP, GIF) and video (MP4, WebM, MOV, up to 80 MB). Returns the permanent url plus an asset_id; reference the url in a subsequent refine_site instruction to place the asset.validate_design
ChatGPTvalidate_links
ChatGPTverify_domain
ChatGPTverified: false with what was found — DNS changes can take up to 48 hours, so tell the user to try again later rather than re-claiming.Capabilities
Example Prompts
Click any prompt to copy it.






