Endpoints · Substratal-Version: 1
All 128 operations in openapi.yaml 1.0.0-draft.13, grouped by area, with the Hub screens that use each one. destructive marks operations an agent key with restrict_destructive can't call.
Meta
Auth
| Method | Path | Summary | Auth | Screens |
|---|---|---|---|---|
| POST | /auth/signup | Create an account with email and password | None | AUTH-03 |
| POST | /auth/login | Exchange email and password for a session (or an MFA challenge) | None | AUTH-01 |
| POST | /auth/mfa/verify | Complete a login that returned an MFA challenge | None | AUTH-02 |
| POST | /auth/token/refresh | Rotate a platform refresh token for a new access token | None | GLB-03 |
| POST | /auth/logout destructive | Revoke the current session, or every session | Bearer | ACC-01 GLB-03 |
| POST | /auth/app-tokens | Mint a per-app JWT from a platform session (embedded login) | Bearer | APP-03 |
| POST | /auth/oauth/authorization-codes | Mint a one-time authorization code for a hosted launch (PKCE) | Bearer | APP-03 |
| POST | /auth/oauth/token no version header needed | Exchange an authorization code or app refresh token for an app token | None | |
| POST | /auth/email/verify | Confirm an email address from an emailed token | None | AUTH-04 |
| POST | /auth/email/verify/resend | Re-send a verification email (always 202) | None | AUTH-04 |
| POST | /auth/password/forgot | Send a password-reset email (always 202) | None | AUTH-05 |
| POST | /auth/password/reset | Set a new password from a reset token (revokes every session) | None | AUTH-06 |
| POST | /auth/invitations/accept | Set a password on an invited account, activate it, and sign in | None | AUTH-07 |
| POST | /auth/sso/{provider}/callback | Complete an SSO login (reserved — 501 until the broker integration ships) | None | AUTH-01 |
| POST | /users/{id}/password | Change password given the current one (self only) | Bearer | ACC-03 |
| POST | /users/{id}/mfa/totp | Begin TOTP enrollment (self only) | Bearer | ACC-05 |
| DELETE | /users/{id}/mfa/totp destructive | Support reset of a user's TOTP (requires users.manage) | Bearer | USR-03 |
| POST | /users/{id}/mfa/totp/confirm | Confirm TOTP enrollment with a first code; returns recovery codes once | Bearer | ACC-05 |
| POST | /users/{id}/mfa/totp/disable | Turn TOTP off given a current code or recovery code (self only) | Bearer | ACC-06 |
| GET | /users/{id}/sessions | List active sessions (self or users.manage) | Bearer | ACC-04 USR-04 |
| POST | /users/{id}/sessions/revoke-all destructive | Revoke every session (self or users.manage) | Bearer | ACC-04 USR-04 |
| DELETE | /users/{id}/sessions/{sessionId} destructive | Revoke one session | Bearer | ACC-04 USR-04 |
Users
| Method | Path | Summary | Auth | Screens |
|---|---|---|---|---|
| GET | /users | List or search users | Bearer | USR-01 NTF-06 GLB-01 ROL-02 |
| POST | /users | Create (invite) a user | Bearer | USR-02 |
| GET | /users/{id} | Fetch one user | Bearer | ACC-01 ACC-04 APP-01 USR-03 |
| PATCH | /users/{id} destructive | Update email (self, pending verification) or status (users.manage) | Bearer | ACC-02 USR-03 |
| DELETE | /users/{id} destructive | Soft-delete a user (self or users.manage) | Bearer | USR-03 |
| POST | /users/{id}/suspend destructive | Suspend a user (users.manage) | Bearer | USR-05 |
| POST | /users/{id}/invitation | Re-send the invitation email to an invited user (users.manage) | Bearer | USR-03 |
| GET | /users/{id}/export | Export everything this API holds about this user | Bearer | ACC-07 USR-03 |
| POST | /users/{id}/erasure-requests destructive | Request right-to-erasure (soft-delete now, hard-delete cascade in 7 days) | Bearer | ACC-08 |
| DELETE | /users/{id}/erasure-requests/current destructive | Cancel a scheduled erasure inside its 7-day window (users.manage) | Bearer | USR-03 |
Profiles
| Method | Path | Summary | Auth | Screens |
|---|---|---|---|---|
| GET | /users/{id}/profile | Fetch global Profile | Bearer | ACC-01 USR-03 |
| PATCH | /users/{id}/profile | Update global Profile (self or users.manage) | Bearer | ACC-01 |
| GET | /users/{id}/apps/{appId}/profile | Fetch per-app AppProfile (self, the app's own key, or platform users.list; defaults if none written yet) | Bearer | APP-04 |
| PATCH | /users/{id}/apps/{appId}/profile | Update per-app AppProfile (custom is merged one level; null removes a key) | Bearer | APP-04 |
Settings
| Method | Path | Summary | Auth | Screens |
|---|---|---|---|---|
| GET | /users/{id}/settings | Fetch global Settings (self, or platform users.list) | Bearer | SET-01 NTF-03 |
| PATCH | /users/{id}/settings | Update global Settings (self or users.manage) | Bearer | SET-01 |
| GET | /users/{id}/apps/{appId}/settings | Fetch fully resolved per-app settings (self, the app's own key, or platform users.list) | Bearer | SET-02 SET-01 |
| PATCH | /users/{id}/apps/{appId}/settings | Write per-app overrides (validated against settings_schema; null clears) | Bearer | SET-02 SET-01 |
Applications
| Method | Path | Summary | Auth | Screens |
|---|---|---|---|---|
| GET | /applications | List the catalog (filtered by visibility rules) | Bearer | APP-01 ACX-01 APL-01 BIL-01 NTF-01 |
| POST | /applications | Register an Application (applications.manage, or self-service into review) | Bearer | APL-02 |
| GET | /applications/{id} | Fetch one Application | Bearer | APP-02 SET-02 APL-03 |
| PATCH | /applications/{id} destructive | Update a catalog entry (owner — configuration; applications.manage — anything) | Bearer | APL-03 APL-04 APL-05 APL-06 |
| DELETE | /applications/{id} destructive | Delete an unreferenced test-mode Application (applications.manage) | Bearer |
Entitlements
| Method | Path | Summary | Auth | Screens |
|---|---|---|---|---|
| GET | /users/{id}/entitlements | A user's entitlements, personal and org-sourced | Bearer | APP-01 APP-05 ACX-01 |
| POST | /users/{id}/entitlements | Grant a personal Entitlement | Bearer | ACX-02 |
| GET | /entitlements | List entitlements across users (entitlements.manage or the Application's owner; app keys and owners confined) | Bearer | ACX-05 |
| GET | /entitlements/{id} | Fetch one entitlement | Bearer | ACX-03 |
| PATCH | /entitlements/{id} destructive | The toggle: change status, term, source (trial→purchase), order_id, or an org grant's member scope | Bearer | ORG-06 ORG-07 ACX-01 ACX-03 |
| DELETE | /entitlements/{id} destructive | Hard-remove a grant made in error (no order_id, under 24 hours old) | Bearer | ACX-01 |
Roles & Permissions
| Method | Path | Summary | Auth | Screens |
|---|---|---|---|---|
| GET | /permissions | List every Permission key the caller can see | Bearer | ROL-01 ROL-02 |
| GET | /roles | List Roles | Bearer | ROL-01 |
| POST | /roles | Define a Role | Bearer | ROL-03 |
| GET | /roles/{id} | Fetch one Role | Bearer | ROL-02 |
| PATCH | /roles/{id} destructive | Change a Role's permissions or description | Bearer | ROL-02 |
| DELETE | /roles/{id} destructive | Delete an unassigned, non-seed Role | Bearer | ROL-02 |
| GET | /users/{id}/roles | List a user's Role assignments (including implicit default_app_role) | Bearer | ROL-04 |
| POST | /users/{id}/roles/{roleId} | Assign a Role (idempotent — 200 if already held) | Bearer | ROL-04 |
| DELETE | /users/{id}/roles/{roleId} destructive | Remove a Role assignment (idempotent) | Bearer | ROL-04 |
| GET | /users/{id}/apps/{appId}/effective-permissions | The live access check (always 200) | Bearer | APP-02 ACX-04 |
Organizations
| Method | Path | Summary | Auth | Screens |
|---|---|---|---|---|
| GET | /organizations | List your Organizations (all, with organizations.manage) | Bearer | APP-01 ORG-01 |
| POST | /organizations | Create an Organization (any active User; caller becomes org_admin) | Bearer | ORG-02 |
| GET | /organizations/{id} | Fetch one Organization | Bearer | ORG-03 |
| PATCH | /organizations/{id} destructive | Rename (org admin), or suspend/reactivate (organizations.manage) | Bearer | ORG-08 |
| GET | /organizations/{id}/members | List members | Bearer | ORG-03 BIL-02 |
| POST | /organizations/{id}/members | Invite a member by email (org admin), or add one directly by user_id (organizations.manage) | Bearer | ORG-04 |
| POST | /organizations/{id}/members/me/accept | Accept a pending membership (the invited User's own token) | Bearer | ORG-09 |
| PATCH | /organizations/{id}/members/{userId} destructive | Change a member's role | Bearer | ORG-05 |
| DELETE | /organizations/{id}/members/{userId} destructive | Remove a member or withdraw an invitation; or leave or decline (userId = me) | Bearer | ORG-05 ORG-08 ORG-09 |
| GET | /organizations/{id}/scim-token | Show the Organization's SCIM token (never its secret) | Bearer | ORG-08 |
| POST | /organizations/{id}/scim-token | Create (or rotate) the Organization's SCIM token | Bearer | ORG-08 |
| DELETE | /organizations/{id}/scim-token | Turn SCIM off for the Organization | Bearer | ORG-08 |
| GET | /organizations/{id}/entitlements | List org-wide (seat) grants | Bearer | ORG-06 |
| POST | /organizations/{id}/entitlements | Grant an app to the whole Organization | Bearer | ORG-07 |
Tenancy
| Method | Path | Summary | Auth | Screens |
|---|---|---|---|---|
| GET | /tenants | List Tenants (your own; all with tenants.manage) | Bearer | BIL-04 |
| GET | /tenants/{id} | Fetch one Tenant | Bearer | BIL-04 |
| GET | /tenants/{id}/tier-change-requests | List tier-change requests for a Tenant | Bearer | BIL-04 |
| POST | /tenants/{id}/tier-change-requests destructive | Open a tier-change request on a customer's behalf (tenants.manage) | Bearer | BIL-04 |
| GET | /tenants/{id}/tier-change-requests/{requestId} | Fetch one tier-change request | Bearer | BIL-04 |
| PATCH | /tenants/{id}/tier-change-requests/{requestId} destructive | Schedule, start, complete, or cancel a tier-change request (tenants.manage) | Bearer | BIL-04 |
Billing
| Method | Path | Summary | Auth | Screens |
|---|---|---|---|---|
| GET | /subscriptions | List every subscriber's subscription (billing.manage) | Bearer | RPT-01 |
| GET | /users/{id}/subscription | A User's plan, what covers it, and their own subscription (self or billing.manage) | Bearer | USR-03 BIL-01 |
| POST | /users/me/billing/checkout-sessions | Start a Stripe Checkout to subscribe yourself to Standard (User token) | Bearer | BIL-03 |
| POST | /users/me/billing/portal-sessions | Open the Stripe Customer Portal for your own subscription (User token) | Bearer | BIL-03 |
| GET | /organizations/{id}/subscription | An Organization's plan and Standard subscription (org admin or billing.manage) | Bearer | BIL-02 |
| PATCH | /organizations/{id}/subscription | Choose which members the Organization's subscription covers (org admin) | Bearer | BIL-02 |
| POST | /organizations/{id}/billing/checkout-sessions | Start a Stripe Checkout to subscribe the Organization to Standard (org admin, User token) | Bearer | BIL-03 |
| POST | /organizations/{id}/billing/portal-sessions | Open the Stripe Customer Portal for the Organization's subscription (org admin or billing.manage, User token) | Bearer | BIL-03 |
Audit
| Method | Path | Summary | Auth | Screens |
|---|---|---|---|---|
| GET | /audit-events | Query the audit log (hot window only) | Bearer | KEY-04 AUD-01 |
| GET | /audit-events/{id} | Fetch one Audit Event | Bearer | AUD-02 |
| POST | /audit-exports | Export Audit Events to a file (asynchronous) | Bearer | AUD-01 |
| GET | /audit-exports/{id} | Fetch an export's status, and its download link once ready | Bearer | AUD-01 |
Webhooks
| Method | Path | Summary | Auth | Screens |
|---|---|---|---|---|
| GET | /webhooks | List subscriptions visible to the caller | Bearer | WHK-01 |
| POST | /webhooks | Subscribe a URL to event types | Bearer | WHK-02 |
| GET | /webhooks/{id} | Fetch one subscription | Bearer | WHK-03 |
| PATCH | /webhooks/{id} | Change url, events, description, api_version, or re-enable | Bearer | WHK-02 |
| DELETE | /webhooks/{id} destructive | Unsubscribe | Bearer | WHK-03 |
| POST | /webhooks/{id}/rotate-secret | Issue a new signing secret (24-hour overlap) | Bearer | WHK-03 |
| POST | /webhooks/{id}/test | Send a webhook.test event now | Bearer | WHK-03 |
| GET | /webhooks/{id}/deliveries | Recent delivery attempts (30-day log) | Bearer | WHK-03 |
| GET | /webhook-deliveries | Delivery attempts across every subscription visible to the caller (30-day log) | Bearer | |
| POST | /webhooks/{id}/deliveries/{deliveryId}/redeliver | Re-send one past event (same event id) | Bearer | WHK-03 |
Notifications
| Method | Path | Summary | Auth | Screens |
|---|---|---|---|---|
| GET | /push-credentials | List push credentials across every Application (applications.manage) | Bearer | |
| GET | /applications/{id}/push-credentials | List the push providers an Application has configured (the owner, the app's own key, or applications.manage) | Bearer | APL-07 |
| POST | /applications/{id}/push-credentials | Configure one push provider (the owner or applications.manage, User token only) | Bearer | APL-07 |
| GET | /applications/{id}/push-credentials/{provider} | Fetch one provider's configuration | Bearer | APL-07 |
| PATCH | /applications/{id}/push-credentials/{provider} | Replace key material, change non-secret fields, or re-enable a failed credential (User token only) | Bearer | APL-07 |
| DELETE | /applications/{id}/push-credentials/{provider} destructive | Remove a push provider (User token only) | Bearer | APL-07 |
| GET | /users/{id}/devices | List a User's push devices (self, the app's own key, or users.list) | Bearer | NTF-03 NTF-05 |
| POST | /users/{id}/devices | Register a push device, or refresh an existing registration (self or the app's own key) | Bearer | NTF-04 |
| GET | /users/{id}/devices/{deviceId} | Fetch one device | Bearer | NTF-05 |
| PATCH | /users/{id}/devices/{deviceId} | Update a device's name, app version, environment, or rotated token (self or the app's own key) | Bearer | NTF-03 NTF-04 |
| DELETE | /users/{id}/devices/{deviceId} destructive | Unregister a device (self, the app's own key, or users.manage) | Bearer | NTF-03 NTF-05 |
| POST | /users/{id}/devices/{deviceId}/test | Send a test push to one device and wait for the provider's answer (self or the app's own key) | Bearer | NTF-03 |
| GET | /users/{id}/notifications | List a User's notification inbox (self, the app's own key, or users.list) | Bearer | NTF-01 NTF-05 |
| POST | /users/{id}/notifications | Send one notification to one User (the app's own key with notifications.send, or platform notifications.send) | Bearer | NTF-06 |
| GET | /users/{id}/notifications/unread-count | Count unread notifications, in total and per Application (self or the app's own key) | Bearer | APP-01 NTF-01 GLB-03 |
| POST | /users/{id}/notifications/mark-read | Mark every unread notification matching the filters as read (self or the app's own key) | Bearer | NTF-01 |
| GET | /users/{id}/notifications/{notificationId} | Fetch one notification, with its per-device deliveries | Bearer | NTF-02 NTF-05 |
| PATCH | /users/{id}/notifications/{notificationId} | Mark one notification read, unread, or archived (self or the app's own key) | Bearer | NTF-01 NTF-02 |
API Keys
| Method | Path | Summary | Auth | Screens |
|---|---|---|---|---|
| GET | /api-keys | List keys the caller may manage | Bearer | KEY-01 |
| POST | /api-keys | Create a key (api_keys.manage, or the Application's owner for an app-scoped key) | Bearer | KEY-02 |
| GET | /api-keys/{id} | Fetch one key (never the secret) | Bearer | KEY-04 |
| PATCH | /api-keys/{id} destructive | Change name, permissions, or restrict_destructive | Bearer | KEY-04 |
| DELETE | /api-keys/{id} destructive | Revoke permanently | Bearer | KEY-04 |
| POST | /api-keys/{id}/rotate destructive | Issue a new secret, invalidating the old one immediately (no overlap) | Bearer | KEY-04 |