Generated OpenAPI reference
API for managing A/B testing experiments, variations, goals, webhooks, and screenshots.
Roadmap
List approved roadmap ideas
/roadmap/approved
Returns approved backlog/roadmap ideas ready to build in Apex. This is the API used by `apex roadmap approved`.
Parameters
limitin querycursorin queryqin query - Search title, description, hypothesis, brief, and research notes.has_experimentin query - When false, only returns approved ideas without a linked experiment. When true, only returns ideas with a linked experiment.
Responses
200Approved roadmap ideas401Unauthorized403API key is missing backlog read permission429Rate limit exceeded
curl \
https://app.drip-apex.com/api/v1/roadmap/approved \
-H "Authorization: Bearer <apex-secret-key>"Get roadmap build handoff
/roadmap/items/{id}/handoff
Returns the full build brief for an approved roadmap item, including hypothesis, target page, visual references, scoring, and Apex CLI workspace commands.
Parameters
idin path required
Responses
200Roadmap build handoff401Unauthorized403API key is missing backlog read permission404Roadmap item not found429Rate limit exceeded
curl \
https://app.drip-apex.com/api/v1/roadmap/items/exp_123/handoff \
-H "Authorization: Bearer <apex-secret-key>"Experiments
List experiments
/experiments
Returns a paginated list of experiments. Supports cursor-based pagination and optional status filter.
Parameters
statusin querylimitin querycursorin query - ID of the last item from the previous page
Responses
200Paginated list of experiments401Unauthorized429Rate limit exceeded
curl \
https://app.drip-apex.com/api/v1/experiments \
-H "Authorization: Bearer <apex-secret-key>"Create experiment
/experiments
Creates a new experiment. Default control and variant are created if variations are not provided.
Request body
{
name: string
slug?: string | null
description?: string | null
traffic_allocation?: number = 1
experiment_js?: string | null
experiment_reset_js?: string | null
experiment_css?: string | null
sequential_testing_enabled?: boolean
store_url?: string (uri)
auto_stop_override?: AutoStopOverride
guardian_override?: GuardianOverride
targeting?: object | null
variations?: object[]
primary_goal_id?: string (uuid)
goal_ids?: string[]
}Responses
201Experiment created400Validation error401Unauthorized429Rate limit exceeded
curl -X POST \
https://app.drip-apex.com/api/v1/experiments \
-H "Authorization: Bearer <apex-secret-key>" \
-H "Content-Type: application/json" \
-d '{
"name": "example_name"
}'Get experiment
/experiments/{id}
Returns a single experiment by ID with variations and goals.
Parameters
idin path required
Responses
200Experiment details404Experiment not found
curl \
https://app.drip-apex.com/api/v1/experiments/exp_123 \
-H "Authorization: Bearer <apex-secret-key>"Update experiment
/experiments/{id}
Partially updates an experiment. Cannot update completed experiments.
Parameters
idin path required
Request body
{
name?: string
slug?: string | null
description?: string | null
traffic_allocation?: number
experiment_js?: string | null
experiment_reset_js?: string | null
experiment_css?: string | null
sequential_testing_enabled?: boolean
store_url?: string (uri)
auto_stop_override?: AutoStopOverride
guardian_override?: GuardianOverride
targeting?: object | null
}Responses
200Experiment updated400Cannot update completed experiment404Experiment not found
curl -X PATCH \
https://app.drip-apex.com/api/v1/experiments/exp_123 \
-H "Authorization: Bearer <apex-secret-key>" \
-H "Content-Type: application/json" \
-d '{}'Delete experiment
/experiments/{id}
Permanently deletes an experiment and its variations.
Parameters
idin path required
Responses
200Experiment deleted404Experiment not found
curl -X DELETE \
https://app.drip-apex.com/api/v1/experiments/exp_123 \
-H "Authorization: Bearer <apex-secret-key>"Get experiment results
/experiments/{id}/results
Returns the canonical experiment results read model, including totals, arms, decision, metrics, timeseries, warnings, and delivery health.
Parameters
idin path requiredcurrencyin query - Optional ISO currency code for revenue diagnostics.
Responses
200Experiment results401Unauthorized403API key is missing experiment read permission404Experiment not found429Rate limit exceeded
curl \
https://app.drip-apex.com/api/v1/experiments/exp_123/results \
-H "Authorization: Bearer <apex-secret-key>"Get experiment by slug
/experiments/by-slug/{slug}
Fetch a single experiment by slug (scoped to the API key's shop).
Parameters
slugin path required
Responses
200Experiment details401Unauthorized404Experiment not found429Rate limit exceeded
curl \
https://app.drip-apex.com/api/v1/experiments/by-slug/example_slug \
-H "Authorization: Bearer <apex-secret-key>"Upsert experiment by slug
/experiments/by-slug/{slug}
Idempotently create or update a draft experiment by slug. If an experiment exists with this slug and is not in draft status, returns 409.
Parameters
slugin path required
Request body
{
name: string
description?: string | null
traffic_allocation?: number = 1
experiment_js?: string | null
experiment_reset_js?: string | null
experiment_css?: string | null
sequential_testing_enabled?: boolean
store_url?: string (uri)
auto_stop_override?: AutoStopOverride
targeting?: object | null
variations: object[]
primary_goal_id?: string (uuid)
goal_ids?: string[]
}Responses
200Experiment updated201Experiment created400Validation error401Unauthorized409Conflict (experiment not in draft status or slug already exists)429Rate limit exceeded
curl -X PUT \
https://app.drip-apex.com/api/v1/experiments/by-slug/example_slug \
-H "Authorization: Bearer <apex-secret-key>" \
-H "Content-Type: application/json" \
-d '{
"name": "example_name",
"variations": []
}'Pause experiment
/experiments/{id}/pause
Pauses a running experiment.
Parameters
idin path required
Responses
200Experiment paused400Only running experiments can be paused404Experiment not found
curl -X POST \
https://app.drip-apex.com/api/v1/experiments/exp_123/pause \
-H "Authorization: Bearer <apex-secret-key>"Complete experiment
/experiments/{id}/complete
Marks a running or paused experiment as completed. Sets ended_at timestamp.
Parameters
idin path required
Responses
200Experiment completed400Only running or paused experiments can be completed404Experiment not found
curl -X POST \
https://app.drip-apex.com/api/v1/experiments/exp_123/complete \
-H "Authorization: Bearer <apex-secret-key>"Duplicate experiment
/experiments/{id}/duplicate
Creates a copy of the experiment in draft status with all variations and goal associations.
Parameters
idin path required
Responses
201Duplicate experiment created404Experiment not found
curl -X POST \
https://app.drip-apex.com/api/v1/experiments/exp_123/duplicate \
-H "Authorization: Bearer <apex-secret-key>"Generate experiment with AI
/experiments/generate
Uses AI to generate an experiment configuration based on a store URL and prompt.
Request body
{
store_url: string (uri)
prompt: string
primary_goal_id?: string (uuid)
goal_ids?: string[]
traffic_allocation?: number = 1
targeting?: object | null
screenshot_devices?: string[]
}Responses
201AI-generated experiment created400Validation error
curl -X POST \
https://app.drip-apex.com/api/v1/experiments/generate \
-H "Authorization: Bearer <apex-secret-key>" \
-H "Content-Type: application/json" \
-d '{
"store_url": "https://example.com",
"prompt": "example_prompt"
}'Variations
Generate variation with AI
/experiments/{id}/variations/generate
Uses AI to generate a new variation for an existing experiment.
Parameters
idin path required - Experiment ID
Request body
{
prompt: string
}Responses
201AI-generated variation created400Validation error404Experiment not found
curl -X POST \
https://app.drip-apex.com/api/v1/experiments/exp_123/variations/generate \
-H "Authorization: Bearer <apex-secret-key>" \
-H "Content-Type: application/json" \
-d '{
"prompt": "example_prompt"
}'Create variation
/variations
Creates a new variation for a draft experiment. Requires experiment_id in the body.
Request body
{
experiment_id: string (uuid)
name: string
weight: number
is_control?: boolean = false
mutations?: Mutation[]
custom_css?: string | null
custom_js?: string | null
}Responses
201Variation created400Validation error or experiment not in draft status404Experiment not found
curl -X POST \
https://app.drip-apex.com/api/v1/variations \
-H "Authorization: Bearer <apex-secret-key>" \
-H "Content-Type: application/json" \
-d '{
"experiment_id": "uuid-here",
"name": "example_name",
"weight": 1
}'Get variation
/variations/{id}
Returns a single variation by ID.
Parameters
idin path required
Responses
200Variation details403Not authorized to access this variation404Variation not found
curl \
https://app.drip-apex.com/api/v1/variations/exp_123 \
-H "Authorization: Bearer <apex-secret-key>"Update variation
/variations/{id}
Partially updates a variation. Cannot update is_control or variations on completed experiments.
Parameters
idin path required
Request body
{
name?: string
weight?: number
mutations?: Mutation[]
custom_css?: string | null
custom_js?: string | null
}Responses
200Variation updated400Cannot modify completed experiment variations403Not authorized404Variation not found
curl -X PATCH \
https://app.drip-apex.com/api/v1/variations/exp_123 \
-H "Authorization: Bearer <apex-secret-key>" \
-H "Content-Type: application/json" \
-d '{}'Delete variation
/variations/{id}
Deletes a non-control variation from a draft experiment. Minimum 2 variations must remain.
Parameters
idin path required
Responses
200Variation deleted400Cannot delete control, non-draft experiment, or last two variations403Not authorized404Variation not found
curl -X DELETE \
https://app.drip-apex.com/api/v1/variations/exp_123 \
-H "Authorization: Bearer <apex-secret-key>"Apex Workspace
Read variation workspace
/experiments/{id}/variations/{variationId}/workspace
Returns the canonical Apex workspace for an exact experiment variation. Used by `apex workspace checkout`.
Parameters
idin path required - Experiment IDvariationIdin path required - Variation ID
Responses
200Canonical workspace payload401Unauthorized403Not authorized to access this variation404Experiment variation workspace not found429Rate limit exceeded
curl \
https://app.drip-apex.com/api/v1/experiments/exp_123/variations/variation_123/workspace \
-H "Authorization: Bearer <apex-secret-key>"List variation workspace files
/experiments/{id}/variations/{variationId}/files
Lists canonical workspace files for an exact experiment variation.
Parameters
idin path requiredvariationIdin path required
Responses
200Workspace files401Unauthorized403Not authorized to access this variation404Experiment variation workspace not found429Rate limit exceeded
curl \
https://app.drip-apex.com/api/v1/experiments/exp_123/variations/variation_123/files \
-H "Authorization: Bearer <apex-secret-key>"Read variation workspace file
/experiments/{id}/variations/{variationId}/files/{path}
Reads one canonical workspace file. URL-encode the file path, for example src%2Findex.js.
Parameters
idin path requiredvariationIdin path requiredpathin path required - Canonical workspace path, URL-encoded. Supported roots: src, goals, segments, network, metrics.json, targeting.json, experiment.config.json, dev-doc.md.
Responses
200Workspace file401Unauthorized403Not authorized to access this variation404Workspace file not found429Rate limit exceeded
curl \
https://app.drip-apex.com/api/v1/experiments/exp_123/variations/variation_123/files/example_path \
-H "Authorization: Bearer <apex-secret-key>"Write variation workspace file
/experiments/{id}/variations/{variationId}/files/{path}
Writes one canonical workspace file and records a workspace revision. Used by `apex workspace publish`.
Parameters
idin path requiredvariationIdin path requiredpathin path required - Canonical workspace path, URL-encoded. Supported roots: src, goals, segments, network, metrics.json, targeting.json, experiment.config.json, dev-doc.md.
Request body
{
content: string
source?: "manual" | "operator" | "build" | "system"
title?: string
}Responses
200Workspace file write result400Validation error or unsupported workspace path401Unauthorized403Not authorized to edit this variation404Experiment variation workspace not found429Rate limit exceeded
curl -X PUT \
https://app.drip-apex.com/api/v1/experiments/exp_123/variations/variation_123/files/example_path \
-H "Authorization: Bearer <apex-secret-key>" \
-H "Content-Type: application/json" \
-d '{
"content": "example_content",
"source": "manual",
"title": "example_title"
}'Build variation workspace
/experiments/{id}/variations/{variationId}/build
Projects canonical workspace files into Apex runtime state: mutations, CSS, JS, targeting, goals, and segments.
Parameters
idin path requiredvariationIdin path required
Responses
200Workspace build succeeded400Workspace build failed401Unauthorized403Not authorized to edit this variation404Experiment variation workspace not found429Rate limit exceeded
curl -X POST \
https://app.drip-apex.com/api/v1/experiments/exp_123/variations/variation_123/build \
-H "Authorization: Bearer <apex-secret-key>"List variation workspace revisions
/experiments/{id}/variations/{variationId}/revisions
Lists recent workspace revisions for an exact experiment variation.
Parameters
idin path requiredvariationIdin path required
Responses
200Workspace revisions401Unauthorized403Not authorized to access this variation404Experiment variation workspace not found429Rate limit exceeded
curl \
https://app.drip-apex.com/api/v1/experiments/exp_123/variations/variation_123/revisions \
-H "Authorization: Bearer <apex-secret-key>"Tracking
Verify live tracking events
/tracking/verify
Returns recent Tinybird events for the API key's shop so agents can verify revenue, pageview, and custom tracking setup from the CLI.
Parameters
minutesin querylimitin queryexperiment_idin queryevent_typein query - Comma-separated event type filter.
Responses
200Tracking verification summary401Unauthorized403API key is missing experiment read permission429Rate limit exceeded
curl \
https://app.drip-apex.com/api/v1/tracking/verify \
-H "Authorization: Bearer <apex-secret-key>"Targeting
Test URL targeting
/targeting/test
Evaluates the API key shop's experiment targeting rules against one URL and returns all matching experiments for parallel-experiment awareness.
Parameters
urlin query requiredstatusin query - Comma-separated statuses or all. Defaults to draft,running,paused.
Responses
200Targeting evaluation400Invalid URL401Unauthorized403API key is missing experiment read permission429Rate limit exceeded
curl \
https://app.drip-apex.com/api/v1/targeting/test \
-H "Authorization: Bearer <apex-secret-key>"SOS
Create SOS ticket
/sos
Creates or reuses an Apex SOS ticket for QA, design, development, config, bug, or handover assistance.
Request body
{
experiment_id?: string (uuid)
type: "full_handover" | "design" | "development" | "qa" | "config" | "bug"
sub_class?: string | null
loom_url?: string (uri)
description: string
}Responses
200Existing open SOS ticket reused201SOS ticket created401Unauthorized403API key is missing experiment write permission429Rate limit exceeded502Jira create failed503SOS is disabled
curl -X POST \
https://app.drip-apex.com/api/v1/sos \
-H "Authorization: Bearer <apex-secret-key>" \
-H "Content-Type: application/json" \
-d '{
"type": "full_handover",
"description": "example_description"
}'List my SOS tickets
/sos/mine
Lists SOS tickets created by the current API key.
Responses
200SOS tickets401Unauthorized403API key is missing experiment read permission429Rate limit exceeded
curl \
https://app.drip-apex.com/api/v1/sos/mine \
-H "Authorization: Bearer <apex-secret-key>"Brand
Get brand context
/brand-context
Returns the compiled shop brand context for external agents and developer workflows. Internal Apex notes are never included.
Responses
200Compiled brand context401Unauthorized403API key is missing experiment read permission429Rate limit exceeded
curl \
https://app.drip-apex.com/api/v1/brand-context \
-H "Authorization: Bearer <apex-secret-key>"Goals
List goals
/goals
Returns a paginated list of goals for the shop.
Parameters
limitin querycursorin query
Responses
200Paginated list of goals401Unauthorized429Rate limit exceeded
curl \
https://app.drip-apex.com/api/v1/goals \
-H "Authorization: Bearer <apex-secret-key>"Create goal
/goals
Creates a new goal. Click goals require selector, pageview goals require url_pattern, custom goals require event_name.
Request body
{
name: string
type: "click" | "pageview" | "custom" | "revenue"
selector?: string | null
text_match?: string | null
url_pattern?: string | null
event_name?: string | null
count_once?: boolean = false
capture?: GoalCapture[]
}Responses
201Goal created400Validation error
curl -X POST \
https://app.drip-apex.com/api/v1/goals \
-H "Authorization: Bearer <apex-secret-key>" \
-H "Content-Type: application/json" \
-d '{
"name": "example_name",
"type": "click"
}'Get goal
/goals/{id}
Returns a single goal by ID.
Parameters
idin path required
Responses
200Goal details404Goal not found
curl \
https://app.drip-apex.com/api/v1/goals/exp_123 \
-H "Authorization: Bearer <apex-secret-key>"Update goal
/goals/{id}
Partially updates a goal.
Parameters
idin path required
Request body
{
name?: string
type?: "click" | "pageview" | "custom" | "revenue"
selector?: string | null
text_match?: string | null
url_pattern?: string | null
event_name?: string | null
count_once?: boolean
capture?: GoalCapture[]
}Responses
200Goal updated404Goal not found
curl -X PATCH \
https://app.drip-apex.com/api/v1/goals/exp_123 \
-H "Authorization: Bearer <apex-secret-key>" \
-H "Content-Type: application/json" \
-d '{}'Delete goal
/goals/{id}
Permanently deletes a goal.
Parameters
idin path required
Responses
200Goal deleted404Goal not found
curl -X DELETE \
https://app.drip-apex.com/api/v1/goals/exp_123 \
-H "Authorization: Bearer <apex-secret-key>"Screenshots
Create screenshot job
/experiments/{id}/screenshots
Queues a screenshot capture job for the specified variations and devices.
Parameters
idin path required - Experiment ID
Request body
{
devices: string[]
variation_ids: string[]
}Responses
202Screenshot job queued400Validation error404Experiment not found
curl -X POST \
https://app.drip-apex.com/api/v1/experiments/exp_123/screenshots \
-H "Authorization: Bearer <apex-secret-key>" \
-H "Content-Type: application/json" \
-d '{
"devices": [],
"variation_ids": []
}'Get screenshot job status
/screenshots/{jobId}
Returns the current status and results of a screenshot job.
Parameters
jobIdin path required
Responses
200Screenshot job details404Job not found
curl \
https://app.drip-apex.com/api/v1/screenshots/job_123 \
-H "Authorization: Bearer <apex-secret-key>"Webhooks
List webhooks
/webhooks
Returns all webhooks for the shop.
Responses
200List of webhooks401Unauthorized
curl \
https://app.drip-apex.com/api/v1/webhooks \
-H "Authorization: Bearer <apex-secret-key>"Create webhook
/webhooks
Registers a new webhook endpoint. URL must use HTTPS. Events: experiment.started, experiment.completed, experiment.significant, experiment.guardian_triggered, experiment.guardian_paused, variation.winning, screenshots.completed, project.published.
Request body
{
url: string (uri)
events: string[]
}Responses
201Webhook created400Validation error
curl -X POST \
https://app.drip-apex.com/api/v1/webhooks \
-H "Authorization: Bearer <apex-secret-key>" \
-H "Content-Type: application/json" \
-d '{
"url": "https://example.com",
"events": []
}'Delete webhook
/webhooks/{id}
Removes a webhook registration.
Parameters
idin path required
Responses
200Webhook deleted404Webhook not found
curl -X DELETE \
https://app.drip-apex.com/api/v1/webhooks/exp_123 \
-H "Authorization: Bearer <apex-secret-key>"List webhook deliveries
/webhooks/{id}/deliveries
Returns recent delivery attempts for one webhook. Delivery IDs are also sent as the X-Apex-Delivery-Id header on outbound webhook requests.
Parameters
idin path requiredstatusin querylimitin query
Responses
200List of webhook delivery attempts404Webhook not found
curl \
https://app.drip-apex.com/api/v1/webhooks/exp_123/deliveries \
-H "Authorization: Bearer <apex-secret-key>"