- Create and launch tests: price, shipping, theme, template, URL redirect, checkout, and offer tests, with the same validation the ABConvert admin runs.
- Automate the lifecycle: schedule a window, preview each test group on your storefront, pause, resume, and end tests from your own tooling.
- Read results: outcomes with Bayesian and frequentist statistics, custom breakdowns by country, device, or UTM, and order-level CSV exports.
Endpoints marked beta can change. Webhooks ship in a later release. Until
then, poll
GET /v1/experiments
to detect state changes.Base URL
Terminology
The API’s resource is the experiment: every endpoint, field, and identifier saysexperiment. Everywhere outside code, these docs say “test,” the same word as the ABConvert admin. The two names refer to the same object.
Identifiers
A test splits traffic between test groups, and the index is a test group’s identity: results, preview URLs, and
PATCH merges all reference it. name is only a display label, and you can change it at any time.
Data formats
Requests and responses
Updates are sparse.PATCH changes only the fields you send. Leave a field out and it stays unchanged. An array whose entries carry an identifier merges entry by entry instead of being replaced: prices merges on product_variant_id, test_groups on index. To delete one entry, send it with "remove": true.
Lists are cursor-paginated. Every list response uses the same envelope:
next_cursor as ?cursor=.
Errors share one shape. Every status code returns the same error object, carrying a stable machine-readable code:
warnings array.
Retries are safe on create. POST /v1/experiments and POST /v1/experiments/{id}/exports accept an Idempotency-Key header, so a retried request never creates a duplicate.
Test lifecycle
A test holds one of seven statuses:draft, preview, active, paused, ended, failed, or archived.
Creating a test always produces a draft. start is the only way to launch one. Every lifecycle action applies immediately and returns the updated test.
Launching locks the test’s configuration. After launch, you can still change:
nameandhypothesisprimary_metric- Each test group’s
nameandsplit - The schedule’s
end_at
Feature availability
Every ABConvert plan includes API access. Individual test types check your shop’s entitlements twice: when you create the test, and when you launch it. A shop that fails a check gets a 403permission_error whose code and message name exactly what is missing.
A lapsed subscription (
subscription_inactive) or a reached usage cap (billing_cap_reached) blocks create, start, and resume.
You keep control of tests that are already live: pause, end, and archive never check entitlements.
Rate limits
Each token gets:GET requests are reads, and so are the two POST endpoints that only read data: Create a custom result query and Create an export job. Everything else is a write.
Every response carries X-RateLimit-* headers. A 429 response adds Retry-After, in seconds.