Developer docs

The Gonzo web API, for developers.

Plain JSON over HTTP, described by an OpenAPI 3.1 document. Read-only tools, and proposals that wait for a person.

Free audit, no accounts, we change nothing.

Or ask a person: aimarketing@gonzo.co.in +91 7390990227 WhatsApp

Base URL, keys and the document

  • Base URL: your endpoint, over HTTPS. The server itself speaks plain HTTP and binds to the local machine by default, so a proxy supplies the HTTPS.
  • Key: a person at Gonzo issues it. Send it in the header X-API-Key: gz_... or Authorization: Bearer gz_..., never in the URL and never in the body. A credential-shaped argument is refused with status 422.
  • Only a hash of each key is stored. If no key is configured, the server refuses every call with 503.
  • The OpenAPI 3.1 document is at /openapi.json. Add ?tiers=public_read to get the public tools only. It is generated from the same list the MCP server uses, so the two cannot drift apart.
  • GET /health and GET /v1/tools need no key.

Calling a tool

A read tool is GET /v1/tools/<name> with the arguments in the query string. Any tool also answers POST /v1/tools/<name> with a JSON object body. Tools that propose something accept POST only.

curl -s -H "X-API-Key: gz_..." "https://your-gonzo-endpoint/v1/tools/roi_estimate?staff=2&hours_per_week=10&hourly_cost_usd=35"

curl -s -X POST -H "X-API-Key: gz_..." -H "Content-Type: application/json" \
  -d '{"key":"lead_response"}' "https://your-gonzo-endpoint/v1/tools/get_system"

A reply:

{ "ok": true, "tool": "get_system", "tier": "public_read",
  "source": "the product catalogue the site is built from",
  "simulated": false, "sandbox": false, "result": { "...": "..." }, "request_id": "..." }

simulated and sandbox are true when the result comes from the sandbox. An error looks like { "ok": false, "error": { "code": "...", "message": "..." }, "request_id": "..." }. No error carries a stack trace or an argument value.

Status codes

StatusMeaning
200The tool ran
400The arguments do not match the tool's schema
401No valid key
403The key does not carry the scope for this tool
404Unknown tool, or an unknown id inside it
405, 411, 413, 414, 415Wrong method, missing length, body or URL too large, wrong content type
422A credential-shaped or approval-shaped argument was refused
429Rate limit. The Retry-After header says how many seconds to wait
503No keys configured, or the site content the tool reads is unavailable

Limits

  • A per-key rate limit of 60 calls a minute unless the key says otherwise, plus a throttle on repeated failed attempts.
  • Body 64 KiB, arguments 16 KiB, URL 2,048 characters, a bounded number of concurrent requests.
  • CORS is off unless the operator lists an origin.
  • Every call, refusals included, is written to a hash-chained audit log. Arguments are stored only as a hash.

The tools

Scopes: public:read, tenant:read, tenant:propose.

ToolScopeArguments
list_systemspublic:readnone
get_systempublic:readkey
price_listpublic:readcurrency (usd or inr)
roi_estimatepublic:readstaff, hours_per_week, hourly_cost_usd, optional share_pct, system_key
list_guardrailspublic:readnone
run_sandbox_demopublic:readoptional seed (0 to 9999)
verify_demo_audit_chainpublic:readoptional seed
get_country_factspublic:readcode
answer_doubtpublic:readquery
how_to_request_free_auditpublic:readnone. It never accepts data
comparepublic:readoptional topic
tenant_list_leads, tenant_list_conversations, tenant_list_bookingstenant:readoptional limit (and contact_id for conversations)
tenant_invoice_agingtenant:readnone
tenant_ad_reporttenant:readoptional days
tenant_list_pending_approvals, tenant_audit_logtenant:readnone, or optional limit
tenant_get_proposaltenant:readcall_id
propose_send_emailtenant:proposecontact_id, subject, body, optional idempotency_key
propose_whatsapp_replytenant:proposecontact_id, text, optional idempotency_key
propose_calendar_invitetenant:proposecontact_id, title, start, optional minutes, idempotency_key

The tenant tools read a simulated business: made-up people, masked email addresses, a labeled fixture for receivables, and the sandbox ad platform. No real customer appears in any of them.

Proposals and approval

A propose_* call returns status: pending_approval and executed: false. The action has not happened, and this API has no way to make it happen. A named person on the client's side approves or denies it on the client's own approval screen, outside this API. That screen does not exist yet: today only a test can release a pending call, using an approval bound to that one call. The consent, opt-out and no-stranger rules are checked before a proposal is filed.

What these tools are not

These tools cannot change Gonzo's systems, they do not expose the finance desk (negotiation, quotes, invoices, price limits), and they do not call an AI model. Whatever model you connect on your side is yours, and it does not change which models Gonzo's own agents use.

Tested, and not

Our own tests cover the tool list and its rules, authentication that fails closed, the rate limit, the credential screen, the OpenAPI document's structure, round trips against a local test server, a deterministic demo and the audit log. Not tested: ChatGPT, Zapier, Make, n8n, an external OpenAPI validator, a public deployment.

Next steps

Start with the free audit.

Send one web address. In about five business days you get a short written report. If a system fits, a fixed-price scope follows.

Free audit, no accounts, we change nothing.

What happens next

  1. Free auditAbout five business days. A short written report on one page. We change nothing.
  2. Fixed-price scopeIf a system fits, you get its scope and price in writing. Nothing is paid on this site.
  3. Build7 to 21 business days from a signed scope and the deposit. The written handover comes before go-live.

Or ask a person: aimarketing@gonzo.co.in +91 7390990227 WhatsApp