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_...orAuthorization: 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_readto get the public tools only. It is generated from the same list the MCP server uses, so the two cannot drift apart. GET /healthandGET /v1/toolsneed 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
| Status | Meaning |
|---|---|
| 200 | The tool ran |
| 400 | The arguments do not match the tool's schema |
| 401 | No valid key |
| 403 | The key does not carry the scope for this tool |
| 404 | Unknown tool, or an unknown id inside it |
| 405, 411, 413, 414, 415 | Wrong method, missing length, body or URL too large, wrong content type |
| 422 | A credential-shaped or approval-shaped argument was refused |
| 429 | Rate limit. The Retry-After header says how many seconds to wait |
| 503 | No 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.
| Tool | Scope | Arguments |
|---|---|---|
| list_systems | public:read | none |
| get_system | public:read | key |
| price_list | public:read | currency (usd or inr) |
| roi_estimate | public:read | staff, hours_per_week, hourly_cost_usd, optional share_pct, system_key |
| list_guardrails | public:read | none |
| run_sandbox_demo | public:read | optional seed (0 to 9999) |
| verify_demo_audit_chain | public:read | optional seed |
| get_country_facts | public:read | code |
| answer_doubt | public:read | query |
| how_to_request_free_audit | public:read | none. It never accepts data |
| compare | public:read | optional topic |
| tenant_list_leads, tenant_list_conversations, tenant_list_bookings | tenant:read | optional limit (and contact_id for conversations) |
| tenant_invoice_aging | tenant:read | none |
| tenant_ad_report | tenant:read | optional days |
| tenant_list_pending_approvals, tenant_audit_log | tenant:read | none, or optional limit |
| tenant_get_proposal | tenant:read | call_id |
| propose_send_email | tenant:propose | contact_id, subject, body, optional idempotency_key |
| propose_whatsapp_reply | tenant:propose | contact_id, text, optional idempotency_key |
| propose_calendar_invite | tenant:propose | contact_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.
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.
Or ask a person: aimarketing@gonzo.co.in +91 7390990227 WhatsApp