Skip to content
Get started

Create a campaign

POST/campaigns

Create a new outbound calling campaign and launch it immediately. If scheduled_at is set, all calls will be queued until the specified time instead of starting right away.

Body ParametersJSONExpand Collapse
assistant_id: string

The ID of the assistant to use

contacts: array of object { prompt_variables, to_phone_number }

The list of contacts to call

prompt_variables: map[string]
to_phone_number: string
name: string

The name of the campaign

minLength1
call_retry_config: optional object { calling_windows, max_retry_attempts, timezone }

Override retry configuration for calls in this campaign. If not provided, uses the assistant's retry config.

calling_windows: array of object { calling_window_end_time, calling_window_start_time, retry_delay_seconds }
calling_window_end_time: string

End time for the calling window in the recipient's timezone (or timezone_override if provided). Format: 'HH:mm' (24-hour) or 'H:mma' (12-hour). Examples: '17:00', '6pm'. Default: '18:00'.

calling_window_start_time: string

Start time for the calling window in the recipient's timezone (or timezone_override if provided). Format: 'HH:mm' (24-hour) or 'H:mma' (12-hour). Examples: '09:00', '10am'. Default: '10:00'.

retry_delay_seconds: number

Delay between retry attempts in seconds. Default: 7200 (2 hours).

exclusiveMinimum0
maximum9007199254740991
max_retry_attempts: number

Maximum number of call retry attempts. Default: 3.

exclusiveMinimum0
maximum9007199254740991
timezone: optional string

Optional IANA timezone identifier to override the automatic timezone detection from phone number. If not provided, timezone is determined from the recipient's phone number country code. Examples: 'America/New_York', 'Europe/Paris'.

from_phone_number: optional string

The phone number to use for outbound calls (E.164 format, e.g., +1234567890)

max_concurrent_calls: optional number

Maximum number of concurrent calls allowed for this campaign

minimum1
scheduled_at: optional string or unknown

Schedule all calls in this campaign to start at a specific date and time (ISO 8601 format)

One of the following:
UnionMember0 = string
UnionMember1 = unknown
ReturnsExpand Collapse
campaign: object { id, assistant_id, created_at, 11 more }
id: string
assistant_id: string
created_at: unknown
is_cancelled: boolean
name: string
organization_id: string
status: "draft" or "running" or "paused" or "completed"
One of the following:
"draft"
"running"
"paused"
"completed"
updated_at: unknown
assistant: optional object { id, background_sound, calendly, 20 more }
id: string
background_sound: "audio/office.ogg"

The background sound to play during the call. Useful to give the impression that your AI agent is in an office.

calendly: object { connection_id, event_type_id }
connection_id: string

The connection ID representing the link between your Calendly account and Revox.

event_type_id: string

