---
title: "Resume sequence A/B test"
method: POST
path: "/ab-tests/{abTestId}/resume"
tags: ["A/B Tests"]
---

# Resume sequence A/B test

`POST /ab-tests/{abTestId}/resume`

## Request

- Base URL: `https://api.sequenzy.com/api/v1`
- URL: `https://api.sequenzy.com/api/v1/ab-tests/{abTestId}/resume`
- Auth: HTTP bearer

Clears the winner of a sequence A/B test so contacts reaching the step are split across its variants again, keeping the results collected so far. Automatic winner selection is turned off for the test, so it keeps splitting until a winner is selected. Requires the sequences:write scope and, while the sequence is active, confirmLiveChange.

## Path parameters

- `abTestId` string, required

## Request body

- object
  - `confirmLiveChange` boolean: Required as true when the sequence is active.

## Response `200`

Testing resumed

- object
  - `success` boolean
  - `abTest` ABTest
    - `id` string
    - `companyId` string
    - `kind` 'campaign' | 'sequence': Identifies which settings model applies to this test.
    - `campaignId` string, nullable
    - `automationNodeId` string, nullable
    - `name` string, nullable
    - `status` string
    - `testPercentage` integer: Campaign test audience percentage. Sequence tests retain the legacy internal sentinel value 100; use settings instead.
    - `testDurationMinutes` integer: Campaign test duration. Sequence tests retain the legacy internal sentinel value 0; use settings instead.
    - `winnerCriteria` 'open_rate' | 'click_rate' | 'goal_conversion_rate' | 'goal_value' | 'event_rate'
    - `winnerGoalId` string, nullable: Goal judged by `goal_conversion_rate` or `goal_value` (a goal ID or `default-revenue`). Null for other criteria.
    - `winnerEventName` string, nullable: Event judged by `event_rate`. Null for other criteria.
    - `testType` 'subject' | 'content': Effective sequence variant strategy. Present for sequence tests.
    - `winnerThreshold` integer: Effective sequence recipient threshold. Present for sequence tests.
    - `autoSelectWinner` boolean: Whether a winner is picked automatically once winnerThreshold is reached and one variant leads. False after testing is resumed; contacts are then split until a winner is selected. Present for sequence tests.
    - `settings` object: Effective settings for this test kind. Campaign tests return testPercentage, testDurationMinutes, winnerCriteria, winnerGoalId, and winnerEventName; sequence tests return testType, winnerThreshold, winnerCriteria, winnerGoalId, and winnerEventName.
    - `winningVariantId` string, nullable
    - `winnerSelectedAt` string, date-time, nullable
    - `testStartedAt` string, date-time, nullable
    - `testEndsAt` string, date-time, nullable
    - `pendingSampleUpdate` object, nullable: Durable campaign sample request, null when absent or applied. Retry the same testPercentage after an interrupted request; error enables explicit discard.
      - `id` string
      - `testPercentage` integer
      - `requestedAt` string, date-time
      - `startedAt` string, date-time: Optional publication claim timestamp.
      - `error` string
    - `progress` object, nullable: Present on campaign detail and settings responses. Null if the campaign is missing. Counts unique recipient deliveries across retry attempts, excluding separate test emails.
      - `campaignStatus` string
      - `pauseReason` string, nullable
      - `audienceSize` integer, nullable: Original send-time audience size; null for legacy campaigns without an estimate.
      - `committed` integer: Recipients with a durable send attempt, including pending or failed sends.
      - `sent` integer: Recipients with a sentAt timestamp on an attempt.
      - `remaining` integer, nullable: Audience size minus committed recipients, floored at zero; null when size is unavailable.
      - `minimumTestPercentage` integer, nullable: Minimum whole percentage that contains committed recipients, at least 5; null without audience size. Workers revalidate against later sends.
      - `variants` object[]
        - `variantId` string, nullable
        - `committed` integer
        - `sent` integer
        - `pending` integer
        - `failed` integer: Recipients with failed attempts and no successful or pending attempt.
    - `createdAt` string, date-time
    - `updatedAt` string, date-time
    - `variants` ABTestVariant[]
      - `id` string
      - `variantId` string
      - `abTestId` string
      - `label` string
      - `variantLabel` string
      - `emailId` string
      - `subject` string
      - `previewText` string, nullable
      - `blocks` EmailBlock[]
        - `id` string
        - `type` 'text' | 'html' | 'heading' | 'list' | 'button' | 'spacer' | 'divider' | 'image' | 'columns' | 'group' | 'conditional-group' | 'repeat' | 'card' | 'cta' | 'social' | 'logo' | 'header' | 'footer' | 'video' | 'product' | 'discount-code' | 'code' | 'countdown' | 'hero' | 'testimonial' | 'gallery' | 'badge' | 'table' | 'features' | 'image-card' | 'pricing' | 'author' | 'article' | 'rating' | 'stats' | 'steps' | 'product-grid' | 'poll', required
        - `content` string: Content for text, html, and heading-like blocks.
        - `label` string: Editor label for a structural group block.
        - `layout` 'stack' | 'row' | 'grid' | 'overlay': Direct-child layout for a structural group block.
        - `columns` integer: Number of columns used by a group with grid layout.
        - `gap` integer: Gap in pixels between direct group children.
        - `stackOnMobile` boolean: Columns block only. Multi-column rows stack into a single column on screens 480px wide or narrower. Set to false to keep the columns side by side on mobile. Omit or set to true for the default stacking.
        - `padding` integer: Uniform group padding in pixels; per-side styles.padding* fields override it.
        - `overlayColor` string: Opaque fallback and shade color for an overlay group.
        - `overlayShade` integer: Overlay shade intensity as a percentage.
        - `overlayPosition` 'top' | 'center' | 'bottom': Vertical position of overlay foreground content.
        - `children` EmailBlock[]: Recursive child blocks for group and repeat containers.
        - `styles` object: Per-block visual styles. For compatibility, style fields such as backgroundColor, backgroundOpacity, borderColor, borderWidth, and borderRadius can also be supplied at the block top level and are normalized into this object.
          - `paddingTop` number
          - `paddingBottom` number
          - `paddingLeft` number
          - `paddingRight` number
          - `backgroundColor` string
          - `backgroundOpacity` number: Background opacity percentage from 0 to 100.
          - `textColor` string
          - `textAlign` 'left' | 'center' | 'right'
          - `keepAlign` boolean: Keep a centered button, logo or footer centered when the email is left-aligned (layout.contentAlign left). Without it a left email moves these blocks left; right always stays.
          - `borderRadius` number
          - `borderColor` string
          - `borderWidth` number
          - `bleed` boolean: Stretch the block edge-to-edge across the email container. Top-level blocks only.
        - `conditions` object[]: Optional per-block display rules. The block renders only when every rule matches. The same shape is used for a conditional-group block's top-level `conditions`.
          - `id` string, required
          - `field` 'variable' | 'attribute' | 'email' | 'firstName' | 'lastName', required: `variable` resolves a merge-tag path from the transactional send `variables` or an automation `event` payload (nested paths like `order.total` or `event.plan` work). `attribute` reads a stored subscriber attribute. `email`, `firstName`, and `lastName` read core subscriber fields.
          - `operator` 'is' | 'is_not' | 'contains' | 'not_contains' | 'gt' | 'gte' | 'lt' | 'lte' | 'is_empty' | 'is_not_empty', required
          - `value` string, required: For `variable` and `attribute`, use `name:value` - the part before the colon is the variable path or attribute name, and the part after it is the comparison value. For `email`, `firstName`, and `lastName`, provide the plain comparison string.
      - `testSends` integer
      - `testOpens` integer
      - `testClicks` integer
      - `isWinner` boolean
      - `localizations` object[]
      - `createdAt` string, date-time

