Create a campaign
/v1/campaignsCreates a campaign in draft, with is_active: false. Add its sequence, AI fields, senders and leads, check it with Get the activation preflight, then activate it with Update a campaign. Set up a campaign walks through the order.
An optional sequence can be sent now.
A sequence is validated before it's saved:
variation_ais required andvariation_bis optional. Each is a list of steps.- Step types are
view_profile,linkedin_connection,conditional,linkedin_messageandemail. - A
linkedin_connectionstep must be followed immediately by aconditionalstep withbranches.yesandbranches.no. Conditionals nest at most two deep. linkedin_messagesteps are only allowed inside ayesbranch.emailsteps needsubjectandcontent.delayis a number of days from 0 to 90.- Every step needs a unique integer
id, and a sequence has at most 40 steps.
The easiest valid starting point is a sequence template.
Headers
AuthorizationstringRequiredBearerfollowed by a space and your API key, for exampleBearer vk_….Idempotency-KeystringAny unique string, such as a UUID, that makes retrying this request safe. A repeat with the same key for at least 24 hours returns the original response instead of doing the work again. Use a new key for each distinct request.
at most 255 characters
Request body
namestringRequiredCampaign name
at most 2,000 charactersExample"Q3 Proof First Outreach"descriptionstring or nullCampaign description
at most 2,000 charactersDefault""sequenceobject or nullOptional full sequence object (variation_a / variation_b step arrays); validated against structural rules
Response
201
campaignobject or nullThe created campaign
Show 14 child attributesHide child attributes
idstringRequiredCampaign UUID
Example"550e8400-e29b-41d4-a716-446655440000"namestringRequiredCampaign name
Example"Q1 Enterprise Outreach"is_activebooleanRequiredWhether the campaign is currently active
Exampletruecreated_atstring · date-timeRequiredWhen the campaign was created
Example"2024-01-15T10:30:00+00:00"updated_atstring · date-timeRequiredWhen the campaign was last updated
Example"2024-01-20T14:45:00+00:00"ab_testing_enabledboolean or nullWhether A/B testing is enabled for message variations
Exampletruecustom_fieldsany or nullCustom fields — object on newer campaigns, list on legacy ones
descriptionstring or nullCampaign description
Example"Targeting enterprise accounts in the tech sector"enabled_accountsarray of strings or nullList of connected account IDs used for outreach
lead_database_filtersobject or nullLead-database search filters defining this campaign's ICP (same shape the lead database search accepts)
refill_policyobject or nullAutomatic lead-refill settings for the campaign:
enabled,min_backlog,target_backlog,max_add_per_run,max_tokens_per_run,cooldown_hoursandmode.responder_enabledboolean or nullWhether AI auto-responder is enabled
Exampletruesequenceany or nullCampaign sequence: an object with variation_a and variation_b message templates, or an empty list on a campaign with no sequence yet
traffic_splitinteger or nullTraffic split percentage for A/B testing (0-100)
Example50
campaign_idstring or nullUUID of the created campaign
messagestringDefault"Campaign created in draft state"successbooleanDefaulttrue
Errors
Errors share one JSON body: success, error, message, optional details, and request_id.
| Status | Code | Meaning |
|---|---|---|
| 400 | VALIDATION_ERROR | The request didn't match the endpoint's schema: a missing or malformed field, a bad query parameter, or a value out of range. |
| 400 | SEQUENCE_VALIDATION_FAILED | The sequence breaks a structural rule, such as an unknown step type or a |
| 401 | UNAUTHORIZED | The |
| 401 | API_KEY_EXPIRED | The API key is past its expiry date. Create a new key in the Victoria AI app. |
| 403 | INSUFFICIENT_SCOPE | The API key doesn't have the scope this endpoint requires, such as |
| 403 | ORGANIZATION_DEACTIVATED | The organization that owns this API key has been deactivated. |
| 409 | IDEMPOTENCY_KEY_REUSED | This |
| 409 | IDEMPOTENCY_IN_PROGRESS | The first request with this |
| 413 | PAYLOAD_TOO_LARGE | The request body is larger than 1 MB. |
| 429 | RATE_LIMITED | Too many requests for this API key: more than 100 a minute to one endpoint, or 600 a minute in total. Retry after the number of seconds in the |
| 500 | ORG_HAS_NO_MEMBERS | The organization has no members, so the campaign can't be created. Contact support. |
| 500 | INTERNAL_ERROR | Something failed on our side. The response never includes internal details; quote its |
| 503 | UPSTREAM_TIMEOUT | A service the API depends on timed out. The request is safe to retry. |
| 503 | AUTH_UNAVAILABLE | The API key couldn't be checked because the authentication service was unavailable. The request is safe to retry. |
Response headers
| Header | Description |
|---|---|
X-Request-ID | Correlation ID for the request, also returned as |
RateLimit-Limit | Requests allowed to this endpoint per minute. |
RateLimit-Remaining | Requests you can still send to this endpoint right now. |
RateLimit-Reset | Seconds until the endpoint's full limit is available again. |
Retry-After | On a |
Idempotent-Replay |
|