---
title: "Delete A/B test variant"
method: DELETE
path: "/ab-tests/{abTestId}/variants/{variantId}"
tags: ["A/B Tests"]
---

# Delete A/B test variant

`DELETE /ab-tests/{abTestId}/variants/{variantId}`

Removes a variant from a draft campaign or sequence A/B test. The control variant A cannot be deleted, and at least 2 variants must remain. Deleting a sequence variant also deletes its dedicated email template; sequence tests whose parent sequence is active require confirmLiveChange.

## Path parameters

- `abTestId` string, required
- `variantId` string, required

## Query parameters

- `confirmLiveChange` boolean

## Response `200`

Variant deleted

- 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` string
    - `testType` 'subject' | 'content' — Effective sequence variant strategy. Present for sequence tests.
    - `winnerThreshold` integer — Effective sequence recipient threshold. Present for sequence tests.
    - `settings` object — Effective settings for this test kind. Campaign tests return testPercentage, testDurationMinutes, and winnerCriteria; sequence tests return testType, winnerThreshold, and winnerCriteria.
    - `winningVariantId` string, nullable
    - `winnerSelectedAt` string, date-time, nullable
    - `testStartedAt` string, date-time, nullable
    - `testEndsAt` string, date-time, nullable
    - `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.
        - `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'
          - `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` — Non-draft test, control variant, minimum variant count reached, or missing live-change confirmation
- `401` — Unauthorized
- `404` — A/B test or variant not found
- `500` — Variant could not be deleted
- `503` — The database was temporarily unavailable. The request may be retried after the delay in Retry-After.

## Changes

- **2026-08-26** `11b6d27ba1de` — 1 warning, 9 info
  - added the new `group` enum value to the `abTest/variants/items/blocks/items/type` response property for the response status `200`
  - added the optional property `abTest/variants/items/blocks/items/children` to the response with the `200` status
  - added the optional property `abTest/variants/items/blocks/items/columns` to the response with the `200` status
  - added the optional property `abTest/variants/items/blocks/items/gap` to the response with the `200` status
  - …6 more
- **2026-08-19** `ba3a29c6eb33` — 5 info
  - added the optional property `retryable` to the response with the `400` status
  - added the optional property `retryable` to the response with the `401` status
  - added the optional property `retryable` to the response with the `404` status
  - added the optional property `retryable` to the response with the `500` status
  - …1 more
- **2026-08-18** `8fbabe82a04d` — 1 info
  - added the non-success response with the status `503`
- **2026-08-16** `6fd2903b91ce` — 4 info
  - added the optional property `code` to the response with the `400` status
  - added the optional property `code` to the response with the `401` status
  - added the optional property `code` to the response with the `404` status
  - added the optional property `code` to the response with the `500` status
- …earlier changes not shown

[Full history](https://skmtc.dev/sequenzy/apis/sequenzy-api/changes/ab-tests/:abTestId/variants/:variantId/delete.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-service-production.skmtc.workers.dev/v1/apis/sequenzy/sequenzy-api/revisions/73f826277d9a/schema)
