User Hub API: schemas

The request and response bodies of the operations in this API.

ApprovalKindPayloadDto

PropertyTypeRequiredDescription
allowRevisebooleanyes
suggestedRejectReasonsarray of stringyes

BulkUpsertPreferencesDto

PropertyTypeRequiredDescription
preferencesarray of NotificationPreferenceItemDtoyes

ChoiceKindPayloadDto

PropertyTypeRequiredDescription
multiSelectbooleanyes
optionsarray of QuestionChoiceOptionDtoyes

DeviceResponseDto

PropertyTypeRequiredDescription
channelstringyes
createdAtstringyes
deviceIdstringyes
idstringyes
lastSeenAtstringyes
metadataobjectyes
orgIdstringyes
updatedAtstringyes
userIdstringyes

DeviceResponseDtoDataArrayEnvelope

PropertyTypeRequiredDescription
dataarray of DeviceResponseDtoyes

DeviceResponseDtoDataEnvelope

PropertyTypeRequiredDescription
dataDeviceResponseDtoyes

FreeformKindPayloadDto

PropertyTypeRequiredDescription
maxLengthnumber or nullyes
placeholderstring or nullyes

NotificationActionContextDto

PropertyTypeRequiredDescription
gateIdstringno
gateRequestIdstringno
pageone of "pipeline", "gates", "reviews", "work", "qa", "code", "settings"no
phaseIdstringno
pipelineRunIdstringno
projectIdstringno
qaResultIdstringno
reviewIdstringno
workIdstringno
workItemIdstringno

NotificationAggregateType

Type: one of "inquiry", "workflow_run", "decision", "none"

NotificationCategory

Type: string (10 values)

NotificationChannel

Type: one of "web", "email"

NotificationChannelAvailability

Whether this channel can deliver in this deployment (not_configured: no transport provisioned)

Type: one of "available", "not_configured"

NotificationItemResponseDto

PropertyTypeRequiredDescription
actionContextNotificationActionContextDtono
aggregateIdstring or nullnoAggregate id (e.g. inquiryId) when aggregateType !== none.
aggregateTypeNotificationAggregateTypeyes
categoryNotificationCategoryyes
channelNotificationChannelyes
createdAtstring (date-time)yes
detailstring or nullno
eventTypestringyes
expiresAtstring (date-time) or nullnoServer-side TTL — past this instant the row auto-EXPIREs.
groupKeystring or nullno
groupSeqnumber or nullno
idstringyes
metadataNotificationMetadataDtoyes
occurredAtstring (date-time)yes
projectIdstring or nullno
publisherNotificationPublisherDto or nullnoThe authenticated publisher of an announcement, stamped by the platform. Null for rows that are not announcements or were created before publishers were recorded.
readAtstring (date-time) or nullno
seenAtstring (date-time) or nullnoWhen the user last "saw" the row in the bell dropdown — distinct from readAt (item opened).
severityNotificationSeverityyes
statusNotificationStatusyesLifecycle state. Actionable rows are PENDING / RESPONDED; INFO is terminal-on-arrival.
titlestringyes
versionnumberyesOptimistic-concurrency version. Bumped on every status update; clients keep max(version) to tolerate out-of-order frames.

NotificationItemResponseDtoPaginatedEnvelope

PropertyTypeRequiredDescription
dataarray of NotificationItemResponseDtoyes
paginationPaginationMetayes

NotificationMetadataDto

PropertyTypeRequiredDescription
actorNamestringno
branchNamestringno
checkKeystringno
gateRequestIdstringno
phasestringno
phaseNamestringno
pipelineIdstringno
pipelineRunIdstringno
prNumbernumberno
prTitlestringno
projectNamestringno
reviewIdstringno
statusstringno
workItemIdstringno

NotificationMutationResponseDto

PropertyTypeRequiredDescription
updatedCountnumberyesNumber of notifications that transitioned

NotificationMutationResponseDtoDataEnvelope

PropertyTypeRequiredDescription
dataNotificationMutationResponseDtoyes

NotificationPreferenceItemDto

PropertyTypeRequiredDescription
categorystringyes
channelstringyes
enabledbooleanyes
minSeveritystringno

NotificationPreferenceResponseDto

PropertyTypeRequiredDescription
availabilityNotificationChannelAvailabilityyesWhether this channel can deliver in this deployment (not_configured: no transport provisioned)
categorystringyes
channelstringyes
enabledbooleanyes
isDefaultbooleanyesWhether this is a code-level default or an explicit override
minSeveritystringyes

NotificationPreferenceResponseDtoDataArrayEnvelope

