Update campaign
PATCH/recertification/campaigns/:campaignID
Partial update of an existing campaign.
Roles: CAMPAIGN_ADMIN/CAMPAIGN_MANAGER or CAMPAIGN_CREATE.
Scope: cidaas:campaign_write required when token sub is ANONYMOUS.
Patchable fields: campaignName, status, timeFrame.from (PLANNED only),
timeFrame.to, completedReason, groups[].reviewers.
When groups[].reviewers is patched, any added subs are validated (must exist and be
active; no role restriction). The reviewer list cannot be reduced to empty.
Server-controlled fields (always ignored in request body):
completedBy, createdTime, updatedTime — derived server-side; updatedTime
is refreshed on every successful PATCH.
Status transition rules:
PLANNED→IN_PROGRESS: system-only (rejected with403for human callers). To start a campaign early, updatetimeFrame.fromto a near-future time.PLANNED→COMPLETED: allowed; setscompletedByfrom token sub.IN_PROGRESS→COMPLETED: allowed; setscompletedByfrom token sub.- Backward transitions and unknown values →
400.
Timeframe rules:
timeFrame.frommay only be changed while the campaign isPLANNED; locked once started.timeFrame.tocan be changed independently —timeFrame.fromneed not be present in the same request.- Effective
tomust remain after effectivefrom(merges payload with stored values).
Task scheduling side-effects:
fromchanged → start task rescheduled to newfrom.tochanged → end task rescheduled to newto(always targetsCOMPLETED).status=IN_PROGRESS(system) → start task cancelled.status=COMPLETED(any) → both start and end tasks cancelled.
Manual COMPLETED sets completedBy from token sub (ANONYMOUS → "system").
Emits fact event RECERTIFICATION_CAMPAIGN_UPDATED.
Request
Responses
- 200
- 400
- 401
- 403
- 404
Campaign updated. Also returned when all supplied values already match (no DB write); data is empty in that case.
Invalid payload, validation failure, or business rule violation
Missing/invalid token or insufficient reviewer role
Token valid but role/scope insufficient
Campaign or group not found