atrixANALYTICS
REST APIReference

Token API (/v1)

Programmatic endpoints, authenticated with a Bearer token (a personal access token atx_pat_… or an OAuth token atx_oat_…).

Generated from the Atrix Analytics — control plane API OpenAPI document, version 0.1.0. 45 operations. The raw document is at /openapi.json.

GET /v1/erasure-certificates/keys

Auth: none.

StatusBodyNotes
200—{keys: [{alg: Ed25519, kid, public_key}]}: the certificate verification keys

POST /v1/erasure-certificates/verify

Auth: none.

Request body (application/json): VerifyRequest

FieldTypeRequiredDescription
certificateobjectyes
signaturestringyes
verifyobject | nullThe verify hint the certificate endpoint returns alongside; accepted (and ignored) so that endpoint's response can be posted here unchanged.
StatusBodyNotes
200—{valid, key_id, …}: whether the signature is ours over exactly this certificate
400ErrorBody

GET /v1/me

The calling token, its user, and its effective scopes.

Auth: Bearer token.

StatusBodyNotes
200V1MeResponse
401ErrorBody

GET /v1/orgs

The org this token belongs to (org:read).

Auth: Bearer token with org:read.

StatusBodyNotes
200OrgList
401ErrorBody
403ErrorBody

GET /v1/orgs/{org_id}

Auth: Bearer token with org:read.

ParameterInTypeRequiredDescription
org_idpathstring (uuid)yes
StatusBodyNotes
200OrgDto
403ErrorBody
404ErrorBody

GET /v1/orgs/{org_id}/projects

Auth: Bearer token with projects:read.

ParameterInTypeRequiredDescription
org_idpathstring (uuid)yes
StatusBodyNotes
200ProjectList
404ErrorBody

POST /v1/orgs/{org_id}/projects

Create a project (projects:write). ?dry_run=true validates and returns the plan.

Auth: Bearer token with projects:write.

ParameterInTypeRequiredDescription
org_idpathstring (uuid)yes
dry_runqueryboolean
Idempotency-Keyheaderstring | null

Request body (application/json): CreateProjectRequest

FieldTypeRequiredDescription
currencystring | nullISO 4217, default USD.
namestringyes
regionstringyesRegion code. Fixed for the life of the project. Only live regions are accepted.
timezonestring | nullIANA zone, default UTC.

GET /v1/projects

Projects this token can read (projects:read).

Auth: Bearer token with projects:read.

StatusBodyNotes
200ProjectList
401ErrorBody

GET /v1/projects/{project_id}

Auth: Bearer token with projects:read.

ParameterInTypeRequiredDescription
project_idpathstring (uuid)yes
StatusBodyNotes
200ProjectDto
403ErrorBody
404ErrorBody

PATCH /v1/projects/{project_id}

Rename (projects:write).

Auth: Bearer token with projects:write.

ParameterInTypeRequiredDescription
project_idpathstring (uuid)yes
dry_runqueryboolean
Idempotency-Keyheaderstring | null

Request body (application/json): RenameRequest

FieldTypeRequiredDescription
namestringyes
StatusBodyNotes
200ProjectDto
403ErrorBody
404ErrorBody

DELETE /v1/projects/{project_id}

Soft-delete and revoke every key (projects:write).

Auth: Bearer token with projects:write.

ParameterInTypeRequiredDescription
project_idpathstring (uuid)yes
dry_runqueryboolean
Idempotency-Keyheaderstring | null
StatusBodyNotes
200DryRundry_run
204—
403ErrorBody
404ErrorBody

GET /v1/projects/{project_id}/catalog/codegen

The tracking plan for atrix codegen (Bearer token with catalog:read).

Auth: Bearer token.

ParameterInTypeRequiredDescription
project_idpathstring (uuid)yes

GET /v1/projects/{project_id}/environments

Auth: Bearer token with projects:read.

ParameterInTypeRequiredDescription
project_idpathstring (uuid)yes
StatusBodyNotes
200EnvironmentList
404ErrorBody

GET /v1/projects/{project_id}/erasure-requests

Auth: Bearer token with persons.erase.

