Skip to content

API reference · schemas

The schemas

359 named shapes the operations share. A request body or a response names one of these, and the operation pages link here.

Problem object

NameTypeRequiredDescription
typestring (uri) optional
titlestring optional
statusinteger required
codestring requiredA stable, machine-readable error code (part of the contract).
detail_codestring optionalThe message code for localisation in the client.
paramsobject optional
field_errorsarray of object optional
request_idstring optional
docsstring (uri) optional

PageInfo object

NameTypeRequiredDescription
next_cursorstring, or null requiredThe cursor for the next page, null on the last one.
has_moreboolean required

ContainerPage object

NameTypeRequiredDescription
dataarray of Container required
pagePageInfo required

ItemSearchQuery object

One search of the whole workspace, or of one hub or collection. At least one of `q` and `filter` - a request with neither is refused by search.words_required, because "everything" is not a question this API answers. filter is the same grammar POST /items:query takes, with the same closed field vocabulary, the same operators and the same bounds. The difference between the two endpoints is not the grammar, it is the anchor: a query is anchored to a container because an unanchored one is a question authorisation cannot answer in one step, and a search is the one read where "where is this, anywhere" is the question - so it is read and then narrowed to what the caller may see, and its page may be short where a query's would be a refusal. It searches by words and, where the installation can, by meaning. The two are one ranked page with one cursor: a hit on the words somebody typed outranks one that is merely about the same subject, so an exact identifier is still found first, and an entry that shares no word with the query is found at all. mode says how much of that to use, and defaults to AUTO - the two halves where the installation has both. Semantic search is optional four times over: the database may not carry pgvector, the workspace may have configured no AI provider or not consented to it, and the provider may not answer in the second somebody is waiting. Every one of those is a lexical search rather than an error, which is why there is no SEMANTIC value to ask for - it would be a mode the server could not promise. /meta/capabilities answers semantic_search for a client that wants to say in its interface which it has.

NameTypeRequiredDescription
qstring
  • minLength: 1
  • maxLength: 200
optionalWhat to look for.
container_idstring (uuid), or null optionalThe hub or collection to search in.
languagestring, or null optionalBCP-47.
modeSearchMode
  • AUTO
  • LEXICAL
  • default: "AUTO"
optionalHow much of the search to use.
filterFilterNode optionalNarrows the search, in the grammar POST /items:query uses: the fields /meta/capabilities names, the operators each one permits, at most five levels of nesting and fifty nodes, and the same cost estimate capped at 50.
sortarray of SortTerm
  • maxItems: 4
optionalOnly meaningful without q: with words there is a ranking and it is the ranking.
include_archivedboolean
  • default: false
optional
include_trashedboolean
  • default: false
optional
pageobject optional

SearchMode string

How much of the search to use. AUTO is the default and searches by words and, where the installation has it, by meaning. LEXICAL searches by words only: it asks no provider, spends no budget and waits on nothing, which is what a caller in a loop - an automation, an import, a client's own type-ahead - wants. There is deliberately no SEMANTIC: an installation may not have it, and a mode the server cannot promise is a mode that would have to fail.

  • AUTO
  • LEXICAL
  • default: "AUTO"

WorkItemPage object

NameTypeRequiredDescription
dataarray of WorkItem required
pagePageInfo required

ContainerType string

  • HUB
  • COLLECTION

ItemType string

Extensible; /meta/capabilities returns the valid values.

  • TASK
  • WORK_PACKAGE
  • ACTIVITY

Account object

NameTypeRequiredDescription
idstring (uuid) required
kindstring
  • USER
  • SERVICE_ACCOUNT
required
emailstring (email), or null optional
sign_in_namestring, or null
  • minLength: 3
  • maxLength: 32
optionalWhat a managed account signs in with instead of an address: unique in the workspace, stored folded (compatibility form, lower case).
display_namestring
  • minLength: 1
  • maxLength: 200
required
statusstring
  • ACTIVE
  • INVITED
  • DISABLED
  • RESTRICTED
  • ANONYMIZED
requiredRESTRICTED is Art.
localestring, or null optional
time_zonestring, or null optional
week_startstring, or null
  • MONDAY
  • SUNDAY
  • SATURDAY
  • null
optional
celebrationsboolean, or null optionalWhether the moments are marked for this person - a small celebration when work is completed.
onboarding_completed_atstring (date-time), or null optionalWhen the person finished or skipped the first-run tour.
has_second_factorboolean optionalWhether an armed second factor stands on this account, answered on GET /accounts/me and on nothing else.
recovery_codes_remaininginteger optionalHow many of the ten recovery codes are still usable, answered on GET /accounts/me and on nothing else.
second_factor_requiredboolean optionalWhether the workspace's sign-in rule in force demands a second factor of this person, answered on GET /accounts/me and on nothing else.
has_passwordboolean optionalWhether this account holds a password, answered on GET /accounts/me and on nothing else.
has_accessboolean optionalWhether this account holds a role anywhere in the workspace - on the workspace, a hub, a collection or one entry, directly or through a group - answered on GET /accounts/me and on nothing else.

Actor object

Who did something. The label is not here: the account is one request away (GET /accounts/{accountId}) and the records that carry an actor are deleted with the thing they are about, so there is nothing for a copy of somebody's name to outlive. An identifier is absent where an account is: an automation and the system act without one, and the kind is what says so. ActivityEntry.actor is the same shape written inline - it keeps its own spelling rather than being pointed here, because changing it would rename a generated type for no behavioural gain.

NameTypeRequiredDescription
typestring
  • USER
  • SERVICE_ACCOUNT
  • AUTOMATION
  • AI_AGENT
  • SYSTEM
required
idstring (uuid), or null required

AccountSummary object

An account as another member of the same tenant may see it: enough to render a name where a record carries an identifier, and nothing else. Deliberately not Account - that carries the email and the caller's own preferences, which are a different permission.

NameTypeRequiredDescription
idstring (uuid) required
kindstring
  • USER
  • SERVICE_ACCOUNT
required
display_namestring
  • minLength: 1
  • maxLength: 200
requiredAn erased account carries the marker its erasure wrote here, so a reader sees that somebody acted without learning who they were.
statusstring
  • ACTIVE
  • INVITED
  • DISABLED
  • RESTRICTED
  • ANONYMIZED
required
has_addressboolean optionalFalse for an account that has no mail address - a managed account - so a screen can say that a reminder by mail does not reach this person, instead of letting it fail silently.
managedboolean optionalTrue for a managed account: a sign-in name and no address.

ManagedAccountCreate object

NameTypeRequiredDescription
display_namestring
  • minLength: 1
  • maxLength: 200
required
sign_in_namestring required3 to 32 characters after folding (compatibility form, lower case, trimmed); no @, no whitespace and no control character.
roleMembershipRole
  • OWNER
  • ADMIN
  • MEMBER
  • CONTRIBUTOR
  • VIEWER
  • GUEST
  • AUDITOR
requiredAUDITOR is the one that is not a rung on the same ladder: it reads the audit trail and the configuration and no content at all.
scope_typeMembershipScope
  • TENANT
  • HUB
  • COLLECTION
  • ITEM
required
scope_idstring (uuid), or null optionalAbsent for TENANT; the hub, collection or entry otherwise.

ManagedAccountCreated object

NameTypeRequiredDescription
accountAccount required
membershipMembership required
start_passwordstring requiredShown here and never again.

StartPasswordIssued object

NameTypeRequiredDescription
accountAccount required
start_passwordstring requiredShown here and never again.

AddressRequest object

NameTypeRequiredDescription
emailstring (email)
  • maxLength: 254
required

AddressRequested object

NameTypeRequiredDescription
expires_atstring (date-time) requiredUntil when the link in the mail confirms the address.

AddressConfirm object

NameTypeRequiredDescription
tokenstring requiredThe token from the confirmation mail.

InvitedAccount Account

NameTypeRequiredDescription
idstring (uuid) required
kindstring
  • USER
  • SERVICE_ACCOUNT
required
emailstring (email), or null optional
sign_in_namestring, or null
  • minLength: 3
  • maxLength: 32
optionalWhat a managed account signs in with instead of an address: unique in the workspace, stored folded (compatibility form, lower case).
display_namestring
  • minLength: 1
  • maxLength: 200
required
statusstring
  • ACTIVE
  • INVITED
  • DISABLED
  • RESTRICTED
  • ANONYMIZED
requiredRESTRICTED is Art.
localestring, or null optional
time_zonestring, or null optional
week_startstring, or null
  • MONDAY
  • SUNDAY
  • SATURDAY
  • null
optional
celebrationsboolean, or null optionalWhether the moments are marked for this person - a small celebration when work is completed.
onboarding_completed_atstring (date-time), or null optionalWhen the person finished or skipped the first-run tour.
has_second_factorboolean optionalWhether an armed second factor stands on this account, answered on GET /accounts/me and on nothing else.
recovery_codes_remaininginteger optionalHow many of the ten recovery codes are still usable, answered on GET /accounts/me and on nothing else.
second_factor_requiredboolean optionalWhether the workspace's sign-in rule in force demands a second factor of this person, answered on GET /accounts/me and on nothing else.
has_passwordboolean optionalWhether this account holds a password, answered on GET /accounts/me and on nothing else.
has_accessboolean optionalWhether this account holds a role anywhere in the workspace - on the workspace, a hub, a collection or one entry, directly or through a group - answered on GET /accounts/me and on nothing else.
invitation_linkstring (uri) optionalPresent only where this installation sends no mail: the link that accepts the invitation, the same one a mail would carry.

AccountInvite object

NameTypeRequiredDescription
emailstring (email)
  • maxLength: 254
required
display_namestring, or null
  • maxLength: 200
optional

AccountPreferences object

Every field is optional, and an empty string clears the preference rather than setting it to nothing — the workspace default applies again. The two the client writes for itself clear the same way, with null: celebrations back to the default, which is on; onboarding_completed_at back to "not taken", which runs the tour again.

NameTypeRequiredDescription
localestring, or null optional
time_zonestring, or null optional
week_startstring, or null
  • MONDAY
  • SUNDAY
  • SATURDAY
  • null
optional
celebrationsboolean, or null optionalWhether the moments are marked.
onboarding_completed_atstring (date-time), or null optionalWhen the tour ended or was skipped, written by the client.

NotificationPreference object

NameTypeRequiredDescription
categorystring required
channelstring required
enabledboolean required
include_titleboolean requiredWhether an email of this category names the entry it is about.
is_defaultboolean requiredTrue when nobody has written this pair and the value is the installation's default.
updated_atstring (date-time), or null required

NotificationPreferenceList object

NameTypeRequiredDescription
dataarray of NotificationPreference required

NotificationPreferenceUpdate object

NameTypeRequiredDescription
enabledboolean required
include_titleboolean required

ServiceAccountCreate object

NameTypeRequiredDescription
display_namestring
  • minLength: 1
  • maxLength: 200
requiredWhat the audit trail records next to the identifier.

AccessToken object

A minted credential as it is listed afterwards. The token itself is not a member: it exists in the answer to the call that minted it and nowhere else.

NameTypeRequiredDescription
idstring (uuid) required
account_idstring (uuid) requiredWhose credential it is, and therefore whose rights bound it.
namestring
  • minLength: 1
  • maxLength: 200
required
scopesarray of string requiredThe second bound on what the token may do, on top of the role its holder carries.
expires_atstring (date-time) required
created_atstring (date-time) required
last_used_atstring (date-time), or null optionalWhen a request last presented it, to the minute rather than to the request - the value exists so an owner can spot a credential nobody uses, and writing it on every call would be a write per request.
revoked_atstring (date-time), or null optionalWhen it was withdrawn.

AccessTokenCreate object

NameTypeRequiredDescription
namestring
  • minLength: 1
  • maxLength: 200
requiredWhat this token is for, in the owner's own words.
scopesarray of string requiredRequested explicitly, never defaulted to everything.
expires_atstring (date-time) requiredMandatory, in the future, and at most a year out.
account_idstring (uuid), or null optionalWhose token.

AccessTokenSecret AccessToken

NameTypeRequiredDescription
idstring (uuid) required
account_idstring (uuid) requiredWhose credential it is, and therefore whose rights bound it.
namestring
  • minLength: 1
  • maxLength: 200
required
scopesarray of string requiredThe second bound on what the token may do, on top of the role its holder carries.
expires_atstring (date-time) required
created_atstring (date-time) required
last_used_atstring (date-time), or null optionalWhen a request last presented it, to the minute rather than to the request - the value exists so an owner can spot a credential nobody uses, and writing it on every call would be a write per request.
revoked_atstring (date-time), or null optionalWhen it was withdrawn.
tokenstring requiredThe credential, in clear, for the only time.

SignIn object

Exactly one of identifier and email; neither, or both, is auth.identifier_one. A refusal of the shape, the same for everybody - nothing in it depends on who exists.

NameTypeRequiredDescription
identifierstring
  • minLength: 1
  • maxLength: 254
optionalThe address the account signs in with, or its sign-in name where it has one instead (a managed account).
emailstring (email)
  • maxLength: 254
optionalThe address, for a client that knows only addresses.
passwordstring
  • maxLength: 1024
requiredChecked in constant shape against the stored Argon2id hash.

SessionRefresh object

NameTypeRequiredDescription
refresh_tokenstring requiredThe one being exchanged.

InvitationRedemption object

NameTypeRequiredDescription
tokenstring requiredThe redemption token from the invitation, shown once and usable once.
passwordstring
  • minLength: 12
  • maxLength: 1024
requiredThe first password, under the workspace's password policy.
terms_urlstring, or null
  • maxLength: 2000
optionalThe terms of use the person agreed to on the invitation card - the terms_url of GET /auth/sign-in-rules as it was shown.
terms_versionstring, or null
  • maxLength: 64
optionalThe version of those terms as it was shown, where the terms carry one.

InvitationInspection object

NameTypeRequiredDescription
tokenstring requiredThe redemption token from the invitation.

InvitationSummary object

What the invitation card names before anything is typed.

NameTypeRequiredDescription
workspace_namestring requiredThe display name of the workspace the person was invited to.
emailstring requiredThe address the invitation went to - the one a provider has to confirm.

InstallationSetUp object

NameTypeRequiredDescription
codestring
  • maxLength: 64
requiredThe setup code the server printed at start.
display_namestring
  • minLength: 1
  • maxLength: 200
requiredThe workspace's name.
slugstring optionalMulti mode only, and required there: the subdomain the workspace answers on, 3-40 characters of lower-case letters, digits and hyphens.
owner_emailstring
  • maxLength: 320
requiredThe owner's address.
owner_display_namestring
  • maxLength: 200
optionalThe owner's name; the address stands in when it is omitted.
passwordstring
  • minLength: 12
  • maxLength: 1024
requiredThe owner's password, under the product's password policy.
default_localestring optionalBCP 47; the installation's default when omitted.
default_time_zonestring optionalAn IANA name; the installation's default when omitted.

Session object

A sign-in somebody can see and revoke. The client hint is what was recorded at sign-in - a user agent and an IP class, enough to recognise one's own devices and deliberately not a precise address.

NameTypeRequiredDescription
idstring (uuid) required
created_atstring (date-time) required
last_used_atstring (date-time), or null optionalWhen the session last acted, to the minute rather than to the request - the value exists so a person can spot a session nobody uses.
user_agentstring, or null
  • maxLength: 400
optionalThe client that signed in, as it introduced itself.
ip_classstring, or null optionalThe network the sign-in came from, coarsened at recording time - an IPv4 /24 or an IPv6 /48, never the full address.
currentboolean requiredWhether this session is the one answering the call.
signed_in_withstring, or null
  • PASSWORD
  • PASSWORD_TOTP
  • PASSWORD_RECOVERY
  • OIDC
  • INVITATION
  • RESET
  • null
optionalHow this session was opened.
signed_in_providerstring, or null optionalFor a session a sign-in provider opened, that provider's name, so a person can tell their sessions apart by the way in.

SessionTokens object

The pair and its session, shown for the only time. What is stored of the refresh token is a hash under its own purpose label; the access token is not stored at all - it verifies by its signature.

NameTypeRequiredDescription
token_typestring
  • Bearer
required
access_tokenstring requiredFifteen minutes, presented as the bearer credential on every call.
access_token_expires_atstring (date-time) required
refresh_tokenstring requiredThirty days, single use: the exchange at /auth/sessions:refresh retires it and answers the next one.
refresh_token_expires_atstring (date-time) required
sessionSession requiredA sign-in somebody can see and revoke.
recovery_codes_remaininginteger, or null optionalPresent exactly when a recovery code completed this sign-in: how many remain.

AccountsWithoutProvider object

How many active people of the workspace no provider switched on there signs in. A number, never a list.

NameTypeRequiredDescription
countinteger
  • minimum: 0
requiredThe active people - service accounts and invitations aside - without an identity at any provider that is a way in here now.

OidcStart object

What a sign-in through the identity provider needs to begin, which is almost nothing: the workspace comes from the subdomain or the tenant header, and the redirect URI is this installation's own. A caller with nothing to add may omit the body entirely.

NameTypeRequiredDescription
provider_idstring (uuid), or null optionalWhich way in to use, from GET /auth/sign-in-rules.
login_hintstring, or null optionalAn address to pass the provider as login_hint, so somebody who typed it here does not type it again.
invitation_tokenstring, or null optionalThe redemption token of the invitation this sign-in accepts, when the person chose the provider on the invitation card.
connect_tokenstring, or null optionalThe token of the link Forgot your password?
terms_urlstring, or null
  • maxLength: 2000
optionalWith invitation_token: the terms of use the person agreed to on the invitation card, as GET /auth/sign-in-rules showed them.
terms_versionstring, or null
  • maxLength: 64
optionalThe version of those terms as it was shown, where they carry one.

OidcAuthorization object

Where to send the browser, and the handle to finish with.

NameTypeRequiredDescription
authorization_urlstring (uri) requiredThe provider's authorization endpoint with this flow's parameters, including the PKCE challenge.
statestring requiredThe flow's handle, single use.
expires_atstring (date-time) requiredWhen this flow stops being answerable.

OidcCallback object

What the provider's redirect carried back.

NameTypeRequiredDescription
codestring requiredThe authorization code, exchanged once, at the provider's token endpoint.
statestring requiredThe handle /auth/oidc:start answered.

Suggestion object

One thing AI proposed about one entry, with its provenance. It has changed nothing: what a suggestion is, is a record.

NameTypeRequiredDescription
idstring (uuid) required
target_typeSuggestionTargetType
  • WORK_ITEM
  • JUMBLE_ENTRY
  • CONTAINER
requiredWhat the suggestion is about.
target_idstring (uuid) required
kindSuggestionKind
  • FIELDS
  • DECOMPOSITION
  • DUPLICATES
  • TEMPLATE
requiredWhat accepting does, which is the only thing a kind has to say.
statusSuggestionStatus
  • PROPOSED
  • ACCEPTED
  • DISMISSED
requiredDISMISSED is a state and not a deletion, so "what was proposed and turned down" has an answer; the retention engine ages both decided states out by rule.
payloadobject requiredWhat was proposed, in the shape the kind fixes.
sourcestring
  • AI
requiredWhere the proposal came from.
modelstring requiredThe model that answered, as the provider named it — not as it was configured.
prompt_idstring required
prompt_versionstring requiredWhich version of the prompt produced this.
produced_atstring (date-time) requiredWhen the provider answered, which is not when the record was written.
created_atstring (date-time) required
decided_atstring (date-time), or null optionalWhen it was accepted or dismissed.
decided_bystring (uuid), or null optionalWho accepted or dismissed it.
dropped_nodesinteger
  • minimum: 0
optionalHow many parts of the provider's answer the narrowing dropped before the payload was stored, so that a client can say the draft is not the whole answer.
versioninteger requiredThe optimistic lock, as everywhere else.

AiTranslateRequest object

Which language to read the entry in.

NameTypeRequiredDescription
target_localestring optionalBCP 47 (de, pt-BR).

AiTranslation object

The entry's title and notes as the provider rendered them in the target language, with the provenance every AI output carries. Not a record: it has no id, no status and nothing to accept, because it is not stored anywhere.

NameTypeRequiredDescription
target_localestring required
source_languagestring, or null optionalThe entry's content_language, which is what the provider was told the source is; null where the entry states none.
titlestring required
notesstring requiredEmpty where the entry has no notes.
sourcestring
  • AI
required
modelstring required
prompt_idstring required
prompt_versionstring required
produced_atstring (date-time) required

AiAsk object

How to ask, which is one question — propose, or apply.

NameTypeRequiredDescription
applyboolean
  • default: false
optionalApply the answer as soon as it arrives instead of proposing it.

SuggestionAcceptance object

What the person changed or added before accepting. Merged over the proposal; every value is checked by the use case that performs the change, with the accepting person's rights.

NameTypeRequiredDescription
overridesobject optionalFields of the proposal to replace or add.

SuggestionPage object

NameTypeRequiredDescription
itemsarray of Suggestion required
next_cursorstring, or null optional
has_moreboolean required

SuggestionTargetType string

What the suggestion is about. CONTAINER is a collection rather than an entry: a summary of how it stands is about the collection, and nothing accepts one — a collection has nowhere to put a status summary, so it is read and dismissed.

  • WORK_ITEM
  • JUMBLE_ENTRY
  • CONTAINER

SuggestionKind string

What accepting does, which is the only thing a kind has to say. FIELDS proposes values for the target entry; DECOMPOSITION proposes a tree of entries under it. A summary and a classification are FIELDS suggestions whose payload happens to be notes or labels — they are not kinds of their own, because accepting them is the same act. TEMPLATE proposes a template for the collection it targets: its payload is a TemplateInput, and accepting it is CreateTemplate performed by the accepting person. DUPLICATES is the one kind nothing accepts. It says which entries look like this one, and what to do about that is a person's decision through the ordinary use cases — :accept refuses it and :dismiss closes it. It is also the one kind no prompt produced, so its prompt_id and prompt_version are empty and its model names the embedding model whose vectors were compared.

  • FIELDS
  • DECOMPOSITION
  • DUPLICATES
  • TEMPLATE

