GET/api/v1/org/exports
GET /api/org/exports — the org-export ledger read model (0089):
newest-first list over the exports the org has created so
/settings/export grows its list/archive surface over real history.
Parameters
| Name | In | Type | Required | Description |
|---|
archived | query | — | No | Filter by archive state; absent returns all rows. |
limit | query | integer | No | |
offset | query | integer | No | |
Responses
Security: bearer
POST/api/v1/org/exports
POST /api/org/exports — builds the versioned bundle, streams it into
the ObjectStore, and returns the signed download link.
Responses
Security: bearer
PATCH/api/v1/org/exports/{export_id}
PATCH /api/org/exports/{export_id} — archives (or restores) ONE ledger
row; a pure read-model toggle over the row, content untouched.
Parameters
| Name | In | Type | Required | Description |
|---|
export_id | path | string | Yes | |
Request body
ExportArchiveUpdate
Responses
| Status | Description |
|---|
200 | |
404 | export not in this org's ledger |
Security: bearer
POST/api/v1/org/exports/{export_id}/download-link
POST /api/org/exports/{export_id}/download-link — mints ONE fresh
15-minute signed link for a LEDGERED export (the link is never stored
— this is the per-row download affordance the history surface uses).
Parameters
| Name | In | Type | Required | Description |
|---|
export_id | path | string | Yes | |
Responses
| Status | Description |
|---|
200 | |
404 | export not in this org's ledger |
Security: bearer
GET/api/v1/org/exports/{org_id}/{export_id}/download
GET /api/org/exports/{org_id}/{export_id}/download — streams the stored
bundle. Authenticated by the signed link alone (no JWT): an expired or
forged token is an unauthorized request, indistinguishable between the
two. The org id is IN the path (and inside the signature) so a token
authorizes exactly one (org, export, expiry) triple.
Parameters
| Name | In | Type | Required | Description |
|---|
org_id | path | string | Yes | |
export_id | path | string | Yes | |
Responses
GET/api/v1/org/manifest
GET /api/org/manifest — the org's customization manifest.
Owner/admin gated (policy §5: the manifest is an org-level
administrative artifact; technicians and dispatchers have no business
reading the full customization inventory, e.g. webhook URLs).
Responses
Security: bearer
GET/api/v1/orgs/{org_id}/custom-domain
`GET /api/v1/orgs/{org_id}/custom-domain` — current state + verification
status + provider-plugin availability.
Parameters
| Name | In | Type | Required | Description |
|---|
org_id | path | string | Yes | the org; must be the caller's own org |
Responses
| Status | Description |
|---|
200 | |
401 | not authenticated |
403 | service account without org_custom_domain:read |
404 | no such org for this caller |
Security: bearer
POST/api/v1/orgs/{org_id}/custom-domain
`POST /api/v1/orgs/{org_id}/custom-domain` — claim a domain.
Parameters
| Name | In | Type | Required | Description |
|---|
org_id | path | string | Yes | the org; must be the caller's own org |
Request body
SetCustomDomainRequest
Responses
| Status | Description |
|---|
200 | |
400 | invalid domain |
401 | not authenticated |
403 | not an admin / missing org_custom_domain:manage |
404 | no such org for this caller |
409 | domain already claimed by another workspace |
Security: bearer
DELETE/api/v1/orgs/{org_id}/custom-domain
`DELETE /api/v1/orgs/{org_id}/custom-domain` — clear the domain.
Parameters
| Name | In | Type | Required | Description |
|---|
org_id | path | string | Yes | the org; must be the caller's own org |
Responses
| Status | Description |
|---|
204 | domain cleared |
401 | not authenticated |
403 | not an admin / missing org_custom_domain:manage |
404 | no such org for this caller |
Security: bearer
POST/api/v1/orgs/{org_id}/custom-domain/verify
`POST /api/v1/orgs/{org_id}/custom-domain/verify` — run the generic DNS
verification (the private build tracker A8 (C)). The TXT token is the authority; the
A/CNAME leg is plausibility only.
Parameters
| Name | In | Type | Required | Description |
|---|
org_id | path | string | Yes | the org; must be the caller's own org |
Responses
| Status | Description |
|---|
200 | |
401 | not authenticated |
403 | not an admin / missing org_custom_domain:manage |
404 | no such org for this caller |
409 | no custom domain is set |
Security: bearer
GET/api/v1/orgs/{org_id}/quotas
GET /api/v1/orgs/{org_id}/quotas — usage beside configured limits.
Informational by construction: a percentage here is a measurement, and
nothing in the core reads this endpoint to limit anything. `limits`
is a real configuration read — an org that has configured none reports
`false`, because a default limit is a fake gate.
Parameters
| Name | In | Type | Required | Description |
|---|
org_id | path | string | Yes | the org to report on; must be the caller's own org |
Responses
| Status | Description |
|---|
200 | |
401 | not authenticated |
403 | service account without org_usage:read |
404 | no such org for this caller |
Security: bearer
GET/api/v1/orgs/{org_id}/suspension-status
`GET /api/v1/orgs/{org_id}/suspension-status` — the org's notice state.
Parameters
| Name | In | Type | Required | Description |
|---|
org_id | path | string | Yes | the org; must be the caller's own org |
Responses
| Status | Description |
|---|
200 | |
401 | not authenticated |
403 | service account without org_suspension:read |
404 | no such org for this caller |
Security: bearer
PATCH/api/v1/orgs/{org_id}/suspension-status
`PATCH /api/v1/orgs/{org_id}/suspension-status` — set or clear the flag
(`admin:edit`). Idempotent; emits `org.suspension_changed` + an audit row.
Parameters
| Name | In | Type | Required | Description |
|---|
org_id | path | string | Yes | the org; must be the caller's own org |
Request body
SetSuspensionRequest
Responses
| Status | Description |
|---|
200 | |
401 | not authenticated |
403 | not an admin (no admin:edit) |
404 | no such org for this caller |
422 | unknown reason, or a missing one when suspending |
Security: bearer
GET/api/v1/orgs/{org_id}/usage
GET /api/v1/orgs/{org_id}/usage — the org's current usage counts.
`refreshed_at` is when the numbers were computed; a consumer that
needs fresh numbers reads the row's own timestamp instead of assuming.
`unavailable` names every metric this build cannot compute honestly,
with the reason — it is a real, renderable list, not a placeholder.
Parameters
| Name | In | Type | Required | Description |
|---|
org_id | path | string | Yes | the org to report on; must be the caller's own org |
Responses
| Status | Description |
|---|
200 | |
401 | not authenticated |
403 | service account without org_usage:read |
404 | no such org for this caller |
Security: bearer