Skip to main content
POST
/
api
/
v1
/
campaigns
/
{campaign_id}
/
call
# Request 1: Make a regular campaign call
curl -X POST "https://app.talkover.ai/api/v1/campaigns/campaign-uuid-1/call" \
  -H "Authorization: Bearer talq_your_environment_token_here" \
  -H "Content-Type: application/json" \
  -d '{
    "to": "+1234567890"
  }'
{
  "campaign_call": {
    "id": "call-uuid-1",
    "campaign_id": "campaign-uuid-1",
    "to": "+1234567890",
    "status": "queued",
    "scheduled_at": "2024-01-15T10:30:00Z",
    "created_at": "2024-01-15T10:30:00Z"
  },
  "campaign": {
    "id": "campaign-uuid-1",
    "name": "Q1 Outreach",
    "status": "active"
  }
}

Make a campaign call

Queues a call under a specific campaign. The call inherits the campaign’s agent, schedule, retry policy, and DNC rules. For one-off calls (not subject to campaign scheduling), use Make a call instead.

Endpoint

POST /api/v1/campaigns/{campaign_id}/call

Path parameters

campaign
string
required
The unique identifier of the campaign.

Request headers

Authorization
string
required
Bearer token for authentication. Format: Bearer talq_your_environment_token_here
Content-Type
string
required
Application JSON. Format: application/json

Request body

to
string
required
Phone number to call in E.164 format (e.g., “+1234567890”).
payload
object
Replacement variables for the campaign agent prompt. Use this to personalize the conversation with dynamic data. Keys should match placeholders in your agent’s prompt.
context
object
Custom data to be sent back to your client via webhooks. This data is not used in the conversation but will be included in all webhook events related to this call, allowing you to track and associate calls with your internal records.
is_testing
boolean
Whether this is a test call. Test calls do not consume billing credits and are excluded from analytics aggregates. Default: false.
allow_duplicates
boolean
Whether to allow placing this call even if the same to number already has an active or queued call within the campaign. When false (default), the request returns 409 Conflict with the existing call’s details so you can avoid duplicate outreach. Default: false.

Example requests

# Request 1: Make a regular campaign call
curl -X POST "https://app.talkover.ai/api/v1/campaigns/campaign-uuid-1/call" \
  -H "Authorization: Bearer talq_your_environment_token_here" \
  -H "Content-Type: application/json" \
  -d '{
    "to": "+1234567890"
  }'
# Request 2: Make a test campaign call
curl -X POST "https://app.talkover.ai/api/v1/campaigns/campaign-uuid-1/call" \
  -H "Authorization: Bearer talq_your_environment_token_here" \
  -H "Content-Type: application/json" \
  -d '{
    "to": "+1234567890",
    "is_testing": true
  }'
# Request 3: Make campaign call with payload and context
curl -X POST "https://app.talkover.ai/api/v1/campaigns/campaign-uuid-1/call" \
  -H "Authorization: Bearer talq_your_environment_token_here" \
  -H "Content-Type: application/json" \
  -d '{
    "to": "+1987654321",
    "payload": {
      "customer_name": "John Doe",
      "order_id": "12345",
      "product_name": "Premium Plan"
    },
    "context": {
      "user_id": "user_123",
      "source": "web_app",
      "campaign_batch": "2024_Q1"
    }
  }'

Response

Success Response (201 Created)

{
  "campaign_call": {
    "id": "call-uuid-1",
    "campaign_id": "campaign-uuid-1",
    "to": "+1234567890",
    "status": "queued",
    "scheduled_at": "2024-01-15T10:30:00Z",
    "created_at": "2024-01-15T10:30:00Z"
  },
  "campaign": {
    "id": "campaign-uuid-1",
    "name": "Q1 Outreach",
    "status": "active"
  }
}

Response fields

campaign_call
object
required
Details of the queued campaign call.
campaign
object
required
Summary of the parent campaign at the time the call was queued.

Error responses

409 Conflict — Duplicate Call

Returned when a call to the same to number is already active or queued in this campaign and allow_duplicates is false.
{
  "success": false,
  "message": "A call to this number already exists in this campaign",
  "existing_call": {
    "id": "call-uuid-existing",
    "campaign_id": "campaign-uuid-1",
    "to": "+1234567890",
    "status": "queued",
    "created_at": "2024-01-15T09:50:00Z"
  }
}
To override this behavior intentionally (e.g., a follow-up call), pass "allow_duplicates": true in the request body.

404 Not Found

{
  "success": false,
  "message": "Campaign not found"
}

422 Validation Error

{
  "success": false,
  "message": "The given data was invalid.",
  "errors": {
    "to": [
      "The to field is required."
    ],
    "to": [
      "The to must be a valid phone number."
    ]
  }
}

400 Bad Request

{
  "success": false,
  "message": "Campaign is not active"
}

401 Unauthorized

{
  "success": false,
  "message": "Unauthorized"
}

403 Forbidden

{
  "success": false,
  "message": "Cannot make calls for this campaign"
}

429 Too Many Requests

{
  "success": false,
  "message": "Rate limit exceeded"
}

500 Server Error

{
  "success": false,
  "message": "Internal server error."
}

Error codes

CodeDescriptionHTTP Status
CAMPAIGN_NOT_FOUNDSpecified campaign does not exist404
VALIDATION_ERRORRequest validation failed422
CAMPAIGN_NOT_ACTIVECampaign is not in active status400
DUPLICATE_CALLAn existing call to the same number is queued or active409
INVALID_TOKENAuthentication token is invalid or missing401
FORBIDDENCannot make calls for this campaign403
RATE_LIMIT_EXCEEDEDRate limit exceeded429
SERVER_ERRORInternal server error occurred500

Campaign Status Requirements

Campaign StatusCan Make CallsNotes
draftNoCampaign must be active
activeYesCalls can be made
pausedNoCampaign is paused
completedNoCampaign has finished
cancelledNoCampaign was cancelled

Important notes

Campaign context. Calls made through this endpoint are associated with the specific campaign.
Campaign settings. The call will follow the campaign’s configuration (agent, retry logic, etc.).
Test calls. Use is_testing: true for test calls that don’t count toward billing.
Active campaigns only. Calls can only be made for campaigns in “active” status.
Rate limits. Be aware of rate limits when making multiple calls.
  • Get Campaign: GET /api/v1/campaigns/{campaign_id}
  • Update Campaign Status: PATCH /api/v1/campaigns/{campaign_id}/status
  • Make a Call: POST /api/v1/calls
  • List Calls: GET /api/v1/calls
  • Get Agent Calls: GET /api/v1/agents/{agent_id}/calls