Endpoints
Every path below is relative to /api/v1. For request and response schemas, use the
OpenAPI explorer or fetch /api/v1/openapi.json.
This table is maintained by hand and covers /api/v1 only. The generated contract — both
surfaces, with schemas — is described in
OpenAPI and client generation, which is also where to start if you
would rather generate a client than write one.
"User only" means the route rejects service accounts with 403 A user session is required.
Operations
/healthOrganizations
Every organization route requires a user session.
/organizations/organizations/organizations/{organizationId}/organizations/{organizationId}/organizations/{organizationId}/organizations/{organizationId}/restoreGET /organizations accepts ?state=active|archived|all. Creating an organization makes you its
owner. Archiving clears the caller's active organization.
Projects
/organizations/{organizationId}/projects/organizations/{organizationId}/projects/projects/{projectId}/projects/{projectId}/projects/{projectId}/projects/{projectId}/restoreCreating a project also creates its three environments and the project-admin and member roles.
GET /projects/{projectId} includes the environment list.
Service accounts
/projects/{projectId}/service-accounts/projects/{projectId}/service-accounts/projects/{projectId}/service-accounts/{accountId}/disableThe creation response contains data.apiKey exactly once.
Configuration
/environments/{environmentId}/configs/environments/{environmentId}/configs/{key}/environments/{environmentId}/configs/{key}/environments/{environmentId}/configs/{key}/environments/{environmentId}/configs/{key}/restoreReading one value needs config:reveal for users but only config:read for service accounts. List
responses always mask secrets.
RBAC
/projects/{projectId}/roles/projects/{projectId}/roles/projects/{projectId}/role-bindings/authorizePOST /authorize takes projectId in the body, not the path.
Accounting
/projects/{projectId}/usage-events/projects/{projectId}/analytics/summary/projects/{projectId}/analytics/activity/projects/{projectId}/analytics/subjects/projects/{projectId}/subjects/{subjectId}/activityAnalytics requires both permissions. Usage replays return 200 with duplicate: true.
/analytics/activity returns daily active-subject, usage, and revenue trends — days is 7–90,
default 30. /analytics/subjects is the paginated subject directory — days 7–365, plus q,
sort, limit, and offset — and is the only list route that answers with
{ total, limit, offset, subjects } instead of a bare array.
/subjects/{subjectId}/activity is one subject's series, meters, billing state, and 50 most recent
events. All four accept an optional environmentId; the semantics are in
Usage and billing.
Audit
/projects/{projectId}/audit-logsLatest 100 entries, newest first.
OIDC clients
All three require a user session.
/projects/{projectId}/oidc-clients/projects/{projectId}/oidc-clients/projects/{projectId}/oidc-clients/{clientId}/disableThe creation response contains clientSecret once, and null for native clients.
Billing
/environments/{environmentId}/stripe-connection/environments/{environmentId}/stripe-connection/projects/{projectId}/billing/plans/projects/{projectId}/billing/plans/projects/{projectId}/billing/checkout/projects/{projectId}/subjects/{subjectId}/entitlements/projects/{projectId}/subjects/{subjectId}/entitlement-grantsCheckout requires an idempotency-key header of 16–255 characters.
Subjects
/projects/{projectId}/subjects/{subjectId}Deletes the Gate identity behind a subject id, along with its sessions, linked accounts, memberships, OAuth tokens and consents, and every role binding naming it. Billing and accounting rows are keyed on the opaque subject id and are deliberately kept.
Only a project the subject actually signed into may delete it: one of the caller project's OIDC
clients must hold either a consent or a refresh token from that user, or the answer is 403. Both
count, because a client marked skip_consent never writes a consent row. Without this rule, one
project could delete an identity shared with every other Evonia product.
Webhooks
/webhooks/stripe/{environmentId}Unauthenticated. Verified against the webhook secret stored for that environment.
Documentation
/docs/openapi.json/api/v1/docs is the Swagger UI, also reachable at /docs/api-reference.
Protocol routes
These live under /api/auth, outside /api/v1, and are served by better-auth.
| Purpose | Path |
|---|---|
| Authorization | /api/auth/oauth2/authorize |
| Token | /api/auth/oauth2/token |
| User info | /api/auth/oauth2/userinfo |
| Introspection | /api/auth/oauth2/introspect |
| Revocation | /api/auth/oauth2/revoke |
| End session | /api/auth/oauth2/end-session |
| Consent | /api/auth/oauth2/consent |
| OIDC discovery | /.well-known/openid-configuration |
| OAuth metadata | /.well-known/oauth-authorization-server |
| JSON Web Keys | /.well-known/jwks.json |