SuggestionStatus string

DISMISSED is a state and not a deletion, so "what was proposed and turned down" has an answer; the retention engine ages both decided states out by rule.

  • PROPOSED
  • ACCEPTED
  • DISMISSED

AiProvider object

How this workspace uses AI, if it does. The API key is not a member: it is sealed at configuration time and opened only by the adapter that makes the call.

NameTypeRequiredDescription
kindAiProviderKind
  • NOOP
  • OPENAI_COMPATIBLE
  • OLLAMA
requiredWhich adapter answers.
base_urlstring (uri) optionalThe endpoint the adapter calls.
completion_modelstring optionalThe model a suggestion is asked of.
embedding_modelstring optionalThe model a vector is asked of.
jurisdictionAiJurisdiction
  • SELF_HOSTED
  • EEA
  • ADEQUACY
  • THIRD_COUNTRY
requiredWhere the provider processes what is sent to it, as the operator declares it.
has_api_keyboolean requiredWhether a key is stored, which is the whole of what this surface says about one.
processing_allowedboolean requiredWhether this workspace's content may be sent to the provider at all (ai_processing_allowed).
created_atstring (date-time) required
updated_atstring (date-time), or null optional
versioninteger requiredThe optimistic lock, as everywhere else.

AiProviderConfiguration object

The provider, set whole. A half-changed provider is one nobody can reason about, and the endpoint, the models and the key have to agree with each other.

NameTypeRequiredDescription
kindAiProviderKind
  • NOOP
  • OPENAI_COMPATIBLE
  • OLLAMA
requiredWhich adapter answers.
base_urlstring (uri) optionalRequired for every kind but NOOP, which calls nothing.
completion_modelstring optional
embedding_modelstring optional
api_keystring optionalSealed on the way in and answered by nothing afterwards.
jurisdictionAiJurisdiction
  • SELF_HOSTED
  • EEA
  • ADEQUACY
  • THIRD_COUNTRY
requiredWhere the provider processes what is sent to it, as the operator declares it.
processing_allowedboolean
  • default: false
optionalDefaults to false.

OfferedAiModel object

An AI model the installation offers every workspace, as the operator reads it. A workspace is answered only its name, processor and jurisdiction (AiSource.offered).

NameTypeRequiredDescription
idstring (uuid) required
display_namestring required
processorstring required
kindAiProviderKind
  • NOOP
  • OPENAI_COMPATIBLE
  • OLLAMA
requiredWhich adapter answers.
base_urlstring (uri) optional
completion_modelstring optional
embedding_modelstring optional
has_api_keyboolean requiredWhether a key is stored.
jurisdictionAiJurisdiction
  • SELF_HOSTED
  • EEA
  • ADEQUACY
  • THIRD_COUNTRY
requiredWhere the provider processes what is sent to it, as the operator declares it.
created_atstring (date-time) required
updated_atstring (date-time), or null optional
versioninteger required

OfferedAiModelConfiguration object

An offered model, set whole. Consent is not here: switching an offered model on is each workspace's own act.

NameTypeRequiredDescription
display_namestring
  • maxLength: 200
requiredThe name workspaces choose it by.
processorstring
  • maxLength: 200
requiredWho processes what is sent to it, as the operator declares it.
kindAiProviderKind
  • NOOP
  • OPENAI_COMPATIBLE
  • OLLAMA
requiredWhich adapter answers.
base_urlstring (uri) required
completion_modelstring optional
embedding_modelstring optional
api_keystring optionalSealed on the way in and answered by nothing afterwards.
jurisdictionAiJurisdiction
  • SELF_HOSTED
  • EEA
  • ADEQUACY
  • THIRD_COUNTRY
requiredWhere the provider processes what is sent to it, as the operator declares it.

AiSources string

Which sources a workspace may use: none, only a model the installation offers, only its own (the default), or either.

  • NONE
  • OFFERED
  • OWN
  • EITHER

AiSourceKind string

Which source answers a workspace.

  • OWN
  • OFFERED
  • NONE

AiMinJurisdiction string

The least a workspace's own model must declare about where it processes content, further right being stricter.

  • ANY
  • ADEQUACY
  • EEA
  • SELF_HOSTED

AiSource object

NameTypeRequiredDescription
sourceAiSourceKind
  • OWN
  • OFFERED
  • NONE
requiredWhich source answers a workspace.
offered_model_idstring (uuid) optionalThe offered model chosen.
sourcesAiSources
  • NONE
  • OFFERED
  • OWN
  • EITHER
requiredWhich sources a workspace may use: none, only a model the installation offers, only its own (the default), or either.
installation_sourcesAiSources
  • NONE
  • OFFERED
  • OWN
  • EITHER
requiredWhich sources a workspace may use: none, only a model the installation offers, only its own (the default), or either.
narrowingAiSources
  • NONE
  • OFFERED
  • OWN
  • EITHER
optionalWhich sources a workspace may use: none, only a model the installation offers, only its own (the default), or either.
sources_originstring
  • DEFAULT
  • INSTANCE
  • PLAN
  • WORKSPACE
required
sources_lockstring
  • INSTANCE
  • PLAN
optionalPresent where a level above locked what the workspace may use.
min_jurisdictionAiMinJurisdiction
  • ANY
  • ADEQUACY
  • EEA
  • SELF_HOSTED
requiredThe least a workspace's own model must declare about where it processes content, further right being stricter.
min_jurisdiction_originstring
  • DEFAULT
  • INSTANCE
  • PLAN
  • WORKSPACE
required
min_jurisdiction_lockstring
  • INSTANCE
  • PLAN
optional
offeredarray of OfferedAiModelSummary requiredThe models the installation offers, where it allows them at all: name, processor and jurisdiction, never an address, a model name or a key.
search_rebuildingboolean optionalTrue while search by meaning is being rebuilt for the model now in use.
person_opt_outAiPersonOptOut
  • OFFERED
  • NOT_OFFERED
requiredOFFERED: each person may keep their own content out of AI.
person_opt_out_originstring
  • DEFAULT
  • INSTANCE
  • PLAN
  • WORKSPACE
required
person_opt_out_lockstring
  • INSTANCE
  • PLAN
optionalPresent where a level above holds the workspace at OFFERED: then only the installation or the plan can change it.
person_opt_out_basisAiOptOutBasis
  • EMPLOYMENT_CONTRACT
  • WORKS_AGREEMENT
  • LEGAL_OBLIGATION
optionalThe legal basis a workspace names for making AI part of everybody's work.
person_opt_out_contactstring optionalWhom people may ask about the basis.
person_opt_out_sincestring (date-time) optionalWhen the workspace made AI part of everybody's work.
keeping_out_countinteger
  • minimum: 0
requiredHow many people keep their own content out now, or whose objection stops taking effect under NOT_OFFERED.
updated_atstring (date-time) optional
versioninteger required

AiPersonOptOut string

OFFERED: each person may keep their own content out of AI. NOT_OFFERED: AI is part of everybody's work, on the legal basis the workspace named.

  • OFFERED
  • NOT_OFFERED

AiOptOutBasis string

The legal basis a workspace names for making AI part of everybody's work.

  • EMPLOYMENT_CONTRACT
  • WORKS_AGREEMENT
  • LEGAL_OBLIGATION

AiPersonOptOutChoice object

NameTypeRequiredDescription
person_opt_outAiPersonOptOut
  • OFFERED
  • NOT_OFFERED
requiredOFFERED: each person may keep their own content out of AI.
basisAiOptOutBasis
  • EMPLOYMENT_CONTRACT
  • WORKS_AGREEMENT
  • LEGAL_OBLIGATION
optionalThe legal basis a workspace names for making AI part of everybody's work.
contactstring
  • maxLength: 200
optionalWhom people may ask about it - a name, a role or an address.

OfferedAiModelSummary object

NameTypeRequiredDescription
idstring (uuid) required
display_namestring required
processorstring required
jurisdictionAiJurisdiction
  • SELF_HOSTED
  • EEA
  • ADEQUACY
  • THIRD_COUNTRY
requiredWhere the provider processes what is sent to it, as the operator declares it.

OwnAiBudget object

NameTypeRequiredDescription
own_tokens_per_dayinteger (int64), or null
  • minimum: 1
requiredTokens a day for the workspace's own model; null for no budget.

AiSourceChoice object

NameTypeRequiredDescription
sourceAiSourceKind
  • OWN
  • OFFERED
  • NONE
requiredWhich source answers a workspace.
offered_model_idstring (uuid) optionalThe offered model, with OFFERED only.
sourcesstring
  • NONE
  • OFFERED
  • OWN
  • EITHER
  • INHERIT
optionalThis workspace's own narrowing of what it may use: a value narrows, INHERIT takes what the installation allows, absent keeps it.

AiProviderKind string

Which adapter answers. OPENAI_COMPATIBLE covers OpenAI, Azure, Mistral, vLLM and LiteLLM, which agree on a wire format; OLLAMA is a local model; NOOP calls nothing and is what an installation has until somebody chooses otherwise.

  • NOOP
  • OPENAI_COMPATIBLE
  • OLLAMA

AiJurisdiction string

Where the provider processes what is sent to it, as the operator declares it. It is a declaration rather than something this software can verify, and it exists so that the decision is documented rather than made by accident. SELF_HOSTED is a model this installation runs itself - no transfer to anybody. EEA and ADEQUACY are transfers Art. 45 covers. THIRD_COUNTRY is everything else and needs the operator's confirmation in the installation's configuration; the adequacy decision or the standard contractual clauses, and the transfer impact assessment, remain the operator's obligation.

  • SELF_HOSTED
  • EEA
  • ADEQUACY
  • THIRD_COUNTRY

PrivateHubSummary object

A private hub as an administrator sees it: whose, how big, and when it goes if it is in the trash. Deliberately without a name.

NameTypeRequiredDescription
idstring (uuid) required
ownersarray of string (uuid) requiredThe accounts holding OWNER on the hub itself.
collectionsinteger requiredCollections in it, the trashed ones included.
entriesinteger requiredEntries in it, the trashed ones included.
attachment_bytesinteger (int64) requiredThe bytes of the files attached to its entries.
created_atstring (date-time) required
trashed_atstring (date-time), or null optional
purge_onstring (date), or null optionalThe day a trashed hub is deleted for good, by the workspace's trash period.
emergency_accessobject requiredThe caller's emergency access to this hub.

PrivateHubAccessRequest object

NameTypeRequiredDescription
reasonstring
  • minLength: 1
  • maxLength: 500
requiredWhy the hub is opened.

PrivateHubAccess object

One opening of a private hub by the workspace's owner (the emergency access): who, when, until when, and why.

NameTypeRequiredDescription
idstring (uuid) required
hub_idstring (uuid) required
opened_bystring (uuid), or null requiredThe account that opened it; null once that account is gone.
reasonstring required
opened_atstring (date-time) required
ends_atstring (date-time) required

Workspace object

A workspace as the people inside it see it. AdminTenant is the same row as the installation operator sees it, across workspaces; this one is answered to a member and carries what a member may act on.

NameTypeRequiredDescription
idstring (uuid) required
slugstring requiredThe subdomain label the workspace is reached by in multi mode.
display_namestring required
statusstring
  • ACTIVE
  • SUSPENDED
  • PENDING_DELETION
requiredThe workspace's standing.
default_localestring requiredThe locale a member without one of their own falls back to - the third link of the chain request, account, tenant, installation.
default_time_zonestring requiredAn IANA zone, for the same position in the same chain.
default_week_startstring, or null
  • MONDAY
  • SATURDAY
  • SUNDAY
  • null
optionalThe day a member's week starts on when they chose none of their own, or null where this workspace decided nothing and the installation's day, then the language's, applies.
installation_defaultsInstallationDefaults optionalWhat the installation set as the default language, time zone and week start, so a workspace's screen can show it beside the workspace's own.
require_admin_totpboolean requiredWhether the rule in force demands a second factor of this workspace's OWNER and ADMIN role holders - sign_in_policy.mfa_required_for is ADMINS or EVERYONE.
audit_anchor_target_idstring (uuid), or null optionalThe workspace's backup target the audit chain's end is anchored to once a day, or null where anchoring is off.
created_atstring (date-time) required
updated_atstring (date-time), or null optional
versioninteger requiredThe optimistic lock, as everywhere else.
private_hubs_offeredboolean optionalWhether a client offers to make a hub private: the workspace allows private hubs (sign_in_policy.private_hubs) and holds more than one person whose account is not anonymised.
several_peopleboolean optionalWhether the workspace holds more than one person whose account is not anonymised - where private hubs, and the setting that allows them, mean something.
sign_in_policySignInPolicy optionalHow people in this workspace prove who they are.
hostsarray of WorkspaceHost optionalThe hosts this workspace answers at.
password_openingWorkspacePasswordOpening optionalThe installation operator's opening of the password for this workspace, while it is in force: the password is open for every account that holds one, whatever sign_in_policy.methods says, until until.

WorkspaceHost object

One host a workspace answers at. The canonical one is derived from the slug under the installation's own domain and is verified by construction - the installation already answers at it - so it carries no verification mark to publish.

NameTypeRequiredDescription
hoststring required
statestring
  • PENDING
  • VERIFIED
  • ACTIVE
  • BROKEN
requiredPENDING resolves nothing: a host somebody typed is not a host they own.
is_canonicalboolean requiredWhich host a mail, a redirect and an invitation link name.
verificationstring, or null optionalWhat the zone has to carry before the state may move - a value published in a DNS record, which is why it is the one presented value in this contract that is not a digest.
verified_atstring (date-time), or null optional
created_atstring (date-time) required

SignInPolicyNumber object

One numeric switch, at the three levels that decide it. Zero is off for every one of them.

NameTypeRequiredDescription
valueinteger requiredWhat is in force in this workspace.
installationinteger requiredWhat the level above set, which is what this workspace may tighten.
lockPolicyLock
  • INSTANCE
  • PLAN
  • null
requiredWhere a lock came from, or null where there is none.
sourcePolicySource
  • DEFAULT
  • INSTANCE
  • PLAN
  • WORKSPACE
requiredWhere a value in force came from: Hubtask's own default, the installation, the plan, or this workspace.
installation_sourcePolicySource
  • DEFAULT
  • INSTANCE
  • PLAN
  • WORKSPACE
requiredWho decided the level above's value - DEFAULT where the installation decided nothing.

SignInPolicyFlag object

NameTypeRequiredDescription
valueboolean required
installationboolean required
lockPolicyLock
  • INSTANCE
  • PLAN
  • null
requiredWhere a lock came from, or null where there is none.
sourcePolicySource
  • DEFAULT
  • INSTANCE
  • PLAN
  • WORKSPACE
requiredWhere a value in force came from: Hubtask's own default, the installation, the plan, or this workspace.
installation_sourcePolicySource
  • DEFAULT
  • INSTANCE
  • PLAN
  • WORKSPACE
requiredWho decided the level above's value - DEFAULT where the installation decided nothing.

SignInPolicyText object

NameTypeRequiredDescription
valuestring required
installationstring required
lockPolicyLock
  • INSTANCE
  • PLAN
  • null
requiredWhere a lock came from, or null where there is none.
sourcePolicySource
  • DEFAULT
  • INSTANCE
  • PLAN
  • WORKSPACE
requiredWhere a value in force came from: Hubtask's own default, the installation, the plan, or this workspace.
installation_sourcePolicySource
  • DEFAULT
  • INSTANCE
  • PLAN
  • WORKSPACE
requiredWho decided the level above's value - DEFAULT where the installation decided nothing.

SignInMethod string

One way into a workspace. A named schema, so that every reader of one shares a type.

  • PASSWORD
  • OIDC

SignInPolicyMethods object

NameTypeRequiredDescription
valuearray of SignInMethod required
installationarray of SignInMethod required
lockPolicyLock
  • INSTANCE
  • PLAN
  • null
requiredWhere a lock came from, or null where there is none.
sourcePolicySource
  • DEFAULT
  • INSTANCE
  • PLAN
  • WORKSPACE
requiredWhere a value in force came from: Hubtask's own default, the installation, the plan, or this workspace.
installation_sourcePolicySource
  • DEFAULT
  • INSTANCE
  • PLAN
  • WORKSPACE
requiredWho decided the level above's value - DEFAULT where the installation decided nothing.

PolicySource string

Where a value in force came from: Hubtask's own default, the installation, the plan, or this workspace. A screen says it beside every rule, so nobody meets a value without learning who set it - and says nothing about an installation that decided nothing, which is what a private installation is.

  • DEFAULT
  • INSTANCE
  • PLAN
  • WORKSPACE

PolicyLock string, or null

Where a lock came from, or null where there is none. The origin is answered rather than a bare boolean because "ask your administrator" and "ask your provider" are different sentences, and a screen told the wrong one sends somebody to the wrong person.

  • INSTANCE
  • PLAN
  • null

SignInPolicy object

The workspace's sign-in rule, every switch at the three levels that decide it: what is in force here, what the level above set, and whether a lock is on it. A locked switch is answered, not withheld. A setting that simply is not there is a setting somebody opens a support ticket about; one shown with its value, its reason and a control that is switched off is one they understand.

NameTypeRequiredDescription
passwordPasswordPolicySettings requiredThe thirteen switches about the password itself, each at its three levels.
mfa_required_forSignInPolicyText requiredNONE, ADMINS or EVERYONE.
methodsSignInPolicyMethods required
sessionSessionPolicySettings requiredThe two bounds a session answers to beside its own expiry.
legalLegalPolicySettings requiredThe four links, each with its own lock - B2C locks them, B2B leaves them open.
managed_accountsSignInPolicyFlag optionalWhether owners and administrators may give somebody an account without a mail address.
private_hubsSignInPolicyFlag optionalWhether people here may make private hubs.
rotation_fromstring (date-time), or null requiredWhen somebody last asked everybody for a new password, or null.

PasswordPolicySettings object

The thirteen switches about the password itself, each at its three levels.

NameTypeRequiredDescription
min_lengthSignInPolicyNumber requiredOne numeric switch, at the three levels that decide it.
min_lowercaseSignInPolicyNumber requiredOne numeric switch, at the three levels that decide it.
min_uppercaseSignInPolicyNumber requiredOne numeric switch, at the three levels that decide it.
min_digitsSignInPolicyNumber requiredOne numeric switch, at the three levels that decide it.
min_symbolsSignInPolicyNumber requiredOne numeric switch, at the three levels that decide it.
min_classesSignInPolicyNumber requiredOne numeric switch, at the three levels that decide it.
max_repeatSignInPolicyNumber requiredOne numeric switch, at the three levels that decide it.
common_passwordsSignInPolicyFlag required
context_wordsSignInPolicyFlag required
breach_checkSignInPolicyFlag required
max_age_daysSignInPolicyNumber requiredOne numeric switch, at the three levels that decide it.
history_countSignInPolicyNumber requiredOne numeric switch, at the three levels that decide it.
min_age_hoursSignInPolicyNumber requiredOne numeric switch, at the three levels that decide it.

SessionPolicySettings object

The two bounds a session answers to beside its own expiry.

NameTypeRequiredDescription
max_daysSignInPolicyNumber requiredOne numeric switch, at the three levels that decide it.
idle_minutesSignInPolicyNumber requiredOne numeric switch, at the three levels that decide it.

LegalPolicySettings object

The four links, each with its own lock - B2C locks them, B2B leaves them open.

NameTypeRequiredDescription
imprint_urlSignInPolicyText required
privacy_urlSignInPolicyText required
terms_urlSignInPolicyText required
accessibility_urlSignInPolicyText required
terms_versionSignInPolicyText requiredThe version of the terms of use.

InstallationDefaults object

What the installation set as the default language, time zone and week start, so a workspace's screen can show it beside the workspace's own. Only what the installation decided: a key it left open is absent, and an installation that decided nothing answers an empty object. The language and time zone are what a new workspace starts with; the week start applies wherever a workspace decided none.

NameTypeRequiredDescription
localestring optional
time_zonestring optional
week_startstring
  • MONDAY
  • SATURDAY
  • SUNDAY
optional

WorkspaceUpdate object

Every field optional; an omitted one is left alone, which is what merge-patch means. An explicit null is read as an absent key rather than as "clear it". The one field with an absent state, default_week_start, is cleared with the empty string instead; the others have none - a workspace always has a name, a locale, a zone and an answer to the enforcement question.

NameTypeRequiredDescription
display_namestring
  • minLength: 1
  • maxLength: 200
optional
default_localestring optionalA BCP-47 tag.
default_time_zonestring optionalAn IANA zone.
default_week_startstring
  • maxLength: 8
optionalMONDAY, SATURDAY or SUNDAY: the day a member's week starts on when they chose none of their own; another day is a field error.
require_admin_totpboolean optionalThe old name of sign_in_policy.mfa_required_for: true asks for ADMINS where the rule demands less, false for NONE.
sign_in_policySignInPolicyChange optionalThe switches this workspace is tightening.

SignInPolicyChange object

The switches, flat: the thirteen the password has, the two about factors and methods, the two session bounds, the four legal links, and the rotation as an action.

NameTypeRequiredDescription
min_lengthinteger optional
min_lowercaseinteger optional
min_uppercaseinteger optional
min_digitsinteger optional
min_symbolsinteger optional
min_classesinteger
  • minimum: 0
  • maximum: 4
optional
max_repeatinteger optional0 is off.
common_passwordsboolean optional
context_wordsboolean optional
breach_checkboolean optional
max_age_daysinteger optional0 is off, which is the shipped value.
history_countinteger optional0 is off.
min_age_hoursinteger optional0 is off.
mfa_required_forstring
  • NONE
  • ADMINS
  • EVERYONE
optional
methodsarray of SignInMethod optional
session_max_daysinteger optional
session_idle_minutesinteger optional0 is off.
imprint_urlstring optional
privacy_urlstring optional
terms_urlstring optional
accessibility_urlstring optional
terms_versionstring optionalThe terms' version, at most 64 characters without control characters; empty clears it.
managed_accountsboolean optional
private_hubsboolean optional
rotation_fromstring
  • now
