Resources API

Manage numbers, call flows, voicemails, SMS, and other resources via the API.

Before you call these endpoints

1. Create an API key in Settings → API & MCP.
2. Send it as Authorization: Bearer cs_key_....
3. Use your app role to determine access: viewer = read endpoints, manager = most write endpoints, admin or owner = billing and API key management.

There is no GET /api/v1/numbers/:id endpoint. Fetch your numbers from GET /api/v1/numbers and look up the ID client-side.

Numbers endpoints

Use these endpoints to read and manage tracking numbers. The screenshot below shows the in-app Numbers table — each row is one entry in the GET /api/v1/numbers response, and the columns map directly to fields like name, total_calls, call_flow_name, created_at, status, and sms_enabled.

Numbers page table spotlighted, listing three tracking numbers (Houston Organic, Dallas FB Leads, Austin Google Ads) with columns for Number, Calls, Qualified, Call Flow, Groups, Created, Status, and SMS. The same shape is returned by GET /api/v1/numbers.
GET    /api/v1/numbers                 # List numbers (owned + assigned)
GET    /api/v1/numbers/export          # Export CSV
GET    /api/v1/numbers/bulk-stats      # Summary metrics
GET    /api/v1/numbers/{id}/stats      # Number stats
POST   /api/v1/numbers/search          # Search available numbers
POST   /api/v1/numbers/purchase        # Buy a number
PATCH  /api/v1/numbers/{id}            # Rename, reassign call flow, update status
DELETE /api/v1/numbers/{id}            # Release a number

Numbers response shape

A successful API-key request is wrapped in a data envelope:

curl -H "Authorization: Bearer cs_key_..." \
  https://callscaler.com/api/v1/numbers

{
  "data": {
    "numbers": [
      {
        "id": "uuid",
        "phone_number": "+15735551234",
        "name": "Google Ads Tampa",
        "status": "active",
        "call_flow_id": "uuid",
        "call_flow_name": "Main Sales Flow",
        "type": "local",
        "number_source": "owned",
        "total_calls": 42,
        "sms_enabled": true,
        "tcr_sw_state": "approved"
      }
    ],
    "total": 1
  }
}

Call flow endpoints

Call flows return the full config_json payload used by the editor.

GET    /api/v1/call-flows                                   # List call flows
GET    /api/v1/call-flows/{id}                              # Get one flow
GET    /api/v1/call-flows/{id}/numbers                      # List attached numbers
GET    /api/v1/call-flows/{id}/versions                     # Version history
POST   /api/v1/call-flows                                   # Create
PUT    /api/v1/call-flows/{id}                              # Update
DELETE /api/v1/call-flows/{id}                              # Delete
POST   /api/v1/call-flows/{id}/duplicate                    # Duplicate
POST   /api/v1/call-flows/{id}/versions/{version}/restore   # Restore version

Call flow example

Get a call flow and inspect its routing config:

curl -H "Authorization: Bearer cs_key_..." \
  https://callscaler.com/api/v1/call-flows/UUID

{
  "data": {
    "id": "uuid",
    "name": "Google Ads - Plumbing",
    "config_json": {
      "steps": [
        { "type": "greeting" },
        { "type": "forward", "destination": "+18135551234" }
      ]
    },
    "config_version": 7
  }
}

Messaging and conversations

Messaging endpoints are business-scoped. The sender must be one of your numbers.

GET  /api/v1/conversations             # Conversation list
GET  /api/v1/texts?contact={phone}    # Thread messages
GET  /api/v1/sms                       # SMS events
POST /api/v1/texts                     # Send outbound SMS

SMS send example

Use from_number, to_number, and body in the request JSON:

curl -X POST -H "Authorization: Bearer cs_key_..." \
  -H "Content-Type: application/json" \
  -d '{"from_number":"+15735550001","to_number":"+18135551234","body":"Thanks for calling us today."}' \
  https://callscaler.com/api/v1/texts

Phone Bridge callbacks

POST /api/v1/outbound/dial

Start a callback from your own system, for example a CRM or dispatch tool, without the agent logging in to CallScaler. CallScaler rings connect_to (the agent's phone) from the tracking number first. When the agent answers, it dials to_number (the customer) and connects the two. The customer sees the tracking number as caller ID. The call is logged as an outbound call on that number and billed per minute once for both legs, plus the recording rate when record is on.

Requires the Outbound Calling extension to be enabled, a paid plan (not available during the free trial), and a key from a manager, admin or owner.

A 403 with code: trial_locked means the account is still on the free trial. A 403 without a code means the Outbound Calling extension is off. A 404 means from_number_id is not one of your numbers.

  • •from_number_id: the id of one of your numbers from GET /api/v1/numbers
  • •to_number and connect_to: E.164 format, for example +18135551234
  • •transcribe: true turns record on as well
  • •GET /api/v1/outbound/recent lists recent outbound calls; the call also appears in GET /api/v1/calls with direction=outbound
curl -X POST -H "Authorization: Bearer cs_key_..." \
  -H "Content-Type: application/json" \
  -d '{
    "from_number_id": "uuid of your tracking number",
    "to_number": "+18135551234",
    "connect_to": "+18135559876",
    "record": true,
    "transcribe": false
  }' \
  https://callscaler.com/api/v1/outbound/dial

{
  "data": {
    "ok": true,
    "call_sid": "provider call id",
    "status": "queued"
  }
}

Other resource endpoints

These endpoints are commonly used with Resources API workflows:

  • •GET /api/v1/number-groups, POST /api/v1/number-groups, and member management endpoints
  • •GET /api/v1/number-pools, POST /api/v1/number-pools, and pool membership endpoints
  • •GET /api/v1/voicemails, GET /api/v1/voicemails/{id}, GET /api/v1/voicemails/{id}/recording
  • •GET /api/v1/forms, GET /api/v1/forms/{id}
  • •GET /api/v1/dashboard/stats for dashboard summary metrics
  • •GET /api/v1/webhooks/deliveries for post-call webhook delivery logs