Organization
16 endpoints, generated from the API's own OpenAPI document. Organizations a person can find or join, verified domains and join requests.
PATCH /v2/account/organization
Rename the active organization
Credentials: API key or App session. Operation id acctRenameOrganization.
Either credential (an API key or a session); resolves the caller's active organization (X-DTG-Org). Owner or admin. T18: a name must be unique among the organizations that have verified the same domain (compared trimmed, whitespace-collapsed and case-folded); names are not globally unique.
Parameters
X-DTG-Orgheader · string (uuid)- The organization this request acts in (a uuid). Omitted: the caller's own organization, else their earliest active membership. An API key is bound to its organization and may only name that one.
Request body
Required; application/json.
namestringrequired- A non-blank string of at most 120 characters, stored trimmed. Must be unique among the organizations that have verified the same domain. (at most 120 characters)
Responses
200 success
The organization's id and new name.
As application/json.
idstring (uuid)always present- The organization's id.
namestringalways present- The name as stored (trimmed).
400 error
Bad Request. Codes: bad_request (name is not a non-blank string of at most 120 characters), malformed_json (the body is not valid JSON, or uses an unsupported content encoding).
As application/problem+json.
401 error
Unauthorized. Codes: key_revoked (the API key was revoked; revoked_at, reason, and a sentence saying when and why); unauthenticated (no API key or session; the key is unknown, or its account, membership or organization is no longer active; the session has expired, passed its 30-day maximum age, or belongs to an unverified email address).
As application/problem+json.
403 error
Forbidden. Codes: no_membership (the account has no active membership in an active organization), account_suspended (O56: the signed-in person's own account is suspended by DTG; reason where recorded), org_suspended (the selected organization is suspended by DTG; the body carries organization {id, name} and reason), org_closed (the selected organization is closed; the body carries organization {id, name}), wrong_instance (a key of the mode this process does not serve: a sandbox key on the live API, or a live key on the sandbox; the body carries expected and base_url, the address that serves it), role_required (the caller's role is not one of those named; the body carries required). A sandbox key: sandbox_read_only (it may write only clusters).
As application/problem+json.
404 error
Not Found. Codes: not_found (the X-DTG-Org header is not a uuid, names an organization the caller is not an active member of, or, on an API key, names an organization other than the key's own).
As application/problem+json.
409 error
Conflict. Codes: org_name_taken (another organization at one of this organization's verified domains already carries the name; the body carries name, domain and auto_named).
As application/problem+json.
413 error
Payload Too Large. Codes: body_too_large (the body is over this endpoint's 16 KB limit; the body carries limit_bytes).
As application/problem+json.
429 error
Only the per-minute rate limit: rate_limited (120 requests a minute per credential, 300 per organization; lower ceilings for a sandbox key), with Retry-After and X-RateLimit-*.
As application/problem+json.
Retry-Afterheader- Seconds to wait before retrying.
X-RateLimit-Limitheader- The per-minute request ceiling that applies.
X-RateLimit-Remainingheader- Requests left in the current window.
X-RateLimit-Resetheader- 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), key_revoked (401), unauthenticated (401), no_membership (403), account_suspended (403), org_suspended (403), org_closed (403), wrong_instance (403), role_required (403), sandbox_read_only (403), not_found (404), org_name_taken (409), body_too_large (413), rate_limited (429). Every problem is a problem document.
GET /v2/account/organization/close
The terms of closing the active organization
Credentials: API key or App session. Operation id acctPreviewOrganizationClose.
Either credential (an API key or a session); resolves the caller's active organization (X-DTG-Org). Owner only. D57: states what a close does (members removed, the subscription cancelled with NO refund, all data kept) before the click. No side effects.
Parameters
X-DTG-Orgheader · string (uuid)- The organization this request acts in (a uuid). Omitted: the caller's own organization, else their earliest active membership. An API key is bound to its organization and may only name that one.
Responses
200 success
The terms.
As application/json.
orgobjectalways present- The organization.
org.idstring (uuid)always present- Its id.
org.namestringalways present- Its name.
org.status"active" | "suspended" | "closed"always present- Its status (always
activefor a caller here). members_to_removeintegeralways present- Active memberships the close ends (the owner's included).
subscriptionobjectalways present- The subscription.
subscription.activebooleanalways present- True when there is a subscription that the close cancels at once.
subscription.planstring or nullalways present- Its plan code; null when there is no live subscription.
refund"none"always present- Always
none: closing cancels with no refund. data_retention"kept"always present- Always
kept: nothing is deleted; the former owner can reopen it (POST /v2/reopen/{id}).
401 error
Unauthorized. Codes: key_revoked (the API key was revoked; revoked_at, reason, and a sentence saying when and why); unauthenticated (no API key or session; the key is unknown, or its account, membership or organization is no longer active; the session has expired, passed its 30-day maximum age, or belongs to an unverified email address).
As application/problem+json.
403 error
Forbidden. Codes: no_membership (the account has no active membership in an active organization), account_suspended (O56: the signed-in person's own account is suspended by DTG; reason where recorded), org_suspended (the selected organization is suspended by DTG; the body carries organization {id, name} and reason), org_closed (the selected organization is closed; the body carries organization {id, name}), wrong_instance (a key of the mode this process does not serve: a sandbox key on the live API, or a live key on the sandbox; the body carries expected and base_url, the address that serves it), role_required (the caller's role is not one of those named; the body carries required).
As application/problem+json.
404 error
Not Found. Codes: not_found (the X-DTG-Org header is not a uuid, names an organization the caller is not an active member of, or, on an API key, names an organization other than the key's own).
As application/problem+json.
429 error
Only the per-minute rate limit: rate_limited (120 requests a minute per credential, 300 per organization; lower ceilings for a sandbox key), with Retry-After and X-RateLimit-*.
As application/problem+json.
Retry-Afterheader- Seconds to wait before retrying.
X-RateLimit-Limitheader- The per-minute request ceiling that applies.
X-RateLimit-Remainingheader- Requests left in the current window.
X-RateLimit-Resetheader- 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: key_revoked (401), unauthenticated (401), no_membership (403), account_suspended (403), org_suspended (403), org_closed (403), wrong_instance (403), role_required (403), not_found (404), rate_limited (429). Every problem is a problem document.
POST /v2/account/organization/close
Close the active organization
Credentials: API key or App session. Operation id acctCloseOrganization.
Either credential (an API key or a session); resolves the caller's active organization (X-DTG-Org). Owner only. Takes no body. D57: the subscription is cancelled at once with no refund (D50; if the payment gateway refuses, nothing is closed); every membership ends (seats freed, keys revoked) but no session ends (T27: a person's other organizations keep working); status becomes closed; any remembered last_org_id pointing at it is cleared; an org.closed audit row is written. All data is kept and the former owner can reopen it (POST /v2/reopen/{id}).
Parameters
X-DTG-Orgheader · string (uuid)- The organization this request acts in (a uuid). Omitted: the caller's own organization, else their earliest active membership. An API key is bound to its organization and may only name that one.
Responses
200 success
What the close did.
As application/json.
org_idstring (uuid)always present- The closed organization's id.
memberships_removedintegeralways present- Memberships ended (seats freed, keys revoked).
subscription_cancelledbooleanalways present- True when a live subscription was cancelled (no refund).
400 error
Bad Request. Codes: malformed_json (the body is not valid JSON, or uses an unsupported content encoding).
As application/problem+json.
401 error
Unauthorized. Codes: key_revoked (the API key was revoked; revoked_at, reason, and a sentence saying when and why); unauthenticated (no API key or session; the key is unknown, or its account, membership or organization is no longer active; the session has expired, passed its 30-day maximum age, or belongs to an unverified email address).
As application/problem+json.
403 error
Forbidden. Codes: no_membership (the account has no active membership in an active organization), account_suspended (O56: the signed-in person's own account is suspended by DTG; reason where recorded), org_suspended (the selected organization is suspended by DTG; the body carries organization {id, name} and reason), org_closed (the selected organization is closed; the body carries organization {id, name}), wrong_instance (a key of the mode this process does not serve: a sandbox key on the live API, or a live key on the sandbox; the body carries expected and base_url, the address that serves it), role_required (the caller's role is not one of those named; the body carries required). A sandbox key: sandbox_read_only (it may write only clusters).
As application/problem+json.
404 error
Not Found. Codes: not_found (the X-DTG-Org header is not a uuid, names an organization the caller is not an active member of, or, on an API key, names an organization other than the key's own).
As application/problem+json.
413 error
Payload Too Large. Codes: body_too_large (the body is over this endpoint's 16 KB limit; the body carries limit_bytes).
As application/problem+json.
429 error
Only the per-minute rate limit: rate_limited (120 requests a minute per credential, 300 per organization; lower ceilings for a sandbox key), with Retry-After and X-RateLimit-*.
As application/problem+json.
Retry-Afterheader- Seconds to wait before retrying.
X-RateLimit-Limitheader- The per-minute request ceiling that applies.
X-RateLimit-Remainingheader- Requests left in the current window.
X-RateLimit-Resetheader- 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).
500 error
Internal Server Error. Codes: internal_error (the payment gateway failed to cancel the subscription; nothing was closed; retry).
As application/problem+json.
Problem codes: malformed_json (400), key_revoked (401), unauthenticated (401), no_membership (403), account_suspended (403), org_suspended (403), org_closed (403), wrong_instance (403), role_required (403), sandbox_read_only (403), not_found (404), body_too_large (413), rate_limited (429), internal_error (500). Every problem is a problem document.
GET /v2/account/audit
The organization's audit trail
Credentials: API key or App session. Operation id acctListAudit.
Either credential (an API key or a session); resolves the caller's active organization (X-DTG-Org). Owner or admin. L17/D60: what was done to the organization, newest first, within the 24-month window. JSON: at most 200 rows. With Accept: text/csv: the whole window as a file (the same as GET /v2/account/audit.csv), recorded as a CSV usage event that costs no points and does not count anyone as active. T108: a member that is not an id is 400 invalid_field (it answered 500).
Parameters
X-DTG-Orgheader · string (uuid)- The organization this request acts in (a uuid). Omitted: the caller's own organization, else their earliest active membership. An API key is bound to its organization and may only name that one.
actionquery · string- An action prefix:
cluster.matches every cluster action,billing.changedone action. The values are listed byGET /v2/account/audit/actions. memberquery · string (uuid)- Only rows whose actor is this account id (a uuid).
Responses
200 success
The trail.
As application/json, text/csv.
dataarray of AcctAuditRowalways present- At most 200 rows inside the retention window.
data[].idstring (uuid)always present- The row id.
data[].tsstring (date-time)always present- When it happened.
data[].actionstringalways present- The action (for example
key.created);GET /v2/account/audit/actionslists every one with its label. data[].groupstringalways present- The group the row belongs to (the filter chips):
Sign-ins,Members,Counties,Clusters,Billing,Keys,Policy,Organization, andDTGin DTG's own organization only. data[].summarystringalways present- One sentence describing the row, rendered when read. The actor is not in it.
data[].actor_via"session" | "api_key" | "admin" | "system"always present- How the actor acted:
session,api_key,admin(DTG staff; never named on a customer's trail) orsystem(a job). data[].actorobject or nullalways present- Who acted; null for DTG staff and system rows.
data[].actor.idstring (uuid)always present- The actor's account id.
data[].actor.emailstring or nullalways present- Their address; a closed account shows a
closed+<id>@invalidtombstone, and null when the account row is gone. data[].actor.display_namestring or nullalways present- Their display name; null when none or closed.
data[].target_typestring or nullalways present- What was acted on (for example
api_key,organization,account). data[].target_idstring or nullalways present- The target's id, as text.
data[].detailobjectalways present- The structured facts of the row (never a secret).
retention_monthsintegeralways present- How far back the trail reaches, in months (24).
400 error
Bad Request. Codes: bad_request (action or member given more than once), malformed_json (the body is not valid JSON, or uses an unsupported content encoding).
As application/problem+json.
401 error
Unauthorized. Codes: key_revoked (the API key was revoked; revoked_at, reason, and a sentence saying when and why); unauthenticated (no API key or session; the key is unknown, or its account, membership or organization is no longer active; the session has expired, passed its 30-day maximum age, or belongs to an unverified email address).
As application/problem+json.
403 error
Forbidden. Codes: no_membership (the account has no active membership in an active organization), account_suspended (O56: the signed-in person's own account is suspended by DTG; reason where recorded), org_suspended (the selected organization is suspended by DTG; the body carries organization {id, name} and reason), org_closed (the selected organization is closed; the body carries organization {id, name}), wrong_instance (a key of the mode this process does not serve: a sandbox key on the live API, or a live key on the sandbox; the body carries expected and base_url, the address that serves it), role_required (the caller's role is not one of those named; the body carries required).
As application/problem+json.
404 error
Not Found. Codes: not_found (the X-DTG-Org header is not a uuid, names an organization the caller is not an active member of, or, on an API key, names an organization other than the key's own).
As application/problem+json.
429 error
Only the per-minute rate limit: rate_limited (120 requests a minute per credential, 300 per organization; lower ceilings for a sandbox key), with Retry-After and X-RateLimit-*.
As application/problem+json.
Retry-Afterheader- Seconds to wait before retrying.
X-RateLimit-Limitheader- The per-minute request ceiling that applies.
X-RateLimit-Remainingheader- Requests left in the current window.
X-RateLimit-Resetheader- 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), key_revoked (401), unauthenticated (401), no_membership (403), account_suspended (403), org_suspended (403), org_closed (403), wrong_instance (403), role_required (403), not_found (404), rate_limited (429). Every problem is a problem document.
GET /v2/account/audit.csv
Download the audit trail as CSV
Credentials: API key or App session. Operation id acctDownloadAudit.
Either credential (an API key or a session); resolves the caller's active organization (X-DTG-Org). Owner or admin. The suffix form of Accept: text/csv on GET /v2/account/audit: the whole 24-month window, same filters. Recorded as a CSV usage event that costs no points and does not count anyone as active.
Parameters
X-DTG-Orgheader · string (uuid)- The organization this request acts in (a uuid). Omitted: the caller's own organization, else their earliest active membership. An API key is bound to its organization and may only name that one.
actionquery · string- An action prefix:
cluster.matches every cluster action,billing.changedone action. The values are listed byGET /v2/account/audit/actions. memberquery · string (uuid)- Only rows whose actor is this account id (a uuid).
Responses
200 success
The trail as CSV.
As text/csv.
400 error
Bad Request. Codes: bad_request (action or member given more than once), malformed_json (the body is not valid JSON, or uses an unsupported content encoding).
As application/problem+json.
401 error
Unauthorized. Codes: key_revoked (the API key was revoked; revoked_at, reason, and a sentence saying when and why); unauthenticated (no API key or session; the key is unknown, or its account, membership or organization is no longer active; the session has expired, passed its 30-day maximum age, or belongs to an unverified email address).
As application/problem+json.
403 error
Forbidden. Codes: no_membership (the account has no active membership in an active organization), account_suspended (O56: the signed-in person's own account is suspended by DTG; reason where recorded), org_suspended (the selected organization is suspended by DTG; the body carries organization {id, name} and reason), org_closed (the selected organization is closed; the body carries organization {id, name}), wrong_instance (a key of the mode this process does not serve: a sandbox key on the live API, or a live key on the sandbox; the body carries expected and base_url, the address that serves it), role_required (the caller's role is not one of those named; the body carries required).
As application/problem+json.
404 error
Not Found. Codes: not_found (the X-DTG-Org header is not a uuid, names an organization the caller is not an active member of, or, on an API key, names an organization other than the key's own).
As application/problem+json.
429 error
Only the per-minute rate limit: rate_limited (120 requests a minute per credential, 300 per organization; lower ceilings for a sandbox key), with Retry-After and X-RateLimit-*.
As application/problem+json.
Retry-Afterheader- Seconds to wait before retrying.
X-RateLimit-Limitheader- The per-minute request ceiling that applies.
X-RateLimit-Remainingheader- Requests left in the current window.
X-RateLimit-Resetheader- 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), key_revoked (401), unauthenticated (401), no_membership (403), account_suspended (403), org_suspended (403), org_closed (403), wrong_instance (403), role_required (403), not_found (404), rate_limited (429). Every problem is a problem document.
GET /v2/account/audit/actions
The audit trail's action vocabulary
Credentials: API key or App session. Operation id acctListAuditActions.
Either credential (an API key or a session); resolves the caller's active organization (X-DTG-Org). Owner or admin. T37: every action the trail can carry, with a short label, under its group. The DTG group is listed only in DTG's own organization. No side effects.
Parameters
X-DTG-Orgheader · string (uuid)- The organization this request acts in (a uuid). Omitted: the caller's own organization, else their earliest active membership. An API key is bound to its organization and may only name that one.
Responses
200 success
The vocabulary.
As application/json.
dataarray of objectalways present- The groups.
data[].groupstringalways present- The group name (as on the rows).
data[].actionsarray of objectalways present- Its actions.
data[].actions[].actionstringalways present- The action, the value
?action=filters on. data[].actions[].labelstringalways present- A short label for it.
401 error
Unauthorized. Codes: key_revoked (the API key was revoked; revoked_at, reason, and a sentence saying when and why); unauthenticated (no API key or session; the key is unknown, or its account, membership or organization is no longer active; the session has expired, passed its 30-day maximum age, or belongs to an unverified email address).
As application/problem+json.
403 error
Forbidden. Codes: no_membership (the account has no active membership in an active organization), account_suspended (O56: the signed-in person's own account is suspended by DTG; reason where recorded), org_suspended (the selected organization is suspended by DTG; the body carries organization {id, name} and reason), org_closed (the selected organization is closed; the body carries organization {id, name}), wrong_instance (a key of the mode this process does not serve: a sandbox key on the live API, or a live key on the sandbox; the body carries expected and base_url, the address that serves it), role_required (the caller's role is not one of those named; the body carries required).
As application/problem+json.
404 error
Not Found. Codes: not_found (the X-DTG-Org header is not a uuid, names an organization the caller is not an active member of, or, on an API key, names an organization other than the key's own).
As application/problem+json.
429 error
Only the per-minute rate limit: rate_limited (120 requests a minute per credential, 300 per organization; lower ceilings for a sandbox key), with Retry-After and X-RateLimit-*.
As application/problem+json.
Retry-Afterheader- Seconds to wait before retrying.
X-RateLimit-Limitheader- The per-minute request ceiling that applies.
X-RateLimit-Remainingheader- Requests left in the current window.
X-RateLimit-Resetheader- 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: key_revoked (401), unauthenticated (401), no_membership (403), account_suspended (403), org_suspended (403), org_closed (403), wrong_instance (403), role_required (403), not_found (404), rate_limited (429). Every problem is a problem document.
GET /v2/reopen
Closed organizations this person may reopen
Credentials: API key or App session. Operation id acctListReopenable.
Account-only: it authenticates the person (an API key or a session) and resolves NO organization, so X-DTG-Org is ignored and it answers a person with no active membership at all, or whose only organization is suspended or closed. It does not apply the live/sandbox instance check. D57: the closed organizations this person was an owner of. Works with no active organization at all.
Responses
200 success
The closed organizations.
As application/json.
dataarray of objectalways present- Newest close first.
data[].idstring (uuid)always present- The organization's id (the
{id}to reopen). data[].namestringalways present- Its name.
data[].closed_atstring (date-time) or nullalways present- When it closed.
401 error
Unauthorized. Codes: key_revoked (the API key was revoked; revoked_at, reason, and a sentence saying when and why); unauthenticated (no API key or session; the key is unknown, or its account, membership or organization is no longer active; the session has expired, passed its 30-day maximum age, or belongs to an unverified email address).
As application/problem+json.
429 error
Only the per-minute rate limit: rate_limited (120 requests a minute per credential; no organization bucket on an account-only route), with Retry-After and X-RateLimit-*.
As application/problem+json.
Retry-Afterheader- Seconds to wait before retrying.
X-RateLimit-Limitheader- The per-minute request ceiling that applies.
X-RateLimit-Remainingheader- Requests left in the current window.
X-RateLimit-Resetheader- 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: key_revoked (401), unauthenticated (401), rate_limited (429). Every problem is a problem document.
POST /v2/reopen/{id}
Reopen a closed organization
Credentials: API key or App session. Operation id acctReopenOrganization.
Account-only: it authenticates the person (an API key or a session) and resolves NO organization, so X-DTG-Org is ignored and it answers a person with no active membership at all, or whose only organization is suspended or closed. It does not apply the live/sandbox instance check. Former owner only. Takes no body. D57: the organization becomes active with all its data; ONLY the reopener's membership comes back (as a seated owner); other former members must be invited again. The cancelled subscription is not restored: start billing again. Writes an org.reopened audit row.
Parameters
idpath · string (uuid)required- The closed organization's id.
Responses
200 success
The reopened organization.
As application/json.
org_idstring (uuid)always present- The organization's id.
membership_idstring (uuid)always present- The reopener's membership, active again as a seated owner.
400 error
Bad Request. Codes: malformed_json (the body is not valid JSON, or uses an unsupported content encoding).
As application/problem+json.
401 error
Unauthorized. Codes: key_revoked (the API key was revoked; revoked_at, reason, and a sentence saying when and why); unauthenticated (no API key or session; the key is unknown, or its account, membership or organization is no longer active; the session has expired, passed its 30-day maximum age, or belongs to an unverified email address).
As application/problem+json.
403 error
Forbidden. sandbox_read_only (a sandbox key may write only clusters), and the authentication middleware's no_membership, account_suspended, org_suspended, org_closed, wrong_instance (base_url names the address that serves the key).
As application/problem+json.
404 error
Not Found. Codes: not_found (no such organization, the id is not a uuid, or the caller was never its owner; indistinguishable on purpose).
As application/problem+json.
409 error
Conflict. Codes: not_closed (the organization is not closed; the body carries status).
As application/problem+json.
413 error
Payload Too Large. Codes: body_too_large (the body is over this endpoint's 4 KB limit; the body carries limit_bytes).
As application/problem+json.
429 error
Only the per-minute rate limit: rate_limited (120 requests a minute per credential; no organization bucket on an account-only route), with Retry-After and X-RateLimit-*.
As application/problem+json.
Retry-Afterheader- Seconds to wait before retrying.
X-RateLimit-Limitheader- The per-minute request ceiling that applies.
X-RateLimit-Remainingheader- Requests left in the current window.
X-RateLimit-Resetheader- 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: malformed_json (400), key_revoked (401), unauthenticated (401), sandbox_read_only (403), no_membership (403), account_suspended (403), org_suspended (403), org_closed (403), wrong_instance (403), not_found (404), not_closed (409), body_too_large (413), rate_limited (429). Every problem is a problem document.
GET /v2/account/domains
The organization's domain claims and their verification state
Credentials: API key or App session. Operation id orgListDomains.
The owner or an admin (O63 S11, Q22; 403 role_required for anyone else); default_role: admin is an owner's to set, and never on DTG's organization (AUTH-8). Domain claims are not exclusive: several organizations may claim and verify the same domain. A verified claim lists the organization for people at that domain (GET /v2/orgs/discover), lets them join by its join_policy, and lets an admin at the domain claim ownership. A pending claim grants nothing; its verify_token is the TXT value to publish.
Responses
200 success
The claims.
As application/json.
dataarray of OrgDomainClaimalways present- Every claim of the organization, oldest first.
data[].idstring (uuid)always present- The claim's id.
data[].domainstringalways present- The claimed domain, lower case.
data[].verified_atstring (date-time) or nullalways present- When the claim was verified; null while pending. Only a verified claim lets people at the domain discover and join, and lets an admin claim ownership.
data[].verify_method"owner_email" | "dns_txt" | nullalways present- How it was verified:
owner_email(an owner's verified sign-in address is at the domain; immediate) ordns_txt(a TXT record). Null while pending. data[].join_policy"off" | "request" | "auto"always present- What people at the domain may do once it is verified:
off(not discoverable),request(ask to join; an owner or admin approves),auto(join at once). data[].default_role"member" | "admin"always present- The role a person joining through this domain receives.
data[].created_atstring (date-time)always present- When the claim was made.
data[].verify_tokenstring or nullalways present- While pending, the value to publish as a TXT record
dtg-verify=<verify_token>at the domain; null once verified.
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-Afterheader- Seconds to wait before retrying.
X-RateLimit-Limitheader- The per-minute request ceiling that applies.
X-RateLimit-Remainingheader- Requests left in the current window.
X-RateLimit-Resetheader- 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/domains
Claim a domain (verified at once by an owner's address, else by DNS TXT)
Credentials: API key or App session. Operation id orgClaimDomain.
Owner or admin. Domains of public email providers are refused. Two ways to verify:
- Owner email: if an owner of the organization has a verified sign-in address at the domain, the claim is verified at once (
verify_method: owner_email). - DNS TXT: otherwise the claim is pending; publish a TXT record
dtg-verify=<verify_token>at the domain and callPOST /v2/account/domains/{id}/verify.
The name rule: an organization's name must be unique among the active organizations that have verified the same domain (compared trimmed, with whitespace collapsed and case ignored). A claim that would verify at once is refused 409 org_name_taken if another organization that verified the domain already carries this organization's name, and nothing is written. A pending claim is accepted, and its warnings names the refusal its verification would meet. Claiming a domain this organization already claimed updates only join_policy and default_role (the verification state is left as it was) and still answers 201. Writes a domain.claimed audit row.
Request body
Required; application/json.
domainstringrequired- The domain to claim (trimmed, lower-cased; a public email provider is refused).
join_policy"off" | "request" | "auto"- The join policy (see
OrgDomainClaim.join_policy). (default "request") default_role"member" | "admin"- The role a joiner through this domain receives. (default "member")
Responses
201 success
The claim.
As application/json.
idstring (uuid)always present- The claim's id.
domainstringalways present- The claimed domain.
verified_atstring (date-time) or nullalways present- Set when the claim verified at once (
owner_email); null when pending. verify_method"owner_email" | nullalways presentowner_emailwhen verified at once; null when pending (verify with a TXT record).join_policy"off" | "request" | "auto"always present- The join policy as stored.
default_role"member" | "admin"always present- The default role as stored.
warningsarray of OrgNameTakenWarningalways present- Empty unless the claim is pending and its verification would be refused for the name rule.
warnings[].code"org_name_taken"always present- Always
org_name_taken. warnings[].namestringalways present- The organization's current name, which another organization that has verified this domain already carries.
warnings[].domainstringalways present- The domain the collision is at.
warnings[].auto_namedbooleanalways present- True when the name is still the default derived from the creator's email domain; ask for a chosen name.
warnings[].detailstringalways present- A sentence for people explaining the collision and that verifying will be refused until the organization is renamed.
verify_tokenstring- Present only while pending. Publish
dtg-verify=<verify_token>as a TXT record at the domain. dns_instructionsstring- Present only while pending. The same instruction as a sentence, naming the verify route.
400 error
Bad request. Codes: bad_request (domain missing or not a valid domain name; join_policy or default_role not an allowed value), public_email_domain (a public email provider's domain; domain; errors repeats it), 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; 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.
409 error
Conflict. Codes: org_name_taken (the claim would verify at once and another organization that verified this domain already carries this organization's name; carries name, domain, auto_named; rename the organization, then claim).
As application/problem+json.
413 error
Payload too large. Codes: body_too_large (over 8 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-Afterheader- Seconds to wait before retrying.
X-RateLimit-Limitheader- The per-minute request ceiling that applies.
X-RateLimit-Remainingheader- Requests left in the current window.
X-RateLimit-Resetheader- 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), public_email_domain (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), org_name_taken (409), body_too_large (413). Every problem is a problem document.
PATCH /v2/account/domains/{id}
Change a claim's join policy or default role
Credentials: API key or App session. Operation id orgUpdateDomain.
Owner or admin. Changes what people at the domain may do (join_policy) and the role they receive (default_role). Applies to joins from now on; existing members are unchanged. Works on a pending claim too. Writes a domain.updated audit row.
Parameters
idpath · string (uuid)required- The domain claim's id. A value that is not a UUID answers 404.
Request body
Required; application/json.
join_policy"off" | "request" | "auto"- The new join policy.
default_role"member" | "admin"- The new default role for joiners.
Responses
200 success
The claim after the change.
As application/json.
idstring (uuid)always present- The claim's id.
domainstringalways present- The domain.
verified_atstring (date-time) or nullalways present- When verified; null while pending.
verify_method"owner_email" | "dns_txt" | nullalways present- How it was verified; null while pending.
join_policy"off" | "request" | "auto"always present- The join policy.
default_role"member" | "admin"always present- The default role for joiners.
400 error
Bad request. Codes: bad_request (join_policy or default_role not an allowed value, or nothing to update), 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; 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 claim 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.
413 error
Payload too large. Codes: body_too_large (over 8 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-Afterheader- Seconds to wait before retrying.
X-RateLimit-Limitheader- The per-minute request ceiling that applies.
X-RateLimit-Remainingheader- Requests left in the current window.
X-RateLimit-Resetheader- 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/domains/{id}
Remove a domain claim
Credentials: API key or App session. Operation id orgDeleteDomain.
Owner or admin. Deletes the claim: the organization stops being listed for that domain and people there can no longer join through it. Members who joined through it stay members. Writes a domain.removed audit row.
Parameters
idpath · string (uuid)required- The domain claim's 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; 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 claim 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-Afterheader- Seconds to wait before retrying.
X-RateLimit-Limitheader- The per-minute request ceiling that applies.
X-RateLimit-Remainingheader- Requests left in the current window.
X-RateLimit-Resetheader- 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/domains/{id}/verify
Verify a pending claim by its DNS TXT record
Credentials: API key or App session. Operation id orgVerifyDomain.
Owner or admin. Looks up the TXT records at the domain and verifies the claim when one reads dtg-verify=<verify_token> (DNS changes can take time to appear; retry after a 409 dns_txt_not_found). Before verifying, the name rule is checked (see POST /v2/account/domains): if another organization that verified the domain already carries this organization's name, verification is refused 409 org_name_taken and the claim stays pending. An already verified claim is returned as it is, with 200. Writes a domain.verified audit row. No body is read.
Parameters
idpath · string (uuid)required- The domain claim's id. A value that is not a UUID answers 404.
Responses
200 success
The verified claim.
As application/json.
idstring (uuid)always present- The claim's id.
domainstringalways present- The domain.
verified_atstring (date-time)always present- When the claim was verified.
verify_method"owner_email" | "dns_txt"always present- How it was verified.
join_policy"off" | "request" | "auto"- The join policy. Absent when the claim was already verified before this call.
default_role"member" | "admin"- The default role for joiners. Absent when the claim was already verified before this call.
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 claim 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: dns_txt_not_found (no matching TXT record yet; carries found, the dtg-verify= values that were seen), org_name_taken (another organization that verified this domain already carries this organization's name; carries name, domain, auto_named; rename, then verify).
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-Afterheader- Seconds to wait before retrying.
X-RateLimit-Limitheader- The per-minute request ceiling that applies.
X-RateLimit-Remainingheader- Requests left in the current window.
X-RateLimit-Resetheader- 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), dns_txt_not_found (409), org_name_taken (409). Every problem is a problem document.
GET /v2/orgs
The organizations the caller belongs to, and where a sign-in should land
Credentials: API key or App session. Operation id orgListMine.
Any signed-in person, including one with no organization (then data is empty and active_org_id null) or whose only one is suspended or closed. Each row's active marks the organization this request resolved to (X-DTG-Org, else the own organization). landing_org_id is where a sign-in in a browser that remembers nothing should open; name it in X-DTG-Org to use it.
Responses
200 success
The memberships.
As application/json.
dataarray of OrgMembershipSummaryalways present- The caller's active memberships, own organization first, then by join date. Empty for a person with none.
data[].idstring (uuid)always present- The organization's id; send it as
X-DTG-Orgto act in it. data[].namestringalways present- The organization's name.
data[].status"active" | "suspended" | "closed"always present- The organization's status.
suspended: DTG suspended it; its routes answer 403account_suspended,org_suspended. 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[].seatedbooleanalways present- True when the caller holds a seat there.
data[].api_enabledbooleanalways present- True when the caller may hold live API keys there.
data[].billing_contactbooleanalways present- True when the caller is a billing contact there.
data[].ownbooleanalways present- True for the caller's own organization (the one made at their sign-up).
data[].plan_codestringalways present- The organization's plan code (see
GET /v2/plans). data[].joined_atstring (date-time)always present- When the caller joined.
data[].activebooleanalways present- True for the organization THIS request resolved to (
X-DTG-Org, else the own organization). Not a membership flag; every row is an active membership. active_org_idstring (uuid) or nullalways present- The organization this request resolved to; null when none resolved (no membership, or the only one is suspended or closed).
landing_org_idstring (uuid) or nullalways present- Where a sign-in in a browser that remembers nothing should open. The organization last used in a session while still a membership, else the paid organization joined most recently (unless the own one is paid), else the own. Computed from the value before this request. Null when the caller has no membership.
header"X-DTG-Org"always present- The request header that selects the organization.
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: 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, or is not a UUID).
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-Afterheader- Seconds to wait before retrying.
X-RateLimit-Limitheader- The per-minute request ceiling that applies.
X-RateLimit-Remainingheader- Requests left in the current window.
X-RateLimit-Resetheader- 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), wrong_instance (403), not_found (404). Every problem is a problem document.
GET /v2/orgs/discover
Organizations at the caller's email domain that accept joins
Credentials: API key or App session. Operation id orgDiscover.
Any signed-in person, including one with no organization. Lists the active organizations that have verified the caller's email domain with a join policy other than off. Claims are not exclusive, so several may appear; their names are unique at the domain (the name rule), and each row carries the domain to show beside the name. Join one with POST /v2/orgs/{id}/join or keep your own.
Responses
200 success
The organizations.
As application/json.
domainstringalways present- The caller's email domain, the one searched.
dataarray of OrgDiscoverRowalways present- Active organizations with a verified claim on that domain whose join policy is not
off, oldest first. Claims are not exclusive, so several may be listed. data[].idstring (uuid)always present- The organization's id (the
{id}ofPOST /v2/orgs/{id}/join). data[].namestringalways present- The organization's name, unique among the organizations that verified this domain.
data[].domainstringalways present- The verified domain the organization is listed under. Show it beside the name.
data[].join_policy"request" | "auto"always presentauto: joining is immediate.request: joining files a request an owner or admin decides.data[].default_role"member" | "admin"always present- The role a joiner receives.
data[].membersintegeralways present- The organization's active members.
data[].already_memberbooleanalways present- True when the caller is already an active member.
data[].request_pendingbooleanalways present- True when the caller has a pending join request there.
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: 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-Afterheader- Seconds to wait before retrying.
X-RateLimit-Limitheader- The per-minute request ceiling that applies.
X-RateLimit-Remainingheader- Requests left in the current window.
X-RateLimit-Resetheader- 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), wrong_instance (403), not_found (404). Every problem is a problem document.
POST /v2/orgs/{id}/join
Join an organization at your email domain, or ask to
Credentials: API key or App session. Operation id orgJoin.
Any signed-in person with a verified address, including one with no organization. The organization must be one GET /v2/orgs/discover lists for the caller. With join policy auto the caller joins at once (201) with the claim's default_role, taking a seat when one is free (an admin is always seated) or else joining as a free member. With request a join request is filed (202; asking again after a denial re-opens it) and the organization's owners and admins are mailed and told in the app; they decide with POST /v2/account/join-requests/{id}/approve or /deny. No body is read.
Parameters
idpath · string (uuid)required- The organization's id, from
GET /v2/orgs/discover. A value that is not a UUID answers 404.
Responses
201 success
Joined (join policy auto).
As application/json.
status"joined"always present- Always
joined. organizationobjectalways present- The organization, by id and name.
organization.idstring (uuid)always present- The organization joined.
organization.namestringalways present- Its name.
membership_idstring (uuid)always present- The new (or re-activated) membership's id.
seatedbooleanalways present- True when a seat was taken (always for an admin; for a member only when one was free).
rejoinedbooleanalways present- True when a former membership was re-activated rather than created.
202 success
Join request filed (join policy request).
As application/json.
status"requested"always present- Always
requested. request_idstring (uuid)always present- The join request's id.
organizationobjectalways present- The organization, by id and name.
organization.idstring (uuid)always present- The organization asked.
organization.namestringalways present- Its name.
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_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 (no organization with that id at your email domain accepts joins, 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; no further members).
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-Afterheader- Seconds to wait before retrying.
X-RateLimit-Limitheader- The per-minute request ceiling that applies.
X-RateLimit-Remainingheader- Requests left in the current window.
X-RateLimit-Resetheader- 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), email_unverified (403), wrong_instance (403), sandbox_read_only (403), not_found (404), already_member (409). Every problem is a problem document.
Generated from taigan/openapi.yaml at catahoula 77925fab712f(API document version 2.0).