Integrate AI voice agents, calls, leads, and messaging into your apps with our simple REST API.
Generate a key from Settings → API Keys in your dashboard.
Use any HTTP client to call the API with your key.
Register webhooks to get real-time notifications.
curl -X GET https://api.boltcall.org/v1/agents \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json"All API requests require a Bearer token in the Authorization header. Generate keys in your dashboard under Settings \u2192 API Keys.
Authorization: Bearer sk_live_abc123def456...Prefixed with sk_live_. Use in production. All actions are real.
Prefixed with sk_test_. Safe for development. No calls are placed.
Keep your keys secure
Never expose API keys in client-side code or public repositories. Use environment variables and server-side requests.
https://api.boltcall.org/v1| Plan | Rate Limit | Burst |
|---|---|---|
| Starter | 60 requests / minute | 10 |
| Pro | 300 requests / minute | 50 |
| Elite | 1,000 requests / minute | 200 |
Rate limit headers (X-RateLimit-Remaining, X-RateLimit-Reset) are included in every response.
Complete list of available API endpoints organized by resource.
Create, configure, and manage your AI voice agents.
/v1/agentsList all agents in your workspace.
| Name | Type | Required | Description |
|---|---|---|---|
| page | integer | optional | Page number (default: 1) |
| limit | integer | optional | Items per page (default: 20, max: 100) |
{
"data": [
{
"id": "agent_abc123",
"name": "Front Desk Agent",
"voice_id": "voice_sarah",
"status": "active",
"phone_number": "+1234567890",
"created_at": "2025-01-15T08:30:00Z"
}
],
"meta": { "page": 1, "limit": 20, "total": 3 }
}/v1/agentsCreate a new AI agent.
| Field | Type | Required | Description |
|---|---|---|---|
| name | string | required | Display name for the agent |
| voice_id | string | required | Voice to use (see Voice Library) |
| greeting | string | optional | Custom greeting message |
| prompt | string | optional | System prompt / persona instructions |
| knowledge_base_id | string | optional | Linked knowledge base ID |
{
"id": "agent_def456",
"name": "After-Hours Agent",
"voice_id": "voice_james",
"status": "active",
"created_at": "2025-03-20T14:00:00Z"
}/v1/agents/:agent_idUpdate an existing agent.
| Field | Type | Required | Description |
|---|---|---|---|
| name | string | optional | Updated display name |
| greeting | string | optional | Updated greeting message |
| status | string | optional | "active" or "paused" |
{
"id": "agent_def456",
"name": "After-Hours Agent v2",
"status": "active",
"updated_at": "2025-03-21T10:00:00Z"
}/v1/agents/:agent_idDelete an agent. This cannot be undone.
{ "deleted": true }Access call history, recordings, and transcripts.
/v1/callsList call records with optional filters.
| Name | Type | Required | Description |
|---|---|---|---|
| agent_id | string | optional | Filter by agent |
| direction | string | optional | "inbound" or "outbound" |
| from | string | optional | ISO 8601 start date |
| to | string | optional | ISO 8601 end date |
| limit | integer | optional | Items per page (default: 20) |
{
"data": [
{
"id": "call_xyz789",
"agent_id": "agent_abc123",
"direction": "inbound",
"caller": "+1987654321",
"duration_seconds": 142,
"status": "completed",
"sentiment": "positive",
"recording_url": "https://api.boltcall.org/v1/calls/call_xyz789/recording",
"transcript_url": "https://api.boltcall.org/v1/calls/call_xyz789/transcript",
"created_at": "2025-03-20T09:15:00Z"
}
],
"meta": { "page": 1, "limit": 20, "total": 156 }
}/v1/calls/:call_idGet detailed information for a single call.
{
"id": "call_xyz789",
"agent_id": "agent_abc123",
"direction": "inbound",
"caller": "+1987654321",
"duration_seconds": 142,
"status": "completed",
"sentiment": "positive",
"summary": "Caller requested appointment for Friday.",
"tags": ["appointment", "new-customer"],
"recording_url": "https://...",
"transcript": [
{ "role": "agent", "text": "Hello, thanks for calling..." },
{ "role": "caller", "text": "Hi, I'd like to book..." }
],
"created_at": "2025-03-20T09:15:00Z"
}/v1/calls/outboundInitiate an outbound call from an agent.
| Field | Type | Required | Description |
|---|---|---|---|
| agent_id | string | required | Agent to place the call |
| to | string | required | Phone number in E.164 format |
| context | string | optional | Briefing context for the agent |
{
"id": "call_out001",
"status": "ringing",
"agent_id": "agent_abc123",
"to": "+1555000111",
"created_at": "2025-03-20T14:30:00Z"
}Manage leads captured from calls, forms, and ads.
/v1/leadsList all leads with filtering and sorting.
| Name | Type | Required | Description |
|---|---|---|---|
| status | string | optional | "new", "contacted", "qualified", "converted" |
| source | string | optional | "call", "sms", "form", "facebook", "google" |
| sort | string | optional | Field to sort by (default: created_at) |
| limit | integer | optional | Items per page (default: 20) |
{
"data": [
{
"id": "lead_001",
"name": "Jane Smith",
"phone": "+1555123456",
"email": "jane@example.com",
"status": "new",
"source": "call",
"score": 85,
"tags": ["high-intent", "dental-cleaning"],
"created_at": "2025-03-20T10:00:00Z"
}
],
"meta": { "page": 1, "limit": 20, "total": 42 }
}/v1/leadsCreate a lead manually.
| Field | Type | Required | Description |
|---|---|---|---|
| name | string | required | Full name |
| phone | string | optional | Phone number (E.164) |
| string | optional | Email address | |
| source | string | optional | Lead source label |
| tags | string[] | optional | Tags for segmentation |
{
"id": "lead_002",
"name": "John Doe",
"status": "new",
"created_at": "2025-03-20T11:30:00Z"
}Send and receive SMS, WhatsApp, and email messages.
/v1/messages/smsSend an SMS message.
| Field | Type | Required | Description |
|---|---|---|---|
| to | string | required | Recipient phone number (E.164) |
| body | string | required | Message content (max 1600 chars) |
| from_number | string | optional | Sender number (defaults to workspace number) |
{
"id": "msg_sms001",
"channel": "sms",
"status": "sent",
"to": "+1555000111",
"created_at": "2025-03-20T15:00:00Z"
}/v1/messages/whatsappSend a WhatsApp message.
| Field | Type | Required | Description |
|---|---|---|---|
| to | string | required | Recipient phone number (E.164) |
| template | string | required | Approved template name |
| variables | object | optional | Template variable values |
{
"id": "msg_wa001",
"channel": "whatsapp",
"status": "sent",
"to": "+1555000111",
"created_at": "2025-03-20T15:05:00Z"
}/v1/messagesList message history across all channels.
| Name | Type | Required | Description |
|---|---|---|---|
| channel | string | optional | "sms", "whatsapp", or "email" |
| lead_id | string | optional | Filter by lead |
| limit | integer | optional | Items per page (default: 20) |
{
"data": [
{
"id": "msg_sms001",
"channel": "sms",
"direction": "outbound",
"to": "+1555000111",
"body": "Thanks for calling! Your appointment is confirmed.",
"status": "delivered",
"created_at": "2025-03-20T15:00:00Z"
}
],
"meta": { "page": 1, "limit": 20, "total": 89 }
}Manage appointments booked by your AI agents.
/v1/appointmentsList all appointments.
| Name | Type | Required | Description |
|---|---|---|---|
| status | string | optional | "upcoming", "completed", "cancelled" |
| agent_id | string | optional | Filter by booking agent |
| from | string | optional | ISO 8601 start date |
| to | string | optional | ISO 8601 end date |
{
"data": [
{
"id": "apt_001",
"lead_id": "lead_001",
"agent_id": "agent_abc123",
"title": "Dental Cleaning",
"start_time": "2025-03-25T10:00:00Z",
"end_time": "2025-03-25T11:00:00Z",
"status": "upcoming",
"created_at": "2025-03-20T09:20:00Z"
}
],
"meta": { "page": 1, "limit": 20, "total": 12 }
}/v1/appointments/:appointment_idCancel an appointment.
{ "id": "apt_001", "status": "cancelled" }Subscribe to real-time events from your workspace.
/v1/webhooksList all registered webhook endpoints.
{
"data": [
{
"id": "wh_001",
"url": "https://yourapp.com/hooks/boltcall",
"events": ["call.completed", "lead.created"],
"status": "active",
"created_at": "2025-02-10T12:00:00Z"
}
]
}/v1/webhooksRegister a new webhook endpoint.
| Field | Type | Required | Description |
|---|---|---|---|
| url | string | required | HTTPS endpoint URL |
| events | string[] | required | Event types to subscribe to |
| secret | string | optional | Signing secret for verification |
{
"id": "wh_002",
"url": "https://yourapp.com/hooks/boltcall",
"events": ["call.completed", "lead.created", "appointment.booked"],
"status": "active",
"secret": "whsec_abc123...",
"created_at": "2025-03-20T16:00:00Z"
}/v1/webhooks/:webhook_idRemove a webhook subscription.
{ "deleted": true }Retrieve usage metrics and performance analytics.
/v1/analytics/overviewGet a summary of key metrics for a date range.
| Name | Type | Required | Description |
|---|---|---|---|
| from | string | required | ISO 8601 start date |
| to | string | required | ISO 8601 end date |
{
"period": { "from": "2025-03-01", "to": "2025-03-31" },
"calls": { "total": 487, "answered": 472, "missed": 15 },
"leads": { "captured": 89, "qualified": 34, "converted": 12 },
"messages": { "sent": 312, "delivered": 308 },
"appointments": { "booked": 56, "completed": 48, "cancelled": 8 },
"avg_response_time_seconds": 4.2
}/v1/analytics/usageGet token and minute usage for billing period.
{
"billing_period": { "from": "2025-03-01", "to": "2025-03-31" },
"minutes_used": 1243,
"minutes_limit": 2000,
"sms_sent": 312,
"sms_limit": 500,
"api_calls": 4521
}Subscribe to these events to receive real-time POST requests at your webhook URL. Each payload includes an event field and a data object with the full resource.
| Event | Description |
|---|---|
call.started | An inbound or outbound call has started |
call.completed | A call has ended (includes transcript & recording URLs) |
call.missed | An inbound call was not answered |
lead.created | A new lead was captured |
lead.updated | Lead status or details were changed |
appointment.booked | An appointment was scheduled |
appointment.cancelled | An appointment was cancelled |
message.received | An inbound SMS or WhatsApp message arrived |
message.delivered | An outbound message was delivered |
{
"event": "call.completed",
"timestamp": "2025-03-20T09:17:22Z",
"data": {
"id": "call_xyz789",
"agent_id": "agent_abc123",
"direction": "inbound",
"caller": "+1987654321",
"duration_seconds": 142,
"status": "completed",
"sentiment": "positive",
"summary": "Caller requested appointment for Friday.",
"recording_url": "https://api.boltcall.org/v1/calls/call_xyz789/recording"
}
}All errors follow a consistent structure with an HTTP status code and a JSON body.
{
"error": {
"code": "invalid_api_key",
"message": "The API key provided is invalid or expired.",
"status": 401
}
}| Status | Code | Description |
|---|---|---|
| 400 | bad_request | The request body is malformed or missing required fields. |
| 401 | invalid_api_key | API key is missing, invalid, or expired. |
| 403 | forbidden | Your key does not have permission for this resource. |
| 404 | not_found | The requested resource does not exist. |
| 409 | conflict | The resource already exists or has a conflicting state. |
| 422 | validation_error | Request data failed validation. Check the error message. |
| 429 | rate_limited | Too many requests. Back off and retry with exponential delay. |
| 500 | internal_error | Something went wrong on our end. Contact support if it persists. |
npm install @boltcall/sdkpip install boltcallWorks out of the boximport Boltcall from '@boltcall/sdk';
const client = new Boltcall({ apiKey: process.env.BOLTCALL_API_KEY });
// List agents
const agents = await client.agents.list();
console.log(agents.data);
// Initiate an outbound call
const call = await client.calls.create({
agent_id: 'agent_abc123',
to: '+1555000111',
context: 'Follow up on dental cleaning inquiry',
});
console.log('Call started:', call.id);Get your API key and start building with Boltcall in minutes. Free tier includes 100 API calls per day.
We use cookies to improve your experience
Essential cookies keep the site working. Analytics cookies help us understand how visitors use Boltcall so we can improve it.