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
- Send the intended call details to
POST /api/v1/estimate. - Show the objective, recipient and returned maximum to the person, and obtain approval.
-
Send the complete request to
POST /api/v1/callswithmaxChargeMicroequal to the approvedmaximumMicro. Persist oneIdempotency-Keywith the exact request before sending. - Save the returned call ID. HTTP 202 acknowledges the request; it does not establish an answer.
-
Poll
GET /api/v1/calls/:idevery few seconds untilaudit.terminalis 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.
- n8n: approved call and bounded result
- n8n: signed update inspection
- n8n setup and acceptance guide
- Make HTTP recipe
- Zapier HTTP recipe
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.