API reference

POST /v1/calls · Place a call

The callback bridge: Spoofey rings your own number (agent) first, then connects the destination showing the caller_id you choose. It's the same call you'd place from the dashboard, billed to the same balance. New to the API? Start with Getting started with the Spoofey API.

Request

text
POST https://api.spoofey.com/v1/calls
Field Required Notes
agent yes The number to ring first. Should be a phone you control.
destination yes The number to connect once you answer.
caller_id yes What the destination sees ring in. Can't be the same number as destination. Some numbers can never be shown; it's checked against the same safety list as a dashboard call.
caller_id_name no A caller-ID name to send alongside the number. Best-effort. Many carriers show their own directory name anyway.
record no true to keep a recording you can play back later.

Example

bash
curl https://api.spoofey.com/v1/calls \
  -H "Authorization: Bearer sk_live_..." \
  -H "Content-Type: application/json" \
  -d '{"agent":"15195551234","destination":"14165557890","caller_id":"18005551234"}'

Response

Returns 200 as soon as the call is placed, before it connects:

json
{
  "id": "9f2c1a7e-4b3d-4e2a-8f11-2b6a7c9d0e12",
  "status": "calling",
  "agent": "15195551234",
  "destination": "14165557890",
  "caller_id": "18005551234",
  "caller_id_name": null,
  "minutes_remaining": 42.5,
  "business_call": false
}

The response only tells you the call was placed, not how it went. Poll GET /v1/calls/:id with its id to follow it.

Errors

Errors come back as {"error":{"message":"...","code":"..."}}. See API errors and rate limits for every status code and the rate limit. A rejected call never touches your balance.

Was this helpful?Your answer helps us improve this page.
Still stuck?Ask Spoofey AI about your exact case, or a person on our team will reply by email.
Last modified on September 25, 2026 · 1 min read
Edit