Notifications & workspace
6 endpoints, generated from the API's own OpenAPI document. The in-app notifications and the app's saved workspace.
GET /v2/account/workspace
The autosaved workspace
Credentials: API key or App session. Operation id acctGetWorkspace.
Either credential (an API key or a session); resolves the caller's active organization (X-DTG-Org). Any role. D53: the person's own saved state for the active organization (switching organization switches workspace; nobody reads anyone else's). Not paused by a past-due balance.
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 stored object, or null when none was ever saved.
As application/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).
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.
PUT /v2/account/workspace
Save the workspace
Credentials: API key or App session. Operation id acctPutWorkspace.
Either credential (an API key or a session); resolves the caller's active organization (X-DTG-Org). Any role. Stores the object as given (last write wins) and echoes it back.
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.
Responses
200 success
The stored object.
As application/json.
400 error
Bad Request. Codes: workspace_invalid (the body is not a JSON object), workspace_too_large (over 32 KB serialized; the body carries max_bytes), 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 64 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: workspace_invalid (400), workspace_too_large (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/notifications
The bell: this person's notifications in the active organization
Credentials: API key or App session. Operation id acctListNotifications.
Either credential (an API key or a session); resolves the caller's active organization (X-DTG-Org). Any role. D54: one bell per person per organization, newest first, at most 200, with the unread badge. Each row carries its facts (kind, payload) and the words rendered from them now. Poll it; there is no push.
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 bell.
As application/json.
dataarray of AcctNotificationalways present- Undismissed notifications, newest first, at most 200 (90-day retention).
data[].idstring (uuid)always present- The notification id.
data[].kindstringalways present- What happened. Known kinds:
vintage_release,vintage_withdrawn,county_window_opening,county_batch_applied,api_limit_hit,payment_failed,payment_recovered,plan_changed,plan_reset_at_switch,downgrade_applied,seat_granted,seat_removed,member_left,member_departed,join_request,join_decision,ownership_claim,trial_started,trial_expiring,announcement,new_device,password_changed,org_suspended,account_suspended,account_unsuspended,composite_shed,keys_revoked,support_reply. A kind not in this list may appear; it still renders a generic title and body. data[].groupstringalways present- The bell's group for it:
Data,Counties,Keys,Billing,Members,AccountorAnnouncements. data[].titlestringalways present- One-line title.
data[].bodystringalways present- The sentence.
data[].actionobject- The one action that resolves it, when there is one (absent otherwise).
data[].action.labelstringalways present- Button label.
data[].action.tostringalways present- A route in DTG's web app (for example
/account/billing). A client that does not use the app readspayloadinstead. data[].emailedbooleanalways present- True when the same fact was also sent by email.
data[].created_atstring (date-time)always present- When it was written.
data[].read_atstring (date-time) or nullalways present- When it was marked read; null while unread.
data[].payloadAcctNotificationPayloadVintageRelease or AcctNotificationPayloadVintageWithdrawn or AcctNotificationPayloadCountyWindowOpening or AcctNotificationPayloadCountyBatchApplied or AcctNotificationPayloadApiLimitHit or AcctNotificationPayloadPaymentFailed or AcctNotificationPayloadPaymentRecovered or AcctNotificationPayloadPlanChanged or AcctNotificationPayloadDowngradeApplied or AcctNotificationPayloadSeatGranted or AcctNotificationPayloadSeatRemoved or AcctNotificationPayloadMemberLeft or AcctNotificationPayloadMemberDeparted or AcctNotificationPayloadJoinRequest or AcctNotificationPayloadJoinDecision or AcctNotificationPayloadOwnershipClaim or AcctNotificationPayloadTrialStarted or AcctNotificationPayloadTrialExpiring or AcctNotificationPayloadAnnouncement or AcctNotificationPayloadNewDevice or AcctNotificationPayloadPasswordChanged or AcctNotificationPayloadOrgSuspended or AcctNotificationPayloadAccountSuspended or AcctNotificationPayloadAccountUnsuspended or AcctNotificationPayloadCompositeShed or AcctNotificationPayloadKeysRevoked or AcctNotificationPayloadSupportReplyalways present- The structured facts, by
kind(one schema per kind below). Never a secret. data[].payload.vintagestring- The new current vintage id.
data[].payload.labelstring- Its display label.
data[].payload.supersededobject- Present only when this release corrects a build the organization exported from.
data[].payload.superseded.vintagestringalways present- The corrected (withdrawn) vintage id.
data[].payload.superseded.labelstringalways present- Its display label.
data[].payload.superseded.exportsintegeralways present- How many exports (API, CSV, XLSX) the organization made from it.
data[].payload.currentstring- The vintage now current.
data[].payload.current_labelstring- Its display label.
data[].payload.withdrawn_atstring- When the withdrawal was recorded (ISO 8601).
data[].payload.was_currentboolean- True when the withdrawn build was the current vintage.
data[].payload.exportedobject- Present only for an organization that exported from the withdrawn build.
data[].payload.exported.exportsintegeralways present- How many exports (API, CSV, XLSX) it made from it.
data[].payload.anchor_dayinteger- The organization's anchor day of the month.
data[].payload.effective_onstring (date)- The next anchor date (YYYY-MM-DD), when changes made now take effect.
data[].payload.removedinteger- Counties removed.
data[].payload.change_idstring (uuid)- The scheduled change's id.
data[].payload.limit"points" | "rate" | "csv" | "api"- Which limit:
points(the monthly points allowance) orrate(the per-minute ceiling).csvandapiare reserved for re-armed monthly quotas. data[].payload.api_key_idstring (uuid)- The refused key's id; absent when the request was not made with a key.
data[].payload.key_namestring- The key's name (T108: written whenever the refusal was a key's).
data[].payload.orgstring- The organization's name.
data[].payload.recovered_atstring (date-time)- When the recovery was recorded.
data[].payload.changesarray of AcctPlanChangeItem- What changed now, in the Billing screen's order. Empty when the request only scheduled a change.
data[].payload.changes[].item"plan" | "seats" | "counties" | "api"always presentdata[].payload.changes[].beforealways present- The value before the change.
data[].payload.changes[].afteralways present- The value after it.
data[].payload.effective_atstring (date-time) or null- When the changes in
changestook effect; null when there are none. data[].payload.scheduledobject or null- What the request scheduled for the end of the billing period; null when nothing.
data[].payload.scheduled.changesarray of AcctPlanChangeItemalways present- The changes scheduled.
data[].payload.scheduled.changes[].item"plan" | "seats" | "counties" | "api"always presentdata[].payload.scheduled.changes[].beforealways present- The value before the change.
data[].payload.scheduled.changes[].afteralways present- The value after it.
data[].payload.scheduled.effective_atstring (date-time) or nullalways present- The end of the current billing period, when they take effect.
data[].payload.planstring- The new plan's display name.
data[].payload.detailstring- A sentence: how many counties were read-locked and members became free members.
data[].payload.reasonstring- Why the composite ran (an internal label).
data[].payload.emailstring- The leaver's email address.
data[].payload.role"owner" | "admin" | "member"- The role they held.
data[].payload.request_idstring (uuid)- The join request's id (approve or deny it under
/v2/account/join-requests). data[].payload.approvedboolean- True when approved (the only value written today; a denial writes no notification).
data[].payload.claimantstring- The claimant's email address.
data[].payload.completes_atstring (date)- The date the claim completes unless an owner signs in first (YYYY-MM-DD).
data[].payload.countystring- The trial county's name.
data[].payload.fipsstring- Its 5-digit FIPS code.
data[].payload.expires_atstring (date)- The trial's last date (YYYY-MM-DD).
data[].payload.titlestring- The announcement's title.
data[].payload.bodystring- The announcement's text.
data[].payload.announcement_idstring (uuid)- The announcement's id.
data[].payload.keysarray of AcctNotificationKeyListed- The person's active API keys when the password changed, every organization (empty when none; absent on rows written before T110).
data[].payload.keys[].namestringalways present- The key's name.
data[].payload.keys[].key_prefixstringalways present- The key's first characters.
data[].payload.keys[].key_last4string or nullalways present- The key's last four characters; null for a key minted before T110.
data[].payload.keys[].modestringalways presentliveorsandbox.data[].payload.keys[].organizationstring- The organization the key belongs to (password_changed only).
data[].payload.keys[].created_atstring (date-time)- When it was minted (password_changed only).
data[].payload.keys[].last_used_atstring (date-time) or null- When it last authenticated a request; null if never (password_changed only).
data[].payload.keys[].holderstring or null- The holder's address (keys_revoked only).
data[].payload.shedinteger- Counties released (read-locked).
data[].payload.countinteger- How many keys.
data[].payload.ticket_idstring (uuid)- The support request's id.
data[].payload.ticket_refstring- Its first eight characters, as the mails name it.
unreadintegeralways present- The badge: unread, undismissed notifications in total (may exceed what
dataholds).
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/notifications/read-all
Mark every notification read
Credentials: API key or App session. Operation id acctReadAllNotifications.
Either credential (an API key or a session); resolves the caller's active organization (X-DTG-Org). Any role. Takes no body. Marks every unread, undismissed notification of this person in the active organization read.
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
How many were marked.
As application/json.
readintegeralways present- Notifications newly marked read.
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).
As application/problem+json.
413 error
Payload Too Large. Codes: body_too_large (the body is over this endpoint's 8 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.
POST /v2/account/notifications/{id}/read
Mark one notification read
Credentials: API key or App session. Operation id acctReadNotification.
Either credential (an API key or a session); resolves the caller's active organization (X-DTG-Org). Any role. Takes no body. Idempotent: an already-read notification keeps its first read_at. Another person's notification is indistinguishable from one that does not exist.
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.
idpath · string (uuid)required- The notification id.
Responses
200 success
The notification's id and read time.
As application/json.
idstring (uuid)always present- The notification id.
read_atstring (date-time)always present- When it was (first) marked read.
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), notification_not_found (no such notification for this person in this organization; also a non-uuid id answers not_found).
As application/problem+json.
413 error
Payload Too Large. Codes: body_too_large (the body is over this endpoint's 8 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), notification_not_found (404), body_too_large (413), rate_limited (429). Every problem is a problem document.
POST /v2/events
Record screens opened in the app
Credentials: App session. Operation id postProductEvents.
T166: the app's event client posts the screens a person opens, in batches. A signed-in session only: an API key is refused (session_required). Each event is {name: screen_opened, route}, where route is the app's route family (/explore/table, /clusters/:id), never a full path; the time, organization, account and plan are the server's. Every other product event (tables, exports, API calls, the sign-up funnel, the assistant) Taigan records where it happens. While PRODUCT_EVENTS is off (rules.product_events), a batch is accepted and nothing is written (recorded 0). Writes no audit row.
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.
Request body
Required; application/json.
eventsarray of objectrequired- 1 to 50 events.
events[].name"screen_opened"required- The only event a client sends.
events[].routestringrequired- The route family. (pattern ^/[a-z0-9/:_-]{0,63}$)
Responses
202 success
Accepted.
As application/json.
recordedinteger- Events written (0 while
PRODUCT_EVENTSis off). product_events"on" | "off"- The switch.
400 error
Bad Request. Codes: events_invalid (not 1 to 50 events of name screen_opened and a route family; index names the first bad entry), malformed_json.
As application/problem+json.
401 error
Unauthorized. Codes: unauthenticated (no session, or the session is not live).
As application/problem+json.
403 error
Forbidden. Codes: session_required (an API key), no_membership, account_suspended, org_suspended, org_closed, terms_acceptance_required.
As application/problem+json.
429 error
Too Many Requests. Only rate_limited here, from this route's own ceiling (20 batches a minute per account, with Retry-After); a batch never spends the per-credential or per-organization ceilings of the other routes.
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: events_invalid (400), malformed_json (400), unauthenticated (401), session_required (403), no_membership (403), account_suspended (403), org_suspended (403), org_closed (403), terms_acceptance_required (403), rate_limited (429). Every problem is a problem document.
Generated from taigan/openapi.yaml at catahoula 77925fab712f(API document version 2.0).