optionalThe literal now, and nothing else: it asks every person in this workspace for a new password at their next sign-in and ends every session opened before this moment.

IdentityProvider object

One provider people can sign in through. The client secret is not a member: it is sealed at configuration time and read only by the token exchange.

NameTypeRequiredDescription
idstring (uuid) required
scopestring
  • workspace
  • installation
requiredWhich level this row belongs to.
issuerstring (uri) requiredThe provider's issuer identifier.
client_idstring requiredThis installation's registration with the provider.
display_namestring requiredThe name on the button.
kindIdentityProviderKind
  • GENERIC
  • GOOGLE
  • MICROSOFT
requiredThe preset a provider was configured from, which decides the mark its button draws GENERIC draws the letter tile - the honest answer rather than a borrowed logo.
provisioningIdentityProviderProvisioning
  • INVITED_ONLY
  • DOMAINS
  • ANY
requiredWho this provider may admit, and what happens to whoever it admitted - the one axis with a security answer, because creating an account gives somebody an empty desk and claiming one gives them somebody else's.
positioninteger requiredThe order the buttons are drawn in.
enabledboolean requiredWhether the row itself is switched on.
offered_hereboolean optionalWhether this provider is a way into this workspace.
installation_lockstring
  • TURNS_ON
  • LEAVES_TO_WORKSPACE
  • NONE
optionalFor a row the installation offers: what the installation's lock on the ways to sign in does to it.
withdraw_atstring (date-time), or null optionalFor a row the installation offers: when the installation withdraws it.
offered_workspacesinteger, or null
  • minimum: 0
optionalFor a row the installation offers, answered to the operator only: how many workspaces have it switched on.
allowed_email_domainsarray of string requiredThe domains a verified address must be inside for this provider to admit it, under DOMAINS — for a preset that has no directory claim, which is GENERIC and only GENERIC.
allowed_directoriesarray of string requiredThe organisations this provider admits under DOMAINS, in the provider's own identifiers: a Microsoft tenant id, a Google Workspace domain.
newcomer_roleone of MembershipRole, anything, or null optionalWhat somebody this provider brings in new gets: this role on the whole workspace.
newcomer_group_idstring (uuid), or null optionalWhat somebody this provider brings in new gets instead of a role: membership of this group of the workspace, and with it whatever the group holds.
created_atstring (date-time) required
updated_atstring (date-time), or null optional
versioninteger requiredThe optimistic lock, as everywhere else.

ProviderOffer object

NameTypeRequiredDescription
offeredboolean requiredWhether this provider is a way into this workspace.

IdentityProviderKind string

The preset a provider was configured from, which decides the mark its button draws GENERIC draws the letter tile - the honest answer rather than a borrowed logo. A stated kind the issuer does not belong to is refused: a Google mark over somebody else's issuer is borrowed trust on a sign-in screen.

  • GENERIC
  • GOOGLE
  • MICROSOFT

IdentityProviderProvisioning string

Who this provider may admit, and what happens to whoever it admitted - the one axis with a security answer, because creating an account gives somebody an empty desk and claiming one gives them somebody else's. INVITED_ONLY admits anyone the provider vouched for and creates nothing: a verified address that meets no account here is refused. DOMAINS admits only addresses inside allowed_email_domains, and creates an account for one that meets none - so an empty list admits nobody, because the list is the mode. ANY admits every address the provider says it verified and creates what is missing, which is for a provider that is the workspace's directory. An address the provider did not vouch for is admitted by none of the three.

  • INVITED_ONLY
  • DOMAINS
  • ANY

IdentityProviderConfiguration object

The provider, set whole. Discovery is performed before anything is stored, so an issuer that cannot be reached or that disagrees with its own metadata is refused here rather than by the first person who tries to sign in.

NameTypeRequiredDescription
issuerstring (uri) required
client_idstring required
client_secretstring, or null optionalSealed on the way in and never answered again.
display_namestring, or null
  • maxLength: 200
optionalThe name on the button.
kindIdentityProviderKind
  • GENERIC
  • GOOGLE
  • MICROSOFT
optionalAbsent is read from the issuer.
provisioningIdentityProviderProvisioning
  • INVITED_ONLY
  • DOMAINS
  • ANY
optionalAbsent is the safe value rather than the permissive one: INVITED_ONLY for a public provider, DOMAINS for everything else.
positioninteger
  • default: 0
  • minimum: 0
  • maximum: 99
optional
enableddeprecatedboolean optionalDeprecated: a workspace switches a provider on or off in its list of ways to sign in - POST /identity-providers/{providerId}:offer - and nowhere else.
allowed_email_domainsarray of string
  • default: []
optionalDomains this provider admits under DOMAINS, for a preset with no directory claim.
allowed_directoriesarray of string
  • default: []
optionalThe organisations this provider admits under DOMAINS, in its own identifiers: Microsoft tenant ids, Google Workspace domains.
newcomer_roleone of MembershipRole, anything, or null optionalWhat somebody this provider brings in new gets: this role on the whole workspace, granted in the same transaction that creates the account.
newcomer_group_idstring (uuid), or null optionalWhat somebody this provider brings in new gets instead of a role: membership of this group of the workspace.

ProviderWithdrawal object

When an offered provider is withdrawn, and for Withdraw now the count confirmed.

NameTypeRequiredDescription
withdraw_atstring (date-time), or null optionalWhen the offer ends.
confirm_countinteger, or null
  • minimum: 0
optionalRequired for Withdraw now: the number of workspaces that have the provider switched on, as the operator read it before confirming.

IdentityProviderPreset object

What follows from which provider a workspace picked: the scopes its registration has to permit, whether it may sign in people nobody invited, the one thing about it that is not like the others, and the instructions for registering with it.

NameTypeRequiredDescription
kindIdentityProviderKind
  • GENERIC
  • GOOGLE
  • MICROSOFT
requiredThe preset a provider was configured from, which decides the mark its button draws GENERIC draws the letter tile - the honest answer rather than a borrowed logo.
issuerstring (uri), or null optionalThe one issuer this provider has for every account, which a form fills in when the provider is chosen.
scopesarray of string requiredWhat the authorization request asks for, and what the registration must permit.
addresses_verifiedboolean requiredWhether this issuer's addresses are verified by construction.
publicboolean requiredWhether anybody in the world can hold an account at this issuer - personal accounts, not only an organisation's.
provisioningarray of IdentityProviderProvisioning requiredThe modes this preset permits for a workspace's own provider, strictest first.
installation_provisioningarray of IdentityProviderProvisioning requiredThe modes it permits when the installation offers it to every workspace.
redirect_uristring (uri) requiredThis installation's own callback, which every registration form asks for.
instructionsstring requiredA message code, rendered with redirect_uri as its parameter.
particularstring, or null optionalA message code for the one thing about this provider that is not like the others - Google's single issuer for every account there is, Microsoft's directory-specific issuer.
directory_claimstring, or null optionalThe claim this provider names an organisation in: tid at Microsoft, hd at Google.
supports_templated_issuerboolean requiredWhether this provider publishes a multi-directory issuer with a {tenantid} placeholder.
shared_issuer_pathsarray of string requiredThe first path segments that make an issuer of this provider a shared endpoint, such as organizations in https://login.microsoftonline.com/organizations/v2.0.

InstanceReach object

Whether the caller may reach the level above the workspaces, and nothing about anybody else. It answers about the account asking; it is not a directory of operators and cannot be asked about one.

NameTypeRequiredDescription
reachableboolean requiredWhether this account is in the operator register — the first of the two conditions on the instance area.

InstanceOverview object

The installation at a glance. Counts and states; the contents of a workspace are behind a database policy this answer does not reach through.

NameTypeRequiredDescription
workspaces_activeinteger required
workspaces_suspendedinteger required
workspaces_pending_deletioninteger requiredWorkspaces inside the grace period of a deletion request.
accounts_activeinteger requiredLive people, which is what "how big is this installation" means.
accounts_totalinteger requiredIncluding the invited and the suspended, and excluding the deleted - an account that was deleted is gone as far as anybody operating the installation is concerned.
workspaces_service_onlyinteger requiredWorkspaces that hold no person, only service accounts - one made to hold a machine's credential, for instance.

InstanceJournalEntry object

One act the installation recorded. The workspace is named by a bare identifier and its slug: the row it names is usually gone, which is the reason the journal exists.

NameTypeRequiredDescription
idstring (uuid) required
occurred_atstring (date-time) required
actionstring requiredtenant.provisioned, tenant.suspended, tenant.hard_deleted, instance.settings_changed, instance.operator_added and the rest.
tenant_idstring (uuid), or null optional
tenant_slugstring, or null optional
actor_labelstring, or null optionalThe acting operator's own label - the installation's administrator, never a workspace's person.
detailsobject optionalThe counts and moments of the act, as the evidence entry recorded them.

InstanceJournalPage object

NameTypeRequiredDescription
dataarray of InstanceJournalEntry required
pagePageInfo required

SessionElevation object

How long this session carries the control plane's scope.

NameTypeRequiredDescription
elevated_untilstring (date-time) required
remaining_secondsinteger requiredWhat is left of the hour.

RecoveryCodes object

The ten codes, shown once and stored only as hashes.

NameTypeRequiredDescription
recovery_codesarray of string
  • maxItems: 10
required

PasswordChange object

NameTypeRequiredDescription
passwordstring (password) requiredThe new password, judged against this workspace's rule.

PasswordCheck object

The candidate, and the proof that the caller is entitled to an answer about it. Exactly one proof is needed; a signed-in caller's bearer is one.

NameTypeRequiredDescription
passwordstring (password) required
pending_tokenstring optionalThe pending credential of a sign-in the change step interrupted.
invitation_tokenstring optionalThe token from an invitation mail.
reset_tokenstring optionalThe token from a reset mail.

PasswordViolation object

One rule the candidate breaks, as an identifier and its parameters.

NameTypeRequiredDescription
rulestring requiredThe rule's name, which is what the message code auth.password_rule.<rule> is held under and what the client keys its line on.
paramsobject optionalThe parameters that rule's sentence takes.

PasswordCheckResult object

NameTypeRequiredDescription
violationsarray of PasswordViolation required

SignInPasswordChange object

NameTypeRequiredDescription
pending_tokenstring requiredThe credential the PASSWORD_CHANGE challenge handed out.
passwordstring (password) requiredThe new password, judged against this workspace's rule in full.

InstanceSetting object

One switch of the installation's level: whether it decided anything, what it set, and whether a workspace may tighten it. Every switch is answered, decided or not. A reader has to be able to see that a switch exists and that this installation has left it to each workspace — which is a different fact from the switch not existing, and the only way a screen can draw the whole level without keeping a list of its own that would be wrong the day one is added.

NameTypeRequiredDescription
setboolean requiredWhether the installation decided this one.
valueanything optionalThe value, of whatever kind the switch is - a number, a flag, a word or a list of words.
lockedboolean requiredWhether a workspace may change it.
kindstring
  • COUNT
  • FLAG
  • CHOICE
  • CHOICES
  • LINK
  • TEXT
  • LOCALE
  • TIME_ZONE