## Other responses

- `400`: Not a sequence test, completed or cancelled, no longer attached to its step, fewer than two variants, or confirmLiveChange missing while the sequence is active
- `401`: Unauthorized
- `403`: Missing A/B test write or sequence write permission
- `404`: A/B test not found

## Changes

- **2026-10-26** `e2e7d27d7804`: 1 info
  - added the optional property `abTest/variants/items/blocks/items/styles/keepAlign` to the response with the `200` status
- **2026-10-24** `75ac3f76f3c3`: 5 warning, 2 info
  - added the new `click_rate` enum value to the `abTest/winnerCriteria` response property for the response status `200`
  - added the new `event_rate` enum value to the `abTest/winnerCriteria` response property for the response status `200`
  - added the new `goal_conversion_rate` enum value to the `abTest/winnerCriteria` response property for the response status `200`
  - added the new `goal_value` enum value to the `abTest/winnerCriteria` response property for the response status `200`
  - …3 more
- **2026-10-16** `db3873ca3d4d`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/sequenzy/apis/sequenzy-api/changes/ab-tests/:abTestId/resume/post.md)

---

[API](https://skmtc.dev/sequenzy/apis/sequenzy-api.md) - [All operations](https://skmtc.dev/sequenzy/apis/sequenzy-api/llms.txt) - [OpenAPI document](https://skmtc.dev/sequenzy/apis/sequenzy-api/revisions/3d816357b738?raw)