The event type ID representing the event type to schedule. (eg: https://api.calendly.com/event_types/b2330295-2a91-4a1d-bb73-99e7707663d5)

call_retry_config: object { calling_windows, max_retry_attempts, timezone }

Configuration for call retry behavior including time windows, delays, and max iterations. If not provided, defaults will be used.

calling_windows: array of object { calling_window_end_time, calling_window_start_time, retry_delay_seconds }
calling_window_end_time: string

End time for the calling window in the recipient's timezone (or timezone_override if provided). Format: 'HH:mm' (24-hour) or 'H:mma' (12-hour). Examples: '17:00', '6pm'. Default: '18:00'.

calling_window_start_time: string

Start time for the calling window in the recipient's timezone (or timezone_override if provided). Format: 'HH:mm' (24-hour) or 'H:mma' (12-hour). Examples: '09:00', '10am'. Default: '10:00'.

retry_delay_seconds: number

Delay between retry attempts in seconds. Default: 7200 (2 hours).

exclusiveMinimum0
maximum9007199254740991
max_retry_attempts: number

Maximum number of call retry attempts. Default: 3.

exclusiveMinimum0
maximum9007199254740991
timezone: optional string

Optional IANA timezone identifier to override the automatic timezone detection from phone number. If not provided, timezone is determined from the recipient's phone number country code. Examples: 'America/New_York', 'Europe/Paris'.

created_at: unknown
end_of_call_sentence: string
first_sentence: string
first_sentence_delay_ms: number

Delay in milliseconds before speaking the first sentence. Default: 400.

minimum-9007199254740991
maximum9007199254740991
first_sentence_mode: "generated" or "static" or "none"
One of the following:
"generated"
"static"
"none"
ivr_navigation_enabled: boolean

Enable IVR navigation tools. When enabled, the assistant can send DTMF tones and skip turns to navigate phone menus.

llm_model: object { name, type } or object { openrouter_model_id, openrouter_provider, type }
One of the following:
UnionMember0 = object { name, type }
name: "gpt-4.1" or "ministral-3-8b-instruct"
One of the following:
"gpt-4.1"
"ministral-3-8b-instruct"
type: "dedicated-instance"
UnionMember1 = object { openrouter_model_id, openrouter_provider, type }
openrouter_model_id: string

The model ID to use from OpenRouter. eg: openai/gpt-4.1

openrouter_provider: string

The provider to use from OpenRouter. eg: nebius, openai, azure, etc.

type: "openrouter"

Use a model from OpenRouter.

max_call_duration_secs: number

The maximum duration of the call in seconds. This is the maximum time the call will be allowed to run.

name: string
organization_id: string
prompt: string
structured_output_config: array of object { name, required, type, 2 more }

The structured output config to use for the call. This is used to extract the data from the call (like email, name, company name, etc.).

name: string
minLength1
required: boolean
type: "string" or "number" or "boolean" or 3 more
One of the following:
"string"
"number"
"boolean"
"enum"
"date"
"datetime"
description: optional string
enum_options: optional array of string
transfer_phone_number: string

Phone number to transfer calls to when users request to speak to a human agent.

updated_at: unknown
voice: object { id, provider, speed }
id: string

The ID of the voice.

minLength1
provider: "cartesia" or "elevenlabs"

The provider of the voice.

One of the following:
"cartesia"
"elevenlabs"
speed: optional number

The speed of the voice. Range depends on provider: Cartesia 0.6–1.5, ElevenLabs 0.7–1.2. Default is 1.0.

minimum0.6
maximum1.5
voicemail_message: string

If set, when voicemail is detected the agent will speak this message then hang up; if null, hang up immediately.

webhook_url: string

The webhook URL to call when the call is completed.

faq_items: optional array of object { answer, question, id, 2 more }
answer: string
question: string
id: optional string
needs_human_answer: optional boolean
source: optional "human" or "ai"
One of the following:
"human"
"ai"
pending_faq_count: optional number
call_retry_config: optional object { calling_windows, max_retry_attempts, timezone }

Configuration for call retry behavior including time windows, delays, and max iterations. If not provided, defaults will be used.

calling_windows: array of object { calling_window_end_time, calling_window_start_time, retry_delay_seconds }
calling_window_end_time: string

End time for the calling window in the recipient's timezone (or timezone_override if provided). Format: 'HH:mm' (24-hour) or 'H:mma' (12-hour). Examples: '17:00', '6pm'. Default: '18:00'.

calling_window_start_time: string

Start time for the calling window in the recipient's timezone (or timezone_override if provided). Format: 'HH:mm' (24-hour) or 'H:mma' (12-hour). Examples: '09:00', '10am'. Default: '10:00'.

retry_delay_seconds: number

Delay between retry attempts in seconds. Default: 7200 (2 hours).

exclusiveMinimum0
maximum9007199254740991
max_retry_attempts: number

Maximum number of call retry attempts. Default: 3.

exclusiveMinimum0
maximum9007199254740991
timezone: optional string

Optional IANA timezone identifier to override the automatic timezone detection from phone number. If not provided, timezone is determined from the recipient's phone number country code. Examples: 'America/New_York', 'Europe/Paris'.

from_phone_number: optional string
max_concurrent_calls: optional number
row_stats: optional object { calling, completed, failed, 3 more }
calling: number
completed: number
failed: number
pending: number
retry: number
total: number
scheduled_at: optional unknown

Create a campaign

curl https://www.getrevox.com/api/campaigns \
    -H 'Content-Type: application/json' \
    -H "Authorization: Bearer $REVOX_API_KEY" \
    -d '{
          "assistant_id": "assistant_id",
          "contacts": [
            {
              "prompt_variables": {
                "foo": "string"
              },
              "to_phone_number": "to_phone_number"
            }
          ],
          "name": "x"
        }'
{
  "campaign": {
    "id": "id",
    "assistant_id": "assistant_id",
    "created_at": {},
    "is_cancelled": true,
    "name": "name",
    "organization_id": "organization_id",
    "status": "draft",
    "updated_at": {},
    "assistant": {
      "id": "id",
      "background_sound": "audio/office.ogg",
      "calendly": {
        "connection_id": "connection_id",
        "event_type_id": "event_type_id"
      },
      "call_retry_config": {
        "calling_windows": [
          {
            "calling_window_end_time": "calling_window_end_time",
            "calling_window_start_time": "calling_window_start_time",
            "retry_delay_seconds": 1
          }
        ],
        "max_retry_attempts": 1,
        "timezone": "timezone"
      },
      "created_at": {},
      "end_of_call_sentence": "end_of_call_sentence",
      "first_sentence": "first_sentence",
      "first_sentence_delay_ms": -9007199254740991,
      "first_sentence_mode": "generated",
      "ivr_navigation_enabled": true,
      "llm_model": {
        "name": "gpt-4.1",
        "type": "dedicated-instance"
      },
      "max_call_duration_secs": 0,
      "name": "name",
      "organization_id": "organization_id",
      "prompt": "prompt",
      "structured_output_config": [
        {
          "name": "x",
          "required": true,
          "type": "string",
          "description": "description",
          "enum_options": [
            "string"
          ]
        }
      ],
      "transfer_phone_number": "transfer_phone_number",
      "updated_at": {},
      "voice": {
        "id": "x",
        "provider": "cartesia",
        "speed": 0.6
      },
      "voicemail_message": "voicemail_message",
      "webhook_url": "webhook_url",
      "faq_items": [
        {
          "answer": "answer",
          "question": "question",
          "id": "id",
          "needs_human_answer": true,
          "source": "human"
        }
      ],
      "pending_faq_count": 0
    },
    "call_retry_config": {
      "calling_windows": [
        {
          "calling_window_end_time": "calling_window_end_time",
          "calling_window_start_time": "calling_window_start_time",
          "retry_delay_seconds": 1
        }
      ],
      "max_retry_attempts": 1,
      "timezone": "timezone"
    },
    "from_phone_number": "from_phone_number",
    "max_concurrent_calls": 0,
    "row_stats": {
      "calling": 0,
      "completed": 0,
      "failed": 0,
      "pending": 0,
      "retry": 0,
      "total": 0
    },
    "scheduled_at": {}
  }
}
Returns Examples
{
  "campaign": {
    "id": "id",
    "assistant_id": "assistant_id",
    "created_at": {},
    "is_cancelled": true,
    "name": "name",
    "organization_id": "organization_id",
    "status": "draft",
    "updated_at": {},
    "assistant": {
      "id": "id",
      "background_sound": "audio/office.ogg",
      "calendly": {
        "connection_id": "connection_id",
        "event_type_id": "event_type_id"
      },
      "call_retry_config": {
        "calling_windows": [
          {
            "calling_window_end_time": "calling_window_end_time",
            "calling_window_start_time": "calling_window_start_time",
            "retry_delay_seconds": 1
          }
        ],
        "max_retry_attempts": 1,
        "timezone": "timezone"
      },
      "created_at": {},
      "end_of_call_sentence": "end_of_call_sentence",
      "first_sentence": "first_sentence",
      "first_sentence_delay_ms": -9007199254740991,
      "first_sentence_mode": "generated",
      "ivr_navigation_enabled": true,
      "llm_model": {
        "name": "gpt-4.1",
        "type": "dedicated-instance"
      },
      "max_call_duration_secs": 0,
      "name": "name",
      "organization_id": "organization_id",
      "prompt": "prompt",
      "structured_output_config": [
        {
          "name": "x",
          "required": true,
          "type": "string",
          "description": "description",
          "enum_options": [
            "string"
          ]
        }
      ],
      "transfer_phone_number": "transfer_phone_number",
      "updated_at": {},
      "voice": {
        "id": "x",
        "provider": "cartesia",
        "speed": 0.6
      },
      "voicemail_message": "voicemail_message",
      "webhook_url": "webhook_url",
      "faq_items": [
        {
          "answer": "answer",
          "question": "question",
          "id": "id",
          "needs_human_answer": true,
          "source": "human"
        }
      ],
      "pending_faq_count": 0
    },
    "call_retry_config": {
      "calling_windows": [
        {
          "calling_window_end_time": "calling_window_end_time",
          "calling_window_start_time": "calling_window_start_time",
          "retry_delay_seconds": 1
        }
      ],
      "max_retry_attempts": 1,
      "timezone": "timezone"
    },
    "from_phone_number": "from_phone_number",
    "max_concurrent_calls": 0,
    "row_stats": {
      "calling": 0,
      "completed": 0,
      "failed": 0,
      "pending": 0,
      "retry": 0,
      "total": 0
    },
    "scheduled_at": {}
  }
}