Skip to main content
The ABConvert API lets you run A/B tests on your Shopify store from your own code. Use it to:
  • 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

Authenticate every request with a bearer token. See Authentication.

Terminology

The API’s resource is the experiment: every endpoint, field, and identifier says experiment. 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:
To fetch the next page, pass the previous page’s next_cursor as ?cursor=. Errors share one shape. Every status code returns the same error object, carrying a stable machine-readable code:
A success response can also carry non-blocking findings, in a top-level 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:
  • name and hypothesis
  • primary_metric
  • Each test group’s name and split
  • The schedule’s end_at
Changing anything else requires a draft.
Try it:
  1. Create a draft with Create a test.
  2. Preview a test. The response returns one preview URL per test group.
  3. Open a preview URL in your browser to see that test group live on your storefront.
  4. Launch a test.

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 403 permission_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.