---
title: "Create a sales-framework A/B test"
method: POST
path: "/api/ab-tests"
tags: ["A/B tests"]
---

# Create a sales-framework A/B test

`POST /api/ab-tests`

## Request

- Base URL: `https://api.setluca.com`
- URL: `https://api.setluca.com/api/ab-tests`
- Auth: API key in cookie `luca.session_token`

Sets up a head-to-head between two sales frameworks. It starts as a draft unless you pass `start: true`. Only one framework test can run at a time. A framework test matches every lead, so a second one would split the same traffic twice and starve both. You'll get a 409 if one's already running.

**Session-only.** This endpoint isn't on the API-key allowlist. An organization API key gets a 403 here, whatever scopes it holds.

## Headers

- `Luca-API-Version` '1'

## Request body

- CreateAbTestRequest
  - `name` string, required
  - `description` string
  - `variantAFrameworkId` 'sandler' | 'spin' | 'challenger' | 'nepq' | 'gap' | 'straight_line' | 'consultative' | 'solution' | 'value' | 'inbound', required
  - `variantBFrameworkId` 'sandler' | 'spin' | 'challenger' | 'nepq' | 'gap' | 'straight_line' | 'consultative' | 'solution' | 'value' | 'inbound', required
  - `successMetric` 'call_booked' | 'lead_replied' | 'lead_qualified' | 'crm_deal_won'
  - `trafficSplit` integer
  - `minSampleSize` integer
  - `maxDurationDays` integer
  - `start` boolean

## Response `200`

ok

- AbTest
  - `id` string, uuid, required
  - `coachId` string, uuid, required
  - `name` string, required
  - `description` string, nullable, required
  - `status` 'draft' | 'running' | 'paused' | 'completed' | 'archived', required
  - `testType` 'message_copy' | 'objection_strategy' | 'tone' | 'opening' | 'cta_type' | 'offer_presentation' | 'voice_vs_text' | 'sales_framework' | 'multi_stage', required
  - `variantA` object, required
    - `frameworkId` string
    - `objectionType` string
    - `strategy` string
  - `variantB` object, required
    - `frameworkId` string
    - `objectionType` string
    - `strategy` string
  - `trafficSplit` integer, required
  - `successMetric` 'call_booked' | 'lead_replied' | 'lead_qualified' | 'ghost_rate' | 'crm_deal_won', required
  - `minSampleSize` integer, required
  - `maxDurationDays` integer, required
  - `winner` 'a' | 'b' | 'none' | 'null', nullable, required
  - `startedAt` string, nullable, required
  - `completedAt` string, nullable, required
  - `createdAt` string, required
  - `updatedAt` string, required

## Other responses

- `400`: bad request
- `401`: unauthorized
- `409`: conflict
- `429`: rate limited
- `500`: internal error

---

[API](https://skmtc.dev/setluca/apis/luca-api.md) · [All operations](https://skmtc.dev/setluca/apis/luca-api/llms.txt) · [OpenAPI document](https://skmtc.dev/setluca/apis/luca-api/revisions/90a200e4100b?raw)