ParameterInTypeRequiredDescription
project_idpathstring (uuid)yes
StatusBodyNotes
200—{requests: [ErasureJob]}, newest first (erasure-job.schema.json)
403ErrorBodymissing persons.erase
404ErrorBody

POST /v1/projects/{project_id}/erasure-requests

Auth: Bearer token with persons.erase.

ParameterInTypeRequiredDescription
project_idpathstring (uuid)yes

Request body (application/json): ErasureCreate

FieldTypeRequiredDescription
distinct_idsstring[]
person_idstring (uuid) | null
reasonstring | null
StatusBodyNotes
202—ErasureJob, pending (erasure-job.schema.json); raw ids go only to the region
400ErrorBody
403ErrorBodymissing persons.erase
404ErrorBody

GET /v1/projects/{project_id}/erasure-requests/{request_id}

Auth: Bearer token with persons.erase.

ParameterInTypeRequiredDescription
project_idpathstring (uuid)yes
request_idpathstring (uuid)yes
StatusBodyNotes
200—ErasureJob with live per-store progress (erasure-job.schema.json)
403ErrorBody
404ErrorBody

GET /v1/projects/{project_id}/erasure-requests/{request_id}/certificate

Auth: Bearer token with persons.erase.

ParameterInTypeRequiredDescription
project_idpathstring (uuid)yes
request_idpathstring (uuid)yes
StatusBodyNotes
200—{certificate, signature, verify}: the Ed25519-signed erasure certificate
403ErrorBody
404ErrorBodynot completed yet, or unknown

GET /v1/projects/{project_id}/experiments

Auth: Bearer token with experiments:read.

ParameterInTypeRequiredDescription
project_idpathstring (uuid)yes

POST /v1/projects/{project_id}/experiments

Auth: Bearer token with experiments:write.

ParameterInTypeRequiredDescription
project_idpathstring (uuid)yes
dry_runqueryboolean
Idempotency-Keyheaderstring | null

Request body (application/json): ExperimentCreateRequest

FieldTypeRequiredDescription
alphanumber (double) | null
attribution_window_hoursinteger (int32) | null
control_variantstring | null
cupedany | null | ExperimentCuped
environmentstring | null
flag_idstring (uuid)yes
guardrailsExperimentGuardrail[] | null
hypothesisstring | null
keystringyes
mdenumber (double) | null
methodstring | null
namestringyes
powernumber (double) | null
primary_metric_idstring (uuid) | null
secondary_metric_idsstring (uuid)[] | null
winsor_pctnumber (double) | null
StatusBodyNotes
200DryRundry_run
201ExperimentDto
400ErrorBody
403ErrorBody
404ErrorBody
409ErrorBody

GET /v1/projects/{project_id}/experiments/{experiment_id}

Auth: Bearer token with experiments:read.

ParameterInTypeRequiredDescription
project_idpathstring (uuid)yes
experiment_idpathstring (uuid)yes
StatusBodyNotes
200ExperimentDto
403ErrorBody
404ErrorBody

PATCH /v1/projects/{project_id}/experiments/{experiment_id}

Auth: Bearer token with experiments:write.

ParameterInTypeRequiredDescription
project_idpathstring (uuid)yes
experiment_idpathstring (uuid)yes
dry_runqueryboolean

Request body (application/json): ExperimentUpdateRequest

FieldTypeRequiredDescription
alphanumber (double) | null
attribution_window_hoursinteger (int32) | null
control_variantstring | null
cupedany | null | ExperimentCuped
guardrailsExperimentGuardrail[] | null
hypothesisstring | null
mdenumber (double) | null
methodstring | null
namestring | null
powernumber (double) | null
primary_metric_idstring (uuid) | null
secondary_metric_idsstring (uuid)[] | null
winsor_pctnumber (double) | null

DELETE /v1/projects/{project_id}/experiments/{experiment_id}

Auth: Bearer token with experiments:write.

ParameterInTypeRequiredDescription
project_idpathstring (uuid)yes
experiment_idpathstring (uuid)yes
dry_runqueryboolean
StatusBodyNotes
200ExperimentDtoarchived
403ErrorBody
404ErrorBody
409ErrorBody

POST /v1/projects/{project_id}/experiments/{experiment_id}/launch

Auth: Bearer token with experiments:write.

