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
PageInfo object
ContainerPage object
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.
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.
AUTOLEXICALdefault: "AUTO"
WorkItemPage object
ContainerType string
HUBCOLLECTION
ItemType string
Extensible; /meta/capabilities returns the valid values.
TASKWORK_PACKAGEACTIVITY
Account object
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.
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.
ManagedAccountCreate object
ManagedAccountCreated object
StartPasswordIssued object
AddressRequest object
AddressRequested object
AddressConfirm object
InvitedAccount Account
AccountInvite object
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.
NotificationPreference object
NotificationPreferenceList object
NotificationPreferenceUpdate object
ServiceAccountCreate object
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.
AccessTokenCreate object
AccessTokenSecret AccessToken
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.
SessionRefresh object
InvitationRedemption object
InvitationInspection object
InvitationSummary object
What the invitation card names before anything is typed.
InstallationSetUp object
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.
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.
AccountsWithoutProvider object
How many active people of the workspace no provider switched on there signs in. A number, never a list.
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.
OidcAuthorization object
Where to send the browser, and the handle to finish with.
OidcCallback object
What the provider's redirect carried back.
Suggestion object
One thing AI proposed about one entry, with its provenance. It has changed nothing: what a suggestion is, is a record.
AiTranslateRequest object
Which language to read the entry in.
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.
AiAsk object
How to ask, which is one question — propose, or apply.
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.
SuggestionPage object
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_ITEMJUMBLE_ENTRYCONTAINER
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.
FIELDSDECOMPOSITIONDUPLICATESTEMPLATE
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.
PROPOSEDACCEPTEDDISMISSED
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.
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.
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).
OfferedAiModelConfiguration object
An offered model, set whole. Consent is not here: switching an offered model on is each workspace's own act.
AiSources string
Which sources a workspace may use: none, only a model the installation offers, only its own (the default), or either.
NONEOFFEREDOWNEITHER
AiSourceKind string
Which source answers a workspace.
OWNOFFEREDNONE
AiMinJurisdiction string
The least a workspace's own model must declare about where it processes content, further right being stricter.
ANYADEQUACYEEASELF_HOSTED
AiSource object
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.
OFFEREDNOT_OFFERED
AiOptOutBasis string
The legal basis a workspace names for making AI part of everybody's work.
EMPLOYMENT_CONTRACTWORKS_AGREEMENTLEGAL_OBLIGATION
AiPersonOptOutChoice object
OfferedAiModelSummary object
OwnAiBudget object
AiSourceChoice object
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.
NOOPOPENAI_COMPATIBLEOLLAMA
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_HOSTEDEEAADEQUACYTHIRD_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.
PrivateHubAccessRequest object
PrivateHubAccess object
One opening of a private hub by the workspace's owner (the emergency access): who, when, until when, and why.
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.
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.
SignInPolicyNumber object
One numeric switch, at the three levels that decide it. Zero is off for every one of them.
SignInPolicyFlag object
SignInPolicyText object
SignInMethod string
One way into a workspace. A named schema, so that every reader of one shares a type.
PASSWORDOIDC
SignInPolicyMethods object
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.
DEFAULTINSTANCEPLANWORKSPACE
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.
INSTANCEPLANnull
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.
PasswordPolicySettings object
The thirteen switches about the password itself, each at its three levels.
SessionPolicySettings object
The two bounds a session answers to beside its own expiry.
LegalPolicySettings object
The four links, each with its own lock - B2C locks them, B2B leaves them open.
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.
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.
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.
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.
ProviderOffer object
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.
GENERICGOOGLEMICROSOFT
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_ONLYDOMAINSANY
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.
ProviderWithdrawal object
When an offered provider is withdrawn, and for Withdraw now the count confirmed.
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.
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.
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.
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.
InstanceJournalPage object
SessionElevation object
How long this session carries the control plane's scope.
RecoveryCodes object
The ten codes, shown once and stored only as hashes.
PasswordChange object
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.
PasswordViolation object
One rule the candidate breaks, as an identifier and its parameters.
PasswordCheckResult object
SignInPasswordChange object
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.
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.
Operator object
One row of the register: an account of some workspace that operates this installation.
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.
PasswordForgot object
PasswordReset object
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.
ProviderSummary object
One way into this workspace, as a sign-in card needs it.
LegalLinks object
The links this installation's operator is obliged to show, resolved workspace -> instance -> nothing. A link that is set nowhere is absent rather than empty: a private installation owes nobody an imprint, and a footer of four links pointing nowhere is worse than no footer.
SignInRules object
The least a sign-in screen needs, and deliberately no more.
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.
TermsInForce object
The terms of use a person is asked to agree to.
TermsAgreement object
LinkCompletion object
SignInCompletion object
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.
TotpEnrollment object
The secret's single showing. Store it in an authenticator or lose it.
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.
AuthenticatorReplacementConfirmation object
TotpConfirmation object
TotpConfirmed object
AdminTenant object
PasswordOpening object
An operator's opening of the password for one workspace: when it ends, who asked and why.
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.
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.
LegalHoldRecord object
One hold as it stood before the rewind.
LegalHoldReplaceResult object
PasswordOpeningRequest object
EncryptionStatus object
EncryptionKeyUsage object
EncryptionStoreCount object
ResealAccepted object
TenantProvision object
ProvisionedTenant AdminTenant
TenantDeletionRequest object
TenantExportRequest object
QuotaStanding object
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.
TenantDeletionScheduled object
OauthClientCreate object
OauthClient object
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.
OauthClientSecret OauthClient
OauthAuthorization object
OauthCode object
OauthTokenRequest object
OauthGrant object
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.
ProviderStepUpAuthorization object
Where to send the browser for a PROVIDER step-up, and which provider that is.
StepUpGrant object
MfaDisable object
Group object
GroupCreate object
GroupUpdate object
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.
GroupPage object
MembershipScope string
TENANTHUBCOLLECTIONITEM
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.
OWNERADMINMEMBERCONTRIBUTORVIEWERGUESTAUDITOR
Membership object
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.
MembershipPage object
Container object
ContainerCreate object
ContainerUpdate object
HubPrivacy object
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.
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.
MANUALROLLUPdefault: "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.
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.
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.
FIXEDRANDOM_MEMBERRANDOM_GROUP_MEMBERROUND_ROBINLEAST_LOADED
AutoAssignCandidate object
Completion object
Cover object
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.
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.
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.
SavedViewCreate object
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.
ViewExport object
What to render and how. The view decides which rows; the format decides what they become.
ViewExportDocument object
The JSON rendering - the view's rows, and what the export knows about itself.
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.
WebhookSubscriptionCreate object
WebhookSubscriptionUpdate object
Every field optional; an omitted one is left alone.
WebhookSubscriptionSecret WebhookSubscription
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.
WebhookSend object
What a deliberate delivery names - the event; the path names the subscription.
WebhookSecretRotation object
WebhookDelivery object
One attempt at one event against one subscription.
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.
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.
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.
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.
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.
AutomationRule object
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.
RuleCondition object
AutomationRuleCreate object
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.
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.
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.
JumbleIntakeDelivery object
The small shape the intake accepts. All fields optional, but not all empty.
JumbleIntakeAccepted object
JumbleEntryConvert object
Where the entry becomes work, and what the item is called.
JumbleEntryPage object
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.
RuleTestEvent object
The sample event, as the CEL event variable will read it.
RuleTestResult object
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.
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.
AutomationRulePage object
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.
RUNNINGWAITINGSUCCEEDEDSKIPPEDFAILEDABORTED_LOOPTHROTTLED
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.
RuleActionResult object
One action's outcome, in the order the run reached them.
RuleRun object
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.
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.
RuleRunPage object
WebhookDeliveryPage object
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
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.
CalendarFeedCreate object
CalendarFeedSecret CalendarFeed
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.
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.
TEXTNUMBERDATESELECTMULTI_SELECTBOOLUSERURL
CustomFieldDefinitionCreate object
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.
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.
MediaObject object
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.
MediaUploadRequest object
MediaPage object
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.
WorkItem object
WorkItemCreate object
WorkItemUpdate object
JSON Merge Patch; null deletes a field.
MoveResult object
DroppedReference object
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.
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.
ItemQuery object
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.
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.
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.
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.
DuplicateResult object
What a duplicate produced: the copy, what it could not carry over, and how big it was.
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.
BucketCreate object
BucketUpdate object
JSON Merge Patch; null deletes a field.
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.
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.
LabelCreate object
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.
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.
Assignment object
Who the entry is assigned to.
LabelUpdate object
JSON Merge Patch; null deletes a field.
Comment object
Recurrence object
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_SCHEDULEON_COMPLETION
RecurrenceInput object
Template object
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.
TENANTHUBCOLLECTION
TemplateNode object
TemplateInput object
TemplateGeneration object
What to ask for, and where the template would belong.
TemplateUpdate object
A merge patch. An absent member is not touched; the node tree travels whole.
TemplateInstantiation object
TemplateInstance object
TemplatePage object
Reminder object
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.
PENDINGSENTCANCELLEDLAPSED
ReminderInput object
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.
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.
ACCESSERASUREPORTABILITYRESTRICTIONOBJECTIONRECTIFICATION
DataSubjectRequestStatus string
RECEIVEDIN_PROGRESSCOMPLETEDREJECTED
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.
TENANTINSTALLATION
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.
ANONYMIZEFULL_DELETE
DataSubjectRequest object
ErasureKept object
What one legal hold keeps, or kept, of one erasure. Counts, never content.
ErasurePreview object
DataSubjectRequestCreate object
DataSubjectRequestUpdate object
DataSubjectRequestExtensionReason string
Why the deadline is extended: the request's complexity, or the number of requests the controller is handling.
COMPLEXITYNUMBER_OF_REQUESTS
DataSubjectRequestExtension object
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.
ProcessingRestriction object
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
ConsentRegisterEntry object
ConsentGrant object
OwnAiPosition object
ConsentWithdrawal object
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.
AuditTarget object
The object the entry is about.
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.
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.
AuditEntry object
Deliberately contains no user content (titles, notes, comments), so that the audit stays unaffected by deletion obligations on content.
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.
JSONLCSV
AuditAnchoringConfiguration object
AuditAnchoring object
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.
BackupTargetKind string
LOCALS3SFTPFTPSFTPWEBDAVSMBAZURE_BLOBGCSRCLONEHTTP_PUT
BackupTarget object
BackupTargetCreate object
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.
BackupArchive object
Read from the manifest at the target, not from the database.
BackupStart object
A backup asked for by hand rather than by a schedule.
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.
BackupRunTrial object
BackupRunTrialFailure object
BackupSchedule object
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.
BackupRetention object
The generation principle. min_keep prevents no backup being left at all.
RestoreRequest object
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.
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.
CSVTRELLOGOOGLE_TASKSMICROSOFT_TODO
ImportRequest object
ImportRun object
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.
PurgeSummary object
What one pass of a removal did.
TrashPage object
CommentPage object
ActivityPage object
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.
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.
RetentionDataKind object
One class of data a retention rule may name, and what this build can do to it.
RetentionPolicy object
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.
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.
LegalHoldCreate object
LegalHoldRelease object
RetentionState object
Visible on the object for as long as a retention rule applies.
SyncPullRequest object
SyncSnapshotRequest object
What :pull takes for an initial synchronisation, without a cursor or a page size.
SyncChange object
SyncPullResponse object
SyncMutation object
SyncPushRequest object
SyncMutationResult object
SyncPushResponse object
SyncDevice object
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.
QUEUEDRUNNINGSUCCEEDEDFAILEDCANCELLED
SearchReindex object
What a reindex answers - the job to watch, and how many rows it will rewrite.
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.
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.
HealthStatus string
okdegradeddowndisabled
DependencyHealth object
DegradedFeature object
HealthWarning object
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.
QueryField object
One field POST /items:query accepts, and what may be asked of it.
Capabilities object
Self-description; clients configure themselves from this.
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.
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.
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.
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.
ALLASSIGNEDNONE