API reference
Campaigns
A campaign calls a list of contacts with one assistant: Revox paces the calls, retries them inside the calling windows and keeps the campaign's statistics.
Endpoints
- POSTCreate a campaign
/campaignsCreate an outbound calling campaign. - GETGet campaign by ID
/campaigns/{id}Retrieve the full details of a single campaign by its unique ID. - GETList campaigns
/campaignsRetrieve all campaigns for your organization, including both active and completed ones. - PATCHUpdate a campaign
/campaigns/{id}Update a campaign's name, outbound number, retry configuration (calling hours, retry delay, max attempts) and concurrency cap. - DELETEDelete a campaign
/campaigns/{id}Permanently delete a campaign and all its associated rows. - POSTLaunch a campaign's calls
/campaigns/{id}/launch-callsSend the campaign's calls matching a selection. - POSTCancel a campaign
/campaigns/{id}/cancelCancel a running or scheduled campaign. - POSTPause a running campaign
/campaigns/{id}/pausePause a running campaign so no further calls are placed. - POSTResume a paused campaign
/campaigns/{id}/resumeResume a paused campaign. - GETExport campaign rows
/campaigns/{id}/exportExport all rows of a campaign as a CSV file for offline analysis or reporting. - GETGet campaign statistics
/campaigns/{id}/statisticsCampaign report: a four-step funnel (contacts called, reached, real conversations, hot leads), the calling effort, inbound calls, the calls your team joined live, the outcome breakdown and the hot leads to follow up. - POSTAdd contacts to a campaign
/campaigns/{id}/rowsAppend contacts to an existing campaign. - GETGet campaign rows
/campaigns/{id}/rowsRetrieve all contact rows for a campaign.
The Campaign object
A list of contacts called by one assistant, with its calling windows, retries and concurrency cap, and where its contacts stand.
Campaign
{
"id": "9b2d7e41-6c3f-4a8e-b5d0-2f7a1c9e4b63",
"organization_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "November reminders",
"assistant_id": "3f6c2a1e-8b4d-4c7a-9e2f-5d1b7a9c0e34",
"assistant": {
"id": "3f6c2a1e-8b4d-4c7a-9e2f-5d1b7a9c0e34",
"prompt": "You are Julie from Acme. You call {{first_name}} to confirm tomorrow's appointment.",
"post_call_prompt": "Send the appointment address by SMS if asked.",
"first_sentence": "Hello {{first_name}}, this is Julie from Acme.",
"first_sentence_mode": "generated",
"end_of_call_sentence": "Thank you, have a good day.",
"voice": {
"provider": "cartesia",
"id": "4325f426-c4e0-418e-a0e5-97fcdfcdf8e6",
"speed": 1,
"volume": 1,
"model": "sonic-3"
},
"voice_languages": [
{
"language": "en",
"voice": {
"provider": "cartesia",
"id": "4325f426-c4e0-418e-a0e5-97fcdfcdf8e6",
"speed": 1,
"volume": 1,
"model": "sonic-3"
}
}
],
"cartesia_dictionary_pronunciation_id": "6f9a3c1e-2b7d-4e58-9a10-3d2c4b5e6f70",
"llm_model": { "type": "recommended" },
"webhook_url": "https://example.com/revox-webhook",
"max_call_duration_secs": 600,
"max_duration_end_message": "Thank you, have a good day.",
"structured_output_config": [
{
"name": "budget",
"type": "string",
"description": "Books a slot in the agenda.",
"required": false,
"enum_options": ["enum option"]
}
],
"structured_output_prompt": "Send the appointment address by SMS if asked.",
"call_retry_config": {
"calling_windows": [
{
"calling_window_start_time": "09:00",
"calling_window_end_time": "18:00",
"retry_delay_seconds": 7200
}
],
"max_retry_attempts": 1,
"allowed_days": [
"monday",
"tuesday",
"wednesday",
"thursday",
"friday"
],
"excluded_dates": ["2026-11-05"],
"call_twice_in_a_row": false
},
"timezone": "Europe/Paris",
"background_sound": "audio/office.ogg",
"background_sound_volume": 1,
"thinking_sound": "city-ambience.ogg",
"thinking_sound_volume": 1,
"thinking_sound_probability": 0,
"transfer_destinations": [
{ "label": "Main line", "phone_number": "+33612345678" }
],
"human_transfer_mode": "warm",
"warm_transfer_summary_instructions": "Send the appointment address by SMS if asked.",
"warm_transfer_voice_speed": 1,
"ivr_navigation_enabled": true,
"voicemail_message": "Thank you, have a good day.",
"stt_context": {
"general": [{ "key": "crm_id", "value": "lead_8812" }],
"terms": ["term"]
},
"stt_model": "stt-rt-v4",
"first_sentence_delay_ms": 400,
"calendars": [
{
"id": "b2d4f6a8-1c3e-4a5b-8d7f-9e0a1b2c3d4e",
"assistant_id": "3f6c2a1e-8b4d-4c7a-9e2f-5d1b7a9c0e34",
"handle": "google_calendar_jane_at_example.com",
"provider": "google-calendar",
"status": "ready",
"connection": {
"provider": "google-calendar",
"connection_id": "9b8a7c6d-5e4f-4a3b-9c2d-1e0f9a8b7c6d",
"settings": {
"calendar_id": "primary",
"time_zone": "Europe/Paris",
"duration_minutes": 30,
"days": [1, 2, 3, 4, 5],
"start_time": "09:00",
"end_time": "18:00",
"google_meet": false,
"location": "{{site_address}}"
}
},
"account_label": "Main line",
"connected_via_invite": false,
"invite": {
"url": "https://example.com",
"status": "completed",
"created_at": "2026-11-05T09:00:00Z",
"expires_at": "2026-11-05T09:00:00Z"
},
"created_at": "2026-11-05T09:00:00Z"
}
],
"calendly": null,
"cal": null,
"google_calendar": null,
"hubspot": {
"connection_id": "9b8a7c6d-5e4f-4a3b-9c2d-1e0f9a8b7c6d",
"precall_lookup_enabled": true,
"meeting_links": [
{
"slug": "jane-martin",
"label": "Main line",
"duration_ms": 1800000,
"is_fallback": false,
"booking_url": "https://example.com"
}
],
"post_call_sync": {
"enabled": true,
"field_mapping": [
{ "source": "email", "hubspot_property": "email" }
]
}
},
"slack": {
"connection_id": "9b8a7c6d-5e4f-4a3b-9c2d-1e0f9a8b7c6d",
"channels": [
{
"id": "b2d4f6a8-1c3e-4a5b-8d7f-9e0a1b2c3d4e",
"name": "Appointment reminder"
}
]
},
"teams": {
"connection_id": "9b8a7c6d-5e4f-4a3b-9c2d-1e0f9a8b7c6d",
"channels": [
{
"id": "b2d4f6a8-1c3e-4a5b-8d7f-9e0a1b2c3d4e",
"name": "Appointment reminder",
"team_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"team_name": "Sales"
}
]
},
"zoho": {
"connection_id": "9b8a7c6d-5e4f-4a3b-9c2d-1e0f9a8b7c6d",
"module": "Leads",
"log_call_activity": false,
"field_mapping": [
{ "source": "email", "zoho_field": "Email" }
],
"template": "{{outcome}}: {{summary}}\n{{call_url}}"
},
"custom_tools": [
{
"name": "appointment_reminder",
"description": "Books a slot in the agenda.",
"method": "GET",
"url": "https://example.com",
"headers": [{ "key": "crm_id", "value": "lead_8812" }],
"query_params": [
{ "key": "crm_id", "value": "lead_8812" }
],
"body_template": "{\"email\": \"{{email}}\", \"name\": \"{{first_name}}\"}",
"input_schema": [
{
"name": "budget",
"type": "string",
"description": "Books a slot in the agenda.",
"required": false,
"enum_options": ["enum option"]
}
]
}
],
"from_phone_number": "+33187654321",
"demo_page_url": "https://example.com",
"precall_lookup_url": "https://example.com",
"precall_lookup_headers": [
{ "key": "crm_id", "value": "lead_8812" }
],
"organization_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "Appointment reminders",
"is_inbound_receptionist": false,
"created_by": {
"id": "5a7c9e1b-3d5f-4a2c-8e6b-0f1a2b3c4d5e",
"email": "jane@example.com",
"first_name": "Marie",
"last_name": "Martin"
},
"created_at": "2026-11-05T09:00:00Z",
"updated_at": "2026-11-05T09:02:41Z"
},
"from_phone_number": "+33187654321",
"max_concurrent_calls": 1,
"call_retry_config": {
"calling_windows": [
{
"calling_window_start_time": "09:00",
"calling_window_end_time": "18:00",
"retry_delay_seconds": 7200
}
],
"max_retry_attempts": 1,
"allowed_days": [
"monday",
"tuesday",
"wednesday",
"thursday",
"friday"
],
"excluded_dates": ["2026-11-05"],
"call_twice_in_a_row": false
},
"timezone": "Europe/Paris",
"status": "completed",
"is_cancelled": false,
"row_stats": {
"not_launched": 1,
"skipped": 1,
"pending": 1,
"calling": 1,
"retry": 1,
"completed": 1,
"failed": 1,
"total": 3
},
"metadata_keys": ["metadata key"],
"funnel_stats": {
"total_leads": 1,
"hot": 1,
"talked_to_human": 1
},
"created_by": {
"id": "6f9a3c1e-2b7d-4e58-9a10-3d2c4b5e6f70",
"email": "jane@example.com",
"first_name": "Marie",
"last_name": "Martin"
},
"created_at": "2026-11-05T09:00:00Z",
"updated_at": "2026-11-05T09:02:41Z"
}