Ticket Schema
Felder
Ticket Schema
Schema for validating ticket entities
title
The ticket title
description
Detailed ticket description
descriptionHtml
Rich text HTML version of the ticket description
aiSummary
Best-effort AI summary of the imported ticket content (external-master mirrors, e.g. TANSS — their description holds the raw source mail). Written only by the worker (queue-ai-summary), null when AI is disabled for the tenant. Distinct from dispatch.aiSummary, which is an internal metadata field of the auto-dispatch pipeline and is not rendered.
aiSummaryAttemptedAt
Set by the worker whenever an AI summary was attempted — even when the LLM returned nothing (AI off, content too short). Prevents the lazy on-open trigger from re-enqueuing the same ticket on every load.
status
Current ticket status
priority
Ticket priority level
LOWNORMALHIGHCRITICALpartyId
Associated party UUID
partyAddressId
Specific site/address of the associated party
contactPartyId
Associated contact person UUID
assignedToId
Assigned user UUID
dispatcherId
Human dispatcher responsible for this ticket (ADR 0260): the person who manually created/dispatched it or confirmed/overrode the AI dispatch. Null for pure AI auto-dispatch (no human dispatcher). Server-managed — drives the per-dispatcher Rückfragen-KPI (Dispo-Zielvereinbarung).
orgUnitId
Associated org unit UUID
handlingTier
Current ownership tier: CUSTOMER (customer IT) or MSP. null/absent means MSP (legacy).
CUSTOMERMSPnullhandedToCustomerAt
When the ticket was last handed to CUSTOMER (SLA pause start). Server-managed.
slaPausedMs
Accumulated milliseconds the SLA clock was paused while the ticket sat at CUSTOMER. Server-managed.
handoverPreviousAssigneeId
Assignee parked while the ticket sits at CUSTOMER; restored on hand-back. Server-managed.
contractId
Associated contract UUID
projectId
Associated project UUID
salesOrderId
Linked sales_order UUID (the order this ticket originated from)
salesOrderItemId
ID of the orderItem inside the linked sales_order (matches salesOrder.orderItems[].id)
salesOrderItemSource
Origin of the linked sales-order item — internal or weclapp
internalweclappnulldueAt
Due date in ISO format
resolvedAt
Resolution date in ISO format
closedAt
Closure date in ISO format
statusChangedAt
Timestamp of the last status change (denormalized for time limit queries)
reopenedAt
Timestamp of the last reopen event (system or manual). Cleared on next non-reopen status change.
reopenedBy
User UUID of the actor who reopened the ticket, or one of the sentinel strings "system:auto_close_undo", "system:inbound_mail_ai", "system:inbound_mail_closed" for system-triggered reopens.
reopenReason
Why the ticket was reopened — drives UI banners and audit.
MANUALINBOUND_MAIL_AIINBOUND_MAIL_CLOSEDAUTO_CLOSE_UNDOnullreopenedFromStatus
The status the ticket was in immediately before being reopened.
aiReopenDecision
Einstufung des Klassifikators, die zur Wiedereröffnung geführt hat.
thanksreopenunclearnullaiReopenConfidence
Konfidenz (0…1) der Einstufung zum Zeitpunkt der Wiedereröffnung.
aiReopenBasis
Woraus sich die Wiedereröffnung ergab: Schwellwert erreicht ("threshold"), Tenant-Fallback bei Unsicherheit ("fallback") oder von einem Menschen bestätigt ("confirmed").
thresholdfallbackconfirmednullaiReopenConfirmedBy
User-UUID der Person, die die unsichere KI-Einstufung bestätigt hat (nur bei aiReopenBasis "confirmed").
aiReopenSuggestion
Zustand der manuellen Bestätigung einer unsicheren KI-Einstufung.
status
PENDING blockiert Auto-Close; alle anderen Werte sind Endzustände. Genau ein PENDING pro Ticket (neuere Mail aktualisiert das bestehende).
PENDINGCONFIRMEDDISMISSEDEXPIREDdecision
thanksreopenunclearconfidence
reasoning
modelName
emailMessageId
messageId
suggestedAt
expiresAt
taskId
decidedAt
decidedBy
tags
Ticket tags
billingOverride
ADR 0146 — explicit permission to invoice time bookings for this ticket while it is still open (e.g. customer ghosted). When `allowedWhileOpen` is true the billing-guard treats the ticket as billable. The reason is internal and propagates into the Leistungsnachweis snapshot, not onto the customer invoice.
standaloneBilling
ADR 0274 — mark this ticket for STANDALONE billing: its billable time is carved out of the customer collective Leistungsnachweis (and, if the ticket belongs to a project, out of the project LN too) and billed on its own via POST /tickets/:id/generate-performance-record. `enabledBy`/`enabledAt` and the `performanceRecord*`/`invoicedAt` back-references are set server-side only. Set via PUT /tickets/:id/standalone-billing (permission `ticket_billing_override`).
enabled
reason
enabledBy
enabledAt
performanceRecordId
performanceRecordNumber
invoicedAt
difficulty
Ticket difficulty (0–100). Feeds the XP award formula on close. Defaults to 50 at award time if null.
requiredSkills
Structured skill requirements for dispatch matching
skillId
UUID of the skill_definition
minimumLevel
Minimum proficiency level required. Null = any level.
BEGINNERINTERMEDIATEADVANCEDEXPERTnullsource
How this skill requirement was added. ASSET_DERIVED = auto-derived from the customer's assets (CMDB) via skill assetMatchRules.
MANUALAI_DETECTEDASSET_DERIVEDdetectedLanguage
Automatically detected language of the ticket content (ISO 639-1, via fastText lid.176)
aaabaeafakamanarasavayazbabebgbhbibmbnbobrbscacechcocrcscucvcydadedvdzeeeleneoeseteufafffifjfofrfygagdglgngugvhahehihohrhthuhyhziaidieigiiikioisitiujajvkakgkikjkkklkmknkokrkskukvkwkylalblglilnloltlulvmgmhmimkmlmnmrmsmtmynanbndnengnlnnnonrnvnyocojomorospapiplpsptqurmrnrorurwsascsdsesgsiskslsmsnsosqsrssstsusvswtatetgthtitktltntotrtstttwtyugukuruzvevivowawoxhyiyozazhzunulldetectedLanguageConfidence
Detection confidence (0..1). Used with LANGUAGE_DETECTION_CONFIDENCE_THRESHOLD
detectedLanguageAt
Timestamp of the last language detection run
attachments
linkedEntities
convertedTo
Set when this ticket was converted to another entity (opportunity/complaint). The ticket is kept — not deleted — so linked records (time records, tasks, callbacks) stay reachable and billable. Written only by the conversion routes.
convertedFrom
Set when this ticket was created by converting another entity (opportunity/complaint). Written only by the conversion routes.
contractPositionRef
Reference to a contract position this ticket relates to
contactPartyName
Contact person name (used when contactPartyId is not available)
contactChannel
Channel through which the ticket was reported
PHONEEMAILPORTALON_SITEREMOTETEAMSOTHERticketType
Ticket type — references the `key` of a ticket_type entity (e.g. INCIDENT, REPAIR). Configurable per tenant; no longer a fixed enum.
extTicketId
External ticket reference ID
estimatedMinutes
Estimated work time in minutes
respondedAt
Timestamp of the first agent response (drives time_to_first_response targets, ADR 0117a)
inboundReplyAckedAt
Timestamp at which the latest inbound customer email was acknowledged as "handled, no reply needed". Clears the awaiting-reply badge when >= the last inbound email time; a newer inbound email re-arms the badge.
inboundReplyAckedBy
User who acknowledged the latest inbound customer email (see inboundReplyAckedAt).
targets
Denormalized active service targets (ADR 0117a)
stageKind
time_to_first_responsetime_in_statustime_to_statustime_to_closestageStatus
stageLabel
bindingness
contractualinternalbreachedAt
completedAt
mergedIntoTicketId
If set, this ticket was merged into the referenced ticket
mergedIntoTicketNumber
Ticket number of the ticket this was merged into (denormalized for display)
linkedRiskIds
Linked risk IDs
incidentData
incidentType
DATA_BREACHUNAUTHORIZED_ACCESSMALWAREPHISHINGDOSINSIDER_THREATSUPPLY_CHAINOTHERseverity
CRITICALHIGHMEDIUMLOWdetectedAt
containedAt
resolvedAt
affectedDataCategories
affectedPersonCount
rootCause
lessonsLearned
timeline
linkedAssetIds
linkedRiskIds
breachNotifications
notificationType
DSGVO_ART33_AUTHORITYDSGVO_ART34_DATA_SUBJECTSNIS2_EARLY_WARNINGNIS2_NOTIFICATIONNIS2_FINAL_REPORTBSI_NOTIFICATIONstatus
DRAFTPENDING_REVIEWSUBMITTEDACKNOWLEDGEDsubmittedAt
dmsDocumentId
budget
Budget control: billing type, caps, consumed time, and lock state
billingType
Ticket billing model
TIME_AND_MATERIALFIXED_PRICENOT_BILLABLEfixedPriceAmount
Fixed price amount in EUR (when billingType is FIXED_PRICE)
capMinutes
Hard budget cap in minutes. When reached, ticket is locked.
capDisplayUnit
How the cap was originally entered (MINUTES, HOURS or EUR). capMinutes stays the canonical value; this field lets the UI round-trip the input without precision loss.
MINUTESHOURSEURcapDisplayValue
Original cap value as entered, matched to capDisplayUnit. Stored as a decimal string to avoid float rounding (e.g. "2.5" hours or "199.99" EUR).
capHourlyRateEur
Hourly rate (EUR/h) used to convert capDisplayValue to capMinutes when capDisplayUnit=EUR. Frozen at the moment the cap was set so later rate changes do not silently re-interpret the cap.
consumedMinutes
Denormalized sum of all time record durationMinutes for this ticket
locked
Whether the ticket is budget-locked (cap reached)
lockedAt
When the budget lock was engaged
lockedReason
Reason the budget was locked (auto or manual)
unlockRequestId
Pending approval request ID for budget unlock
lockStatusKey
ADR 0223 — resolved at create from the ticket type / tenant default: the status the ticket is auto-transitioned into when the cap is reached. Null = no auto status change (only budget.locked is set).
capHistory
History of budget cap changes
dispatch
Auto-dispatch metadata set by the AI dispatch pipeline
dispatchDecisionId
dispatchedAt
dispatchStatus
PENDINGDISPATCHEDSUGGESTEDMANUAL_OVERRIDEFAILEDaiSummary
aiCategory
aiEstimatedMinutes
aiConfidence
source
Herkunftsmarker (EMAIL, M365_OUTLOOK, TANSS, …). Zwei Bedeutungen, die zusammenfallen: WOHER der Datensatz kam und — falls der Wert einem `externalMaster`-Provider entspricht — WER ihn führt. Ein Ticket mit `source: "TANSS"` ist ein read-only Spiegel (ADR 0377): Bearbeitungsversuche scheitern mit 423, gepflegt wird es ausschließlich vom Sync. Der Guard wirkt PRO DOKUMENT — in Codemeta angelegte Tickets tragen kein `source` und bleiben uneingeschränkt bearbeitbar, obwohl sie in derselben Collection liegen. Die Sperre lässt sich pro Ticket aufheben, ohne die Herkunft zu verfälschen: `externalOwnership: "LOCAL"` (ADR 0432) übernimmt den Vorgang nach Codemeta — `source` bleibt dann als Herkunftsangabe stehen, führt aber nicht mehr. Vorher wurde das Feld bereits ad hoc geschrieben (EMAIL/M365_OUTLOOK), war aber nie deklariert — bei `additionalProperties: false` konnte es über validierte Pfade nicht gesetzt werden.
externalOwnership
Übernahme eines Fremdsystem-Spiegels in die lokale Verantwortung (ADR 0432). `"LOCAL"` hebt die read-only-Sperre aus ADR 0377 auf: das Ticket bleibt formal ein TANSS-Ticket (`source`/`sourceRef` bleiben erhalten, der Deeplink funktioniert weiter), wird aber ab jetzt in Codemeta zu Ende bearbeitet und vom TANSS-Sync nicht mehr angefasst. In TANSS trägt der Vorgang dann den Tag "CodemetaOS". Fehlt das Feld (Altbestand), gilt der Datensatz weiter als Spiegel — kein Backfill nötig. Nur über POST /tickets/:id/takeover setzbar (in `protectedFields`), niemals per generischem PATCH.
LOCALnullexternalOwnershipTakenAt
Zeitpunkt der Übernahme (ADR 0432).
externalOwnershipTakenBy
Interne User-Id, die die Übernahme ausgelöst hat (ADR 0432).
externalOwnershipTag
Name des Tags, der bei der Übernahme im Fremdsystem gesetzt wurde (ADR 0432). Belegt, dass die Gegenseite markiert ist — die Übernahme wird nur bei Erfolg vollzogen. `null` BEI GESETZTEM `externalOwnership: "LOCAL"` ist die eine dokumentierte Ausnahme (ADR 0457): der Vorgang existierte im Fremdsystem nicht mehr, konnte deshalb nicht markiert werden, und die Übernahme wurde nach ausdrücklicher Bestätigung trotzdem vollzogen. Bei fehlendem `externalOwnership` heißt `null` schlicht „nie übernommen".
sourceUrl
Direktverweis auf den Datensatz in der Oberfläche des führenden Fremdsystems (ADR 0362/0377). Wird beim Spiegeln einmal mitgeschrieben, weil der Host nur in `integration_configs` steht — Daten, die die Ticketseite nicht lädt und ein Techniker nicht zwingend lesen darf. Fehlt das Feld (ältere Spiegel), zeigt die Oberfläche schlicht keinen Link — kein Backfill nötig.
satisfaction
Customer satisfaction rating for this ticket, populated from survey responses
score
Raw score value (1-5 for CSAT, 0-10 for NPS)
scoreType
Type of satisfaction score
CSATNPSnormalizedScore
Score normalized to 0-100 scale for aggregation
comment
Optional free-text comment from the respondent
responseId
UUID of the linked survey_response
invitationId
UUID of the survey_invitation that produced this response
surveyId
UUID of the survey used
submittedAt
When the response was submitted
respondentContactId
Contact person UUID who submitted the response
skillImpact
Audit of skill level deltas applied to the assignee from this response
delta
-101source
Which mapping produced this impact
required_skillssurvey_questionappliedToUserId
suitableForIntern
Whether this ticket is appropriate for an intern/junior to work on (auto-set when difficulty < 30; manual override possible)
parentIncidentId
Parent major incident this ticket is grouped under
snoozedUntil
Ticket is snoozed until this timestamp; hidden from active queues
snoozedBy
User who snoozed the ticket
snoozedAt
When the ticket was snoozed
snoozeReason
Reason provided when snoozing
suggestedTemplateIds
Top-N task_template IDs suggested by the dispatcher (ADR 0138 Hook A). Server-managed via /suggest-templates endpoint.
appliedTemplateIds
task_template IDs that have been applied to this ticket (used by skill-aware dispatch in Hook B).
suggestionsComputedAt
When the template suggestion pipeline last ran for this ticket.
Keine Felder passen zum Filter.
Standard-Endpoints
Diese Resource folgt dem generischen CRUD-Vertrag der Plattform. Lesen Sie die Konventionen für Pagination, Idempotenz, Optimistic Locking und Audit. Die wichtigsten Endpoints:
GET /api/v1/tickets— Liste, paginiert + filterbarGET /api/v1/tickets/<id>— Einzelne EntityPOST /api/v1/tickets— AnlegenPATCH /api/v1/tickets/<id>— Teil-UpdateDELETE /api/v1/tickets/<id>— Soft-DeleteGET /api/v1/tickets/<id>/timeline— Audit + Aktivitäten