ParameterInTypeRequiredDescription
project_idpathstring (uuid)yes
experiment_idpathstring (uuid)yes
dry_runqueryboolean

Request body (application/json): ExperimentTransitionRequest

FieldTypeRequiredDescription
override_blockboolean | null
reasonstring | null
variantstring | null
StatusBodyNotes
200ExperimentDto
400ErrorBody
403ErrorBodyflags.production needed in production
404ErrorBody
409ErrorBody

GET /v1/projects/{project_id}/experiments/{experiment_id}/results

Auth: Bearer token with experiments:read.

ParameterInTypeRequiredDescription
project_idpathstring (uuid)yes
experiment_idpathstring (uuid)yes
refreshpathboolean | nullyesRecompute now instead of returning a result younger than 5 minutes.

POST /v1/projects/{project_id}/experiments/{experiment_id}/ship

Auth: Bearer token with experiments:write.

ParameterInTypeRequiredDescription
project_idpathstring (uuid)yes
experiment_idpathstring (uuid)yes
dry_runqueryboolean

Request body (application/json): ExperimentTransitionRequest

FieldTypeRequiredDescription
override_blockboolean | null
reasonstring | null
variantstring | null
StatusBodyNotes
200ExperimentDto
400ErrorBody
403ErrorBodyexperiments.ship (and flags.production in production)
404ErrorBody
409ErrorBodyexperiment_blocked

POST /v1/projects/{project_id}/experiments/{experiment_id}/stop

Auth: Bearer token with experiments:write.

ParameterInTypeRequiredDescription
project_idpathstring (uuid)yes
experiment_idpathstring (uuid)yes
dry_runqueryboolean

Request body (application/json): ExperimentTransitionRequest

FieldTypeRequiredDescription
override_blockboolean | null
reasonstring | null
variantstring | null
StatusBodyNotes
200ExperimentDto
403ErrorBody
404ErrorBody
409ErrorBody

POST /v1/projects/{project_id}/experiments/plan

Auth: Bearer token with experiments:read.

ParameterInTypeRequiredDescription
project_idpathstring (uuid)yes

Request body (application/json): ExperimentPlanRequest

FieldTypeRequiredDescription
alphanumber (double) | null
control_unitsnumber (double) | null
daily_unitsnumber (double) | null
mdenumber (double)yes
mde_kindstring | null
methodstring | null
metricobjectyes
powernumber (double) | null
variantsinteger (int32) | null(min 0)

GET /v1/projects/{project_id}/flags

Auth: Bearer token with flags:read.

ParameterInTypeRequiredDescription
project_idpathstring (uuid)yes
archivedpathboolean | nullyesInclude archived flags.
searchpathstring | nullyesCase-insensitive match on key or name.
StatusBodyNotes
200FlagListResponse
403ErrorBody
404ErrorBody

POST /v1/projects/{project_id}/flags

Auth: Bearer token with flags:write.

ParameterInTypeRequiredDescription
project_idpathstring (uuid)yes
dry_runqueryboolean
Idempotency-Keyheaderstring | null

Request body (application/json): FlagCreateRequest

FieldTypeRequiredDescription
descriptionstring | null
keystringyes
kindstring | nullboolean
namestringyes
payloadobject | null
rulesobject[] | null
stickinessstring | null
tagsstring[] | null
variantsobject[] | null
StatusBodyNotes
200DryRundry_run
201FlagDto
400ErrorBody
403ErrorBody
404ErrorBody
409ErrorBody

GET /v1/projects/{project_id}/flags/{flag_id}

Auth: Bearer token with flags:read.

ParameterInTypeRequiredDescription
project_idpathstring (uuid)yes
flag_idpathstring (uuid)yes
StatusBodyNotes
200FlagDto
403ErrorBody
404ErrorBody

PATCH /v1/projects/{project_id}/flags/{flag_id}

Auth: Bearer token with flags:write.

ParameterInTypeRequiredDescription
project_idpathstring (uuid)yes
flag_idpathstring (uuid)yes
dry_runqueryboolean

Request body (application/json): FlagUpdateRequest

