Start campaign recertification
POST /api/v1/recertify/campaigns: request fields and declared response contract.
POST/api/v1/recertify/campaigns
| Permission | recertify.start |
|---|---|
| Workspace scope | required |
| Scope target | workspace |
Request body
| Field | Type | Required | Nullable | Default |
|---|---|---|---|---|
| kind | "group_membership" | "role_holdings" | "purpose_grants" | required | non-null | — |
| cadenceDays | integer | required | non-null | — |
| lapsePolicy | "auto_revoke" | "escalate" | required | non-null | — |
Response
201
| Field | Type | Required | Nullable | Default |
|---|---|---|---|---|
| data | object | required | non-null | — |
| data.success | boolean | required | non-null | — |
| data.campaignId | string | required | non-null | — |
| data.kind | "group_membership" | "role_holdings" | "purpose_grants" | required | non-null | — |
| data.dueAt | string | required | non-null | — |
| data.itemCount | number | required | non-null | — |
| data.reused | boolean | required | non-null | — |
| data.message | string | required | non-null | — |
Declared failures
| RECERTIFY_START_FAILED | 400 — not retryable |
|---|---|
| RECERTIFY_START_INTENT_CONFLICT | 409 — not retryable |
Durable identity
| Kind | request-identity |
|---|---|
| Request fields | kind |
| Conflict | RECERTIFY_START_INTENT_CONFLICT |
Readback
The effect completes asynchronously; reacquire the result with:
- recertify.list
Request example
Schematic only. Replace placeholders with real values and include all required nested fields.
POST /api/v1/recertify/campaigns HTTP/1.1
Authorization: Bearer <token>
x-merulan-workspace-id: <workspace-id>
Content-Type: application/json
{
"kind": "group_membership",
"cadenceDays": 0,
"lapsePolicy": "auto_revoke"
}