developer

Generated OpenAPI reference

API for managing A/B testing experiments, variations, goals, webhooks, and screenshots.

Roadmap

GET

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

  • limit in query
  • cursor in query
  • q in query - Search title, description, hypothesis, brief, and research notes.
  • has_experiment in query - When false, only returns approved ideas without a linked experiment. When true, only returns ideas with a linked experiment.

Responses

  • 200 Approved roadmap ideas
  • 401 Unauthorized
  • 403 API key is missing backlog read permission
  • 429 Rate limit exceeded
cURL
curl \
  https://app.drip-apex.com/api/v1/roadmap/approved \
  -H "Authorization: Bearer <apex-secret-key>"
GET

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

  • id in path required

Responses

  • 200 Roadmap build handoff
  • 401 Unauthorized
  • 403 API key is missing backlog read permission
  • 404 Roadmap item not found
  • 429 Rate limit exceeded
cURL
curl \
  https://app.drip-apex.com/api/v1/roadmap/items/exp_123/handoff \
  -H "Authorization: Bearer <apex-secret-key>"

Experiments

GET

List experiments

/experiments

Returns a paginated list of experiments. Supports cursor-based pagination and optional status filter.

Parameters

  • status in query
  • limit in query
  • cursor in query - ID of the last item from the previous page

Responses

  • 200 Paginated list of experiments
  • 401 Unauthorized
  • 429 Rate limit exceeded
cURL
curl \
  https://app.drip-apex.com/api/v1/experiments \
  -H "Authorization: Bearer <apex-secret-key>"
POST

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

  • 201 Experiment created
  • 400 Validation error
  • 401 Unauthorized
  • 429 Rate limit exceeded
cURL
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

Get experiment

/experiments/{id}

Returns a single experiment by ID with variations and goals.

Parameters

  • id in path required

Responses

  • 200 Experiment details
  • 404 Experiment not found
cURL
curl \
  https://app.drip-apex.com/api/v1/experiments/exp_123 \
  -H "Authorization: Bearer <apex-secret-key>"
PATCH

Update experiment

/experiments/{id}

Partially updates an experiment. Cannot update completed experiments.

Parameters

  • id in 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

  • 200 Experiment updated
  • 400 Cannot update completed experiment
  • 404 Experiment not found
cURL
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

Delete experiment

/experiments/{id}

Permanently deletes an experiment and its variations.

Parameters

  • id in path required

Responses

  • 200 Experiment deleted
  • 404 Experiment not found
cURL
curl -X DELETE \
  https://app.drip-apex.com/api/v1/experiments/exp_123 \
  -H "Authorization: Bearer <apex-secret-key>"
GET

Get experiment results

/experiments/{id}/results

Returns the canonical experiment results read model, including totals, arms, decision, metrics, timeseries, warnings, and delivery health.

Parameters

  • id in path required
  • currency in query - Optional ISO currency code for revenue diagnostics.

Responses

  • 200 Experiment results
  • 401 Unauthorized
  • 403 API key is missing experiment read permission
  • 404 Experiment not found
  • 429 Rate limit exceeded
cURL
curl \
  https://app.drip-apex.com/api/v1/experiments/exp_123/results \
  -H "Authorization: Bearer <apex-secret-key>"
GET

Get experiment by slug

/experiments/by-slug/{slug}

Fetch a single experiment by slug (scoped to the API key's shop).

Parameters

  • slug in path required

Responses

  • 200 Experiment details
  • 401 Unauthorized
  • 404 Experiment not found
  • 429 Rate limit exceeded
cURL
curl \
  https://app.drip-apex.com/api/v1/experiments/by-slug/example_slug \
  -H "Authorization: Bearer <apex-secret-key>"
PUT

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

  • slug in 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

  • 200 Experiment updated
  • 201 Experiment created
  • 400 Validation error
  • 401 Unauthorized
  • 409 Conflict (experiment not in draft status or slug already exists)
  • 429 Rate limit exceeded
cURL
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": []
}'
POST

Pause experiment

/experiments/{id}/pause

Pauses a running experiment.

Parameters

  • id in path required

Responses

  • 200 Experiment paused
  • 400 Only running experiments can be paused
  • 404 Experiment not found
cURL
curl -X POST \
  https://app.drip-apex.com/api/v1/experiments/exp_123/pause \
  -H "Authorization: Bearer <apex-secret-key>"
POST

Complete experiment

/experiments/{id}/complete

Marks a running or paused experiment as completed. Sets ended_at timestamp.

Parameters

  • id in path required

Responses

  • 200 Experiment completed
  • 400 Only running or paused experiments can be completed
  • 404 Experiment not found
cURL
curl -X POST \
  https://app.drip-apex.com/api/v1/experiments/exp_123/complete \
  -H "Authorization: Bearer <apex-secret-key>"
POST

Duplicate experiment

/experiments/{id}/duplicate

Creates a copy of the experiment in draft status with all variations and goal associations.

Parameters

  • id in path required

Responses

  • 201 Duplicate experiment created
  • 404 Experiment not found
cURL
curl -X POST \
  https://app.drip-apex.com/api/v1/experiments/exp_123/duplicate \
  -H "Authorization: Bearer <apex-secret-key>"
