Skip to content

For developers

AI phone calls for your software.

Give your assistant a way to make an approved phone call and return the recipient's words. Create a scoped account key in Connections and store it on your server. Your account's balance and spending limits apply.

Open Calls 0.7.1 is approved and published in ChatGPT. Availability depends on your ChatGPT account, region and workspace settings. Other connections have their own setup and verification status. See the integration guides and the AI phone calls guide before choosing a client.

Make a request

curl https://opencalls.dev/api/v1/balance \
  -H 'Authorization: Bearer YOUR_ACCOUNT_KEY'

Use HTTPS and the Authorization header. Keep credentials out of browser code, URLs, workflow exports and model prompts. Give a connection only the permissions it needs; reading, calling, cancellation and incoming-assistant editing are separate scopes. Revoke access from your account at any time. Browser cookies do not authorize API requests.

Quote, approve, call

  1. Send the intended call details to POST /api/v1/estimate.
  2. Show the objective, recipient and returned maximum to the person, and obtain approval.
  3. Send the complete request to POST /api/v1/calls with maxChargeMicro equal to the approved maximumMicro. Persist one Idempotency-Key with the exact request before sending.
  4. Save the returned call ID. HTTP 202 acknowledges the request; it does not establish an answer.
  5. Poll GET /api/v1/calls/:id every few seconds until audit.terminal is true. A client timeout does not mean the call failed.
{
  "recipient": "The shop",
  "phone": "+12025550123",
  "objective": "Ask when the shop opens tomorrow.",
  "maxAttempts": 1,
  "maxChargeMicro": 500000,
  "maxMinutes": 2
}

Example request only. Replace the number and objective, then use the exact approved quote for the maximum. Amounts are integer microdollars: 1,000,000 equals $1.

If a reply is lost, retry the same body and key. A changed request needs a new explicit approval. Never generate a new key automatically to work around a conflict. Cancel through POST /api/v1/calls/:id/cancel and continue checking until settlement.

Return an answer with evidence

Report audit.confirmed with its quotations and keep audit.unresolved visible. Check objective_completed: a completed phone connection alone does not prove the task succeeded. The final customer receipt is in audit.billing. Responses marked result.simulation represent local examples without a real call.

For a live question or private invitation, open the returned result_url in the owner's signed-in browser, or use the existing MCP response tool. Connections never authorize themselves to buy credit, change plans or bridge another person.

Calling and account API

Method Path Purpose
GET /api/v1/assistant Read incoming assistant configurationRequired scope: calls:read
PUT /api/v1/assistant Update incoming assistant configuration with a version checkRequired scope: assistant:write
GET /api/v1/balance Read account balance, reservations and usageRequired scope: calls:read
POST /api/v1/business-search Find candidate business branches for owner review; this does not place a callRequired scope: calls:read
GET /api/v1/calls List the latest 100 callsRequired scope: calls:read
POST /api/v1/calls Request an approved callRequired scope: calls:write
GET /api/v1/calls/{call_id}/recordings/{id} Download one account recording with a fresh token from the list responseRequired scope: calls:read
GET /api/v1/calls/{id} Read call progress, grounded evidence and final or pending billingRequired scope: calls:read
POST /api/v1/calls/{id}/cancel Request that a call stopRequired scope: calls:cancel
GET /api/v1/calls/{id}/recordings List recordings saved to the account after call settlementRequired scope: calls:read
POST /api/v1/comparisons Approve an atomic bounded recipient comparisonRequired scope: calls:write
POST /api/v1/comparisons/quote Review one bounded total for 2–5 chosen recipientsRequired scope: calls:write
GET /api/v1/comparisons/{id} Read grounded per-recipient comparison evidence and chargesRequired scope: calls:read
POST /api/v1/comparisons/{id}/cancel Stop all remaining calls in an approved comparisonRequired scope: calls:cancel
GET /api/v1/contacts List saved contactsRequired scope: calls:read
POST /api/v1/contacts Save a contactRequired scope: calls:write
DELETE /api/v1/contacts/{id} Remove a saved contactRequired scope: calls:write
PUT /api/v1/contacts/{id} Update a saved contactRequired scope: calls:write
POST /api/v1/estimate Quote an informational call without reserving fundsRequired scope: calls:read
POST /api/v1/pairing-token Rotate a paired assistant refresh token
POST /api/v1/pairings Begin a connection request for owner approval
GET /api/v1/pairings/{id} Poll approval status; never returns an account credential
GET /api/v1/preferences Read calling preferencesRequired scope: calls:read
PUT /api/v1/preferences Save calling preferencesRequired scope: calls:write
GET /api/v1/tasks List saved tasksRequired scope: calls:read
POST /api/v1/tasks Save a taskRequired scope: calls:write
DELETE /api/v1/tasks/{id} Remove a saved taskRequired scope: calls:write
PUT /api/v1/tasks/{id} Update a saved taskRequired scope: calls:write
GET /api/v1/users/me Identify the person who owns this credentialRequired scope: calls:read