optionalWhat kind of value the key takes, so a client draws the control for it whether or not the key is decided: COUNT a whole number, FLAG true or false, CHOICE one of options, CHOICES a list drawn from options, LINK an https address, TEXT one short line (the terms' version), LOCALE a BCP 47 tag, TIME_ZONE an IANA zone.
optionsarray of anything optionalFor CHOICE and CHOICES, the closed set of values, from the loosest to the strictest.
minimuminteger optionalFor COUNT, the least value the product applies.
maximuminteger optionalFor COUNT, the most the product applies.
positioninteger optionalThe key's place within its area, from 0: the order a screen draws the keys in, which an object's own key order does not carry.
workspace_maystring
  • TIGHTEN
  • RAISE
  • REPLACE
optionalWhat an open key leaves a workspace free to do: TIGHTEN choose a stricter value, RAISE set a higher limit of its own, REPLACE set its own value.

InstanceSettings object

The installation's own level: the sign-in switches, the legal links, the localisation defaults, the quota ceilings and which AI workspaces may use. Every key of every area is answered, decided or not, with set saying which. A reader has to be able to see that a setting exists and that this installation has left it to each workspace — a different fact from the setting not existing, and the only way a screen can draw the level without keeping a list that would be wrong the day one is added.

NameTypeRequiredDescription
sign_inobject optionalThe switches by name - the thirteen the password has, mfa_required_for, methods, the two session bounds, managed_accounts and private_hubs.
legalobject optionalThe four links, by name, and terms_version, the version of the terms link.
localisationobject optionallocale, time_zone and week_start: what a new workspace starts with, and, for the week start, what a workspace that set none of its own inherits.
quotasobject optionalOne ceiling per quota, by the quota's own name — the middle level of Effective(product, instance, plan, workspace).
aiobject optionalWhich AI a workspace may use.
blocklist_filestring optionalThe path to the operator's own list of refused passwords, read offline.
sourcestring optionalWhere the values in force came from - the database, or the path of the file enforcing them.
is_enforced_from_fileboolean optionalWhether a file is the source.

Operator object

One row of the register: an account of some workspace that operates this installation.

NameTypeRequiredDescription
tenant_idstring (uuid) required
account_idstring (uuid) required
added_atstring (date-time) required
added_bystring (uuid), or null optionalWho put them there.
display_namestring optionalThe account's name, as its workspace shows it.
emailstring (email), or null optionalThe address the account signs in with.
sign_in_namestring, or null optionalThe name an account without an address signs in with.
kindstring
  • USER
  • SERVICE_ACCOUNT
optionalA person, or a machine's account.
workspace_slugstring optionalThe short name of the workspace the account is in.
workspace_namestring optionalThe name of the workspace the account is in.
added_by_namestring, or null optionalThe name of who put them there, where that account still exists.

OperatorAdd object

One account, named either way. By identifier where the caller has one — a script, an automation. The workspace it lives in is read from it rather than named: a pair that could disagree is a pair somebody eventually gets wrong. By workspace and address otherwise, which is every screen. An account id is not something an operator can look up: account is behind row level security, so the control plane cannot list accounts across workspaces and therefore cannot show one. A workspace's address and the address somebody signs in with are what a person knows. The pair resolves through the register's own narrow door and answers one account or nothing — never a list, and never more than trying the identifier form already tells a caller. Exactly one of the two forms. Neither is refused as incomplete.

NameTypeRequiredDescription
account_idstring (uuid) optional
workspacestring optionalThe workspace's address, with email.
emailstring (email) optionalThe address the account signs in with, inside workspace.

PasswordForgot object

NameTypeRequiredDescription
emailstring (email) requiredThe address to send the link to, if it holds an account.

PasswordReset object

NameTypeRequiredDescription
tokenstring requiredThe token from the reset mail.
passwordstring (password) requiredThe new password, judged against this workspace's rule.

PasswordRules object

What a password has to meet, as data rather than as a sentence. Each switch becomes a message code with parameters in the client, and the same codes travel in field_errors[] when a password is refused - so one fact has one sentence whether the client saw the refusal coming or the server sent it. Zero is off for every count. The rules a client can decide itself are the arithmetic ones; common_passwords, breach_check, history_count and not_current name what only the server can answer, and /auth/password:check is where it does.

NameTypeRequiredDescription
min_lengthinteger requiredThe fewest characters, counted after NFKC.
min_lowercaseinteger requiredUnicode category Ll.
min_uppercaseinteger requiredUnicode category Lu.
min_digitsinteger requiredUnicode category Nd.
min_symbolsinteger requiredEverything that is none of the three above: punctuation, a mark, an emoji, and a letter of a script with no case.
min_classesinteger requiredHow many of the four kinds have to appear at all.
max_repeatinteger requiredThe longest run of one character allowed.
common_passwordsboolean requiredWhether an offline list is consulted - the embedded one, the operator's own file, or both.
context_wordsboolean requiredWhether a password carrying the address, the person's name, the workspace's name or its host is refused.
breach_checkboolean requiredWhether a breach corpus is consulted, where one is configured.
history_countinteger requiredHow many previous passwords are refused.
not_currentboolean requiredWhether "not the password you have now" applies - only where there is one.

ProviderSummary object

One way into this workspace, as a sign-in card needs it.

NameTypeRequiredDescription
idstring requiredWhat /auth/oidc:start is given to choose this provider.
display_namestring required
kindstring requiredThe preset it was configured from, which is what decides the mark that is drawn.
scopestring
  • installation
  • workspace
requiredWhether every workspace is offered it, or this one configured it.

SignInRules object

The least a sign-in screen needs, and deliberately no more.

NameTypeRequiredDescription
workspace_hoststring requiredThe host this answer was resolved for, which is what the card shows.
methodsarray of SignInMethod requiredThe ways in, in the order a screen draws them.
providersarray of ProviderSummary required
passwordPasswordRules requiredWhat a password has to meet, as data rather than as a sentence.
legalLegalLinks requiredThe links this installation's operator is obliged to show, resolved workspace -> instance -> nothing.
password_fallbackboolean optionalTrue while PASSWORD is among the methods only because no other way into the workspace works - its rule leaves the password out and no provider is switched on there, whatever the cause: an offer that ended, an installation default or lock, a restore.
sign_in_namesboolean optionalTrue while this workspace has at least one managed account - a person who signs in with a sign-in name instead of an address - so the card's first field asks for either.

MfaChallenge object

The second step a two-step sign-in owes. The pending credential is a row with the session machinery's discipline - short-lived, single-use, revoked by the clock - and it can do nothing but complete this sign-in.

NameTypeRequiredDescription
pending_tokenstring requiredPresented at /auth/sessions:verify - or, for ENROLL, at the enrolment routes.
expires_atstring (date-time) required
methodsarray of string requiredTOTP and RECOVERY for an enrolled account; ENROLL alone for somebody the workspace demands a factor of who holds none; PASSWORD_CHANGE alone for a password that was right and no longer meets the rule; LINK alone for a provider arrival that met an account with a password, completed at /auth/sessions:link; TERMS alone, after every other step, where the account has not agreed to the terms of use in force, completed at /auth/sessions:agree-terms.
password_rulesPasswordRules optionalPresent with PASSWORD_CHANGE and with no other step: the screen that asks for a new password needs the rule in the same answer, or the list under the field arrives a round trip after the field does.
emailstring, or null optionalWhose account the step is for, for the identity line on the card, where the person typed no address: with LINK, the account the provider's address matched - the person arrived from the provider; with the first step a provider's return or a connect link from the mail answers, for the same reason; and with every step a password reset answers - the person arrived from the link in the mail.
provider_namestring, or null optionalPresent with LINK: the name of the provider that will sign the person in once the account is proven.
termsTermsInForce optionalPresent with TERMS and with no other step - the terms to agree to.

TermsInForce object

The terms of use a person is asked to agree to.

NameTypeRequiredDescription
urlstring requiredWhere the terms are kept.
versionstring, or null optionalTheir version, where the level that set them gave one.
set_bystring
  • INSTALLATION
  • WORKSPACE
requiredWho set them - whom a person who does not agree can ask.

TermsAgreement object

NameTypeRequiredDescription
pending_tokenstring requiredThe TERMS challenge's credential.
terms_urlstring
  • maxLength: 2000
requiredThe link of the terms agreed to, as the challenge showed it.
terms_versionstring, or null
  • maxLength: 64
optionalTheir version as the challenge showed it, where they carry one.

LinkCompletion object

NameTypeRequiredDescription
pending_tokenstring requiredThe LINK challenge's credential.
passwordstring
  • minLength: 1
  • maxLength: 1024
requiredThe password of the account the provider's address matched.

SignInCompletion object

NameTypeRequiredDescription
pending_tokenstring required
codestring, or null
  • minLength: 6
  • maxLength: 8
optionalThe authenticator's current code.
recovery_codestring, or null optionalOne of the ten shown at enrolment.

TotpEnrollmentStart object

Empty for a signed-in caller; the pending credential for an enforcement sign-in. A body because the credential authenticates the call and travels nowhere else.

NameTypeRequiredDescription
pending_tokenstring, or null optional

TotpEnrollment object

The secret's single showing. Store it in an authenticator or lose it.

NameTypeRequiredDescription
secretstring requiredBase32, for typing by hand where no camera reaches the QR.
otpauth_uristring requiredWhat a QR image is rendered from - the rendering is the client's job.
recovery_codesarray of string requiredTen single-use codes, stored only as hashes.

AuthenticatorReplacement object

The new secret's single showing. Nothing is armed yet: the factor in force and its recovery codes keep working until the replacement is confirmed.

NameTypeRequiredDescription
secretstring requiredBase32, for typing by hand where no camera reaches the QR.
otpauth_uristring requiredWhat a QR image is rendered from - the rendering is the client's job.
expires_atstring (date-time) requiredUntil when the replacement can be confirmed; after that it lapses unarmed.

AuthenticatorReplacementConfirmation object

NameTypeRequiredDescription
codestring
  • minLength: 6
  • maxLength: 8
requiredThe current code of the new authenticator.

TotpConfirmation object

NameTypeRequiredDescription
pending_tokenstring, or null optionalThe enforcement sign-in's credential; absent for a signed-in caller.
codestring
  • minLength: 6
  • maxLength: 8
required

TotpConfirmed object

NameTypeRequiredDescription
armedboolean requiredAlways true on success; the field exists so the answer is a statement, not an empty object.
tokensone of SessionTokens, anything, or null optionalThe pair, when a pending credential completed a sign-in here.
challengeone of MfaChallenge, anything, or null optionalThe PASSWORD_CHANGE step, when a pending credential completed the enrolment and the password the sign-in began with must still be changed - one the rule refuses, or a start password Hubtask drew.

AdminTenant object

NameTypeRequiredDescription
idstring (uuid) required
slugstring required
display_namestring required
statusstring
  • ACTIVE
  • SUSPENDED
  • PENDING_DELETION
required
default_localestring optional
default_time_zonestring optional
created_atstring (date-time) required
purge_afterstring (date-time), or null optionalSet while a deletion request stands - when the grace runs out.
legal_holdboolean optionalWhether a legal hold is in force in the workspace.
purge_started_atstring (date-time), or null optionalSet once the hard delete has begun removing the workspace.
password_openingone of PasswordOpening, anything, or null optionalThe operator's opening of the password while it is in force, null otherwise - an opening past its end is answered as none, whatever the row still holds.

PasswordOpening object

An operator's opening of the password for one workspace: when it ends, who asked and why.

NameTypeRequiredDescription
untilstring (date-time) requiredWhen the opening ends on its own.
requesterstring requiredWho asked for it, as the operator entered it - a ticket reference, ideally.
reasonstring required

WorkspacePasswordOpening object

An operator's opening of the password as the workspace itself reads it. Every member is told until when; who asked and why are answered only to a reader of the workspace's configuration (READ_CONFIGURATION: owners, administrators, the auditor) - the requester may name a person, and the reason may say more than a member needs.

NameTypeRequiredDescription
untilstring (date-time) requiredWhen the opening ends on its own.
requesterstring optionalWho asked for it.
reasonstring optionalWhy.

LegalHoldReplaceRequest object

The holds come with the request, read from the cluster recovered to the end of the WAL archive, or from a workspace archive the server reads where that end is unusable. Exactly one of holds and archive.

NameTypeRequiredDescription
recovery_pointstring (date-time) requiredThe moment the installation was recovered to; recorded with each hold placed.
holdsarray of LegalHoldRecord
  • maxItems: 1000
optional
archiveobject optionalA workspace archive at one of the workspace's backup targets.

LegalHoldRecord object

One hold as it stood before the rewind.

NameTypeRequiredDescription
idstring (uuid) required
scopeobject required
reasonstring required
placed_bystring (uuid) required
placed_atstring (date-time) required
released_atstring (date-time), or null optionalWhen it was released in the rewound period, if it was.

LegalHoldReplaceResult object

NameTypeRequiredDescription
holdsarray of object required
archiveobject optionalPresent when the holds were read from an archive: how far that source reaches.

PasswordOpeningRequest object

NameTypeRequiredDescription
hoursinteger
  • default: 24
  • minimum: 1
  • maximum: 168
optionalHow long the opening stands, counted from now.
requesterstring
  • minLength: 1
  • maxLength: 200
requiredWho asked for the opening.
reasonstring
  • minLength: 1
  • maxLength: 500
requiredWhy the password is opened - what is wrong with the provider.

EncryptionStatus object

NameTypeRequiredDescription
active_key_idstring requiredThe key new values are sealed under - the first identifier in HUBTASK_ENCRYPTION_KEYS.
keysarray of EncryptionKeyUsage requiredEvery key the ring holds, the active one first and then its predecessors - followed by any key a stored value still names although the ring no longer holds it, which is the state an operator has to repair by putting the key back.

EncryptionKeyUsage object

NameTypeRequiredDescription
key_idstring required
activeboolean requiredWhether new values are sealed under it.
in_ringboolean requiredWhether the installation still holds the key.
sealed_valuesinteger (int64)
  • minimum: 0
requiredHow many stored values name this key, across every workspace and the installation's own sign-in providers and offered AI models, each counted once.
storesarray of EncryptionStoreCount requiredThe same count by the kind of value that holds it, so a key the ring no longer holds says what would stay unreadable.

EncryptionStoreCount object

NameTypeRequiredDescription
storestring
  • account_mfa
  • identity_provider
  • webhook_subscription
  • backup_target
  • ai_provider
  • automation_rule
  • automation_http_job
requiredThe kind of value: second factors, sign-in provider secrets, webhook signing secrets, backup target credentials, AI provider keys, rule header secrets, header secrets of HTTP calls still waiting to be made or retried.
sealed_valuesinteger (int64)
  • minimum: 1
required

ResealAccepted object

NameTypeRequiredDescription
active_key_idstring requiredThe key the queued work will seal under.
queued_tenantsinteger requiredHow many workspaces were given a re-sealing job.

TenantProvision object

NameTypeRequiredDescription
slugstring
  • pattern: ^[a-z0-9][a-z0-9-]{2,39}$
requiredThe subdomain the workspace answers on.
display_namestring
  • minLength: 1
  • maxLength: 200
required
default_localestring, or null optional
default_time_zonestring, or null optional
owner_emailstring (email)
  • maxLength: 254
required
owner_display_namestring, or null
  • maxLength: 200
optional

ProvisionedTenant AdminTenant

NameTypeRequiredDescription
idstring (uuid) required
slugstring required
display_namestring required
statusstring
  • ACTIVE
  • SUSPENDED
  • PENDING_DELETION
required
default_localestring optional
default_time_zonestring optional
created_atstring (date-time) required
purge_afterstring (date-time), or null optionalSet while a deletion request stands - when the grace runs out.
legal_holdboolean optionalWhether a legal hold is in force in the workspace.
purge_started_atstring (date-time), or null optionalSet once the hard delete has begun removing the workspace.
password_openingone of PasswordOpening, anything, or null optionalThe operator's opening of the password while it is in force, null otherwise - an opening past its end is answered as none, whatever the row still holds.
owner_account_idstring (uuid) required
owner_redemption_tokenstring requiredThe owner's way in, shown for the only time: whoever the workspace is for redeems it, sets a password, and is signed in.
default_hub_idstring (uuid) required
example_collection_idstring (uuid) required

TenantDeletionRequest object

NameTypeRequiredDescription
confirmationstring requiredThe workspace's display name, typed exactly - the restore precedent.

TenantExportRequest object

NameTypeRequiredDescription
target_idstring (uuid) requiredThe configured backup target the archive is written to - the one discipline for "bytes leave the installation".

QuotaStanding object

NameTypeRequiredDescription
quotastring
  • api_requests_per_minute
  • items
  • media_bytes
  • automation_runs_per_hour
  • webhook_targets
  • export_jobs
  • ai_tokens_per_day
  • ai_own_tokens_per_day
requiredThe two AI rows are counted per source and per day in the workspace's time zone: ai_tokens_per_day is the offered model's budget, ai_own_tokens_per_day the workspace's own model's, set by the workspace itself and unlimited unless it does.
limitinteger (int64) requiredThe resolved ceiling.
usedinteger (int64), or null optionalThe live count, where one exists; null where the limit is enforced elsewhere (the request rate lives in the limiter's own headers).
rationumber, or null optionalused / limit, null while either half is missing.
configuredboolean optionalTrue when the workspace carries its own ceiling rather than the mode's default.
lockedboolean optionalTrue when the installation locked this ceiling for every workspace, so it is set by the installation rather than offered as its default.

TenantQuotas object

Partial by design - each quota, settable per workspace. A provided value becomes the ceiling (0 = unlimited), an explicit null clears the override, an absent key changes nothing.

NameTypeRequiredDescription
api_requests_per_minuteinteger (int64), or null
  • minimum: 0
optional
itemsinteger (int64), or null
  • minimum: 0
optional
media_bytesinteger (int64), or null
  • minimum: 0
optional
automation_runs_per_hourinteger (int64), or null
  • minimum: 0
optional
webhook_targetsinteger (int64), or null
  • minimum: 0
optional
export_jobsinteger (int64), or null
  • minimum: 0
optional
ai_tokens_per_dayinteger (int64), or null
  • minimum: 0
optionalWhat the workspace may spend on the AI models the installation offers in a day of its own time zone, counted in the tokens every provider reports.

TenantDeletionScheduled object

NameTypeRequiredDescription
tenant_idstring (uuid) required
purge_afterstring (date-time) requiredWhen the 30-day grace runs out and the hard delete job takes it.

OauthClientCreate object

NameTypeRequiredDescription
namestring
  • minLength: 1
  • maxLength: 200
requiredWhat people read on the consent screen and in their grant list.
redirect_urisarray of string (uri) requiredMatched exactly, byte for byte, at authorization and at exchange.
confidentialboolean requiredTrue for an app that can keep a secret on a server; false for a native or single-page app, which gets none and must bring PKCE.

OauthClient object

NameTypeRequiredDescription
idstring (uuid) required
namestring required
redirect_urisarray of string required
confidentialboolean required
created_atstring (date-time) required

OauthClientSummary object

An app as the person being asked to allow it sees it: what it is called, and nothing else. OauthClient is the same row as its administrator sees it and carries the registered redirect URIs beside it.

NameTypeRequiredDescription
idstring (uuid) required
namestring required

OauthClientSecret OauthClient

NameTypeRequiredDescription
idstring (uuid) required
namestring required
redirect_urisarray of string required
confidentialboolean required
created_atstring (date-time) required
client_secretstring, or null optionalThe confidential client's credential, in clear, for the only time.

OauthAuthorization object

NameTypeRequiredDescription
client_idstring (uuid) required
redirect_uristring (uri) required
scopesarray of string requiredFrom this installation's own catalogue - the scopes descriptors already declare, no parallel vocabulary.
code_challengestring requiredBASE64URL(SHA256(code_verifier)), RFC 7636.
code_challenge_methodstring
  • S256
required
statestring, or null
  • maxLength: 512
optionalEchoed back untouched, for the client's own CSRF binding.

OauthCode object

NameTypeRequiredDescription
codestring requiredSingle use, minutes of life, exchanged at /oauth/token.
expires_atstring (date-time) required
statestring, or null optionalThe authorization's state, echoed back untouched.

OauthTokenRequest object

NameTypeRequiredDescription
grant_typestring
  • authorization_code
required
codestring required
redirect_uristring (uri) requiredHas to repeat the authorization's, exactly.
client_idstring (uuid) required
code_verifierstring, or null
  • minLength: 43
  • maxLength: 128
optionalRFC 7636's verifier.
client_secretstring, or null optionalThe confidential client's credential.

OauthGrant object

NameTypeRequiredDescription
idstring (uuid) required
client_idstring (uuid) required
client_namestring required
scopesarray of string required
created_atstring (date-time) required
last_used_atstring (date-time), or null optionalWhen a session under this grant last acted, to the minute.

StepUpRequest object

Exactly one method: the password; the authenticator's current code; a recovery code; or, for PROVIDER, the state and authorization_code the provider sent the browser back with after POST /auth/step-up:provider. Each proves the person holding the session is still the person who opened it.

NameTypeRequiredDescription
passwordstring, or null
  • maxLength: 1024
optional
codestring, or null
  • minLength: 6
  • maxLength: 8
optional
recovery_codestring, or null
  • maxLength: 64
optionalOne of the account's recovery codes.
statestring, or null
  • maxLength: 512
optionalThe handle POST /auth/step-up:provider minted, as the provider echoed it.
authorization_codestring, or null
  • maxLength: 4096
optionalThe code the provider issued.

ProviderStepUpAuthorization object

Where to send the browser for a PROVIDER step-up, and which provider that is.

NameTypeRequiredDescription
authorization_urlstring (uri) requiredThe provider's authorization endpoint with prompt=login, max_age=0 and this flow's parameters.
expires_atstring (date-time) requiredWhen the flow stops being answerable.
provider_idstring (uuid) required
provider_namestring requiredThe provider's name, as the sign-in button shows it.

StepUpGrant object

NameTypeRequiredDescription
step_up_tokenstring requiredConsumed by the one privileged action it is presented to.
expires_atstring (date-time) required
methodstring
  • PASSWORD
  • TOTP
  • RECOVERY
  • PROVIDER
requiredWhat proved it - recorded in the audit trail, never the credential.

MfaDisable object

NameTypeRequiredDescription
passworddeprecatedstring
  • maxLength: 1024
optionalDeprecated: the proof this route took before the step-up did.

Group object

NameTypeRequiredDescription
idstring (uuid) required
namestring
  • minLength: 1
  • maxLength: 200
required
descriptionstring, or null
  • maxLength: 2000
optional
versioninteger required

GroupCreate object

NameTypeRequiredDescription
namestring
  • minLength: 1
  • maxLength: 200
required
descriptionstring, or null
  • maxLength: 2000
optional
membersarray of string (uuid) optionalAccounts to put in the group straight away.

GroupUpdate object

NameTypeRequiredDescription
namestring
  • minLength: 1
  • maxLength: 200
optional
descriptionstring, or null
  • maxLength: 2000
optional
membersarray of string (uuid) optionalThe complete membership after the change; omitted leaves it as it is.

GroupDetail Group

A group as GET /groups/{groupId} answers it: the group, and the accounts in it. The members are identifiers rather than names, for the reason every record that says who is — the name is one request away and a copy of it should not outlive the row.

NameTypeRequiredDescription
idstring (uuid) required
namestring
  • minLength: 1
  • maxLength: 200
required
descriptionstring, or null
  • maxLength: 2000
optional
versioninteger required
membersarray of string (uuid) required
members_changeableboolean requiredWhether the reader may change who is in the group and delete it.

GroupPage object

NameTypeRequiredDescription
dataarray of Group required
pagePageInfo required

MembershipScope string

  • TENANT
  • HUB
  • COLLECTION
  • ITEM

MembershipRole string

AUDITOR is the one that is not a rung on the same ladder: it reads the audit trail and the configuration and no content at all. It exists because the alternative, in practice, is giving an auditor administrator rights - a permissions problem that arises precisely where evidence is being demanded. Somebody who needs both holds two memberships; the rights add up rather than the stronger one winning.

  • OWNER
  • ADMIN
  • MEMBER
  • CONTRIBUTOR
  • VIEWER
  • GUEST
  • AUDITOR

Membership object

NameTypeRequiredDescription
idstring (uuid) required
account_idstring (uuid), or null optional
group_idstring (uuid), or null optional
scope_typeMembershipScope
  • TENANT
  • HUB
  • COLLECTION
  • ITEM
required
scope_idstring (uuid), or null optional
roleMembershipRole
  • OWNER
  • ADMIN
  • MEMBER
  • CONTRIBUTOR
  • VIEWER
  • GUEST
  • AUDITOR
requiredAUDITOR is the one that is not a rung on the same ladder: it reads the audit trail and the configuration and no content at all.

MembershipGrant object

Exactly one of account_id and group_id. Neither grants to nobody; both would leave no answer to whose right it is when one of the two is removed.

NameTypeRequiredDescription
account_idstring (uuid), or null optional
group_idstring (uuid), or null optional
scope_typeMembershipScope
  • TENANT
  • HUB
  • COLLECTION
  • ITEM
required
scope_idstring (uuid), or null optional
roleMembershipRole
  • OWNER
  • ADMIN
  • MEMBER
  • CONTRIBUTOR
  • VIEWER
  • GUEST
  • AUDITOR
requiredAUDITOR is the one that is not a rung on the same ladder: it reads the audit trail and the configuration and no content at all.

MembershipPage object

NameTypeRequiredDescription
dataarray of Membership required
pagePageInfo required
grantable_rolesarray of MembershipRole requiredThe roles the caller may grant at this scope, strongest first: those at or below the strongest role they hold along it, where they may manage members there.

Container object

NameTypeRequiredDescription
idstring (uuid) required
typeContainerType
  • HUB
  • COLLECTION
required
parent_idstring (uuid), or null optional
namestring
  • minLength: 1
  • maxLength: 200
required
descriptionstring, or null optional
iconstring, or null optional
color_tokenstring, or null optional
order_keystring optional
policiesContainerPolicies optionalHow a collection works, as opposed to what it is called.
archived_atstring (date-time), or null optional
effective_archivedboolean optionalWhether this container is read-only: archived itself, or sitting in an archived hub (I-C3).
deleted_atstring (date-time), or null optional
created_atstring (date-time) optional
updated_atstring (date-time) optional
versioninteger required
privateboolean optionalWhether this hub is private: reached only by people holding a role on it or below it, not by the workspace's own roles - its owners and administrators included.

ContainerCreate object

NameTypeRequiredDescription
typeContainerType
  • HUB
  • COLLECTION
required
parent_idstring (uuid), or null optional
namestring
  • minLength: 1
  • maxLength: 200
required
descriptionstring, or null optional
iconstring, or null optional
color_tokenstring, or null optional
privateboolean
  • default: false
optionalMakes the new hub private: reached only by people holding a role on it or below it, not by the workspace's owners and administrators.

ContainerUpdate object

NameTypeRequiredDescription
namestring
  • minLength: 1
  • maxLength: 200
optional
descriptionstring, or null optional
iconstring, or null optional
color_tokenstring, or null optional

HubPrivacy object

NameTypeRequiredDescription
privateboolean requiredtrue to make the hub private, false to share it again.

ContainerPolicies object

How a collection works, as opposed to what it is called. Two keys, and no more: a key nothing reads would be a promise nothing keeps. This document is replaced whole (PUT): a key that is not sent falls back to its default - MANUAL for the completion policy, no automatic assignment for auto_assign.

NameTypeRequiredDescription
completion_policyCompletionPolicy
  • MANUAL
  • ROLLUP
  • default: "MANUAL"
optionalWhether a child's completion propagates upwards.
auto_assignone of AutoAssignPolicy, anything, or null optionalHow what is created in this collection is handed out, absent (or null) for not at all.

CompletionPolicy string

Whether a child's completion propagates upwards. MANUAL leaves the parent alone; ROLLUP completes it when its last open child is completed and reopens it when any child is reopened. /meta/capabilities returns the valid values.

  • MANUAL
  • ROLLUP
  • default: "MANUAL"

AutoAssignPolicy object

A collection's rule for handing out what is created in it. An enabled policy applies itself to everything created in the collection; one that is not enabled waits to be asked for, with auto_assign on the create request. The rotation state of ROUND_ROBIN is the server's bookkeeping and is not in this document.

NameTypeRequiredDescription
strategyAutoAssignStrategy
  • FIXED
  • RANDOM_MEMBER
  • RANDOM_GROUP_MEMBER
  • ROUND_ROBIN
  • LEAST_LOADED
requiredHow a candidate is picked.
candidatesarray of AutoAssignCandidate requiredThe pool the strategy draws from, in the order that matters to ROUND_ROBIN.
enabledboolean
  • default: true
optionalWhether the policy applies itself to everything created in the collection.

AutoAssignOutcome object

What one run of automatic assignment did. assigned says whether anybody got the entry; strategy is the policy's strategy that ran; code is the stable reason when nobody did - items.auto_assign_no_candidate when no candidate was eligible.

NameTypeRequiredDescription
assignedboolean required
strategyAutoAssignStrategy
  • FIXED
  • RANDOM_MEMBER
  • RANDOM_GROUP_MEMBER
  • ROUND_ROBIN
  • LEAST_LOADED
requiredHow a candidate is picked.
codestring, or null optional

AutoAssignStrategy string

How a candidate is picked. FIXED always assigns the one configured account. RANDOM_MEMBER draws uniformly from the candidate accounts. RANDOM_GROUP_MEMBER draws a group first and one of its members second, so each group carries an equal share of the work regardless of its size. ROUND_ROBIN walks the candidate list in order. LEAST_LOADED picks the candidate with the fewest open entries. /meta/capabilities returns the valid values.

  • FIXED
  • RANDOM_MEMBER
  • RANDOM_GROUP_MEMBER
  • ROUND_ROBIN
  • LEAST_LOADED

AutoAssignCandidate object

NameTypeRequiredDescription
kindstring
  • ACCOUNT
  • GROUP
required
idstring (uuid) required

Completion object

NameTypeRequiredDescription
is_completedboolean optional
completed_atstring (date-time), or null optional
completed_bystring (uuid), or null optional

Cover object

NameTypeRequiredDescription
kindstring
  • COLOR
  • IMAGE
optional
color_tokenstring, or null optional
media_idstring (uuid), or null optional

CoverInput object

What the cover shall be: a colour token from the design system's vocabulary, or an image by its media identifier - exactly one of the two, matching the kind.

NameTypeRequiredDescription
kindstring
  • COLOR
  • IMAGE
required
color_tokenstring, or null optional
media_idstring (uuid), or null optional

DueDateInput object

What the due date shall be. The instant is required; the flag and the zone qualify it and cannot be stored without it. An all-day due date carries due_date_only true and is read as a date in due_time_zone - the stored instant answers identically to every reader, and nothing the server emits renders it as a moment.

NameTypeRequiredDescription
due_atstring (date-time) required
due_date_onlyboolean
  • default: false
optional
due_time_zonestring, or null optionalAn IANA time zone, such as Europe/Berlin.

SavedView object

A saved query with the layout it is drawn in. The server stores the query, validates it against the same catalogue as POST /items:query, and interprets neither the layout nor the visible fields - both are the client's vocabulary, echoed back exactly as stored.

NameTypeRequiredDescription
idstring (uuid) required
scope_typestring
  • TENANT
  • HUB
  • COLLECTION
  • ACCOUNT
requiredWhere the view lives, which is who it can be shared with: a container's members, the workspace, or - for ACCOUNT - nobody but its owner.
scope_idstring (uuid), or null optionalThe container the scope names, the owner's account for ACCOUNT, and null for TENANT.
owner_idstring (uuid) required
namestring
  • minLength: 1
  • maxLength: 200
required
layoutstring requiredOne of the declared set (/meta/capabilities, view_layouts).
queryobject requiredThe query a view asks, in the shape the use case takes rather than the shape POST /items:query takes as a body: the anchor is flat - scope_container_id or scope_item_id - because the server flattens the request body's scope object before any use case sees it, and this document is read back as an input.
groupingobject required
visible_fieldsarray of string required
sharingstring
  • PRIVATE
  • SCOPE
  • PUBLIC_LINK
required
created_atstring (date-time) optional
versioninteger required

SavedViewCreate object

NameTypeRequiredDescription
scope_typestring
  • TENANT
  • HUB
  • COLLECTION
  • ACCOUNT
required
scope_idstring (uuid), or null optionalThe container for HUB and COLLECTION.
namestring
  • minLength: 1
  • maxLength: 200
required
layoutstring required
queryobject requiredThe query, anchored, in the use case's input shape - scope_container_id, not a nested scope object.
groupingobject optional
visible_fieldsarray of string optional
sharingstring
  • PRIVATE
  • SCOPE
  • PUBLIC_LINK
  • default: "PRIVATE"
optionalSCOPE at creation asks the same permission :share does.

SavedViewUpdate object

JSON Merge Patch; a field that is not sent is left alone. The scope and the sharing are not here - where a view lives is decided at creation, and sharing is :share.

NameTypeRequiredDescription
namestring
  • minLength: 1
  • maxLength: 200
optional
layoutstring optional
queryobject optionalThe whole query, replaced.
groupingobject optional
visible_fieldsarray of string optional

SavedViewShare object

NameTypeRequiredDescription
sharingstring
  • PRIVATE
  • SCOPE
  • PUBLIC_LINK
required

ViewExport object

What to render and how. The view decides which rows; the format decides what they become.

NameTypeRequiredDescription
formatstring
  • CSV
  • JSON
  • ICS
requiredCSV for a spreadsheet, JSON for a script, ICS for a calendar.
time_zonestring optionalThe zone the dates are written in.

ViewExportDocument object

The JSON rendering - the view's rows, and what the export knows about itself.

NameTypeRequiredDescription
view_idstring (uuid) required
generated_atstring (date-time) required
countinteger requiredHow many rows are in this document.
truncatedboolean requiredTrue when the result reached max_export_rows.
rowsarray of WorkItem required

WebhookSubscription object

One external system's standing request to be told what happens here. The signing secret is not a member: it is answered once, at creation and at each rotation, and stored sealed.

NameTypeRequiredDescription
idstring (uuid) required
target_urlstring (uri) requiredWhere the CloudEvent is POSTed.
event_typesarray of string requiredThe types this subscription wants, as /meta/capabilities lists them.
filterstring, or null optionalA CEL expression narrowing the subscription further.
statestring
  • ACTIVE
  • PAUSED
  • DISABLED
requiredDISABLED is what sustained unreachability produces, with a notification to the owner.
failure_countinteger requiredConsecutive failed deliveries.
last_errorstring, or null optionalA message code for the last failure, never a response body from the target.
created_atstring (date-time) required
versioninteger required

WebhookSubscriptionCreate object

NameTypeRequiredDescription
target_urlstring (uri)
  • maxLength: 2000
required
event_typesarray of string required
filterstring, or null optionalRefused until the expression engine lands.

WebhookSubscriptionUpdate object

Every field optional; an omitted one is left alone.

NameTypeRequiredDescription
target_urlstring (uri), or null
  • maxLength: 2000
optional
event_typesarray of string optional
filterstring, or null optional
statestring, or null
  • ACTIVE
  • PAUSED
  • null
optionalDISABLED is not settable by hand: it is what the system concludes from a run of failures.

WebhookSubscriptionSecret WebhookSubscription

NameTypeRequiredDescription
idstring (uuid) required
target_urlstring (uri) requiredWhere the CloudEvent is POSTed.
event_typesarray of string requiredThe types this subscription wants, as /meta/capabilities lists them.
filterstring, or null optionalA CEL expression narrowing the subscription further.
statestring
  • ACTIVE
  • PAUSED
  • DISABLED
requiredDISABLED is what sustained unreachability produces, with a notification to the owner.
failure_countinteger requiredConsecutive failed deliveries.
last_errorstring, or null optionalA message code for the last failure, never a response body from the target.
created_atstring (date-time) required
versioninteger required
secretstring requiredThe signing secret, in clear, for the only time.

HttpRequestCall object

One outbound HTTP call, as a rule's HTTP_REQUEST action carries it. The secret header is the one place a credential belongs - never the URL, never the plain headers - and it is sealed at rest and masked as *** everywhere after creation; sending *** back on a rule edit keeps the stored secret.

NameTypeRequiredDescription
methodstring
  • GET
  • POST
  • PUT
  • PATCH
  • DELETE
required
urlstring requiredThe address, http or https.
headersobject optionalPlain headers - a content type, an API version.
secret_header_namestring optionalThe header the secret travels in, e.g.
secret_header_valuestring optionalThe secret itself.
signature_headerstring optionalWhen set, this header carries an HMAC-SHA256 over the body computed with the secret - the same t=<ts>,v1=<hex> shape a webhook signature has.
body_templatestring optionalA CEL expression producing the body, rendered against the run's event when the call is made.
event_idstring (uuid) optionalThe event the body template reads.

WebhookSend object

What a deliberate delivery names - the event; the path names the subscription.

NameTypeRequiredDescription
event_idstring (uuid) requiredThe event to deliver, as X-Hubtask-Event-Id will carry it.

WebhookSecretRotation object

NameTypeRequiredDescription
grace_secondsinteger, or null
  • minimum: 0
  • maximum: 604800
optionalHow long the previous secret keeps verifying, so a subscriber can deploy the new one without dropping what arrives in between.

WebhookDelivery object

One attempt at one event against one subscription.

NameTypeRequiredDescription
idstring (uuid) required
subscription_idstring (uuid) required
event_idstring (uuid) requiredThe event's own identifier, which travels as X-Hubtask-Event-Id.
attemptinteger requiredWhich attempt this is, from one.
statusstring
  • PENDING
  • SUCCEEDED
  • FAILED
  • DEAD_LETTER
required
response_statusinteger, or null optionalWhat the target answered, where it answered at all.
error_codestring, or null optionalA message code, never the target's response body.
next_attempt_atstring (date-time), or null optionalWhen the next attempt is due; null once there will not be one.
created_atstring (date-time) required

RuleScope object

Where the rule applies: the whole workspace, one hub, or one collection. Descendants are included by the ordinary rule rather than by a flag: a permission held at a hub applies downwards, and a rule scoped to a hub sees what happens in its collections.

NameTypeRequiredDescription
typestring
  • TENANT
  • HUB
  • COLLECTION
required
idstring (uuid) optionalThe hub or the collection.

RuleTrigger object

What starts a run. Six kinds, each with the fields its kind needs and no others - a trigger carrying a cron expression and an event type would be a rule nobody can read.

NameTypeRequiredDescription
kindstring
  • EVENT
  • SCHEDULE
  • RELATIVE_DATE
  • INBOUND_WEBHOOK
  • MANUAL
  • JUMBLE_ENTRY
required
event_typestring optionalEVENT only, and required there: the full type, de.hubtask.work.item.overdue.v1.
changed_fieldsarray of string optionalEVENT only, optional.
rrulestring optionalSCHEDULE only, and required there: an RFC 5545 RRULE.
timezonestring optionalSCHEDULE only, and required there: an IANA zone.
anchorstring
  • DUE_DATE
  • CREATED_AT
optionalRELATIVE_DATE only, and required there: which instant the offset is from.
offsetstring optionalRELATIVE_DATE only, and required there: a signed ISO 8601 duration, -PT24H for "24 hours before".

AutomationActionField object

One declared parameter of an automation action, as the use case behind the kind declares it. kind is the catalogue's own vocabulary: id and id_list name entries of this workspace, and an editor offers a picker for them; object, list and any are documents whose shape another declaration decides, and an editor takes them as JSON.

NameTypeRequiredDescription
namestring required
kindstring
  • string
  • id
  • boolean
  • integer
  • id_list
  • object
  • list
  • any
required
requiredboolean required
enumarray of string optionalThe closed set of values the field takes, where it takes one.
descriptionstring optionalProtocol documentation, in English, as the descriptions in this document are - never display text.
ruleboolean optionalWhether a rule sets this field.
formatstring optionalThe shape of a string field where a form draws it better than as text, in the vocabulary of this document's own format keyword: date-time for an RFC 3339 instant.

RuleAction object

One step of a run. The kind is a use case name in SCREAMING_SNAKE_CASE and the list grows with the catalogue rather than with a table somebody maintains, so a new use case becomes an action without anybody editing anything. Three kinds are the exception, and they are one on purpose: WAIT, BRANCH and STOP are not use cases at all but the engine's own control structures, so they are in no catalogue and there is nothing for MCP or a person to call. Their parameters are therefore checked where every other shape question about a rule is answered - by the rule itself, when it is written.

NameTypeRequiredDescription
kindstring requiredADD_LABEL, ASSIGN, CREATE_ITEM, … A kind this build does not serve is refused by name rather than stored to be ignored.
paramsobject optionalThe action's parameters.

RuleThrottle object

What bounds a storm. Both are optional, and both are stored rather than enforced here: the engine that runs a rule is what observes them.

NameTypeRequiredDescription
max_runs_per_hourinteger
  • minimum: 1
  • maximum: 10000
optional
dedupe_key_exprstring optionalAn expression whose value collapses runs that mean the same thing - two events about one entry within the window are one run rather than two.

AutomationRule object

NameTypeRequiredDescription
idstring (uuid) required
namestring required
scopeRuleScope requiredWhere the rule applies: the whole workspace, one hub, or one collection.
enabledboolean requiredSwitched off when the rule is written.
run_asstring (uuid) requiredThe account the rule acts as.
triggerRuleTrigger requiredWhat starts a run.
conditionsarray of RuleCondition requiredUp to twenty, evaluated in order, and all of them have to hold for the rule to act.
actionsarray of RuleAction required
throttleRuleThrottle optionalWhat bounds a storm.
on_errorstring
  • STOP
  • CONTINUE
  • RETRY
required
failure_countinteger requiredConsecutive failed runs.
next_run_atstring (date-time), or null optionalWhen a SCHEDULE rule next fires.
inbound_rotated_atstring (date-time), or null optionalWhen an INBOUND_WEBHOOK rule's address was last minted, and absent for a rule that has none.
findingsarray of RuleFinding optionalWhat the last check found: every reference of the rule resolved against what exists now.
checked_atstring (date-time), or null optionalWhen the check last ran over this rule, and absent for a rule it never has — or for one edited since: an edit leaves the rule unchecked and its findings empty, because they described the definition the check read, not this one.
last_runobject, or null optionalThe rule's most recent run — when it started and how it ended — read beside the rule so that a list of rules says it without a page of runs per rule.
created_bystring (uuid) required
created_atstring (date-time) required
updated_atstring (date-time) required
versioninteger required

RuleFinding object

One thing the check found about a rule. path is a JSON pointer into the rule's own document - /trigger/event_type, /run_as, /conditions/1/expr, /actions/2/params/then/0/kind - the same paths a write-time refusal's field errors carry, so an editor that points at a refused field points at a finding with the same code. code is a message code and params its parameters.

NameTypeRequiredDescription
levelstring
  • ATTENTION
  • BROKEN
requiredATTENTION: the rule runs, and one step would find nothing where it points.
pathstring required
codestring required
paramsobject optional

RuleCondition object

NameTypeRequiredDescription
exprstring requiredA CEL expression, compiled when the rule is written rather than when it runs: an expression that does not compile, or that names something this build does not publish, is a field error under its own index rather than a rule that fails silently at three in the morning.

AutomationRuleCreate object

NameTypeRequiredDescription
namestring
  • maxLength: 200
required
scopeRuleScope requiredWhere the rule applies: the whole workspace, one hub, or one collection.
run_asstring (uuid) required
triggerRuleTrigger requiredWhat starts a run.
conditionsarray of RuleCondition optional
actionsarray of RuleAction required
throttleRuleThrottle optionalWhat bounds a storm.
on_errorstring
  • STOP
  • CONTINUE
  • RETRY
  • default: "STOP"
optional

JumbleEntry object

One arrival, as it came in. The raw content is data that arrived from outside: it is shown to a person and matched by rules as data, and it travels in no event, no log and no audit entry.

NameTypeRequiredDescription
idstring (uuid) required
channelstring
  • EMAIL
  • WEBHOOK
  • QUICK_CAPTURE
  • API
required
senderstring optionalWho the transport says it came from.
raw_subjectstring optional
raw_bodystring optional
attachmentsarray of string (uuid) requiredMedia objects, stored through the media pipeline.
statusstring
  • NEW
  • PROCESSED
  • DISMISSED
requiredAn entry is decided about exactly once.
target_item_idstring (uuid), or null optionalThe item a conversion produced.
received_atstring (date-time) required
settled_atstring (date-time), or null optionalWhen the entry stopped being NEW - a conversion or a dismissal.

JumbleEntrySubmit object

A near-channel arrival. At least one of the three contents; channel defaults to API, and only the near channels may be claimed.

NameTypeRequiredDescription
channelstring
  • QUICK_CAPTURE
  • API
  • default: "API"
optional
senderstring optionalOptional provenance text, e.g.
raw_subjectstring
  • maxLength: 500
optional
raw_bodystring optional
attachmentsarray of string (uuid) optionalSealed media objects to carry.

JumbleIntakeToken object

A freshly minted intake address. The token exists in this answer and nowhere else afterwards: it is stored hashed, and every later read shows only when it was minted.

NameTypeRequiredDescription
tokenstring requiredThe whole credential.
rotated_atstring (date-time) required

JumbleIntakeDelivery object

The small shape the intake accepts. All fields optional, but not all empty.

NameTypeRequiredDescription
senderstring optionalWho the bridge says it came from.
subjectstring optional
bodystring optional

JumbleIntakeAccepted object

NameTypeRequiredDescription
entry_idstring (uuid) requiredThe entry the delivery became.

JumbleEntryConvert object

Where the entry becomes work, and what the item is called.

NameTypeRequiredDescription
collection_idstring (uuid) requiredThe destination.
bucket_idstring (uuid) optionalThe board column, when the destination has a board.
titlestring
  • maxLength: 500
optionalThe item's title.
typestring
  • TASK
  • WORK_PACKAGE
  • ACTIVITY
  • default: "TASK"
optional

JumbleEntryPage object

NameTypeRequiredDescription
dataarray of JumbleEntry required
pagePageInfo required

RuleTest object

A dry run's input: exactly one of rule_id (a stored rule) and rule (a definition you are about to save), plus the sample event to evaluate it against.

NameTypeRequiredDescription
rule_idstring (uuid) optionalA stored rule to test.
ruleAutomationRuleCreate optional
sample_eventRuleTestEvent optionalThe sample event, as the CEL event variable will read it.
payloadobject optionalThe body an inbound delivery would have carried, as the CEL payload variable reads it.

RuleTestEvent object

The sample event, as the CEL event variable will read it.

NameTypeRequiredDescription
typestring requiredThe event type, e.g.
subjectstring optionalWhat the event is about, e.g.
payloadobject optionalThe event's payload document.

RuleTestResult object

NameTypeRequiredDescription
matchedboolean requiredWhether every condition held - whether a real run would have acted at all.
condition_resultsarray of RuleConditionResult required
actionsarray of RuleTestAction required

RuleTestAction object

One action of the rule, with whether it would have run. Unlike a real run's log, both arms of every branch appear - the dry run answers "and what if it had not" as well.

NameTypeRequiredDescription
pathstring required
kindstring required
would_runboolean required
matchedboolean optionalHow a BRANCH's condition answered the sample, present only on a branch.
error_codestring optionalPresent when a branch's condition could not be evaluated for the sample.

AutomationRuleUpdate object

An omitted field is left alone. enabled is deliberately absent: it moves through :enable and :disable, which are audited as the decisions they are.

NameTypeRequiredDescription
namestring
  • maxLength: 200
optional
scopeRuleScope optionalWhere the rule applies: the whole workspace, one hub, or one collection.
run_asstring (uuid) optional
triggerRuleTrigger optionalWhat starts a run.
conditionsarray of RuleCondition optional
actionsarray of RuleAction optional
throttleRuleThrottle optionalWhat bounds a storm.
on_errorstring
  • STOP
  • CONTINUE
  • RETRY
optional
expected_versioninteger optionalThe version last read.

AutomationRulePage object

NameTypeRequiredDescription
dataarray of AutomationRule required
pagePageInfo required

RuleRunStatus string

How a run ended. RUNNING is a run in flight or one whose process died - the engine writes it when the run starts, so a row left in it is a crash rather than a state anything reaches deliberately. WAITING is a run parked on a WAIT action: its results so far are written, a scheduled job holds the resume point, and no worker is held while the delay passes.

  • RUNNING
  • WAITING
  • SUCCEEDED
  • SKIPPED
  • FAILED
  • ABORTED_LOOP
  • THROTTLED

RuleConditionResult object

How one condition answered, in the order the rule declares them. A run that was skipped shows which condition stopped it, which is the question somebody asks first.

NameTypeRequiredDescription
indexinteger required
matchedboolean required
error_codestring optionalPresent when the condition could not be evaluated at all - a timeout, or a value the engine could not read.

RuleActionResult object

One action's outcome, in the order the run reached them.

NameTypeRequiredDescription
indexinteger required
kindstring required
pathstring optionalWhere the action sits in the rule: "2" is the third action, "2/then/0" the first action of that branch's then arm.
matchedboolean optionalHow a BRANCH's condition answered, present only on a BRANCH result.
statusstring
  • SUCCEEDED
  • FAILED
  • SKIPPED
requiredSKIPPED is an action the run never reached - on_error: STOP ended the run at an earlier failure, or a STOP action ended it deliberately.
error_codestring optionalThe code the use case refused with, unchanged.
idempotency_keystring optionalDerived from the rule, the occasion and the action's path, so a redelivered event re-runs into the stored result rather than acting twice.

RuleRun object

NameTypeRequiredDescription
idstring (uuid) required
rule_idstring (uuid) required
triggerstring
  • EVENT
  • SCHEDULE
  • RELATIVE_DATE
  • INBOUND_WEBHOOK
  • MANUAL
  • JUMBLE_ENTRY
requiredWhich of the rule's six ways of starting produced this run.
triggered_bystring (uuid), or null optionalWho pulled the trigger, for the one kind a person pulls: MANUAL.
subject_idstring (uuid), or null optionalThe entry the run is about when no event names it - a RELATIVE_DATE run measured from one entry's due date.
event_idstring (uuid), or null optionalThe event that started the run.
statusRuleRunStatus
  • RUNNING
  • WAITING
  • SUCCEEDED
  • SKIPPED
  • FAILED
  • ABORTED_LOOP
  • THROTTLED
requiredHow a run ended.
condition_resultsarray of RuleConditionResult required
action_resultsarray of RuleActionResult required
error_codestring optionalWhy the run as a whole ended badly, when it did.
started_atstring (date-time) required
finished_atstring (date-time), or null optional
causation_depthinteger requiredHow far this run is from the act a person performed.

InboundTriggerToken object

A freshly minted inbound address. The token exists in this answer and nowhere else afterwards: it is stored hashed, and every later read of the rule shows only when it was minted.

NameTypeRequiredDescription
rule_idstring (uuid) required
tokenstring requiredThe credential, prefixed hbt_hook_.
rotated_atstring (date-time) required

RuleRunAccepted object

A run that has been queued and has not started. The identifier is the one the run will carry, so a caller can watch for it - GET /automation/runs/{runId} answers 404 until a worker claims the job.

NameTypeRequiredDescription
run_idstring (uuid) required
rule_idstring (uuid) required

RuleRunPage object

NameTypeRequiredDescription
dataarray of RuleRun required
pagePageInfo required

WebhookDeliveryPage object

NameTypeRequiredDescription
dataarray of WebhookDelivery required
pagePageInfo required

TriggerEvent object

One event as a subscriber receives it: the CloudEvents 1.0 structured-JSON document itself, unwrapped - specversion, id, source, type, time, data, and the extension attributes that carry the tenant, the actor and the causal chain. The same bytes a webhook delivery would have POSTed, which is what makes the two transports one contract. id is the value X-Hubtask-Event-Id names on the push side, so a consumer deduplicates on it either way. Free-form here on purpose. The document's shape is owned by the schemas under api/events/ and by the CloudEvents specification, and a second list of its properties in this file would be a copy that drifts - and one that silently drops an extension attribute the day one is added.

TriggerEventPage object

NameTypeRequiredDescription
dataarray of TriggerEvent required
pagePageInfo required

CalendarFeed object

One subscription: a token its owner holds, over one saved view, revocable. The token itself is not a member - it exists in the answer to the call that minted it and nowhere else afterwards.

NameTypeRequiredDescription
idstring (uuid) required
account_idstring (uuid) requiredThe owner, whose authorisation the feed reads with at every fetch.
view_idstring (uuid), or null optionalThe view the feed serves, or null once that view has been deleted.
created_atstring (date-time) required
revoked_atstring (date-time), or null optionalWhen the token stopped working.

CalendarFeedCreate object

NameTypeRequiredDescription
view_idstring (uuid) requiredThe saved view to serve.

CalendarFeedSecret CalendarFeed

NameTypeRequiredDescription
idstring (uuid) required
account_idstring (uuid) requiredThe owner, whose authorisation the feed reads with at every fetch.
view_idstring (uuid), or null optionalThe view the feed serves, or null once that view has been deleted.
created_atstring (date-time) required
revoked_atstring (date-time), or null optionalWhen the token stopped working.
tokenstring requiredThe credential, in clear, for the only time.
urlstring (uri) requiredThe address to hand a calendar client, which is the token in its place.

CustomFieldDefinition object

One field a workspace or a collection adds to its entries. The values live on the entry itself, in custom_fields; this is what says which keys exist, what they may hold and which types carry them.

NameTypeRequiredDescription
idstring (uuid) required
collection_idstring (uuid), or null requiredThe collection the definition belongs to, or null for the whole workspace.
keystring
  • pattern: ^[a-z][a-z0-9_]{0,49}$
requiredThe identifier the value is stored under, unique in its scope and fixed once defined.
kindCustomFieldKind
  • TEXT
  • NUMBER
  • DATE
  • SELECT
  • MULTI_SELECT
  • BOOL
  • USER
  • URL
requiredWhat a value for the field looks like: one of eight kinds, and the server validates a value against its field's kind.
optionsarray of string requiredThe permitted values of a SELECT or a MULTI_SELECT, and empty for every other kind.
is_requiredboolean requiredWhether the field has to hold a value.
applies_toarray of ItemType requiredThe item types that carry the field, bounded by the CUSTOM_FIELDS capability.
created_atstring (date-time) optional
updated_atstring (date-time) optional
versioninteger requiredThe optimistic lock, returned as the ETag and sent back as If-Match.

CustomFieldKind string

What a value for the field looks like: one of eight kinds, and the server validates a value against its field's kind.

  • TEXT
  • NUMBER
  • DATE
  • SELECT
  • MULTI_SELECT
  • BOOL
  • USER
  • URL

CustomFieldDefinitionCreate object

NameTypeRequiredDescription
collection_idstring (uuid), or null optionalOmitted or null defines the field for the whole workspace.
keystring
  • pattern: ^[a-z][a-z0-9_]{0,49}$
required
kindCustomFieldKind
  • TEXT
  • NUMBER
  • DATE
  • SELECT
  • MULTI_SELECT
  • BOOL
  • USER
  • URL
requiredWhat a value for the field looks like: one of eight kinds, and the server validates a value against its field's kind.
optionsarray of string optional
is_requiredboolean
  • default: false
optional
applies_toarray of ItemType optionalOmitted means TASK alone, which is the column's default.

CustomFieldDefinitionUpdate object

JSON Merge Patch. The key and the kind are not in it: a key that moved would orphan every value stored under it, and a kind that changed would reinterpret them.

NameTypeRequiredDescription
optionsarray of string optional
is_requiredboolean optional
applies_toarray of ItemType optional

CustomFieldValue object

One value for one key. value is required and may be null, which clears the key - the two are different requests, and a body that left the field out would be neither.

NameTypeRequiredDescription
valueanything requiredThe value, shaped by the definition's kind: a string for TEXT, SELECT and URL, a number for NUMBER, a boolean for BOOL, an ISO-8601 date for DATE, an account identifier for USER, and an array of strings for MULTI_SELECT.

MediaObject object

NameTypeRequiredDescription
idstring (uuid) required
file_namestring, or null optionalThe name the file arrived under, for the download - never a storage path.
content_typestring requiredWhile PENDING, the claim the upload declared; once READY, the judged type - sniffed from the bytes, never the claim.
sizeinteger (int64) requiredDeclared while PENDING, measured once READY.
checksumstring, or null optional
usagestring
  • COVER
  • ATTACHMENT
  • IMPORT
required
statusstring
  • PENDING
  • READY
requiredPENDING between staging and confirmation; READY once the bytes were read back, judged and sealed.
ref_countinteger requiredHow many covers and attachments point at the object.
created_bystring (uuid) required
created_atstring (date-time) required
uploadone of MediaTransfer, anything, or null optionalWhere to put the bytes, present in the answer that staged the upload and on a GET while the object is PENDING and the target has not expired.
downloadone of MediaTransfer, anything, or null optionalWhere to fetch the bytes, present on a GET once the object is READY.

MediaTransfer object

One side of the byte transfer: the URL is the capability - a presigned object-storage URL, or this server's token-protected content route - and it expires.

NameTypeRequiredDescription
urlstring required
methodstring
  • PUT
  • GET
required
expires_atstring (date-time) required

MediaUploadRequest object

NameTypeRequiredDescription
file_namestring, or null
  • maxLength: 255
optional
content_typestring, or null optionalThe claim.
sizeinteger (int64)
  • minimum: 1
requiredThe exact size in bytes.
usagestring
  • COVER
  • ATTACHMENT
  • IMPORT
requiredWhat the object is for.

MediaPage object

NameTypeRequiredDescription
dataarray of MediaObject required
pagePageInfo required

ItemAttachments object

The attachments one entry carries. Returned by attaching and detaching rather than the entry itself, for the reason ItemMembers is: neither touches the entry's own row.

NameTypeRequiredDescription
item_idstring (uuid) required
media_idsarray of string (uuid) required

WorkItem object

NameTypeRequiredDescription
idstring (uuid) required
typeItemType
  • TASK
  • WORK_PACKAGE
  • ACTIVITY
requiredExtensible; /meta/capabilities returns the valid values.
collection_idstring (uuid) required
parent_idstring (uuid), or null optional
pathstring optional
depthinteger optional
titlestring
  • minLength: 1
  • maxLength: 500
required
notesstring, or null optional
completionCompletion required
bucket_idstring (uuid), or null optional
order_keystring optional
start_atstring (date-time), or null optional
due_atstring (date-time), or null optional
due_date_onlyboolean
  • default: false
optional
due_time_zonestring, or null optionalAn IANA time zone
label_idsarray of string (uuid) optional
member_idsarray of string (uuid) optional
assignee_idstring (uuid), or null optional
auto_assignone of AutoAssignOutcome, anything, or null optionalWhat automatic assignment did, present only in the response of an operation that ran it - autoAssignWorkItem, or a create that a policy applied to.
coverCover optional
custom_fieldsobject optional
recurrence_rule_idstring (uuid), or null optionalThe series this entry belongs to, and null for an entry that repeats never.
recurrence_source_idstring (uuid), or null optionalThe entry this one was copied from as an occurrence, and null on the template and on everything that is not an occurrence.
origin_jumble_idstring (uuid), or null optionalThe jumble entry this item was converted out of.
content_languagestring, or null optionalBCP-47, and null for an entry whose language nobody stated.
calendar_uidstring, or null
  • maxLength: 255
optionalThe UID a calendar client knows this entry by, and null for an entry no calendar client made.
archived_atstring (date-time), or null optional
deleted_atstring (date-time), or null optional
retentionone of RetentionState, anything, or null optionalSet for as long as a retention rule applies to this object.
created_bystring (uuid) optional
created_atstring (date-time) optional
updated_atstring (date-time) optional
hlcstring optionalThe hybrid logical clock of the last change; the basis of offline merging.
versioninteger required
childrenarray of WorkItem optionalOnly with expand=children:N

WorkItemCreate object

NameTypeRequiredDescription
typeItemType
  • TASK
  • WORK_PACKAGE
  • ACTIVITY
requiredExtensible; /meta/capabilities returns the valid values.
collection_idstring (uuid) optional
parent_idstring (uuid), or null optional
titlestring
  • minLength: 1
  • maxLength: 500
required
notesstring, or null optional
bucket_idstring (uuid), or null optional
before_item_idstring (uuid), or null optional
start_atstring (date-time), or null optional
due_atstring (date-time), or null optional
due_date_onlyboolean
  • default: false
optional
due_time_zonestring, or null optionalAn IANA time zone.
label_idsarray of string (uuid) optional
member_idsarray of string (uuid) optional
assignee_idstring (uuid), or null optional
auto_assignboolean
  • default: false
optional
coverCover optional
custom_fieldsobject optional
content_languagestring, or null optionalBCP-47.
calendar_uidstring, or null
  • minLength: 1
  • maxLength: 255
optionalThe UID a calendar client chose for the entry it is making - what the CalDAV tree sends when a client PUTs a new todo, and what any client may send that will later address the entry through the tree.

WorkItemUpdate object

JSON Merge Patch; null deletes a field.

NameTypeRequiredDescription
titlestring
  • minLength: 1
  • maxLength: 500
optional
notesstring, or null optional
bucket_idstring (uuid), or null optional
start_atstring (date-time), or null optional
due_atstring (date-time), or null optionalnull clears the due date, the all-day flag and the zone together - the three fields describe one date and none of them means anything alone.
due_date_onlyboolean optional
due_time_zonestring, or null optionalAn IANA time zone.
assignee_idstring (uuid), or null optional
coverCover optional
custom_fieldsobject optional
content_languagestring, or null optionalBCP-47, and null clears it.

MoveResult object

NameTypeRequiredDescription
itemWorkItem required
dropped_referencesarray of DroppedReference requiredLabels, buckets, members or custom fields that could not be resolved in the destination collection and were therefore removed (invariant I-W6: unresolvable references are reported back, never silently dropped).

DroppedReference object

NameTypeRequiredDescription
item_idstring (uuid) optionalThe entry that lost it.
kindstring
  • LABEL
  • BUCKET
  • MEMBER
  • ASSIGNEE
  • ATTACHMENT
  • CUSTOM_FIELD
required
idstring requiredThe reference that could not be carried over: an identifier for a label, a column or an account, and the key itself for a custom field, which has no identifier in a collection that does not define it.
codestring requiredA stable message code saying why.

SortTerm object

One ordering. Named once and read twice: POST /items:query sorts a view of a container, and POST /search sorts a workspace-wide read that has no words to rank by.

NameTypeRequiredDescription
fieldstring required
dirstring
  • ASC
  • DESC
  • default: "ASC"
optional
nullsstring
  • FIRST
  • LAST
  • default: "LAST"
optional

FilterNode object

Either a leaf (field, op, value) or a combination (op of AND, OR, NOT with nodes). A node is one or the other: a combination carrying a field, or a leaf carrying nodes, is refused rather than half-read.

Combinations nest at most five deep and a filter holds at most fifty nodes in total - the bound that keeps a query's cost a function of the data rather than of the request.

NameTypeRequiredDescription
opstring
  • AND
  • OR
  • NOT
  • EQ
  • NEQ
  • IN
  • NOT_IN
  • LT
  • LTE
  • GT
  • GTE
  • BETWEEN
  • IS_NULL
  • CONTAINS
  • CONTAINS_ANY
  • CONTAINS_ALL
  • STARTS_WITH
  • MATCHES
required
fieldstring optionalOn a leaf, the field to compare.
valueanything optionalOn a leaf, what to compare against - a scalar for most operators, an array for IN, NOT_IN, CONTAINS_ANY, CONTAINS_ALL and BETWEEN (two elements, the bounds), and absent for IS_NULL.
nodesarray of FilterNode optionalOn a combination, the nodes it joins.

ItemQuery object

NameTypeRequiredDescription
scopeobject requiredWhere to look.
filterFilterNode optionalEither a leaf (field, op, value) or a combination (op of AND, OR, NOT with nodes).
sortarray of SortTerm
  • maxItems: 4
optionalOrdered, most significant first, and always completed by id ASC so that a cursor is unambiguous.
group_byobject optionalThe board projection: one group per distinct value, each with its own rows and its own cursor.
expandarray of string optionalRelations to include, as on GET /items.
pageobject optional
include_archivedboolean
  • default: false
optional
include_trashedboolean
  • default: false
optional
countstring
  • none
  • estimated
  • exact
  • default: "none"
optionalexact counts the whole result with a second query and answers total; it is opt-in because it costs a second pass.

ItemQueryGroup object

One column of a grouped result. Its page continues this group and nothing else: a client pages a column by asking again for that column - the key as a filter, this cursor as the cursor.

NameTypeRequiredDescription
keystring, or null requiredThe grouping value, null for the entries that have none.
countinteger, or null requiredHow many entries the group holds in total, with count=exact.
dataarray of WorkItem required
pagePageInfo required

ItemQueryResult object

data carries the rows of an ungrouped query and groups those of a grouped one. Both are always present, so that a client reads them unconditionally; the one that does not apply is empty. page is the walk of an ungrouped query - a grouped one has no single walk, so it then reports no successor and each group carries its own.

NameTypeRequiredDescription
dataarray of WorkItem required
groupsarray of ItemQueryGroup requiredOne entry per distinct value of the grouping field, in the field's own order with the group of entries that have no value last.
pagePageInfo required
totalinteger, or null requiredThe size of the whole result with count=exact, null otherwise.

BulkOperation object

One operation of a bulk: which of the single-entry operations to carry out, on which entry, with the body that operation takes on its own.

NameTypeRequiredDescription
opstring
  • CREATE_ITEM
  • UPDATE_ITEM
  • COMPLETE_ITEM
  • REOPEN_ITEM
  • MOVE_ITEM
  • TRASH_ITEM
  • ADD_LABEL
  • REMOVE_LABEL
  • ASSIGN
requiredThe operation.
item_idstring (uuid) optionalThe entry the operation is about.
payloadobject optionalWhat the single-entry operation takes in its body, by the field names it takes there.

BulkResult object

What one operation of a bulk did. Exactly one of item and problem is present, except for an operation that never ran because an atomic bulk was rolled back - which carries neither and says so by its status.

NameTypeRequiredDescription
indexinteger requiredThe position of the operation in the request, counted from zero.
statusinteger requiredThe status this operation would have answered on its own: 200 or 201 for one that was applied, the refusal's status for one that failed, and 409 for an operation of an atomic bulk that was rolled back because another one failed.
itemWorkItem optional
problemProblem optional

DuplicateResult object

What a duplicate produced: the copy, what it could not carry over, and how big it was.

NameTypeRequiredDescription
itemWorkItem required
dropped_referencesarray of DroppedReference requiredLabels, buckets, members or custom fields the destination collection could not resolve and that the copy therefore does not carry (invariant I-W6: unresolvable references are reported back, never silently dropped).
copiedinteger requiredHow many entries the copy consists of, the copied entry itself included.

Bucket object

A column of a collection's board - the "list" of the requirements. It belongs to exactly one collection, and its name is unique there, compared without regard to case or accents.

NameTypeRequiredDescription
idstring (uuid) required
collection_idstring (uuid) required
namestring
  • minLength: 1
  • maxLength: 120
required
order_keystring requiredThe rank on the board - a fractional index rather than a number.
wip_limitinteger, or null
  • minimum: 1
requiredHow many entries the people using this board agreed to have in the column at once.
is_done_bucketboolean
  • default: false
required
color_tokenstring, or null requiredAlways present, as null when unset - like wip_limit.
versioninteger requiredThe optimistic lock, returned as the ETag and sent back as If-Match.

BucketCreate object

NameTypeRequiredDescription
namestring
  • minLength: 1
  • maxLength: 120
required
before_bucket_idstring (uuid), or null optional
wip_limitinteger, or null optional
is_done_bucketboolean
  • default: false
optional
color_tokenstring, or null optional

BucketUpdate object

JSON Merge Patch; null deletes a field.

NameTypeRequiredDescription
namestring
  • minLength: 1
  • maxLength: 120
optional
wip_limitinteger, or null
  • minimum: 0
optionalNull and 0 both remove the limit.
is_done_bucketboolean optional
color_tokenstring, or null optional

BucketDeletion object

What became of the entries that were in a deleted column. Reported rather than left to be discovered: a board that silently reassigned a person's cards would be indistinguishable from one that lost them.

NameTypeRequiredDescription
bucket_idstring (uuid) required
target_bucket_idstring (uuid), or null requiredThe column the entries moved to - the leftmost remaining one.
moved_itemsinteger requiredHow many entries were moved.

Label object

A tag a collection defines and its entries carry. Defined on the collection rather than on the workspace: a label is a vocabulary the people working in one collection agree on, and a workspace-wide list would make every collection pay for every other's.

NameTypeRequiredDescription
idstring (uuid) required
collection_idstring (uuid) required
namestring
  • minLength: 1
  • maxLength: 120
required
color_tokenstring
  • minLength: 1
requiredA theme token rather than a colour value, so clients render it in their own palette.
descriptionstring, or null requiredAlways present, as null when unset.
versioninteger requiredThe optimistic lock, returned as the ETag and sent back as If-Match.

LabelCreate object

NameTypeRequiredDescription
namestring
  • minLength: 1
  • maxLength: 120
required
color_tokenstring
  • minLength: 1
required
descriptionstring, or null optional

ItemLabels object

The labels one entry carries. Returned by adding and removing rather than the entry itself, because neither touches the entry's own row: a label lives beside it, and an entry whose version had moved would tell a client its title had changed too.

NameTypeRequiredDescription
item_idstring (uuid) required
label_idsarray of string (uuid) required

ItemMembers object

The members one entry carries. Returned by adding and removing rather than the entry itself, for the reason ItemLabels is: neither touches the entry's own row, and an entry whose version had moved would tell a client its title had changed too.

NameTypeRequiredDescription
item_idstring (uuid) required
member_idsarray of string (uuid) required

Assignment object

Who the entry is assigned to.

NameTypeRequiredDescription
account_idstring (uuid) requiredThe account to assign.

LabelUpdate object

JSON Merge Patch; null deletes a field.

NameTypeRequiredDescription
namestring
  • minLength: 1
  • maxLength: 120
optional
color_tokenstring
  • minLength: 1
optionalCannot be cleared.
descriptionstring, or null optional

Comment object

NameTypeRequiredDescription
idstring (uuid) required
item_idstring (uuid) required
author_idstring (uuid) required
parent_comment_idstring (uuid), or null optional
bodystring, or null requiredNull exactly when deleted_at is set: a deleted comment still answers with its identifier, author and timestamps, so a reply does not dangle - but its text is gone, not hidden.
created_atstring (date-time) required
edited_atstring (date-time), or null optional
deleted_atstring (date-time), or null optional
versioninteger required
kindstring
  • USER
  • SYSTEM
  • default: "USER"
optionalUSER is what somebody wrote.
system_codestring, or null optionalThe message code of a system comment's heading, such as sync.displaced_version; null for what somebody wrote.
system_paramsobject, or null optionalThe parameters of the heading - for a displaced version, the field, the device and the reading.

Recurrence object

NameTypeRequiredDescription
idstring (uuid) required
item_idstring (uuid) requiredThe entry the series belongs to - the one the occurrences are copied from.
rrulestring
  • maxLength: 1024
requiredAn RFC 5545 recurrence rule, stored as it was given.
time_zonestring requiredThe IANA zone the rule is read in, required.
modeRecurrenceMode
  • ON_SCHEDULE
  • ON_COMPLETION
requiredON_SCHEDULE puts the next occurrence in place at its time, whether or not the last one was done - a rent payment does not wait.
horizon_daysinteger
  • default: 90
  • minimum: 1
  • maximum: 365
requiredHow far ahead occurrences are materialised, in days.
ends_atstring (date-time), or null optionalWhen the series stops.
max_countinteger, or null
  • minimum: 1
optionalHow many occurrences the series produces at most.
last_materialized_atstring (date-time), or null optionalHow far the materialisation has come.
created_atstring (date-time) required
updated_atstring (date-time), or null optional
versioninteger required

RecurrenceMode string

ON_SCHEDULE puts the next occurrence in place at its time, whether or not the last one was done - a rent payment does not wait. ON_COMPLETION creates the next one only once its predecessor is completed - a task that means "again, two weeks after I last did it".

  • ON_SCHEDULE
  • ON_COMPLETION

RecurrenceInput object

NameTypeRequiredDescription
rrulestring
  • maxLength: 1024
required
time_zonestring required
modeRecurrenceMode
  • ON_SCHEDULE
  • ON_COMPLETION
requiredON_SCHEDULE puts the next occurrence in place at its time, whether or not the last one was done - a rent payment does not wait.
horizon_daysinteger
  • default: 90
  • minimum: 1
  • maximum: 365
optional
ends_atstring (date-time), or null optional
max_countinteger, or null
  • minimum: 1
optional

Template object

NameTypeRequiredDescription
idstring (uuid) required
scope_typeTemplateScope
  • TENANT
  • HUB
  • COLLECTION
requiredWhere the template is defined and therefore who can use it: the whole workspace, one hub and everything under it, or one collection.
scope_idstring (uuid), or null optionalThe container the template is defined in.
namestring
  • maxLength: 200
required
descriptionstring, or null
  • maxLength: 2000
optional
root_typeItemType
  • TASK
  • WORK_PACKAGE
  • ACTIVITY
requiredExtensible; /meta/capabilities returns the valid values.
nodesarray of TemplateNode requiredThe tree, roots first.
created_atstring (date-time) required
updated_atstring (date-time), or null optional
versioninteger required

TemplateScope string

Where the template is defined and therefore who can use it: the whole workspace, one hub and everything under it, or one collection. Defining one workspace-wide is an administrator's act; defining one in a container follows the role matrix there.

  • TENANT
  • HUB
  • COLLECTION

TemplateNode object

NameTypeRequiredDescription
typeItemType
  • TASK
  • WORK_PACKAGE
  • ACTIVITY
requiredExtensible; /meta/capabilities returns the valid values.
titlestring
  • maxLength: 500
required
notesstring, or null optional
due_offsetstring, or null optionalAn ISO-8601 duration from the instantiation's anchor - P3D is "three days in", -P1D is "the day before".
due_date_onlyboolean
  • default: false
optionalTrue for a node whose due date is a day rather than a moment.
assignee_idstring (uuid), or null optionalWho this step always belongs to.
childrenarray of TemplateNode optional

TemplateInput object

NameTypeRequiredDescription
scope_typeTemplateScope
  • TENANT
  • HUB
  • COLLECTION
requiredWhere the template is defined and therefore who can use it: the whole workspace, one hub and everything under it, or one collection.
scope_idstring (uuid), or null optional
namestring
  • maxLength: 200
required
descriptionstring, or null
  • maxLength: 2000
optional
root_typeItemType
  • TASK
  • WORK_PACKAGE
  • ACTIVITY
requiredExtensible; /meta/capabilities returns the valid values.
nodesarray of TemplateNode required

TemplateGeneration object

What to ask for, and where the template would belong.

NameTypeRequiredDescription
collection_idstring (uuid) requiredThe collection the template is drafted for and would be defined in.
descriptionstring
  • minLength: 1
  • maxLength: 2000
requiredWhat the template should produce, in the caller's own words — "onboarding a new colleague, with the accounts to create and the introductions in the first week".

TemplateUpdate object

A merge patch. An absent member is not touched; the node tree travels whole.

NameTypeRequiredDescription
namestring
  • maxLength: 200
optional
descriptionstring, or null
  • maxLength: 2000
optional
nodesarray of TemplateNode optional

TemplateInstantiation object

NameTypeRequiredDescription
collection_idstring (uuid) requiredThe collection the tree lands in.
parent_idstring (uuid), or null optionalThe entry the tree hangs from, when the template's root type is one that sits under another.
anchor_datestring (date), or null optionalThe day the relative dates count from, read in the caller's time zone.
titlestring, or null
  • maxLength: 500
optionalThe root entry's title, overriding the template's own.

TemplateInstance object

NameTypeRequiredDescription
template_idstring (uuid) required
root_item_idstring (uuid) required
createdinteger requiredHow many entries the template produced, the root included.
dropped_referencesarray of DroppedReference requiredWhat the target collection could not carry (I-W6).

TemplatePage object

NameTypeRequiredDescription
dataarray of Template required
pagePageInfo required

Reminder object

NameTypeRequiredDescription
idstring (uuid) required
item_idstring (uuid) required
offset_specstring
  • maxLength: 64
requiredREL:<ISO-8601 duration> counted from the entry's due date - negative for before it - or ABS:<RFC 3339 instant>, a fixed moment.
channelsarray of ReminderChannel required
recipientsarray of string (uuid) requiredWho is reminded.
stateReminderState
  • PENDING
  • SENT
  • CANCELLED
  • LAPSED
requiredWhere the reminder stands, written by the server and never by a client: PENDING until it fires, SENT once it has, CANCELLED when it never will.
fire_atstring (date-time), or null optionalThe moment the server will fire at, and its value alone: for ABS the instant itself, for REL the due date plus the offset, recomputed whenever the due date moves.
created_atstring (date-time) required
updated_atstring (date-time), or null optional
versioninteger required

ReminderChannel string

What carries the reminder. EMAIL is the one channel this installation sends on; more may be added, and a client tolerates a value it does not know.

  • EMAIL

ReminderState string

Where the reminder stands, written by the server and never by a client: PENDING until it fires, SENT once it has, CANCELLED when it never will. Deleting a reminder removes it rather than cancelling it.

LAPSED is the fourth, and only a restore produces it: a reminder whose moment passed while the data sat in an archive. Not CANCELLED, which would leave an auditor reading hundreds of cancellations nobody made, and not PENDING, which would have the scheduler send every one of them at once. To a device it means what a cancellation means - do not remind.

  • PENDING
  • SENT
  • CANCELLED
  • LAPSED

ReminderInput object

NameTypeRequiredDescription
offset_specstring
  • maxLength: 64
required
channelsarray of ReminderChannel optionalOmitted means EMAIL, the one channel this installation sends on.
recipientsarray of string (uuid) optionalOmitted or empty means the assignee and the entry's members.

ReminderUpdate object

A merge patch. An absent member is not touched; a member that is sent replaces what is stored, lists included - channels and recipients are chosen whole.

NameTypeRequiredDescription
offset_specstring
  • maxLength: 64
optional
channelsarray of ReminderChannel optional
recipientsarray of string (uuid) optional

DataSubjectRequestKind string

The right that was exercised. RECTIFICATION needs no special path - a correction is an ordinary write - and is a tracked case all the same, because the deadline is somebody's responsibility either way.

  • ACCESS
  • ERASURE
  • PORTABILITY
  • RESTRICTION
  • OBJECTION
  • RECTIFICATION

DataSubjectRequestStatus string

  • RECEIVED
  • IN_PROGRESS
  • COMPLETED
  • REJECTED

DataSubjectRequestScope string

How far the case reaches. TENANT is this workspace, which is what a controller answering for their own workspace means. INSTALLATION is every workspace of this installation in which the person is a member - the one operation in this system that legitimately crosses the tenant boundary, and it needs the admin:tenants scope, is audited in every workspace it touches, and is the provider's path rather than a tenant's. An ERASURE is never installation-wide: each workspace's owner carries it out, and the case is refused with privacy.installation_erasure_refused.

  • TENANT
  • INSTALLATION

ErasureMode string

ANONYMIZE keeps the authorship as a former user and the workspace's content with it; FULL_DELETE takes the person's own contributions too. The choice rests with the controller, because tenant data touches third parties' rights.

A case that names neither is started as ANONYMIZE — the workspace default. It is the answer that preserves the rights of the people who are not asking: a task somebody else depends on, a comment in a thread that stops making sense without it. A controller who owes maximal erasure names FULL_DELETE on the case, and does so knowingly.

  • ANONYMIZE
  • FULL_DELETE

DataSubjectRequest object

NameTypeRequiredDescription
idstring (uuid) required
kindDataSubjectRequestKind
  • ACCESS
  • ERASURE
  • PORTABILITY
  • RESTRICTION
  • OBJECTION
  • RECTIFICATION
requiredThe right that was exercised.
statusDataSubjectRequestStatus
  • RECEIVED
  • IN_PROGRESS
  • COMPLETED
  • REJECTED
required
scopeDataSubjectRequestScope
  • TENANT
  • INSTALLATION
optionalHow far the case reaches.
subject_account_idstring (uuid), or null optionalThe account the case is about, and null once a full deletion has taken it.
subject_emailstring, or null optionalWho asked, for a request that has no account behind it.
erasure_modeErasureMode
  • ANONYMIZE
  • FULL_DELETE
optionalANONYMIZE keeps the authorship as a former user and the workspace's content with it; FULL_DELETE takes the person's own contributions too.
received_atstring (date-time) required
due_atstring (date-time) requiredThe deadline in force.
original_due_atstring (date-time), or null optionalThe deadline before the extension, present once the case was extended.
extension_reasonDataSubjectRequestExtensionReason
  • COMPLEXITY
  • NUMBER_OF_REQUESTS
optionalWhy the deadline is extended: the request's complexity, or the number of requests the controller is handling.
informed_onstring (date), or null optionalThe day the controller informed the person of the extension.
extendable_untilstring (date) optionalThe latest day the deadline can be extended to, in the workspace's time zone.
completed_atstring (date-time), or null optional
handled_bystring (uuid), or null optional
rejection_reasonstring, or null optional
result_archivestring, or null optionalWhere the export was written at the backup target, once an access or portability case has produced one.
result_target_idstring (uuid), or null optional
notesstring, or null optional
keptarray of ErasureKept optionalWhat legal holds kept from this erasure, one entry per hold.
kept_legal_basisstring
  • ART_17_3_E
optionalWhy what a hold keeps is not erased: the establishment, exercise or defence of legal claims (Art.

ErasureKept object

What one legal hold keeps, or kept, of one erasure. Counts, never content.

NameTypeRequiredDescription
hold_idstring (uuid) required
hold_scopeobject required
accountboolean requiredThe person's account itself is kept, restricted rather than erased.
entriesinteger
  • minimum: 0
requiredEntries the person created that stay attributed to them by name.
commentsinteger
  • minimum: 0
requiredThe person's comments kept - ones a full deletion would remove, or that stay attributed to them by name.
assignmentsinteger
  • minimum: 0
requiredEntries that stay assigned to the person.
intakeinteger
  • minimum: 0
requiredMessages the person sent in by mail, kept with their address.
erased_atstring (date-time) optionalWhen the rest went, once this hold no longer kept it.
blockedobject optionalWhy the rest could not be erased after the hold was lifted.

ErasurePreview object

NameTypeRequiredDescription
modeErasureMode
  • ANONYMIZE
  • FULL_DELETE
requiredANONYMIZE keeps the authorship as a former user and the workspace's content with it; FULL_DELETE takes the person's own contributions too.
keptarray of ErasureKept requiredWhat each hold in force would keep; empty when no hold reaches this person.

DataSubjectRequestCreate object

NameTypeRequiredDescription
kindDataSubjectRequestKind
  • ACCESS
  • ERASURE
  • PORTABILITY
  • RESTRICTION
  • OBJECTION
  • RECTIFICATION
requiredThe right that was exercised.
scopeDataSubjectRequestScope
  • TENANT
  • INSTALLATION
optionalHow far the case reaches.
subject_account_idstring (uuid) optional
subject_emailstring (email) optional
due_atstring (date-time) optionalThe deadline, when it is not thirty days from receipt.
notesstring optional
target_idstring (uuid) optionalThe backup target an access or portability export is written to.

DataSubjectRequestUpdate object

NameTypeRequiredDescription
statusDataSubjectRequestStatus
  • RECEIVED
  • IN_PROGRESS
  • COMPLETED
  • REJECTED
optional
erasure_modeErasureMode
  • ANONYMIZE
  • FULL_DELETE
optionalANONYMIZE keeps the authorship as a former user and the workspace's content with it; FULL_DELETE takes the person's own contributions too.
handled_bystring (uuid) optional
rejection_reasonstring optionalRequired when the case is rejected.
notesstring optional
target_idstring (uuid) optional

DataSubjectRequestExtensionReason string

Why the deadline is extended: the request's complexity, or the number of requests the controller is handling.

  • COMPLEXITY
  • NUMBER_OF_REQUESTS

DataSubjectRequestExtension object

NameTypeRequiredDescription
due_onstring (date) requiredThe new deadline as a day; the case is due by the end of it in the workspace's time zone.
reasonDataSubjectRequestExtensionReason
  • COMPLEXITY
  • NUMBER_OF_REQUESTS
requiredWhy the deadline is extended: the request's complexity, or the number of requests the controller is handling.
informed_onstring (date) requiredThe day the controller informed the person of the extension and its reason: not before the day the request was received, not after today.

ProcessingState object

What the call set, rather than the person it was set on. A restriction touches nothing else about an account, and answering their name and address here would be answering more than the caller asked about.

NameTypeRequiredDescription
account_idstring (uuid) required
statusstring
  • ACTIVE
  • RESTRICTED
required

ProcessingRestriction object

NameTypeRequiredDescription
restrictedboolean required
reasonstring optionalWhy, for the audit trail.

ConsentPurpose string

The optional processing a consent covers. Open rather than an enum, because a purpose is configuration - what an installation offers, not what this contract fixes.

ConsentRecord object

NameTypeRequiredDescription
idstring (uuid) required
account_idstring (uuid), or null optional
purposeConsentPurpose requiredThe optional processing a consent covers.
grantedboolean required
granted_atstring (date-time) optional
revoked_atstring (date-time), or null optional
sourcestring, or null
  • user
  • tenant_admin
  • config
  • null
optional

ConsentRegisterEntry object

NameTypeRequiredDescription
account_idstring (uuid) required
display_namestring required
sincestring (date-time) requiredWhen the withdrawal standing now was recorded.
sourcestring
  • user
  • tenant_admin
  • config
optionalWhether the person or an administrator on their behalf recorded it.

ConsentGrant object

NameTypeRequiredDescription
purposeConsentPurpose requiredThe optional processing a consent covers.
account_idstring (uuid) optionalWhose consent - only ever the caller's own.

OwnAiPosition object

NameTypeRequiredDescription
shownboolean requiredWhether there is anything here at all: AI answers this workspace and more than one person works in it.
person_opt_outAiPersonOptOut
  • OFFERED
  • NOT_OFFERED
requiredOFFERED: each person may keep their own content out of AI.
basisAiOptOutBasis
  • EMPLOYMENT_CONTRACT
  • WORKS_AGREEMENT
  • LEGAL_OBLIGATION
optionalThe legal basis a workspace names for making AI part of everybody's work.
contactstring optionalWhom to ask about the basis.
sincestring (date-time) optionalSince when AI is part of everybody's work.
keeping_outboolean requiredThe caller's own choice - their newest ai_processing record is a withdrawal.
keeping_out_sincestring (date-time) optional
in_effectboolean requiredWhether the caller's content is kept out now.
notice_pendingboolean requiredTrue once, until acknowledged: the workspace made AI part of everybody's work, so the caller's choice stopped taking effect.

ConsentWithdrawal object

NameTypeRequiredDescription
purposeConsentPurpose requiredThe optional processing a consent covers.
account_idstring (uuid) optionalWhose consent.
reasonstring optional

AuditActor object

Who acted, as the entry recorded them. The label is the one that was valid at the time and is stored denormalised: an entry that only pointed at a foreign key would become unreadable the moment the account was deleted, and a trail that loses its meaning through a deletion does not do its job.

NameTypeRequiredDescription
typestring
  • USER
  • SERVICE_ACCOUNT
  • AUTOMATION
  • AI_AGENT
  • SYSTEM
optional
idstring (uuid), or null optional
labelstring, or null optional
on_behalf_ofstring (uuid), or null optionalThe run_as principal for automation and agents

AuditTarget object

The object the entry is about.

NameTypeRequiredDescription
typestring, or null optional
idstring (uuid), or null optional
labelstring, or null optional

AuditContext object

The request the entry belongs to. The address is truncated where the entry is written - IPv4 /24, IPv6 /48 - and the user agent is reduced to a class, because the trail is evidence about actions rather than a second analytics dataset.

NameTypeRequiredDescription
request_idstring optional
trace_idstring optional
ip_prefixstring, or null optional
user_agent_classstring optional
api_clientstring optional
rule_idstring (uuid) optionalThe automation rule that acted
channelstring
  • REST
  • MCP
  • AUTOMATION
  • SYSTEM
  • SYNC
optional

AuditChange object

One changed field, masked per its classification. An OPEN field carries from and to; a SENSITIVE one carries changed and the two hashes instead, which makes two entries comparable without either being readable; a SECRET one is not here at all. A hash is keyed with a secret of the installation and bound to the workspace, and names its scheme as a prefix (hmac-sha256:): two hashes are comparable only when both carry the same scheme and come from the same workspace on an installation whose secret did not change between them. A hash without a prefix was written by an earlier version and is never equal to a prefixed one, whatever the value.

NameTypeRequiredDescription
fieldstring optional
fromanything optional
toanything optional
changedboolean optional
from_hashstring, or null optional
to_hashstring, or null optional

AuditEntry object

Deliberately contains no user content (titles, notes, comments), so that the audit stays unaffected by deletion obligations on content.

NameTypeRequiredDescription
idstring (uuid) required
seqinteger optional
occurred_atstring (date-time) required
actionstring required
outcomestring
  • SUCCESS
  • DENIED
  • FAILED
required
severitystring
  • INFO
  • NOTICE
  • WARNING
  • CRITICAL
optional
actorAuditActor requiredWho acted, as the entry recorded them.
targetAuditTarget optionalThe object the entry is about.
changesarray of AuditChange optional
contextAuditContext optionalThe request the entry belongs to.
legal_basisstring, or null optional
hashstring optional

AuditExportFormat string

JSON Lines keeps the entry as it is - the nested actor, target, context and changes - and is what a second system reads. CSV flattens it for a spreadsheet, and what does not fit a column travels as JSON inside one.

  • JSONL
  • CSV

AuditAnchoringConfiguration object

NameTypeRequiredDescription
target_idstring (uuid), or null requiredThe workspace's backup target the daily anchor is written to; null switches anchoring off.

AuditAnchoring object

NameTypeRequiredDescription
target_idstring (uuid), or null optionalThe target anchoring writes to, or null where it is off.
configured_atstring (date-time) required
configured_bystring (uuid), or null optional

AuditExport object

A period, a format, and where the archive goes. There is no filter beyond the period on purpose: an export is evidence about an interval, and one that had been narrowed by action or actor before it was signed would be evidence about somebody's selection.

NameTypeRequiredDescription
fromstring (date-time) required
tostring (date-time) required
formatAuditExportFormat
  • JSONL
  • CSV
optionalJSON Lines keeps the entry as it is - the nested actor, target, context and changes - and is what a second system reads.
target_idstring (uuid) requiredThe backup target the archive is written to.

BackupTargetKind string

  • LOCAL
  • S3
  • SFTP
  • FTPS
  • FTP
  • WEBDAV
  • SMB
  • AZURE_BLOB
  • GCS
  • RCLONE
  • HTTP_PUT

BackupTarget object

NameTypeRequiredDescription
idstring (uuid) required
namestring required
kindBackupTargetKind
  • LOCAL
  • S3
  • SFTP
  • FTPS
  • FTP
  • WEBDAV
  • SMB
  • AZURE_BLOB
  • GCS
  • RCLONE
  • HTTP_PUT
required
scopestring
  • INSTANCE
  • TENANT
optional
configobject optionalEndpoint, bucket, path, region - without credentials.
encryption_modestring
  • AES256_GCM
  • NONE
required
encryption_key_idstring, or null optional
region_notestring, or null optionalData residency; relevant for third-country targets
enabledboolean optional
last_test_atstring (date-time), or null optional
last_test_okboolean, or null optional
warningsarray of string optionale.g.

BackupTargetCreate object

NameTypeRequiredDescription
namestring required
kindBackupTargetKind
  • LOCAL
  • S3
  • SFTP
  • FTPS
  • FTP
  • WEBDAV
  • SMB
  • AZURE_BLOB
  • GCS
  • RCLONE
  • HTTP_PUT
required
configobject required
credentialsobject optionalOnly on create/update; stored encrypted and never returned.
encryption_modestring
  • AES256_GCM
  • NONE
  • default: "AES256_GCM"
optional
encryption_passphrasestring, or null optionalNot stored.
insecure_acknowledgedboolean
  • default: false
optionalMandatory for FTP or unencrypted storage (encryption_mode NONE).

BackupTargetProbe object

What a write-read-delete against the target found. A target that could not be reached is a result rather than an error: it is what the caller asked to find out.

NameTypeRequiredDescription
okboolean required
latency_msnumber required
writableboolean requiredWhether the write half worked.
free_bytesinteger, or null requiredHow much room is left, or null where the protocol cannot say.
error_codestring, or null requiredA message code, never the driver's message.

BackupArchive object

Read from the manifest at the target, not from the database.

NameTypeRequiredDescription
archive_idstring optionalThe manifest's own identifier - not what a restore names.
pathstring optionalWhere the archive lies at the target, and what RestoreRequest.archive_id takes.
created_atstring (date-time) optional
modestring
  • FULL
  • INCREMENTAL
optional
parent_archive_idstring, or null optional
scopeobject optional
size_bytesinteger optional
item_countinteger optional
media_countinteger optional
schema_versionstring optional
product_versionstring optional
encryptedboolean optional
encryption_key_idstring, or null optional
checksum_statusstring
  • UNVERIFIED
  • OK
  • MISMATCH
optional
completeboolean optionalWhether the run that wrote it finished - whether checksums.txt is there.
expires_atstring (date-time), or null optional

BackupStart object

A backup asked for by hand rather than by a schedule.

NameTypeRequiredDescription
target_idstring (uuid) required
modestring
  • FULL
  • INCREMENTAL
  • default: "FULL"
optionalFULL by default, and deliberately: a run somebody asked for by hand is usually asked for because something is about to happen, and an incremental that turns out to have no parent at the target is the wrong thing to discover then.
include_mediaboolean
  • default: true
optional
include_auditboolean
  • default: true
optional

BackupRun object

One run of a backup. Its id is also the archive's id in the manifest at the target, which is what lets :verify and a restore name the same thing a caller already holds.

NameTypeRequiredDescription
idstring (uuid) required
target_idstring (uuid) required
schedule_idstring (uuid), or null optional
parent_run_idstring (uuid), or null optionalThe archive this one continues, on an incremental run.
triggerstring
  • SCHEDULE
  • MANUAL
  • PRE_RESTORE
  • PRE_DELETE
  • API
required
modestring
  • FULL
  • INCREMENTAL
required
statusstring
  • RUNNING
  • SUCCEEDED
  • FAILED
  • CANCELLED
  • EXPIRED
required
archive_pathstring, or null optionalWhere the archive lies at the target
size_bytesinteger, or null optional
item_countinteger, or null optional
media_countinteger, or null optional
snapshot_atstring (date-time), or null optionalThe instant the archive represents, taken from the database's own clock.
started_atstring (date-time) required
finished_atstring (date-time), or null optional
error_codestring, or null optionalThe message code of the failure, never a message and never free text.
expires_atstring (date-time), or null optionalWhen the generation plan expects this archive to go.
verified_atstring (date-time), or null optional
verify_okboolean, or null optional
trial_restoreone of BackupRunTrial, anything, or null optionalWhat the trial restore found: after a scheduled FULL run whose schedule has trial_restore on, the same job reads the archive back as an INSPECT restore - every member read, every checksum verified, every encrypted member decrypted with the key the schedule names - and records the difference report against the workspace here.

BackupRunTrial object

NameTypeRequiredDescription
inspected_atstring (date-time) required
reportRestoreReport optionalWhat a restore did, or - on a dry run - what it would do.
failureone of BackupRunTrialFailure, anything, or null optionalWhat could not be read back, on a run that failed its trial.

BackupRunTrialFailure object

NameTypeRequiredDescription
codestring requiredThe reader's message code.
memberstring, or null optionalThe member at the target where it stopped.

BackupSchedule object

NameTypeRequiredDescription
idstring (uuid) optional
target_idstring (uuid) required
scopeobject required
rrulestring required
timezonestring
  • default: "UTC"
optional
modestring
  • FULL
  • INCREMENTAL
  • default: "INCREMENTAL"
optional
full_rrulestring, or null optional
include_mediaboolean
  • default: true
optional
include_auditboolean
  • default: true
optional
trial_restoreboolean
  • default: true
optionalFollow every FULL run with an INSPECT restore of the archive it wrote, in the same job, and store the difference report on the run.
retentionBackupRetention optionalThe generation principle.
notify_onarray of string optional
enabledboolean
  • default: true
optional
next_run_atstring (date-time), or null optional

BackupScheduleUpdate object

Every field optional; an omitted one is left alone. The target and the scope are not among them: a schedule that moved either would be a different schedule under an old identifier, and the archives already at the target would disagree with it.

NameTypeRequiredDescription
rrulestring optional
timezonestring optional
modestring
  • FULL
  • INCREMENTAL
optional
full_rrulestring, or null optional
include_mediaboolean optional
include_auditboolean optional
trial_restoreboolean optional
retentionBackupRetention optionalThe generation principle.
notify_onarray of string optional
enabledboolean optionalOff keeps the rule and owes nothing: next_run_at is cleared, and switching it back on computes the next moment afresh rather than resuming a missed one.

BackupRetention object

The generation principle. min_keep prevents no backup being left at all.

NameTypeRequiredDescription
keep_lastinteger
  • default: 7
optional
keep_dailyinteger
  • default: 14
optional
keep_weeklyinteger
  • default: 8
optional
keep_monthlyinteger
  • default: 12
optional
keep_yearlyinteger
  • default: 3
optional
min_keepinteger
  • default: 3
  • minimum: 1
optional

RestoreRequest object

NameTypeRequiredDescription
target_idstring (uuid) required
archive_idstring requiredWhere the archive lies at the target: the path of a BackupArchive as GET /backup-targets/{targetId}/backups lists it (and as RestoreRun.source_archive echoes it), not the archive_id beside it, which is the manifest's.
modestring
  • INSPECT
  • SELECTIVE
  • MERGE
  • REPLACE_TENANT
  • NEW_TENANT
  • INSTANCE
required
target_tenant_idstring (uuid), or null optionalThe tenant being restored into.
conflict_rulestring
  • SKIP
  • OVERWRITE
  • DUPLICATE
  • default: "SKIP"
optional
selectionobject optionalThe selection for SELECTIVE - container and/or item IDs.
decryption_passphrasestring, or null optional
dry_runboolean
  • default: true
optional
create_safety_backupboolean
  • default: true
optional
confirmationstring, or null optionalFor destructive modes, the exact tenant name.
step_up_tokenstring, or null optionalThe proof of a fresh, stronger authentication for a destructive mode: the token POST /auth/step-up answered.

RestoreRun object

One restore, asked for or done. Its report is what a dry run produces and what the mode without dry_run is judged against.

NameTypeRequiredDescription
idstring (uuid) required
target_idstring (uuid) required
source_archivestring requiredWhere the archive lies at the target.
tenant_idstring (uuid), or null optionalThe tenant being restored into.
modestring
  • INSPECT
  • SELECTIVE
  • MERGE
  • REPLACE_TENANT
  • NEW_TENANT
  • INSTANCE
required
conflict_rulestring
  • SKIP
  • OVERWRITE
  • DUPLICATE
optional
dry_runboolean required
statusstring
  • PENDING
  • VALIDATING
  • RUNNING
  • SUCCEEDED
  • FAILED
  • CANCELLED
required
safety_backup_run_idstring (uuid), or null optionalThe copy taken before a destructive mode, and the way back from it.
reportRestoreReport optionalWhat a restore did, or - on a dry run - what it would do.
started_atstring (date-time), or null optional
finished_atstring (date-time), or null optional
error_codestring, or null optionalThe message code of the failure, never a message and never free text.

ImportKind string

The system the file came from. CSV is a header row and one entry per line; TRELLO is a board's JSON export; GOOGLE_TASKS is Takeout's Tasks.json; MICROSOFT_TODO is the Graph API's JSON for the lists and their tasks. A kind this build does not serve is refused by name.

  • CSV
  • TRELLO
  • GOOGLE_TASKS
  • MICROSOFT_TODO

ImportRequest object

NameTypeRequiredDescription
media_idstring (uuid) requiredThe uploaded file, staged with usage: IMPORT and confirmed.
kindImportKind
  • CSV
  • TRELLO
  • GOOGLE_TASKS
  • MICROSOFT_TODO
requiredThe system the file came from.
hub_idstring (uuid) requiredThe hub the imported collections land under.
mappingobject optionalFor CSV only: which column carries which field, by header name, where the header does not already say - title, notes, due, completed, labels, bucket, parent.

ImportRun object

NameTypeRequiredDescription
idstring (uuid) required
kindImportKind
  • CSV
  • TRELLO
  • GOOGLE_TASKS
  • MICROSOFT_TODO
requiredThe system the file came from.
hub_idstring (uuid) required
media_idstring (uuid) optional
statusstring
  • PENDING
  • RUNNING
  • SUCCEEDED
  • FAILED
required
reportRestoreReport optionalWhat landed, in the restore's shape; absent until the job has run.
refusedarray of object optionalThe rows the converter could not read, by their number in the source and the code that says why.
error_codestring, or null optional
created_atstring (date-time) required
finished_atstring (date-time), or null optional

RestoreReport object

What a restore did, or - on a dry run - what it would do. The same shape either way, so that the report a caller approved and the report they get back are comparable.

NameTypeRequiredDescription
newinteger optionalObjects the archive holds and the tenant does not.
overwritteninteger optionalObjects replaced by the archive's version.
skippedinteger optionalObjects left as they are.
duplicatedinteger optionalObjects imported beside the live one under a new identity.
conflictsinteger optionalCollisions the conflict rule had to decide.
deletedinteger optionalObjects the archive holds that the deletion journal kept out.
withheldobject optionalWhat the restore deliberately did not bring back, counted by reason - deletion_journal, excluded_entity, media_missing, orphaned (a row whose parent is in neither the archive nor the target), legal_hold_kept (a legal hold of the archive that a restore into a living workspace does not take, because the workspace keeps its own) - and, for an import, what the source carried that the product has no place for - unmapped_members.
mediainteger optionalAttachments transferred back into the object store.
entitiesobject optionalHow many records each entity contributed.

PurgeSummary object

What one pass of a removal did.

NameTypeRequiredDescription
matchedinteger requiredHow many rows the pass considered, whether or not they went.
removedinteger requiredHow many actually went.
blockedobject requiredWhat was kept, counted by reason - legal_hold, tombstone_window.

TrashPage object

NameTypeRequiredDescription
dataarray of TrashEntry required
pagePageInfo required

CommentPage object

NameTypeRequiredDescription
dataarray of Comment required
pagePageInfo required

ActivityPage object

NameTypeRequiredDescription
dataarray of ActivityEntry required
pagePageInfo required

ActivityEntry object

One step of an entry's history. Append-only: nothing edits one, and what removes one is the deletion of the entry it belongs to.

NameTypeRequiredDescription
idstring (uuid) required
item_idstring (uuid) required
codestring requiredThe message the client renders, from locales/*.json - activity.item_completed and the rest.
actorobject requiredWho did it.
occurred_atstring (date-time) required
change_setobject requiredThe fields that moved, keyed by field name.

TrashEntry object

One deletion, as the trash lists it. A projection rather than the object: it carries what the view shows and what restoring it needs, and reading the entry back in full is a second request to the object's own endpoint.

NameTypeRequiredDescription
kindstring
  • CONTAINER
  • ITEM
requiredWhich of the two endpoints restores it.
idstring (uuid) required
trash_batch_idstring (uuid) requiredThe deletion every row of one act shares.
deleted_atstring (date-time) requiredWhen it went in, and the moment the retention period runs from.
purge_afterstring (date-time) requiredThe earliest moment the automatic removal takes it, unless a legal hold keeps it: the workspace's trash period from deleted_at, and never sooner than the longest a device may stay offline, so that every device has learnt of the deletion first.
deleted_byone of Actor, anything, or null requiredWho put it there.
titlestring requiredThe container's name or the entry's title.
subtypestring requiredHUB or COLLECTION for a container, TASK, WORK_PACKAGE or ACTIVITY for an entry.
hub_idstring (uuid), or null requiredThe hub it sits under.
collection_idstring (uuid), or null requiredThe collection an entry belongs to.
parent_idstring (uuid), or null requiredWhere it would go back to - the hub of a collection, the entry above an entry.
versioninteger requiredThe row's version, so a restore can be sent with the version it was read at.

RetentionDataKind object

One class of data a retention rule may name, and what this build can do to it.

NameTypeRequiredDescription
data_kindstring optional
default_daysinteger optionalThe period a workspace starts with.
min_daysinteger optionalWhat no rule may undercut.
max_daysinteger, or null optionalThe upper bound where the operator has set one, and null where there is none.
actionsarray of string optionalWhat this build can do to this kind.

RetentionPolicy object

NameTypeRequiredDescription
idstring (uuid) optional
scopeobject required
data_kindstring requiredOne of the kinds /meta/capabilities lists under retention_data_kinds.
conditionstring, or null optionalAn optional CEL expression
retain_daysinteger
  • minimum: 0
required
actionstring
  • ARCHIVE
  • TRASH
  • ANONYMIZE
  • HARD_DELETE
  • EXPORT_THEN_DELETE
  • NOTIFY_ONLY
required
then_after_daysinteger, or null optional
then_actionstring, or null
  • ARCHIVE
  • TRASH
  • ANONYMIZE
  • HARD_DELETE
  • EXPORT_THEN_DELETE
  • null
optional
grace_daysinteger
  • default: 14
optional
notifyobject optional
justificationstring, or null optionalMandatory when the upper bound is exceeded
enabledboolean
  • default: true
optional
export_target_idstring (uuid), or null optional
in_forceboolean optionalWhether this is the rule that would act in the container the listing was asked about (container_id).

RetentionPolicyUpdate object

Every field optional; an omitted one is left alone. The kind and the scope are not among them: a rule that changed either would be a different rule under an old identifier.

NameTypeRequiredDescription
conditionstring, or null optionalAn optional CEL expression.
retain_daysinteger
  • minimum: 0
optional
actionstring
  • ARCHIVE
  • TRASH
  • ANONYMIZE
  • HARD_DELETE
  • EXPORT_THEN_DELETE
  • NOTIFY_ONLY
optional
then_after_daysinteger, or null optional
then_actionstring, or null
  • ARCHIVE
  • TRASH
  • ANONYMIZE
  • HARD_DELETE
  • EXPORT_THEN_DELETE
  • null
optional
grace_daysinteger optional
notifyobject optional
justificationstring, or null optionalWhy the period exceeds the kind's upper bound.
enabledboolean optional
export_target_idstring (uuid), or null optional

LegalHold object

An instruction not to delete something. The first thing every deletion path checks, and the one that overrides a workspace's own configured periods.

NameTypeRequiredDescription
idstring (uuid) required
scopeobject required
reasonstring requiredWhy, in the words of whoever placed it.
placed_bystring (uuid) required
placed_atstring (date-time) required
released_bystring (uuid), or null optional
released_atstring (date-time), or null optional
released_reasonstring, or null optionalWhy it was lifted.

LegalHoldCreate object

NameTypeRequiredDescription
scopeobject requiredWhat the hold covers.
reasonstring
  • minLength: 1
  • maxLength: 2000
required

LegalHoldRelease object

NameTypeRequiredDescription
reasonstring
  • minLength: 1
  • maxLength: 2000
requiredWhy the hold is being lifted.

RetentionState object

Visible on the object for as long as a retention rule applies.

NameTypeRequiredDescription
actionstring optional
effective_atstring (date-time) optional
policy_idstring (uuid) optional
can_retainboolean optional
blocked_bystring, or null
  • legal_hold
  • restriction
  • null
optional

SyncPullRequest object

NameTypeRequiredDescription
device_idstring (uuid) requiredThe device asking, minted by the client (UUIDv7) and kept in its own store.
platformstring, or null
  • maxLength: 40
optionalWhat the device is - ios, android, desktop-macos, hubctl - for the device list.
display_namestring, or null
  • maxLength: 120
optionalHow the device introduces itself in the list - "Anna's phone".
cursorstring, or null optionalOpaque; NULL means an initial synchronisation.
scopesarray of object optionalWhat the device wants to hold.
limitinteger
  • default: 500
  • maximum: 2000
optional

SyncSnapshotRequest object

What :pull takes for an initial synchronisation, without a cursor or a page size.

NameTypeRequiredDescription
device_idstring (uuid) requiredThe device asking, as on :pull; it registers by turning up.
platformstring, or null
  • maxLength: 40
optional
display_namestring, or null
  • maxLength: 120
optional
scopesarray of object optionalWhat the device wants to hold, as on :pull; no scope means everything the caller may read.

SyncChange object

NameTypeRequiredDescription
opstring
  • UPSERT
  • DELETE
  • ACCESS_REVOKED
required
entitystring required
entity_idstring (uuid) required
container_idstring (uuid), or null optional
hlcstring optional
occurred_atstring (date-time) optionalWhen the change was recorded, for a client to render and an operator to line up against a log.
actor_idstring (uuid), or null optionalWho made the change; absent for the installation's own.
device_idstring (uuid), or null optionalThe device whose push caused it, so that device can skip its own echo; absent for a change made through the API.
payloadobject, or null optionalWhat moved.

SyncPullResponse object

NameTypeRequiredDescription
changesarray of SyncChange required
cursorstring required
has_moreboolean required
server_timestring (date-time) optional
tombstone_window_daysinteger optionalThe maximum offline window before a forced resynchronisation

SyncMutation object

NameTypeRequiredDescription
op_idstring (uuid) requiredThe idempotency key.
kindstring
  • ITEM_CREATE
  • ITEM_PATCH
  • ITEM_DELETE
  • SET_ADD
  • SET_REMOVE
  • MOVE
  • COMMENT_ADD
required
item_idstring (uuid) optionalAssigned by the client (UUIDv7), including on CREATE
base_versioninteger, or null optional
fieldsobject optionalPer-field changes, each field with its own HLC.
setstring, or null
  • labels
  • members
  • watchers
  • attachments
  • null
optionalWhich set of the entry the element belongs to.
elementstring (uuid), or null optional
hlcstring, or null optional
payloadobject, or null optional

SyncPushRequest object

NameTypeRequiredDescription
device_idstring (uuid) requiredThe device pushing; registered the way a pull registers it.
platformstring, or null
  • maxLength: 40
optional
display_namestring, or null
  • maxLength: 120
optional
mutationsarray of SyncMutation
  • maxItems: 500
required

SyncMutationResult object

NameTypeRequiredDescription
op_idstring (uuid) required
resultstring
  • APPLIED
  • MERGED
  • REJECTED
  • CONFLICT
required
entity_idstring (uuid), or null optional
server_stateobject, or null optional
conflictobject, or null optionalBoth versions on CONFLICT; the displaced one is preserved as a system comment.
errorobject, or null optional

SyncPushResponse object

NameTypeRequiredDescription
resultsarray of SyncMutationResult required
cursorstring, or null optionalThe cursor after application, saving a pull.
server_timestring (date-time) optional

SyncDevice object

NameTypeRequiredDescription
idstring (uuid) required
platformstring, or null optional
display_namestring, or null optional
last_seen_atstring (date-time), or null optional
last_cursorstring, or null optionalWhere the device last stood in the log, as an opaque cursor it could resume from.
blockedboolean requiredForgotten; every contact from the identifier is refused.
created_atstring (date-time) optional

JobStatus string

What a caller sees of a job's life. Five states rather than the queue's six: a job the queue gave up on is FAILED, because "it did not work and will not be tried again" is the whole of what a caller can act on, and the dead letter is an operator's word for where the row went.

  • QUEUED
  • RUNNING
  • SUCCEEDED
  • FAILED
  • CANCELLED

SearchReindex object

What a reindex answers - the job to watch, and how many rows it will rewrite.

NameTypeRequiredDescription
job_idstring (uuid) required
staleinteger (int64) requiredHow many entries were indexed under a configuration that is not what the installation would use for them today - including the ones written before the configuration was recorded at all.

JobRef object

The pointer a 202 Accepted hands back. It is the same shape as Job, narrowed to what is knowable at the moment the work was accepted.

NameTypeRequiredDescription
job_idstring (uuid) required
statusJobStatus
  • QUEUED
  • RUNNING
  • SUCCEEDED
  • FAILED
  • CANCELLED
requiredWhat a caller sees of a job's life.
progressnumber, or null optional
result_urlstring, or null optional

Job object

Background work, as the caller who asked for it sees it. Deliberately narrow: the queue's row also carries the payload, the attempt count, the lease and the deduplication key, and all four are the queue's business rather than a caller's - a payload can name objects the caller may not resolve, and an attempt count invites a client to reason about a retry policy that is not part of the contract. Widening this later is additive; narrowing it would not be.

NameTypeRequiredDescription
job_idstring (uuid) required
statusJobStatus
  • QUEUED
  • RUNNING
  • SUCCEEDED
  • FAILED
  • CANCELLED
requiredWhat a caller sees of a job's life.
progressnumber, or null
  • minimum: 0
  • maximum: 1
requiredHow far along, between 0 and 1, or null from a job that cannot say.
result_urlstring, or null requiredWhere what the job produced can be fetched, once there is something.
error_codestring, or null requiredThe message code of the last failure, never a message and never free text.
error_paramsobject optionalThe parameters the sentence of error_code reads, where the job ended with a refusal that has some - an AI budget spent since the job was accepted carries reason (budget_spent) and renews_at, exactly as the same refusal does on a request.
created_atstring (date-time) required
finished_atstring (date-time), or null requiredWhen the job reached a terminal state.

HealthStatus string

  • ok
  • degraded
  • down
  • disabled

DependencyHealth object

NameTypeRequiredDescription
namestring required
requiredboolean requiredA mandatory dependency; only PostgreSQL is mandatory.
statusHealthStatus
  • ok
  • degraded
  • down
  • disabled
required
latency_msnumber, or null optional
sincestring (date-time), or null optionalThe time of the last state change.
last_error_codestring, or null optionalA stable error code, not free text and not a third-party message.
circuit_statestring, or null
  • closed
  • half_open
  • open
  • null
optional
impactarray of string optionalThe features affected during a disruption.

DegradedFeature object

NameTypeRequiredDescription
featurestring required
reason_codestring required
sincestring (date-time) required

HealthWarning object

NameTypeRequiredDescription
codestring requiredA message code, translatable on the client side.
severitystring
  • info
  • warn
  • critical
required
paramsobject optional

HealthReport object

Machine-readable self-diagnosis. warnings names what the installation is missing, without an error having occurred (a missing backup, missing SMTP with reminders enabled, expiring keys).

Only status, version and degraded_features are answered to every reader. dependencies, migration, backlogs and warnings are the installation's internals and are present only in the operator's answer - absent rather than empty, because an empty dependencies would read as "nothing is monitored" and that is a different statement. version is required because the public capability manifest already carries it.

NameTypeRequiredDescription
statusHealthStatus
  • ok
  • degraded
  • down
  • disabled
required
versionstring required
rolearray of string optional
migrationobject optional
dependenciesarray of DependencyHealth optional
degraded_featuresarray of DegradedFeature optional
backlogsobject optional
warningsarray of HealthWarning optional

QueryField object

One field POST /items:query accepts, and what may be asked of it.

NameTypeRequiredDescription
fieldstring required
kindstring
  • string
  • text
  • id
  • boolean
  • integer
  • timestamp
  • enum
  • id_set
requiredWhat a value for this field looks like.
operatorsarray of string requiredThe comparisons this field permits, exhaustively.
valuesarray of string optionalThe permitted values, for a field of kind enum.
nullableboolean requiredWhether the field can be absent, and IS_NULL therefore means something.
sortableboolean required
groupableboolean required

Capabilities object

Self-description; clients configure themselves from this.

NameTypeRequiredDescription
product_versionstring optional
api_versionstring optional
tenancy_modestring
  • single
  • multi
optional
item_typesarray of object optional
view_layoutsarray of string optional
completion_policiesarray of CompletionPolicy optionalThe values a collection's completion_policy may take, in the domain's order.
auto_assign_strategiesarray of AutoAssignStrategy optionalThe values an auto-assign policy's strategy may take, for the reason the completion policies are listed.
query_fieldsarray of QueryField optionalWhat POST /items:query accepts.
text_languagesarray of string optionalThe languages this installation can index the text of, as BCP-47 tags, and what a client's language picker for content_language is built from.
supported_localesarray of object optionalThe locales this installation has a catalogue for, in the order it serves them - the source language first - with the metadata a client needs before it has rendered anything.
automationobject optionalThe vocabulary a rule is written in, and what a rule editor is built from rather than from a list compiled into it - a client with its own would be wrong on the installation that has one more.
event_typesarray of string optional
retention_data_kindsarray of RetentionDataKind optionalThe classes of data a retention rule may name, and what this build can do to each.
notification_categoriesarray of string optionalThe categories a person can be told about, and the rows a notification-preference form has.
notification_channelsarray of string optionalThe channels this installation delivers on.
token_scopesarray of string optionalEvery scope a personal access token or an authorized app may be granted here, sorted.
rolesarray of RoleDescription optionalThe role matrix as this installation enforces it.
limitsobject optional
featuresobject optionalWhich optional parts of this installation are configured - what it can do, not what the build implements.
legalLegalLinks optionalThe four links this installation is obliged to show, resolved for the caller's workspace or - where the caller has none - for the installation itself.
instanceInstanceReach optionalWhat this caller may do at the level above the workspaces.
workspace_permissionsarray of string optionalThe columns of the role matrix the caller holds on the workspace itself, from every membership they hold there - their own and their groups' - decided as every request is decided, and recording nothing: asking is not an attempt.
deprecationsarray of DeprecatedField optionalEvery request field this contract has marked deprecated, with the operations that take it, since when, and the major version it goes away with.

DeprecatedField object

One deprecated request field, and when it goes. Identifiers only: what replaces it is named, and the field's description in the specification says the rest.

NameTypeRequiredDescription
operation_idstring required
methodstring required
pathstring requiredThe operation's path as the specification writes it.
fieldstring requiredThe field in the request body.
sincestring (date) requiredWhen it was marked deprecated.
removed_instring requiredThe major version of the contract it goes away with.
sunsetstring (date), or null optionalThe day it stops being accepted, once one is set.
replaced_byarray of string requiredWhat takes its place: the operationId of an operation, or the name of a header.

RoleDescription object

One row of the role matrix: the permissions the role carries, and what it may do to a single entry. Every cell is bounded by where the membership was granted. The role applies downwards from its scope - tenant, hub, collection, or one entry - so a role granted at ITEM scope reaches that entry and nothing else. That is what sharing an entry with a guest is; it needs no separate mechanism and is therefore not a property of the role.

NameTypeRequiredDescription
roleMembershipRole
  • OWNER
  • ADMIN
  • MEMBER
  • CONTRIBUTOR
  • VIEWER
  • GUEST
  • AUDITOR
optionalAUDITOR is the one that is not a rung on the same ladder: it reads the audit trail and the configuration and no content at all.
permissionsarray of string optionalThe columns of the matrix this role carries unqualified.
item_accessRoleItemAccess optionalWhat a role does to a single entry, per kind of access.

RoleItemAccess object

What a role does to a single entry, per kind of access. Every kind is answered, including the ones that are NONE: an absent one would leave a client guessing, and guessing wrong in the permissive direction is what this endpoint exists to prevent.

NameTypeRequiredDescription
readItemAccess
  • ALL
  • ASSIGNED
  • NONE
optionalHow far a role reaches into one entry.
createItemAccess
  • ALL
  • ASSIGNED
  • NONE
optionalHow far a role reaches into one entry.
changeItemAccess
  • ALL
  • ASSIGNED
  • NONE
optionalHow far a role reaches into one entry.
commentItemAccess
  • ALL
  • ASSIGNED
  • NONE
optionalHow far a role reaches into one entry.

ItemAccess string

How far a role reaches into one entry. ALL is unqualified. ASSIGNED is only where the actor is the entry's assignee - which is what the matrix's "assigned only" cell means, and why a contributor's create is ALL while their change is not: a created entry is assigned to its creator, so the qualifier holds at every moment rather than being suspended for the one call that would break it. NONE is never, whatever the membership.

  • ALL
  • ASSIGNED
  • NONE