---
title: "Members & invitations endpoints — API reference | Data Tactical Group"
route: "/docs/api/reference/members-and-invitations"
updated: "2026-10-23"
---

# Members & invitations

17 endpoints, generated from the API's own OpenAPI document. Members, seats, roles, invitations and ownership.

## GET `/v2/account/members`

**The roster, split into seated and free members, with the seat counter**

Credentials: API key or App session. Operation id `orgListMembers`.

Lists the active organization's active members: `data` holds the seated members (owners first, then admins), `free_members` those without a seat, and `seats` the counter and the price of one more seat for the plan's billing interval. Any member may call it, with an API key or a session. Removed members are not listed. To buy a seat use `POST /v2/account/seats` (preview the charge first with `POST /v2/account/billing/preview`).

### Responses

#### `200` success

The roster.

As `application/json`.

**`seats` OrgSeatState always present**

The organization's seat counter. A seat is what makes a member's access paid; a member without one is a free member.

**`seats.included` integer always present**

Seats the plan includes (an unexpired DTG override of `seats_included` replaces the plan's figure), raised to `grandfathered` while that is set.

**`seats.grandfathered` integer or null**

T163: an organization that had more seated members than its plan's new included count when Regional fell to 10 seats and National to 15 keeps that many included seats until its seated members fall to the plan's count or its plan changes. This is that count; null for every other organization.

**`seats.purchased` integer always present**

Extra seats the organization has bought (`POST /v2/account/seats`).

**`seats.capacity` integer always present**

`included` + `purchased`: how many members may be seated.

**`seats.seated` integer always present**

Active members holding a seat now (owners and admins included). Can exceed `capacity`, because owners and admins are always seated.

**`seats.free` integer always present**

Active members without a seat (free members).

**`seats.available` integer always present**

Seats free to give, `max(0, capacity - seated)`. Seating a member needs this above 0.

**`seats.seat_price_usd_month` string or null always present**

The plan's monthly price of one extra seat in US dollars, as a decimal string (for example "8.00"); null on a plan that sells no seats. Kept for older clients; prefer `seat_price_usd`.

**`seats.seat_price_usd` number or null always present**

The price of one extra seat in US dollars for the plan's billing interval (`seat_price_interval`), read from the payment catalog as a checkout charges it. Null on a plan that sells no seats.

**`seats.seat_price_interval` "month" | "year" always present**

The billing interval `seat_price_usd` is charged per (the subscription's interval; `month` when there is none).

**`data` array of OrgMember always present**

Seated members, owners first, then admins, then by join date.

**`data[].id` string (uuid) always present**

The membership id (the `{id}` of `/v2/account/members/{id}`). Not the account id.

**`data[].email` string (email) always present**

The member's sign-in address.

**`data[].display_name` string or null always present**

The member's display name; null when they never set one.

**`data[].role` "owner" | "admin" | "member" always present**

A member's role in an organization (ORG\_LICENSING section 7.1). `owner`: everything, including roles, ownership transfer, closing the organization and billing. `admin`: manages members, invitations, domains and join requests, but never an owner's membership. `member`: uses the product. Owners and admins always hold a seat. Billing rights are a separate flag (`billing_contact`).

**`data[].billing_contact` boolean always present**

True when the member may see and manage billing (invoices, payment method) although not an owner.

**`data[].seated` boolean always present**

True when the member holds a seat (paid access). False is a free member, who resolves to the Free plan's scope inside this organization.

**`data[].api_enabled` boolean always present**

True when an owner or admin has allowed this member to hold live API keys (needs a seat and the organization's API add-on).

**`data[].status` "active" always present**

Always `active` here; removed members are not listed.

**`data[].last_active_at` string (date-time) or null always present**

The member's most recent successful data request on any channel (written at most every five minutes); null when they have made none. This is what monthly active users count.

**`data[].joined_at` string (date-time) always present**

When the membership began (or began again, for a returning member).

**`data[].active_keys` integer always present**

The member's unrevoked API keys in this organization, live and sandbox together.

**`free_members` array of OrgMember always present**

Members without a seat, by join date.

**`free_members[].id` string (uuid) always present**

The membership id (the `{id}` of `/v2/account/members/{id}`). Not the account id.

**`free_members[].email` string (email) always present**

The member's sign-in address.

**`free_members[].display_name` string or null always present**

The member's display name; null when they never set one.

**`free_members[].role` "owner" | "admin" | "member" always present**

A member's role in an organization (ORG\_LICENSING section 7.1). `owner`: everything, including roles, ownership transfer, closing the organization and billing. `admin`: manages members, invitations, domains and join requests, but never an owner's membership. `member`: uses the product. Owners and admins always hold a seat. Billing rights are a separate flag (`billing_contact`).

**`free_members[].billing_contact` boolean always present**

True when the member may see and manage billing (invoices, payment method) although not an owner.

**`free_members[].seated` boolean always present**

True when the member holds a seat (paid access). False is a free member, who resolves to the Free plan's scope inside this organization.

**`free_members[].api_enabled` boolean always present**

True when an owner or admin has allowed this member to hold live API keys (needs a seat and the organization's API add-on).

**`free_members[].status` "active" always present**

Always `active` here; removed members are not listed.

**`free_members[].last_active_at` string (date-time) or null always present**

The member's most recent successful data request on any channel (written at most every five minutes); null when they have made none. This is what monthly active users count.

**`free_members[].joined_at` string (date-time) always present**

When the membership began (or began again, for a returning member).

**`free_members[].active_keys` integer always present**

The member's unrevoked API keys in this organization, live and sandbox together.

**`reassignment_pending` boolean always present**

True after a plan change unseated members to fit a smaller seat count and no admin has changed a seat since. The first seat change after that is the free reassignment; any seat change clears the flag.

#### `401` error

Unauthorized. Codes: [`unauthenticated`](/docs/api/errors#code-unauthenticated) (no credential, or the key or session is not valid); [`key_revoked`](/docs/api/errors#code-key-revoked) (an API key that was revoked: `revoked_at`, and `reason` -- `holder`, `admin`, `member_removed`, `seat_removed`, `api_disabled`, `addon_ended`, [`account_closed`](/docs/api/errors#code-account-closed), [`org_closed`](/docs/api/errors#code-org-closed), `retired`, or null for a key revoked before T110 -- and a sentence saying when and why).

As `application/problem+json`.

#### `403` error

Forbidden. Codes: [`no_membership`](/docs/api/errors#code-no-membership) (the account has no active organization membership), [`account_suspended`](/docs/api/errors#code-account-suspended), [`org_suspended`](/docs/api/errors#code-org-suspended) (DTG suspended the organization; carries `organization` and possibly `reason`), [`org_closed`](/docs/api/errors#code-org-closed) (the organization is closed; carries `organization`), [`wrong_instance`](/docs/api/errors#code-wrong-instance) (a key of the mode this process does not serve; `base_url` names the address that serves it).

As `application/problem+json`.

#### `404` error

Not found. Codes: [`not_found`](/docs/api/errors#code-not-found) (`X-DTG-Org` names an organization the caller is not an active member of).

As `application/problem+json`.

#### `429` error

rate\_limited (the per-minute ceiling, X-RateLimit-\* say which), points\_exhausted (the monthly points allowance; Retry-After to the end of the UTC month), server\_busy or sandbox\_busy (load; retry after Retry-After). A refused server\_busy request is not metered.

As `application/problem+json`.

**`Retry-After` header**

Seconds to wait before retrying.

**`X-RateLimit-Limit` header**

The per-minute request ceiling that applies.

**`X-RateLimit-Remaining` header**

Requests left in the current window.

**`X-RateLimit-Reset` header**

Seconds until the window refills: on every answer, the time until the bucket is full again; on a refusal, until a request is allowed (as `Retry-After`).

Problem codes: [`unauthenticated`](/docs/api/errors#code-unauthenticated) (401), [`key_revoked`](/docs/api/errors#code-key-revoked) (401), [`account_closed`](/docs/api/errors#code-account-closed) (401), [`org_closed`](/docs/api/errors#code-org-closed) (401), [`no_membership`](/docs/api/errors#code-no-membership) (403), [`account_suspended`](/docs/api/errors#code-account-suspended) (403), [`org_suspended`](/docs/api/errors#code-org-suspended) (403), [`org_closed`](/docs/api/errors#code-org-closed) (403), [`wrong_instance`](/docs/api/errors#code-wrong-instance) (403), [`not_found`](/docs/api/errors#code-not-found) (404). Every problem is a [problem document](/docs/api/errors).

## POST `/v2/account/members`

**Invite one address or a pasted list (14-day links)**

Credentials: API key or App session. Operation id `orgInviteMembers`.

Owner or admin. Creates an invitation for each distinct address and mails it (the mail names the inviter and, where the organization has one, its verified domain). Each invitation lasts `rules.link_lifetimes.invitation_days` (14 by default). An address that already has a pending invitation here has that one revoked and a fresh one sent. An address that belongs to an active member, or is not a usable address, is reported and skipped; the request still answers 201. Inviting does not take a seat: a seat is taken on acceptance when one is free (an admin is always seated). Only an owner may invite admins. Each invitation writes an `invite.sent` audit row.

### Request body

Required; `application/json`.

**`email` string**

One address to invite. Trimmed and lower-cased.

**`emails` array of string or string**

Several addresses, at most 200 after de-duplication. An array of strings, or one string separated by spaces, commas or semicolons (a pasted list). Non-string array items are ignored.

**`role` "member" | "admin"**

The role the invitee joins with. Anything other than `admin` is treated as `member`. Only an owner may invite admins. (default "member")

### Responses

#### `201` success

One result per address.

As `application/json`.

**`data` array of OrgInviteResult always present**

One result per distinct address, in request order.

**`data[].email` string always present**

The address as processed (trimmed, lower-cased).

**`data[].status` "invited" | "invalid" | "already\_member" always present**

`invited`: an invitation was created and mailed. `invalid`: not a usable address, nothing sent. [`already_member`](/docs/api/errors#code-already-member): the address already belongs to an active member, nothing sent.

**`data[].invite_id` string (uuid)**

The new invitation's id. Present only when `status` is `invited`.

**`data[].expires_at` string (date-time)**

When the invitation link stops working (14 days by default, `rules.link_lifetimes.invitation_days`). Present only when `status` is `invited`.

#### `400` error

Bad request. Codes: [`bad_request`](/docs/api/errors#code-bad-request) (neither `email` nor `emails` gave an address, or more than 200 addresses), [`malformed_json`](/docs/api/errors#code-malformed-json) (the body is not valid JSON).

As `application/problem+json`.

#### `401` error

Unauthorized. Codes: [`unauthenticated`](/docs/api/errors#code-unauthenticated) (no credential, or the key or session is not valid); [`key_revoked`](/docs/api/errors#code-key-revoked) (an API key that was revoked: `revoked_at`, and `reason` -- `holder`, `admin`, `member_removed`, `seat_removed`, `api_disabled`, `addon_ended`, [`account_closed`](/docs/api/errors#code-account-closed), [`org_closed`](/docs/api/errors#code-org-closed), `retired`, or null for a key revoked before T110 -- and a sentence saying when and why).

As `application/problem+json`.

#### `403` error

Forbidden. Codes: [`role_required`](/docs/api/errors#code-role-required) (the caller is a member, or an admin inviting with `role: admin`; carries `required`), [`no_membership`](/docs/api/errors#code-no-membership), [`account_suspended`](/docs/api/errors#code-account-suspended), [`org_suspended`](/docs/api/errors#code-org-suspended), [`org_closed`](/docs/api/errors#code-org-closed), [`wrong_instance`](/docs/api/errors#code-wrong-instance) (see `GET /v2/account/members`; `base_url` names the address that serves the key). A sandbox key: [`sandbox_read_only`](/docs/api/errors#code-sandbox-read-only) (it may write only clusters).

As `application/problem+json`.

#### `404` error

Not found. Codes: [`not_found`](/docs/api/errors#code-not-found) (`X-DTG-Org` names an organization the caller is not an active member of).

As `application/problem+json`.

#### `413` error

Payload too large. Codes: [`body_too_large`](/docs/api/errors#code-body-too-large) (over 256 KB; carries `limit_bytes`).

As `application/problem+json`.

#### `429` error

rate\_limited (the per-minute ceiling, X-RateLimit-\* say which), points\_exhausted (the monthly points allowance; Retry-After to the end of the UTC month), server\_busy or sandbox\_busy (load; retry after Retry-After). A refused server\_busy request is not metered.

As `application/problem+json`.

**`Retry-After` header**

Seconds to wait before retrying.

**`X-RateLimit-Limit` header**

The per-minute request ceiling that applies.

**`X-RateLimit-Remaining` header**

Requests left in the current window.

**`X-RateLimit-Reset` header**

Seconds until the window refills: on every answer, the time until the bucket is full again; on a refusal, until a request is allowed (as `Retry-After`).

Problem codes: [`bad_request`](/docs/api/errors#code-bad-request) (400), [`malformed_json`](/docs/api/errors#code-malformed-json) (400), [`unauthenticated`](/docs/api/errors#code-unauthenticated) (401), [`key_revoked`](/docs/api/errors#code-key-revoked) (401), [`account_closed`](/docs/api/errors#code-account-closed) (401), [`org_closed`](/docs/api/errors#code-org-closed) (401), [`role_required`](/docs/api/errors#code-role-required) (403), [`no_membership`](/docs/api/errors#code-no-membership) (403), [`account_suspended`](/docs/api/errors#code-account-suspended) (403), [`org_suspended`](/docs/api/errors#code-org-suspended) (403), [`org_closed`](/docs/api/errors#code-org-closed) (403), [`wrong_instance`](/docs/api/errors#code-wrong-instance) (403), [`sandbox_read_only`](/docs/api/errors#code-sandbox-read-only) (403), [`not_found`](/docs/api/errors#code-not-found) (404), [`body_too_large`](/docs/api/errors#code-body-too-large) (413). Every problem is a [problem document](/docs/api/errors).

## DELETE `/v2/account/members/me`

**Leave the active organization**

Credentials: API key or App session. Operation id `orgLeave`.

Any role. Ends the caller's membership in the active organization: the seat is freed, every API key the caller holds there (live and sandbox) is revoked, their pending join requests there are closed, and an open ownership claim they made is cancelled (`claimant_left`). Unlike a removal, the caller's sessions are NOT ended: a session is the person's, not the organization's, and still serves their other organizations; the left organization simply stops resolving at once, and a remembered last-used organization pointing at it is cleared. Writes a `member.left` audit row and tells the owners in the app. The organization's last owner is refused; transfer ownership first.

### Responses

#### `204` success

Left. No body.

#### `401` error

Unauthorized. Codes: [`unauthenticated`](/docs/api/errors#code-unauthenticated) (no credential, or the key or session is not valid); [`key_revoked`](/docs/api/errors#code-key-revoked) (an API key that was revoked: `revoked_at`, and `reason` -- `holder`, `admin`, `member_removed`, `seat_removed`, `api_disabled`, `addon_ended`, [`account_closed`](/docs/api/errors#code-account-closed), [`org_closed`](/docs/api/errors#code-org-closed), `retired`, or null for a key revoked before T110 -- and a sentence saying when and why).

As `application/problem+json`.

#### `403` error

Forbidden. Codes: [`no_membership`](/docs/api/errors#code-no-membership), [`account_suspended`](/docs/api/errors#code-account-suspended), [`org_suspended`](/docs/api/errors#code-org-suspended), [`org_closed`](/docs/api/errors#code-org-closed), [`wrong_instance`](/docs/api/errors#code-wrong-instance) (see `GET /v2/account/members`; `base_url` names the address that serves the key). A sandbox key: [`sandbox_read_only`](/docs/api/errors#code-sandbox-read-only) (it may write only clusters).

As `application/problem+json`.

#### `404` error

Not found. Codes: [`not_found`](/docs/api/errors#code-not-found) (`X-DTG-Org` names an organization the caller is not an active member of).

As `application/problem+json`.

#### `409` error

Conflict. Codes: [`last_owner`](/docs/api/errors#code-last-owner) (the caller is the organization's only owner; carries `organizations: [{orgId, name}]`, the body account close also answers with).

As `application/problem+json`.

#### `429` error

rate\_limited (the per-minute ceiling, X-RateLimit-\* say which), points\_exhausted (the monthly points allowance; Retry-After to the end of the UTC month), server\_busy or sandbox\_busy (load; retry after Retry-After). A refused server\_busy request is not metered.

As `application/problem+json`.

**`Retry-After` header**

Seconds to wait before retrying.

**`X-RateLimit-Limit` header**

The per-minute request ceiling that applies.

**`X-RateLimit-Remaining` header**

Requests left in the current window.

**`X-RateLimit-Reset` header**

Seconds until the window refills: on every answer, the time until the bucket is full again; on a refusal, until a request is allowed (as `Retry-After`).

Problem codes: [`unauthenticated`](/docs/api/errors#code-unauthenticated) (401), [`key_revoked`](/docs/api/errors#code-key-revoked) (401), [`account_closed`](/docs/api/errors#code-account-closed) (401), [`org_closed`](/docs/api/errors#code-org-closed) (401), [`no_membership`](/docs/api/errors#code-no-membership) (403), [`account_suspended`](/docs/api/errors#code-account-suspended) (403), [`org_suspended`](/docs/api/errors#code-org-suspended) (403), [`org_closed`](/docs/api/errors#code-org-closed) (403), [`wrong_instance`](/docs/api/errors#code-wrong-instance) (403), [`sandbox_read_only`](/docs/api/errors#code-sandbox-read-only) (403), [`not_found`](/docs/api/errors#code-not-found) (404), [`last_owner`](/docs/api/errors#code-last-owner) (409). Every problem is a [problem document](/docs/api/errors).

## PATCH `/v2/account/members/{id}`

**Change a member's role, seat, API access or billing-contact flag**

Credentials: API key or App session. Operation id `orgUpdateMember`.

Owner or admin; an admin may change members and other admins but never an owner's membership (any field). Only an owner may change `role`.

- `role`: making someone `owner` or `admin` also seats them, without a capacity check. The last owner cannot be demoted.
- `seated: true` needs a free seat. The member is mailed and told in the app.
- `seated: false` (members only; owners and admins always hold seats) frees the seat, sets `api_enabled` to false and revokes the member's LIVE API keys in this organization. Their sandbox keys stay: a sandbox key needs neither a seat nor the add-on. The member is mailed and told in the app. A seat lost to a plan or seat reduction (the downgrade composite) does the same.
- `api_enabled: true` needs the organization's API add-on and a seated member (sent in the same request or already).
- `api_enabled: false` revokes the member's LIVE API keys in this organization; sandbox keys stay.
- `billing_contact`: grants or removes billing rights.

Any seat change clears `reassignment_pending`. Writes one `member.updated` audit row with the before and after of all four fields.

### Parameters

**`id` path · string (uuid) required**

The membership id (`id` on the roster), not the account id. A value that is not a UUID answers 404.

### Request body

Required; `application/json`.

**`role` "owner" | "admin" | "member"**

The new role. Only an owner may change roles. Making someone `owner` or `admin` also seats them (no seat check; owners and admins may exceed the seat capacity). Demoting the organization's last owner is refused.

**`seated` boolean**

Give (`true`) or take back (`false`) a seat. Giving needs a free seat. Owners and admins cannot be unseated. Taking a seat back also sets `api_enabled` to false (see the operation description for what happens to keys).

**`api_enabled` boolean**

Allow (`true`) or stop (`false`) this member holding live API keys. `true` needs the organization's API add-on and a seated member. `false` revokes the member's LIVE keys in this organization; their sandbox keys stay.

**`billing_contact` boolean**

Make the member a billing contact (may see and manage invoices and the payment method) or remove the flag.

### Responses

#### `200` success

The membership after the change.

As `application/json`.

**`id` string (uuid) always present**

The membership id.

**`org_id` string (uuid) always present**

The organization's id.

**`account_id` string (uuid) always present**

The member's account id.

**`role` "owner" | "admin" | "member" always present**

A member's role in an organization (ORG\_LICENSING section 7.1). `owner`: everything, including roles, ownership transfer, closing the organization and billing. `admin`: manages members, invitations, domains and join requests, but never an owner's membership. `member`: uses the product. Owners and admins always hold a seat. Billing rights are a separate flag (`billing_contact`).

**`billing_contact` boolean always present**

True when the member may manage billing.

**`seated` boolean always present**

True when the member holds a seat.

**`api_enabled` boolean always present**

True when the member may hold live API keys.

**`status` "active" always present**

Always `active` (a removed membership cannot be changed).

**`last_active_at` string (date-time) or null always present**

The member's most recent successful data request; null when none.

**`joined_at` string (date-time) always present**

When the membership began.

**`removed_at` string (date-time) or null always present**

Always null on an active membership (set when a membership is removed).

**`email` string (email) always present**

The member's sign-in address.

#### `400` error

Bad request. Codes: [`bad_request`](/docs/api/errors#code-bad-request) (a field of the wrong type or value, nothing to update, unseating an owner or admin, or `api_enabled: true` for an unseated member), [`malformed_json`](/docs/api/errors#code-malformed-json) (the body is not valid JSON).

As `application/problem+json`.

#### `401` error

Unauthorized. Codes: [`unauthenticated`](/docs/api/errors#code-unauthenticated) (no credential, or the key or session is not valid); [`key_revoked`](/docs/api/errors#code-key-revoked) (an API key that was revoked: `revoked_at`, and `reason` -- `holder`, `admin`, `member_removed`, `seat_removed`, `api_disabled`, `addon_ended`, [`account_closed`](/docs/api/errors#code-account-closed), [`org_closed`](/docs/api/errors#code-org-closed), `retired`, or null for a key revoked before T110 -- and a sentence saying when and why).

As `application/problem+json`.

#### `403` error

Forbidden. Codes: [`role_required`](/docs/api/errors#code-role-required) (the caller is a member, or an admin sent `role`; carries `required` when raised by the role check), [`owner_row_protected`](/docs/api/errors#code-owner-row-protected) (an admin changing an owner's membership), [`plan_required`](/docs/api/errors#code-plan-required) (`api_enabled: true` without the API add-on; carries `entitlement: api_access`), [`no_membership`](/docs/api/errors#code-no-membership), [`account_suspended`](/docs/api/errors#code-account-suspended), [`org_suspended`](/docs/api/errors#code-org-suspended), [`org_closed`](/docs/api/errors#code-org-closed), [`wrong_instance`](/docs/api/errors#code-wrong-instance) (see `GET /v2/account/members`; `base_url` names the address that serves the key). A sandbox key: [`sandbox_read_only`](/docs/api/errors#code-sandbox-read-only) (it may write only clusters).

As `application/problem+json`.

#### `404` error

Not found. Codes: [`not_found`](/docs/api/errors#code-not-found) (no active member with that id in this organization, or `X-DTG-Org` names an organization the caller is not an active member of).

As `application/problem+json`.

#### `409` error

Conflict. Codes: [`no_seat_available`](/docs/api/errors#code-no-seat-available) (seating needs a free seat; carries `seats`; buy one with `POST /v2/account/seats`), [`last_owner`](/docs/api/errors#code-last-owner) (demoting the only owner; transfer ownership first).

As `application/problem+json`.

#### `413` error

Payload too large. Codes: [`body_too_large`](/docs/api/errors#code-body-too-large) (over 256 KB; carries `limit_bytes`).

As `application/problem+json`.

#### `429` error

rate\_limited (the per-minute ceiling, X-RateLimit-\* say which), points\_exhausted (the monthly points allowance; Retry-After to the end of the UTC month), server\_busy or sandbox\_busy (load; retry after Retry-After). A refused server\_busy request is not metered.

As `application/problem+json`.

**`Retry-After` header**

Seconds to wait before retrying.

**`X-RateLimit-Limit` header**

The per-minute request ceiling that applies.

**`X-RateLimit-Remaining` header**

Requests left in the current window.

**`X-RateLimit-Reset` header**

Seconds until the window refills: on every answer, the time until the bucket is full again; on a refusal, until a request is allowed (as `Retry-After`).

Problem codes: [`bad_request`](/docs/api/errors#code-bad-request) (400), [`malformed_json`](/docs/api/errors#code-malformed-json) (400), [`unauthenticated`](/docs/api/errors#code-unauthenticated) (401), [`key_revoked`](/docs/api/errors#code-key-revoked) (401), [`account_closed`](/docs/api/errors#code-account-closed) (401), [`org_closed`](/docs/api/errors#code-org-closed) (401), [`role_required`](/docs/api/errors#code-role-required) (403), [`owner_row_protected`](/docs/api/errors#code-owner-row-protected) (403), [`plan_required`](/docs/api/errors#code-plan-required) (403), [`no_membership`](/docs/api/errors#code-no-membership) (403), [`account_suspended`](/docs/api/errors#code-account-suspended) (403), [`org_suspended`](/docs/api/errors#code-org-suspended) (403), [`org_closed`](/docs/api/errors#code-org-closed) (403), [`wrong_instance`](/docs/api/errors#code-wrong-instance) (403), [`sandbox_read_only`](/docs/api/errors#code-sandbox-read-only) (403), [`not_found`](/docs/api/errors#code-not-found) (404), [`no_seat_available`](/docs/api/errors#code-no-seat-available) (409), [`last_owner`](/docs/api/errors#code-last-owner) (409), [`body_too_large`](/docs/api/errors#code-body-too-large) (413). Every problem is a [problem document](/docs/api/errors).

## DELETE `/v2/account/members/{id}`

**Remove a member**

Credentials: API key or App session. Operation id `orgRemoveMember`.

Owner or admin; only an owner may remove an owner, and the last owner cannot be removed. The membership ends at once (ORG\_LICENSING section 7.4): the seat is freed, EVERY API key the member holds in this organization is revoked (live and sandbox), ALL of the person's sessions are ended (they are signed out everywhere, other organizations included), their pending join requests here are closed, and an open ownership claim they made is cancelled (`claimant_left`). Counties and clusters stay with the organization; nothing is credited. Removing yourself this way also ends your sessions; use `DELETE /v2/account/members/me` to leave instead. Writes a `member.removed` audit row.

### Parameters

**`id` path · string (uuid) required**

The membership id (`id` on the roster), not the account id. A value that is not a UUID answers 404.

### Responses

#### `204` success

Removed. No body.

#### `401` error

Unauthorized. Codes: [`unauthenticated`](/docs/api/errors#code-unauthenticated) (no credential, or the key or session is not valid); [`key_revoked`](/docs/api/errors#code-key-revoked) (an API key that was revoked: `revoked_at`, and `reason` -- `holder`, `admin`, `member_removed`, `seat_removed`, `api_disabled`, `addon_ended`, [`account_closed`](/docs/api/errors#code-account-closed), [`org_closed`](/docs/api/errors#code-org-closed), `retired`, or null for a key revoked before T110 -- and a sentence saying when and why).

As `application/problem+json`.

#### `403` error

Forbidden. Codes: [`role_required`](/docs/api/errors#code-role-required) (the caller is a member, or an admin removing an owner), [`no_membership`](/docs/api/errors#code-no-membership), [`account_suspended`](/docs/api/errors#code-account-suspended), [`org_suspended`](/docs/api/errors#code-org-suspended), [`org_closed`](/docs/api/errors#code-org-closed), [`wrong_instance`](/docs/api/errors#code-wrong-instance) (see `GET /v2/account/members`; `base_url` names the address that serves the key). A sandbox key: [`sandbox_read_only`](/docs/api/errors#code-sandbox-read-only) (it may write only clusters).

As `application/problem+json`.

#### `404` error

Not found. Codes: [`not_found`](/docs/api/errors#code-not-found) (no active member with that id in this organization, or `X-DTG-Org` names an organization the caller is not an active member of).

As `application/problem+json`.

#### `409` error

Conflict. Codes: [`last_owner`](/docs/api/errors#code-last-owner) (the member is the organization's only owner; transfer ownership first).

As `application/problem+json`.

#### `429` error

rate\_limited (the per-minute ceiling, X-RateLimit-\* say which), points\_exhausted (the monthly points allowance; Retry-After to the end of the UTC month), server\_busy or sandbox\_busy (load; retry after Retry-After). A refused server\_busy request is not metered.

As `application/problem+json`.

**`Retry-After` header**

Seconds to wait before retrying.

**`X-RateLimit-Limit` header**

The per-minute request ceiling that applies.

**`X-RateLimit-Remaining` header**

Requests left in the current window.

**`X-RateLimit-Reset` header**

Seconds until the window refills: on every answer, the time until the bucket is full again; on a refusal, until a request is allowed (as `Retry-After`).

Problem codes: [`unauthenticated`](/docs/api/errors#code-unauthenticated) (401), [`key_revoked`](/docs/api/errors#code-key-revoked) (401), [`account_closed`](/docs/api/errors#code-account-closed) (401), [`org_closed`](/docs/api/errors#code-org-closed) (401), [`role_required`](/docs/api/errors#code-role-required) (403), [`no_membership`](/docs/api/errors#code-no-membership) (403), [`account_suspended`](/docs/api/errors#code-account-suspended) (403), [`org_suspended`](/docs/api/errors#code-org-suspended) (403), [`org_closed`](/docs/api/errors#code-org-closed) (403), [`wrong_instance`](/docs/api/errors#code-wrong-instance) (403), [`sandbox_read_only`](/docs/api/errors#code-sandbox-read-only) (403), [`not_found`](/docs/api/errors#code-not-found) (404), [`last_owner`](/docs/api/errors#code-last-owner) (409). Every problem is a [problem document](/docs/api/errors).

## POST `/v2/account/members/{id}/transfer-ownership`

**Make another member the owner and step down to admin**

Credentials: API key or App session. Operation id `orgTransferOwnership`.

Owner only. The member named by `{id}` becomes an owner and is seated (without a capacity check); the caller becomes an admin and keeps their seat. Both changes happen together. No body is read. Writes an `ownership.transferred` audit row. No mail is sent.

### Parameters

**`id` path · string (uuid) required**

The membership id of the new owner. A value that is not a UUID answers 404.

### Responses

#### `200` success

Ownership transferred.

As `application/json`.

**`owner_membership_id` string (uuid) always present**

The membership that is now an owner (the `{id}` of the request).

**`previous_owner_membership_id` string (uuid) always present**

The caller's membership, which stepped down.

**`previous_owner_role` "admin" always present**

The caller's role now. Always `admin` (still seated).

#### `400` error

Bad request. Codes: [`bad_request`](/docs/api/errors#code-bad-request) (`{id}` is the caller's own membership).

As `application/problem+json`.

#### `401` error

Unauthorized. Codes: [`unauthenticated`](/docs/api/errors#code-unauthenticated) (no credential, or the key or session is not valid); [`key_revoked`](/docs/api/errors#code-key-revoked) (an API key that was revoked: `revoked_at`, and `reason` -- `holder`, `admin`, `member_removed`, `seat_removed`, `api_disabled`, `addon_ended`, [`account_closed`](/docs/api/errors#code-account-closed), [`org_closed`](/docs/api/errors#code-org-closed), `retired`, or null for a key revoked before T110 -- and a sentence saying when and why).

As `application/problem+json`.

#### `403` error

Forbidden. Codes: [`role_required`](/docs/api/errors#code-role-required) (the caller is not an owner; carries `required`), [`no_membership`](/docs/api/errors#code-no-membership), [`account_suspended`](/docs/api/errors#code-account-suspended), [`org_suspended`](/docs/api/errors#code-org-suspended), [`org_closed`](/docs/api/errors#code-org-closed), [`wrong_instance`](/docs/api/errors#code-wrong-instance) (see `GET /v2/account/members`; `base_url` names the address that serves the key). A sandbox key: [`sandbox_read_only`](/docs/api/errors#code-sandbox-read-only) (it may write only clusters).

As `application/problem+json`.

#### `404` error

Not found. Codes: [`not_found`](/docs/api/errors#code-not-found) (no active member with that id in this organization, or `X-DTG-Org` names an organization the caller is not an active member of).

As `application/problem+json`.

#### `429` error

rate\_limited (the per-minute ceiling, X-RateLimit-\* say which), points\_exhausted (the monthly points allowance; Retry-After to the end of the UTC month), server\_busy or sandbox\_busy (load; retry after Retry-After). A refused server\_busy request is not metered.

As `application/problem+json`.

**`Retry-After` header**

Seconds to wait before retrying.

**`X-RateLimit-Limit` header**

The per-minute request ceiling that applies.

**`X-RateLimit-Remaining` header**

Requests left in the current window.

**`X-RateLimit-Reset` header**

Seconds until the window refills: on every answer, the time until the bucket is full again; on a refusal, until a request is allowed (as `Retry-After`).

Problem codes: [`bad_request`](/docs/api/errors#code-bad-request) (400), [`unauthenticated`](/docs/api/errors#code-unauthenticated) (401), [`key_revoked`](/docs/api/errors#code-key-revoked) (401), [`account_closed`](/docs/api/errors#code-account-closed) (401), [`org_closed`](/docs/api/errors#code-org-closed) (401), [`role_required`](/docs/api/errors#code-role-required) (403), [`no_membership`](/docs/api/errors#code-no-membership) (403), [`account_suspended`](/docs/api/errors#code-account-suspended) (403), [`org_suspended`](/docs/api/errors#code-org-suspended) (403), [`org_closed`](/docs/api/errors#code-org-closed) (403), [`wrong_instance`](/docs/api/errors#code-wrong-instance) (403), [`sandbox_read_only`](/docs/api/errors#code-sandbox-read-only) (403), [`not_found`](/docs/api/errors#code-not-found) (404). Every problem is a [problem document](/docs/api/errors).

## GET `/v2/account/members/claim-ownership`

**Read the ownership claim, if any**

Credentials: API key or App session. Operation id `orgGetOwnershipClaim`.

Owner or admin. The ownership claim lifecycle (ORG\_LICENSING section 7.3): an admin whose verified address is at a domain the organization has verified may claim ownership when no owner has been present for the notice window (`notice_days`). The owners are mailed and the claim completes at `completes_at` (the claimant becomes owner and every current owner becomes admin) unless, before then, an owner is present (signs in, or makes any request on a session; an API key never counts), which cancels it at once as `owner_present`, or the claimant leaves, is removed or closes their account, which cancels it as `claimant_left`.

This read returns the open claim, else the most recent claim cancelled within the last notice window (so the owner whose sign-in cancelled it, and the claimant, can see what happened), else `claim: null`. The claimant is named as they were when they claimed.

### Responses

#### `200` success

The claim, or null.

As `application/json`.

**`notice_days` integer always present**

The notice window in days (ORG\_LICENSING section 7.3; 7 by default, also served as `rules.ownership_claim_notice_days`).

**`claim` OrgOwnershipClaim or null always present**

The open claim, else the most recently cancelled one within one notice window, else null.

**`claim.id` string (uuid)**

The claim's id.

**`claim.status` "pending" | "cancelled"**

`pending`: open and counting down. `cancelled`: ended without completing (see `cancel_reason`).

**`claim.opened_at` string (date-time)**

When the claim was made and the owners were mailed.

**`claim.completes_at` string (date-time)**

When a pending claim completes (opened\_at plus `notice_days`).

**`claim.cancelled_at` string (date-time)**

When the claim was cancelled. Present only when `status` is `cancelled`.

**`claim.cancel_reason` "owner\_present" | "claimant\_left"**

Present only when `status` is `cancelled`. `owner_present`: an owner signed in or made a request on a session during the window (an API key never counts). `claimant_left`: the claimant was removed, left, or closed their account.

**`claim.owner_present_at` string (date-time) or null**

Present only when `status` is `cancelled`. When the owner's presence was recorded; null when the reason is `claimant_left`.

**`claim.claimant` OrgClaimant**

The admin making the claim, as the claim remembers them (their address and display name when it was made).

**`claim.claimant.membership_id` string (uuid) always present**

The claimant's membership id.

**`claim.claimant.email` string or null always present**

The claimant's address when they claimed. Null only for an old claim with no remembered address whose claimant has since closed their account.

**`claim.claimant.display_name` string or null always present**

The claimant's display name when they claimed; null when they had none. "A former member" when neither the claim nor a live account can name them.

**`claim.you_are` "claimant" | "owner" | "admin"**

The caller's relation to the claim, so one screen can say "your claim" or "a claim against you".

#### `401` error

Unauthorized. Codes: [`unauthenticated`](/docs/api/errors#code-unauthenticated) (no credential, or the key or session is not valid); [`key_revoked`](/docs/api/errors#code-key-revoked) (an API key that was revoked: `revoked_at`, and `reason` -- `holder`, `admin`, `member_removed`, `seat_removed`, `api_disabled`, `addon_ended`, [`account_closed`](/docs/api/errors#code-account-closed), [`org_closed`](/docs/api/errors#code-org-closed), `retired`, or null for a key revoked before T110 -- and a sentence saying when and why).

As `application/problem+json`.

#### `403` error

Forbidden. Codes: [`role_required`](/docs/api/errors#code-role-required) (the caller is a member; carries `required`), [`no_membership`](/docs/api/errors#code-no-membership), [`account_suspended`](/docs/api/errors#code-account-suspended), [`org_suspended`](/docs/api/errors#code-org-suspended), [`org_closed`](/docs/api/errors#code-org-closed), [`wrong_instance`](/docs/api/errors#code-wrong-instance) (see `GET /v2/account/members`; `base_url` names the address that serves the key).

As `application/problem+json`.

#### `404` error

Not found. Codes: [`not_found`](/docs/api/errors#code-not-found) (`X-DTG-Org` names an organization the caller is not an active member of).

As `application/problem+json`.

#### `429` error

rate\_limited (the per-minute ceiling, X-RateLimit-\* say which), points\_exhausted (the monthly points allowance; Retry-After to the end of the UTC month), server\_busy or sandbox\_busy (load; retry after Retry-After). A refused server\_busy request is not metered.

As `application/problem+json`.

**`Retry-After` header**

Seconds to wait before retrying.

**`X-RateLimit-Limit` header**

The per-minute request ceiling that applies.

**`X-RateLimit-Remaining` header**

Requests left in the current window.

**`X-RateLimit-Reset` header**

Seconds until the window refills: on every answer, the time until the bucket is full again; on a refusal, until a request is allowed (as `Retry-After`).

Problem codes: [`unauthenticated`](/docs/api/errors#code-unauthenticated) (401), [`key_revoked`](/docs/api/errors#code-key-revoked) (401), [`account_closed`](/docs/api/errors#code-account-closed) (401), [`org_closed`](/docs/api/errors#code-org-closed) (401), [`role_required`](/docs/api/errors#code-role-required) (403), [`no_membership`](/docs/api/errors#code-no-membership) (403), [`account_suspended`](/docs/api/errors#code-account-suspended) (403), [`org_suspended`](/docs/api/errors#code-org-suspended) (403), [`org_closed`](/docs/api/errors#code-org-closed) (403), [`wrong_instance`](/docs/api/errors#code-wrong-instance) (403), [`not_found`](/docs/api/errors#code-not-found) (404). Every problem is a [problem document](/docs/api/errors).

## POST `/v2/account/members/claim-ownership`

**An admin claims ownership of an organization whose owners are absent**

Credentials: API key or App session. Operation id `orgClaimOwnership`.

Admin only (not an owner, not a member). The caller's sign-in address must be verified and at a domain this organization has verified, and no owner may have been present (signed in or made a session request) within the notice window. Opens a claim that completes after `notice_days` unless an owner is present first (see `GET` on this path). Every owner is mailed and told in the app; writes an `ownership.claimed` audit row. If a claim is already open it is returned unchanged with 200 and nothing is sent. No body is read.

### Responses

#### `200` success

A claim was already open; it is returned unchanged.

As `application/json`.

**`id` string (uuid) always present**

The claim's id.

**`completes_at` string (date-time) always present**

When the claim completes unless an owner is present first.

**`status` "pending" always present**

Always `pending`.

#### `201` success

The claim was opened and the owners notified.

As `application/json`.

**`id` string (uuid) always present**

The claim's id.

**`completes_at` string (date-time) always present**

When the claim completes unless an owner is present first.

**`status` "pending" always present**

Always `pending`.

#### `401` error

Unauthorized. Codes: [`unauthenticated`](/docs/api/errors#code-unauthenticated) (no credential, or the key or session is not valid); [`key_revoked`](/docs/api/errors#code-key-revoked) (an API key that was revoked: `revoked_at`, and `reason` -- `holder`, `admin`, `member_removed`, `seat_removed`, `api_disabled`, `addon_ended`, [`account_closed`](/docs/api/errors#code-account-closed), [`org_closed`](/docs/api/errors#code-org-closed), `retired`, or null for a key revoked before T110 -- and a sentence saying when and why).

As `application/problem+json`.

#### `403` error

Forbidden. Codes: [`role_required`](/docs/api/errors#code-role-required) (the caller is not an admin), [`domain_verification_required`](/docs/api/errors#code-domain-verification-required) (the caller's address is unverified or not at a domain this organization has verified), [`no_membership`](/docs/api/errors#code-no-membership), [`account_suspended`](/docs/api/errors#code-account-suspended), [`org_suspended`](/docs/api/errors#code-org-suspended), [`org_closed`](/docs/api/errors#code-org-closed), [`wrong_instance`](/docs/api/errors#code-wrong-instance) (see `GET /v2/account/members`; `base_url` names the address that serves the key). A sandbox key: [`sandbox_read_only`](/docs/api/errors#code-sandbox-read-only) (it may write only clusters).

As `application/problem+json`.

#### `404` error

Not found. Codes: [`not_found`](/docs/api/errors#code-not-found) (`X-DTG-Org` names an organization the caller is not an active member of).

As `application/problem+json`.

#### `409` error

Conflict. Codes: [`owner_active`](/docs/api/errors#code-owner-active) (an owner signed in or made a session request within the notice window; ask them to transfer ownership).

As `application/problem+json`.

#### `429` error

rate\_limited (the per-minute ceiling, X-RateLimit-\* say which), points\_exhausted (the monthly points allowance; Retry-After to the end of the UTC month), server\_busy or sandbox\_busy (load; retry after Retry-After). A refused server\_busy request is not metered.

As `application/problem+json`.

**`Retry-After` header**

Seconds to wait before retrying.

**`X-RateLimit-Limit` header**

The per-minute request ceiling that applies.

**`X-RateLimit-Remaining` header**

Requests left in the current window.

**`X-RateLimit-Reset` header**

Seconds until the window refills: on every answer, the time until the bucket is full again; on a refusal, until a request is allowed (as `Retry-After`).

Problem codes: [`unauthenticated`](/docs/api/errors#code-unauthenticated) (401), [`key_revoked`](/docs/api/errors#code-key-revoked) (401), [`account_closed`](/docs/api/errors#code-account-closed) (401), [`org_closed`](/docs/api/errors#code-org-closed) (401), [`role_required`](/docs/api/errors#code-role-required) (403), [`domain_verification_required`](/docs/api/errors#code-domain-verification-required) (403), [`no_membership`](/docs/api/errors#code-no-membership) (403), [`account_suspended`](/docs/api/errors#code-account-suspended) (403), [`org_suspended`](/docs/api/errors#code-org-suspended) (403), [`org_closed`](/docs/api/errors#code-org-closed) (403), [`wrong_instance`](/docs/api/errors#code-wrong-instance) (403), [`sandbox_read_only`](/docs/api/errors#code-sandbox-read-only) (403), [`not_found`](/docs/api/errors#code-not-found) (404), [`owner_active`](/docs/api/errors#code-owner-active) (409). Every problem is a [problem document](/docs/api/errors).

## GET `/v2/account/invites`

**Pending invitations**

Credentials: API key or App session. Operation id `orgListInvites`.

The owner or an admin (O63 S11, Q22; 403 [`role_required`](/docs/api/errors#code-role-required) for anyone else). Invitations of the active organization not yet accepted or revoked, newest first. An expired one stays listed (with `expired: true`) until it is revoked or resent.

### Responses

#### `200` success

The pending invitations.

As `application/json`.

**`data` array of OrgPendingInvite always present**

Pending invitations, newest first.

**`data[].id` string (uuid) always present**

The invitation's id.

**`data[].email` string always present**

The invited address.

**`data[].role` "member" | "admin" always present**

The role the invitee joins with.

**`data[].expires_at` string (date-time) always present**

When the link stops working.

**`data[].created_at` string (date-time) always present**

When the invitation was first made (a resend does not change it).

**`data[].invited_by` string always present**

The sign-in address of the person who invited.

**`data[].expired` boolean always present**

True when `expires_at` has passed; resend to issue a fresh link.

#### `401` error

Unauthorized. Codes: [`unauthenticated`](/docs/api/errors#code-unauthenticated) (no credential, or the key or session is not valid); [`key_revoked`](/docs/api/errors#code-key-revoked) (an API key that was revoked: `revoked_at`, and `reason` -- `holder`, `admin`, `member_removed`, `seat_removed`, `api_disabled`, `addon_ended`, [`account_closed`](/docs/api/errors#code-account-closed), [`org_closed`](/docs/api/errors#code-org-closed), `retired`, or null for a key revoked before T110 -- and a sentence saying when and why).

As `application/problem+json`.

#### `403` error

Forbidden. Codes: [`no_membership`](/docs/api/errors#code-no-membership), [`account_suspended`](/docs/api/errors#code-account-suspended), [`org_suspended`](/docs/api/errors#code-org-suspended), [`org_closed`](/docs/api/errors#code-org-closed), [`wrong_instance`](/docs/api/errors#code-wrong-instance) (see `GET /v2/account/members`; `base_url` names the address that serves the key).

As `application/problem+json`.

#### `404` error

Not found. Codes: [`not_found`](/docs/api/errors#code-not-found) (`X-DTG-Org` names an organization the caller is not an active member of).

As `application/problem+json`.

#### `429` error

rate\_limited (the per-minute ceiling, X-RateLimit-\* say which), points\_exhausted (the monthly points allowance; Retry-After to the end of the UTC month), server\_busy or sandbox\_busy (load; retry after Retry-After). A refused server\_busy request is not metered.

As `application/problem+json`.

**`Retry-After` header**

Seconds to wait before retrying.

**`X-RateLimit-Limit` header**

The per-minute request ceiling that applies.

**`X-RateLimit-Remaining` header**

Requests left in the current window.

**`X-RateLimit-Reset` header**

Seconds until the window refills: on every answer, the time until the bucket is full again; on a refusal, until a request is allowed (as `Retry-After`).

Problem codes: [`unauthenticated`](/docs/api/errors#code-unauthenticated) (401), [`key_revoked`](/docs/api/errors#code-key-revoked) (401), [`account_closed`](/docs/api/errors#code-account-closed) (401), [`org_closed`](/docs/api/errors#code-org-closed) (401), [`no_membership`](/docs/api/errors#code-no-membership) (403), [`account_suspended`](/docs/api/errors#code-account-suspended) (403), [`org_suspended`](/docs/api/errors#code-org-suspended) (403), [`org_closed`](/docs/api/errors#code-org-closed) (403), [`wrong_instance`](/docs/api/errors#code-wrong-instance) (403), [`not_found`](/docs/api/errors#code-not-found) (404). Every problem is a [problem document](/docs/api/errors).

## DELETE `/v2/account/invites/{id}`

**Revoke a pending invitation**

Credentials: API key or App session. Operation id `orgRevokeInvite`.

Owner or admin. The link stops working at once. Writes an `invite.revoked` audit row. No mail is sent.

### Parameters

**`id` path · string (uuid) required**

The invitation's id. A value that is not a UUID answers 404.

### Responses

#### `204` success

Revoked. No body.

#### `401` error

Unauthorized. Codes: [`unauthenticated`](/docs/api/errors#code-unauthenticated) (no credential, or the key or session is not valid); [`key_revoked`](/docs/api/errors#code-key-revoked) (an API key that was revoked: `revoked_at`, and `reason` -- `holder`, `admin`, `member_removed`, `seat_removed`, `api_disabled`, `addon_ended`, [`account_closed`](/docs/api/errors#code-account-closed), [`org_closed`](/docs/api/errors#code-org-closed), `retired`, or null for a key revoked before T110 -- and a sentence saying when and why).

As `application/problem+json`.

#### `403` error

Forbidden. Codes: [`role_required`](/docs/api/errors#code-role-required) (the caller is a member; carries `required`), [`no_membership`](/docs/api/errors#code-no-membership), [`account_suspended`](/docs/api/errors#code-account-suspended), [`org_suspended`](/docs/api/errors#code-org-suspended), [`org_closed`](/docs/api/errors#code-org-closed), [`wrong_instance`](/docs/api/errors#code-wrong-instance) (see `GET /v2/account/members`; `base_url` names the address that serves the key). A sandbox key: [`sandbox_read_only`](/docs/api/errors#code-sandbox-read-only) (it may write only clusters).

As `application/problem+json`.

#### `404` error

Not found. Codes: [`not_found`](/docs/api/errors#code-not-found) (no pending invitation with that id here, or `X-DTG-Org` names an organization the caller is not an active member of).

As `application/problem+json`.

#### `429` error

rate\_limited (the per-minute ceiling, X-RateLimit-\* say which), points\_exhausted (the monthly points allowance; Retry-After to the end of the UTC month), server\_busy or sandbox\_busy (load; retry after Retry-After). A refused server\_busy request is not metered.

As `application/problem+json`.

**`Retry-After` header**

Seconds to wait before retrying.

**`X-RateLimit-Limit` header**

The per-minute request ceiling that applies.

**`X-RateLimit-Remaining` header**

Requests left in the current window.

**`X-RateLimit-Reset` header**

Seconds until the window refills: on every answer, the time until the bucket is full again; on a refusal, until a request is allowed (as `Retry-After`).

Problem codes: [`unauthenticated`](/docs/api/errors#code-unauthenticated) (401), [`key_revoked`](/docs/api/errors#code-key-revoked) (401), [`account_closed`](/docs/api/errors#code-account-closed) (401), [`org_closed`](/docs/api/errors#code-org-closed) (401), [`role_required`](/docs/api/errors#code-role-required) (403), [`no_membership`](/docs/api/errors#code-no-membership) (403), [`account_suspended`](/docs/api/errors#code-account-suspended) (403), [`org_suspended`](/docs/api/errors#code-org-suspended) (403), [`org_closed`](/docs/api/errors#code-org-closed) (403), [`wrong_instance`](/docs/api/errors#code-wrong-instance) (403), [`sandbox_read_only`](/docs/api/errors#code-sandbox-read-only) (403), [`not_found`](/docs/api/errors#code-not-found) (404). Every problem is a [problem document](/docs/api/errors).

## POST `/v2/account/invites/{id}/resend`

**Resend an invitation with a fresh link and expiry**

Credentials: API key or App session. Operation id `orgResendInvite`.

Owner or admin. Issues a new token (the old link stops working) with a fresh expiry and mails it again, naming the caller as the inviter. Works on an expired invitation too. Writes an `invite.resent` audit row. No body is read.

### Parameters

**`id` path · string (uuid) required**

The invitation's id. A value that is not a UUID answers 404.

### Responses

#### `200` success

Resent.

As `application/json`.

**`id` string (uuid) always present**

The invitation's id (unchanged).

**`expires_at` string (date-time) always present**

The fresh link's expiry.

#### `401` error

Unauthorized. Codes: [`unauthenticated`](/docs/api/errors#code-unauthenticated) (no credential, or the key or session is not valid); [`key_revoked`](/docs/api/errors#code-key-revoked) (an API key that was revoked: `revoked_at`, and `reason` -- `holder`, `admin`, `member_removed`, `seat_removed`, `api_disabled`, `addon_ended`, [`account_closed`](/docs/api/errors#code-account-closed), [`org_closed`](/docs/api/errors#code-org-closed), `retired`, or null for a key revoked before T110 -- and a sentence saying when and why).

As `application/problem+json`.

#### `403` error

Forbidden. Codes: [`role_required`](/docs/api/errors#code-role-required) (the caller is a member; carries `required`), [`no_membership`](/docs/api/errors#code-no-membership), [`account_suspended`](/docs/api/errors#code-account-suspended), [`org_suspended`](/docs/api/errors#code-org-suspended), [`org_closed`](/docs/api/errors#code-org-closed), [`wrong_instance`](/docs/api/errors#code-wrong-instance) (see `GET /v2/account/members`; `base_url` names the address that serves the key). A sandbox key: [`sandbox_read_only`](/docs/api/errors#code-sandbox-read-only) (it may write only clusters).

As `application/problem+json`.

#### `404` error

Not found. Codes: [`not_found`](/docs/api/errors#code-not-found) (no pending invitation with that id here, or `X-DTG-Org` names an organization the caller is not an active member of).

As `application/problem+json`.

#### `429` error

rate\_limited (the per-minute ceiling, X-RateLimit-\* say which), points\_exhausted (the monthly points allowance; Retry-After to the end of the UTC month), server\_busy or sandbox\_busy (load; retry after Retry-After). A refused server\_busy request is not metered.

As `application/problem+json`.

**`Retry-After` header**

Seconds to wait before retrying.

**`X-RateLimit-Limit` header**

The per-minute request ceiling that applies.

**`X-RateLimit-Remaining` header**

Requests left in the current window.

**`X-RateLimit-Reset` header**

Seconds until the window refills: on every answer, the time until the bucket is full again; on a refusal, until a request is allowed (as `Retry-After`).

Problem codes: [`unauthenticated`](/docs/api/errors#code-unauthenticated) (401), [`key_revoked`](/docs/api/errors#code-key-revoked) (401), [`account_closed`](/docs/api/errors#code-account-closed) (401), [`org_closed`](/docs/api/errors#code-org-closed) (401), [`role_required`](/docs/api/errors#code-role-required) (403), [`no_membership`](/docs/api/errors#code-no-membership) (403), [`account_suspended`](/docs/api/errors#code-account-suspended) (403), [`org_suspended`](/docs/api/errors#code-org-suspended) (403), [`org_closed`](/docs/api/errors#code-org-closed) (403), [`wrong_instance`](/docs/api/errors#code-wrong-instance) (403), [`sandbox_read_only`](/docs/api/errors#code-sandbox-read-only) (403), [`not_found`](/docs/api/errors#code-not-found) (404). Every problem is a [problem document](/docs/api/errors).

## GET `/v2/invites/preview`

**What an invitation link is, before signing in (anonymous)**

Credentials: none. Operation id `orgPreviewInvite`.

Anonymous; no credential is read and no per-caller rate limit applies. Names the invited address, the role, the inviting organization and its verified domain, the inviter and the expiry, so the wrong person is told before any click. For an unexpired invitation it also says whether the address already has an account ( [`account_exists`](/docs/api/errors#code-account-exists): sign in and accept) or can sign up from the invitation (`POST /v2/invites/sign-up`). Every token that is not an open invitation (unknown, used, revoked or malformed) gets the same 404, so the preview cannot be used to probe addresses.

### Parameters

**`token` query · string required**

The invitation token from the mailed link.

### Responses

#### `200` success

The invitation.

As `application/json`.

**`email` string always present**

The address the invitation was sent to; only that address can accept it.

**`role` "member" | "admin" always present**

The role the invitee joins with.

**`expires_at` string (date-time) always present**

When the link stops working.

**`org_name` string always present**

The inviting organization's name.

**`expired` boolean always present**

True when `expires_at` has passed. An expired invitation cannot be accepted; ask for a new one.

**`lifetime_days` integer always present**

How many days an invitation lasts (14 by default).

**`inviter` object always present**

Who sent the invitation.

**`inviter.display_name` string or null always present**

The inviter's display name, else their address; null when the inviter's account has closed.

**`inviter.organization` string always present**

The inviting organization's name (the same as `org_name`).

**`org_domain` string or null always present**

The inviting organization's verified domain (its first, by verification time), as the invitation mail names it; null when it has none. A name with no verified domain beside it is unverified.

**`signup_verified` true**

Present only for an unexpired invitation. Always true; an account made through `POST /v2/invites/sign-up` with this token is verified by it.

**`account_exists` boolean**

Present only for an unexpired invitation. True when the invited address already has an account (sign in and accept); false means sign up from the invitation.

#### `400` error

Bad request. Codes: [`bad_request`](/docs/api/errors#code-bad-request) (`token` is missing or empty).

As `application/problem+json`.

#### `404` error

Not found. Codes: [`not_found`](/docs/api/errors#code-not-found) (the token is not an open invitation).

As `application/problem+json`.

Problem codes: [`bad_request`](/docs/api/errors#code-bad-request) (400), [`not_found`](/docs/api/errors#code-not-found) (404). Every problem is a [problem document](/docs/api/errors).

## POST `/v2/invites/accept`

**Accept an invitation as the signed-in invitee**

Credentials: API key or App session. Operation id `orgAcceptInvite`.

Any signed-in person, including one with no organization at all (or whose only one is suspended or closed). The invitation's address must be the caller's sign-in address, and verified. Joins the organization with the invitation's role: a seat is taken when one is free (an admin is always seated), else the person joins as a free member; a former member's membership is re-activated with `api_enabled` false. The invitation is used up. An active member of the organization is refused and the invitation is left open.

### Request body

Required; `application/json`.

**`token` string required**

The invitation token from the mailed link (`/invite?token=`).

### Responses

#### `200` success

Joined.

As `application/json`.

**`organization` object always present**

The organization, by id and name.

**`organization.id` string (uuid) always present**

The organization joined. Send it as `X-DTG-Org` to act in it.

**`organization.name` string always present**

The organization's name.

**`membership_id` string (uuid) always present**

The new (or re-activated) membership's id.

**`role` "member" | "admin" always present**

The role the invitation carried.

**`seated` boolean always present**

True when a seat was taken. An admin is always seated; a member is seated only when a seat was free, else joins as a free member.

#### `400` error

Bad request. Codes: [`bad_request`](/docs/api/errors#code-bad-request) (`token` missing or empty), [`malformed_json`](/docs/api/errors#code-malformed-json) (the body is not valid JSON).

As `application/problem+json`.

#### `401` error

Unauthorized. Codes: [`unauthenticated`](/docs/api/errors#code-unauthenticated) (no credential, or the key or session is not valid); [`key_revoked`](/docs/api/errors#code-key-revoked) (an API key that was revoked: `revoked_at`, and `reason` -- `holder`, `admin`, `member_removed`, `seat_removed`, `api_disabled`, `addon_ended`, [`account_closed`](/docs/api/errors#code-account-closed), [`org_closed`](/docs/api/errors#code-org-closed), `retired`, or null for a key revoked before T110 -- and a sentence saying when and why).

As `application/problem+json`.

#### `403` error

Forbidden. Codes: [`email_mismatch`](/docs/api/errors#code-email-mismatch) (the invitation was sent to a different address), [`email_unverified`](/docs/api/errors#code-email-unverified) (verify your address first), [`wrong_instance`](/docs/api/errors#code-wrong-instance) (a key of the mode this process does not serve; `base_url` names the address that serves it). A sandbox key: [`sandbox_read_only`](/docs/api/errors#code-sandbox-read-only) (it may write only clusters).

As `application/problem+json`.

#### `404` error

Not found. Codes: [`not_found`](/docs/api/errors#code-not-found) (the token is not an open invitation, or `X-DTG-Org` names an organization the caller is not an active member of).

As `application/problem+json`.

#### `409` error

Conflict. Codes: [`already_member`](/docs/api/errors#code-already-member) (the caller is already an active member; carries the membership as it stands).

As `application/problem+json`.

#### `410` error

Gone. Codes: [`invite_expired`](/docs/api/errors#code-invite-expired) (carries `expired_at` and `lifetime_days`; ask for a new invitation).

As `application/problem+json`.

#### `413` error

Payload too large. Codes: [`body_too_large`](/docs/api/errors#code-body-too-large) (over 4 KB; carries `limit_bytes`).

As `application/problem+json`.

#### `429` error

rate\_limited (the per-minute ceiling, X-RateLimit-\* say which), points\_exhausted (the monthly points allowance; Retry-After to the end of the UTC month), server\_busy or sandbox\_busy (load; retry after Retry-After). A refused server\_busy request is not metered.

As `application/problem+json`.

**`Retry-After` header**

Seconds to wait before retrying.

**`X-RateLimit-Limit` header**

The per-minute request ceiling that applies.

**`X-RateLimit-Remaining` header**

Requests left in the current window.

**`X-RateLimit-Reset` header**

Seconds until the window refills: on every answer, the time until the bucket is full again; on a refusal, until a request is allowed (as `Retry-After`).

Problem codes: [`bad_request`](/docs/api/errors#code-bad-request) (400), [`malformed_json`](/docs/api/errors#code-malformed-json) (400), [`unauthenticated`](/docs/api/errors#code-unauthenticated) (401), [`key_revoked`](/docs/api/errors#code-key-revoked) (401), [`account_closed`](/docs/api/errors#code-account-closed) (401), [`org_closed`](/docs/api/errors#code-org-closed) (401), [`email_mismatch`](/docs/api/errors#code-email-mismatch) (403), [`email_unverified`](/docs/api/errors#code-email-unverified) (403), [`wrong_instance`](/docs/api/errors#code-wrong-instance) (403), [`sandbox_read_only`](/docs/api/errors#code-sandbox-read-only) (403), [`not_found`](/docs/api/errors#code-not-found) (404), [`already_member`](/docs/api/errors#code-already-member) (409), [`invite_expired`](/docs/api/errors#code-invite-expired) (410), [`body_too_large`](/docs/api/errors#code-body-too-large) (413). Every problem is a [problem document](/docs/api/errors).

## POST `/v2/invites/sign-up`

**Create an account from an invitation, join and sign in, in one request (anonymous)**

Credentials: none. Operation id `orgInviteSignUp`.

Anonymous, behind the human check: send the Cloudflare Turnstile widget token in the `x-captcha-response` header. Creates the account for the invitation's address with the given name and password (the usual password rules; the person's own organization is created as for every sign-up), marks it verified (the invitation link proved the address, so no confirmation mail is sent), accepts the invitation as `POST /v2/invites/accept` does, and signs the person in: the 201 carries the session cookie in `Set-Cookie`. When the address already has an account the request is refused and the invitation stays open (sign in and accept). If the invitation is revoked in the instant between creating the account and accepting, the account stays, verified, and the answer is the accept's refusal. Rate-limited per client address.

### Parameters

**`x-captcha-response` header · string required**

The Cloudflare Turnstile token from the widget on the sign-up page.

### Request body

Required; `application/json`.

**`token` string required**

The invitation token from the mailed link.

**`name` string required**

The new account's display name (trimmed; 1 to 120 characters). (at most 120 characters)

**`password` string required**

The new account's password, 10 to 128 characters. (at most 128 characters)

**`marketing_opt_in` boolean**

The sign-up form's marketing consent box. Absent or false means no marketing mail. (default false)

### Responses

#### `201` success

Account created, invitation accepted, signed in.

As `application/json`.

**`Set-Cookie` header**

The session cookie.

**`organization` object always present**

The organization, by id and name.

**`organization.id` string (uuid) always present**

The organization joined. Send it as `X-DTG-Org` to act in it.

**`organization.name` string always present**

The organization's name.

**`membership_id` string (uuid) always present**

The new (or re-activated) membership's id.

**`role` "member" | "admin" always present**

The role the invitation carried.

**`seated` boolean always present**

True when a seat was taken. An admin is always seated; a member is seated only when a seat was free, else joins as a free member.

#### `400` error

Bad request. Codes: [`captcha_missing`](/docs/api/errors#code-captcha-missing) (no human-check token; `errors` repeats it), [`bad_request`](/docs/api/errors#code-bad-request) (`token`, `name` (1 to 120 characters), `password` or `marketing_opt_in` missing or of the wrong type), [`password_too_short`](/docs/api/errors#code-password-too-short) (carries `min_length`), [`password_too_long`](/docs/api/errors#code-password-too-long) (carries `max_length`), [`malformed_json`](/docs/api/errors#code-malformed-json) (the body is not valid JSON).

As `application/problem+json`.

#### `403` error

Forbidden. Codes: [`captcha_failed`](/docs/api/errors#code-captcha-failed) (the human check did not pass).

As `application/problem+json`.

#### `404` error

Not found. Codes: [`not_found`](/docs/api/errors#code-not-found) (the token is not an open invitation).

As `application/problem+json`.

#### `409` error

Conflict. Codes: [`account_exists`](/docs/api/errors#code-account-exists) (the address already has an account; sign in and accept the invitation).

As `application/problem+json`.

#### `410` error

Gone. Codes: [`invite_expired`](/docs/api/errors#code-invite-expired) (carries `expired_at` and `lifetime_days`).

As `application/problem+json`.

#### `413` error

Payload too large. Codes: [`body_too_large`](/docs/api/errors#code-body-too-large) (over 4 KB; carries `limit_bytes`).

As `application/problem+json`.

#### `429` error

rate\_limited (the per-minute ceiling, X-RateLimit-\* say which), points\_exhausted (the monthly points allowance; Retry-After to the end of the UTC month), server\_busy or sandbox\_busy (load; retry after Retry-After). A refused server\_busy request is not metered.

As `application/problem+json`.

**`Retry-After` header**

Seconds to wait before retrying.

**`X-RateLimit-Limit` header**

The per-minute request ceiling that applies.

**`X-RateLimit-Remaining` header**

Requests left in the current window.

**`X-RateLimit-Reset` header**

Seconds until the window refills: on every answer, the time until the bucket is full again; on a refusal, until a request is allowed (as `Retry-After`).

#### `503` error

Service unavailable. Codes: [`unavailable`](/docs/api/errors#code-unavailable) (the human-check service could not be reached; retry).

As `application/problem+json`.

Problem codes: [`captcha_missing`](/docs/api/errors#code-captcha-missing) (400), [`bad_request`](/docs/api/errors#code-bad-request) (400), [`password_too_short`](/docs/api/errors#code-password-too-short) (400), [`password_too_long`](/docs/api/errors#code-password-too-long) (400), [`malformed_json`](/docs/api/errors#code-malformed-json) (400), [`captcha_failed`](/docs/api/errors#code-captcha-failed) (403), [`not_found`](/docs/api/errors#code-not-found) (404), [`account_exists`](/docs/api/errors#code-account-exists) (409), [`invite_expired`](/docs/api/errors#code-invite-expired) (410), [`body_too_large`](/docs/api/errors#code-body-too-large) (413), [`unavailable`](/docs/api/errors#code-unavailable) (503). Every problem is a [problem document](/docs/api/errors).

## GET `/v2/account/join-requests`

**Pending requests to join the organization**

Credentials: API key or App session. Operation id `orgListJoinRequests`.

The owner or an admin (O63 S11, Q22; 403 [`role_required`](/docs/api/errors#code-role-required) for anyone else). Requests filed through `POST /v2/orgs/{id}/join` at a verified domain whose join policy is `request`, oldest first.

### Responses

#### `200` success

The pending requests.

As `application/json`.

**`data` array of OrgJoinRequest always present**

Pending requests, oldest first.

**`data[].id` string (uuid) always present**

The request's id.

**`data[].email` string always present**

The requester's sign-in address.

**`data[].display_name` string or null always present**

The requester's display name; null when none.

**`data[].status` "pending" always present**

Always `pending` here.

**`data[].created_at` string (date-time) always present**

When the request was made (or last re-made).

#### `401` error

Unauthorized. Codes: [`unauthenticated`](/docs/api/errors#code-unauthenticated) (no credential, or the key or session is not valid); [`key_revoked`](/docs/api/errors#code-key-revoked) (an API key that was revoked: `revoked_at`, and `reason` -- `holder`, `admin`, `member_removed`, `seat_removed`, `api_disabled`, `addon_ended`, [`account_closed`](/docs/api/errors#code-account-closed), [`org_closed`](/docs/api/errors#code-org-closed), `retired`, or null for a key revoked before T110 -- and a sentence saying when and why).

As `application/problem+json`.

#### `403` error

Forbidden. Codes: [`no_membership`](/docs/api/errors#code-no-membership), [`account_suspended`](/docs/api/errors#code-account-suspended), [`org_suspended`](/docs/api/errors#code-org-suspended), [`org_closed`](/docs/api/errors#code-org-closed), [`wrong_instance`](/docs/api/errors#code-wrong-instance) (see `GET /v2/account/members`; `base_url` names the address that serves the key).

As `application/problem+json`.

#### `404` error

Not found. Codes: [`not_found`](/docs/api/errors#code-not-found) (`X-DTG-Org` names an organization the caller is not an active member of).

As `application/problem+json`.

#### `429` error

rate\_limited (the per-minute ceiling, X-RateLimit-\* say which), points\_exhausted (the monthly points allowance; Retry-After to the end of the UTC month), server\_busy or sandbox\_busy (load; retry after Retry-After). A refused server\_busy request is not metered.

As `application/problem+json`.

**`Retry-After` header**

Seconds to wait before retrying.

**`X-RateLimit-Limit` header**

The per-minute request ceiling that applies.

**`X-RateLimit-Remaining` header**

Requests left in the current window.

**`X-RateLimit-Reset` header**

Seconds until the window refills: on every answer, the time until the bucket is full again; on a refusal, until a request is allowed (as `Retry-After`).

Problem codes: [`unauthenticated`](/docs/api/errors#code-unauthenticated) (401), [`key_revoked`](/docs/api/errors#code-key-revoked) (401), [`account_closed`](/docs/api/errors#code-account-closed) (401), [`org_closed`](/docs/api/errors#code-org-closed) (401), [`no_membership`](/docs/api/errors#code-no-membership) (403), [`account_suspended`](/docs/api/errors#code-account-suspended) (403), [`org_suspended`](/docs/api/errors#code-org-suspended) (403), [`org_closed`](/docs/api/errors#code-org-closed) (403), [`wrong_instance`](/docs/api/errors#code-wrong-instance) (403), [`not_found`](/docs/api/errors#code-not-found) (404). Every problem is a [problem document](/docs/api/errors).

## POST `/v2/account/join-requests/{id}/approve`

**Approve a join request**

Credentials: API key or App session. Operation id `orgApproveJoinRequest`.

Owner or admin. The requester joins with the `default_role` of the organization's verified claim on their email domain (`member` if the claim is no longer verified). A seat is taken when one is free (an admin is always seated), else they join as a free member. The requester is mailed and told in the app. No body is read.

### Parameters

**`id` path · string (uuid) required**

The join request's id. A value that is not a UUID answers 404.

### Responses

#### `200` success

Approved; the membership was created or re-activated.

As `application/json`.

**`id` string (uuid) always present**

The request's id.

**`status` "approved" | "denied" always present**

The decision.

**`membership_id` string (uuid)**

Approve only: the new (or re-activated) membership's id.

**`seated` boolean**

Approve only: true when a seat was taken (always for an admin; for a member only when one was free).

**`rejoined` boolean**

Approve only: true when a former membership was re-activated rather than created.

#### `401` error

Unauthorized. Codes: [`unauthenticated`](/docs/api/errors#code-unauthenticated) (no credential, or the key or session is not valid); [`key_revoked`](/docs/api/errors#code-key-revoked) (an API key that was revoked: `revoked_at`, and `reason` -- `holder`, `admin`, `member_removed`, `seat_removed`, `api_disabled`, `addon_ended`, [`account_closed`](/docs/api/errors#code-account-closed), [`org_closed`](/docs/api/errors#code-org-closed), `retired`, or null for a key revoked before T110 -- and a sentence saying when and why).

As `application/problem+json`.

#### `403` error

Forbidden. Codes: [`role_required`](/docs/api/errors#code-role-required) (the caller is a member; carries `required`), [`no_membership`](/docs/api/errors#code-no-membership), [`account_suspended`](/docs/api/errors#code-account-suspended), [`org_suspended`](/docs/api/errors#code-org-suspended), [`org_closed`](/docs/api/errors#code-org-closed), [`wrong_instance`](/docs/api/errors#code-wrong-instance) (see `GET /v2/account/members`; `base_url` names the address that serves the key). A sandbox key: [`sandbox_read_only`](/docs/api/errors#code-sandbox-read-only) (it may write only clusters).

As `application/problem+json`.

#### `404` error

Not found. Codes: [`not_found`](/docs/api/errors#code-not-found) (no pending request with that id here, or `X-DTG-Org` names an organization the caller is not an active member of).

As `application/problem+json`.

#### `429` error

rate\_limited (the per-minute ceiling, X-RateLimit-\* say which), points\_exhausted (the monthly points allowance; Retry-After to the end of the UTC month), server\_busy or sandbox\_busy (load; retry after Retry-After). A refused server\_busy request is not metered.

As `application/problem+json`.

**`Retry-After` header**

Seconds to wait before retrying.

**`X-RateLimit-Limit` header**

The per-minute request ceiling that applies.

**`X-RateLimit-Remaining` header**

Requests left in the current window.

**`X-RateLimit-Reset` header**

Seconds until the window refills: on every answer, the time until the bucket is full again; on a refusal, until a request is allowed (as `Retry-After`).

Problem codes: [`unauthenticated`](/docs/api/errors#code-unauthenticated) (401), [`key_revoked`](/docs/api/errors#code-key-revoked) (401), [`account_closed`](/docs/api/errors#code-account-closed) (401), [`org_closed`](/docs/api/errors#code-org-closed) (401), [`role_required`](/docs/api/errors#code-role-required) (403), [`no_membership`](/docs/api/errors#code-no-membership) (403), [`account_suspended`](/docs/api/errors#code-account-suspended) (403), [`org_suspended`](/docs/api/errors#code-org-suspended) (403), [`org_closed`](/docs/api/errors#code-org-closed) (403), [`wrong_instance`](/docs/api/errors#code-wrong-instance) (403), [`sandbox_read_only`](/docs/api/errors#code-sandbox-read-only) (403), [`not_found`](/docs/api/errors#code-not-found) (404). Every problem is a [problem document](/docs/api/errors).

## POST `/v2/account/join-requests/{id}/deny`

**Deny a join request**

Credentials: API key or App session. Operation id `orgDenyJoinRequest`.

Owner or admin. The requester is mailed (they have no membership here, so no in-app notice). They may ask again later. No body is read.

### Parameters

**`id` path · string (uuid) required**

The join request's id. A value that is not a UUID answers 404.

### Responses

#### `200` success

Denied.

As `application/json`.

**`id` string (uuid) always present**

The request's id.

**`status` "approved" | "denied" always present**

The decision.

**`membership_id` string (uuid)**

Approve only: the new (or re-activated) membership's id.

**`seated` boolean**

Approve only: true when a seat was taken (always for an admin; for a member only when one was free).

**`rejoined` boolean**

Approve only: true when a former membership was re-activated rather than created.

#### `401` error

Unauthorized. Codes: [`unauthenticated`](/docs/api/errors#code-unauthenticated) (no credential, or the key or session is not valid); [`key_revoked`](/docs/api/errors#code-key-revoked) (an API key that was revoked: `revoked_at`, and `reason` -- `holder`, `admin`, `member_removed`, `seat_removed`, `api_disabled`, `addon_ended`, [`account_closed`](/docs/api/errors#code-account-closed), [`org_closed`](/docs/api/errors#code-org-closed), `retired`, or null for a key revoked before T110 -- and a sentence saying when and why).

As `application/problem+json`.

#### `403` error

Forbidden. Codes: [`role_required`](/docs/api/errors#code-role-required) (the caller is a member; carries `required`), [`no_membership`](/docs/api/errors#code-no-membership), [`account_suspended`](/docs/api/errors#code-account-suspended), [`org_suspended`](/docs/api/errors#code-org-suspended), [`org_closed`](/docs/api/errors#code-org-closed), [`wrong_instance`](/docs/api/errors#code-wrong-instance) (see `GET /v2/account/members`; `base_url` names the address that serves the key). A sandbox key: [`sandbox_read_only`](/docs/api/errors#code-sandbox-read-only) (it may write only clusters).

As `application/problem+json`.

#### `404` error

Not found. Codes: [`not_found`](/docs/api/errors#code-not-found) (no pending request with that id here, or `X-DTG-Org` names an organization the caller is not an active member of).

As `application/problem+json`.

#### `429` error

rate\_limited (the per-minute ceiling, X-RateLimit-\* say which), points\_exhausted (the monthly points allowance; Retry-After to the end of the UTC month), server\_busy or sandbox\_busy (load; retry after Retry-After). A refused server\_busy request is not metered.

As `application/problem+json`.

**`Retry-After` header**

Seconds to wait before retrying.

**`X-RateLimit-Limit` header**

The per-minute request ceiling that applies.

**`X-RateLimit-Remaining` header**

Requests left in the current window.

**`X-RateLimit-Reset` header**

Seconds until the window refills: on every answer, the time until the bucket is full again; on a refusal, until a request is allowed (as `Retry-After`).

Problem codes: [`unauthenticated`](/docs/api/errors#code-unauthenticated) (401), [`key_revoked`](/docs/api/errors#code-key-revoked) (401), [`account_closed`](/docs/api/errors#code-account-closed) (401), [`org_closed`](/docs/api/errors#code-org-closed) (401), [`role_required`](/docs/api/errors#code-role-required) (403), [`no_membership`](/docs/api/errors#code-no-membership) (403), [`account_suspended`](/docs/api/errors#code-account-suspended) (403), [`org_suspended`](/docs/api/errors#code-org-suspended) (403), [`org_closed`](/docs/api/errors#code-org-closed) (403), [`wrong_instance`](/docs/api/errors#code-wrong-instance) (403), [`sandbox_read_only`](/docs/api/errors#code-sandbox-read-only) (403), [`not_found`](/docs/api/errors#code-not-found) (404). Every problem is a [problem document](/docs/api/errors).

Generated from `taigan/openapi.yaml` at catahoula `77925fab712f`(API document version 2.0).
