Promote an A/B winner

POST/v1/campaigns/{campaign_id}/ab-testing/promote
Scope: campaigns:write

Ends the test in one arm's favour. With winner: "a", every new lead gets variation A and nothing else moves. With winner: "b", B's steps are copied over variation A with fresh step ids, and every new lead gets them; leads still in flight on A continue on B's remaining steps.

Neither arm is deleted and A/B testing stays enabled, so leads already on B finish B either way. The request needs a running test: 409 AB_TESTING_DISABLED when the test is off, 409 VARIATION_B_MISSING when the campaign has no variation B. Promoting B rewrites the sequence, so a campaign changed since it was read answers 409 SEQUENCE_MODIFIED; retry.

Headers

  • AuthorizationstringRequired

    Bearer followed by a space and your API key, for example Bearer vk_….

Path parameters

  • campaign_idstring · uuidRequired

    ID of the campaign.

Request body

  • winnerstringRequired

    a: every new lead gets A. b: B's steps are copied over A and every new lead gets them; leads in flight on A continue on B's remaining steps. Leads already on B finish B either way.

    One of"a""b"

Response

200

  • messagestringRequired
  • ab_testing_enabledboolean or null
  • campaign_idstring or null
  • successboolean
    Default true
  • traffic_splitinteger or null
  • winnerstring or null

Errors

Errors share one JSON body: success, error, message, optional details, and request_id.

StatusCodeMeaning
400VALIDATION_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. details.errors lists each failing field with its field, message and type.

400SEQUENCE_VALIDATION_FAILED

The sequence breaks a structural rule, such as an unknown step type or a linkedin_connection step without a conditional after it. The message lists every rule that failed.

401UNAUTHORIZED

The Authorization header is missing or malformed, or the API key is unknown or has been deactivated.

401API_KEY_EXPIRED

The API key is past its expiry date. Create a new key in the Victoria AI app.

403INSUFFICIENT_SCOPE

The API key doesn't have the scope this endpoint requires, such as leads:write.

403ORGANIZATION_DEACTIVATED

The organization that owns this API key has been deactivated.

404CAMPAIGN_NOT_FOUND

No campaign with this ID exists in your organization.

404NOT_FOUND

No endpoint matches the path. A resource ID in the path that isn't a valid UUID also answers NOT_FOUND.

409VARIATION_B_MISSING

The campaign's sequence has no variation_b with steps, so there's nothing to test against variation A. Write one with Replace a campaign's sequence before turning A/B testing on or promoting a winner.

409AB_TESTING_DISABLED

A/B testing is off for this campaign, so there's no test to promote a winner from. Turn it on with Turn A/B testing on or off first.

409SEQUENCE_MODIFIED

The sequence changed after it was read. Retrieve the campaign again and retry.

413PAYLOAD_TOO_LARGE

The request body is larger than 1 MB.

429RATE_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 Retry-After header. See Rate limits.

500INTERNAL_ERROR

Something failed on our side. The response never includes internal details; quote its request_id when you contact support.

503UPSTREAM_TIMEOUT

A service the API depends on timed out. The request is safe to retry.

503AUTH_UNAVAILABLE

The API key couldn't be checked because the authentication service was unavailable. The request is safe to retry.

Response headers

HeaderDescription
X-Request-ID

Correlation ID for the request, also returned as request_id in error bodies. Send your own X-Request-ID, up to 128 letters, digits, ., _, : or -, and it's used instead.

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 429: seconds to wait before retrying.