Saved contacts, tasks and assistant settings use versions to protect concurrent edits. Reload and reconcile a version conflict before saving. Saving a contact does not authorize a call, and saving assistant settings does not establish number readiness.

Pair an assistant

Start a pairing and show the owner its approval URL. The temporary polling credential returns status only, even after approval. The owner explicitly transfers the approved credentials into the local client's secure store. Rotate and atomically store both tokens when refreshing; reusing an old refresh token revokes the connection.

MCP access

Use the /mcp endpoint with a client that supports remote HTTP MCP and an account Bearer credential, or the approved OAuth connection. The calling tool is make_call; the submitted OpenAI application also retains call_business. Both use the same account authorization, budget and duplicate-request protection.

HTTP workflows

A workflow client can use the API sequence above with its own secret store, an explicit approval step, a durable request key and bounded polling. Import the OpenAPI reference for request and response shapes. Target-client packages remain in preview; do not treat an import as proof a hosted connector has been accepted.

The n8n exports are inactive and require your installation's address and a scoped credential. The calling template requires an approved request and stops after 45 reads. The signed-update template only verifies and reads; business actions need durable processing and protection against duplicate deliveries.

Muse and OpenAPI clients

Import this installation's OpenAPI reference and use the connector instructions. Start by reading the balance. Keep credentials in the client's secure store and require approval of each call's objective and maximum. See the setup guide for pairing and token rotation. iPhone setup verified September 17, 2026. Approve access, then paste the key only in Muse’s Secure Credentials Store.

Receive signed updates

Configure an HTTPS receiver in Developer webhooks. Verify the signature and timestamp against the raw request body, deduplicate delivery IDs, and read the call through your authorized connection for its current state. A test delivery and owner activation are required before result notifications are enabled.

Handle failures deliberately

Authenticate again for an expired credential; ask the owner for a missing scope. Resolve 409 conflicts against the original request or current saved version. Back off on 429. Policy rejection is not permission to change keys or identities and retry. Optional hold mode requires a verified callback and enabled calling support. Add your owner ID as handoffUserId when you want an invitation to join an informational call. Joining supports English, Hebrew, Spanish, French, German, Portuguese, Arabic and Italian and requires explicit approval plus private callback acceptance. Human joining does not enable recordings in your account. Private debugging recordings follow the Privacy Notice. Live translation is available in beta for supported language pairs. Use translate only when the account reports an available language pair and interpreter voice.

Privacy choices

Diagnostics run by default to help us improve Open Calls. They include page views, IP addresses and approximate location, browser errors, masked interface replay and pseudonymous activity summaries for learning. Sensitive information and call audio are excluded. Privacy choices, Do Not Track and Global Privacy Control disable optional diagnostics and campaign attribution.

Google Analytics is off until you enable it here. It measures visits and connection clicks on public pages using cookies. Google receives your IP address and browser information; account pages, call content, query strings and full referring addresses are excluded. Do Not Track, Global Privacy Control and turning off diagnostics also disable it. A saved diagnostics decline keeps it off until you change your diagnostics choice.