PropertyTypeRequiredDescription
dataarray of NotificationPreferenceResponseDtoyes

NotificationPreferenceResponseDtoDataEnvelope

PropertyTypeRequiredDescription
dataNotificationPreferenceResponseDtoyes

NotificationPublisherDto

PropertyTypeRequiredDescription
idstringyes
kindNotificationPublisherKindyes

NotificationPublisherKind

Type: one of "service", "user"

NotificationSeverity

Type: one of "INFO", "SUCCESS", "WARNING", "ACTION_REQUIRED", "ERROR"

NotificationStatus

Lifecycle state. Actionable rows are PENDING / RESPONDED; INFO is terminal-on-arrival.

Type: one of "pending", "responded", "resolved", "cancelled", "expired", "info"

PaginationMeta

PropertyTypeRequiredDescription
hasMorebooleanno
limitnumberno
nextCursorstring or nullno
pagenumberno
previousCursorstring or nullno
totalnumberno
totalPagesnumberno

PreferenceResponseDto

PropertyTypeRequiredDescription
keystringyesPreference key
scopeone of "global", "project"yes
scopeIdobject or nullno
updatedAtstringyes
valueobjectyesPreference value (any JSON-serializable value)

PreferenceResponseDtoDataArrayEnvelope

PropertyTypeRequiredDescription
dataarray of PreferenceResponseDtoyes

PreferenceResponseDtoDataEnvelope

PropertyTypeRequiredDescription
dataPreferenceResponseDtoyes

ProblemActionableBy

Who can act on this refusal: user (correct the input, sign in), org-admin (an administrator of the organisation), platform (the operators of this installation), none (nobody — it cannot succeed). ABSENT when not known; never guessed.

Type: one of "user", "org-admin", "platform", "none"

ProblemDetailsDto

RFC 9457 problem document. The declared members are the reserved core; extension members are TOP-LEVEL and OPEN, owned by the refusing plane.

PropertyTypeRequiredDescription
actionableByProblemActionableBynoWho can act on this refusal: user (correct the input, sign in), org-admin (an administrator of the organisation), platform (the operators of this installation), none (nobody — it cannot succeed). ABSENT when not known; never guessed.
codestringyesSCREAMING_SNAKE_CASE. The machine-branchable refusal, and the value a policy rule, a retry predicate and a UI branch all name.
detailstringnoHuman-readable and specific to THIS occurrence.
errorsarray of ProblemFieldIssueDtonoField-level issues, when the refusal is about the request body.
instancestringnoURI reference identifying the occurrence — a request path, a run, a row.
paramsmap of string or number or booleannoSafe i18n interpolation values for the message keyed by code — typed and allowlisted per code by its declaration. Never server-authored copy, never internal diagnostics.
retryProblemRetrynoWhat a retry can achieve: transient (later, unchanged), after-change (only after someone changes something), never (a defect until a fixed version ships). ABSENT when not known.
statusnumberyesThe HTTP status code, repeated in the body so a logged document is self-contained.
titlestringyesShort, human-readable, and STABLE for a given type. Never per-occurrence — that is detail.
traceIdstringnoW3C trace-context trace-id, present when the caller sent a traceparent. Omitted rather than invented when it did not.
typestringyesAbsolute URI identifying the refusal TYPE. Derived one-to-one from code, so a caller may branch on either and can never be told two different things. Never about:blank.

ProblemFieldIssueDto

PropertyTypeRequiredDescription
codestringnoSCREAMING_SNAKE_CASE code of THIS issue, for a frontend i18n key. Present when the issue was minted by a declared problem.
detailstringyesProse for logs and developers. A frontend localises from code + params instead.
paramsmap of string or number or booleannoSafe i18n interpolation values for this issue's code.
pointerstringyesRFC 6901 JSON Pointer into the request body. Root is "/".

ProblemRetry

What a retry can achieve: transient (later, unchanged), after-change (only after someone changes something), never (a defect until a fixed version ships). ABSENT when not known.

Type: one of "transient", "after-change", "never"

QuestionActionContextDto

PropertyTypeRequiredDescription
runIdstringyes
stageKeystring or nullyes
taskAnchorstringyes
workflowSlugstringyes

QuestionBadgeResponseDto

PropertyTypeRequiredDescription
countnumberyesTotal pending questions for the current user across all runs.

QuestionBadgeResponseDtoDataEnvelope

PropertyTypeRequiredDescription
dataQuestionBadgeResponseDtoyes

QuestionChoiceOptionDto

