Generated OpenAPI reference
API for managing A/B testing experiments, variations, goals, webhooks, and screenshots.
Analytics
Show dashboard analytics stats
/analytics/stats
Parameters
daysin queryshop_currencyin query
Responses
200Analytics data401403429503Analytics is temporarily unavailable
curl \
https://app.drip-apex.com/api/v1/analytics/stats \
-H "Authorization: Bearer <apex-secret-key>"Show analytics timeseries
/analytics/timeseries
Parameters
daysin query
Responses
200Analytics data401403429503Analytics is temporarily unavailable
curl \
https://app.drip-apex.com/api/v1/analytics/timeseries \
-H "Authorization: Bearer <apex-secret-key>"Show traffic sources
/analytics/traffic
Parameters
daysin query
Responses
200Analytics data401403429503Analytics is temporarily unavailable
curl \
https://app.drip-apex.com/api/v1/analytics/traffic \
-H "Authorization: Bearer <apex-secret-key>"Show page analytics
/analytics/pages
Parameters
daysin queryplanningDaysin query - Planning window in days (planning_days is also accepted)limitin query
Responses
200Analytics data401403429503Analytics is temporarily unavailable
curl \
https://app.drip-apex.com/api/v1/analytics/pages \
-H "Authorization: Bearer <apex-secret-key>"Show geography and device analytics
/analytics/geo
Parameters
daysin query
Responses
200Analytics data401403429503Analytics is temporarily unavailable
curl \
https://app.drip-apex.com/api/v1/analytics/geo \
-H "Authorization: Bearer <apex-secret-key>"Show session analytics
/analytics/sessions
Parameters
daysin query
Responses
200Analytics data401403429503Analytics is temporarily unavailable
curl \
https://app.drip-apex.com/api/v1/analytics/sessions \
-H "Authorization: Bearer <apex-secret-key>"Show web vitals analytics
/analytics/web-vitals
Parameters
daysin query
Responses
200Analytics data401403429503Analytics is temporarily unavailable
curl \
https://app.drip-apex.com/api/v1/analytics/web-vitals \
-H "Authorization: Bearer <apex-secret-key>"Show realtime analytics
/analytics/realtime
Responses
200Analytics data401403429503Analytics is temporarily unavailable
curl \
https://app.drip-apex.com/api/v1/analytics/realtime \
-H "Authorization: Bearer <apex-secret-key>"Show entry and exit page analytics
/analytics/entry-exit
Parameters
daysin query
Responses
200Analytics data401403429503Analytics is temporarily unavailable
curl \
https://app.drip-apex.com/api/v1/analytics/entry-exit \
-H "Authorization: Bearer <apex-secret-key>"Other
List assets
/assets
Parameters
limitin querycursorin query
Responses
200Assets with cursor pagination400401403429
curl \
https://app.drip-apex.com/api/v1/assets \
-H "Authorization: Bearer <apex-secret-key>"Upload assets
/assets
Responses
201Uploaded assets400401403413Too many files or a file exceeds the upload size limit.429
curl -X POST \
https://app.drip-apex.com/api/v1/assets \
-H "Authorization: Bearer <apex-secret-key>"Get asset
/assets/{id}
Responses
200Asset401403404429
curl \
https://app.drip-apex.com/api/v1/assets/exp_123 \
-H "Authorization: Bearer <apex-secret-key>"Delete asset
/assets/{id}
Responses
200Deleted401403404429
curl -X DELETE \
https://app.drip-apex.com/api/v1/assets/exp_123 \
-H "Authorization: Bearer <apex-secret-key>"List landing pages
/landing-pages
Requires the Apex Labs feature for the shop; shops without it receive 404 Not Found.
Parameters
limitin querycursorin querystatusin query
Responses
200Landing pages with cursor pagination400401403404Apex Labs is not enabled for this shop, so landing pages are unavailable.429
curl \
https://app.drip-apex.com/api/v1/landing-pages \
-H "Authorization: Bearer <apex-secret-key>"Get landing page
/landing-pages/{id}
Responses
200Landing page401403404429
curl \
https://app.drip-apex.com/api/v1/landing-pages/exp_123 \
-H "Authorization: Bearer <apex-secret-key>"Generate external purchase pixel snippet
/external-pixels/snippet
Requires a secret API key with the external_pixels:write scope; the response embeds a signed ingest credential, so read-scoped and publishable keys receive 403 Forbidden.
Request body
{
provider?: string
handoverParam?: string
globalName?: string
}Responses
200Generated snippet400401403429
curl -X POST \
https://app.drip-apex.com/api/v1/external-pixels/snippet \
-H "Authorization: Bearer <apex-secret-key>" \
-H "Content-Type: application/json" \
-d '{
"provider": "example_provider",
"handoverParam": "example_handoverParam",
"globalName": "example_globalName"
}'List backlog
/backlog
Parameters
limitin querycursorin queryinclude_archivedin query - Include archived backlog items when true.
Responses
200Paginated backlog400401403429
curl \
https://app.drip-apex.com/api/v1/backlog \
-H "Authorization: Bearer <apex-secret-key>"Create a backlog item
/backlog
Request body
{ $ref: "BacklogCreate" }Responses
201Created400401403409429
curl -X POST \
https://app.drip-apex.com/api/v1/backlog \
-H "Authorization: Bearer <apex-secret-key>" \
-H "Content-Type: application/json" \
-d '{}'Get a backlogitem
/backlog/{id}
Responses
200Resource401403404429
curl \
https://app.drip-apex.com/api/v1/backlog/exp_123 \
-H "Authorization: Bearer <apex-secret-key>"Update a backlogitem
/backlog/{id}
Request body
{ $ref: "BacklogUpdate" }Responses
200Updated400401403404409429
curl -X PATCH \
https://app.drip-apex.com/api/v1/backlog/exp_123 \
-H "Authorization: Bearer <apex-secret-key>" \
-H "Content-Type: application/json" \
-d '{}'Delete a backlog item
/backlog/{id}
Responses
200Deleted401403404429
curl -X DELETE \
https://app.drip-apex.com/api/v1/backlog/exp_123 \
-H "Authorization: Bearer <apex-secret-key>"Archive a backlog item and reject its roadmap decision
/backlog/{id}/archive
Request body
{
feedback?: string,null
reason?: string,null
}Responses
200Archived backlog item401403404429
curl -X POST \
https://app.drip-apex.com/api/v1/backlog/exp_123/archive \
-H "Authorization: Bearer <apex-secret-key>" \
-H "Content-Type: application/json" \
-d '{}'Restore an archived backlog item and reset its roadmap decision to proposed
/backlog/{id}/restore
Responses
200Restored backlog item401403404429
curl -X POST \
https://app.drip-apex.com/api/v1/backlog/exp_123/restore \
-H "Authorization: Bearer <apex-secret-key>"List signals
/signals
The first page includes the built-in signal catalog before paginated custom signals. Built-ins do not participate in cursor pagination.
Parameters
limitin querycursorin queryinclude_archivedin query - Include archived custom signals when true. Built-in signals are always active.
Responses
200Paginated signals400401403429
curl \
https://app.drip-apex.com/api/v1/signals \
-H "Authorization: Bearer <apex-secret-key>"Create a signal
/signals
Request body
{ $ref: "SignalCreate" }Responses
201Created400401403409429
curl -X POST \
https://app.drip-apex.com/api/v1/signals \
-H "Authorization: Bearer <apex-secret-key>" \
-H "Content-Type: application/json" \
-d '{}'Get a signal
/signals/{id}
Responses
200Resource401403404429
curl \
https://app.drip-apex.com/api/v1/signals/exp_123 \
-H "Authorization: Bearer <apex-secret-key>"Update a signal
/signals/{id}
Request body
{ $ref: "SignalUpdate" }Responses
200Updated400401403404409429
curl -X PATCH \
https://app.drip-apex.com/api/v1/signals/exp_123 \
-H "Authorization: Bearer <apex-secret-key>" \
-H "Content-Type: application/json" \
-d '{}'Delete or archive a signal
/signals/{id}
Responses
200Deleted or archived401403404429
curl -X DELETE \
https://app.drip-apex.com/api/v1/signals/exp_123 \
-H "Authorization: Bearer <apex-secret-key>"List flags
/flags
Parameters
limitin querycursorin query
Responses
200Flags with cursor pagination400401403429
curl \
https://app.drip-apex.com/api/v1/flags \
-H "Authorization: Bearer <apex-secret-key>"Create flag
/flags
Request body
{ $ref: "FeatureFlagInput" }Responses
201Created flag400401403429
curl -X POST \
https://app.drip-apex.com/api/v1/flags \
-H "Authorization: Bearer <apex-secret-key>" \
-H "Content-Type: application/json" \
-d '{}'Get flag
/flags/{id}
Responses
200Flag401403404429
curl \
https://app.drip-apex.com/api/v1/flags/exp_123 \
-H "Authorization: Bearer <apex-secret-key>"Update flag
/flags/{id}
Request body
{ $ref: "FeatureFlagUpdateInput" }Responses
200Updated flag400401403404429
curl -X PATCH \
https://app.drip-apex.com/api/v1/flags/exp_123 \
-H "Authorization: Bearer <apex-secret-key>" \
-H "Content-Type: application/json" \
-d '{}'Activate flag
/flags/{id}/activate
Responses
200Updated flag401403404429
curl -X POST \
https://app.drip-apex.com/api/v1/flags/exp_123/activate \
-H "Authorization: Bearer <apex-secret-key>"Get flag edge publication status
/flags/{id}/status
Returns database publication metadata, the propagation worst-case window derived from the shop's effective runtime cache TTLs, and, for visual flags, the public edge config URL used to confirm propagation. Edge propagation does not apply to API-delivered flags.
Responses
200Flag publication status401403404429
curl \
https://app.drip-apex.com/api/v1/flags/exp_123/status \
-H "Authorization: Bearer <apex-secret-key>"Pause flag
/flags/{id}/pause
Responses
200Updated flag401403404429
curl -X POST \
https://app.drip-apex.com/api/v1/flags/exp_123/pause \
-H "Authorization: Bearer <apex-secret-key>"Archive flag
/flags/{id}/archive
Responses
200Updated flag401403404429
curl -X POST \
https://app.drip-apex.com/api/v1/flags/exp_123/archive \
-H "Authorization: Bearer <apex-secret-key>"List personalizations
/personalizations
Parameters
limitin querycursorin query
Responses
200Personalizations with cursor pagination400401403429
curl \
https://app.drip-apex.com/api/v1/personalizations \
-H "Authorization: Bearer <apex-secret-key>"Create personalization
/personalizations
Request body
{ $ref: "PersonalizationInput" }Responses
201Created personalization400401403429
curl -X POST \
https://app.drip-apex.com/api/v1/personalizations \
-H "Authorization: Bearer <apex-secret-key>" \
-H "Content-Type: application/json" \
-d '{}'Get personalization
/personalizations/{id}
Responses
200Personalization401403404429
curl \
https://app.drip-apex.com/api/v1/personalizations/exp_123 \
-H "Authorization: Bearer <apex-secret-key>"Update personalization
/personalizations/{id}
Request body
{ $ref: "PersonalizationUpdateInput" }Responses
200Updated personalization400401403404429
curl -X PATCH \
https://app.drip-apex.com/api/v1/personalizations/exp_123 \
-H "Authorization: Bearer <apex-secret-key>" \
-H "Content-Type: application/json" \
-d '{}'Activate personalization
/personalizations/{id}/activate
Responses
200Updated personalization401403404429
curl -X POST \
https://app.drip-apex.com/api/v1/personalizations/exp_123/activate \
-H "Authorization: Bearer <apex-secret-key>"Pause personalization
/personalizations/{id}/pause
Responses
200Updated personalization401403404429
curl -X POST \
https://app.drip-apex.com/api/v1/personalizations/exp_123/pause \
-H "Authorization: Bearer <apex-secret-key>"Archive personalization
/personalizations/{id}/archive
Responses
200Updated personalization401403404429
curl -X POST \
https://app.drip-apex.com/api/v1/personalizations/exp_123/archive \
-H "Authorization: Bearer <apex-secret-key>"List pages
/pages
Parameters
limitin querycursorin query
Responses
200pages list400401403404429
curl \
https://app.drip-apex.com/api/v1/pages \
-H "Authorization: Bearer <apex-secret-key>"Create pages
/pages
Request body
{ $ref: "PageInput" }Responses
201pages created400401403404409422429
curl -X POST \
https://app.drip-apex.com/api/v1/pages \
-H "Authorization: Bearer <apex-secret-key>" \
-H "Content-Type: application/json" \
-d '{}'Update page
/pages/{id}
Request body
{ $ref: "PageUpdateInput" }Responses
200page returned400401403404409422429
curl -X PATCH \
https://app.drip-apex.com/api/v1/pages/exp_123 \
-H "Authorization: Bearer <apex-secret-key>" \
-H "Content-Type: application/json" \
-d '{}'Delete page
/pages/{id}
Responses
200page deleted400401403404409429
curl -X DELETE \
https://app.drip-apex.com/api/v1/pages/exp_123 \
-H "Authorization: Bearer <apex-secret-key>"List segments
/segments
Parameters
limitin querycursorin query
Responses
200segments list400401403404429
curl \
https://app.drip-apex.com/api/v1/segments \
-H "Authorization: Bearer <apex-secret-key>"Create segments
/segments
Request body
{ $ref: "SegmentInput" }Responses
201segments created400401403404409422429
curl -X POST \
https://app.drip-apex.com/api/v1/segments \
-H "Authorization: Bearer <apex-secret-key>" \
-H "Content-Type: application/json" \
-d '{}'Update segment
/segments/{id}
Request body
{ $ref: "SegmentUpdateInput" }Responses
200segment returned400401403404409422429
curl -X PATCH \
https://app.drip-apex.com/api/v1/segments/exp_123 \
-H "Authorization: Bearer <apex-secret-key>" \
-H "Content-Type: application/json" \
-d '{}'Delete segment
/segments/{id}
Responses
200segment deleted400401403404409429
curl -X DELETE \
https://app.drip-apex.com/api/v1/segments/exp_123 \
-H "Authorization: Bearer <apex-secret-key>"List exclusion groups
/exclusion-groups
Parameters
limitin querycursorin query
Responses
200exclusion groups list400401403404429
curl \
https://app.drip-apex.com/api/v1/exclusion-groups \
-H "Authorization: Bearer <apex-secret-key>"Create exclusion groups
/exclusion-groups
Request body
{ $ref: "ExclusionGroupInput" }Responses
201exclusion groups created400401403404409422429
curl -X POST \
https://app.drip-apex.com/api/v1/exclusion-groups \
-H "Authorization: Bearer <apex-secret-key>" \
-H "Content-Type: application/json" \
-d '{}'Get exclusion group
/exclusion-groups/{id}
Responses
200exclusion group returned400401403404429
curl \
https://app.drip-apex.com/api/v1/exclusion-groups/exp_123 \
-H "Authorization: Bearer <apex-secret-key>"Update exclusion group
/exclusion-groups/{id}
Request body
{ $ref: "ExclusionGroupUpdateInput" }Responses
200exclusion group returned400401403404409422429
curl -X PATCH \
https://app.drip-apex.com/api/v1/exclusion-groups/exp_123 \
-H "Authorization: Bearer <apex-secret-key>" \
-H "Content-Type: application/json" \
-d '{}'Delete exclusion group
/exclusion-groups/{id}
Responses
200exclusion group deleted400401403404409429
curl -X DELETE \
https://app.drip-apex.com/api/v1/exclusion-groups/exp_123 \
-H "Authorization: Bearer <apex-secret-key>"Replace exclusion group members
/exclusion-groups/{id}/members
Request body
{ $ref: "ExclusionGroupMembersInput" }Responses
200Exclusion group members replaced400401403404409422429
curl -X PUT \
https://app.drip-apex.com/api/v1/exclusion-groups/exp_123/members \
-H "Authorization: Bearer <apex-secret-key>" \
-H "Content-Type: application/json" \
-d '{}'Experiments
Create an artifact-injecting proxy preview session
/preview-sessions
Requires a secret API key with experiments:write. The returned short-lived URL is a bearer capability that renders the selected draft variation without a dashboard session or installed Apex snippet.
Request body
{
experiment_id: string
variation_id?: string
target_url?: string (uri)
}Responses
200Preview session400401403404429
curl -X POST \
https://app.drip-apex.com/api/v1/preview-sessions \
-H "Authorization: Bearer <apex-secret-key>" \
-H "Content-Type: application/json" \
-d '{
"experiment_id": "example_experiment_id",
"variation_id": "example_variation_id",
"target_url": "https://example.com"
}'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?: any
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?: any
}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?: any
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 found502Commerce configuration update failed; the experiment state is unchanged503Publication lock contended; retry after the Retry-After interval
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 found502Commerce configuration update failed; the experiment state is unchanged503Publication lock contended; retry after the Retry-After interval
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?: any
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"
}'Platform admin
Read allowlisted platform settings
/admin/settings
Requires an admin:read user API key and a live PlatformAccess row; environment email grants do not apply.
Responses
200Settings401403429
curl \
https://app.drip-apex.com/api/v1/admin/settings \
-H "Authorization: Bearer <apex-secret-key>"Update allowlisted platform settings
/admin/settings
Only guardian_enabled and srm_check_enabled are accepted.
Request body
{
guardian_enabled?: boolean
srm_check_enabled?: boolean
}Responses
200Settings updated400401403429
curl -X PATCH \
https://app.drip-apex.com/api/v1/admin/settings \
-H "Authorization: Bearer <apex-secret-key>" \
-H "Content-Type: application/json" \
-d '{
"guardian_enabled": false,
"srm_check_enabled": false
}'List tracking quarantine events
/admin/tracking/quarantine
Read-only platform view requiring a live PlatformAccess row.
Parameters
shopIdin queryreasonCodein queryverdictin querylimitin query
Responses
200Quarantine rows401403429
curl \
https://app.drip-apex.com/api/v1/admin/tracking/quarantine \
-H "Authorization: Bearer <apex-secret-key>"Account
Get the current user's profile
/account/profile
Responses
200Account profile401403429
curl \
https://app.drip-apex.com/api/v1/account/profile \
-H "Authorization: Bearer <apex-secret-key>"Update the current user's profile
/account/profile
Request body
{
displayName?: string
avatarDataUrl?: string,null
}Responses
200Updated account profile400401403429
curl -X PATCH \
https://app.drip-apex.com/api/v1/account/profile \
-H "Authorization: Bearer <apex-secret-key>" \
-H "Content-Type: application/json" \
-d '{
"displayName": "example_displayName"
}'API keys
List a shop's API keys
/keys
Parameters
shop_idin query required
Responses
200API key metadata; hashes and secrets are never included400403404429
curl \
https://app.drip-apex.com/api/v1/keys \
-H "Authorization: Bearer <apex-secret-key>"Create a shop API key
/keys
Request body
{
shop_id: string (uuid)
name: string
type: "live_secret" | "test_secret" | "publishable"
permissions?: string[]
rate_limit?: integer
expires_at?: string,null (date-time)
}Responses
201Created key, including its secret exactly once400403404429
curl -X POST \
https://app.drip-apex.com/api/v1/keys \
-H "Authorization: Bearer <apex-secret-key>" \
-H "Content-Type: application/json" \
-d '{
"shop_id": "uuid-here",
"name": "example_name",
"type": "live_secret"
}'Revoke a shop API key
/keys/{id}
Parameters
idin path requiredshop_idin query required
Responses
200Revoked400403404429
curl -X DELETE \
https://app.drip-apex.com/api/v1/keys/exp_123 \
-H "Authorization: Bearer <apex-secret-key>"User keys
Inspect the current user API key identity
/me
Responses
200User key identity and live organization role401403429
curl \
https://app.drip-apex.com/api/v1/me \
-H "Authorization: Bearer <apex-secret-key>"Environments
List runtime environments and domain mappings
/environments
Responses
200Environment settings401403429
curl \
https://app.drip-apex.com/api/v1/environments \
-H "Authorization: Bearer <apex-secret-key>"Update runtime environments and domain mappings
/environments
Request body
{
environments?: Environments
expected_version?: string (date-time)
}Responses
200Updated environment settings and edge precompile outcome400The environment patch is invalid, including when the active key is absent from the effective environment items.401403409Runtime settings changed since the supplied version was read; re-read and retry.429
curl -X PATCH \
https://app.drip-apex.com/api/v1/environments \
-H "Authorization: Bearer <apex-secret-key>" \
-H "Content-Type: application/json" \
-d '{
"expected_version": "example_expected_version"
}'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>"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. Line-item filters are accepted for revenue goals and custom checkout_started/add_to_cart funnel-event goals.
Request body
{
name: string
type: "click" | "pageview" | "custom" | "revenue"
selector?: string | null
text_match?: string | null
url_pattern?: string | null
event_name?: string | null
filter?: any
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. Line-item filters are accepted for revenue goals and custom checkout_started/add_to_cart funnel-event goals.
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
filter?: any
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>"Harness
Publish harness session
/harness/sessions/{id}/publish
Publishes reviewed harness artifacts to the session variation.
Parameters
idin path required
Responses
200Harness session published400Artifact review blocked publish404Harness session not found409Experiment is not in draft status
curl -X POST \
https://app.drip-apex.com/api/v1/harness/sessions/exp_123/publish \
-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>"Audit logs
List audit logs
/audit-logs
Parameters
entity_typein queryentity_idin querylimitin queryoffsetin query
Responses
200Audit log page403
curl \
https://app.drip-apex.com/api/v1/audit-logs \
-H "Authorization: Bearer <apex-secret-key>"Inbox
List inbox messages
/inbox/messages
Parameters
experiment_idin query
Responses
200Inbox messages403
curl \
https://app.drip-apex.com/api/v1/inbox/messages \
-H "Authorization: Bearer <apex-secret-key>"Send an inbox message
/inbox/messages
Request body
{
thread_type?: "account" | "experiment"
experiment_id?: string,null (uuid)
body: string
}Responses
201Message created400403404
curl -X POST \
https://app.drip-apex.com/api/v1/inbox/messages \
-H "Authorization: Bearer <apex-secret-key>" \
-H "Content-Type: application/json" \
-d '{
"thread_type": "account",
"body": "example_body"
}'Mark inbox channels read
/inbox/read-state
Request body
unknownResponses
200Read state updated400403404
curl -X POST \
https://app.drip-apex.com/api/v1/inbox/read-state \
-H "Authorization: Bearer <apex-secret-key>" \
-H "Content-Type: application/json" \
-d '{}'Organization
Get the credential organization
/org
Responses
200Dashboard organization detail shape, including a `members` array (id, userId, email, role, defaultShopRole, createdAt) and `_count.members`.401403429
curl \
https://app.drip-apex.com/api/v1/org \
-H "Authorization: Bearer <apex-secret-key>"Update organization settings
/org
Request body
{
name?: string
slug?: string
billing_email?: string,null
logo_url?: string,null
sso_enabled?: boolean
sso_enforced?: boolean
sso_domain?: string,null
sso_provider_id?: string,null
}Responses
200Updated organization401403429
curl -X PATCH \
https://app.drip-apex.com/api/v1/org \
-H "Authorization: Bearer <apex-secret-key>" \
-H "Content-Type: application/json" \
-d '{}'List organization members
/org/members
Responses
200Members from the dashboard member source401429
curl \
https://app.drip-apex.com/api/v1/org/members \
-H "Authorization: Bearer <apex-secret-key>"List organization invitations
/org/invitations
Responses
200Pending invitations401429
curl \
https://app.drip-apex.com/api/v1/org/invitations \
-H "Authorization: Bearer <apex-secret-key>"Invite an organization member
/org/invitations
Request body
{
email: string (email)
org_role?: "admin" | "member"
default_shop_role?: "admin" | "editor" | "analyst" | "viewer"
}Responses
201Invitation created401429
curl -X POST \
https://app.drip-apex.com/api/v1/org/invitations \
-H "Authorization: Bearer <apex-secret-key>" \
-H "Content-Type: application/json" \
-d '{
"email": "example_email",
"org_role": "admin",
"default_shop_role": "admin"
}'Revoke an organization invitation
/org/invitations/{id}
Parameters
idin path required
Responses
200Invitation revoked401404429
curl -X DELETE \
https://app.drip-apex.com/api/v1/org/invitations/exp_123 \
-H "Authorization: Bearer <apex-secret-key>"Update an organization member
/org/members/{id}
Parameters
idin path required
Request body
{
role?: string
default_shop_role?: string
}Responses
200Member updated401429
curl -X PATCH \
https://app.drip-apex.com/api/v1/org/members/exp_123 \
-H "Authorization: Bearer <apex-secret-key>" \
-H "Content-Type: application/json" \
-d '{
"role": "example_role",
"default_shop_role": "example_default_shop_role"
}'Remove an organization member
/org/members/{id}
Parameters
idin path required
Responses
200Member removed401429
curl -X DELETE \
https://app.drip-apex.com/api/v1/org/members/exp_123 \
-H "Authorization: Bearer <apex-secret-key>"Team
List shop team members
/team/members
Parameters
shop_idin query required
Responses
200Team members401404429
curl \
https://app.drip-apex.com/api/v1/team/members \
-H "Authorization: Bearer <apex-secret-key>"List shop invitations
/team/invitations
Parameters
shop_idin query required
Responses
200Invitations401429
curl \
https://app.drip-apex.com/api/v1/team/invitations \
-H "Authorization: Bearer <apex-secret-key>"Invite a shop member
/team/invitations
Request body
{
email: string (email)
role: string
shop_id: string (uuid)
}Responses
201Invitation created401429
curl -X POST \
https://app.drip-apex.com/api/v1/team/invitations \
-H "Authorization: Bearer <apex-secret-key>" \
-H "Content-Type: application/json" \
-d '{
"email": "example_email",
"role": "example_role",
"shop_id": "uuid-here"
}'Revoke a shop invitation
/team/invitations/{id}
Parameters
idin path required
Request body
{
shop_id: string (uuid)
}Responses
200Invitation revoked401429
curl -X DELETE \
https://app.drip-apex.com/api/v1/team/invitations/exp_123 \
-H "Authorization: Bearer <apex-secret-key>" \
-H "Content-Type: application/json" \
-d '{
"shop_id": "uuid-here"
}'Update a shop member
/team/members/{id}
Request body
{
shop_id: string (uuid)
role?: string
permission_overrides?: object
}Responses
200Member updated401429
curl -X PATCH \
https://app.drip-apex.com/api/v1/team/members/exp_123 \
-H "Authorization: Bearer <apex-secret-key>" \
-H "Content-Type: application/json" \
-d '{
"shop_id": "uuid-here",
"role": "example_role",
"permission_overrides": {}
}'Remove a shop member
/team/members/{id}
Request body
{
shop_id: string (uuid)
}Responses
200Member removed401429
curl -X DELETE \
https://app.drip-apex.com/api/v1/team/members/exp_123 \
-H "Authorization: Bearer <apex-secret-key>" \
-H "Content-Type: application/json" \
-d '{
"shop_id": "uuid-here"
}'Shops
List organization shops
/shops
Responses
200Shop list
curl \
https://app.drip-apex.com/api/v1/shops \
-H "Authorization: Bearer <apex-secret-key>"Create a shop
/shops
Request body
{
name: string
domain: string
origin?: string,null
currency?: "AED" | "AFN" | "ALL" | "AMD" | "ANG" | "AOA" | "ARS" | "AUD" | "AWG" | "AZN" | "BAM" | "BBD" | "BDT" | "BGN" | "BHD" | "BIF" | "BMD" | "BND" | "BOB" | "BOV" | "BRL" | "BSD" | "BTN" | "BWP" | "BYN" | "BZD" | "CAD" | "CDF" | "CHE" | "CHF" | "CHW" | "CLF" | "CLP" | "CNY" | "COP" | "COU" | "CRC" | "CUP" | "CVE" | "CZK" | "DJF" | "DKK" | "DOP" | "DZD" | "EGP" | "ERN" | "ETB" | "EUR" | "FJD" | "FKP" | "GBP" | "GEL" | "GHS" | "GIP" | "GMD" | "GNF" | "GTQ" | "GYD" | "HKD" | "HNL" | "HRK" | "HTG" | "HUF" | "IDR" | "ILS" | "INR" | "IQD" | "IRR" | "ISK" | "JMD" | "JOD" | "JPY" | "KES" | "KGS" | "KHR" | "KMF" | "KPW" | "KRW" | "KWD" | "KYD" | "KZT" | "LAK" | "LBP" | "LKR" | "LRD" | "LSL" | "LYD" | "MAD" | "MDL" | "MGA" | "MKD" | "MMK" | "MNT" | "MOP" | "MRU" | "MUR" | "MVR" | "MWK" | "MXN" | "MXV" | "MYR" | "MZN" | "NAD" | "NGN" | "NIO" | "NOK" | "NPR" | "NZD" | "OMR" | "PAB" | "PEN" | "PGK" | "PHP" | "PKR" | "PLN" | "PYG" | "QAR" | "RON" | "RSD" | "RUB" | "RWF" | "SAR" | "SBD" | "SCR" | "SDG" | "SEK" | "SGD" | "SHP" | "SLE" | "SOS" | "SRD" | "SSP" | "STN" | "SVC" | "SYP" | "SZL" | "THB" | "TJS" | "TMT" | "TND" | "TOP" | "TRY" | "TTD" | "TWD" | "TZS" | "UAH" | "UGX" | "USD" | "USN" | "UYI" | "UYU" | "UYW" | "UZS" | "VES" | "VND" | "VUV" | "WST" | "XAF" | "XCD" | "XCG" | "XDR" | "XOF" | "XPF" | "XSU" | "YER" | "ZAR" | "ZMW" | "ZWG"
}Responses
201Shop created403
curl -X POST \
https://app.drip-apex.com/api/v1/shops \
-H "Authorization: Bearer <apex-secret-key>" \
-H "Content-Type: application/json" \
-d '{
"name": "example_name",
"domain": "example_domain",
"currency": "AED"
}'Get a shop
/shops/{id}
Responses
200Shop detail404
curl \
https://app.drip-apex.com/api/v1/shops/exp_123 \
-H "Authorization: Bearer <apex-secret-key>"Update a shop
/shops/{id}
Request body
{
name?: string
domain?: string
origin?: string,null
tier?: "core" | "managed" | "enterprise"
operator_enabled?: boolean
currency?: "AED" | "AFN" | "ALL" | "AMD" | "ANG" | "AOA" | "ARS" | "AUD" | "AWG" | "AZN" | "BAM" | "BBD" | "BDT" | "BGN" | "BHD" | "BIF" | "BMD" | "BND" | "BOB" | "BOV" | "BRL" | "BSD" | "BTN" | "BWP" | "BYN" | "BZD" | "CAD" | "CDF" | "CHE" | "CHF" | "CHW" | "CLF" | "CLP" | "CNY" | "COP" | "COU" | "CRC" | "CUP" | "CVE" | "CZK" | "DJF" | "DKK" | "DOP" | "DZD" | "EGP" | "ERN" | "ETB" | "EUR" | "FJD" | "FKP" | "GBP" | "GEL" | "GHS" | "GIP" | "GMD" | "GNF" | "GTQ" | "GYD" | "HKD" | "HNL" | "HRK" | "HTG" | "HUF" | "IDR" | "ILS" | "INR" | "IQD" | "IRR" | "ISK" | "JMD" | "JOD" | "JPY" | "KES" | "KGS" | "KHR" | "KMF" | "KPW" | "KRW" | "KWD" | "KYD" | "KZT" | "LAK" | "LBP" | "LKR" | "LRD" | "LSL" | "LYD" | "MAD" | "MDL" | "MGA" | "MKD" | "MMK" | "MNT" | "MOP" | "MRU" | "MUR" | "MVR" | "MWK" | "MXN" | "MXV" | "MYR" | "MZN" | "NAD" | "NGN" | "NIO" | "NOK" | "NPR" | "NZD" | "OMR" | "PAB" | "PEN" | "PGK" | "PHP" | "PKR" | "PLN" | "PYG" | "QAR" | "RON" | "RSD" | "RUB" | "RWF" | "SAR" | "SBD" | "SCR" | "SDG" | "SEK" | "SGD" | "SHP" | "SLE" | "SOS" | "SRD" | "SSP" | "STN" | "SVC" | "SYP" | "SZL" | "THB" | "TJS" | "TMT" | "TND" | "TOP" | "TRY" | "TTD" | "TWD" | "TZS" | "UAH" | "UGX" | "USD" | "USN" | "UYI" | "UYU" | "UYW" | "UZS" | "VES" | "VND" | "VUV" | "WST" | "XAF" | "XCD" | "XCG" | "XDR" | "XOF" | "XPF" | "XSU" | "YER" | "ZAR" | "ZMW" | "ZWG"
}Responses
200Shop updated403
curl -X PATCH \
https://app.drip-apex.com/api/v1/shops/exp_123 \
-H "Authorization: Bearer <apex-secret-key>" \
-H "Content-Type: application/json" \
-d '{}'Pre-bind a Shopware store to an Apex shop
/shops/{id}/shopware/prebind
Request body
{
shopUrl: string (uri)
}Responses
200Existing binding returned201Pending binding created400401403409429
curl -X POST \
https://app.drip-apex.com/api/v1/shops/exp_123/shopware/prebind \
-H "Authorization: Bearer <apex-secret-key>" \
-H "Content-Type: application/json" \
-d '{
"shopUrl": "https://example.com"
}'Get auto-stop settings
/shops/{id}/auto-stop
Responses
200Settings
curl \
https://app.drip-apex.com/api/v1/shops/exp_123/auto-stop \
-H "Authorization: Bearer <apex-secret-key>"Update auto-stop settings
/shops/{id}/auto-stop
Request body
{
enabled?: boolean
mode?: "off" | "fixed_horizon_planned_end" | "sequential_significance"
min_runtime_minutes?: integer
sequential?: object
fixed_horizon?: object
}Responses
200Settings updated
curl -X PATCH \
https://app.drip-apex.com/api/v1/shops/exp_123/auto-stop \
-H "Authorization: Bearer <apex-secret-key>" \
-H "Content-Type: application/json" \
-d '{}'Get testing-defaults settings
/shops/{id}/testing-defaults
Responses
200Settings
curl \
https://app.drip-apex.com/api/v1/shops/exp_123/testing-defaults \
-H "Authorization: Bearer <apex-secret-key>"Update testing-defaults settings
/shops/{id}/testing-defaults
Request body
{
significanceLevel?: number
statisticalPower?: number
sequentialTestingEnabled?: boolean
}Responses
200Settings updated
curl -X PATCH \
https://app.drip-apex.com/api/v1/shops/exp_123/testing-defaults \
-H "Authorization: Bearer <apex-secret-key>" \
-H "Content-Type: application/json" \
-d '{
"significanceLevel": 1,
"statisticalPower": 1,
"sequentialTestingEnabled": false
}'Get guardian settings
/shops/{id}/guardian
Responses
200Settings
curl \
https://app.drip-apex.com/api/v1/shops/exp_123/guardian \
-H "Authorization: Bearer <apex-secret-key>"Update guardian settings
/shops/{id}/guardian
Request body
{
enabled?: boolean
pause_on_broken?: boolean
pause_on_harm?: boolean
alert_on_data_quality?: boolean
delivery_drift?: object
}Responses
200Settings updated
curl -X PATCH \
https://app.drip-apex.com/api/v1/shops/exp_123/guardian \
-H "Authorization: Bearer <apex-secret-key>" \
-H "Content-Type: application/json" \
-d '{}'Get the store profile
/shops/{id}/store-profile
Responses
200The complete dashboard Store Profile contract. When the store-profile schema is not yet migrated, the route degrades to `{ schemaReady: false }` with HTTP 200 instead of failing.503Store profile temporarily unavailable (database under pressure); retry shortly.
curl \
https://app.drip-apex.com/api/v1/shops/exp_123/store-profile \
-H "Authorization: Bearer <apex-secret-key>"Review a store-profile fact
/shops/{id}/store-profile/facts/{factId}
Request body
{
status: "suggested" | "confirmed" | "rejected" | "stale"
claim?: string
value?: any
}Responses
200Fact reviewed
curl -X PATCH \
https://app.drip-apex.com/api/v1/shops/exp_123/store-profile/facts/fact_123 \
-H "Authorization: Bearer <apex-secret-key>" \
-H "Content-Type: application/json" \
-d '{
"status": "suggested",
"claim": "example_claim"
}'Review a semantic finding
/shops/{id}/store-profile/findings/review
Request body
{
key: string
claim: string
status?: string
title?: string
category?: string
source?: string
confidence?: number
value?: any
}Responses
200Finding reviewed
curl -X POST \
https://app.drip-apex.com/api/v1/shops/exp_123/store-profile/findings/review \
-H "Authorization: Bearer <apex-secret-key>" \
-H "Content-Type: application/json" \
-d '{
"key": "example_key",
"claim": "example_claim"
}'Start a store-profile learning run
/shops/{id}/store-profile/learning-runs
Request body
{
trigger?: string = "manual"
sources?: string[]
scope?: string[]
}Responses
201Learning run queued
curl -X POST \
https://app.drip-apex.com/api/v1/shops/exp_123/store-profile/learning-runs \
-H "Authorization: Bearer <apex-secret-key>" \
-H "Content-Type: application/json" \
-d '{
"trigger": "example_trigger",
"sources": [],
"scope": []
}'