A/B Testing
Run split tests on email campaigns to find the best subject, content, or sender
A/B Testing
A/B tests let you send different variants of a campaign to a subset of your audience and automatically promote the winning variant to the remainder. You choose the test metric, sample size, and duration.
Auth scope: send or send:marketing
Endpoints
| Method | Path | Description |
|---|---|---|
GET | /api/v1/ab-tests | List A/B tests |
POST | /api/v1/ab-tests | Create an A/B test |
GET | /api/v1/ab-tests/:id | Get test details and results |
POST | /api/v1/ab-tests/:id/winner | Pick and send the winning variant |
GET /api/v1/ab-tests
List all A/B tests for the authenticated account.
curl "https://mail.misar.io/api/v1/ab-tests?page=1&limit=20" \
-H "Authorization: Bearer msk_YOUR_API_KEY"Response
{
"success": true,
"ab_tests": [
{
"id": "abt_abc123",
"campaign_id": "camp_xyz789",
"status": "running",
"metric": "open_rate",
"test_size_percent":20,
"variant_count": 2,
"winner_id": null,
"created_at": "2026-04-01T08:00:00Z"
}
],
"total": 4
}POST /api/v1/ab-tests
Create an A/B test tied to an existing campaign. The campaign must be in draft status.
curl -X POST https://mail.misar.io/api/v1/ab-tests \
-H "Authorization: Bearer msk_YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"campaign_id": "camp_xyz789",
"test_size_percent": 20,
"metric": "open_rate",
"auto_send_winner": true,
"auto_send_after_hours": 4,
"variants": [
{
"name": "Variant A",
"subject": "Your exclusive offer inside"
},
{
"name": "Variant B",
"subject": "{{first_name}}, we have something special for you"
}
]
}'Request Fields
| Field | Type | Required | Notes |
|---|---|---|---|
campaign_id | string | ✓ | Campaign to test — must be in draft status |
variants | array | ✓ | 2–5 variants; each overrides campaign fields |
test_size_percent | number | ✓ | Percentage of audience for the test (e.g. 20 = 20%) |
metric | string | ✓ | Success metric — see options below |
auto_send_winner | boolean | — | Automatically send winner when test concludes (default: false) |
auto_send_after_hours | number | — | Hours to wait before picking a winner (default: 24) |
Metric Options
| Metric | Description |
|---|---|
open_rate | Variant with highest unique open rate wins |
click_rate | Variant with highest unique click rate wins |
reply_rate | Variant with most direct replies wins |
Variant Fields (each overrides the base campaign for that variant's send)
| Field | Notes |
|---|---|
name | Display name for reporting |
subject | Override subject line — supports merge tags |
body_html | Override HTML body |
body_text | Override plain text body |
from_name | Override sender display name |
Response
{
"success": true,
"ab_test": {
"id": "abt_abc123",
"status": "draft",
"variants": [
{ "id": "var_1", "name": "Variant A", "send_count": 0 },
{ "id": "var_2", "name": "Variant B", "send_count": 0 }
]
}
}GET /api/v1/ab-tests/:id
Get current test results per variant.
curl https://mail.misar.io/api/v1/ab-tests/abt_abc123 \
-H "Authorization: Bearer msk_YOUR_API_KEY"Response
{
"success": true,
"ab_test": {
"id": "abt_abc123",
"status": "running",
"metric": "open_rate",
"variants": [
{
"id": "var_1",
"name": "Variant A",
"send_count": 500,
"opens": 180,
"clicks": 45,
"open_rate": 0.360,
"click_rate": 0.090
},
{
"id": "var_2",
"name": "Variant B",
"send_count": 500,
"opens": 215,
"clicks": 62,
"open_rate": 0.430,
"click_rate": 0.124
}
],
"winner_id": null,
"concludes_at":"2026-04-06T12:00:00Z"
}
}POST /api/v1/ab-tests/:id/winner
Manually pick the winning variant and send it to the remainder of the audience. Call this before auto_send_after_hours to override the automatic selection.
curl -X POST https://mail.misar.io/api/v1/ab-tests/abt_abc123/winner \
-H "Authorization: Bearer msk_YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "variant_id": "var_2" }'Request Fields
| Field | Type | Required | Notes |
|---|---|---|---|
variant_id | string | ✓ | ID of the winning variant to send |
Response
{
"success": true,
"winner_variant_id":"var_2",
"remaining_sends": 4000,
"campaign_id": "camp_xyz789",
"status": "sending"
}Once a winner is sent, the A/B test status changes to completed. The winning variant's stats are merged into the parent campaign's analytics.
A/B Test Status Values
| Status | Meaning |
|---|---|
draft | Created but not yet launched |
running | Test variants are being sent and measured |
concluded | Measurement period ended — awaiting winner selection |
completed | Winner sent to remaining audience |
canceled | Test stopped before completion |