POST

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

  • 201 AI-generated experiment created
  • 400 Validation error
cURL
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

POST

Generate variation with AI

/experiments/{id}/variations/generate

Uses AI to generate a new variation for an existing experiment.

Parameters

  • id in path required - Experiment ID

Request body

{
  prompt: string
}

Responses

  • 201 AI-generated variation created
  • 400 Validation error
  • 404 Experiment not found
cURL
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"
}'
POST

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

  • 201 Variation created
  • 400 Validation error or experiment not in draft status
  • 404 Experiment not found
cURL
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

Get variation

/variations/{id}

Returns a single variation by ID.

Parameters

  • id in path required

Responses

  • 200 Variation details
  • 403 Not authorized to access this variation
  • 404 Variation not found
cURL
curl \
  https://app.drip-apex.com/api/v1/variations/exp_123 \
  -H "Authorization: Bearer <apex-secret-key>"
PATCH

Update variation

/variations/{id}

Partially updates a variation. Cannot update is_control or variations on completed experiments.

Parameters

  • id in path required

Request body

{
  name?: string
  weight?: number
  mutations?: Mutation[]
  custom_css?: string | null
  custom_js?: string | null
}

Responses

  • 200 Variation updated
  • 400 Cannot modify completed experiment variations
  • 403 Not authorized
  • 404 Variation not found
cURL
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

Delete variation

/variations/{id}

Deletes a non-control variation from a draft experiment. Minimum 2 variations must remain.

Parameters

  • id in path required

Responses

  • 200 Variation deleted
  • 400 Cannot delete control, non-draft experiment, or last two variations
  • 403 Not authorized
  • 404 Variation not found
cURL
curl -X DELETE \
  https://app.drip-apex.com/api/v1/variations/exp_123 \
  -H "Authorization: Bearer <apex-secret-key>"

Apex Workspace

GET

Read variation workspace

/experiments/{id}/variations/{variationId}/workspace

Returns the canonical Apex workspace for an exact experiment variation. Used by `apex workspace checkout`.

Parameters

  • id in path required - Experiment ID
  • variationId in path required - Variation ID

Responses

  • 200 Canonical workspace payload
  • 401 Unauthorized
  • 403 Not authorized to access this variation
  • 404 Experiment variation workspace not found
  • 429 Rate limit exceeded
cURL
curl \
  https://app.drip-apex.com/api/v1/experiments/exp_123/variations/variation_123/workspace \
  -H "Authorization: Bearer <apex-secret-key>"
GET

List variation workspace files

/experiments/{id}/variations/{variationId}/files

Lists canonical workspace files for an exact experiment variation.

Parameters

  • id in path required
  • variationId in path required

Responses

  • 200 Workspace files
  • 401 Unauthorized
  • 403 Not authorized to access this variation
  • 404 Experiment variation workspace not found
  • 429 Rate limit exceeded
cURL
curl \
  https://app.drip-apex.com/api/v1/experiments/exp_123/variations/variation_123/files \
  -H "Authorization: Bearer <apex-secret-key>"
GET

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

  • id in path required
  • variationId in path required
  • path in path required - Canonical workspace path, URL-encoded. Supported roots: src, goals, segments, network, metrics.json, targeting.json, experiment.config.json, dev-doc.md.

Responses

  • 200 Workspace file
  • 401 Unauthorized
  • 403 Not authorized to access this variation
  • 404 Workspace file not found
  • 429 Rate limit exceeded
cURL
curl \
  https://app.drip-apex.com/api/v1/experiments/exp_123/variations/variation_123/files/example_path \
  -H "Authorization: Bearer <apex-secret-key>"
PUT

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

  • id in path required
  • variationId in path required
  • path in 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

  • 200 Workspace file write result
  • 400 Validation error or unsupported workspace path
  • 401 Unauthorized
  • 403 Not authorized to edit this variation
  • 404 Experiment variation workspace not found
  • 429 Rate limit exceeded
cURL
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"
}'
POST

Build variation workspace

/experiments/{id}/variations/{variationId}/build

Projects canonical workspace files into Apex runtime state: mutations, CSS, JS, targeting, goals, and segments.

Parameters

  • id in path required
  • variationId in path required

Responses

  • 200 Workspace build succeeded
  • 400 Workspace build failed
  • 401 Unauthorized
  • 403 Not authorized to edit this variation
  • 404 Experiment variation workspace not found
  • 429 Rate limit exceeded
cURL
curl -X POST \
  https://app.drip-apex.com/api/v1/experiments/exp_123/variations/variation_123/build \
  -H "Authorization: Bearer <apex-secret-key>"
GET

List variation workspace revisions

/experiments/{id}/variations/{variationId}/revisions

Lists recent workspace revisions for an exact experiment variation.

Parameters

  • id in path required
  • variationId in path required

Responses

  • 200 Workspace revisions
  • 401 Unauthorized
  • 403 Not authorized to access this variation
  • 404 Experiment variation workspace not found
  • 429 Rate limit exceeded
