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.

seatsOrgSeatStatealways 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.includedintegeralways 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.grandfatheredinteger 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.purchasedintegeralways present
Extra seats the organization has bought (POST /v2/account/seats).
seats.capacityintegeralways present
included + purchased: how many members may be seated.
seats.seatedintegeralways present
Active members holding a seat now (owners and admins included). Can exceed capacity, because owners and admins are always seated.
seats.freeintegeralways present
Active members without a seat (free members).
seats.availableintegeralways present
Seats free to give, max(0, capacity - seated). Seating a member needs this above 0.
seats.seat_price_usd_monthstring or nullalways 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_usdnumber or nullalways 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).
dataarray of OrgMemberalways present
Seated members, owners first, then admins, then by join date.
data[].idstring (uuid)always present
The membership id (the {id} of /v2/account/members/{id}). Not the account id.
data[].emailstring (email)always present
The member's sign-in address.
data[].display_namestring or nullalways 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_contactbooleanalways present
True when the member may see and manage billing (invoices, payment method) although not an owner.
data[].seatedbooleanalways 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_enabledbooleanalways 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_atstring (date-time) or nullalways 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_atstring (date-time)always present
When the membership began (or began again, for a returning member).
data[].active_keysintegeralways present
The member's unrevoked API keys in this organization, live and sandbox together.
free_membersarray of OrgMemberalways present
Members without a seat, by join date.
free_members[].idstring (uuid)always present
The membership id (the {id} of /v2/account/members/{id}). Not the account id.
free_members[].emailstring (email)always present
The member's sign-in address.
free_members[].display_namestring or nullalways 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_contactbooleanalways present
True when the member may see and manage billing (invoices, payment method) although not an owner.
free_members[].seatedbooleanalways 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_enabledbooleanalways 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_atstring (date-time) or nullalways 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_atstring (date-time)always present
When the membership began (or began again, for a returning member).
free_members[].active_keysintegeralways present
The member's unrevoked API keys in this organization, live and sandbox together.
reassignment_pendingbooleanalways 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 (no credential, or the key or session is not valid); key_revoked (an API key that was revoked: revoked_at, and reason -- holder, admin, member_removed, seat_removed, api_disabled, addon_ended, account_closed, 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 (the account has no active organization membership), account_suspended, org_suspended (DTG suspended the organization; carries organization and possibly reason), org_closed (the organization is closed; carries organization), 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 (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 (401), key_revoked (401), account_closed (401), org_closed (401), no_membership (403), account_suspended (403), org_suspended (403), org_closed (403), wrong_instance (403), not_found (404). Every problem is a problem document.

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.

emailstring
One address to invite. Trimmed and lower-cased.
emailsarray 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.

dataarray of OrgInviteResultalways present
One result per distinct address, in request order.
data[].emailstringalways 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: the address already belongs to an active member, nothing sent.
data[].invite_idstring (uuid)
The new invitation's id. Present only when status is invited.
data[].expires_atstring (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 (neither email nor emails gave an address, or more than 200 addresses), malformed_json (the body is not valid JSON).

As application/problem+json.

401 error

Unauthorized. Codes: unauthenticated (no credential, or the key or session is not valid); key_revoked (an API key that was revoked: revoked_at, and reason -- holder, admin, member_removed, seat_removed, api_disabled, addon_ended, account_closed, 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 (the caller is a member, or an admin inviting with role: admin; carries required), no_membership, account_suspended, org_suspended, org_closed, wrong_instance (see GET /v2/account/members; base_url names the address that serves the key). A sandbox key: sandbox_read_only (it may write only clusters).

As application/problem+json.

404 error

Not found. Codes: 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 (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 (400), malformed_json (400), unauthenticated (401), key_revoked (401), account_closed (401), org_closed (401), role_required (403), no_membership (403), account_suspended (403), org_suspended (403), org_closed (403), wrong_instance (403), sandbox_read_only (403), not_found (404), body_too_large (413). Every problem is a problem document.

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 (no credential, or the key or session is not valid); key_revoked (an API key that was revoked: revoked_at, and reason -- holder, admin, member_removed, seat_removed, api_disabled, addon_ended, account_closed, 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, account_suspended, org_suspended, org_closed, wrong_instance (see GET /v2/account/members; base_url names the address that serves the key). A sandbox key: sandbox_read_only (it may write only clusters).

As application/problem+json.

404 error

Not found. Codes: 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 (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 (401), key_revoked (401), account_closed (401), org_closed (401), no_membership (403), account_suspended (403), org_suspended (403), org_closed (403), wrong_instance (403), sandbox_read_only (403), not_found (404), last_owner (409). Every problem is a problem document.

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

idpath · 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.
seatedboolean
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_enabledboolean
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_contactboolean
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.

idstring (uuid)always present
The membership id.
org_idstring (uuid)always present
The organization's id.
account_idstring (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_contactbooleanalways present
True when the member may manage billing.
seatedbooleanalways present
True when the member holds a seat.
api_enabledbooleanalways present
True when the member may hold live API keys.
status"active"always present
Always active (a removed membership cannot be changed).
last_active_atstring (date-time) or nullalways present
The member's most recent successful data request; null when none.
joined_atstring (date-time)always present
When the membership began.
removed_atstring (date-time) or nullalways present
Always null on an active membership (set when a membership is removed).
emailstring (email)always present
The member's sign-in address.

400 error

Bad request. Codes: 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 (the body is not valid JSON).

As application/problem+json.

401 error

Unauthorized. Codes: unauthenticated (no credential, or the key or session is not valid); key_revoked (an API key that was revoked: revoked_at, and reason -- holder, admin, member_removed, seat_removed, api_disabled, addon_ended, account_closed, 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 (the caller is a member, or an admin sent role; carries required when raised by the role check), owner_row_protected (an admin changing an owner's membership), plan_required (api_enabled: true without the API add-on; carries entitlement: api_access), no_membership, account_suspended, org_suspended, org_closed, wrong_instance (see GET /v2/account/members; base_url names the address that serves the key). A sandbox key: sandbox_read_only (it may write only clusters).

As application/problem+json.

404 error

Not found. Codes: 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 (seating needs a free seat; carries seats; buy one with POST /v2/account/seats), last_owner (demoting the only owner; transfer ownership first).

As application/problem+json.

413 error

Payload too large. Codes: 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 (400), malformed_json (400), unauthenticated (401), key_revoked (401), account_closed (401), org_closed (401), role_required (403), owner_row_protected (403), plan_required (403), no_membership (403), account_suspended (403), org_suspended (403), org_closed (403), wrong_instance (403), sandbox_read_only (403), not_found (404), no_seat_available (409), last_owner (409), body_too_large (413). Every problem is a problem document.

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

idpath · 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 (no credential, or the key or session is not valid); key_revoked (an API key that was revoked: revoked_at, and reason -- holder, admin, member_removed, seat_removed, api_disabled, addon_ended, account_closed, 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 (the caller is a member, or an admin removing an owner), no_membership, account_suspended, org_suspended, org_closed, wrong_instance (see GET /v2/account/members; base_url names the address that serves the key). A sandbox key: sandbox_read_only (it may write only clusters).

As application/problem+json.

404 error

Not found. Codes: 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 (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 (401), key_revoked (401), account_closed (401), org_closed (401), role_required (403), no_membership (403), account_suspended (403), org_suspended (403), org_closed (403), wrong_instance (403), sandbox_read_only (403), not_found (404), last_owner (409). Every problem is a problem document.

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

idpath · 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_idstring (uuid)always present
The membership that is now an owner (the {id} of the request).
previous_owner_membership_idstring (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 ({id} is the caller's own membership).

As application/problem+json.

401 error

Unauthorized. Codes: unauthenticated (no credential, or the key or session is not valid); key_revoked (an API key that was revoked: revoked_at, and reason -- holder, admin, member_removed, seat_removed, api_disabled, addon_ended, account_closed, 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 (the caller is not an owner; carries required), no_membership, account_suspended, org_suspended, org_closed, wrong_instance (see GET /v2/account/members; base_url names the address that serves the key). A sandbox key: sandbox_read_only (it may write only clusters).

As application/problem+json.

404 error

Not found. Codes: 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 (400), unauthenticated (401), key_revoked (401), account_closed (401), org_closed (401), role_required (403), no_membership (403), account_suspended (403), org_suspended (403), org_closed (403), wrong_instance (403), sandbox_read_only (403), not_found (404). Every problem is a problem document.

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_daysintegeralways present
The notice window in days (ORG_LICENSING section 7.3; 7 by default, also served as rules.ownership_claim_notice_days).
claimOrgOwnershipClaim or nullalways present
The open claim, else the most recently cancelled one within one notice window, else null.
claim.idstring (uuid)
The claim's id.
claim.status"pending" | "cancelled"
pending: open and counting down. cancelled: ended without completing (see cancel_reason).
claim.opened_atstring (date-time)
When the claim was made and the owners were mailed.
claim.completes_atstring (date-time)
When a pending claim completes (opened_at plus notice_days).
claim.cancelled_atstring (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_atstring (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.claimantOrgClaimant
The admin making the claim, as the claim remembers them (their address and display name when it was made).
claim.claimant.membership_idstring (uuid)always present
The claimant's membership id.
claim.claimant.emailstring or nullalways 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_namestring or nullalways 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 (no credential, or the key or session is not valid); key_revoked (an API key that was revoked: revoked_at, and reason -- holder, admin, member_removed, seat_removed, api_disabled, addon_ended, account_closed, 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 (the caller is a member; carries required), no_membership, account_suspended, org_suspended, org_closed, 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 (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 (401), key_revoked (401), account_closed (401), org_closed (401), role_required (403), no_membership (403), account_suspended (403), org_suspended (403), org_closed (403), wrong_instance (403), not_found (404). Every problem is a problem document.

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.

idstring (uuid)always present
The claim's id.
completes_atstring (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.

idstring (uuid)always present
The claim's id.
completes_atstring (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 (no credential, or the key or session is not valid); key_revoked (an API key that was revoked: revoked_at, and reason -- holder, admin, member_removed, seat_removed, api_disabled, addon_ended, account_closed, 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 (the caller is not an admin), domain_verification_required (the caller's address is unverified or not at a domain this organization has verified), no_membership, account_suspended, org_suspended, org_closed, wrong_instance (see GET /v2/account/members; base_url names the address that serves the key). A sandbox key: sandbox_read_only (it may write only clusters).

As application/problem+json.

404 error

Not found. Codes: 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 (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 (401), key_revoked (401), account_closed (401), org_closed (401), role_required (403), domain_verification_required (403), no_membership (403), account_suspended (403), org_suspended (403), org_closed (403), wrong_instance (403), sandbox_read_only (403), not_found (404), owner_active (409). Every problem is a problem document.

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 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.

dataarray of OrgPendingInvitealways present
Pending invitations, newest first.
data[].idstring (uuid)always present
The invitation's id.
data[].emailstringalways present
The invited address.
data[].role"member" | "admin"always present
The role the invitee joins with.
data[].expires_atstring (date-time)always present
When the link stops working.
data[].created_atstring (date-time)always present
When the invitation was first made (a resend does not change it).
data[].invited_bystringalways present
The sign-in address of the person who invited.
data[].expiredbooleanalways present
True when expires_at has passed; resend to issue a fresh link.

401 error

Unauthorized. Codes: unauthenticated (no credential, or the key or session is not valid); key_revoked (an API key that was revoked: revoked_at, and reason -- holder, admin, member_removed, seat_removed, api_disabled, addon_ended, account_closed, 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, account_suspended, org_suspended, org_closed, 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 (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 (401), key_revoked (401), account_closed (401), org_closed (401), no_membership (403), account_suspended (403), org_suspended (403), org_closed (403), wrong_instance (403), not_found (404). Every problem is a problem document.

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

idpath · 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 (no credential, or the key or session is not valid); key_revoked (an API key that was revoked: revoked_at, and reason -- holder, admin, member_removed, seat_removed, api_disabled, addon_ended, account_closed, 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 (the caller is a member; carries required), no_membership, account_suspended, org_suspended, org_closed, wrong_instance (see GET /v2/account/members; base_url names the address that serves the key). A sandbox key: sandbox_read_only (it may write only clusters).

As application/problem+json.

404 error

Not found. Codes: 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 (401), key_revoked (401), account_closed (401), org_closed (401), role_required (403), no_membership (403), account_suspended (403), org_suspended (403), org_closed (403), wrong_instance (403), sandbox_read_only (403), not_found (404). Every problem is a problem document.

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

idpath · string (uuid)required
The invitation's id. A value that is not a UUID answers 404.

Responses

200 success

Resent.

As application/json.

idstring (uuid)always present
The invitation's id (unchanged).
expires_atstring (date-time)always present
The fresh link's expiry.

401 error

Unauthorized. Codes: unauthenticated (no credential, or the key or session is not valid); key_revoked (an API key that was revoked: revoked_at, and reason -- holder, admin, member_removed, seat_removed, api_disabled, addon_ended, account_closed, 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 (the caller is a member; carries required), no_membership, account_suspended, org_suspended, org_closed, wrong_instance (see GET /v2/account/members; base_url names the address that serves the key). A sandbox key: sandbox_read_only (it may write only clusters).

As application/problem+json.

404 error

Not found. Codes: 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 (401), key_revoked (401), account_closed (401), org_closed (401), role_required (403), no_membership (403), account_suspended (403), org_suspended (403), org_closed (403), wrong_instance (403), sandbox_read_only (403), not_found (404). Every problem is a problem document.

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: 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

tokenquery · stringrequired
The invitation token from the mailed link.

Responses

200 success

The invitation.

As application/json.

emailstringalways 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_atstring (date-time)always present
When the link stops working.
org_namestringalways present
The inviting organization's name.
expiredbooleanalways present
True when expires_at has passed. An expired invitation cannot be accepted; ask for a new one.
lifetime_daysintegeralways present
How many days an invitation lasts (14 by default).
inviterobjectalways present
Who sent the invitation.
inviter.display_namestring or nullalways present
The inviter's display name, else their address; null when the inviter's account has closed.
inviter.organizationstringalways present
The inviting organization's name (the same as org_name).
org_domainstring or nullalways 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_verifiedtrue
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_existsboolean
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 (token is missing or empty).

As application/problem+json.

404 error

Not found. Codes: not_found (the token is not an open invitation).

As application/problem+json.

Problem codes: bad_request (400), not_found (404). Every problem is a problem document.

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.

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

Responses

200 success

Joined.

As application/json.

organizationobjectalways present
The organization, by id and name.
organization.idstring (uuid)always present
The organization joined. Send it as X-DTG-Org to act in it.
organization.namestringalways present
The organization's name.
membership_idstring (uuid)always present
The new (or re-activated) membership's id.
role"member" | "admin"always present
The role the invitation carried.
seatedbooleanalways 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 (token missing or empty), malformed_json (the body is not valid JSON).

As application/problem+json.

401 error

Unauthorized. Codes: unauthenticated (no credential, or the key or session is not valid); key_revoked (an API key that was revoked: revoked_at, and reason -- holder, admin, member_removed, seat_removed, api_disabled, addon_ended, account_closed, 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 (the invitation was sent to a different address), email_unverified (verify your address first), 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 (it may write only clusters).

As application/problem+json.

404 error

Not found. Codes: 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 (the caller is already an active member; carries the membership as it stands).

As application/problem+json.

410 error

Gone. Codes: 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 (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 (400), malformed_json (400), unauthenticated (401), key_revoked (401), account_closed (401), org_closed (401), email_mismatch (403), email_unverified (403), wrong_instance (403), sandbox_read_only (403), not_found (404), already_member (409), invite_expired (410), body_too_large (413). Every problem is a problem document.

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-responseheader · stringrequired
The Cloudflare Turnstile token from the widget on the sign-up page.

Request body

Required; application/json.

tokenstringrequired
The invitation token from the mailed link.
namestringrequired
The new account's display name (trimmed; 1 to 120 characters). (at most 120 characters)
passwordstringrequired
The new account's password, 10 to 128 characters. (at most 128 characters)
marketing_opt_inboolean
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.
organizationobjectalways present
The organization, by id and name.
organization.idstring (uuid)always present
The organization joined. Send it as X-DTG-Org to act in it.
organization.namestringalways present
The organization's name.
membership_idstring (uuid)always present
The new (or re-activated) membership's id.
role"member" | "admin"always present
The role the invitation carried.
seatedbooleanalways 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 (no human-check token; errors repeats it), bad_request (token, name (1 to 120 characters), password or marketing_opt_in missing or of the wrong type), password_too_short (carries min_length), password_too_long (carries max_length), malformed_json (the body is not valid JSON).

As application/problem+json.

403 error

Forbidden. Codes: captcha_failed (the human check did not pass).

As application/problem+json.

404 error

Not found. Codes: not_found (the token is not an open invitation).

As application/problem+json.

409 error

Conflict. Codes: account_exists (the address already has an account; sign in and accept the invitation).

As application/problem+json.

410 error

Gone. Codes: invite_expired (carries expired_at and lifetime_days).

As application/problem+json.

413 error

Payload too large. Codes: 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 (the human-check service could not be reached; retry).

As application/problem+json.

Problem codes: captcha_missing (400), bad_request (400), password_too_short (400), password_too_long (400), malformed_json (400), captcha_failed (403), not_found (404), account_exists (409), invite_expired (410), body_too_large (413), unavailable (503). Every problem is a problem document.

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 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.

dataarray of OrgJoinRequestalways present
Pending requests, oldest first.
data[].idstring (uuid)always present
The request's id.
data[].emailstringalways present
The requester's sign-in address.
data[].display_namestring or nullalways present
The requester's display name; null when none.
data[].status"pending"always present
Always pending here.
data[].created_atstring (date-time)always present
When the request was made (or last re-made).

401 error

Unauthorized. Codes: unauthenticated (no credential, or the key or session is not valid); key_revoked (an API key that was revoked: revoked_at, and reason -- holder, admin, member_removed, seat_removed, api_disabled, addon_ended, account_closed, 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, account_suspended, org_suspended, org_closed, 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 (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 (401), key_revoked (401), account_closed (401), org_closed (401), no_membership (403), account_suspended (403), org_suspended (403), org_closed (403), wrong_instance (403), not_found (404). Every problem is a problem document.

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

idpath · 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.

idstring (uuid)always present
The request's id.
status"approved" | "denied"always present
The decision.
membership_idstring (uuid)
Approve only: the new (or re-activated) membership's id.
seatedboolean
Approve only: true when a seat was taken (always for an admin; for a member only when one was free).
rejoinedboolean
Approve only: true when a former membership was re-activated rather than created.

401 error

Unauthorized. Codes: unauthenticated (no credential, or the key or session is not valid); key_revoked (an API key that was revoked: revoked_at, and reason -- holder, admin, member_removed, seat_removed, api_disabled, addon_ended, account_closed, 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 (the caller is a member; carries required), no_membership, account_suspended, org_suspended, org_closed, wrong_instance (see GET /v2/account/members; base_url names the address that serves the key). A sandbox key: sandbox_read_only (it may write only clusters).

As application/problem+json.

404 error

Not found. Codes: 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 (401), key_revoked (401), account_closed (401), org_closed (401), role_required (403), no_membership (403), account_suspended (403), org_suspended (403), org_closed (403), wrong_instance (403), sandbox_read_only (403), not_found (404). Every problem is a problem document.

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

idpath · string (uuid)required
The join request's id. A value that is not a UUID answers 404.

Responses

200 success

Denied.

As application/json.

idstring (uuid)always present
The request's id.
status"approved" | "denied"always present
The decision.
membership_idstring (uuid)
Approve only: the new (or re-activated) membership's id.
seatedboolean
Approve only: true when a seat was taken (always for an admin; for a member only when one was free).
rejoinedboolean
Approve only: true when a former membership was re-activated rather than created.

401 error

Unauthorized. Codes: unauthenticated (no credential, or the key or session is not valid); key_revoked (an API key that was revoked: revoked_at, and reason -- holder, admin, member_removed, seat_removed, api_disabled, addon_ended, account_closed, 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 (the caller is a member; carries required), no_membership, account_suspended, org_suspended, org_closed, wrong_instance (see GET /v2/account/members; base_url names the address that serves the key). A sandbox key: sandbox_read_only (it may write only clusters).

As application/problem+json.

404 error

Not found. Codes: 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 (401), key_revoked (401), account_closed (401), org_closed (401), role_required (403), no_membership (403), account_suspended (403), org_suspended (403), org_closed (403), wrong_instance (403), sandbox_read_only (403), not_found (404). Every problem is a problem document.

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