Integrate AI voice agents, calls, leads, and messaging into your apps with our simple REST API.
This documentation is a complete guide to integrating Boltcall's REST API — authenticate with a key, trigger AI voice agents, and manage calls, leads, and messaging directly from your own systems.
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.