Task Schema
Felder
Task Schema
Schema for validating task entities
title
Task title
description
Task description
status
Task status. PENDING_REVIEW is the intermediate state between IN_PROGRESS and DONE when reviewMode = hard.
TODOIN_PROGRESSIN_REVIEWPENDING_REVIEWDONECANCELLEDpriority
Task priority
LOWNORMALHIGHCRITICALprojectId
Project UUID (legacy, use referenceId/referenceSchema)
listId
Optional task-list bucket (Todoist-style, ADR 0132). Independent of projectId/referenceId — a task can belong to a project AND a personal list at the same time.
parentTaskId
Parent task UUID for subtasks
order
Sort order within parent/project
assigneeId
Assigned user UUID. Deprecated: mirror of assigneeIds[0] for backward compatibility. Write via assigneeIds.
assigneeIds
Assigned user UUIDs (multi-assignee). Canonical assignee field.
dispatchPending
ADR 0224: set when a template-materialized task should be auto-assigned by the dispatch pipeline (assignmentRule.strategy = ai_dispatch | ai_suggest). The worker event-router enqueues a dispatch job and clears this flag.
dispatchDecisionId
ADR 0224: id of the dispatch_decision that assigned this task (ai_* strategy).
orgUnitId
Team / organizational unit UUID
teamCanManage
ADR 0421: when true, every member of `orgUnitId` may fully edit and delete this task, not just work it off. Opt-in per task — the ADR-0192 default keeps manage rights with the creator / project manager / admin. No effect when `orgUnitId` is null. Only an owner (creator / project manager / campaign owner / admin) may flip this flag.
reporterId
Reporter user UUID
reviewerId
Optional reviewer user UUID. When set together with reviewMode=hard, only this user (or a user with task_review/admin_bypass) may transition the task from PENDING_REVIEW to DONE.
reviewMode
Review enforcement: 'hard' inserts a PENDING_REVIEW gate before DONE and restricts the final transition to the reviewer; 'soft' only notifies the reviewer when the task is completed. Null/absent = no review.
hardsoftnullsprintId
Sprint UUID
boardColumnId
Kanban board column ID
phaseId
Project phase UUID for Gantt
storyPoints
Story points estimate
estimatedMinutes
Estimated effort in minutes
maxMinutes
Hard cap on logged minutes for this task (applied when limitMode=minutes). Used by project limit checks; values are not auto-enforced unless project.limits.hardBlockOnExceed is true.
salesOrderId
Linked sales_order UUID (the order this task 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
internalweclappnullpositionId
ADR 0310: optional project_position this task hangs under. null = free task (no position). The position aggregates this task’s effort (loggedMinutes/consumedAmount) and carries the billing model (flat_rate vs. time_and_material).
limitMode
Limit mode: minutes (cap on logged time via maxMinutes), amount (cap on consumed EUR via maxAmount), or none.
minutesamountnonenullmaxAmount
Hard cap on consumed billable amount in EUR (decimal string)
maxAmountCurrency
ISO 4217 currency for maxAmount (default EUR when null)
consumedAmount
Sum of time_record.consumedAmount for this task (cached, auto-computed by time-record service)
hardBlockOnExceed
Project-less fallback for the budget hard-block. When the task has no project, this opts the task into hard-blocking time bookings past maxMinutes/maxAmount (mirrors project.limits.hardBlockOnExceed). Ignored when the task belongs to a project — the project setting wins.
defaultServiceTypeId
Pre-selected service_type UUID for time bookings on this task. Not enforced — users may pick a different type.
maxMinutesOverriddenAt
Set when maxMinutes was manually overridden (via task_override_budget). Reconcile from sales-order skips this field while set.
maxAmountOverriddenAt
Set when maxAmount was manually overridden (via task_override_budget). Reconcile from sales-order skips this field while set.
overrideReason
Last reason for a budget override (audit trail; full history lives in history collection).
weclappTaskId
Linked weclapp task ID (target for time-record write-through)
weclappSyncState
Sync state of this task against weclapp
pendingsyncederrornullweclappLastSyncedAt
Last successful weclapp sync timestamp
weclappLastSyncError
Last weclapp sync error message
microsoftTodoId
ID of the mirrored task in Microsoft To Do (per connected user mailbox)
microsoftTodoListId
ID of the Microsoft To Do list this task is mirrored into
microsoftTodoEtag
Last seen Microsoft Graph @odata.etag of the mirrored task — used for echo-suppression on inbound delta sync
todoLastSyncedAt
Last successful Microsoft To Do sync timestamp for this task
todoSyncSource
Which side last wrote the synced state (conflict-resolution hint)
localmicrosoftnullstartDate
Task start date (YYYY-MM-DD)
dueDate
Task due date (YYYY-MM-DD)
completedAt
Task completion timestamp
completedBy
User UUID of the person who marked the task as DONE (cleared on re-open)
scheduledStartAt
Optional scheduled start date-time for calendar display
scheduledEndAt
Optional scheduled end date-time for calendar display
taskType
Task type
TASKSTORYBUGEPICSUBTASKMILESTONElabels
Task labels (like Jira labels)
ticketId
Linked ticket UUID
assetIds
Linked asset UUIDs
blockedByIds
ADR 0218: predecessor task UUIDs that must reach a terminal status (DONE/CANCELLED) before this task may start. Single source of truth for task dependencies; validated server-side (existence, same-project, no cycles).
blockingIds
ADR 0218: DERIVED downstream dependents (tasks whose blockedByIds reference this task). Computed on read via reverse lookup — read-only / protected, never written directly.
loggedMinutes
Logged time in minutes (auto-computed)
tags
Task tags
referenceId
Linked entity UUID
referenceSchema
Schema type of the linked entity
nulltickethr_ticketcallback_requestprojectassetvehiclecontractpartyopportunitycoursecomplaintsales_ordersales_order_itemcampaign_itemcampaignemployee_profileonboarding_planemployee_onboardingemployee_offboardingperformance_reviewperformance_review_agreementperformance_review_goalperformance_review_benefitlinkedEntities
Additional free-form cross-entity links (Mehrfachverknüpfung, 04.08.2026). UNLIKE phone_call (ADR 0386) this does NOT supersede the single reference: referenceId/referenceSchema stays the PRIMARY link (predecessor-sibling logic, partyScope/projectId query expansion, kanbans all key on it) — linkedEntities carries the secondary links, e.g. an opportunity-task also linked to the customer and a contact person. Same item shape as phone_call.linkedEntities.
entityType
ticketcallback_requestprojectopportunitycomplainttaskassetvehiclecontractpartycoursecampaignlinkedAgreementId
Set when the task was spawned from a performance_review agreement. Used to mirror task.status ↔ agreement.status. Legacy — superseded by linkedGoalId / linkedBenefitId.
linkedGoalId
Set when the task was spawned from a performance_review_goal. Used to mirror task.status ↔ goal.status.
linkedBenefitId
Set when the task was spawned from a performance_review_benefit. Used to mirror task.status ↔ benefit.status.
campaignId
Backlink to the campaign that produced this task (CREATE_TASK action).
contractId
Optional link to the contract this task belongs to. Drives contract-aware lifecycle: recurrence.endDate is auto-capped to contract.endDate on creation, and worker handlers cap/cancel tasks when contract.endDate moves or contract.status transitions to SUSPENDED/CANCELLED/EXPIRED.
seriesMasterId
UUID of the recurring master task this exception belongs to. Mutually exclusive with `recurrence` — a series-master child cannot itself start a series. Set only by the materialization endpoint.
seriesOccurrenceDate
YYYY-MM-DD of the specific occurrence this exception represents. Required when seriesMasterId is set; together they form the idempotency key.
seriesOccurrenceType
How this occurrence diverges from the master. exception = materialized instance with its own status; cancellation = skipped occurrence (hidden from the calendar but kept for audit).
exceptioncancellationseriesOccurrenceTimeZone
IANA TZ used when interpreting seriesOccurrenceDate. Defaults to the tenant TZ when null. Mirrors the calendar-event recurrence model.
recurrence
Recurrence configuration for recurring tasks
pattern
Recurrence pattern
DAILYWEEKLYMONTHLYYEARLYinterval
Repeat every N units
daysOfWeek
Days of week (0=Sun, 6=Sat) for WEEKLY pattern
dayOfMonth
Day of month for MONTHLY pattern
endDate
Stop recurring after this date
nextDueDate
Next calculated due date
complianceRuleId
Compliance rule that auto-generated this task (e.g. HU, AU, MAINTENANCE)
complianceDeadline
The compliance deadline date this task tracks (YYYY-MM-DD)
visibility
Task visibility. PRIVATE tasks are only visible to their creator and assignee.
PUBLICPRIVATEdifficulty
Task difficulty (0–100). Feeds the XP award formula when the task transitions to DONE. Defaults to 50 at award time if null.
requiredSkills
Structured skill requirements for this task. Drives XP awards to the task assignee on completion.
skillId
UUID of the skill_definition
minimumLevel
Minimum proficiency level required. Null = any level.
BEGINNERINTERMEDIATEADVANCEDEXPERTnullxpAwardedAt
Set once when XP was awarded for this task completion. Prevents duplicate XP grants on DONE→other→DONE transitions.
customerVisible
Whether this task is visible on the project customer portal (requires project.customerAccess feature viewAssignedTasks).
customerAssigneePartyId
Customer party (contact or organization) this task is assigned to (public portal). Used alongside assigneeId.
customerCreated
True if the task was created by a customer via the public portal.
templateId
task_template._id this task was instantiated from.
templateVersion
Pinned template version at instantiation time (semver).
templateNodeId
ID of the subTemplates[] link this task came from. Null on root tasks.
templatePath
Denormalized "/slug-a/slug-b" path for fast roll-up analytics.
isTemplateRoot
True for the root task of a template execution.
rootTaskId
Denormalized: every task in a template execution carries the root task id.
templateInputs
Snapshot of template input values (key → value) at instantiation time.
cancelReason
Reason for CANCELLED status. e.g. "template-instantiation-optional-skipped" when an optional sub-step was de-selected.
fieldServiceParked
True if the task is parked for on-site field service ("Wartestellung"). Orthogonal to status — a parked task keeps its normal workflow status.
fieldServicePartyId
Anchor customer party for the on-site work. Prefilled from referenceId when referenceSchema = party. Used as the proximity origin.
fieldServiceAddressId
parties.addresses[]._id of the concrete on-site address (geocoding source for proximity). Falls back to the MAIN address when null.
parkedAt
Timestamp when the task was parked (cleared when un-parked).
parkedBy
User UUID who parked the task (cleared when un-parked).
linkedCalendarEventId
Primary calendar_event this task was scheduled into. Many parked tasks may point to one appointment. Set by the schedule-into-event endpoint. For split tasks (ADR 0219) this is the FIRST part-event; the full set lives in calendarEventIds.
calendarEventIds
All calendar_events this task was planned into (ADR 0219). For a split task the planner writes one event per part; linkedCalendarEventId mirrors [0] for backward compatibility. Readers that need every appointment should prefer this and fall back to [linkedCalendarEventId] when absent (older data). Set server-side (plan/commit + schedule-into-event); protected against direct PATCH.
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/tasks— Liste, paginiert + filterbarGET /api/v1/tasks/<id>— Einzelne EntityPOST /api/v1/tasks— AnlegenPATCH /api/v1/tasks/<id>— Teil-UpdateDELETE /api/v1/tasks/<id>— Soft-DeleteGET /api/v1/tasks/<id>/timeline— Audit + Aktivitäten