API reference
Calls
A call is one order to call one phone number with an assistant. Revox dials it inside the calling windows, calls back when nobody answers, and records each dial as an attempt with its transcript, recording and extracted data.
Endpoints
- POSTPlace a call
/callPlace an outbound call with a saved assistant (assistant_id) or a configuration for this call only (assistant). - GETGet call by ID
/call/{id}Returns a call with its status, outcome and attempts, each with its transcript, recording and extracted data. - POSTFind which phone numbers are on the do-not-call list
/calls/screen-do-not-callReturns the subset of the submitted numbers that must not be called. - POSTSearch calls
/call/searchSearch your organization's calls, most recent activity first by default. - POSTGet a link to listen to a live call and jump in
/call/{id}/live-linkReturns a short-lived web page URL for one call that is ringing or on the line. - POSTExport calls history
/call/exportExport calls as a CSV file, one line per call, selected with the filters of POST /call/search. - POSTPause a call
/call/{id}/pausePause a call waiting for its next attempt (status scheduled or initializing): nothing is dialed until POST /call/{id}/resume. - POSTResume a paused call
/call/{id}/resumeResume a previously paused call. - POSTCancel a call
/call/{id}/cancelStop a call's future attempts. - GETGet phone number history across the organization
/calls/phone-historyReturns a map of phone numbers to the number of calls and associated campaigns across the entire organization.
The Call object
One order to call one phone number with an assistant. Revox dials it inside the calling windows and calls back when nobody answers: each dial is an attempt, and a call can take several days of attempts.
Other objects
Call
{
"id": "8d2f6b1a-4c9e-4f37-b215-6a0e9c3d7f12",
"organization_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"from_phone_number": "+33199001234",
"to_phone_number": "+33612345678",
"direction": "outbound",
"channel": "phone",
"status": "completed",
"is_completed": true,
"is_cancelled": false,
"cancel_reason": null,
"retries_stopped": false,
"callback_from": null,
"calls_count": 1,
"last_call_attempt": {
"id": "c41f9a2e-7d3b-4e85-a6f0-1b2c3d4e5f60",
"phone_number": "+33612345678",
"status": "completed",
"dial_error": null,
"result": "human",
"recording_url": "https://recordings.example.com/7c9e6679-7425-40de-944b-e07fc1f90ae7.wav",
"started_at": "2026-11-09T08:30:02Z",
"answered_at": "2026-11-09T08:30:09Z",
"ended_at": "2026-11-09T08:31:47Z",
"transcript": [
{
"role": "assistant",
"content": "Bonjour Marie, ici Julie du cabinet Acme. Je vous appelle pour confirmer votre rendez-vous de jeudi à 10 heures."
},
{
"role": "user",
"content": "Oui, c'est bien noté, merci."
}
],
"post_call_transcript": [
{
"role": "assistant",
"content": "Bonjour Marie, ici Julie du cabinet Acme. Je vous appelle pour confirmer votre rendez-vous de jeudi à 10 heures."
},
{
"role": "user",
"content": "Oui, c'est bien noté, merci."
}
],
"structured_output": {
"appointment_confirmed": true,
"preferred_callback_time": null
},
"assistants_used": [
"3f6c2a1e-8b4d-4c7a-9e2f-5d1b7a9c0e34",
"b7e2d4c9-1a3f-4e6b-8d5c-2f9a0c7e1b43"
],
"assistant_names": {
"3f6c2a1e-8b4d-4c7a-9e2f-5d1b7a9c0e34": "Reception",
"b7e2d4c9-1a3f-4e6b-8d5c-2f9a0c7e1b43": "Appointment booking"
},
"ended_by": "agent",
"end_reason": "tool_end_call",
"transferred_to": null,
"handled_by_human": false,
"handled_by_ai": true,
"handled_by_user": null,
"sms_log": [
{
"id": "9b8a7c6d-5e4f-4a3b-9c2d-1e0f9a8b7c6d",
"type": "in_call",
"to_phone_number": "+33612345678",
"message_body": "Votre rendez-vous du jeudi 12 novembre à 10h au cabinet dentaire Acme est confirmé.",
"provider": "twilio",
"provider_message_id": "9b8a7c6d-5e4f-4a3b-9c2d-1e0f9a8b7c6d",
"provider_status": "delivered",
"provider_error_code": null,
"created_at": "2026-11-05T09:00:00Z"
}
],
"actions": [
{
"id": "d4c3b2a1-9e8f-4a7b-8c6d-5e4f3a2b1c0d",
"phase": "in_call",
"tool_name": "send_sms",
"arguments": {
"message": "Votre rendez-vous du jeudi 12 novembre à 10h au cabinet dentaire Acme est confirmé."
},
"status": "succeeded",
"error": null,
"created_at": "2026-11-05T09:00:00Z"
}
],
"email_log": [
{
"id": "b2d4f6a8-1c3e-4a5b-8d7f-9e0a1b2c3d4e",
"from_address": "Appointment reminders <noreply@example.com>",
"to_emails": ["jane@example.com"],
"subject": "Your appointment tomorrow",
"resend_message_id": "d4c3b2a1-9e8f-4a7b-8c6d-5e4f3a2b1c0d",
"calendar_invite_at": "2026-11-05T09:00:00Z",
"created_at": "2026-11-05T09:00:00Z"
}
]
},
"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
},
"llm_model": { "type": "recommended" },
"call_attempts": [
{
"id": "c41f9a2e-7d3b-4e85-a6f0-1b2c3d4e5f60",
"phone_number": "+33612345678",
"status": "completed",
"dial_error": null,
"result": "human",
"recording_url": "https://recordings.example.com/7c9e6679-7425-40de-944b-e07fc1f90ae7.wav",
"started_at": "2026-11-09T08:30:02Z",
"answered_at": "2026-11-09T08:30:09Z",
"ended_at": "2026-11-09T08:31:47Z",
"transcript": [
{
"role": "assistant",
"content": "Bonjour Marie, ici Julie du cabinet Acme. Je vous appelle pour confirmer votre rendez-vous de jeudi à 10 heures."
},
{
"role": "user",
"content": "Oui, c'est bien noté, merci."
}
],
"post_call_transcript": [
{
"role": "assistant",
"content": "Bonjour Marie, ici Julie du cabinet Acme. Je vous appelle pour confirmer votre rendez-vous de jeudi à 10 heures."
},
{
"role": "user",
"content": "Oui, c'est bien noté, merci."
}
],
"structured_output": {
"appointment_confirmed": true,
"preferred_callback_time": null
},
"assistants_used": [
"3f6c2a1e-8b4d-4c7a-9e2f-5d1b7a9c0e34",
"b7e2d4c9-1a3f-4e6b-8d5c-2f9a0c7e1b43"
],
"assistant_names": {
"3f6c2a1e-8b4d-4c7a-9e2f-5d1b7a9c0e34": "Reception",
"b7e2d4c9-1a3f-4e6b-8d5c-2f9a0c7e1b43": "Appointment booking"
},
"ended_by": "agent",
"end_reason": "tool_end_call",
"transferred_to": null,
"handled_by_human": false,
"handled_by_ai": true,
"handled_by_user": null,
"sms_log": [
{
"id": "9b8a7c6d-5e4f-4a3b-9c2d-1e0f9a8b7c6d",
"type": "in_call",
"to_phone_number": "+33612345678",
"message_body": "Votre rendez-vous du jeudi 12 novembre à 10h au cabinet dentaire Acme est confirmé.",
"provider": "twilio",
"provider_message_id": "9b8a7c6d-5e4f-4a3b-9c2d-1e0f9a8b7c6d",
"provider_status": "delivered",
"provider_error_code": null,
"created_at": "2026-11-05T09:00:00Z"
}
],
"actions": [
{
"id": "d4c3b2a1-9e8f-4a7b-8c6d-5e4f3a2b1c0d",
"phase": "in_call",
"tool_name": "send_sms",
"arguments": {
"message": "Votre rendez-vous du jeudi 12 novembre à 10h au cabinet dentaire Acme est confirmé."
},
"status": "succeeded",
"error": null,
"created_at": "2026-11-05T09:00:00Z"
}
],
"email_log": [
{
"id": "b2d4f6a8-1c3e-4a5b-8d7f-9e0a1b2c3d4e",
"from_address": "Appointment reminders <noreply@example.com>",
"to_emails": ["jane@example.com"],
"subject": "Your appointment tomorrow",
"resend_message_id": "d4c3b2a1-9e8f-4a7b-8c6d-5e4f3a2b1c0d",
"calendar_invite_at": "2026-11-05T09:00:00Z",
"created_at": "2026-11-05T09:00:00Z"
}
]
}
],
"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"
},
"prompt_version": {
"id": "6f9a3c1e-2b7d-4e58-9a10-3d2c4b5e6f70",
"number": 1,
"latest_number": 1
},
"campaign": {
"id": "8e1f2a3b-4c5d-4e6f-9a0b-1c2d3e4f5a6b",
"name": "Appointment reminder",
"status": "completed"
},
"scheduled_at": "2026-11-09T08:30:00Z",
"created_at": "2026-11-06T16:12:45Z",
"updated_at": "2026-11-09T08:32:20Z",
"metadata": { "crm_id": "lead_48213" },
"prompt_variables": {
"first_name": "Marie",
"company": "Acme"
},
"transfer_destinations": [
{ "label": "Main line", "phone_number": "+33612345678" }
],
"contact": {
"first_name": "Marie",
"last_name": "Martin",
"email": "jane@example.com",
"company": "Acme",
"job_title": "Office manager"
},
"first_sentence_delay_ms": 400,
"outcome": "interested",
"outcome_summary": "Marie confirmed her appointment on Thursday at 10:00 and asked for the address by text message.",
"do_not_call": false,
"assignee": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"email": "jane@example.com",
"first_name": "Marie",
"last_name": "Martin"
}
}