A phone capability for your software.
Create a workspace API key in Connections. Store it on your server. Keys belong to one workspace and inherit its credit, role and spending limits.
Make a request
curl https://opencalls.dev/api/v1/workspace \
-H 'Authorization: Bearer YOUR_API_KEY'Use HTTPS and a bearer key. No workspace header is needed. Never put a key in browser code or a URL. New keys include read access; select call creation, cancellation or assistant-editing permissions separately. Keys expire after the selected 1–365 days and can be revoked immediately.
Calling API
| Method | Path after /api/v1 | Purpose |
|---|---|---|
| GET | /workspace | Credit, limits and workspace state |
| GET | /calls | Up to 50 recent calls; use next_before as the before query parameter |
| POST | /calls | Authorize a bounded call |
| GET | /calls/:id | Progress, answers, quotes and usage |
| GET | /calls/:id/recordings | List available recordings after settlement |
| GET | /calls/:id/recordings/:attempt | Download private recorded audio |
| POST | /calls/:id/cancel | Cancel a queued or active call |
| POST | /calls/:id/controls | Answer, send a note or approve participation |
| GET / PUT | /calling-preferences | Read or save speaking preferences |
| POST | /comparisons | Compare selected recipients within one budget |
| GET | /comparisons/:id | Read source-linked comparison results |
| GET / PUT | /assistant | Read or update an existing inbound assistant |
Call and comparison creation and live controls require an Idempotency-Key header. Reuse it only when retrying the same request. A new call returns an ID; poll its result until billing is settled. A connected call can incur usage even when a question remains unresolved.
{
"recipient": "Recipient name",
"phone": "+1XXXXXXXXXX",
"objective": "Describe the information you need confirmed.",
"language": "en",
"maxMinutes": 2,
"maxAttempts": 1
}Replace the example with an actual supported number (United States, Canada, Israel or United Kingdom). Accept the account Terms on the website before making calls. They cover your responsibility for obtaining required recipient permissions; the API does not need a per-call consent flag or recipient time zone. Standard requests allow at most five minutes and two attempts. Explicit schedules still require a start, expiry and time zone. An agent cannot accept the account Terms on your behalf.
Optional fields include speaking (voice, tone, pace), mode (ask, hold, translate), allowQuestions, handoffUserId, userLanguage, schedule, followUpCallId and useSavedContext. The account’s forms provide the same controls. Callback targets must be saved and accept before joining. Defaults you leave out are filled the same way for every client: language from your saved preference (Hebrew for Israeli numbers), recording from the account default, announceRecording on wherever notice is required, and live questions only when maxMinutes is 3 or more (asking for them on a shorter call is refused).
Recording follows the account default. A standard outbound request can include recording: true, recordingConsent: { allParticipants: true } only after everyone who will participate has agreed to recording. The assistant also announces recording. Recording is unavailable with hold-and-connect, translation, human handoff or inbound calls. Audio access requires the same workspace read permission as its call.
Receive the final result
Owners and admins can add up to five HTTPS webhook endpoints in Connections. Copy the signing secret, send a test, then enable result delivery. Each call.settled event contains the call ID, final status, duration, exact charge in microdollars, confirmed facts with quotes and unresolved questions. Full transcripts and audio are excluded.
Verify the raw request body before parsing or acting on it. We use Standard Webhooks headers: webhook-id, webhook-timestamp and webhook-signature. The signature is HMAC-SHA256 over id.timestamp.rawBody, using the base64-decoded secret after its whsec_ prefix. Reject timestamps outside a five-minute window and deduplicate the stable event ID.
import { Webhook } from "standardwebhooks";
const event = new Webhook(process.env.OPEN_CALLS_WEBHOOK_SECRET)
.verify(rawBody, requestHeaders);
// Persist event.id once, then return a 2xx response.We accept a 2xx response within ten seconds. Failed requests retry up to six attempts with increasing delays. Redirects and private-network destinations are refused. Delivery history shows status and attempt count. Payloads expire after seven days; delivery metadata expires after thirty days. Deleting a call cancels pending delivery of its result, but your receiving system controls copies it already received.
Pause or remove an endpoint to stop new delivery; an in-flight request may finish. Rotating its secret pauses delivery and requires a new successful test. Recent failed events can be retried from Connections with the same event ID.
Claude, Cowork and Claude Code
Add https://opencalls.dev/mcp as a custom connector in Claude (Customize › Connectors › Add custom connector; Team and Enterprise owners under Organization settings › Connectors). Keep the recommended OAuth client (Claude’s published identity) and “Sign in when needed”: the first protected tool returns a standard sign-in challenge, you approve the workspace on this site and return to Claude. Claude Code: claude mcp add --transport http open-calls https://opencalls.dev/mcp; its callback is a loopback address on your own computer. Access lasts 30 days with refresh, and is revoked from Connections. This compatibility was verified in Claude.ai on September 16, 2026 (connector added with Claude’s published identity, workspace consent, get_workspace, and Claude’s own “Authentication required · Connect” step-up for a write tool). Claude Code’s published identity and loopback callback were verified against production; the CLI flow itself is pending. The links below open the assistant with a setup prompt that points it at its own connector documentation.
Pairing: let an agent connect itself
An agent that can browse and call HTTP endpoints needs no key from the person. It starts a pairing, opens the approval page, and collects its credential once the person has signed in and approved:
POST https://opencalls.dev/api/pair {"agent":"muse"} → {code, url, interval}
open url (the person signs in with Google and approves)
GET https://opencalls.dev/api/pair/<code> → {status:"pending"} … {status:"approved", token, base_url | mcp_url}Agent ids: muse and agent receive a REST API key (calls scope, one year); manus, claude-code, n8n, zapier and make receive a bearer token for /agent/mcp. The token is delivered exactly once and erased; the request expires after fifteen minutes; starts are limited per address. The person can revoke the connection under Connections at any time.
Manus and other bearer-token MCP clients
Create an agent connection in Connections and use https://opencalls.dev/agent/mcp with Authorization: Bearer … as a request header. Manus lists tools automatically after “Add Server”. The agent audience is separate from ChatGPT/Claude OAuth tokens and from REST keys; tokens expire after 30 days and stop immediately on revocation. Give the agent a task with an explicit maximum charge; it must reuse one idempotency key when it retries.
Muse (Meta) custom connector
Muse can build a custom connector from this REST API. Start with a read-only key, enter it through Muse’s own secure credential setup (never in the conversation), have Muse call GET /api/v1/workspace first, and only then authorize a call with a stable idempotency key and maximum charge. An OpenAPI description and instruction text are in the repository package integrations/muse. Real-client acceptance is pending.
n8n, Zapier and Make
Workflow templates use this API and the signed call.settled webhook: an approved task creates one bounded call (POST with an idempotency key), the workflow polls or receives the signed result, verifies the signature and deduplicates the event ID, and writes confirmed facts, unresolved questions and the exact charge to your sheet, CRM or Slack. A webhook retry never creates another call. Templates and guides are in the repository package integrations/.
MCP access
Connect ChatGPT or Claude through workspace-bound OAuth, or create a separate MCP connection for another compatible agent. API keys and MCP tokens use separate audiences. Existing account credit funds calls; keys cannot buy credit, alter billing, create credentials or change workspace limits.