FieldTypeRequiredDescription
descriptionstring | null
namestring | null
owner_idstring (uuid) | null
tagsstring[] | null
StatusBodyNotes
200FlagDto
400ErrorBody
403ErrorBody
404ErrorBody

DELETE /v1/projects/{project_id}/flags/{flag_id}

Auth: Bearer token with flags:write.

ParameterInTypeRequiredDescription
project_idpathstring (uuid)yes
flag_idpathstring (uuid)yes
dry_runqueryboolean
StatusBodyNotes
200FlagDtoarchived
403ErrorBody
404ErrorBody
409ErrorBody

PATCH /v1/projects/{project_id}/flags/{flag_id}/environments/{environment}

Auth: Bearer token with flags:write.

ParameterInTypeRequiredDescription
project_idpathstring (uuid)yes
flag_idpathstring (uuid)yes
environmentpathstringyes
dry_runqueryboolean

Request body (application/json): FlagEnvironmentUpdateRequest

FieldTypeRequiredDescription
enabledboolean | null
payloadobject | nullnull clears the payload.
rulesobject[] | null
saltstring | null
stickinessstring | null
variantsobject[] | null
StatusBodyNotes
200FlagDto
400ErrorBody
403ErrorBodymissing flags:write, or flags.production for a live production config
404ErrorBody
409ErrorBody

GET /v1/projects/{project_id}/flags/publications

Auth: Bearer token with flags:read.

ParameterInTypeRequiredDescription
project_idpathstring (uuid)yes
environmentpathstring | nullyes

GET /v1/projects/{project_id}/integrations

Auth: Bearer token with projects:read.

ParameterInTypeRequiredDescription
project_idpathstring (uuid)yes
StatusBodyNotes
200IntegrationList
403ErrorBody
404ErrorBody

POST /v1/projects/{project_id}/integrations

Auth: Bearer token with projects:write.

ParameterInTypeRequiredDescription
project_idpathstring (uuid)yes
Idempotency-Keyheaderstring | null

Request body (application/json): CreateIntegrationRequest

FieldTypeRequiredDescription
configobject | null
namestring | null
providerstringyesstripe
secretstring | nullStripe: the endpoint's signing secret (whsec_…). RevenueCat: the Authorization header value configured in its dashboard. App Store and Google Play take none. Optional at creation: without it the integration is pending_secret (deliveries refused) until an update sets it.

GET /v1/projects/{project_id}/integrations/{integration_id}

Auth: Bearer token with projects:read.

ParameterInTypeRequiredDescription
project_idpathstring (uuid)yes
integration_idpathstring (uuid)yes
StatusBodyNotes
200IntegrationDto
403ErrorBody
404ErrorBody

PATCH /v1/projects/{project_id}/integrations/{integration_id}

Auth: Bearer token with projects:write.

ParameterInTypeRequiredDescription
project_idpathstring (uuid)yes
integration_idpathstring (uuid)yes
Idempotency-Keyheaderstring | null

Request body (application/json): UpdateIntegrationRequest

FieldTypeRequiredDescription
configobject | null
namestring | null
secretstring | nullReplace the stored secret (rotation).
statusstring | nullactive

DELETE /v1/projects/{project_id}/integrations/{integration_id}

Auth: Bearer token with projects:write.

ParameterInTypeRequiredDescription
project_idpathstring (uuid)yes
integration_idpathstring (uuid)yes
StatusBodyNotes
204—
403ErrorBody
404ErrorBody

POST /v1/projects/{project_id}/integrations/{integration_id}/rotate-token

Auth: Bearer token with projects:write.

ParameterInTypeRequiredDescription
project_idpathstring (uuid)yes
integration_idpathstring (uuid)yes
Idempotency-Keyheaderstring | null
StatusBodyNotes
200IntegrationDto
403ErrorBody
404ErrorBody

GET /v1/projects/{project_id}/keys

Auth: Bearer token with projects:read.

ParameterInTypeRequiredDescription
project_idpathstring (uuid)yes
StatusBodyNotes
200KeyList
404ErrorBody

POST /v1/projects/{project_id}/keys/{key_id}/revoke

Auth: Bearer token with projects:write.

ParameterInTypeRequiredDescription
project_idpathstring (uuid)yes
key_idpathstring (uuid)yes
dry_runqueryboolean
Idempotency-Keyheaderstring | null
StatusBodyNotes
200KeyDto
404ErrorBody

