Account
17 endpoints, generated from the API's own OpenAPI document. The signed-in person, their active organization, the rules the screens state, sessions, closing and reopening.
GET /v2/account
The person, the active organization, membership, plan, trial, rules and entitlements
Credentials: API key or App session. Operation id acctGetAccount.
Either credential (an API key or a session); resolves the caller's active organization (X-DTG-Org). Any role. Everything is resolved against the active organization; rules states every window, ceiling and allowance the app shows, and entitlements what this member may do now. No side effects beyond remembering, for a browser session, the organization last used (last_org_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
The account view.
As application/json.
idstring (uuid)always present- The person's account id.
emailstringalways present- The person's email address.
display_namestring or nullalways present- The person's display name; null when never set.
status"active" | "closed"always present- Account status; always
activefor a caller (a closed account cannot authenticate). email_verifiedbooleanalways present- True once the email address is verified.
marketing_opt_outbooleanalways present- True when the person has opted out of product (marketing) email.
created_atstring (date-time)always present- When the account was created.
last_org_idstring (uuid) or nullalways present- T16: the organization this person last used in a browser session; null when none, or when that organization has since closed.
landing_org_idstring (uuid) or nullalways present- T16: where a sign-in should open: the last-used organization while still an active membership, else the paid organization joined most recently (unless the own one is paid), else the own one. Null when the person has no active membership. Send it as
X-DTG-Org. organizationobjectalways present- The active organization (the one
X-DTG-Orgselected, else the own one). organization.idstring (uuid)always present- The organization's id.
organization.namestringalways present- The organization's name.
organization.ownbooleanalways present- True when it is this person's own organization.
organization.plan_codestringalways present- The organization's plan code (the plan it pays for, whatever this member's seat).
organization.addonsarray of stringalways present- Active add-ons, by code (for example
api). organization.seatsobjectalways present- Seats.
organization.seats.includedintegeralways present- Seats the plan includes (or DTG's override), raised to the organization's T163 grandfathered count while one is recorded (see
OrgSeatState.grandfathered). organization.seats.purchasedintegeralways present- Extra seats bought.
organization.seats.capacityintegeralways present- Included plus purchased.
organization.seats.seatedintegeralways present- Active members holding a seat.
organization.seats.free_membersintegeralways present- Active members without a seat (free members).
organization.countiesobjectalways present- Counties, as resolved for this member.
organization.counties.includedintegeralways present- Counties included; -1 means every county.
organization.counties.purchasedintegeralways present- Extra county slots bought.
organization.counties.capacityintegeralways present- Included plus purchased; -1 means every county.
organization.counties.activeinteger or "all"always present- Counties active for this member now, or
all. membershipobjectalways present- The caller's membership in the active organization.
membership.idstring (uuid)always present- The membership id.
membership.role"owner" | "admin" | "member"always present- Role.
membership.seatedbooleanalways present- True when the member holds a seat.
membership.api_enabledbooleanalways present- True when an owner or admin has granted this member API access (needed to mint live keys).
membership.billing_contactbooleanalways present- True when the member is a billing contact (invoices and payment method).
organizationsarray of AcctOrganizationRowalways present- Every active organization this person belongs to, own first, then by join date.
organizations[].idstring (uuid)always present- The organization's id; send it as
X-DTG-Orgto act in it. organizations[].namestringalways present- The organization's display name.
organizations[].role"owner" | "admin" | "member"always present- The person's role in it.
organizations[].seatedbooleanalways present- True when the person holds a paid seat there; an unseated (free) member gets the free plan's capabilities.
organizations[].ownboolean or nullalways present- True for the person's own organization (the one made at sign-up). Null when the person has no own organization any more.
planobjectalways present- The plan.
plan.codestringalways present- The plan this MEMBER resolves to: the organization's plan when seated,
freewhen unseated. plan.organization_planstringalways present- The organization's plan code.
plan.namestringalways present- The organization's plan display name.
plan.billing_interval"month" | "year"always present- Billing interval.
plan.billing_mode"self_serve" | "invoiced"always presentself_serve(card through the app) orinvoiced(a contract DTG manages).plan.contract_expires_atstring (date-time) or nullalways present- End of an invoiced contract; null when none.
plan.pending_changeobject or nullalways present- A scheduled plan change, or null.
plan.pending_change.plan_codestringalways present- The plan the organization moves to.
plan.pending_change.effective_atstring (date-time) or nullalways present- When the move takes effect.
plan.seat_reassignment_pendingbooleanalways present- True when a downgrade left more seated members than seats and an owner or admin must choose who keeps one.
plan.county_choice_pendingbooleanalways present- True when the owner must confirm which counties stay after a plan change.
rulesAcctRulesalways present- Every window, ceiling and allowance the app states, with the active organization's plan.
rules.invite_expiry_daysintegeralways present- Days an invitation stays open before it expires (default 14).
rules.link_lifetimesobjectalways present- T33: how long each mailed link works.
rules.link_lifetimes.password_reset_secondsintegeralways present- Lifetime of a password-reset link, in seconds (default 3600).
rules.link_lifetimes.email_verification_secondsintegeralways present- Lifetime of an email-verification link, in seconds (default 3600).
rules.link_lifetimes.invitation_daysintegeralways present- Lifetime of an invitation link, in days (the same value as
invite_expiry_days). rules.supportobjectalways present- T47: the support contact for every screen that says 'contact support'.
rules.support.emailstring or nullalways present- The support address. Null when the deployment configured none.
rules.ownership_claim_notice_daysintegeralways present- T36: days an ownership claim by a domain-verified admin waits before it completes; an owner signing in during the window cancels it (default 7).
rules.trial_daysintegeralways present- Length of a trial, in days (default 7).
rules.sessionobjectalways present- Browser session lifetimes (item 26).
rules.session.sliding_daysintegeralways present- A session idle for this many days ends (default 7).
rules.session.max_daysintegeralways present- A session ends this many days after sign-in however active it is (default 30).
rules.signin_throttleobjectalways present- Failed sign-ins allowed per email address before sign-in is refused for the rest of the window.
rules.signin_throttle.max_failuresintegeralways present- Failed attempts allowed in the window (10).
rules.signin_throttle.window_secondsintegeralways present- Length of the window, in seconds (3600).
rules.two_factor_lockoutobjectalways present- D74: wrong second-factor codes before the factor locks.
rules.two_factor_lockout.max_failuresintegeralways present- Wrong codes allowed before the lock (default 10).
rules.two_factor_lockout.lock_secondsintegeralways present- How long the lock lasts, in seconds (default 900).
rules.notification_retention_daysintegeralways present- Days a bell notification is kept (default 90).
rules.audit_retention_monthsintegeralways present- Months the organization's audit trail is kept (D60, default 24).
rules.cluster_restore_daysintegeralways present- Days a deleted cluster can be restored (D70, default 30).
rules.rate_limitsobjectalways present- The per-minute request ceilings. A sandbox key has lower ceilings that are not stated here.
rules.rate_limits.per_key_per_minintegeralways present- Requests a minute per credential (120).
rules.rate_limits.per_session_per_minintegeralways present- Requests a minute per browser session; always equal to
per_key_per_minsince D79 (one ceiling for every credential). rules.rate_limits.per_org_per_minintegeralways present- Requests a minute across every member, key and session of one organization (300).
rules.annual_multipliernumberalways present- An annual price is the monthly price times this (default 10).
rules.dunning_grace_daysintegeralways present- Days after a failed payment before the subscription itself ends; service pauses at once (default 16).
rules.product_events"on" | "off"always present- T166: whether this Taigan records our own product events (
PRODUCT_EVENTS, off by default until the owner approves the policy wording).off: the app's event client sends nothing.on: it posts the screens opened toPOST /v2/events. rules.planobject or nullalways present- The active organization's plan as sold. Null on
GET /v2/account/profile(no organization is resolved there). rules.plan.codestringalways present- The plan code.
rules.plan.namestringalways present- The plan's display name (D42-FINAL).
rules.plan.counties_includedinteger or "all"always present- Counties the plan includes, or
allfor every county. rules.plan.seats_includedintegeralways present- Seats the plan includes.
rules.plan.points_quota_monthinteger or nullalways present- The plan's monthly points allowance (data values emitted on the API, CSV and XLSX channels, per organization); null when unlimited. An add-on can raise the effective figure: see
entitlements.points_quota_month. two_factorAcctTwoFactoralways present- The person's second factor.
two_factor.enabledbooleanalways present- True when the person has turned on the second factor (TOTP).
two_factor.backup_codes_remaininginteger or nullalways present- How many unused backup codes remain. Null when the factor is off, or when the count could not be read.
platform_adminbooleanalways present- T133: true when this request's session is one
/v2/adminwould accept on its first three facts: a session (never an API key), an owner or admin of DTG's house organization, the second factor on. The session's own challenge is not part of it: a house admin whose session began from a link is true, and/v2/adminasks that session for the code (second_factor_required). False for everyone else, and always present, so it says nothing about anyone but the person asking. Kelpie shows the platform console in the account menu on true. trialobject or nullalways present- This person's running trial in this organization, or null (a trial runs only in the person's own organization).
trial.idstring (uuid)always present- The trial id.
trial.countystringalways present- The trial county's name.
trial.fipsstringalways present- The trial county's 5-digit FIPS code.
trial.started_atstring (date-time)always present- When the trial started.
trial.expires_atstring (date-time)always present- When the trial ends.
entitlementsAcctEntitlementSummaryalways present- What this member may do in the active organization now.
entitlements.counties_includedintegeralways present- Counties the plan includes; -1 means every county.
entitlements.counties_purchasedintegeralways present- Extra county slots bought.
entitlements.county_capacityintegeralways present- Counties the organization may hold: included plus purchased; -1 means every county.
entitlements.quarterly_accessbooleanalways present- True when quarterly data may be requested.
entitlements.depth_cap_naicsintegeralways present- Deepest NAICS level served (digits).
entitlements.depth_cap_socintegeralways present- Deepest SOC level served.
entitlements.api_accessbooleanalways present- True when this member's API keys may read data (the organization holds the API add-on and the member is seated).
entitlements.csv_accessbooleanalways present- True when CSV and XLSX export is included.
entitlements.csv_quota_monthinteger or nullalways present- Monthly CSV export count limit; null (the usual case) means no export count limit, points meter exports instead.
entitlements.points_quota_monthinteger or nullalways present- The organization's monthly points allowance (data values emitted on the API, CSV and XLSX channels); null when unlimited. See
GET /v2/plans. entitlements.account_rate_per_minintegeralways present- Requests a minute allowed across the whole organization (300; lower on a sandbox key).
entitlements.api_keys_per_memberintegeralways present- Active live API keys this member may hold (0 for an unseated member; the sandbox cap on a sandbox key).
entitlements.vintage_accessbooleanalways present- True when vintages other than the current one may be requested.
entitlements.active_countiesinteger or "all"always present- How many counties are active for this member now (the trial county included), or
all. entitlements.county_choice_pendingbooleanalways present- True when a plan change left more counties than the new plan holds and the owner still has to confirm which stay (
POST /v2/account/counties/confirm). entitlements.trial_activebooleanalways present- True while this person's trial is running in this (their own) organization.
entitlements.trial_csvbooleanalways present- True while a trial grants export of the trial county.
entitlements.quota_scope"organization"always present- Always
organization: every quota here is shared by the whole organization.
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).
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), not_found (404), rate_limited (429). Every problem is a problem document.
PATCH /v2/account
Edit the display name or marketing consent
Credentials: API key or App session. Operation id acctUpdateAccount.
Either credential (an API key or a session); resolves the caller's active organization (X-DTG-Org). Any role. Changes the person, not the organization. The same edit as PATCH /v2/account/profile.
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.
display_namestring- New display name: a non-blank string of at most 120 characters, stored trimmed. (at most 120 characters)
marketing_opt_outboolean- True to stop product (marketing) email, false to receive it again. Transactional mail is sent either way. A change writes an
account.marketing_changedaudit row.
Responses
204 success
No Content.
400 error
Bad Request. Codes: bad_request (display_name is not a non-blank string of at most 120 characters, marketing_opt_out is not a boolean, or neither field was sent), 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). 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).
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), sandbox_read_only (403), not_found (404), body_too_large (413), rate_limited (429). Every problem is a problem document.
GET /v2/account/password
Whether this person must choose a password (T100)
Credentials: API key or App session. Operation id acctGetPasswordState.
Account-only (resolves no organization). T100 (Ops entry 72, O63 S11): a password chosen at sign-up stands only when the verification link is opened in the browser that signed up (the sign-up's dtg.pending_signup cookie). Verified from another browser, it is discarded, the link signs the person in, and password_required is true until they choose one here.
Responses
200 success
OK.
As application/json.
password_requiredbooleanalways present- True when the email-and-password account has no password (discarded by T100, or by a contested sign-up, AUTH-2).
min_lengthintegeralways present- The password floor (10).
Problem codes: unauthenticated (401). Every problem is a problem document.
POST /v2/account/password
Choose the password, once, while verifying (T100)
Credentials: API key or App session. Operation id acctSetPassword.
Account-only, a signed-in session only (an API key answers 403 session_required). Sets the password of an account that has none; audited as auth.password_set. A password is CHANGED with the current one (/v2/auth/change-password), never here.
Request body
Required; application/json.
new_passwordstringrequired- The new password.
Responses
200 success
OK.
As application/json.
password_requiredboolean- False once set.
403 error
Forbidden. Codes: session_required, account_suspended (O56: the account is suspended by DTG).
As application/problem+json.
Problem codes: password_too_short (400), bad_request (400), unauthenticated (401), session_required (403), account_suspended (403), password_already_set (409). Every problem is a problem document.
GET /v2/account/profile
The person, their organizations (possibly none), second factor and rules
Credentials: API key or App session. Operation id acctGetProfile.
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. T42: the profile, sessions, security and account close stay reachable for a person whose organizations are all gone. rules.plan is null.
Responses
200 success
The profile.
As application/json.
idstring (uuid)always present- The person's account id.
emailstringalways present- The person's email address.
display_namestring or nullalways present- The person's display name; null when never set.
status"active" | "closed"always present- Account status; always
activefor a caller (a closed account cannot authenticate). email_verifiedbooleanalways present- True once the email address is verified.
marketing_opt_outbooleanalways present- True when the person has opted out of product (marketing) email.
created_atstring (date-time)always present- When the account was created.
last_org_idstring (uuid) or nullalways present- T16: the organization this person last used in a browser session; null when none, or when that organization has since closed.
landing_org_idstring (uuid) or nullalways present- T16: where a sign-in should open: the last-used organization while still an active membership, else the paid organization joined most recently (unless the own one is paid), else the own one. Null when the person has no active membership. Send it as
X-DTG-Org. organizationsarray of AcctOrganizationRowalways present- Every active organization this person belongs to, own first; empty when none.
organizations[].idstring (uuid)always present- The organization's id; send it as
X-DTG-Orgto act in it. organizations[].namestringalways present- The organization's display name.
organizations[].role"owner" | "admin" | "member"always present- The person's role in it.
organizations[].seatedbooleanalways present- True when the person holds a paid seat there; an unseated (free) member gets the free plan's capabilities.
organizations[].ownboolean or nullalways present- True for the person's own organization (the one made at sign-up). Null when the person has no own organization any more.
two_factorAcctTwoFactoralways present- The person's second factor.
two_factor.enabledbooleanalways present- True when the person has turned on the second factor (TOTP).
two_factor.backup_codes_remaininginteger or nullalways present- How many unused backup codes remain. Null when the factor is off, or when the count could not be read.
rulesAcctRulesalways present- The rules block, with
plannull (no organization is resolved). rules.invite_expiry_daysintegeralways present- Days an invitation stays open before it expires (default 14).
rules.link_lifetimesobjectalways present- T33: how long each mailed link works.
rules.link_lifetimes.password_reset_secondsintegeralways present- Lifetime of a password-reset link, in seconds (default 3600).
rules.link_lifetimes.email_verification_secondsintegeralways present- Lifetime of an email-verification link, in seconds (default 3600).
rules.link_lifetimes.invitation_daysintegeralways present- Lifetime of an invitation link, in days (the same value as
invite_expiry_days). rules.supportobjectalways present- T47: the support contact for every screen that says 'contact support'.
rules.support.emailstring or nullalways present- The support address. Null when the deployment configured none.
rules.ownership_claim_notice_daysintegeralways present- T36: days an ownership claim by a domain-verified admin waits before it completes; an owner signing in during the window cancels it (default 7).
rules.trial_daysintegeralways present- Length of a trial, in days (default 7).
rules.sessionobjectalways present- Browser session lifetimes (item 26).
rules.session.sliding_daysintegeralways present- A session idle for this many days ends (default 7).
rules.session.max_daysintegeralways present- A session ends this many days after sign-in however active it is (default 30).
rules.signin_throttleobjectalways present- Failed sign-ins allowed per email address before sign-in is refused for the rest of the window.
rules.signin_throttle.max_failuresintegeralways present- Failed attempts allowed in the window (10).
rules.signin_throttle.window_secondsintegeralways present- Length of the window, in seconds (3600).
rules.two_factor_lockoutobjectalways present- D74: wrong second-factor codes before the factor locks.
rules.two_factor_lockout.max_failuresintegeralways present- Wrong codes allowed before the lock (default 10).
rules.two_factor_lockout.lock_secondsintegeralways present- How long the lock lasts, in seconds (default 900).
rules.notification_retention_daysintegeralways present- Days a bell notification is kept (default 90).
rules.audit_retention_monthsintegeralways present- Months the organization's audit trail is kept (D60, default 24).
rules.cluster_restore_daysintegeralways present- Days a deleted cluster can be restored (D70, default 30).
rules.rate_limitsobjectalways present- The per-minute request ceilings. A sandbox key has lower ceilings that are not stated here.
rules.rate_limits.per_key_per_minintegeralways present- Requests a minute per credential (120).
rules.rate_limits.per_session_per_minintegeralways present- Requests a minute per browser session; always equal to
per_key_per_minsince D79 (one ceiling for every credential). rules.rate_limits.per_org_per_minintegeralways present- Requests a minute across every member, key and session of one organization (300).
rules.annual_multipliernumberalways present- An annual price is the monthly price times this (default 10).
rules.dunning_grace_daysintegeralways present- Days after a failed payment before the subscription itself ends; service pauses at once (default 16).
rules.product_events"on" | "off"always present- T166: whether this Taigan records our own product events (
PRODUCT_EVENTS, off by default until the owner approves the policy wording).off: the app's event client sends nothing.on: it posts the screens opened toPOST /v2/events. rules.planobject or nullalways present- The active organization's plan as sold. Null on
GET /v2/account/profile(no organization is resolved there). rules.plan.codestringalways present- The plan code.
rules.plan.namestringalways present- The plan's display name (D42-FINAL).
rules.plan.counties_includedinteger or "all"always present- Counties the plan includes, or
allfor every county. rules.plan.seats_includedintegeralways present- Seats the plan includes.
rules.plan.points_quota_monthinteger or nullalways present- The plan's monthly points allowance (data values emitted on the API, CSV and XLSX channels, per organization); null when unlimited. An add-on can raise the effective figure: see
entitlements.points_quota_month. terms_acceptance_requiredboolean- T136: true while the gate is on (
TERMS_AT_FIRST_SIGN_IN=on, off by default) for an account DTG staff set up whose person has not yet accepted the Terms of Service and the Privacy Policy; every route that resolves an organization answers403 terms_acceptance_requireduntilPOST /v2/account/legal/accept. False for every other account.
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.
PATCH /v2/account/profile
Edit the display name or marketing consent (account-only)
Credentials: API key or App session. Operation id acctUpdateProfile.
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. The same edit as PATCH /v2/account.
Request body
Required; application/json.
display_namestring- New display name: a non-blank string of at most 120 characters, stored trimmed. (at most 120 characters)
marketing_opt_outboolean- True to stop product (marketing) email, false to receive it again. Transactional mail is sent either way. A change writes an
account.marketing_changedaudit row.
Responses
204 success
No Content.
400 error
Bad Request. Codes: bad_request (display_name is not a non-blank string of at most 120 characters, marketing_opt_out is not a boolean, or neither field was sent), 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.
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; 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: bad_request (400), 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), body_too_large (413), rate_limited (429). Every problem is a problem document.
GET /v2/account/legal
Whether this person still owes the acceptance of the Terms (T136)
Credentials: API key or App session. Operation id acctGetLegal.
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. T136: an account DTG staff set up (deploy.sh account, the house bootstrap) records no acceptance, because its person submitted no form; acceptance_required is true until the person accepts with POST /v2/account/legal/accept. last_accepted is the latest recorded acceptance, or null. The refusal applies only while TERMS_AT_FIRST_SIGN_IN=on (off by default until the app asks); an owed acceptance can be recorded either way.
Responses
200 success
The acceptance state.
As application/json.
acceptance_requiredbooleanalways present- True while the person owes the acceptance and the gate is on (
TERMS_AT_FIRST_SIGN_IN=on, off by default); every route that resolves an organization answers403 terms_acceptance_requiredmeanwhile. terms_versionstringalways present- The Terms of Service version in force (
TERMS_VERSION). privacy_versionstringalways present- The Privacy Policy version in force (
PRIVACY_VERSION). last_acceptedobject or nullalways present- The latest recorded acceptance, or null.
last_accepted.terms_versionstring- The Terms of Service version accepted.
last_accepted.privacy_versionstring- The Privacy Policy version accepted.
last_accepted.surface"sign_up" | "invite_sign_up" | "first_sign_in"- Where it was accepted: the sign-up form, an invitation's sign-up, or the first sign-in to an account DTG set up.
last_accepted.accepted_atstring (date-time)- When.
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/account/legal/accept
Accept the Terms of Service and the Privacy Policy (T136)
Credentials: API key or App session. Operation id acctAcceptLegal.
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. A session only: the person accepts, never a key and never staff on their behalf. The body names the versions the person was shown, which must be the ones in force. When the account owes the acceptance, it is recorded exactly as a sign-up records it (a row with the versions in force, surface first_sign_in, and the audit event legal.accepted), and the account is served as any other from then on. When nothing is owed (a sign-up recorded it, or a second click), nothing is written and the answer is 200.
Request body
Required; application/json.
terms_versionstringrequired- The Terms of Service version the person was shown.
privacy_versionstringrequired- The Privacy Policy version the person was shown.
Responses
200 success
Nothing was owed; nothing was written.
As application/json.
acceptedbooleanalways present- True when this request recorded the acceptance; false when nothing was owed.
acceptance_requiredbooleanalways present- Always false after the request.
terms_versionstringalways present- The Terms of Service version in force, now accepted.
privacy_versionstringalways present- The Privacy Policy version in force, now accepted.
201 success
The acceptance was recorded.
As application/json.
acceptedbooleanalways present- True when this request recorded the acceptance; false when nothing was owed.
acceptance_requiredbooleanalways present- Always false after the request.
terms_versionstringalways present- The Terms of Service version in force, now accepted.
privacy_versionstringalways present- The Privacy Policy version in force, now accepted.
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: session_required (an API key; only the person, signed in, accepts), account_suspended (O56: the account is suspended by DTG).
As application/problem+json.
409 error
Conflict. Codes: terms_version_changed (the versions sent are not the ones in force; terms_version and privacy_version name them).
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), session_required (403), account_suspended (403), terms_version_changed (409), rate_limited (429). Every problem is a problem document.
GET /v2/account/close
What closing this account would do
Credentials: API key or App session. Operation id acctPreviewAccountClose.
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. D56: lists the organizations that would block the close, those that would close with it and those it would leave, so the confirm dialog can state the consequences. No side effects.
Responses
200 success
The preview.
As application/json.
blocked_byarray of AcctOrgRefalways present- Organizations that block the close: this person is their only owner and they still have other members. Empty when nothing blocks; while non-empty,
POST /v2/account/closeanswers 409last_owner. blocked_by[].org_idstring (uuid)always present- The organization's id.
blocked_by[].namestringalways present- The organization's name.
organizations_closingarray of AcctOrgRefalways present- Organizations where this person is the only active member: they close with the account (a paid subscription is cancelled at once, no refund).
organizations_closing[].org_idstring (uuid)always present- The organization's id.
organizations_closing[].namestringalways present- The organization's name.
organizations_leavingarray of AcctOrgRefalways present- Organizations that carry on without this person: the membership ends, the seat frees, their keys there are revoked.
organizations_leaving[].org_idstring (uuid)always present- The organization's id.
organizations_leaving[].namestringalways present- The organization's name.
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/account/close
Close this account
Credentials: API key or App session. Operation id acctCloseAccount.
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. D56: cannot be undone. Takes no body. Every membership ends (seat freed, keys revoked, pending join requests denied); the address and display name are replaced by a tombstone; the sign-in identity, credentials, every session (this one included), the person's notifications, support tickets and known devices are deleted; marketing mail stops; a running trial ends cancelled. An organization where the person was the only member closes with them and its subscription is cancelled at once with no refund (retried hourly if the payment gateway fails). The owners and admins of each organization that carries on get a member_departed notification; an account.closed audit row is written. The person is mailed, once, at the address as it was before the tombstone (T124: 'Your Data Tactical Group account is closed': what was removed at once, what remains and for how long, in the Privacy Policy's words, and that the account cannot be reopened); a close made through the admin door sends no mail. Refused while the person is the only owner of an organization with other members. Idempotent: closing a closed account reports zeros.
Responses
200 success
What the close did.
As application/json.
account_idstring (uuid)always present- The closed account's id.
memberships_removedintegeralways present- Memberships ended.
organizations_closedarray of string (uuid)always present- Ids of the organizations that closed with the account (those where this person was the only member).
trial_cancelledbooleanalways present- True when a running trial was ended (
cancelled).
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 (the account row no longer exists).
As application/problem+json.
409 error
Conflict. Codes: last_owner (the person is the only owner of an organization that still has other members; the body lists them in organizations; transfer ownership first).
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), last_owner (409), body_too_large (413), rate_limited (429). Every problem is a problem document.
GET /v2/account/sessions
The person's live browser sessions
Credentials: API key or App session. Operation id acctListSessions.
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. Lists every unexpired session of the person (ORG_LICENSING 12.9), whichever credential asks.
Responses
200 success
The sessions.
As application/json.
policy"one_active_session_per_credential"always present- Always
one_active_session_per_credential: a new sign-in ends the previous session (ORG_LICENSING 4.2). dataarray of AcctSessionalways present- The sessions.
data[].idstring (uuid)always present- The session id (the
{id}forDELETE /v2/account/sessions/{id}). data[].created_atstring (date-time)always present- When the session was created (the sign-in).
data[].last_seen_atstring (date-time)always present- When the session was last refreshed.
data[].expires_atstring (date-time)always present- When the session expires unless refreshed (the sliding window); it ends at the 30-day maximum regardless.
data[].ipstring or nullalways present- The address the session signed in from, when recorded.
data[].user_agentstring or nullalways present- The browser's user agent at sign-in, when recorded.
data[].currentbooleanalways present- True for the session making this request (always false on an API key).
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.
DELETE /v2/account/sessions/{id}
End one session
Credentials: API key or App session. Operation id acctRevokeSession.
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. Ends one of the person's own sessions (it may be the current one). Takes effect within 15 seconds on every server process (sessions are cached that long).
Parameters
idpath · string (uuid)required- The session id (a uuid, from
GET /v2/account/sessions).
Responses
204 success
No Content.
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.
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), sandbox_read_only (403), no_membership (403), account_suspended (403), org_suspended (403), org_closed (403), wrong_instance (403), not_found (404), rate_limited (429). Every problem is a problem document.
POST /v2/account/sessions/sign-out-everywhere
End every session
Credentials: API key or App session. Operation id acctSignOutEverywhere.
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. Takes no body. Ends every browser session of the person, the current one included, within 15 seconds. API keys are not affected.
Responses
204 success
No Content.
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.
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), body_too_large (413), rate_limited (429). Every problem is a problem document.
GET /v2/account/trial
Trial eligibility and state
Credentials: API key or App session. Operation id acctGetTrial.
Either credential (an API key or a session); resolves the caller's active organization (X-DTG-Org). Any role. D16-trial/D40: one self-serve trial per person. Reports whether one can start, the running one, or the earlier one. 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
Eligibility.
As application/json.
eligiblebooleanalways present- True when
POST /v2/account/trialwould start one. reason"eligible" | "active" | "cooldown" | "unverified"always presenteligible;active(a trial is running);cooldown(A trial has already run for this person.);unverified(the email address is not verified; checked first).eligible_again_atnullalways present- Always null (no date is stated to customers).
active_trialobject or nullalways present- The running trial when
reasonisactive; else null. active_trial.idstring (uuid)always present- The trial id.
active_trial.countystringalways present- The trial county's name.
active_trial.fipsstringalways present- Its 5-digit FIPS code.
active_trial.expires_atstring (date-time)always present- When it ends.
previousobject or nullalways present- The person's latest earlier trial when
reasoniscooldownoreligible; null otherwise. previous.idstring (uuid)always present- The trial id.
previous.countystringalways present- Its county's name.
previous.fipsstringalways present- Its 5-digit FIPS code.
previous.started_atstring (date-time)always present- When it started.
previous.ended_atstring (date-time) or nullalways present- When it ended; null when it lapsed without being marked.
cooldown_daysnullalways present- Always null (not stated to customers).
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).
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), not_found (404), rate_limited (429). Every problem is a problem document.
POST /v2/account/trial
Start a one-county trial
Credentials: API key or App session. Operation id acctStartTrial.
Either credential (an API key or a session); resolves the caller's active organization (X-DTG-Org). Any role; needs a verified email address. The trial runs in the person's OWN organization whichever organization the request acts in, for rules.trial_days days: the county is added to it and every paid capability is unlocked for that county (full depth, quarterly, earlier vintages, export of that county), but not API access. A confirmation mail and a trial_started notification are sent. One trial per person: once one has run, the answer is 409 trial_cooldown, "A trial has already run for this person."
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.
fipsstringrequired- One 5-digit county FIPS code (for example
22071). (pattern ^[0-9]{5}$)
Responses
201 success
The trial.
As application/json.
trial_idstring (uuid)always present- The trial id.
countystringalways present- The county's name.
fipsstringalways present- Its 5-digit FIPS code.
expires_atstring (date-time)always present- When the trial ends.
reactivatedbooleanalways present- Always false on this route (true only for a trial DTG grants that restores an earlier county).
organization_idstring (uuid) or nullalways present- The organization the trial runs in when it is the active one; null when the request acted in another organization (the trial always runs in the person's OWN organization).
notestringalways present- Says that the trial runs in the person's own organization.
400 error
Bad Request. Codes: bad_request (fips is missing or not one 5-digit code, or names no county), 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), email_unverified (verify the email address first). 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: trial_active (a trial is running; the body carries trial), trial_cooldown (A trial has already run for this person. eligible_again_at is null).
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, 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), email_unverified (403), sandbox_read_only (403), not_found (404), trial_active (409), trial_cooldown (409), body_too_large (413), rate_limited (429). Every problem is a problem document.
POST /v2/account/trial/cancel
End the running trial
Credentials: API key or App session. Operation id acctCancelTrial.
Either credential (an API key or a session); resolves the caller's active organization (X-DTG-Org). Any role. Takes no body. Ends the person's running trial (cancelled) and removes the trial county from their own organization.
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
204 success
No Content.
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). 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), not_found also when the person has no running trial.
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, 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: malformed_json (400), key_revoked (401), unauthenticated (401), 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), rate_limited (429). Every problem is a problem document.
GET /v2/email/unsubscribe
Stop product (marketing) email
Credentials: none. Operation id acctUnsubscribe.
Anonymous: the link in a product mail. D40: sets the token's account to opted out at once; idempotent. Transactional mail continues. Not rate limited.
Parameters
tokenquery · stringrequired- The unsubscribe token from the mail's link.
Responses
200 success
Unsubscribed: a one-line plain-text confirmation naming the address.
As text/plain.
Problem codes: bad_request (400), not_found (404). Every problem is a problem document.
Generated from taigan/openapi.yaml at catahoula 77925fab712f(API document version 2.0).