---
title: "List, add, or remove campaign message arms. Safety limit: one step and one added/removed arm per call. Example: action='"
method: GET
path: "/api/v1/campaigns/{campaign_id}/steps/{step_index}/variants"
tags: ["campaign-variants"]
---

# List, add, or remove campaign message arms. Safety limit: one step and one added/removed arm per call. Example: action='

`GET /api/v1/campaigns/{campaign_id}/steps/{step_index}/variants`

## Request

- Base URL: `https://crispy.sh`
- URL: `https://crispy.sh/api/v1/campaigns/{campaign_id}/steps/{step_index}/variants`
- Auth: HTTP bearer

## Path parameters

- `campaign_id` string, required
- `step_index` string, required

## Query parameters

- `label` string: Required for action='add' or action='remove'. Short label for the variant (e.g. 'B').
- `message_template` string: Required for action='add'. Message template text for this variant. Supports {first_name}, {company}, etc.
- `subject` string: Optional for action='add'. Subject line for InMail steps.
- `target` 'sequence' | 'follow_up': Which step array to target. 'sequence' (default) = pre-send. 'follow_up' = post-acceptance.

## Response `200`

Success

## Other responses

- `401`: Missing or expired API key
- `403`: Insufficient key scope or permission denied
- `429`: Rate limit exceeded

---

[API](https://skmtc.dev/crispy/apis/crispy-rest-api.md) · [All operations](https://skmtc.dev/crispy/apis/crispy-rest-api/llms.txt) · [OpenAPI document](https://skmtc.dev/crispy/apis/crispy-rest-api/revisions/6bed0974d9ce?raw)
