# Zapier: native HTTP recipe

Start with the [agent setup guide](https://opencalls.dev/connect/agent?client=zapier). Configure Open Calls through Zapier’s HTTP tools using your trusted server address and `/openapi.json`, and store the connection key in secure credential settings. Read the account before approving a call. HTTP tool availability depends on your Zapier plan.

1. Securely store a key with `calls:read`; add `calls:write` for approved calls and `calls:cancel` for requested cancellation. Use the Authorization header, never URLs or prompts. First GET `/api/v1/balance` without calling.
2. Trigger from an authenticated source with approval of the recipient, objective and maximum from `/api/v1/estimate`. Persist the exact body and `zapier:<task-id>` key (at most 160 bytes). Untrusted form text is not approval.
3. POST `/api/v1/calls` with JSON, approved `maxChargeMicro` and `Idempotency-Key`. Save `id`. Retry uncertain creation only with identical body/key; do not configure whole-task retries that generate another key.
4. Schedule a GET `/api/v1/calls/{id}`. If `audit.terminal` is false, record pending and schedule another bounded read. Persist count/deadline and stop after 15 reads at least one minute apart. Timeout is pending, not failure. Resume by saved ID.
5. Report `audit.confirmed` with quotations, `audit.unresolved`, `objective_completed`, `audit.duration_seconds` and final `audit.billing.charged_micro`. Keep pending charge null. Atomically reject older `event_sequence` values before updating a row. Call completion alone is not task success; label simulations.

For push updates, put a verified durable receiver before Zapier. It must check exact raw bytes, singleton signature headers, a five-minute clock window and matching event ID, then transactionally store the event and processing job before HTTP 2xx. A catch-hook acknowledgment followed by verification in a later action is insufficient. Separate storage lookup/write is not atomic deduplication. The receiver can subsequently send an authenticated internal task to Zapier.

Native `call.ended`, `call.question` and `call.result_updated` events identify the call, without results or charge. Fetch current state with the scoped key. Deduplicate destination actions durably; never create calls from result notifications. Limit execution-content retention and keep credentials/personal data out of exports.

401 requires reconnection, 403 scope, 409 original-request/version reconciliation, 422 surfacing policy, and 429 backoff. Do not raise limits or change keys to bypass rejection. Answers/private invitations use the owner's link or reviewed MCP tool, not an invented REST controls route.

October 18, 2026: Optional human joining uses the authenticated owner ID from `GET /api/v1/users/me` as `handoffUserId` in the quote and call, with recording off. Relay the account link promptly for the actual invitation and private callback acceptance; the workflow must not accept on the owner’s behalf. Callback and recipient prompts support English, Hebrew, Spanish, French, German, Portuguese, Arabic and Italian. People speak directly after accepting the verified callback. The eight-language translation beta covers all 56 ordered pairs of different languages when enabled. It calls the starter first, explains in their language and asks spoken permission without a code. After approval, it calls the recipient, explains in their language and introduces both people. Setup uses the interpreter’s voice. The whole session, including setup and ringing, lasts at most ten minutes; an explicitly shorter approved limit still applies. Use `translate` only when the feature is currently enabled and the recipient/owner language pair is configured. MCP clients must check `get_workspace.capabilities.translation`, with `preferred_language` for the recipient and `userLanguage` for the owner’s spoken language (also the report language). REST clients pass `language` and `userLanguage` and require a successful current estimate for the same parameters. A quote does not approve an invitation or establish that anyone connected.
