openapi: 3.2.0 info: title: Explorer Campaign API description: The entire API V2 documentation is interactive and can be tested here. To the right side of every endpoint you will see a box with an example request. You can click on the "Try it" button to send a request to the server right from the docs. You will need to provide an API key by clicking the `ApiKeyAuth_token` blue text. version: 2.0.0 servers: - url: https://api.instantly.ai description: Instantly API Server security: - ApiKeyAuth: [] tags: - name: Campaign description: A campaign that can be sent to a list of recipients x-group: Campaign paths: /api/v2/campaigns: post: operationId: createCampaign summary: Create campaign tags: - Campaign description: 'Requires one of the following scopes: `campaigns:create`, `campaigns:all`, `all:create`, `all:all`' requestBody: content: application/json: schema: title: CreateCampaign description: The Campaign to create type: object properties: name: type: string description: Name of the campaign example: My First Campaign pl_value: type: - number - 'null' description: Value of every positive lead example: 100 is_evergreen: type: - boolean - 'null' description: Whether the campaign is evergreen example: false campaign_schedule: type: object description: Campaign schedule properties: start_date: type: - string - 'null' format: date description: Start date in YYYY-MM-DD format. Uses the campaign's timezone. example: '2025-09-25' end_date: type: - string - 'null' format: date description: End date in YYYY-MM-DD format. Uses the campaign's timezone. example: '2025-09-25' schedules: type: array items: type: object properties: name: type: string example: My Schedule timing: type: object properties: from: type: string pattern: ^([01][0-9]|2[0-3]):([0-5][0-9])$ example: 09:00 to: type: string pattern: ^([01][0-9]|2[0-3]):([0-5][0-9])$ example: '17:00' required: - from - to days: type: object minProperties: 1 properties: '0': type: boolean example: true '1': type: boolean example: true '2': type: boolean example: true '3': type: boolean example: true '4': type: boolean example: true '5': type: boolean example: false '6': type: boolean example: false timezone: type: string enum: - Etc/GMT+12 - Etc/GMT+11 - Etc/GMT+10 - America/Anchorage - America/Dawson - America/Creston - America/Chihuahua - America/Boise - America/Belize - America/Chicago - America/Bahia_Banderas - America/Regina - America/Bogota - America/Detroit - America/Indiana/Marengo - America/Caracas - America/Asuncion - America/Glace_Bay - America/Campo_Grande - America/Anguilla - America/Santiago - America/St_Johns - America/Sao_Paulo - America/Argentina/La_Rioja - America/Araguaina - America/Godthab - America/Montevideo - America/Bahia - America/Noronha - America/Scoresbysund - Atlantic/Cape_Verde - Africa/Casablanca - America/Danmarkshavn - Europe/Isle_of_Man - Atlantic/Canary - Africa/Abidjan - Arctic/Longyearbyen - Europe/Belgrade - Africa/Ceuta - Europe/Sarajevo - Africa/Algiers - Africa/Windhoek - Asia/Nicosia - Asia/Beirut - Africa/Cairo - Asia/Damascus - Europe/Bucharest - Africa/Blantyre - Europe/Helsinki - Europe/Istanbul - Asia/Jerusalem - Africa/Tripoli - Asia/Amman - Asia/Baghdad - Europe/Kaliningrad - Asia/Aden - Africa/Addis_Ababa - Europe/Kirov - Europe/Astrakhan - Asia/Tehran - Asia/Dubai - Asia/Baku - Indian/Mahe - Asia/Tbilisi - Asia/Yerevan - Asia/Kabul - Antarctica/Mawson - Asia/Yekaterinburg - Asia/Karachi - Asia/Kolkata - Asia/Colombo - Asia/Kathmandu - Antarctica/Vostok - Asia/Dhaka - Asia/Rangoon - Antarctica/Davis - Asia/Novokuznetsk - Asia/Hong_Kong - Asia/Krasnoyarsk - Asia/Brunei - Australia/Perth - Asia/Taipei - Asia/Choibalsan - Asia/Irkutsk - Asia/Dili - Asia/Pyongyang - Australia/Adelaide - Australia/Darwin - Australia/Brisbane - Australia/Melbourne - Antarctica/DumontDUrville - Australia/Currie - Asia/Chita - Antarctica/Macquarie - Asia/Sakhalin - Pacific/Auckland - Etc/GMT-12 - Pacific/Fiji - Asia/Anadyr - Asia/Kamchatka - Etc/GMT-13 - Pacific/Apia example: Etc/GMT+12 required: - name - timing - days - timezone minItems: 1 required: - schedules sequences: type: array description: List of sequences (the actual email copy). Even though this field is an array, only the first element is used, so please provide only one array item, and add the steps to that array items: type: object properties: steps: type: array items: type: object properties: type: type: string enum: - email x-enumDescriptions: email: This steps represents an email description: Type of step. This has to be 'email' always - it's the only supported type for now example: email delay: type: number description: The delay value before sending the NEXT email. The unit is determined by the delay_unit field (defaults to days). example: 2 delay_unit: type: string enum: - minutes - hours - days default: days description: The unit of time for the delay value (minutes, hours, or days). Defaults to days for backward compatibility. example: days pre_delay: type: number description: The delay value before sending the FIRST email in a subsequence. **Only applicable to subsequences** - this field is ignored for regular campaigns. The unit is determined by the pre_delay_unit field (defaults to days). example: 2 pre_delay_unit: type: string enum: - minutes - hours - days default: days description: The unit of time for the pre_delay value (minutes, hours, or days). **Only applicable to subsequences** - this field is ignored for regular campaigns. Defaults to days for backward compatibility. example: days variants: type: array items: type: object properties: subject: type: string example: Hello {{firstName}} body: type: string description: Email body HTML. Use `
` tags for delivered email line breaks. example: Hey {{firstName}},

I hope you are doing well. v_disabled: type: boolean description: Whether this variant is disabled. By default, all the variants are enabled. Please set this to true if you want to disable this variant example: true required: - subject - body required: - type - delay - variants required: - steps email_gap: type: - number - 'null' description: The gap between emails in minutes example: 10 random_wait_max: type: - number - 'null' description: The maximum random wait time in minutes example: 10 text_only: type: - boolean - 'null' description: Whether the campaign is text only example: false first_email_text_only: type: - boolean - 'null' description: Whether the campaign is send the first email as a text only example: false email_list: type: array description: List of accounts to use for sending emails items: type: string example: john@doe.com daily_limit: type: - number - 'null' description: The daily limit for sending emails example: 100 stop_on_reply: type: - boolean - 'null' description: Whether to stop the campaign on reply example: false email_tag_list: type: array description: List of tags to use for sending emails items: type: string format: uuid example: 019ffad2-5c4b-761a-9bc4-059ac4b3a8a9 link_tracking: type: - boolean - 'null' description: Whether to track links in emails example: true open_tracking: type: boolean description: Whether to track opens in emails example: true stop_on_auto_reply: type: - boolean - 'null' description: Whether to stop the campaign on auto reply example: false daily_max_leads: type: - integer - 'null' description: The daily maximum new leads to contact minimum: 0 example: 100 prioritize_new_leads: type: - boolean - 'null' description: Whether to prioritize new leads example: false auto_variant_select: type: - object - 'null' description: Auto variant select settings properties: trigger: type: string enum: - reply_rate - click_rate - open_rate examples: - click_rate example: click_rate required: - trigger match_lead_esp: type: - boolean - 'null' description: Whether to match leads by ESP example: false stop_for_company: type: - boolean - 'null' description: Whether to stop the campaign for the entire company(domain) when a lead replies example: false insert_unsubscribe_header: type: - boolean - 'null' description: Whether to insert an unsubscribe header in emails example: false allow_risky_contacts: type: - boolean - 'null' description: Whether to allow risky contacts example: false disable_bounce_protect: type: - boolean - 'null' description: Whether to disable bounce protection example: false limit_emails_per_company_override: type: - object - 'null' description: Overrides the workspace-wide limit emails per company setting for this campaign. properties: mode: type: string enum: - custom - disabled examples: - custom example: custom daily_limit: type: number minimum: 1 examples: - 3 example: 3 scope: type: string enum: - per_campaign - across_workspace examples: - per_campaign example: per_campaign required: - mode cc_list: type: array description: List of accounts to CC on emails items: type: string format: email example: john@doe.com bcc_list: type: array description: List of accounts to BCC on emails items: type: string format: email example: john@doe.com owned_by: type: - string - 'null' description: Owner ID format: uuid example: 019ffad2-5c4b-761a-9bc4-059c036e479a ai_sdr_id: type: - string - 'null' description: AI Sales Agent ID that created this campaign format: uuid example: 019ffad2-5c4b-761a-9bc4-059dc9a58653 provider_routing_rules: type: array description: Auto variant select settings items: type: object properties: action: type: string enum: - send - do_not_send example: send recipient_esp: type: array items: type: string enum: - all - google - outlook - other example: all sender_esp: type: array items: type: string enum: - all - google - outlook - other example: all required: - action - recipient_esp - sender_esp required: - name - campaign_schedule additionalProperties: false required: true description: The Campaign to create responses: '200': description: The Campaign content: application/json: schema: $ref: '#/components/schemas/Campaign' '400': description: Invalid request body (e.g. missing required fields, or invalid field values) content: application/json: schema: type: object properties: statusCode: type: number enum: - 400 examples: - 400 example: 400 error: type: string enum: - Bad Request examples: - Bad Request example: Bad Request message: type: string examples: - body must have required property 'name' example: body must have required property 'name' required: - statusCode - error - message '401': description: This request is unauthorized (either the Authorization header is missing or invalid, or the API key has been revoked) content: application/json: schema: type: object properties: statusCode: type: number enum: - 401 examples: - 401 example: 401 error: type: string enum: - Unauthorized examples: - Unauthorized example: Unauthorized message: type: string examples: - Missing Authorization header example: Missing Authorization header required: - statusCode - error - message '402': description: This request cannot be fulfilled because the workspace does not have an active paid plan content: application/json: schema: type: object properties: statusCode: type: number enum: - 402 examples: - 402 example: 402 error: type: string enum: - Payment Required examples: - Payment Required example: Payment Required message: type: string examples: - Workspace does not have an active paid plan example: Workspace does not have an active paid plan required: - statusCode - error - message '404': description: The requested resource was not found content: application/json: schema: type: object properties: statusCode: type: number enum: - 404 examples: - 404 example: 404 error: type: string enum: - Not Found examples: - Not Found example: Not Found message: type: string examples: - Resource not found example: Resource not found required: - statusCode - error - message '429': description: You have exceeded the rate limit. Please check the rate limit docs for more information. content: application/json: schema: type: object properties: statusCode: type: number enum: - 429 examples: - 429 example: 429 error: type: string enum: - Too Many Requests examples: - Too Many Requests example: Too Many Requests message: type: string examples: - Rate limit exceeded example: Rate limit exceeded required: - statusCode - error - message get: operationId: listCampaign summary: List campaign tags: - Campaign description: 'Requires one of the following scopes: `campaigns:read`, `campaigns:all`, `all:read`, `all:all`' parameters: - schema: type: integer minimum: 1 maximum: 100 example: 10 example: 10 in: query name: limit required: false description: The number of items to return - schema: type: string example: 01956fbd-0eb1-72db-a565-82977a586084 example: 01956fbd-0eb1-72db-a565-82977a586084 in: query name: starting_after required: false description: The ID of the last item in the previous page - used for pagination. You can use the value of the `next_starting_after` field from the previous response. - schema: type: string example: Summer Sale Campaign example: Summer Sale Campaign in: query name: search required: false description: Search by campaign name - schema: type: string example: 019ffad2-9b9f-79cc-82ca-2b31778b13de,019ffad2-9b9f-79cc-82ca-2b3271f21ade example: 019ffad2-9b9f-79cc-82ca-2b31778b13de,019ffad2-9b9f-79cc-82ca-2b3271f21ade in: query name: tag_ids required: false description: Filter campaigns by tag ids. Returns campaigns that have any of the specified tags assigned. You can specify multiple tag ids by separating them with a comma. - schema: type: string format: uuid example: 019ffad2-9b9f-79cc-82ca-2b33348f0860 example: 019ffad2-9b9f-79cc-82ca-2b33348f0860 in: query name: ai_sales_agent_id required: false description: Filter campaigns by AI Sales Agent ID. Returns campaigns that were created by the specified AI Sales Agent. - schema: type: number enum: - -99 - -1 - -2 - 0 - 1 - 2 - 3 - 4 x-enumDescriptions: '0': Draft '1': Active '2': Paused '3': Completed '4': Running Subsequences '-99': Account Suspended '-1': Accounts Unhealthy '-2': Bounce Protect example: 1 examples: '1': value: 1 '2': value: 2 in: query name: status required: false description: Filter campaigns by status using the campaign status enum value (e.g., ACTIVE, PAUSED). - schema: type: number enum: - -99 - -1 - -2 - 0 - 1 - 2 - 3 - 4 x-enumDescriptions: '0': Draft '1': Active '2': Paused '3': Completed '4': Running Subsequences '-99': Account Suspended '-1': Accounts Unhealthy '-2': Bounce Protect example: 1 example: 1 in: query name: exclude_status required: false description: Exclude campaigns with this status using the campaign status enum value (e.g., exclude ACTIVE to list only campaigns that are not currently active). responses: '200': description: The list of Campaign content: application/json: schema: type: object properties: items: type: array description: The list of Campaign items: $ref: '#/components/schemas/Campaign' next_starting_after: type: string examples: - 019ffad2-9ba0-7ae4-8d2d-0588c0a8454e - '2026-08-13T11:12:14.240Z' description: The filter for getting the next items after this one, this could either be a UUID, a timestamp, on an email depending on the specific API example: 019ffad2-9ba0-7ae4-8d2d-0588c0a8454e additionalProperties: false required: - items '401': description: This request is unauthorized (either the Authorization header is missing or invalid, or the API key has been revoked) content: application/json: schema: type: object properties: statusCode: type: number enum: - 401 examples: - 401 example: 401 error: type: string enum: - Unauthorized examples: - Unauthorized example: Unauthorized message: type: string examples: - Missing Authorization header example: Missing Authorization header required: - statusCode - error - message '402': description: This request cannot be fulfilled because the workspace does not have an active paid plan content: application/json: schema: type: object properties: statusCode: type: number enum: - 402 examples: - 402 example: 402 error: type: string enum: - Payment Required examples: - Payment Required example: Payment Required message: type: string examples: - Workspace does not have an active paid plan example: Workspace does not have an active paid plan required: - statusCode - error - message '404': description: The requested resource was not found content: application/json: schema: type: object properties: statusCode: type: number enum: - 404 examples: - 404 example: 404 error: type: string enum: - Not Found examples: - Not Found example: Not Found message: type: string examples: - Resource not found example: Resource not found required: - statusCode - error - message '429': description: You have exceeded the rate limit. Please check the rate limit docs for more information. content: application/json: schema: type: object properties: statusCode: type: number enum: - 429 examples: - 429 example: 429 error: type: string enum: - Too Many Requests examples: - Too Many Requests example: Too Many Requests message: type: string examples: - Rate limit exceeded example: Rate limit exceeded required: - statusCode - error - message /api/v2/campaigns/{id}/activate: post: operationId: activateCampaign summary: Activate(start), or resume a campaign tags: - Campaign description: 'Requires one of the following scopes: `campaigns:update`, `campaigns:all`, `all:update`, `all:all`' parameters: - schema: type: string format: uuid example: 019ffad2-9b9d-70ff-a76b-0e093eb63e6c example: 019ffad2-9b9d-70ff-a76b-0e093eb63e6c in: path name: id required: true description: Campaign ID responses: '200': description: The requested Campaign content: application/json: schema: $ref: '#/components/schemas/Campaign' '400': description: The requested resource was not found content: application/json: schema: type: object properties: statusCode: type: number enum: - 404 examples: - 404 example: 404 error: type: string enum: - Not Found examples: - Not Found example: Not Found message: type: string examples: - Resource not found example: Resource not found required: - statusCode - error - message '401': description: This request is unauthorized (either the Authorization header is missing or invalid, or the API key has been revoked) content: application/json: schema: type: object properties: statusCode: type: number enum: - 401 examples: - 401 example: 401 error: type: string enum: - Unauthorized examples: - Unauthorized example: Unauthorized message: type: string examples: - Missing Authorization header example: Missing Authorization header required: - statusCode - error - message '402': description: This request cannot be fulfilled because the workspace does not have an active paid plan content: application/json: schema: type: object properties: statusCode: type: number enum: - 402 examples: - 402 example: 402 error: type: string enum: - Payment Required examples: - Payment Required example: Payment Required message: type: string examples: - Workspace does not have an active paid plan example: Workspace does not have an active paid plan required: - statusCode - error - message '404': description: The requested resource was not found content: application/json: schema: type: object properties: statusCode: type: number enum: - 404 examples: - 404 example: 404 error: type: string enum: - Not Found examples: - Not Found example: Not Found message: type: string examples: - Resource not found example: Resource not found required: - statusCode - error - message '429': description: You have exceeded the rate limit. Please check the rate limit docs for more information. content: application/json: schema: type: object properties: statusCode: type: number enum: - 429 examples: - 429 example: 429 error: type: string enum: - Too Many Requests examples: - Too Many Requests example: Too Many Requests message: type: string examples: - Rate limit exceeded example: Rate limit exceeded required: - statusCode - error - message /api/v2/campaigns/{id}/pause: post: operationId: pauseCampaign summary: Stop(or pause) a campaign tags: - Campaign description: 'Requires one of the following scopes: `campaigns:update`, `campaigns:all`, `all:update`, `all:all`' parameters: - schema: type: string format: uuid example: 019ffad2-9b9d-70ff-a76b-0e0a921defd2 example: 019ffad2-9b9d-70ff-a76b-0e0a921defd2 in: path name: id required: true description: Campaign ID responses: '200': description: The requested Campaign content: application/json: schema: $ref: '#/components/schemas/Campaign' '400': description: The requested resource was not found content: application/json: schema: type: object properties: statusCode: type: number enum: - 404 examples: - 404 example: 404 error: type: string enum: - Not Found examples: - Not Found example: Not Found message: type: string examples: - Resource not found example: Resource not found required: - statusCode - error - message '401': description: This request is unauthorized (either the Authorization header is missing or invalid, or the API key has been revoked) content: application/json: schema: type: object properties: statusCode: type: number enum: - 401 examples: - 401 example: 401 error: type: string enum: - Unauthorized examples: - Unauthorized example: Unauthorized message: type: string examples: - Missing Authorization header example: Missing Authorization header required: - statusCode - error - message '402': description: This request cannot be fulfilled because the workspace does not have an active paid plan content: application/json: schema: type: object properties: statusCode: type: number enum: - 402 examples: - 402 example: 402 error: type: string enum: - Payment Required examples: - Payment Required example: Payment Required message: type: string examples: - Workspace does not have an active paid plan example: Workspace does not have an active paid plan required: - statusCode - error - message '404': description: The requested resource was not found content: application/json: schema: type: object properties: statusCode: type: number enum: - 404 examples: - 404 example: 404 error: type: string enum: - Not Found examples: - Not Found example: Not Found message: type: string examples: - Resource not found example: Resource not found required: - statusCode - error - message '429': description: You have exceeded the rate limit. Please check the rate limit docs for more information. content: application/json: schema: type: object properties: statusCode: type: number enum: - 429 examples: - 429 example: 429 error: type: string enum: - Too Many Requests examples: - Too Many Requests example: Too Many Requests message: type: string examples: - Rate limit exceeded example: Rate limit exceeded required: - statusCode - error - message /api/v2/campaigns/{id}: get: operationId: getCampaign summary: Get campaign tags: - Campaign description: 'Requires one of the following scopes: `campaigns:read`, `campaigns:all`, `all:read`, `all:all`' parameters: - schema: type: string format: uuid example: 019ffad2-9b9f-79cc-82ca-2b30de64279d example: 019ffad2-9b9f-79cc-82ca-2b30de64279d in: path name: id required: true description: The ID of the requested item responses: '200': description: The requested Campaign content: application/json: schema: $ref: '#/components/schemas/Campaign' '401': description: This request is unauthorized (either the Authorization header is missing or invalid, or the API key has been revoked) content: application/json: schema: type: object properties: statusCode: type: number enum: - 401 examples: - 401 example: 401 error: type: string enum: - Unauthorized examples: - Unauthorized example: Unauthorized message: type: string examples: - Missing Authorization header example: Missing Authorization header required: - statusCode - error - message '402': description: This request cannot be fulfilled because the workspace does not have an active paid plan content: application/json: schema: type: object properties: statusCode: type: number enum: - 402 examples: - 402 example: 402 error: type: string enum: - Payment Required examples: - Payment Required example: Payment Required message: type: string examples: - Workspace does not have an active paid plan example: Workspace does not have an active paid plan required: - statusCode - error - message '404': description: The requested resource was not found content: application/json: schema: type: object properties: statusCode: type: number enum: - 404 examples: - 404 example: 404 error: type: string enum: - Not Found examples: - Not Found example: Not Found message: type: string examples: - Resource not found example: Resource not found required: - statusCode - error - message '429': description: You have exceeded the rate limit. Please check the rate limit docs for more information. content: application/json: schema: type: object properties: statusCode: type: number enum: - 429 examples: - 429 example: 429 error: type: string enum: - Too Many Requests examples: - Too Many Requests example: Too Many Requests message: type: string examples: - Rate limit exceeded example: Rate limit exceeded required: - statusCode - error - message patch: operationId: patchCampaign summary: Patch campaign tags: - Campaign description: 'Requires one of the following scopes: `campaigns:update`, `campaigns:all`, `all:update`, `all:all`' requestBody: content: application/json: schema: type: object properties: name: type: string description: Name of the campaign example: My First Campaign pl_value: type: - number - 'null' description: Value of every positive lead example: 100 is_evergreen: type: - boolean - 'null' description: Whether the campaign is evergreen example: false campaign_schedule: type: object description: Campaign schedule properties: start_date: type: - string - 'null' format: date description: Start date in YYYY-MM-DD format. Uses the campaign's timezone. example: '2025-09-25' end_date: type: - string - 'null' format: date description: End date in YYYY-MM-DD format. Uses the campaign's timezone. example: '2025-09-25' schedules: type: array items: type: object properties: name: type: string example: My Schedule timing: type: object properties: from: type: string pattern: ^([01][0-9]|2[0-3]):([0-5][0-9])$ example: 09:00 to: type: string pattern: ^([01][0-9]|2[0-3]):([0-5][0-9])$ example: '17:00' required: - from - to days: type: object minProperties: 1 properties: '0': type: boolean example: true '1': type: boolean example: true '2': type: boolean example: true '3': type: boolean example: true '4': type: boolean example: true '5': type: boolean example: false '6': type: boolean example: false timezone: type: string enum: - Etc/GMT+12 - Etc/GMT+11 - Etc/GMT+10 - America/Anchorage - America/Dawson - America/Creston - America/Chihuahua - America/Boise - America/Belize - America/Chicago - America/Bahia_Banderas - America/Regina - America/Bogota - America/Detroit - America/Indiana/Marengo - America/Caracas - America/Asuncion - America/Glace_Bay - America/Campo_Grande - America/Anguilla - America/Santiago - America/St_Johns - America/Sao_Paulo - America/Argentina/La_Rioja - America/Araguaina - America/Godthab - America/Montevideo - America/Bahia - America/Noronha - America/Scoresbysund - Atlantic/Cape_Verde - Africa/Casablanca - America/Danmarkshavn - Europe/Isle_of_Man - Atlantic/Canary - Africa/Abidjan - Arctic/Longyearbyen - Europe/Belgrade - Africa/Ceuta - Europe/Sarajevo - Africa/Algiers - Africa/Windhoek - Asia/Nicosia - Asia/Beirut - Africa/Cairo - Asia/Damascus - Europe/Bucharest - Africa/Blantyre - Europe/Helsinki - Europe/Istanbul - Asia/Jerusalem - Africa/Tripoli - Asia/Amman - Asia/Baghdad - Europe/Kaliningrad - Asia/Aden - Africa/Addis_Ababa - Europe/Kirov - Europe/Astrakhan - Asia/Tehran - Asia/Dubai - Asia/Baku - Indian/Mahe - Asia/Tbilisi - Asia/Yerevan - Asia/Kabul - Antarctica/Mawson - Asia/Yekaterinburg - Asia/Karachi - Asia/Kolkata - Asia/Colombo - Asia/Kathmandu - Antarctica/Vostok - Asia/Dhaka - Asia/Rangoon - Antarctica/Davis - Asia/Novokuznetsk - Asia/Hong_Kong - Asia/Krasnoyarsk - Asia/Brunei - Australia/Perth - Asia/Taipei - Asia/Choibalsan - Asia/Irkutsk - Asia/Dili - Asia/Pyongyang - Australia/Adelaide - Australia/Darwin - Australia/Brisbane - Australia/Melbourne - Antarctica/DumontDUrville - Australia/Currie - Asia/Chita - Antarctica/Macquarie - Asia/Sakhalin - Pacific/Auckland - Etc/GMT-12 - Pacific/Fiji - Asia/Anadyr - Asia/Kamchatka - Etc/GMT-13 - Pacific/Apia example: Etc/GMT+12 required: - name - timing - days - timezone minItems: 1 required: - schedules sequences: type: array description: List of sequences (the actual email copy). Even though this field is an array, only the first element is used, so please provide only one array item, and add the steps to that array items: type: object properties: steps: type: array items: type: object properties: type: type: string enum: - email x-enumDescriptions: email: This steps represents an email description: Type of step. This has to be 'email' always - it's the only supported type for now example: email delay: type: number description: The delay value before sending the NEXT email. The unit is determined by the delay_unit field (defaults to days). example: 2 delay_unit: type: string enum: - minutes - hours - days default: days description: The unit of time for the delay value (minutes, hours, or days). Defaults to days for backward compatibility. example: days pre_delay: type: number description: The delay value before sending the FIRST email in a subsequence. **Only applicable to subsequences** - this field is ignored for regular campaigns. The unit is determined by the pre_delay_unit field (defaults to days). example: 2 pre_delay_unit: type: string enum: - minutes - hours - days default: days description: The unit of time for the pre_delay value (minutes, hours, or days). **Only applicable to subsequences** - this field is ignored for regular campaigns. Defaults to days for backward compatibility. example: days variants: type: array items: type: object properties: subject: type: string example: Hello {{firstName}} body: type: string description: Email body HTML. Use `
` tags for delivered email line breaks. example: Hey {{firstName}},

I hope you are doing well. v_disabled: type: boolean description: Whether this variant is disabled. By default, all the variants are enabled. Please set this to true if you want to disable this variant example: true required: - subject - body required: - type - delay - variants required: - steps email_gap: type: - number - 'null' description: The gap between emails in minutes example: 10 random_wait_max: type: - number - 'null' description: The maximum random wait time in minutes example: 10 text_only: type: - boolean - 'null' description: Whether the campaign is text only example: false first_email_text_only: type: - boolean - 'null' description: Whether the campaign is send the first email as a text only example: false email_list: type: array description: List of accounts to use for sending emails items: type: string example: john@doe.com daily_limit: type: - number - 'null' description: The daily limit for sending emails example: 100 stop_on_reply: type: - boolean - 'null' description: Whether to stop the campaign on reply example: false email_tag_list: type: array description: List of tags to use for sending emails items: type: string format: uuid example: 019ffad2-5c4b-761a-9bc4-059ac4b3a8a9 link_tracking: type: - boolean - 'null' description: Whether to track links in emails example: true open_tracking: type: boolean description: Whether to track opens in emails example: true stop_on_auto_reply: type: - boolean - 'null' description: Whether to stop the campaign on auto reply example: false daily_max_leads: type: - integer - 'null' description: The daily maximum new leads to contact minimum: 0 example: 100 prioritize_new_leads: type: - boolean - 'null' description: Whether to prioritize new leads example: false auto_variant_select: type: - object - 'null' description: Auto variant select settings properties: trigger: type: string enum: - reply_rate - click_rate - open_rate examples: - click_rate example: click_rate required: - trigger match_lead_esp: type: - boolean - 'null' description: Whether to match leads by ESP example: false stop_for_company: type: - boolean - 'null' description: Whether to stop the campaign for the entire company(domain) when a lead replies example: false insert_unsubscribe_header: type: - boolean - 'null' description: Whether to insert an unsubscribe header in emails example: false allow_risky_contacts: type: - boolean - 'null' description: Whether to allow risky contacts example: false disable_bounce_protect: type: - boolean - 'null' description: Whether to disable bounce protection example: false limit_emails_per_company_override: type: - object - 'null' description: Overrides the workspace-wide limit emails per company setting for this campaign. properties: mode: type: string enum: - custom - disabled examples: - custom example: custom daily_limit: type: number minimum: 1 examples: - 3 example: 3 scope: type: string enum: - per_campaign - across_workspace examples: - per_campaign example: per_campaign required: - mode cc_list: type: array description: List of accounts to CC on emails items: type: string format: email example: john@doe.com bcc_list: type: array description: List of accounts to BCC on emails items: type: string format: email example: john@doe.com owned_by: type: - string - 'null' description: Owner ID format: uuid example: 019ffad2-5c4b-761a-9bc4-059c036e479a provider_routing_rules: type: array description: Auto variant select settings items: type: object properties: action: type: string enum: - send - do_not_send example: send recipient_esp: type: array items: type: string enum: - all - google - outlook - other example: all sender_esp: type: array items: type: string enum: - all - google - outlook - other example: all required: - action - recipient_esp - sender_esp required: [] additionalProperties: false minProperties: 1 parameters: - schema: type: string format: uuid example: 019ffad2-9ba8-71a6-b963-856f0012c6e2 example: 019ffad2-9ba8-71a6-b963-856f0012c6e2 in: path name: id required: true description: The ID of the item to update responses: '200': description: The updated Campaign content: application/json: schema: $ref: '#/components/schemas/Campaign' '401': description: This request is unauthorized (either the Authorization header is missing or invalid, or the API key has been revoked) content: application/json: schema: type: object properties: statusCode: type: number enum: - 401 examples: - 401 example: 401 error: type: string enum: - Unauthorized examples: - Unauthorized example: Unauthorized message: type: string examples: - Missing Authorization header example: Missing Authorization header required: - statusCode - error - message '402': description: This request cannot be fulfilled because the workspace does not have an active paid plan content: application/json: schema: type: object properties: statusCode: type: number enum: - 402 examples: - 402 example: 402 error: type: string enum: - Payment Required examples: - Payment Required example: Payment Required message: type: string examples: - Workspace does not have an active paid plan example: Workspace does not have an active paid plan required: - statusCode - error - message '404': description: The requested resource was not found content: application/json: schema: type: object properties: statusCode: type: number enum: - 404 examples: - 404 example: 404 error: type: string enum: - Not Found examples: - Not Found example: Not Found message: type: string examples: - Resource not found example: Resource not found required: - statusCode - error - message '429': description: You have exceeded the rate limit. Please check the rate limit docs for more information. content: application/json: schema: type: object properties: statusCode: type: number enum: - 429 examples: - 429 example: 429 error: type: string enum: - Too Many Requests examples: - Too Many Requests example: Too Many Requests message: type: string examples: - Rate limit exceeded example: Rate limit exceeded required: - statusCode - error - message delete: operationId: deleteCampaign summary: Delete campaign tags: - Campaign description: 'Requires one of the following scopes: `campaigns:delete`, `campaigns:all`, `all:delete`, `all:all`' requestBody: content: application/json: schema: type: 'null' example: null parameters: - schema: type: string format: uuid example: 019ffad2-9ba8-71a6-b963-8570cd39c0c2 example: 019ffad2-9ba8-71a6-b963-8570cd39c0c2 in: path name: id required: true description: The ID of the item to delete responses: '200': description: The deleted Campaign content: application/json: schema: $ref: '#/components/schemas/Campaign' '401': description: This request is unauthorized (either the Authorization header is missing or invalid, or the API key has been revoked) content: application/json: schema: type: object properties: statusCode: type: number enum: - 401 examples: - 401 example: 401 error: type: string enum: - Unauthorized examples: - Unauthorized example: Unauthorized message: type: string examples: - Missing Authorization header example: Missing Authorization header required: - statusCode - error - message '402': description: This request cannot be fulfilled because the workspace does not have an active paid plan content: application/json: schema: type: object properties: statusCode: type: number enum: - 402 examples: - 402 example: 402 error: type: string enum: - Payment Required examples: - Payment Required example: Payment Required message: type: string examples: - Workspace does not have an active paid plan example: Workspace does not have an active paid plan required: - statusCode - error - message '404': description: The requested resource was not found content: application/json: schema: type: object properties: statusCode: type: number enum: - 404 examples: - 404 example: 404 error: type: string enum: - Not Found examples: - Not Found example: Not Found message: type: string examples: - Resource not found example: Resource not found required: - statusCode - error - message '429': description: You have exceeded the rate limit. Please check the rate limit docs for more information. content: application/json: schema: type: object properties: statusCode: type: number enum: - 429 examples: - 429 example: 429 error: type: string enum: - Too Many Requests examples: - Too Many Requests example: Too Many Requests message: type: string examples: - Rate limit exceeded example: Rate limit exceeded required: - statusCode - error - message /api/v2/campaigns/search-by-contact: get: operationId: searchByContact summary: Search campaigns by lead email tags: - Campaign description: 'Requires one of the following scopes: `campaigns:read`, `campaigns:all`, `all:read`, `all:all`' parameters: - schema: type: string example: lead-email@example.com example: lead-email@example.com in: query name: search required: false description: Search by lead email - schema: type: string default: timestamp_created example: timestamp_created examples: timestamp_created: value: timestamp_created name: value: name in: query name: sort_column required: false description: Sort campaigns by column name - schema: type: string default: asc example: asc examples: asc: value: asc desc: value: desc in: query name: sort_order required: false description: Sort direction responses: '200': description: Default Response content: application/json: schema: type: object properties: items: type: array items: $ref: '#/components/schemas/Campaign' '401': description: This request is unauthorized (either the Authorization header is missing or invalid, or the API key has been revoked) content: application/json: schema: type: object properties: statusCode: type: number enum: - 401 examples: - 401 example: 401 error: type: string enum: - Unauthorized examples: - Unauthorized example: Unauthorized message: type: string examples: - Missing Authorization header example: Missing Authorization header required: - statusCode - error - message '402': description: This request cannot be fulfilled because the workspace does not have an active paid plan content: application/json: schema: type: object properties: statusCode: type: number enum: - 402 examples: - 402 example: 402 error: type: string enum: - Payment Required examples: - Payment Required example: Payment Required message: type: string examples: - Workspace does not have an active paid plan example: Workspace does not have an active paid plan required: - statusCode - error - message '404': description: The requested resource was not found content: application/json: schema: type: object properties: statusCode: type: number enum: - 404 examples: - 404 example: 404 error: type: string enum: - Not Found examples: - Not Found example: Not Found message: type: string examples: - Resource not found example: Resource not found required: - statusCode - error - message '429': description: You have exceeded the rate limit. Please check the rate limit docs for more information. content: application/json: schema: type: object properties: statusCode: type: number enum: - 429 examples: - 429 example: 429 error: type: string enum: - Too Many Requests examples: - Too Many Requests example: Too Many Requests message: type: string examples: - Rate limit exceeded example: Rate limit exceeded required: - statusCode - error - message /api/v2/campaigns/analytics: get: operationId: getCampaignAnalytics summary: Get campaign(s) analytics tags: - Campaign description: Get analytics for one or multiple campaigns. Specify the `id` field to get the analytics for a single campaign, or leave it empty to get the analytics for all campaigns parameters: - schema: type: string format: uuid example: 019ffad2-9ba1-7bc9-8d59-2dbf9cad03cd example: 019ffad2-9ba1-7bc9-8d59-2dbf9cad03cd in: query name: id required: false description: A campaign ID to get the analytics for. Leave this field empty to get the analytics for all campaigns - schema: type: array items: type: string description: 'A list of campaign IDs to get the analytics for. Leave this field empty to get the analytics for all campaigns. You can specify multiple IDs by adding the same parameter multiple times, for instance: `/campaigns/analytics?ids=123&ids=456`' format: uuid examples: - 019ffad2-9ba1-7bc9-8d59-2dc06bc9bc75 example: 019ffad2-9ba1-7bc9-8d59-2dc06bc9bc75 in: query name: ids required: false - schema: type: string example: '2024-01-01' examples: '2024-01-01': value: '2024-01-01' '2024-01-01T00:00:00.000Z': value: '2024-01-01T00:00:00.000Z' in: query name: start_date required: false description: Start of the analytics range. Accepts a date-only value (`YYYY-MM-DD`) or a full ISO 8601 timestamp. Date-only values are interpreted as UTC midnight — e.g. `2026-04-07` is treated as `2026-04-07T00:00:00.000Z`. - schema: type: string example: '2024-01-01' examples: '2024-01-01': value: '2024-01-01' '2024-01-01T00:00:00.000Z': value: '2024-01-01T00:00:00.000Z' in: query name: end_date required: false description: End of the analytics range. Accepts a date-only value (`YYYY-MM-DD`) or a full ISO 8601 timestamp. Date-only values are interpreted as UTC midnight — e.g. `2026-04-07` is treated as `2026-04-07T00:00:00.000Z`. - schema: type: boolean default: false example: true example: true in: query name: exclude_total_leads_count required: false description: Exclude the total leads from the result. Setting this to true will considerably decrease the response time responses: '200': description: Default Response content: application/json: schema: type: array items: type: object properties: campaign_name: type: string description: The name of the campaign example: My Test Campaign campaign_id: type: string description: The ID of the campaign format: uuid example: 019ffad2-9ba1-7bc9-8d59-2dc1d3f0cbdd campaign_status: type: number description: The campaign status x-enumDescriptions: '0': Draft '1': Active '2': Paused '3': Completed '4': Running Subsequences '-99': Account Suspended '-1': Accounts Unhealthy '-2': Bounce Protect example: 1 campaign_is_evergreen: type: boolean description: Whether the campaign is evergreen example: true leads_count: type: integer description: The total number of leads example: 1500 contacted_count: type: integer description: Number of leads for whom the sequence has started example: 1200 emails_sent_count: type: integer description: The total number of sent emails example: 5000 new_leads_contacted_count: type: integer description: The total number of new leads contacted example: 200 open_count: type: integer description: The number of leads that opened at least one email example: 800 open_count_unique: type: integer description: The number of unique email opens (first open per lead) example: 750 open_count_unique_by_step: type: integer description: The number of unique email opens per step (first open per lead per step) example: 900 reply_count: type: integer description: The total number of replies received (if a lead replies multiple times, each reply is counted) example: 300 reply_count_unique: type: integer description: The number of unique replies (first reply per lead). Excludes automatic replies. example: 280 reply_count_unique_by_step: type: integer description: The number of unique replies per step (first reply per lead per step). Excludes automatic replies. example: 350 reply_count_automatic: type: integer description: The total number of automatic replies detected example: 15 reply_count_automatic_unique: type: integer description: The number of unique automatic replies (first automatic reply per lead) example: 12 reply_count_automatic_unique_by_step: type: integer description: The number of unique automatic replies per step example: 18 link_click_count: type: integer description: The number of links that got clicked example: 800 link_click_count_unique: type: integer description: The number of unique link clicks (first click per lead) example: 600 link_click_count_unique_by_step: type: integer description: The number of unique link clicks per step (first click per lead per step) example: 720 bounced_count: type: integer description: The number of bounced leads example: 50 unsubscribed_count: type: integer description: The number of unsubscribed leads example: 20 completed_count: type: integer description: The number of leads that the campaign was completed for example: 1100 total_opportunities: type: integer description: The total number of unique opportunities created example: 10 total_opportunity_value: type: number description: The total value of opportunities created example: 1000 required: - campaign_name - campaign_id - campaign_status - campaign_is_evergreen - leads_count - contacted_count - open_count - reply_count - link_click_count - bounced_count - unsubscribed_count - completed_count - emails_sent_count - new_leads_contacted_count - total_opportunities - total_opportunity_value '400': description: Default Response content: application/json: schema: type: object properties: message: type: string description: The error message example: Start Date must be earlier than End Date '401': description: This request is unauthorized (either the Authorization header is missing or invalid, or the API key has been revoked) content: application/json: schema: type: object properties: statusCode: type: number enum: - 401 examples: - 401 example: 401 error: type: string enum: - Unauthorized examples: - Unauthorized example: Unauthorized message: type: string examples: - Missing Authorization header example: Missing Authorization header required: - statusCode - error - message '402': description: This request cannot be fulfilled because the workspace does not have an active paid plan content: application/json: schema: type: object properties: statusCode: type: number enum: - 402 examples: - 402 example: 402 error: type: string enum: - Payment Required examples: - Payment Required example: Payment Required message: type: string examples: - Workspace does not have an active paid plan example: Workspace does not have an active paid plan required: - statusCode - error - message '404': description: The requested resource was not found content: application/json: schema: type: object properties: statusCode: type: number enum: - 404 examples: - 404 example: 404 error: type: string enum: - Not Found examples: - Not Found example: Not Found message: type: string examples: - Resource not found example: Resource not found required: - statusCode - error - message '429': description: You have exceeded the rate limit. Please check the rate limit docs for more information. content: application/json: schema: type: object properties: statusCode: type: number enum: - 429 examples: - 429 example: 429 error: type: string enum: - Too Many Requests examples: - Too Many Requests example: Too Many Requests message: type: string examples: - Rate limit exceeded example: Rate limit exceeded required: - statusCode - error - message /api/v2/campaigns/analytics/overview: get: operationId: getCampaignAnalyticsOverview summary: Get campaign(s) analytics overview tags: - Campaign description: 'Get analytics overview for one or multiple campaigns. Specify the `id` field to get the analytics overview for a single campaign, or leave it empty to get the analytics overview for all campaigns. Note regarding the interest status totals (interested, meeting booked, meeting completed, closed): these are calculated based on the first occurrence of each event per contact by default. To change this behavior and calculate the totals based on all occurrences of the events, set the `expand_crm_events` parameter to `true`. Additionally, there is a 10 minute time window after you change a lead status in which the subsequent updates will NOT insert new analytics events to avoid duplicates from rapid status changes and avoid false inflation of the analytics numbers.' parameters: - schema: type: string format: uuid example: 019ffad2-9ba2-7890-9f7c-574e4193fe4e example: 019ffad2-9ba2-7890-9f7c-574e4193fe4e in: query name: id required: false description: A campaign ID to get the analytics overview for. Leave this field empty to get the analytics overview for all campaigns - schema: type: array items: type: string description: 'A list of campaign IDs to get the analytics overview for. Leave this field empty to get the analytics overview for all campaigns. You can specify multiple IDs by adding the same parameter multiple times, for instance: `/campaigns/analytics/overview?ids=123&ids=456`' format: uuid examples: - 019ffad2-9ba2-7890-9f7c-574f7d9cc984 example: 019ffad2-9ba2-7890-9f7c-574f7d9cc984 in: query name: ids required: false - schema: type: string example: '2024-01-01' examples: '2024-01-01': value: '2024-01-01' '2024-01-01T00:00:00.000Z': value: '2024-01-01T00:00:00.000Z' in: query name: start_date required: false description: Start of the analytics range. Accepts a date-only value (`YYYY-MM-DD`) or a full ISO 8601 timestamp. Date-only values are interpreted as UTC midnight — e.g. `2026-04-07` is treated as `2026-04-07T00:00:00.000Z`. - schema: type: string example: '2024-01-01' examples: '2024-01-01': value: '2024-01-01' '2024-01-01T00:00:00.000Z': value: '2024-01-01T00:00:00.000Z' in: query name: end_date required: false description: End of the analytics range. Accepts a date-only value (`YYYY-MM-DD`) or a full ISO 8601 timestamp. Date-only values are interpreted as UTC midnight — e.g. `2026-04-07` is treated as `2026-04-07T00:00:00.000Z`. - schema: type: number enum: - -99 - -1 - -2 - 0 - 1 - 2 - 3 - 4 x-enumDescriptions: '0': Draft '1': Active '2': Paused '3': Completed '4': Running Subsequences '-99': Account Suspended '-1': Accounts Unhealthy '-2': Bounce Protect example: 1 examples: '1': value: 1 '2': value: 2 '3': value: 3 in: query name: campaign_status required: false description: Filter by campaign status (only the analytics for the campaigns with the specified status will be returned) - schema: type: boolean default: false example: true example: true in: query name: expand_crm_events required: false description: 'When `true`, calculates the total of all the lead interest status update events instead of only the first occurrence for each contact. This will affect the following fields: `total_opportunities`, `total_interested`, `total_meeting_booked`, `total_meeting_completed`, and `total_closed`. Example: if a lead goes from interested to meeting booked to closed, it will count as 3 events (total_interested: 1, total_meeting_booked_1, and total_closed: 1) when this parameter is set to true, and as 1 event (total_interested) when it is set to false (default).' responses: '200': description: Default Response content: application/json: schema: type: object properties: open_count: type: integer description: The total number of times the emails were opened, including duplicates example: 800 open_count_unique: type: integer description: The number of emails that got opened (for the first time only) example: 800 open_count_unique_by_step: type: integer description: The unique number of times the emails were opened (counted once per lead, step, and campaign) example: 800 link_click_count: type: integer description: The number of links that got clicked example: 800 link_click_count_unique: type: integer description: The number of links that got clicked (for the first time) example: 800 link_click_count_unique_by_step: type: integer description: The unique number of links that got clicked, per step (counted once per lead, step, and campaign) example: 800 reply_count: type: integer description: The total number of replies received (if a lead replies multiple times, each reply is counted) example: 300 reply_count_unique: type: integer description: The number of unique replies (first reply per lead). Excludes automatic replies. example: 300 reply_count_unique_by_step: type: integer description: The number of unique replies per step (first reply per lead per step). Excludes automatic replies. example: 300 reply_count_automatic: type: integer description: The total number of automatic replies received (e.g., out-of-office) example: 50 reply_count_automatic_unique: type: integer description: The number of unique leads that sent automatic replies example: 45 reply_count_automatic_unique_by_step: type: integer description: The unique number of automatic replies per step (counted once per lead, step, and campaign) example: 45 bounced_count: type: integer description: The number of bounced leads example: 50 unsubscribed_count: type: integer description: The number of unsubscribed leads example: 20 completed_count: type: integer description: The number of leads that the campaign was completed for example: 1100 emails_sent_count: type: integer description: The total number of sent emails example: 5000 contacted_count: type: integer description: The total number of unique leads contacted example: 4500 new_leads_contacted_count: type: integer description: The total number of new leads contacted example: 200 total_opportunities: type: integer description: The total number of unique opportunities created example: 10 total_opportunity_value: type: number description: The total value of opportunities created example: 1000 total_interested: type: integer description: The total number of interested opportunities created example: 103 total_meeting_booked: type: integer description: The total number of meeting booked opportunities created example: 45 total_meeting_completed: type: integer description: The total number of meeting completed opportunities created example: 12 total_closed: type: integer description: The total number of closed opportunities created example: 10 '400': description: Default Response content: application/json: schema: type: object properties: message: type: string description: The error message example: Start Date must be earlier than End Date '401': description: This request is unauthorized (either the Authorization header is missing or invalid, or the API key has been revoked) content: application/json: schema: type: object properties: statusCode: type: number enum: - 401 examples: - 401 example: 401 error: type: string enum: - Unauthorized examples: - Unauthorized example: Unauthorized message: type: string examples: - Missing Authorization header example: Missing Authorization header required: - statusCode - error - message '402': description: This request cannot be fulfilled because the workspace does not have an active paid plan content: application/json: schema: type: object properties: statusCode: type: number enum: - 402 examples: - 402 example: 402 error: type: string enum: - Payment Required examples: - Payment Required example: Payment Required message: type: string examples: - Workspace does not have an active paid plan example: Workspace does not have an active paid plan required: - statusCode - error - message '404': description: The requested resource was not found content: application/json: schema: type: object properties: statusCode: type: number enum: - 404 examples: - 404 example: 404 error: type: string enum: - Not Found examples: - Not Found example: Not Found message: type: string examples: - Resource not found example: Resource not found required: - statusCode - error - message '429': description: You have exceeded the rate limit. Please check the rate limit docs for more information. content: application/json: schema: type: object properties: statusCode: type: number enum: - 429 examples: - 429 example: 429 error: type: string enum: - Too Many Requests examples: - Too Many Requests example: Too Many Requests message: type: string examples: - Rate limit exceeded example: Rate limit exceeded required: - statusCode - error - message /api/v2/campaigns/analytics/daily: get: operationId: getDailyCampaignAnalytics summary: Get daily campaign analytics tags: - Campaign description: Get campaign daily analytics parameters: - schema: type: string format: uuid example: 019ffad2-9ba2-7890-9f7c-5750de86de7e example: 019ffad2-9ba2-7890-9f7c-5750de86de7e in: query name: campaign_id required: false description: Campaign ID (optional). Leave this field empty to get the analytics for all campaigns - schema: type: string example: '2024-01-01' example: '2024-01-01' in: query name: start_date required: false description: Start of the analytics range. Accepts a date-only value (`YYYY-MM-DD`) or a full ISO 8601 timestamp. Date-only values are interpreted as UTC midnight — e.g. `2026-04-07` is treated as `2026-04-07T00:00:00.000Z`. - schema: type: string example: '2024-01-01' example: '2024-01-01' in: query name: end_date required: false description: End of the analytics range. Accepts a date-only value (`YYYY-MM-DD`) or a full ISO 8601 timestamp. Date-only values are interpreted as UTC midnight — e.g. `2026-04-07` is treated as `2026-04-07T00:00:00.000Z`. - schema: type: number enum: - -99 - -1 - -2 - 0 - 1 - 2 - 3 - 4 x-enumDescriptions: '0': Draft '1': Active '2': Paused '3': Completed '4': Running Subsequences '-99': Account Suspended '-1': Accounts Unhealthy '-2': Bounce Protect example: 1 examples: '1': value: 1 '2': value: 2 '3': value: 3 in: query name: campaign_status required: false description: Filter by campaign status (only the analytics for the campaigns with the specified status will be returned) responses: '200': description: Default Response content: application/json: schema: type: array items: type: object properties: date: type: string description: The date of the analytics entry, in YYYY-MM-DD format example: '2025-03-01' sent: type: integer description: The total number of sent emails example: 5421 contacted: type: integer description: The total number of unique contacts who received an email that day example: 5000 new_leads_contacted: type: integer description: The total number of new leads contacted that day example: 200 opened: type: integer description: The total number of opened emails example: 99 unique_opened: type: integer description: The total number of unique opened emails example: 60 replies: type: integer description: The total number of replies example: 60 unique_replies: type: integer description: The total number of unique replies example: 60 replies_automatic: type: integer description: The total number of automatic replies detected example: 5 unique_replies_automatic: type: integer description: The total number of unique automatic replies detected example: 4 clicks: type: integer description: The total number of links clicked example: 60 unique_clicks: type: integer description: The total number of unique links clicked. Unique meaning from unique leads, not unique links. For instance, if a lead clicked a link 3 times, it will be counted as 1 unique click. If a lead clicked 3 different links, it will still be counted as 1 unique click example: 60 opportunities: type: integer description: The total number of unique opportunities created from the campaign on that day example: 5 unique_opportunities: type: integer description: The total number of unique opportunities created from unique leads from the campaign on that day example: 3 '400': description: Default Response content: application/json: schema: type: object properties: message: type: string description: The error message example: Start Date must be earlier than End Date '401': description: This request is unauthorized (either the Authorization header is missing or invalid, or the API key has been revoked) content: application/json: schema: type: object properties: statusCode: type: number enum: - 401 examples: - 401 example: 401 error: type: string enum: - Unauthorized examples: - Unauthorized example: Unauthorized message: type: string examples: - Missing Authorization header example: Missing Authorization header required: - statusCode - error - message '402': description: This request cannot be fulfilled because the workspace does not have an active paid plan content: application/json: schema: type: object properties: statusCode: type: number enum: - 402 examples: - 402 example: 402 error: type: string enum: - Payment Required examples: - Payment Required example: Payment Required message: type: string examples: - Workspace does not have an active paid plan example: Workspace does not have an active paid plan required: - statusCode - error - message '404': description: The requested resource was not found content: application/json: schema: type: object properties: statusCode: type: number enum: - 404 examples: - 404 example: 404 error: type: string enum: - Not Found examples: - Not Found example: Not Found message: type: string examples: - Resource not found example: Resource not found required: - statusCode - error - message '429': description: You have exceeded the rate limit. Please check the rate limit docs for more information. content: application/json: schema: type: object properties: statusCode: type: number enum: - 429 examples: - 429 example: 429 error: type: string enum: - Too Many Requests examples: - Too Many Requests example: Too Many Requests message: type: string examples: - Rate limit exceeded example: Rate limit exceeded required: - statusCode - error - message /api/v2/campaigns/analytics/steps: get: operationId: getCampaignStepsAnalytics summary: Get campaign steps analytics tags: - Campaign description: Get campaign steps analytics parameters: - schema: type: string format: uuid example: 019ffad2-9ba3-7a9b-ac87-cd7e663fa784 example: 019ffad2-9ba3-7a9b-ac87-cd7e663fa784 in: query name: campaign_id required: false description: Campaign ID (optional). Leave this field empty to get the analytics for all campaigns - schema: type: string example: '2024-01-01' examples: '2024-01-01': value: '2024-01-01' '2024-01-01T00:00:00.000Z': value: '2024-01-01T00:00:00.000Z' in: query name: start_date required: false description: Start of the analytics range. Accepts a date-only value (`YYYY-MM-DD`) or a full ISO 8601 timestamp. Date-only values are interpreted as UTC midnight — e.g. `2026-04-07` is treated as `2026-04-07T00:00:00.000Z`. - schema: type: string example: '2024-01-01' examples: '2024-01-01': value: '2024-01-01' '2024-01-01T00:00:00.000Z': value: '2024-01-01T00:00:00.000Z' in: query name: end_date required: false description: End of the analytics range. Accepts a date-only value (`YYYY-MM-DD`) or a full ISO 8601 timestamp. Date-only values are interpreted as UTC midnight — e.g. `2026-04-07` is treated as `2026-04-07T00:00:00.000Z`. - schema: type: boolean default: false example: true example: true in: query name: include_opportunities_count required: false description: Whether to include the opportunities count per step. If this field is true then `opportunities`, `unique_opportunities`, `meetings_booked`, and `won` fields will be included in the response responses: '200': description: Default Response content: application/json: schema: type: array items: type: object properties: step: type: - 'null' - string description: The step number. When null it means we couldn't determine the step number for the event, for instance for list leads, which are not part of a campaign. example: '1' variant: type: - 'null' - string description: The variant number, starting from 0. 0 = A, 1 = B, 2 = C, etc. When null it means we couldn't determine the variant for the event. example: '0' sent: type: integer description: The total number of sent emails example: 5421 opened: type: integer description: The total number of opened emails example: 99 unique_opened: type: integer description: The total number of opened emails example: 60 replies: type: integer description: The total number of replies example: 60 unique_replies: type: integer description: The total number of replies example: 60 replies_automatic: type: integer description: The total number of automatic replies detected example: 5 unique_replies_automatic: type: integer description: The total number of unique automatic replies detected example: 4 clicks: type: integer description: The total number of links clicked example: 60 unique_clicks: type: integer description: The total number of unique links clicked. Unique meaning from unique leads, not unique links. For instance, if a lead clicked a link 3 times, it will be counted as 1 unique click. If a lead clicked 3 different links, it will still be counted as 1 unique click example: 60 opportunities: type: integer description: The total number of opportunities created from this step. Included only if `include_opportunities_count` is `true` example: 10 unique_opportunities: type: integer description: The total number of unique opportunities created from this step. Unique meaning unique per lead. If a lead has multiple opportunities, it will be counted as 1 unique opportunity. Included only if `include_opportunities_count` is `true` example: 8 meetings_booked: type: integer description: The total number of opportunities from this step whose current CRM status is Meeting Booked. Included only if `include_opportunities_count` is `true` example: 2 won: type: integer description: The total number of opportunities from this step whose current CRM status is Won. Included only if `include_opportunities_count` is `true` example: 1 required: - step - variant - sent - opened - unique_opened - replies - unique_replies - replies_automatic - unique_replies_automatic - clicks - unique_clicks '400': description: Default Response content: application/json: schema: type: object properties: message: type: string description: The error message example: Start Date must be earlier than End Date '401': description: This request is unauthorized (either the Authorization header is missing or invalid, or the API key has been revoked) content: application/json: schema: type: object properties: statusCode: type: number enum: - 401 examples: - 401 example: 401 error: type: string enum: - Unauthorized examples: - Unauthorized example: Unauthorized message: type: string examples: - Missing Authorization header example: Missing Authorization header required: - statusCode - error - message '402': description: This request cannot be fulfilled because the workspace does not have an active paid plan content: application/json: schema: type: object properties: statusCode: type: number enum: - 402 examples: - 402 example: 402 error: type: string enum: - Payment Required examples: - Payment Required example: Payment Required message: type: string examples: - Workspace does not have an active paid plan example: Workspace does not have an active paid plan required: - statusCode - error - message '404': description: The requested resource was not found content: application/json: schema: type: object properties: statusCode: type: number enum: - 404 examples: - 404 example: 404 error: type: string enum: - Not Found examples: - Not Found example: Not Found message: type: string examples: - Resource not found example: Resource not found required: - statusCode - error - message '429': description: You have exceeded the rate limit. Please check the rate limit docs for more information. content: application/json: schema: type: object properties: statusCode: type: number enum: - 429 examples: - 429 example: 429 error: type: string enum: - Too Many Requests examples: - Too Many Requests example: Too Many Requests message: type: string examples: - Rate limit exceeded example: Rate limit exceeded required: - statusCode - error - message /api/v2/campaigns/{id}/share: post: operationId: shareCampaign summary: Share a campaign tags: - Campaign description: Share a campaign. This allows other users to create new campaigns based on this campaign. The campaign is being shared for 7 days, after which you'll have to call this endpoint again if you want to enable sharing on the campaign parameters: - schema: type: string format: uuid example: 019ffad2-9ba8-71a6-b963-85717ac0bf95 example: 019ffad2-9ba8-71a6-b963-85717ac0bf95 in: path name: id required: true description: Campaign ID responses: '204': description: Default Response content: application/json: schema: {} '401': description: This request is unauthorized (either the Authorization header is missing or invalid, or the API key has been revoked) content: application/json: schema: type: object properties: statusCode: type: number enum: - 401 examples: - 401 example: 401 error: type: string enum: - Unauthorized examples: - Unauthorized example: Unauthorized message: type: string examples: - Missing Authorization header example: Missing Authorization header required: - statusCode - error - message '402': description: This request cannot be fulfilled because the workspace does not have an active paid plan content: application/json: schema: type: object properties: statusCode: type: number enum: - 402 examples: - 402 example: 402 error: type: string enum: - Payment Required examples: - Payment Required example: Payment Required message: type: string examples: - Workspace does not have an active paid plan example: Workspace does not have an active paid plan required: - statusCode - error - message '404': description: The requested resource was not found content: application/json: schema: type: object properties: statusCode: type: number enum: - 404 examples: - 404 example: 404 error: type: string enum: - Not Found examples: - Not Found example: Not Found message: type: string examples: - Resource not found example: Resource not found required: - statusCode - error - message '429': description: You have exceeded the rate limit. Please check the rate limit docs for more information. content: application/json: schema: type: object properties: statusCode: type: number enum: - 429 examples: - 429 example: 429 error: type: string enum: - Too Many Requests examples: - Too Many Requests example: Too Many Requests message: type: string examples: - Rate limit exceeded example: Rate limit exceeded required: - statusCode - error - message /api/v2/campaigns/{id}/from-export: post: operationId: createFromExport summary: Create campaign from shared one tags: - Campaign description: 'Requires one of the following scopes: `campaigns:create`, `campaigns:all`, `all:create`, `all:all`' parameters: - schema: type: string format: uuid example: 019ffad2-9ba9-7958-8902-ac39b45afe52 example: 019ffad2-9ba9-7958-8902-ac39b45afe52 in: path name: id required: true description: Campaign ID responses: '200': description: The requested Campaign content: application/json: schema: $ref: '#/components/schemas/Campaign' '401': description: This request is unauthorized (either the Authorization header is missing or invalid, or the API key has been revoked) content: application/json: schema: type: object properties: statusCode: type: number enum: - 401 examples: - 401 example: 401 error: type: string enum: - Unauthorized examples: - Unauthorized example: Unauthorized message: type: string examples: - Missing Authorization header example: Missing Authorization header required: - statusCode - error - message '402': description: This request cannot be fulfilled because the workspace does not have an active paid plan content: application/json: schema: type: object properties: statusCode: type: number enum: - 402 examples: - 402 example: 402 error: type: string enum: - Payment Required examples: - Payment Required example: Payment Required message: type: string examples: - Workspace does not have an active paid plan example: Workspace does not have an active paid plan required: - statusCode - error - message '403': description: The requested campaign not shared content: application/json: schema: type: object description: The requested campaign not shared properties: message: type: string example: The requested campaign not shared '404': description: The requested resource was not found content: application/json: schema: type: object properties: statusCode: type: number enum: - 404 examples: - 404 example: 404 error: type: string enum: - Not Found examples: - Not Found example: Not Found message: type: string examples: - Resource not found example: Resource not found required: - statusCode - error - message '429': description: You have exceeded the rate limit. Please check the rate limit docs for more information. content: application/json: schema: type: object properties: statusCode: type: number enum: - 429 examples: - 429 example: 429 error: type: string enum: - Too Many Requests examples: - Too Many Requests example: Too Many Requests message: type: string examples: - Rate limit exceeded example: Rate limit exceeded required: - statusCode - error - message /api/v2/campaigns/{id}/export: post: operationId: exportCampaign summary: Export campaign to JSON format tags: - Campaign description: 'Requires one of the following scopes: `campaigns:read`, `campaigns:all`, `all:read`, `all:all`' parameters: - schema: type: string format: uuid example: 019ffad2-9ba9-7958-8902-ac3ad80e868c example: 019ffad2-9ba9-7958-8902-ac3ad80e868c in: path name: id required: true description: Campaign ID responses: '200': description: The requested Campaign content: application/json: schema: $ref: '#/components/schemas/Campaign' '401': description: This request is unauthorized (either the Authorization header is missing or invalid, or the API key has been revoked) content: application/json: schema: type: object properties: statusCode: type: number enum: - 401 examples: - 401 example: 401 error: type: string enum: - Unauthorized examples: - Unauthorized example: Unauthorized message: type: string examples: - Missing Authorization header example: Missing Authorization header required: - statusCode - error - message '402': description: This request cannot be fulfilled because the workspace does not have an active paid plan content: application/json: schema: type: object properties: statusCode: type: number enum: - 402 examples: - 402 example: 402 error: type: string enum: - Payment Required examples: - Payment Required example: Payment Required message: type: string examples: - Workspace does not have an active paid plan example: Workspace does not have an active paid plan required: - statusCode - error - message '404': description: The requested resource was not found content: application/json: schema: type: object properties: statusCode: type: number enum: - 404 examples: - 404 example: 404 error: type: string enum: - Not Found examples: - Not Found example: Not Found message: type: string examples: - Resource not found example: Resource not found required: - statusCode - error - message '429': description: You have exceeded the rate limit. Please check the rate limit docs for more information. content: application/json: schema: type: object properties: statusCode: type: number enum: - 429 examples: - 429 example: 429 error: type: string enum: - Too Many Requests examples: - Too Many Requests example: Too Many Requests message: type: string examples: - Rate limit exceeded example: Rate limit exceeded required: - statusCode - error - message /api/v2/campaigns/{id}/duplicate: post: operationId: duplicate summary: Duplicate campaign tags: - Campaign description: 'Requires one of the following scopes: `campaigns:create`, `campaigns:all`, `all:create`, `all:all`' requestBody: content: application/json: schema: type: object properties: name: type: string description: Campaign new name (optional). If not provided, it will default to CAMPAIGN NAME (copy). example: Campaign new name parameters: - schema: type: string format: uuid example: 019ffad2-9baa-7b24-b673-febcf19e6996 example: 019ffad2-9baa-7b24-b673-febcf19e6996 in: path name: id required: true description: Campaign ID responses: '200': description: The requested Campaign content: application/json: schema: $ref: '#/components/schemas/Campaign' '400': description: Duplication failed content: application/json: schema: type: object description: Duplication failed properties: message: type: string description: The error message example: New campaign name is required '401': description: This request is unauthorized (either the Authorization header is missing or invalid, or the API key has been revoked) content: application/json: schema: type: object properties: statusCode: type: number enum: - 401 examples: - 401 example: 401 error: type: string enum: - Unauthorized examples: - Unauthorized example: Unauthorized message: type: string examples: - Missing Authorization header example: Missing Authorization header required: - statusCode - error - message '402': description: This request cannot be fulfilled because the workspace does not have an active paid plan content: application/json: schema: type: object properties: statusCode: type: number enum: - 402 examples: - 402 example: 402 error: type: string enum: - Payment Required examples: - Payment Required example: Payment Required message: type: string examples: - Workspace does not have an active paid plan example: Workspace does not have an active paid plan required: - statusCode - error - message '404': description: The requested resource was not found content: application/json: schema: type: object properties: statusCode: type: number enum: - 404 examples: - 404 example: 404 error: type: string enum: - Not Found examples: - Not Found example: Not Found message: type: string examples: - Resource not found example: Resource not found required: - statusCode - error - message '429': description: You have exceeded the rate limit. Please check the rate limit docs for more information. content: application/json: schema: type: object properties: statusCode: type: number enum: - 429 examples: - 429 example: 429 error: type: string enum: - Too Many Requests examples: - Too Many Requests example: Too Many Requests message: type: string examples: - Rate limit exceeded example: Rate limit exceeded required: - statusCode - error - message /api/v2/campaigns/count-launched: get: operationId: countLaunched summary: Get launched campaigns count tags: - Campaign description: 'Requires one of the following scopes: `campaigns:read`, `campaigns:all`, `all:read`, `all:all`' responses: '200': description: Default Response content: application/json: schema: type: object properties: count: type: number example: 2 required: - count '401': description: This request is unauthorized (either the Authorization header is missing or invalid, or the API key has been revoked) content: application/json: schema: type: object properties: statusCode: type: number enum: - 401 examples: - 401 example: 401 error: type: string enum: - Unauthorized examples: - Unauthorized example: Unauthorized message: type: string examples: - Missing Authorization header example: Missing Authorization header required: - statusCode - error - message '402': description: This request cannot be fulfilled because the workspace does not have an active paid plan content: application/json: schema: type: object properties: statusCode: type: number enum: - 402 examples: - 402 example: 402 error: type: string enum: - Payment Required examples: - Payment Required example: Payment Required message: type: string examples: - Workspace does not have an active paid plan example: Workspace does not have an active paid plan required: - statusCode - error - message '404': description: The requested resource was not found content: application/json: schema: type: object properties: statusCode: type: number enum: - 404 examples: - 404 example: 404 error: type: string enum: - Not Found examples: - Not Found example: Not Found message: type: string examples: - Resource not found example: Resource not found required: - statusCode - error - message '429': description: You have exceeded the rate limit. Please check the rate limit docs for more information. content: application/json: schema: type: object properties: statusCode: type: number enum: - 429 examples: - 429 example: 429 error: type: string enum: - Too Many Requests examples: - Too Many Requests example: Too Many Requests message: type: string examples: - Rate limit exceeded example: Rate limit exceeded required: - statusCode - error - message /api/v2/campaigns/{id}/variables: post: operationId: addVariables summary: Add campaign variables tags: - Campaign description: 'Requires one of the following scopes: `campaigns:update`, `campaigns:all`, `all:update`, `all:all`' requestBody: content: application/json: schema: type: object properties: variables: type: array items: type: string description: Custom or core variable names example: firstName required: - variables required: true parameters: - schema: type: string format: uuid example: 019ffad2-9bab-7567-9b5c-ceeb1b706e72 example: 019ffad2-9bab-7567-9b5c-ceeb1b706e72 in: path name: id required: true description: Campaign ID responses: '200': description: A campaign that can be sent to a list of recipients content: application/json: schema: $ref: '#/components/schemas/Campaign' '401': description: This request is unauthorized (either the Authorization header is missing or invalid, or the API key has been revoked) content: application/json: schema: type: object properties: statusCode: type: number enum: - 401 examples: - 401 example: 401 error: type: string enum: - Unauthorized examples: - Unauthorized example: Unauthorized message: type: string examples: - Missing Authorization header example: Missing Authorization header required: - statusCode - error - message '402': description: This request cannot be fulfilled because the workspace does not have an active paid plan content: application/json: schema: type: object properties: statusCode: type: number enum: - 402 examples: - 402 example: 402 error: type: string enum: - Payment Required examples: - Payment Required example: Payment Required message: type: string examples: - Workspace does not have an active paid plan example: Workspace does not have an active paid plan required: - statusCode - error - message '404': description: The requested resource was not found content: application/json: schema: type: object properties: statusCode: type: number enum: - 404 examples: - 404 example: 404 error: type: string enum: - Not Found examples: - Not Found example: Not Found message: type: string examples: - Resource not found example: Resource not found required: - statusCode - error - message '429': description: You have exceeded the rate limit. Please check the rate limit docs for more information. content: application/json: schema: type: object properties: statusCode: type: number enum: - 429 examples: - 429 example: 429 error: type: string enum: - Too Many Requests examples: - Too Many Requests example: Too Many Requests message: type: string examples: - Rate limit exceeded example: Rate limit exceeded required: - statusCode - error - message /api/v2/campaigns/{id}/sending-status: get: operationId: getCampaignSendingStatus summary: Get campaign sending status tags: - Campaign description: 'Returns sending status data explaining why a campaign may not be sending emails or is sending slower than expected. Note: Some fields may be missing when the campaign is out of schedule. Always-present fields: campaign_id, last_updated, status, issue_tracking. Requires one of the following scopes: `campaigns:read`, `campaigns:all`, `all:read`, `all:all`' parameters: - schema: type: boolean default: false example: false example: false in: query name: with_ai_summary required: false description: Include AI-generated summary - schema: type: string format: uuid example: 019ffad2-9bab-7567-9b5c-ceec78f572ca example: 019ffad2-9bab-7567-9b5c-ceec78f572ca in: path name: id required: true description: Campaign ID responses: '200': description: Sending status data with human-readable summary. Returns null for both fields if no data is available. content: application/json: schema: type: object description: Sending status data with human-readable summary. Returns null for both fields if no data is available. properties: diagnostics: type: - 'null' - object additionalProperties: true description: Raw sending status data. Some fields may be missing when campaign is out of schedule. properties: campaign_id: type: string description: The campaign ID examples: - 019ffad2-8d52-7649-baa5-1601894e64fd example: 019ffad2-8d52-7649-baa5-1601894e64fd subsequence_id: type: string description: The subsequence ID (only present for subsequence endpoints) examples: - 019ffad2-8d52-7649-baa5-16026b2682a3 example: 019ffad2-8d52-7649-baa5-16026b2682a3 last_updated: type: string description: ISO timestamp of when this data was last updated examples: - '2026-08-13T11:12:10.578Z' example: '2026-08-13T11:12:10.578Z' status: type: - 'null' - string description: Status code explaining why the campaign is not sending or sending slower enum: - campaign_paused - campaign_draft - campaign_completed - campaign_running_subsequences - campaign_bounce_protect - campaign_accounts_unhealthy - campaign_account_suspended - out_of_schedule - waiting_for_leads - daily_limit_met - account_daily_limit_met - new_lead_limit_met - all_accounts_unhealthy - waiting_for_esp_match - domain_limit_reached - follow_up_delay_not_met - no_accounts_available - healthy examples: - healthy example: healthy issue_tracking: type: object description: Tracks persistence of the current issue properties: current_status_code: type: - 'null' - string description: Current status code examples: - healthy example: healthy issue_first_seen_at: type: - 'null' - string description: ISO timestamp when the issue was first detected examples: - '2026-08-13T11:12:10.578Z' example: '2026-08-13T11:12:10.578Z' consecutive_loops_with_issue: type: number description: Number of consecutive processing loops with this issue examples: - 0 example: 0 last_healthy_send_at: type: - 'null' - string description: ISO timestamp of last successful send examples: - '2026-08-13T11:12:10.578Z' example: '2026-08-13T11:12:10.578Z' accounts_summary: type: object description: Summary of sending account availability. May be missing when campaign is out of schedule. properties: total_connected: type: number description: Total number of connected sending accounts examples: - 5 example: 5 available: type: number description: Number of accounts available to send examples: - 3 example: 3 unavailable: type: object description: Breakdown of unavailable accounts by reason properties: daily_limit_hit: type: number description: Accounts that hit their configured daily sending limit examples: - 1 example: 1 slow_ramp_limit_hit: type: number description: Accounts that hit the dynamic slow ramp limit (warmup feature) examples: - 0 example: 0 disconnected: type: number description: Accounts that are disconnected examples: - 1 example: 1 global_gap_not_met: type: number description: Accounts waiting for global sending gap examples: - 0 example: 0 campaign_daily_limit: type: object description: Campaign daily sending limit status. May be missing when campaign is out of schedule. properties: limit: type: number description: Configured daily sending limit examples: - 100 example: 100 sent: type: number description: Number of emails sent today examples: - 50 example: 50 limit_hit: type: boolean description: Whether the daily limit has been reached examples: - false example: false new_lead_limit: type: object description: New lead daily limit status. May be missing when campaign is out of schedule. properties: enabled: type: boolean description: Whether new lead limiting is enabled examples: - true example: true limit: type: - 'null' - number description: Configured new lead limit per day examples: - 50 example: 50 contacted: type: number description: Number of new leads contacted today examples: - 25 example: 25 limit_hit: type: boolean description: Whether the new lead limit has been reached examples: - false example: false schedule_status: type: object description: Campaign schedule status properties: in_schedule: type: boolean description: Whether the campaign is currently within scheduled sending hours examples: - true example: true send_one_by_one: type: object description: Send one-by-one settings. May be missing when campaign is out of schedule. properties: enabled: type: boolean description: Whether send one-by-one mode is enabled examples: - false example: false single_account_per_wait_gap: type: boolean description: Whether to use single account per wait gap examples: - false example: false follow_ups_waiting: type: object description: Follow-up emails waiting status. May be missing when campaign is out of schedule. properties: count: type: number description: Number of follow-ups waiting to be sent examples: - 10 example: 10 earliest_wait_time_seconds: type: - 'null' - number description: Seconds until the earliest follow-up can be sent examples: - 3600 example: 3600 esp_routing_status: type: object description: ESP routing status. May be missing when campaign is out of schedule. properties: enabled: type: boolean description: Whether ESP routing is enabled examples: - false example: false waiting_for_match: type: boolean description: Whether waiting for an ESP-matched account examples: - false example: false connected_esps: type: array items: type: number examples: - 1 example: 1 description: List of connected ESP IDs domain_limiter: type: object description: Per-domain sending limit status. May be missing when campaign is out of schedule. properties: active: type: boolean description: Whether domain limiting is active examples: - false example: false domains_at_limit: type: number description: Number of domains that have reached their limit examples: - 0 example: 0 leads_status: type: object description: Lead availability status. May be missing when campaign is out of schedule. properties: no_leads_ready: type: boolean description: Whether there are no leads ready to receive emails examples: - false example: false account_unavailable_skips: type: number description: Number of leads skipped due to account unavailability examples: - 0 example: 0 delay_not_met_skips: type: number description: Number of leads skipped due to delay requirements not met examples: - 0 example: 0 summary: type: - 'null' - object additionalProperties: true description: Human-readable summary of the sending status properties: status: type: - 'null' - string description: The status code examples: - healthy example: healthy status_message: type: - 'null' - string description: Human-readable message explaining the status examples: - Campaign is sending normally example: Campaign is sending normally issue_started_at: type: - 'null' - string description: ISO timestamp when the issue was first detected examples: - '2026-08-13T11:12:10.578Z' example: '2026-08-13T11:12:10.578Z' last_healthy_send_at: type: - 'null' - string description: ISO timestamp of last successful send examples: - '2026-08-13T11:12:10.578Z' example: '2026-08-13T11:12:10.578Z' ai_summary: type: - 'null' - string description: AI-generated plain-English summary (only when with_ai_summary=true) examples: - Your campaign is sending emails normally. example: Your campaign is sending emails normally. '401': description: This request is unauthorized (either the Authorization header is missing or invalid, or the API key has been revoked) content: application/json: schema: type: object properties: statusCode: type: number enum: - 401 examples: - 401 example: 401 error: type: string enum: - Unauthorized examples: - Unauthorized example: Unauthorized message: type: string examples: - Missing Authorization header example: Missing Authorization header required: - statusCode - error - message '402': description: This request cannot be fulfilled because the workspace does not have an active paid plan content: application/json: schema: type: object properties: statusCode: type: number enum: - 402 examples: - 402 example: 402 error: type: string enum: - Payment Required examples: - Payment Required example: Payment Required message: type: string examples: - Workspace does not have an active paid plan example: Workspace does not have an active paid plan required: - statusCode - error - message '404': description: The requested resource was not found content: application/json: schema: type: object properties: statusCode: type: number enum: - 404 examples: - 404 example: 404 error: type: string enum: - Not Found examples: - Not Found example: Not Found message: type: string examples: - Resource not found example: Resource not found required: - statusCode - error - message '429': description: You have exceeded the rate limit. Please check the rate limit docs for more information. content: application/json: schema: type: object properties: statusCode: type: number enum: - 429 examples: - 429 example: 429 error: type: string enum: - Too Many Requests examples: - Too Many Requests example: Too Many Requests message: type: string examples: - Rate limit exceeded example: Rate limit exceeded required: - statusCode - error - message components: schemas: Campaign: title: Campaign description: A campaign that can be sent to a list of recipients x-tags: - Schemas - Campaign type: object properties: id: type: string description: Unique identifier for the campaign readOnly: true format: uuid example: 019ffad2-5c4b-761a-9bc4-0599e8a95bea name: type: string description: Name of the campaign example: My First Campaign pl_value: type: - 'null' - number description: Value of every positive lead example: 100 status: type: number description: Campaign Status readOnly: true enum: - -99 - -1 - -2 - 0 - 1 - 2 - 3 - 4 x-enumDescriptions: '0': Draft '1': Active '2': Paused '3': Completed '4': Running Subsequences '-99': Account Suspended '-1': Accounts Unhealthy '-2': Bounce Protect example: 1 is_evergreen: type: - 'null' - boolean description: Whether the campaign is evergreen example: false campaign_schedule: type: object description: Campaign schedule properties: start_date: type: - 'null' - string format: date description: Start date in YYYY-MM-DD format. Uses the campaign's timezone. example: '2025-09-25' end_date: type: - 'null' - string format: date description: End date in YYYY-MM-DD format. Uses the campaign's timezone. example: '2025-09-25' schedules: type: array items: type: object properties: name: type: string example: My Schedule timing: type: object properties: from: type: string pattern: ^([01][0-9]|2[0-3]):([0-5][0-9])$ example: 09:00 to: type: string pattern: ^([01][0-9]|2[0-3]):([0-5][0-9])$ example: '17:00' required: - from - to days: type: object minProperties: 1 properties: '0': type: boolean example: true '1': type: boolean example: true '2': type: boolean example: true '3': type: boolean example: true '4': type: boolean example: true '5': type: boolean example: false '6': type: boolean example: false timezone: type: string enum: - Etc/GMT+12 - Etc/GMT+11 - Etc/GMT+10 - America/Anchorage - America/Dawson - America/Creston - America/Chihuahua - America/Boise - America/Belize - America/Chicago - America/Bahia_Banderas - America/Regina - America/Bogota - America/Detroit - America/Indiana/Marengo - America/Caracas - America/Asuncion - America/Glace_Bay - America/Campo_Grande - America/Anguilla - America/Santiago - America/St_Johns - America/Sao_Paulo - America/Argentina/La_Rioja - America/Araguaina - America/Godthab - America/Montevideo - America/Bahia - America/Noronha - America/Scoresbysund - Atlantic/Cape_Verde - Africa/Casablanca - America/Danmarkshavn - Europe/Isle_of_Man - Atlantic/Canary - Africa/Abidjan - Arctic/Longyearbyen - Europe/Belgrade - Africa/Ceuta - Europe/Sarajevo - Africa/Algiers - Africa/Windhoek - Asia/Nicosia - Asia/Beirut - Africa/Cairo - Asia/Damascus - Europe/Bucharest - Africa/Blantyre - Europe/Helsinki - Europe/Istanbul - Asia/Jerusalem - Africa/Tripoli - Asia/Amman - Asia/Baghdad - Europe/Kaliningrad - Asia/Aden - Africa/Addis_Ababa - Europe/Kirov - Europe/Astrakhan - Asia/Tehran - Asia/Dubai - Asia/Baku - Indian/Mahe - Asia/Tbilisi - Asia/Yerevan - Asia/Kabul - Antarctica/Mawson - Asia/Yekaterinburg - Asia/Karachi - Asia/Kolkata - Asia/Colombo - Asia/Kathmandu - Antarctica/Vostok - Asia/Dhaka - Asia/Rangoon - Antarctica/Davis - Asia/Novokuznetsk - Asia/Hong_Kong - Asia/Krasnoyarsk - Asia/Brunei - Australia/Perth - Asia/Taipei - Asia/Choibalsan - Asia/Irkutsk - Asia/Dili - Asia/Pyongyang - Australia/Adelaide - Australia/Darwin - Australia/Brisbane - Australia/Melbourne - Antarctica/DumontDUrville - Australia/Currie - Asia/Chita - Antarctica/Macquarie - Asia/Sakhalin - Pacific/Auckland - Etc/GMT-12 - Pacific/Fiji - Asia/Anadyr - Asia/Kamchatka - Etc/GMT-13 - Pacific/Apia example: Etc/GMT+12 required: - name - timing - days - timezone minItems: 1 required: - schedules sequences: type: array description: List of sequences (the actual email copy). Even though this field is an array, only the first element is used, so please provide only one array item, and add the steps to that array items: type: object properties: steps: type: array items: type: object properties: type: type: string enum: - email x-enumDescriptions: email: This steps represents an email description: Type of step. This has to be 'email' always - it's the only supported type for now example: email delay: type: number description: The delay value before sending the NEXT email. The unit is determined by the delay_unit field (defaults to days). example: 2 delay_unit: type: string enum: - minutes - hours - days default: days description: The unit of time for the delay value (minutes, hours, or days). Defaults to days for backward compatibility. example: days pre_delay: type: number description: The delay value before sending the FIRST email in a subsequence. **Only applicable to subsequences** - this field is ignored for regular campaigns. The unit is determined by the pre_delay_unit field (defaults to days). example: 2 pre_delay_unit: type: string enum: - minutes - hours - days default: days description: The unit of time for the pre_delay value (minutes, hours, or days). **Only applicable to subsequences** - this field is ignored for regular campaigns. Defaults to days for backward compatibility. example: days variants: type: array items: type: object properties: subject: type: string example: Hello {{firstName}} body: type: string description: Email body HTML. Use `
` tags for delivered email line breaks. example: Hey {{firstName}},

I hope you are doing well. v_disabled: type: boolean description: Whether this variant is disabled. By default, all the variants are enabled. Please set this to true if you want to disable this variant example: true required: - subject - body required: - type - delay - variants required: - steps timestamp_created: type: string description: Timestamp when the campaign was created readOnly: true example: '2026-08-13T11:11:58.027Z' timestamp_updated: type: string description: Timestamp when the campaign was last updated readOnly: true example: '2026-08-13T11:11:58.027Z' email_gap: type: - 'null' - number description: The gap between emails in minutes example: 10 random_wait_max: type: - 'null' - number description: The maximum random wait time in minutes example: 10 text_only: type: - 'null' - boolean description: Whether the campaign is text only example: false first_email_text_only: type: - 'null' - boolean description: Whether the campaign is send the first email as a text only example: false email_list: type: array description: List of accounts to use for sending emails items: type: string example: john@doe.com daily_limit: type: - 'null' - number description: The daily limit for sending emails example: 100 stop_on_reply: type: - 'null' - boolean description: Whether to stop the campaign on reply example: false email_tag_list: type: array description: List of tags to use for sending emails items: type: string format: uuid example: 019ffad2-5c4b-761a-9bc4-059ac4b3a8a9 link_tracking: type: - 'null' - boolean description: Whether to track links in emails example: true open_tracking: type: boolean description: Whether to track opens in emails example: true stop_on_auto_reply: type: - 'null' - boolean description: Whether to stop the campaign on auto reply example: false daily_max_leads: type: - 'null' - integer description: The daily maximum new leads to contact minimum: 0 example: 100 prioritize_new_leads: type: - 'null' - boolean description: Whether to prioritize new leads example: false auto_variant_select: type: - 'null' - object description: Auto variant select settings properties: trigger: type: string enum: - reply_rate - click_rate - open_rate examples: - click_rate example: click_rate required: - trigger match_lead_esp: type: - 'null' - boolean description: Whether to match leads by ESP example: false not_sending_status: type: - 'null' - number description: Campaign not sending status readOnly: true enum: - 1 - 2 - 3 - 4 - 99 x-enumDescriptions: '1': Campaign is currently not within its sending schedule. '2': Campaign is currently waiting for a lead to process. '3': Campaign has reached its daily sending limit. '4': All sending accounts for this campaign have reached their daily sending limit. '99': Campaign is currently not sending due to an error. Please contact support for assistance. example: 2 stop_for_company: type: - 'null' - boolean description: Whether to stop the campaign for the entire company(domain) when a lead replies example: false core_variables: type: - 'null' - object description: Campaign core variables readOnly: true additionalProperties: true custom_variables: type: - 'null' - object description: Campaign custom variables readOnly: true additionalProperties: true insert_unsubscribe_header: type: - 'null' - boolean description: Whether to insert an unsubscribe header in emails example: false allow_risky_contacts: type: - 'null' - boolean description: Whether to allow risky contacts example: false disable_bounce_protect: type: - 'null' - boolean description: Whether to disable bounce protection example: false limit_emails_per_company_override: type: - 'null' - object description: Overrides the workspace-wide limit emails per company setting for this campaign. properties: mode: type: string enum: - custom - disabled examples: - custom example: custom daily_limit: type: number minimum: 1 examples: - 3 example: 3 scope: type: string enum: - per_campaign - across_workspace examples: - per_campaign example: per_campaign required: - mode cc_list: type: array description: List of accounts to CC on emails items: type: string format: email example: john@doe.com bcc_list: type: array description: List of accounts to BCC on emails items: type: string format: email example: john@doe.com organization: type: - 'null' - string description: Organization ID readOnly: true format: uuid example: 019ffad2-5c4b-761a-9bc4-059bb9fa11bf owned_by: type: - 'null' - string description: Owner ID format: uuid example: 019ffad2-5c4b-761a-9bc4-059c036e479a ai_sdr_id: type: - 'null' - string description: AI Sales Agent ID that created this campaign format: uuid example: 019ffad2-5c4b-761a-9bc4-059dc9a58653 provider_routing_rules: type: array description: Auto variant select settings items: type: object properties: action: type: string enum: - send - do_not_send example: send recipient_esp: type: array items: type: string enum: - all - google - outlook - other example: all sender_esp: type: array items: type: string enum: - all - google - outlook - other example: all required: - action - recipient_esp - sender_esp required: - id - name - status - campaign_schedule - timestamp_created - timestamp_updated additionalProperties: false securitySchemes: ApiKeyAuth: type: http scheme: bearer