Call2Me
Developers

API Reference: REST endpoints, auth, OpenAPI spec

Call2Me REST API — base URL, authentication (JWT + API keys), endpoint groups (agents, calls, knowledge base, widgets, payments, webhooks), and the full OpenAPI spec.

Updated May 1, 2026

Base URL and auth

Base URL: https://api.call2me.app
OpenAPI:  https://api.call2me.app/openapi.json

Authentication:

  • JWT tokens — for the dashboard and SDK clients. Returned by POST /v1/auth/login.
  • API keys — long-lived, for server-to-server. Generate in dashboard → API Keys.

Header for both:

Authorization: Bearer <token-or-key>

Endpoint groups

Call2Me has 156 REST endpoints organized into groups:

Auth

POST /v1/auth/register     Register new user
POST /v1/auth/login        Login, returns JWT
POST /v1/auth/refresh      Refresh JWT
GET  /v1/auth/me           Current user
POST /v1/auth/logout       Logout

Agents

POST   /v1/agents          Create agent
GET    /v1/agents          List agents
GET    /v1/agents/{id}     Get agent
PATCH  /v1/agents/{id}     Update agent
DELETE /v1/agents/{id}     Delete agent
POST   /v1/agents/{id}/test-function   Test webhook function

Calls

GET    /v1/calls                List calls
GET    /v1/calls/{id}           Get call detail
POST   /v1/calls/outbound       Make outbound call
GET    /v1/calls/{id}/recording Download recording
GET    /v1/calls/{id}/transcript Get transcript

Knowledge Base

POST   /v1/knowledge-base                  Create KB
GET    /v1/knowledge-base                  List KBs
POST   /v1/knowledge-base/{id}/sources     Add source
DELETE /v1/knowledge-base/{id}/sources/{src} Delete source
POST   /v1/knowledge-base/{id}/query       Semantic search

Phone Numbers

GET    /v1/phone-numbers                List
POST   /v1/phone-numbers/buy            Buy via Telnyx
POST   /v1/phone-numbers/{id}/assign    Assign to agent
DELETE /v1/phone-numbers/{id}           Release

Widgets

POST /v1/widgets                  Create widget
GET  /v1/widgets/{id}/config      Public — config for embed
GET  /v1/widgets/{id}/embed.js    Public — runtime JS
POST /v1/widgets/{id}/chat        Public — send message
GET  /v1/widgets/{id}/preview     Public — standalone preview

Campaigns

POST /v1/campaigns                Create campaign
GET  /v1/campaigns                List
POST /v1/campaigns/{id}/upload    Upload CSV contacts
POST /v1/campaigns/{id}/start     Start dialing
POST /v1/campaigns/{id}/pause     Pause
GET  /v1/campaigns/{id}/results   Export results CSV

Schedules

POST /v1/schedules                Create scheduled call
GET  /v1/schedules                List
DELETE /v1/schedules/{id}         Cancel

Voice / LiveKit

POST /v1/livekit/token            Get LiveKit token for browser voice call
GET  /v1/livekit/health           LiveKit config check

Payments / Wallet

GET  /v1/wallet                   Current balance
POST /v1/payments/topup           Initiate top-up
GET  /v1/payments/history         Transactions
GET  /v1/pricing                  Public — current pricing

Public utility endpoints (no auth)

GET  /v1/pricing                       Pricing snapshot
GET  /v1/branding/{domain}             White-label branding lookup
POST /v1/contact                       Contact form
POST /v1/newsletter/subscribe          Newsletter signup
POST /v1/events                        Client-side event ingest
POST /v1/demo/*                        Demo call (rate-limited)

Rate limits

  • Per-user: 100 requests / minute on authenticated endpoints.
  • Per-IP on public endpoints: 30 requests / minute.
  • Webhook deliveries: retry with exponential backoff up to 3 times.

When rate-limited, you'll get a 429 Too Many Requests with a Retry-After header.

Webhooks

Configure on AgentDetail → Webhook URL. Events:

  • call.completed — call ended, full transcript + extracted fields.
  • call.transferred — agent transferred to a human.
  • call.failed — call couldn't connect.
  • campaign.completed — campaign finished.
  • payment.succeeded — top-up landed.

Payload format:

{
  "event": "call.completed",
  "id": "evt_...",
  "ts": "2026-05-01T12:34:56Z",
  "data": {
    "call_id": "call_...",
    "agent_id": "agent_...",
    "from": "+90...",
    "to": "+90...",
    "duration_seconds": 87,
    "transcript": "...",
    "extracted": { "interested": true, "callback_time": "Tuesday 14:00" }
  }
}

Verify with the HMAC signature in the X-Call2Me-Signature header.

SDKs

Official:

  • Pythonpip install call2me
  • TypeScript / JavaScriptnpm install @call2me/sdk

Both wrap the REST API with type-safe clients and handle auth refresh automatically.

OpenAPI spec

Full machine-readable schema:

https://api.call2me.app/openapi.json

Import into Postman, generate clients in any language, or browse the schema directly.

Status and uptime

  • Real-time status: status.call2me.app (where available)
  • Historical SLA: 99.9% on the API, 99.5% on voice.

Frequently asked

Q.What's the Call2Me API base URL?

https://api.call2me.app — all REST endpoints live under /v1/.

Q.How do I authenticate with the Call2Me API?

Two options: JWT tokens for browser/dashboard sessions, or long-lived API keys (Authorization: Bearer <key>) for server-to-server. Generate keys in the dashboard under API Keys.

Q.Is there an OpenAPI spec?

Yes. https://api.call2me.app/openapi.json — full machine-readable schema for all 156 endpoints under /v1/.

Q.Are there public endpoints I can hit without auth?

Yes. Pricing (/v1/pricing), demo (/v1/demo/*), branding lookup (/v1/branding/), widget embed/chat/preview, contact form, newsletter signup, and event ingest are all public and rate-limited.

ShareX / TwitterLinkedIn

Ready to ship?

Spin up your first agent in 5 minutes — $10 free credit.

Start free