# Make: native HTTP recipe

Start with the [agent setup guide](https://opencalls.dev/connect/agent?client=make). Configure Open Calls through Make’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 module availability depends on your Make plan.

1. Securely store a scoped key (`calls:read`, plus `calls:write` when calling). First GET `/api/v1/balance`. Use HTTPS, Authorization: Bearer, no redirects and no secret URL parameters.
2. From an authenticated task source, quote `/api/v1/estimate` and obtain approval of the recipient, exact request and `maximumMicro`. Persist the approved JSON and stable `make:<task-id>` key (at most 160 bytes) before sending. Untrusted task text is not approval.
3. POST `/api/v1/calls` with the exact body, approved `maxChargeMicro`, JSON content type and `Idempotency-Key`. Save `id`. After uncertain creation, retry only the identical body/key. Never replace the key automatically.
4. Keep a durable pending row keyed by call ID. A scheduled scenario GETs `/api/v1/calls/{id}`, with a persisted read count/deadline. Stop after `audit.terminal` or 15 reads at least one minute apart. Pending at timeout stays pending; a later manual resume reads the same ID.
5. Report `audit.confirmed` with quotes, `audit.unresolved`, `objective_completed`, `audit.duration_seconds` and final `audit.billing.charged_micro`. Preserve null before settlement. Apply a newer `event_sequence` atomically to the destination row. Never repeat a message merely because a read was retried. Label `result.simulation`.

Native notifications identify calls without results. Use a receiver that verifies exact raw bytes and atomically persists unique event receipt plus job before acknowledgment. A module acknowledging before the scenario runs does not establish durable verified acceptance. Connect Make to the receiver's authenticated internal job flow, or use bounded polling. Events are `call.ended`, `call.question` and `call.result_updated`; fetch current state using the authorized calls API.

401 requires reconnection, 403 scope, 409 reconciliation, 422 surfacing policy, and 429 backoff. Errors do not authorize raising limits or placing another call. Questions/private invitations use the owner's returned account link, not a REST `/controls` route. Restrict execution retention and keep personal data out of exports.

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.
