Extend a holdout test
Extends the site's running holdout test by 7, 14 or 28 days: its planned end moves later and its identity stays, so the sessions already assigned keep their group and the group without the assistant stays without it until the new end. `holdout_not_extendable` once the test has ended, reached its planned end, or when it has no planned end (it was started before planned ends existed): start a new test instead. Records an audit entry (`site.holdout_extended`) attributed to the API key.
Authorization
ApiKeyAuth A WorkOS org-scoped API key, created from the dashboard's organization settings page. Identifies the tenant every read and write is scoped to. Missing, malformed, unknown, revoked, expired, or non-organization-owned keys all return 401 (no distinction, so the response can't be used to probe which keys or org ids exist).
In: header
Path Parameters
The site id (prefixed site_). A site id that isn't yours is a 404, same as any other cross-tenant id.
Request Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
Response Body
application/json
application/problem+json
application/problem+json
application/problem+json
application/problem+json
application/problem+json
application/problem+json
curl -X POST "https://example.com/api/v1/sites/string/holdout/extend" \ -H "Content-Type: application/json" \ -d '{ "days": 14 }'{ "data": { "id": "hold_01kvnwmagvf27rc9cze5rm9e1r", "siteId": "site_01kvnwmagvf27rc9cze5rm9e1r", "status": "running", "state": "below_floor", "endedReason": null, "startedAt": "2026-10-22T08:00:00.000Z", "endedAt": null, "controlPercent": 50, "trafficFloor": 5000, "control": { "assignedSessions": 1800, "convertedSessions": 140, "rate": 0.0778, "addToCartEvents": 490, "eventsWithoutAmount": 0, "valueAdded": [], "valuePerAssignedSession": [] }, "treatment": { "assignedSessions": 1760, "convertedSessions": 151, "rate": 0.0858, "addToCartEvents": 528, "eventsWithoutAmount": 0, "valueAdded": [], "valuePerAssignedSession": [] }, "progress": 0.352, "effectPoints": null, "winner": null, "detectionLimitPoints": null, "lastStorefrontAddAt": "2026-10-26T09:41:00.000Z", "plannedEndAt": "2026-11-19T08:00:00.000Z", "forecastGapPoints": 0.6, "earlyResult": false, "engagementShare": null, "effectPerEngagedPoints": null }}Stop a holdout test
Stops the site's running holdout test: every session is offered the assistant again from its next page view, and the figures stay readable with `GET /holdout`. A test stopped before both groups reached the floor has no verdict; one stopped after keeps the verdict it had. `holdout_not_running` when no test runs. Records an audit entry (`site.holdout_stopped`) attributed to the API key.
Get what a holdout start would do
Reads, before starting, what a holdout test would do on the site: the planned durations (3, 7, 14 and 28 days; 3 only when it reaches the precision target) with the sessions each group would receive and the smallest gap the test could confirm for this site's traffic and baseline add-to-cart rate, the recommended duration, and why a start is refused when it is. Estimated from the last 7 days of traffic, so traffic that changes during the run changes the figures. A read, open to every member.