PropertyTypeRequiredDescription
descriptionstring or nullyes
labelstringyes
valuestringyes

QuestionEscalationLevelDto

PropertyTypeRequiredDescription
enteredAtstring (date-time)yes
expiredbooleanyes
expiredAtstring (date-time) or nullyes
levelnumberyes
recipientDisplayNamestringyes

QuestionKind

Type: one of "approval", "choice", "freeform", "review"

QuestionKindPayloadDto

PropertyTypeRequiredDescription
approvalApprovalKindPayloadDtono
choiceChoiceKindPayloadDtono
freeformFreeformKindPayloadDtono
kindQuestionKindyes
reviewReviewKindPayloadDtono

QuestionResponseDto

PropertyTypeRequiredDescription
actionQuestionActionContextDtoyes
descriptionstring or nullyesLong-form markdown context. Distinct from detail (one-liner under the title) — projected from the inquiry prompt's description.
detailstring or nullyes
escalationHistoryarray of QuestionEscalationLevelDtoyes
expiresAtstring (date-time) or nullyes
extrasobjectyesClosed-set orchestrator render hints (reviewIteration, reviewerFindings[], pastIterations[], reviewSubjects[]).
idstringyes
kindQuestionKindyes
kindPayloadQuestionKindPayloadDtoyes
occurredAtstring (date-time)yes
recipientIdstringyesEngine-side InquiryRecipient.id PK for THIS recipient. Required by the FE reply-submit call. Empty string for legacy rows that pre-date the wiring.
severityQuestionSeverityyes
statusQuestionStatusyes
subjectsarray of QuestionSubjectRefDtoyes
titlestringyes

QuestionResponseDtoPaginatedEnvelope

PropertyTypeRequiredDescription
dataarray of QuestionResponseDtoyes
paginationPaginationMetayes

QuestionSeverity

Type: one of "urgent", "normal", "info"

QuestionStatus

Type: one of "pending", "responded", "resolved", "expired", "cancelled"

QuestionSubjectRefDto

PropertyTypeRequiredDescription
artifactIdstringyes
kindstringno
titlestringno
versionnumberyes
versionIdstringyesImmutable per-version handle as stored on the artifact-store ArtifactVersion row. Required so the FE can build proper W3C Web Annotation targets (ReviewInquiryCommentSchema.anchor) without synthesising a placeholder from (artifactId, version).

RegisterDeviceDto

PropertyTypeRequiredDescription
channelstringyesDelivery channel
deviceIdstringyesClient-generated device identifier
metadataobjectnoAdditional device metadata

ReviewKindPayloadDto

PropertyTypeRequiredDescription
allowAnchorbooleanyes
placeholderstring or nullyes

SetPreferenceItemDto

PropertyTypeRequiredDescription
keystringyesPreference key, e.g. "schema:action-menu-mode"
scopeone of "global", "project"no
scopeIdstringnoScope qualifier — e.g. projectId when scope=project
valueobjectyesPreference value (any JSON-serializable value, including null)

SetPreferencesDto

PropertyTypeRequiredDescription
preferencesarray of SetPreferenceItemDtoyes

SinglePreferenceDto

PropertyTypeRequiredDescription
enabledbooleanyes
minSeveritystringno

SyncConflictItemDto

PropertyTypeRequiredDescription
clientUpdatedAtstringyes
clientValueobjectyesClient-side value that was overridden
keystringyes
scopeone of "global", "project"yes
scopeIdobject or nullno
serverUpdatedAtstringyes
serverValueobjectyesServer-side value that won

SyncPreferenceItemDto

PropertyTypeRequiredDescription
keystringyesPreference key, e.g. "schema:action-menu-mode"
scopeone of "global", "project"no
scopeIdstringnoScope qualifier — e.g. projectId when scope=project
updatedAtstringyesClient-side updatedAt for conflict resolution (ISO string)
valueobjectyesPreference value (any JSON-serializable value, including null)

SyncPreferencesDto

PropertyTypeRequiredDescription
preferencesarray of SyncPreferenceItemDtoyes

SyncResponseDto

PropertyTypeRequiredDescription
conflictsarray of SyncConflictItemDtoyes
mergedarray of PreferenceResponseDtoyes

SyncResponseDtoDataEnvelope

PropertyTypeRequiredDescription
dataSyncResponseDtoyes

UnreadResponseDto

PropertyTypeRequiredDescription
byCategoryobjectyes
highestSeverityNotificationSeverity or nullno
unreadCountnumberyes

UnreadResponseDtoDataEnvelope

PropertyTypeRequiredDescription
dataUnreadResponseDtoyes