| search_businessesA | Search Google Places for a business by name. Returns up to 5 candidates. Free, no credits, no side effects. REQUIRED before create_site whenever you have only a business name (no placeId already in hand). Common names like "Acme Plumbing" or "Pizza Place" will silently resolve to the wrong business if you skip this step. Do NOT skip search just because you're confident about the name — the customer's local context isn't enough to guarantee Google Places ranks the right one first. Each result includes placeId, name, address, phone, rating, userRatingCount, and businessType. Present the top 2–3 results to the user (city + rating count) and ask which one. If exactly one result comes back, you can proceed without confirmation. If multiple come back and you have high confidence from other user context, you may pick the one with the highest userRatingCount, but only call that out — never silently auto-pick. Canonical flow: 1. search_businesses({ query, location? }) → user picks (or single result auto-picks) 2. create_site({ businessName, contactEmail, placeId: }) On transient failure (timeout, 5xx, network error): retry ONCE. If the retry also fails, tell the user "the disambiguation lookup is temporarily unavailable" and ASK whether to proceed without a placeId (in which case create_site will auto-resolve from businessName + businessLocation — coin flip for common names). Do NOT silently fall through to gathering create_site fields from the user — that wastes their time and bypasses the safety of disambiguation. |
| create_siteA | Kick off an end-to-end website build for a real business. Warpweb auto-researches the business (Google Places: hours, address, phone, photos, reviews, service area, category, services), writes copy in a voice matched to the vertical, picks photos, generates a vertical-aware design, builds a multi-page site (home / about / services / contact + vertical-specific sections), adds SEO (meta tags, sitemap, Schema.org JSON-LD), and deploys to a free *.warpweb.app subdomain. Required inputs you must collect from the user: contactEmail only (where form submissions go). placeId should come from a prior search_businesses call, NOT from asking the user. DO NOT ask the user about: service area, services offered, business hours, phone, address, business description, photos, FAQs, testimonials, target audience, target demographics, "anything to emphasize," design style, tone, or any other content questions. Warpweb auto-researches all of that from Google Places via the placeId — asking the user wastes their time and produces a worse result than the engine's research (which uses up-to-date Places data, reviews, and photos). Optional ownerPrompt is the one place to capture user voice direction, but only if the user volunteers it unprompted (e.g. "make it sound friendly" or "emphasize 24/7 service"). Do not solicit it. If you arrive here without a placeId, go back and call search_businesses first. The auto-resolution fallback (using businessName + businessLocation without placeId) is a coin flip for common names and will silently build a site for the wrong business. Only fall back if search_businesses failed twice and the user explicitly approved proceeding anyway. ASYNC: this call returns a siteId and status: "generating" IMMEDIATELY. Real builds take 3–8 minutes. After calling this, EITHER poll get_site every 2–5 seconds until status is complete or failed, OR subscribe to the site.complete / site.failed lifecycle webhooks on warpweb.ai/app for push delivery (preferred). Best for service-based local businesses (trades, clinics, salons, agencies, restaurants, real estate) that have a Google Places listing — that's what Warpweb is calibrated for. SaaS or fully-remote companies still work, but the result reads more generic. Cost: ~200–500 credits, billed at end-of-build against actual AI usage. Failed builds are free. |
| get_siteA | Fetch the current record for one site by id. Use this to poll the status of a build after create_site (or a create_revision). Returns the full site row including status, generation_phase, generation_message, and (when complete) deployment_url. Polling pattern: call every 2–5 seconds; stop when status is complete or failed. status values: generating | complete | failed | research_review. Returns 404 if the site does not exist OR is not owned by your account. |
| list_sitesA | List every site owned by the calling account. Returns an array of site rows (id, slug, business_name, status, deployment_url, created_at, updated_at, etc.). Free, not metered. |
| refresh_siteA | Free *.warpweb.app subdomain sites auto-pause after 7 days of inactivity. This call bumps last_refreshed_at = now() and, if currently paused, restores the live bundle on Cloudflare Pages. It's idempotent and free — safe to retry. Custom-domain sites stay live regardless and do not need this call (they pay $10/site/month for always-on hosting). |
| create_revisionA | Conversational edit of a deployed site. Send a plain-English prompt and Warpweb re-deploys. Works for small surgical edits ("make the hero photo darker", "change the headline to ...", "swap the phone number") and for structural changes ("add an FAQ section about emergency repairs", "move the service area below testimonials", "restructure the homepage around 3 service categories"). The right size of edit is chosen automatically based on scope — you just describe what you want. ASYNC: returns a revisionId and queue_position immediately. Real revisions take 30s–4min. Poll get_site until updated_at changes, OR subscribe to site.revision_complete / site.revision_failed / site.revision_clarification_needed lifecycle webhooks for push delivery. If the agent needs clarification, the clarification webhook fires with a question field; reply by calling create_revision again with the answer in the prompt. Revisions inside the same site queue serially (depth cap 3 — 1 running + 2 waiting). If you hit queue_full: true, wait for the current edit to land before queuing more. Cost: ~20–100 credits per revision, billed against actual AI usage at the end. |
| check_domainA | Check whether a domain is available to register through Warpweb and what it costs. Returns availability + price_cents for the requested domain plus a few related suggestions (name variations, regional variants). This is step 1 of a two-call flow: use this to discover a price, then pass the EXACT price_cents value into register_domain — the price must match or the registration call will fail. Free; no credits consumed; no side effects. |
| register_domainA | Purchase a domain via Cloudflare Registrar at-cost and attach it to a deployed Warpweb site in one shot. DNS + Pages custom-domain wiring happen automatically. PRECONDITION: call check_domain first to get a price. The price you pass here must EXACTLY match the price_cents returned by check_domain — this guards against price-drift surprises. Price cap: $50/yr ($5000 cents). The pagesProjectName field is the site slug returned by create_site (e.g. "acme-plumbing-a1b2c3"). Cost: 50 credits + the registrar pass-through fee (in cents). Custom-domain sites also become Active Sites ($10/site/month) for always-on hosting + SSL + monitoring. |
| attach_domainA | Attach a domain the customer already registered elsewhere (e.g. GoDaddy, Namecheap) to a deployed Warpweb site. Returns the CNAME target the customer must set at their existing registrar, plus copy-paste DNS instructions for apex + www. Domain status is dns_pending until propagation completes (usually minutes, occasionally up to 48 hours). Use this when the customer says 'I already own the domain' — versus register_domain for new purchases through Cloudflare Registrar. Cost: 5 credits. Custom-domain sites become Active Sites ($10/site/month) for always-on hosting + SSL + monitoring. |
| configure_form_webhookA | Configure the URL Warpweb POSTs to whenever a form is submitted on this site. Each delivery is signed with HMAC-SHA256 (header X-Warpweb-Signature over the raw request body) using a site-scoped secret. IMPORTANT: the signing secret is returned in secret_issued ONLY on the first configure or when rotate_secret: true is passed — store it immediately, it is not retrievable later. Re-configuring with the same URL is idempotent (no new secret issued). Before this is configured, form submissions deliver as plain email to the site's contact email instead. Most API customers want the webhook path for structured JSON + verification. Free to configure; free to deliver. |