cURL
curl \
  https://app.drip-apex.com/api/v1/experiments/exp_123/variations/variation_123/revisions \
  -H "Authorization: Bearer <apex-secret-key>"

Tracking

GET

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

  • minutes in query
  • limit in query
  • experiment_id in query
  • event_type in query - Comma-separated event type filter.

Responses

  • 200 Tracking verification summary
  • 401 Unauthorized
  • 403 API key is missing experiment read permission
  • 429 Rate limit exceeded
cURL
curl \
  https://app.drip-apex.com/api/v1/tracking/verify \
  -H "Authorization: Bearer <apex-secret-key>"

Targeting

GET

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

  • url in query required
  • status in query - Comma-separated statuses or all. Defaults to draft,running,paused.

Responses

  • 200 Targeting evaluation
  • 400 Invalid URL
  • 401 Unauthorized
  • 403 API key is missing experiment read permission
  • 429 Rate limit exceeded
cURL
curl \
  https://app.drip-apex.com/api/v1/targeting/test \
  -H "Authorization: Bearer <apex-secret-key>"

SOS

POST

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

  • 200 Existing open SOS ticket reused
  • 201 SOS ticket created
  • 401 Unauthorized
  • 403 API key is missing experiment write permission
  • 429 Rate limit exceeded
  • 502 Jira create failed
  • 503 SOS is disabled
cURL
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"
}'
GET

List my SOS tickets

/sos/mine

Lists SOS tickets created by the current API key.

Responses

  • 200 SOS tickets
  • 401 Unauthorized
  • 403 API key is missing experiment read permission
  • 429 Rate limit exceeded
cURL
curl \
  https://app.drip-apex.com/api/v1/sos/mine \
  -H "Authorization: Bearer <apex-secret-key>"

Brand

GET

Get brand context

/brand-context

Returns the compiled shop brand context for external agents and developer workflows. Internal Apex notes are never included.

Responses

  • 200 Compiled brand context
  • 401 Unauthorized
  • 403 API key is missing experiment read permission
  • 429 Rate limit exceeded
cURL
curl \
  https://app.drip-apex.com/api/v1/brand-context \
  -H "Authorization: Bearer <apex-secret-key>"

Goals

GET

List goals

/goals

Returns a paginated list of goals for the shop.

Parameters

  • limit in query
  • cursor in query

Responses

  • 200 Paginated list of goals
  • 401 Unauthorized
  • 429 Rate limit exceeded
cURL
curl \
  https://app.drip-apex.com/api/v1/goals \
  -H "Authorization: Bearer <apex-secret-key>"
POST

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

  • 201 Goal created
  • 400 Validation error
cURL
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

Get goal

/goals/{id}

Returns a single goal by ID.

Parameters

  • id in path required

Responses

  • 200 Goal details
  • 404 Goal not found
cURL
curl \
  https://app.drip-apex.com/api/v1/goals/exp_123 \
  -H "Authorization: Bearer <apex-secret-key>"
PATCH

Update goal

/goals/{id}

Partially updates a goal.

Parameters

  • id in 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

  • 200 Goal updated
  • 404 Goal not found
cURL
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

Delete goal

/goals/{id}

Permanently deletes a goal.

Parameters

  • id in path required

Responses

  • 200 Goal deleted
  • 404 Goal not found
cURL
curl -X DELETE \
  https://app.drip-apex.com/api/v1/goals/exp_123 \
  -H "Authorization: Bearer <apex-secret-key>"

Screenshots

POST

Create screenshot job

/experiments/{id}/screenshots

Queues a screenshot capture job for the specified variations and devices.

Parameters

  • id in path required - Experiment ID

Request body

{
  devices: string[]
  variation_ids: string[]
}

Responses

  • 202 Screenshot job queued
  • 400 Validation error
  • 404 Experiment not found
cURL
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

Get screenshot job status

/screenshots/{jobId}

Returns the current status and results of a screenshot job.

Parameters

  • jobId in path required

Responses

  • 200 Screenshot job details
  • 404 Job not found
cURL
curl \
  https://app.drip-apex.com/api/v1/screenshots/job_123 \
  -H "Authorization: Bearer <apex-secret-key>"

Webhooks

GET

List webhooks

/webhooks

Returns all webhooks for the shop.

Responses

  • 200 List of webhooks
  • 401 Unauthorized
cURL
curl \
  https://app.drip-apex.com/api/v1/webhooks \
  -H "Authorization: Bearer <apex-secret-key>"
POST

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

  • 201 Webhook created
  • 400 Validation error
cURL
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

Delete webhook

/webhooks/{id}

Removes a webhook registration.

Parameters

  • id in path required

Responses

  • 200 Webhook deleted
  • 404 Webhook not found
cURL
curl -X DELETE \
  https://app.drip-apex.com/api/v1/webhooks/exp_123 \
  -H "Authorization: Bearer <apex-secret-key>"
GET

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

  • id in path required
  • status in query
  • limit in query

Responses

  • 200 List of webhook delivery attempts
  • 404 Webhook not found
cURL
curl \
  https://app.drip-apex.com/api/v1/webhooks/exp_123/deliveries \
  -H "Authorization: Bearer <apex-secret-key>"