POST /v1/projects/{project_id}/keys/{key_id}/rotate

Auth: Bearer token with projects:write.

ParameterInTypeRequiredDescription
project_idpathstring (uuid)yes
key_idpathstring (uuid)yes
dry_runqueryboolean
Idempotency-Keyheaderstring | null

Request body (application/json): RotateKeyRequest

FieldTypeRequiredDescription
keep_oldbooleanKeep the old key working (revoke it later). Default: revoke it now.
StatusBodyNotes
200RotateKeyResponse
404ErrorBody
409ErrorBody

POST /v1/projects/{project_id}/query

Validate a Query IR and get the region request to run it (query:read). The control plane returns a query:read region token and the region endpoint; results never pass through it.

Auth: Bearer token with query:read.

ParameterInTypeRequiredDescription
project_idpathstring (uuid)yes

Request body (application/json): V1QueryRequest

FieldTypeRequiredDescription
environmentstring | nullproduction
include_sqlbooleanAsk the region to include the compiled SQL in its answer.
queryobjectyesA Query IR v1 document (packages/contracts/schemas/query-ir.schema.json).
refreshbooleanBypass the region's result cache.

POST /v1/projects/{project_id}/region-token

Region token carrying the token's regional scopes (∩ the owner's role), optionally narrowed.

Auth: Bearer token.

ParameterInTypeRequiredDescription
project_idpathstring (uuid)yes

Request body (application/json): RegionTokenRequest

FieldTypeRequiredDescription
environmentstring | nullproduction
scopesstring[] | nullNarrow further. Omit for every regional scope you hold.

On this page

GET /v1/erasure-certificates/keysPOST /v1/erasure-certificates/verifyGET /v1/meGET /v1/orgsGET /v1/orgs/{org_id}GET /v1/orgs/{org_id}/projectsPOST /v1/orgs/{org_id}/projectsGET /v1/projectsGET /v1/projects/{project_id}PATCH /v1/projects/{project_id}DELETE /v1/projects/{project_id}GET /v1/projects/{project_id}/catalog/codegenGET /v1/projects/{project_id}/environmentsGET /v1/projects/{project_id}/erasure-requestsPOST /v1/projects/{project_id}/erasure-requestsGET /v1/projects/{project_id}/erasure-requests/{request_id}GET /v1/projects/{project_id}/erasure-requests/{request_id}/certificateGET /v1/projects/{project_id}/experimentsPOST /v1/projects/{project_id}/experimentsGET /v1/projects/{project_id}/experiments/{experiment_id}PATCH /v1/projects/{project_id}/experiments/{experiment_id}DELETE /v1/projects/{project_id}/experiments/{experiment_id}POST /v1/projects/{project_id}/experiments/{experiment_id}/launchGET /v1/projects/{project_id}/experiments/{experiment_id}/resultsPOST /v1/projects/{project_id}/experiments/{experiment_id}/shipPOST /v1/projects/{project_id}/experiments/{experiment_id}/stopPOST /v1/projects/{project_id}/experiments/planGET /v1/projects/{project_id}/flagsPOST /v1/projects/{project_id}/flagsGET /v1/projects/{project_id}/flags/{flag_id}PATCH /v1/projects/{project_id}/flags/{flag_id}DELETE /v1/projects/{project_id}/flags/{flag_id}PATCH /v1/projects/{project_id}/flags/{flag_id}/environments/{environment}GET /v1/projects/{project_id}/flags/publicationsGET /v1/projects/{project_id}/integrationsPOST /v1/projects/{project_id}/integrationsGET /v1/projects/{project_id}/integrations/{integration_id}PATCH /v1/projects/{project_id}/integrations/{integration_id}DELETE /v1/projects/{project_id}/integrations/{integration_id}POST /v1/projects/{project_id}/integrations/{integration_id}/rotate-tokenGET /v1/projects/{project_id}/keysPOST /v1/projects/{project_id}/keys/{key_id}/revokePOST /v1/projects/{project_id}/keys/{key_id}/rotatePOST /v1/projects/{project_id}/queryPOST /v1/projects/{project_id}/region-token