{"info":{"_postman_id":"atlas-public-api","name":"Atlas Public API (v1.0.0)","description":"# Atlas Public API\nAuthenticate with `Authorization: Bearer <token>` where `<token>` is either\na Personal Access Token (prefixed `atlas_pat_`) or an OAuth access JWT.\n\n**Scopes (PAT only).** PAT-authenticated calls must carry one of the scopes listed under\n`x-required-scopes` for the route. Session/JWT calls bypass scope checks.\n\n**Rate limits.** Each route is classified `read | write | ai`. Defaults are 300/m, 60/m,\n20/m respectively, configurable per-tenant via the `PUBLIC_API_RATE_OVERRIDES` env\nJSON. Exceeding a bucket returns 429 with a `Retry-After` header.\n\n**Idempotency.** All POST routes accept an `Idempotency-Key` header; replays within 24h\nreturn the original 2xx response.\n\n**IP allowlist (PAT only).** PATs minted with an `allowedIps` list reject calls from\noutside the list with 403 `pat-ip-blocked`.\n## Setup\n1. Import the companion **environment** file (download it next to this collection).\n2. Set `apiKey` to a Personal Access Token minted at `/settings/api-access`.\n3. Set `baseUrl` to your Atlas API URL (defaults to production).\n4. Pick a request and **Send**.\n## Conventions\n- Auth is collection-level Bearer: every request sends `Authorization: Bearer {{apiKey}}`.\n- Body-bearing methods include a disabled `Idempotency-Key: {{idempotencyKey}}` header - enable + rotate it for safe retries.\n- Sample responses are inlined under each request (200/201). Click an example to load it as the request preview.\n_Generated from the live OpenAPI 3.1 spec at `/v1/openapi.json`._","schema":"https://schema.getpostman.com/json/collection/v2.1.0/collection.json"},"item":[{"name":"Agents","item":[{"name":"List agent templates available to the tenant","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/agents/templates","host":["{{baseUrl}}"],"path":["v1","agents","templates"]},"description":"List agent templates available to the tenant\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `ai:read`\n**Tags:** Agents"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"items\": [\n    {\n      \"id\": \"agt_01HW3T...\",\n      \"name\": \"string\",\n      \"description\": \"string\",\n      \"disabled\": false,\n      \"costCapUsd\": 0,\n      \"createdAt\": \"2026-01-01T00:00:00.000Z\",\n      \"updatedAt\": \"2026-01-01T00:00:00.000Z\"\n    }\n  ]\n}"}]},{"name":"Update governance metadata for an agent template","request":{"method":"PATCH","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/agents/templates/{id}","host":["{{baseUrl}}"],"path":["v1","agents","templates",":id"],"variable":[{"key":"id","value":"","description":"Path parameter: id"}]},"description":"Update governance metadata for an agent template\n\n`reason` is mandatory and captured in the audit log alongside the disabled / cost-cap change.\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `ai:write`\n**Tags:** Agents","body":{"mode":"raw","raw":"{\n  \"disabled\": false,\n  \"costCapUsd\": 0,\n  \"reason\": \"string\"\n}","options":{"raw":{"language":"json"}}}},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"id\": \"agt_01HW3T...\",\n  \"name\": \"string\",\n  \"description\": \"string\",\n  \"disabled\": false,\n  \"costCapUsd\": 0,\n  \"createdAt\": \"2026-01-01T00:00:00.000Z\",\n  \"updatedAt\": \"2026-01-01T00:00:00.000Z\"\n}"}]},{"name":"Kick off a run from an agent template","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/agents/templates/{id}/run","host":["{{baseUrl}}"],"path":["v1","agents","templates",":id","run"],"variable":[{"key":"id","value":"","description":"Path parameter: id"}]},"description":"Kick off a run from an agent template\n\nReturns the seeded `AgentRun`. Subscribe to its status via the activity feed or poll `GET /v1/agents/runs/{id}`.\n\n**Rate limit class:** `ai`\n**Required PAT scopes (any one):** `ai:write`\n**Tags:** Agents","body":{"mode":"raw","raw":"{\n  \"context\": {},\n  \"dryRun\": false\n}","options":{"raw":{"language":"json"}}}},"response":[{"name":"Sample 202","status":"Accepted - run queued","code":202,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"id\": \"agr_01HW3T...\",\n  \"agentId\": \"string\",\n  \"templateId\": \"string\",\n  \"status\": \"queued\",\n  \"startedAt\": \"2026-01-01T00:00:00.000Z\",\n  \"completedAt\": \"2026-01-01T00:00:00.000Z\",\n  \"totalCostUsd\": 0,\n  \"totalSteps\": 0,\n  \"summary\": \"string\"\n}"}]},{"name":"List stored agent memory entries","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/agents/memory","host":["{{baseUrl}}"],"path":["v1","agents","memory"],"query":[{"key":"agentId","value":"","disabled":true},{"key":"scope","value":"","disabled":true}]},"description":"List stored agent memory entries\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `ai:read`\n**Tags:** Agents"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"items\": [\n    {\n      \"id\": \"mem_01HW3T...\",\n      \"key\": \"string\",\n      \"value\": {},\n      \"scope\": null,\n      \"agentId\": \"string\",\n      \"userId\": \"string\",\n      \"expiresAt\": \"2026-01-01T00:00:00.000Z\",\n      \"createdAt\": \"2026-01-01T00:00:00.000Z\"\n    }\n  ]\n}"}]},{"name":"Store a new agent memory entry","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/agents/memory","host":["{{baseUrl}}"],"path":["v1","agents","memory"]},"description":"Store a new agent memory entry\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `ai:write`\n**Tags:** Agents","body":{"mode":"raw","raw":"{\n  \"key\": \"string\",\n  \"value\": {},\n  \"scope\": \"tenant\",\n  \"agentId\": \"string\",\n  \"userId\": \"string\",\n  \"expiresAt\": \"2026-01-01T00:00:00.000Z\"\n}","options":{"raw":{"language":"json"}}}},"response":[{"name":"Sample 201","status":"Created","code":201,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"id\": \"mem_01HW3T...\",\n  \"key\": \"string\",\n  \"value\": {},\n  \"scope\": \"tenant\",\n  \"agentId\": \"string\",\n  \"userId\": \"string\",\n  \"expiresAt\": \"2026-01-01T00:00:00.000Z\",\n  \"createdAt\": \"2026-01-01T00:00:00.000Z\"\n}"}]},{"name":"Delete an agent memory entry","request":{"method":"DELETE","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/agents/memory/{id}","host":["{{baseUrl}}"],"path":["v1","agents","memory",":id"],"variable":[{"key":"id","value":"","description":"Path parameter: id"}]},"description":"Delete an agent memory entry\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `ai:write`\n**Tags:** Agents"},"response":[{"name":"Sample 204","status":"Deleted","code":204,"_postman_previewlanguage":"json","body":""}]},{"name":"List agent approvals (filter by status / agentId)","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/agents/approvals","host":["{{baseUrl}}"],"path":["v1","agents","approvals"],"query":[{"key":"status","value":"","disabled":true},{"key":"agentId","value":"","disabled":true}]},"description":"List agent approvals (filter by status / agentId)\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `ai:read`\n**Tags:** Agents"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"items\": [\n    {\n      \"id\": \"apv_01HW3T...\",\n      \"agentId\": \"string\",\n      \"runId\": \"string\",\n      \"source\": null,\n      \"actionKind\": \"string\",\n      \"summary\": \"string\",\n      \"payload\": {},\n      \"status\": null,\n      \"decidedAt\": \"2026-01-01T00:00:00.000Z\",\n      \"decidedById\": \"string\",\n      \"decisionNote\": \"string\",\n      \"replayable\": false,\n      \"createdAt\": \"2026-01-01T00:00:00.000Z\"\n    }\n  ]\n}"}]},{"name":"Open a new approval request","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/agents/approvals","host":["{{baseUrl}}"],"path":["v1","agents","approvals"]},"description":"Open a new approval request\n\nUsed by the agent runtime when it hits a guarded tool. Surfaces in the approvals queue for a human to decide.\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `ai:write`\n**Tags:** Agents","body":{"mode":"raw","raw":"{\n  \"agentId\": \"string\",\n  \"runId\": \"string\",\n  \"source\": \"agent_planner\",\n  \"actionKind\": \"string\",\n  \"summary\": \"string\",\n  \"payload\": {}\n}","options":{"raw":{"language":"json"}}}},"response":[{"name":"Sample 201","status":"Created","code":201,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"id\": \"apv_01HW3T...\",\n  \"agentId\": \"string\",\n  \"runId\": \"string\",\n  \"source\": \"agent_planner\",\n  \"actionKind\": \"string\",\n  \"summary\": \"string\",\n  \"payload\": {},\n  \"status\": \"PENDING\",\n  \"decidedAt\": \"2026-01-01T00:00:00.000Z\",\n  \"decidedById\": \"string\",\n  \"decisionNote\": \"string\",\n  \"replayable\": false,\n  \"createdAt\": \"2026-01-01T00:00:00.000Z\"\n}"}]},{"name":"List approvals whose original action can still be replayed verbatim","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/agents/replayable-approvals","host":["{{baseUrl}}"],"path":["v1","agents","replayable-approvals"],"query":[{"key":"limit","value":"","disabled":true}]},"description":"List approvals whose original action can still be replayed verbatim\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `ai:read`\n**Tags:** Agents"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"items\": [\n    {\n      \"id\": \"apv_01HW3T...\",\n      \"agentId\": \"string\",\n      \"runId\": \"string\",\n      \"source\": null,\n      \"actionKind\": \"string\",\n      \"summary\": \"string\",\n      \"payload\": {},\n      \"status\": null,\n      \"decidedAt\": \"2026-01-01T00:00:00.000Z\",\n      \"decidedById\": \"string\",\n      \"decisionNote\": \"string\",\n      \"replayable\": false,\n      \"createdAt\": \"2026-01-01T00:00:00.000Z\"\n    }\n  ]\n}"}]},{"name":"Snapshot of whether agent execution is currently healthy","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/agents/execution-readiness","host":["{{baseUrl}}"],"path":["v1","agents","execution-readiness"]},"description":"Snapshot of whether agent execution is currently healthy\n\nAggregates queue depth, cost ceilings, paused templates, and outstanding approvals into a single boolean + reason.\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `ai:read`\n**Tags:** Agents"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"ready\": false,\n  \"reasons\": [\n    \"string\"\n  ],\n  \"queueDepth\": 0,\n  \"pausedTemplates\": 0\n}"}]},{"name":"Aggregate risk posture across pending approvals","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/agents/approvals/risk-posture","host":["{{baseUrl}}"],"path":["v1","agents","approvals","risk-posture"]},"description":"Aggregate risk posture across pending approvals\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `ai:read`\n**Tags:** Agents"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"pendingCount\": 0,\n  \"highRiskCount\": 0,\n  \"oldestPendingAt\": \"2026-01-01T00:00:00.000Z\"\n}"}]},{"name":"Trigger a digest summarising approvals that have breached SLA","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/agents/approvals/sla-digest","host":["{{baseUrl}}"],"path":["v1","agents","approvals","sla-digest"]},"description":"Trigger a digest summarising approvals that have breached SLA\n\nBuilds a per-tenant digest and notifies the configured channel. Returns the digest summary inline.\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `ai:write`\n**Tags:** Agents"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"notified\": false,\n  \"breachedCount\": 0,\n  \"summary\": \"string\"\n}"}]},{"name":"Approve or reject an outstanding approval","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/agents/approvals/{id}/decide","host":["{{baseUrl}}"],"path":["v1","agents","approvals",":id","decide"],"variable":[{"key":"id","value":"","description":"Path parameter: id"}]},"description":"Approve or reject an outstanding approval\n\nSets `status` to `APPROVED` or `REJECTED`. Approvals notify the agent runtime so the original run can resume (when applicable).\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `ai:write`\n**Tags:** Agents","body":{"mode":"raw","raw":"{\n  \"approve\": false,\n  \"note\": \"string\"\n}","options":{"raw":{"language":"json"}}}},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"id\": \"apv_01HW3T...\",\n  \"agentId\": \"string\",\n  \"runId\": \"string\",\n  \"source\": \"agent_planner\",\n  \"actionKind\": \"string\",\n  \"summary\": \"string\",\n  \"payload\": {},\n  \"status\": \"PENDING\",\n  \"decidedAt\": \"2026-01-01T00:00:00.000Z\",\n  \"decidedById\": \"string\",\n  \"decisionNote\": \"string\",\n  \"replayable\": false,\n  \"createdAt\": \"2026-01-01T00:00:00.000Z\"\n}"}]},{"name":"Re-execute the action attached to an approved approval","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/agents/approvals/{id}/replay","host":["{{baseUrl}}"],"path":["v1","agents","approvals",":id","replay"],"variable":[{"key":"id","value":"","description":"Path parameter: id"}]},"description":"Re-execute the action attached to an approved approval\n\nLoads the captured replay envelope and re-runs the original tool call verbatim. Returns the new replay envelope (with a fresh `replayHash`).\n\n**Rate limit class:** `ai`\n**Required PAT scopes (any one):** `ai:write`\n**Tags:** Agents","body":{"mode":"raw","raw":"{\n  \"runId\": \"string\",\n  \"reason\": \"string\"\n}","options":{"raw":{"language":"json"}}}},"response":[{"name":"Sample 202","status":"Replay queued","code":202,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"approvalId\": \"string\",\n  \"replayHash\": \"string\",\n  \"toolName\": \"string\",\n  \"toolInput\": {},\n  \"capturedAt\": \"2026-01-01T00:00:00.000Z\"\n}"}]},{"name":"Activity feed across runs / approvals / governance edits","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/agents/activity","host":["{{baseUrl}}"],"path":["v1","agents","activity"],"query":[{"key":"agentId","value":"","disabled":true},{"key":"status","value":"","disabled":true},{"key":"limit","value":"","disabled":true}]},"description":"Activity feed across runs / approvals / governance edits\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `ai:read`\n**Tags:** Agents"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"items\": [\n    {\n      \"id\": \"string\",\n      \"agentId\": \"string\",\n      \"kind\": \"string\",\n      \"status\": \"string\",\n      \"summary\": \"string\",\n      \"at\": \"2026-01-01T00:00:00.000Z\"\n    }\n  ]\n}"}]}]},{"name":"Ai","item":[{"name":"Convert a natural-language prompt into a structured task draft","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/ai/nl-capture","host":["{{baseUrl}}"],"path":["v1","ai","nl-capture"]},"description":"Convert a natural-language prompt into a structured task draft\n\nReturns a draft `tasks[]` array the client can confirm before calling `POST /v1/tasks`. Optional `clarifyingQuestion` is set when the model needs a follow-up.\n\n**Rate limit class:** `ai`\n**Required PAT scopes (any one):** `ai:write`\n**Tags:** Ai","body":{"mode":"raw","raw":"{\n  \"prompt\": \"string\",\n  \"projectId\": \"string\"\n}","options":{"raw":{"language":"json"}}}},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"draft\": {\n    \"tasks\": [\n      null\n    ],\n    \"clarifyingQuestion\": \"string\"\n  },\n  \"modelUsed\": \"string\",\n  \"costUsd\": 0\n}"}]},{"name":"List recent NL-capture history for the calling user","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/ai/nl-capture/history","host":["{{baseUrl}}"],"path":["v1","ai","nl-capture","history"]},"description":"List recent NL-capture history for the calling user\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `ai:read`\n**Tags:** Ai"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"items\": [\n    {\n      \"id\": \"string\",\n      \"prompt\": \"string\",\n      \"draft\": {},\n      \"importedCount\": 0,\n      \"importedAt\": \"2026-01-01T00:00:00.000Z\",\n      \"createdAt\": \"2026-01-01T00:00:00.000Z\"\n    }\n  ]\n}"}]},{"name":"Record a manual NL-capture history entry","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/ai/nl-capture/history","host":["{{baseUrl}}"],"path":["v1","ai","nl-capture","history"]},"description":"Record a manual NL-capture history entry\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `ai:write`\n**Tags:** Ai","body":{"mode":"raw","raw":"{\n  \"prompt\": \"string\",\n  \"draft\": {},\n  \"importedCount\": 0\n}","options":{"raw":{"language":"json"}}}},"response":[{"name":"Sample 201","status":"Created","code":201,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"id\": \"string\",\n  \"prompt\": \"string\",\n  \"draft\": {},\n  \"importedCount\": 0,\n  \"importedAt\": \"2026-01-01T00:00:00.000Z\",\n  \"createdAt\": \"2026-01-01T00:00:00.000Z\"\n}"}]},{"name":"Mark a capture history row as imported (stamps `importedAt`)","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/ai/nl-capture/history/{id}/imported","host":["{{baseUrl}}"],"path":["v1","ai","nl-capture","history",":id","imported"],"variable":[{"key":"id","value":"","description":"Path parameter: id"}]},"description":"Mark a capture history row as imported (stamps `importedAt`)\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `ai:write`\n**Tags:** Ai"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"id\": \"string\",\n  \"prompt\": \"string\",\n  \"draft\": {},\n  \"importedCount\": 0,\n  \"importedAt\": \"2026-01-01T00:00:00.000Z\",\n  \"createdAt\": \"2026-01-01T00:00:00.000Z\"\n}"}]},{"name":"Delete a capture history entry","request":{"method":"DELETE","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/ai/nl-capture/history/{id}","host":["{{baseUrl}}"],"path":["v1","ai","nl-capture","history",":id"],"variable":[{"key":"id","value":"","description":"Path parameter: id"}]},"description":"Delete a capture history entry\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `ai:write`\n**Tags:** Ai"},"response":[{"name":"Sample 204","status":"Deleted","code":204,"_postman_previewlanguage":"json","body":""}]},{"name":"Ask Atlas - retrieval-augmented natural-language Q&A","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/ai/ask","host":["{{baseUrl}}"],"path":["v1","ai","ask"]},"description":"Ask Atlas - retrieval-augmented natural-language Q&A\n\nEmbeds the prompt, retrieves grounded context across tasks / projects / comments / docs, calls the LLM, and returns a cited answer.\n\n**Rate limit class:** `ai`\n**Required PAT scopes (any one):** `ai:read`\n**Tags:** Ai","body":{"mode":"raw","raw":"{\n  \"prompt\": \"string\",\n  \"projectId\": \"string\",\n  \"taskId\": \"string\",\n  \"conversationId\": \"string\"\n}","options":{"raw":{"language":"json"}}}},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"answer\": \"string\",\n  \"citations\": [\n    {\n      \"kind\": \"task\",\n      \"id\": \"string\",\n      \"title\": \"string\",\n      \"snippet\": \"string\"\n    }\n  ],\n  \"conversationId\": \"string\",\n  \"modelUsed\": \"string\",\n  \"costUsd\": 0\n}"}]},{"name":"Generate a per-user standup digest","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/ai/standup/run","host":["{{baseUrl}}"],"path":["v1","ai","standup","run"]},"description":"Generate a per-user standup digest\n\nAggregates yesterday's activity + today's plan into a short summary; safe to run on a cron.\n\n**Rate limit class:** `ai`\n**Required PAT scopes (any one):** `ai:write`\n**Tags:** Ai","body":{"mode":"raw","raw":"{\n  \"userId\": \"string\",\n  \"windowHours\": 24\n}","options":{"raw":{"language":"json"}}}},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"summary\": \"string\",\n  \"yesterday\": [\n    \"string\"\n  ],\n  \"today\": [\n    \"string\"\n  ],\n  \"blockers\": [\n    \"string\"\n  ],\n  \"modelUsed\": \"string\"\n}"}]},{"name":"List agentic planner runs","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/ai/agentic/planner/runs","host":["{{baseUrl}}"],"path":["v1","ai","agentic","planner","runs"],"query":[{"key":"status","value":"","disabled":true},{"key":"limit","value":"","disabled":true}]},"description":"List agentic planner runs\n\nEach run captures the planner's tool-admission decisions and step outputs for replay + audit.\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `ai:read`\n**Tags:** Ai"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"items\": [\n    {\n      \"id\": \"apr_01HW3T...\",\n      \"status\": \"planning\",\n      \"objective\": \"string\",\n      \"steps\": [\n        null\n      ],\n      \"totalCostUsd\": 0,\n      \"createdAt\": \"2026-01-01T00:00:00.000Z\",\n      \"completedAt\": \"2026-01-01T00:00:00.000Z\"\n    }\n  ]\n}"}]},{"name":"Read a single agentic planner run (with steps + tool admissions)","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/ai/agentic/planner/runs/{id}","host":["{{baseUrl}}"],"path":["v1","ai","agentic","planner","runs",":id"],"variable":[{"key":"id","value":"","description":"Path parameter: id"}]},"description":"Read a single agentic planner run (with steps + tool admissions)\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `ai:read`\n**Tags:** Ai"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"id\": \"apr_01HW3T...\",\n  \"status\": \"planning\",\n  \"objective\": \"string\",\n  \"steps\": [\n    {\n      \"index\": null,\n      \"toolName\": null,\n      \"admission\": null,\n      \"status\": null,\n      \"input\": null,\n      \"output\": null\n    }\n  ],\n  \"totalCostUsd\": 0,\n  \"createdAt\": \"2026-01-01T00:00:00.000Z\",\n  \"completedAt\": \"2026-01-01T00:00:00.000Z\"\n}"}]},{"name":"List the most recent tool-admission decisions made by the planner","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/ai/agentic/tool-admissions","host":["{{baseUrl}}"],"path":["v1","ai","agentic","tool-admissions"],"query":[{"key":"toolName","value":"","disabled":true},{"key":"allowed","value":"","disabled":true},{"key":"limit","value":"","disabled":true}]},"description":"List the most recent tool-admission decisions made by the planner\n\nPure audit feed; surface in the AI observability console to spot tools the planner is repeatedly rejecting.\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `ai:read`\n**Tags:** Ai"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"items\": [\n    {\n      \"toolName\": \"string\",\n      \"allowed\": false,\n      \"reason\": \"string\",\n      \"riskLevel\": \"low\",\n      \"requiresApproval\": false\n    }\n  ]\n}"}]}]},{"name":"AiObservability","item":[{"name":"Read AI observability KPI tiles for the last 24 hours (super admin)","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/ai-observability/summary","host":["{{baseUrl}}"],"path":["v1","ai-observability","summary"]},"description":"Read AI observability KPI tiles for the last 24 hours (super admin)\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `profile:read`\n**Tags:** AiObservability, SuperAdmin"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"runsLast24h\": 0,\n  \"successRate\": 0,\n  \"p50LatencyMs\": 0,\n  \"p95LatencyMs\": 0,\n  \"costLast24hUsd\": 0\n}"}]},{"name":"Read per-provider AI tiles (super admin)","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/ai-observability/providers","host":["{{baseUrl}}"],"path":["v1","ai-observability","providers"]},"description":"Read per-provider AI tiles (super admin)\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `profile:read`\n**Tags:** AiObservability, SuperAdmin"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"items\": [\n    {\n      \"providerKey\": null,\n      \"calls24h\": null,\n      \"errorRate\": null,\n      \"costUsd\": null,\n      \"p95Ms\": null\n    }\n  ]\n}"}]},{"name":"Read recent AI attempt traces (super admin)","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/ai-observability/traces","host":["{{baseUrl}}"],"path":["v1","ai-observability","traces"],"query":[{"key":"since","value":"","disabled":true},{"key":"limit","value":"","disabled":true}]},"description":"Read recent AI attempt traces (super admin)\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `profile:read`\n**Tags:** AiObservability, SuperAdmin"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"items\": [\n    {\n      \"agentRunId\": null,\n      \"providerKey\": null,\n      \"durationMs\": null,\n      \"status\": null,\n      \"errorClass\": null,\n      \"startedAt\": null\n    }\n  ]\n}"}]}]},{"name":"Appointments","item":[{"name":"List appointments (confirmed bookings) for the calling host","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/appointments","host":["{{baseUrl}}"],"path":["v1","appointments"],"query":[{"key":"status","value":"","description":"Filter by lifecycle. Defaults to `upcoming`.","disabled":true},{"key":"bookingPageId","value":"","disabled":true},{"key":"from","value":"","disabled":true},{"key":"to","value":"","disabled":true},{"key":"attendee","value":"","disabled":true},{"key":"limit","value":"","disabled":true},{"key":"cursor","value":"","disabled":true}]},"description":"List appointments (confirmed bookings) for the calling host\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `appointments:read`\n**Tags:** Appointments"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","body":""}]},{"name":"Read a single appointment","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/appointments/{id}","host":["{{baseUrl}}"],"path":["v1","appointments",":id"],"variable":[{"key":"id","value":"","description":"Path parameter: id"}]},"description":"Read a single appointment\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `appointments:read`\n**Tags:** Appointments"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","body":""}]},{"name":"Update host-only fields on an appointment (private notes, meeting URL, location)","request":{"method":"PATCH","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/appointments/{id}","host":["{{baseUrl}}"],"path":["v1","appointments",":id"],"variable":[{"key":"id","value":"","description":"Path parameter: id"}]},"description":"Update host-only fields on an appointment (private notes, meeting URL, location)\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `appointments:write`\n**Tags:** Appointments"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","body":""}]},{"name":"Move an appointment to a new slot (host-initiated)","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/appointments/{id}/reschedule","host":["{{baseUrl}}"],"path":["v1","appointments",":id","reschedule"],"variable":[{"key":"id","value":"","description":"Path parameter: id"}]},"description":"Move an appointment to a new slot (host-initiated)\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `appointments:write`\n**Tags:** Appointments"},"response":[{"name":"Sample 200","status":"Rescheduled","code":200,"_postman_previewlanguage":"json","body":""}]},{"name":"Cancel an appointment","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/appointments/{id}/cancel","host":["{{baseUrl}}"],"path":["v1","appointments",":id","cancel"],"variable":[{"key":"id","value":"","description":"Path parameter: id"}]},"description":"Cancel an appointment\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `appointments:write`\n**Tags:** Appointments"},"response":[{"name":"Sample 200","status":"Cancelled","code":200,"_postman_previewlanguage":"json","body":""}]},{"name":"Send a reminder email to the guest (rate-limited to once per hour per booking)","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/appointments/{id}/reminder","host":["{{baseUrl}}"],"path":["v1","appointments",":id","reminder"],"variable":[{"key":"id","value":"","description":"Path parameter: id"}]},"description":"Send a reminder email to the guest (rate-limited to once per hour per booking)\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `appointments:write`\n**Tags:** Appointments"},"response":[{"name":"Sample 200","status":"Sent","code":200,"_postman_previewlanguage":"json","body":""}]},{"name":"Toggle the no-show flag on a past appointment","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/appointments/{id}/no-show","host":["{{baseUrl}}"],"path":["v1","appointments",":id","no-show"],"variable":[{"key":"id","value":"","description":"Path parameter: id"}]},"description":"Toggle the no-show flag on a past appointment\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `appointments:write`\n**Tags:** Appointments"},"response":[{"name":"Sample 200","status":"Updated","code":200,"_postman_previewlanguage":"json","body":""}]}]},{"name":"Compliance","item":[{"name":"List compliance controls (admin)","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/compliance/controls","host":["{{baseUrl}}"],"path":["v1","compliance","controls"],"query":[{"key":"framework","value":"","disabled":true}]},"description":"List compliance controls (admin)\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `profile:read`\n**Tags:** Compliance"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"items\": [\n    {\n      \"id\": null,\n      \"framework\": null,\n      \"reference\": null,\n      \"title\": null,\n      \"description\": null,\n      \"category\": null,\n      \"active\": null\n    }\n  ]\n}"}]},{"name":"List the latest evidence rows per control (admin)","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/compliance/evidence","host":["{{baseUrl}}"],"path":["v1","compliance","evidence"],"query":[{"key":"controlId","value":"","disabled":true}]},"description":"List the latest evidence rows per control (admin)\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `profile:read`\n**Tags:** Compliance"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"items\": [\n    {\n      \"id\": null,\n      \"controlId\": null,\n      \"collectedAt\": null,\n      \"passing\": null,\n      \"evidenceJson\": null,\n      \"notes\": null,\n      \"collectedBy\": null,\n      \"expiresAt\": null\n    }\n  ]\n}"}]},{"name":"Read the tenant evidence-vault summary (admin)","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/compliance/evidence-vault","host":["{{baseUrl}}"],"path":["v1","compliance","evidence-vault"]},"description":"Read the tenant evidence-vault summary (admin)\n\nAggregated read across every evidence source the tenant has access to: per-source item counts + latest timestamps, evidence pack lifecycle counts, open findings, and the role x source permission matrix.\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `profile:read`\n**Tags:** Compliance, EvidenceVault"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"generatedAt\": \"2026-01-01T00:00:00.000Z\",\n  \"tenantId\": \"string\",\n  \"sources\": [\n    {\n      \"id\": \"audit-events\",\n      \"label\": \"string\",\n      \"description\": \"string\",\n      \"route\": \"string\",\n      \"dataClass\": \"operational-audit\",\n      \"visibility\": \"tenant-admin\",\n      \"retentionDays\": 0,\n      \"exportFormats\": [\n        null\n      ],\n      \"redactionPolicy\": \"string\",\n      \"analyticsId\": \"string\",\n      \"itemCount\": 0,\n      \"latestAt\": \"2026-01-01T00:00:00.000Z\"\n    }\n  ],\n  \"packSummary\": {\n    \"total\": 0,\n    \"ready\": 0,\n    \"building\": 0,\n    \"failed\": 0,\n    \"downloadable\": 0,\n    \"expired\": 0,\n    \"expiringSoon\": 0,\n    \"integrityCovered\": 0,\n    \"totalArtifactBytes\": 0,\n    \"nextExpirationAt\": \"2026-01-01T00:00:00.000Z\",\n    \"active\": 0,\n    \"legalHold\": 0,\n    \"deletionHold\": 0,\n    \"purgeEligible\": 0,\n    \"purgeBlocked\": 0,\n    \"purgeFailed\": 0,\n    \"unknownRetention\": 0,\n    \"missingChecksum\": 0,\n    \"nextPurgeEligibleAt\": \"2026-01-01T00:00:00.000Z\"\n  },\n  \"openFindingCount\": 0,\n  \"permissionMatrix\": [\n    {\n      \"role\": \"OWNER\",\n      \"sourceId\": \"string\",\n      \"allowed\": false,\n      \"scope\": \"all-tenant\"\n    }\n  ]\n}"}]},{"name":"Force a re-collection of all compliance evidence (admin)","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/compliance/collect","host":["{{baseUrl}}"],"path":["v1","compliance","collect"]},"description":"Force a re-collection of all compliance evidence (admin)\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `profile:write`\n**Tags:** Compliance"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"collected\": 0,\n  \"passing\": 0,\n  \"failing\": 0\n}"}]},{"name":"List compliance findings (admin)","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/compliance/findings","host":["{{baseUrl}}"],"path":["v1","compliance","findings"],"query":[{"key":"status","value":"","disabled":true}]},"description":"List compliance findings (admin)\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `profile:read`\n**Tags:** Compliance"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"items\": [\n    {\n      \"id\": null,\n      \"controlId\": null,\n      \"severity\": null,\n      \"status\": null,\n      \"description\": null,\n      \"remediationPlan\": null,\n      \"ownerUserId\": null,\n      \"dueAt\": null,\n      \"createdAt\": null,\n      \"resolvedAt\": null\n    }\n  ]\n}"}]},{"name":"Update one compliance finding (admin)","request":{"method":"PATCH","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/compliance/findings/{id}","host":["{{baseUrl}}"],"path":["v1","compliance","findings",":id"],"variable":[{"key":"id","value":"","description":"Path parameter: id"}]},"description":"Update one compliance finding (admin)\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `profile:write`\n**Tags:** Compliance","body":{"mode":"raw","raw":"{\n  \"status\": \"open\",\n  \"remediationPlan\": \"string\",\n  \"ownerUserId\": \"string\",\n  \"dueAt\": \"2026-01-01T00:00:00.000Z\"\n}","options":{"raw":{"language":"json"}}}},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"id\": \"string\",\n  \"controlId\": \"string\",\n  \"severity\": \"high\",\n  \"status\": \"open\",\n  \"description\": \"string\",\n  \"remediationPlan\": \"string\",\n  \"ownerUserId\": \"string\",\n  \"dueAt\": \"2026-01-01T00:00:00.000Z\",\n  \"createdAt\": \"2026-01-01T00:00:00.000Z\",\n  \"resolvedAt\": \"2026-01-01T00:00:00.000Z\"\n}"}]},{"name":"List compliance evidence packs the tenant has queued (admin)","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/compliance/packs","host":["{{baseUrl}}"],"path":["v1","compliance","packs"]},"description":"List compliance evidence packs the tenant has queued (admin)\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `profile:read`\n**Tags:** Compliance"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"items\": [\n    {\n      \"id\": null,\n      \"framework\": null,\n      \"generatedAt\": null,\n      \"status\": null,\n      \"artifactUrl\": null,\n      \"downloadAvailable\": null,\n      \"controlsIncluded\": null,\n      \"passingCount\": null,\n      \"failingCount\": null,\n      \"artifactSizeBytes\": null,\n      \"artifactSha256\": null,\n      \"expiresAt\": null\n    }\n  ]\n}"}]},{"name":"Queue a new compliance evidence pack build (admin)","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/compliance/packs","host":["{{baseUrl}}"],"path":["v1","compliance","packs"]},"description":"Queue a new compliance evidence pack build (admin)\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `profile:write`\n**Tags:** Compliance","body":{"mode":"raw","raw":"{\n  \"framework\": \"SOC2\"\n}","options":{"raw":{"language":"json"}}}},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"id\": \"string\",\n  \"framework\": \"string\",\n  \"generatedAt\": \"2026-01-01T00:00:00.000Z\",\n  \"status\": \"string\",\n  \"artifactUrl\": \"string\",\n  \"downloadAvailable\": false,\n  \"controlsIncluded\": 0,\n  \"passingCount\": 0,\n  \"failingCount\": 0,\n  \"artifactSizeBytes\": 0,\n  \"artifactSha256\": \"string\",\n  \"expiresAt\": \"2026-01-01T00:00:00.000Z\"\n}"}]},{"name":"Get a short-lived download URL for one evidence pack (admin)","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/compliance/packs/{id}/download","host":["{{baseUrl}}"],"path":["v1","compliance","packs",":id","download"],"variable":[{"key":"id","value":"","description":"Path parameter: id"}]},"description":"Get a short-lived download URL for one evidence pack (admin)\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `profile:read`\n**Tags:** Compliance"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"url\": \"https://example.com\"\n}"}]},{"name":"List compliance evidence pack jobs (super admin)","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/compliance/evidence-packs","host":["{{baseUrl}}"],"path":["v1","compliance","evidence-packs"],"query":[{"key":"limit","value":"","disabled":true}]},"description":"List compliance evidence pack jobs (super admin)\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `profile:read`\n**Tags:** Compliance, SuperAdmin"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"items\": [\n    {\n      \"jobId\": null,\n      \"tenantId\": null,\n      \"framework\": null,\n      \"status\": null,\n      \"requestedAt\": null,\n      \"startedAt\": null,\n      \"completedAt\": null,\n      \"requestedByEmail\": null,\n      \"downloadUrl\": null,\n      \"artifactSha256\": null,\n      \"artifactSizeBytes\": null,\n      \"controlsIncluded\": null,\n      \"errorMessage\": null\n    }\n  ]\n}"}]},{"name":"Enqueue a new compliance evidence pack job (super admin)","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/compliance/evidence-packs","host":["{{baseUrl}}"],"path":["v1","compliance","evidence-packs"]},"description":"Enqueue a new compliance evidence pack job (super admin)\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `profile:write`\n**Tags:** Compliance, SuperAdmin","body":{"mode":"raw","raw":"{\n  \"framework\": \"SOC2\",\n  \"tenantId\": \"string\"\n}","options":{"raw":{"language":"json"}}}},"response":[{"name":"Sample 200","status":"Accepted","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"jobId\": \"string\"\n}"}]},{"name":"Read one compliance evidence pack job (super admin)","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/compliance/evidence-packs/{jobId}","host":["{{baseUrl}}"],"path":["v1","compliance","evidence-packs",":jobId"],"variable":[{"key":"jobId","value":"","description":"Path parameter: jobId"}]},"description":"Read one compliance evidence pack job (super admin)\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `profile:read`\n**Tags:** Compliance, SuperAdmin"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"jobId\": \"string\",\n  \"tenantId\": \"string\",\n  \"framework\": \"SOC2\",\n  \"status\": \"queued\",\n  \"requestedAt\": \"2026-01-01T00:00:00.000Z\",\n  \"startedAt\": \"2026-01-01T00:00:00.000Z\",\n  \"completedAt\": \"2026-01-01T00:00:00.000Z\",\n  \"requestedByEmail\": \"user@example.com\",\n  \"downloadUrl\": \"string\",\n  \"artifactSha256\": \"string\",\n  \"artifactSizeBytes\": 0,\n  \"controlsIncluded\": 0,\n  \"errorMessage\": \"string\"\n}"}]}]},{"name":"DataExport","item":[{"name":"Start a tenant data export job (OWNER / ADMIN only)","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/me/data-export/start","host":["{{baseUrl}}"],"path":["v1","me","data-export","start"]},"description":"Start a tenant data export job (OWNER / ADMIN only)\n\nEnqueues a background job that gzips every tenant-scoped table into a single archive plus a manifest. Returns the new jobId immediately; poll `/v1/me/data-export/jobs/{id}` until status is `ready`.\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `profile:write`\n**Tags:** DataExport"},"response":[{"name":"Sample 202","status":"Accepted","code":202,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"jobId\": \"string\",\n  \"status\": \"queued\"\n}"}]},{"name":"List the caller's tenant data export jobs","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/me/data-export/jobs","host":["{{baseUrl}}"],"path":["v1","me","data-export","jobs"]},"description":"List the caller's tenant data export jobs\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `profile:read`\n**Tags:** DataExport"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"items\": [\n    {\n      \"id\": null,\n      \"status\": null,\n      \"requestedById\": null,\n      \"artifactSizeBytes\": null,\n      \"artifactSha256\": null,\n      \"rowCount\": null,\n      \"failureReason\": null,\n      \"requestedAt\": null,\n      \"startedAt\": null,\n      \"completedAt\": null,\n      \"expiresAt\": null,\n      \"hasDownload\": null\n    }\n  ]\n}"}]},{"name":"Read one tenant data export job","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/me/data-export/jobs/{id}","host":["{{baseUrl}}"],"path":["v1","me","data-export","jobs",":id"],"variable":[{"key":"id","value":"","description":"Path parameter: id"}]},"description":"Read one tenant data export job\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `profile:read`\n**Tags:** DataExport"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"id\": \"string\",\n  \"status\": \"queued\",\n  \"requestedById\": \"string\",\n  \"artifactSizeBytes\": 0,\n  \"artifactSha256\": \"string\",\n  \"rowCount\": 0,\n  \"failureReason\": \"string\",\n  \"requestedAt\": \"2026-01-01T00:00:00.000Z\",\n  \"startedAt\": \"2026-01-01T00:00:00.000Z\",\n  \"completedAt\": \"2026-01-01T00:00:00.000Z\",\n  \"expiresAt\": \"2026-01-01T00:00:00.000Z\",\n  \"hasDownload\": false\n}"}]},{"name":"Mint a short-lived download URL for one tenant data export artifact","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/me/data-export/jobs/{id}/download","host":["{{baseUrl}}"],"path":["v1","me","data-export","jobs",":id","download"],"variable":[{"key":"id","value":"","description":"Path parameter: id"}]},"description":"Mint a short-lived download URL for one tenant data export artifact\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `profile:read`\n**Tags:** DataExport"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"url\": \"https://example.com\",\n  \"expiresAt\": \"2026-01-01T00:00:00.000Z\",\n  \"artifactSha256\": \"string\",\n  \"artifactSizeBytes\": 0,\n  \"filename\": \"string\"\n}"}]}]},{"name":"EmailTemplates","item":[{"name":"List per-tenant email templates","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/email-templates","host":["{{baseUrl}}"],"path":["v1","email-templates"],"query":[{"key":"key","value":"","disabled":true},{"key":"locale","value":"","disabled":true},{"key":"isActive","value":"","disabled":true}]},"description":"List per-tenant email templates\n\nReturns every template available to the calling tenant - both the per-tenant overrides (`isOverride: true`) and the system-shipped defaults that surface through the same resolver. Filter by `key`, `locale`, or `isActive`.\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `profile:read`\n**Tags:** EmailTemplates"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"items\": [\n    {\n      \"id\": \"etpl_01HW3T2K8X9Y2VPRZGQX9NDY60\",\n      \"tenantId\": \"string\",\n      \"key\": \"task.assignment\",\n      \"locale\": \"en\",\n      \"version\": 0,\n      \"subject\": \"string\",\n      \"htmlBody\": \"string\",\n      \"textBody\": \"string\",\n      \"isActive\": false,\n      \"variantOfTemplateId\": \"string\",\n      \"trafficPct\": 0,\n      \"isOverride\": false,\n      \"createdAt\": \"2026-01-01T00:00:00.000Z\",\n      \"updatedAt\": \"2026-01-01T00:00:00.000Z\"\n    }\n  ]\n}"}]},{"name":"Upsert a per-tenant email template (create or replace)","request":{"method":"PUT","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/email-templates","host":["{{baseUrl}}"],"path":["v1","email-templates"]},"description":"Upsert a per-tenant email template (create or replace)\n\nIdempotent upsert keyed on `(tenantId, key, locale)`. Bumps `version` on every write so the editor can detect concurrent edits. A/B variant linkage via `variantOfTemplateId` + `trafficPct` is set here on the variant row, not on the primary.\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `profile:write`\n**Tags:** EmailTemplates","body":{"mode":"raw","raw":"{\n  \"key\": \"task.assignment\",\n  \"locale\": \"en\",\n  \"subject\": \"string\",\n  \"htmlBody\": \"string\",\n  \"textBody\": \"string\",\n  \"isActive\": true,\n  \"variantOfTemplateId\": \"string\",\n  \"trafficPct\": 0\n}","options":{"raw":{"language":"json"}}}},"response":[{"name":"Sample 200","status":"Created or replaced","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"id\": \"etpl_01HW3T2K8X9Y2VPRZGQX9NDY60\",\n  \"tenantId\": \"string\",\n  \"key\": \"task.assignment\",\n  \"locale\": \"en\",\n  \"version\": 0,\n  \"subject\": \"string\",\n  \"htmlBody\": \"string\",\n  \"textBody\": \"string\",\n  \"isActive\": false,\n  \"variantOfTemplateId\": \"string\",\n  \"trafficPct\": 0,\n  \"isOverride\": false,\n  \"createdAt\": \"2026-01-01T00:00:00.000Z\",\n  \"updatedAt\": \"2026-01-01T00:00:00.000Z\"\n}"}]},{"name":"Read one email template","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/email-templates/{id}","host":["{{baseUrl}}"],"path":["v1","email-templates",":id"],"variable":[{"key":"id","value":"","description":"Path parameter: id"}]},"description":"Read one email template\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `profile:read`\n**Tags:** EmailTemplates"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"id\": \"etpl_01HW3T2K8X9Y2VPRZGQX9NDY60\",\n  \"tenantId\": \"string\",\n  \"key\": \"task.assignment\",\n  \"locale\": \"en\",\n  \"version\": 0,\n  \"subject\": \"string\",\n  \"htmlBody\": \"string\",\n  \"textBody\": \"string\",\n  \"isActive\": false,\n  \"variantOfTemplateId\": \"string\",\n  \"trafficPct\": 0,\n  \"isOverride\": false,\n  \"createdAt\": \"2026-01-01T00:00:00.000Z\",\n  \"updatedAt\": \"2026-01-01T00:00:00.000Z\"\n}"}]},{"name":"Render an email template against sample variables (no send)","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/email-templates/preview","host":["{{baseUrl}}"],"path":["v1","email-templates","preview"]},"description":"Render an email template against sample variables (no send)\n\nServer-side renders the template using the supplied `variables`. Pass inline `subject` / `htmlBody` / `textBody` to preview unsaved drafts without persisting. Returns the rendered shapes plus `usedOverride` so the editor can warn when the preview hit the shipped default instead of a per-tenant override.\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `profile:write`\n**Tags:** EmailTemplates","body":{"mode":"raw","raw":"{\n  \"key\": \"string\",\n  \"locale\": \"en\",\n  \"subject\": \"string\",\n  \"htmlBody\": \"string\",\n  \"textBody\": \"string\",\n  \"variables\": {\n    \"firstName\": \"Jordan\",\n    \"taskTitle\": \"Ship public API\"\n  }\n}","options":{"raw":{"language":"json"}}}},"response":[{"name":"Sample 200","status":"Rendered preview","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"subject\": \"string\",\n  \"html\": \"string\",\n  \"text\": \"string\",\n  \"key\": \"string\",\n  \"locale\": \"string\",\n  \"usedOverride\": false\n}"}]},{"name":"Open a mailto: link rendered from a template (no server-side SMTP)","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/email-templates/test-send","host":["{{baseUrl}}"],"path":["v1","email-templates","test-send"]},"description":"Open a mailto: link rendered from a template (no server-side SMTP)\n\nRenders the template against `variables` and returns a `mailto:` URL the FE opens so the admin's local mail client sends the test - this avoids paying for an SMTP send during admin previews and dodges spam-list reputation hits.\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `profile:write`\n**Tags:** EmailTemplates","body":{"mode":"raw","raw":"{\n  \"key\": \"string\",\n  \"locale\": \"en\",\n  \"toEmail\": \"user@example.com\",\n  \"variables\": {}\n}","options":{"raw":{"language":"json"}}}},"response":[{"name":"Sample 200","status":"mailto: link ready","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"mailto\": \"string\",\n  \"subject\": \"string\",\n  \"toEmail\": \"user@example.com\"\n}"}]},{"name":"List per-locale variants for a template","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/admin/email-templates/{templateId}/variants","host":["{{baseUrl}}"],"path":["v1","admin","email-templates",":templateId","variants"],"variable":[{"key":"templateId","value":"","description":"Path parameter: templateId"}]},"description":"List per-locale variants for a template\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `profile:read`\n**Tags:** EmailTemplates"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"items\": [\n    {\n      \"id\": \"string\",\n      \"templateId\": \"string\",\n      \"locale\": \"string\",\n      \"subject\": \"string\",\n      \"bodyHtml\": \"string\",\n      \"bodyText\": \"string\",\n      \"createdAt\": \"2026-01-01T00:00:00.000Z\",\n      \"updatedAt\": \"2026-01-01T00:00:00.000Z\"\n    }\n  ]\n}"}]},{"name":"Read a single per-locale variant","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/admin/email-templates/{templateId}/variants/{locale}","host":["{{baseUrl}}"],"path":["v1","admin","email-templates",":templateId","variants",":locale"],"variable":[{"key":"templateId","value":"","description":"Path parameter: templateId"},{"key":"locale","value":"","description":"Path parameter: locale"}]},"description":"Read a single per-locale variant\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `profile:read`\n**Tags:** EmailTemplates"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"id\": \"string\",\n  \"templateId\": \"string\",\n  \"locale\": \"string\",\n  \"subject\": \"string\",\n  \"bodyHtml\": \"string\",\n  \"bodyText\": \"string\",\n  \"createdAt\": \"2026-01-01T00:00:00.000Z\",\n  \"updatedAt\": \"2026-01-01T00:00:00.000Z\"\n}"}]},{"name":"Upsert a per-locale variant","request":{"method":"PUT","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/admin/email-templates/{templateId}/variants/{locale}","host":["{{baseUrl}}"],"path":["v1","admin","email-templates",":templateId","variants",":locale"],"variable":[{"key":"templateId","value":"","description":"Path parameter: templateId"},{"key":"locale","value":"","description":"Path parameter: locale"}]},"description":"Upsert a per-locale variant\n\nIdempotent on `(templateId, locale)`. The variant inherits the parent template's key + active flag.\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `profile:write`\n**Tags:** EmailTemplates","body":{"mode":"raw","raw":"{\n  \"subject\": \"string\",\n  \"bodyHtml\": \"string\",\n  \"bodyText\": \"string\"\n}","options":{"raw":{"language":"json"}}}},"response":[{"name":"Sample 200","status":"Created or replaced","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"id\": \"string\",\n  \"templateId\": \"string\",\n  \"locale\": \"string\",\n  \"subject\": \"string\",\n  \"bodyHtml\": \"string\",\n  \"bodyText\": \"string\",\n  \"createdAt\": \"2026-01-01T00:00:00.000Z\",\n  \"updatedAt\": \"2026-01-01T00:00:00.000Z\"\n}"}]},{"name":"Delete a per-locale variant","request":{"method":"DELETE","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/admin/email-templates/{templateId}/variants/{locale}","host":["{{baseUrl}}"],"path":["v1","admin","email-templates",":templateId","variants",":locale"],"variable":[{"key":"templateId","value":"","description":"Path parameter: templateId"},{"key":"locale","value":"","description":"Path parameter: locale"}]},"description":"Delete a per-locale variant\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `profile:write`\n**Tags:** EmailTemplates"},"response":[{"name":"Sample 204","status":"Deleted","code":204,"_postman_previewlanguage":"json","body":""}]}]},{"name":"FocusCoaching","item":[{"name":"Read 0-3 short focus / productivity coaching cards for the calling user","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/focus-coaching/suggestions","host":["{{baseUrl}}"],"path":["v1","focus-coaching","suggestions"]},"description":"Read 0-3 short focus / productivity coaching cards for the calling user\n\nComputed from the caller's habits, goals, tasks, and recent focus sessions. Pure read; nothing is persisted.\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `profile:read`\n**Tags:** FocusCoaching"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","body":""}]}]},{"name":"GitHub","item":[{"name":"List GitHub App installations for the calling tenant","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/integrations/github","host":["{{baseUrl}}"],"path":["v1","integrations","github"]},"description":"List GitHub App installations for the calling tenant\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `profile:read`\n**Tags:** GitHub, Integrations"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"items\": [\n    {\n      \"id\": \"string\",\n      \"installationId\": \"string\",\n      \"accountLogin\": \"acme-eng\",\n      \"accountType\": \"User\",\n      \"createdAt\": \"2026-01-01T00:00:00.000Z\"\n    }\n  ]\n}"}]},{"name":"Return the GitHub App install URL (carries OAuth state)","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/integrations/github/install-url","host":["{{baseUrl}}"],"path":["v1","integrations","github","install-url"]},"description":"Return the GitHub App install URL (carries OAuth state)\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `profile:read`\n**Tags:** GitHub, Integrations"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"url\": \"https://example.com\"\n}"}]},{"name":"Disable a GitHub installation","request":{"method":"DELETE","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/integrations/github/{id}","host":["{{baseUrl}}"],"path":["v1","integrations","github",":id"],"variable":[{"key":"id","value":"","description":"Path parameter: id"}]},"description":"Disable a GitHub installation\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `profile:write`\n**Tags:** GitHub, Integrations"},"response":[{"name":"Sample 204","status":"Disabled","code":204,"_postman_previewlanguage":"json","body":""}]},{"name":"List GitHub issue / PR links for a task","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/integrations/github/tasks/{taskId}/links","host":["{{baseUrl}}"],"path":["v1","integrations","github","tasks",":taskId","links"],"variable":[{"key":"taskId","value":"","description":"Path parameter: taskId"}]},"description":"List GitHub issue / PR links for a task\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `tasks:read`\n**Tags:** GitHub, Integrations"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"items\": [\n    {\n      \"id\": \"string\",\n      \"taskId\": \"string\",\n      \"url\": \"https://example.com\",\n      \"kind\": \"ISSUE\",\n      \"owner\": \"acme-eng\",\n      \"repo\": \"atlas\",\n      \"number\": 0,\n      \"title\": \"string\",\n      \"state\": \"open\",\n      \"createdAt\": \"2026-01-01T00:00:00.000Z\"\n    }\n  ]\n}"}]},{"name":"Link a GitHub issue or PR to a task","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/integrations/github/tasks/{taskId}/links","host":["{{baseUrl}}"],"path":["v1","integrations","github","tasks",":taskId","links"],"variable":[{"key":"taskId","value":"","description":"Path parameter: taskId"}]},"description":"Link a GitHub issue or PR to a task\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `tasks:write`\n**Tags:** GitHub, Integrations","body":{"mode":"raw","raw":"{\n  \"url\": \"https://example.com\"\n}","options":{"raw":{"language":"json"}}}},"response":[{"name":"Sample 201","status":"Created","code":201,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"id\": \"string\",\n  \"taskId\": \"string\",\n  \"url\": \"https://example.com\",\n  \"kind\": \"ISSUE\",\n  \"owner\": \"acme-eng\",\n  \"repo\": \"atlas\",\n  \"number\": 0,\n  \"title\": \"string\",\n  \"state\": \"open\",\n  \"createdAt\": \"2026-01-01T00:00:00.000Z\"\n}"}]},{"name":"Remove a GitHub link from a task","request":{"method":"DELETE","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/integrations/github/tasks/{taskId}/links/{linkId}","host":["{{baseUrl}}"],"path":["v1","integrations","github","tasks",":taskId","links",":linkId"],"variable":[{"key":"taskId","value":"","description":"Path parameter: taskId"},{"key":"linkId","value":"","description":"Path parameter: linkId"}]},"description":"Remove a GitHub link from a task\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `tasks:write`\n**Tags:** GitHub, Integrations"},"response":[{"name":"Sample 204","status":"Removed","code":204,"_postman_previewlanguage":"json","body":""}]}]},{"name":"Gmail","item":[{"name":"Read the calling user's Gmail connection","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/integrations/gmail/me","host":["{{baseUrl}}"],"path":["v1","integrations","gmail","me"]},"description":"Read the calling user's Gmail connection\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `profile:read`\n**Tags:** Gmail, Integrations"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"connected\": false,\n  \"emailAddress\": \"user@example.com\",\n  \"historyId\": \"string\",\n  \"watchExpiresAt\": \"2026-01-01T00:00:00.000Z\"\n}"}]},{"name":"Update the calling user's Gmail connection settings","request":{"method":"PATCH","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/integrations/gmail/me","host":["{{baseUrl}}"],"path":["v1","integrations","gmail","me"]},"description":"Update the calling user's Gmail connection settings\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `profile:write`\n**Tags:** Gmail, Integrations","body":{"mode":"raw","raw":"{\n  \"syncEnabled\": false,\n  \"syncLabels\": [\n    \"string\"\n  ]\n}","options":{"raw":{"language":"json"}}}},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","body":""}]},{"name":"Disconnect the calling user's Gmail account","request":{"method":"DELETE","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/integrations/gmail/me","host":["{{baseUrl}}"],"path":["v1","integrations","gmail","me"]},"description":"Disconnect the calling user's Gmail account\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `profile:write`\n**Tags:** Gmail, Integrations"},"response":[{"name":"Sample 204","status":"Disconnected","code":204,"_postman_previewlanguage":"json","body":""}]}]},{"name":"HR","item":[{"name":"Manager approves a role-change request","request":{"method":"PATCH","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/hr/role-changes/{id}/manager-approve","host":["{{baseUrl}}"],"path":["v1","hr","role-changes",":id","manager-approve"],"variable":[{"key":"id","value":"","description":"Path parameter: id"}]},"description":"Manager approves a role-change request\n\nStamps `managerApprovedAt`/`managerApprovedById` and moves the row to MANAGER_APPROVED. Caller must not be the requester.\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `profile:write`\n**Tags:** HR"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"id\": \"rch_01HW3T...\",\n  \"employeeId\": \"string\",\n  \"requestedById\": \"string\",\n  \"newJobTitle\": \"string\",\n  \"newDepartmentId\": \"string\",\n  \"newLocationId\": \"string\",\n  \"newManagerId\": \"string\",\n  \"effectiveFrom\": \"2026-01-01\",\n  \"reason\": \"string\",\n  \"status\": \"PENDING\",\n  \"managerApprovedAt\": \"2026-01-01T00:00:00.000Z\",\n  \"managerApprovedById\": \"string\",\n  \"hrApprovedAt\": \"2026-01-01T00:00:00.000Z\",\n  \"hrApprovedById\": \"string\",\n  \"rejectionReason\": \"string\",\n  \"appliedAt\": \"2026-01-01T00:00:00.000Z\",\n  \"createdAt\": \"2026-01-01T00:00:00.000Z\",\n  \"updatedAt\": \"2026-01-01T00:00:00.000Z\"\n}"}]},{"name":"HR approves a role-change request (final approval)","request":{"method":"PATCH","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/hr/role-changes/{id}/hr-approve","host":["{{baseUrl}}"],"path":["v1","hr","role-changes",":id","hr-approve"],"variable":[{"key":"id","value":"","description":"Path parameter: id"}]},"description":"HR approves a role-change request (final approval)\n\nRequires OWNER/ADMIN. Writes the change onto the Employee row and stamps `hrApprovedAt` + `appliedAt`. Terminal state.\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `profile:write`\n**Tags:** HR"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"id\": \"rch_01HW3T...\",\n  \"employeeId\": \"string\",\n  \"requestedById\": \"string\",\n  \"newJobTitle\": \"string\",\n  \"newDepartmentId\": \"string\",\n  \"newLocationId\": \"string\",\n  \"newManagerId\": \"string\",\n  \"effectiveFrom\": \"2026-01-01\",\n  \"reason\": \"string\",\n  \"status\": \"PENDING\",\n  \"managerApprovedAt\": \"2026-01-01T00:00:00.000Z\",\n  \"managerApprovedById\": \"string\",\n  \"hrApprovedAt\": \"2026-01-01T00:00:00.000Z\",\n  \"hrApprovedById\": \"string\",\n  \"rejectionReason\": \"string\",\n  \"appliedAt\": \"2026-01-01T00:00:00.000Z\",\n  \"createdAt\": \"2026-01-01T00:00:00.000Z\",\n  \"updatedAt\": \"2026-01-01T00:00:00.000Z\"\n}"}]},{"name":"Reject a role-change request","request":{"method":"PATCH","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/hr/role-changes/{id}/reject","host":["{{baseUrl}}"],"path":["v1","hr","role-changes",":id","reject"],"variable":[{"key":"id","value":"","description":"Path parameter: id"}]},"description":"Reject a role-change request\n\nStamps `rejectionReason` and moves the row to REJECTED. Terminal state; a fresh request is required to retry.\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `profile:write`\n**Tags:** HR","body":{"mode":"raw","raw":"{\n  \"reason\": \"string\"\n}","options":{"raw":{"language":"json"}}}},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"id\": \"rch_01HW3T...\",\n  \"employeeId\": \"string\",\n  \"requestedById\": \"string\",\n  \"newJobTitle\": \"string\",\n  \"newDepartmentId\": \"string\",\n  \"newLocationId\": \"string\",\n  \"newManagerId\": \"string\",\n  \"effectiveFrom\": \"2026-01-01\",\n  \"reason\": \"string\",\n  \"status\": \"PENDING\",\n  \"managerApprovedAt\": \"2026-01-01T00:00:00.000Z\",\n  \"managerApprovedById\": \"string\",\n  \"hrApprovedAt\": \"2026-01-01T00:00:00.000Z\",\n  \"hrApprovedById\": \"string\",\n  \"rejectionReason\": \"string\",\n  \"appliedAt\": \"2026-01-01T00:00:00.000Z\",\n  \"createdAt\": \"2026-01-01T00:00:00.000Z\",\n  \"updatedAt\": \"2026-01-01T00:00:00.000Z\"\n}"}]},{"name":"List exit interviews (admin view)","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/hr/exit-interviews","host":["{{baseUrl}}"],"path":["v1","hr","exit-interviews"],"query":[{"key":"reason","value":"","disabled":true},{"key":"fromDate","value":"","disabled":true},{"key":"toDate","value":"","disabled":true},{"key":"limit","value":"","disabled":true}]},"description":"List exit interviews (admin view)\n\nAdmin listing with optional reason + date-range filters. Returns full interview rows including structured responses.\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `profile:read`\n**Tags:** HR"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"[\n  {\n    \"id\": \"exi_01HW3T...\",\n    \"employeeId\": \"string\",\n    \"lastWorkingDay\": \"2026-01-01\",\n    \"reason\": \"VOLUNTARY\",\n    \"satisfaction\": 0,\n    \"wouldRecommend\": 0,\n    \"responses\": [\n      null\n    ],\n    \"notes\": \"string\",\n    \"conductedAt\": \"2026-01-01T00:00:00.000Z\",\n    \"conductedById\": \"string\",\n    \"createdAt\": \"2026-01-01T00:00:00.000Z\",\n    \"updatedAt\": \"2026-01-01T00:00:00.000Z\"\n  }\n]"}]},{"name":"Submit an exit interview on behalf of an employee","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/hr/exit-interviews","host":["{{baseUrl}}"],"path":["v1","hr","exit-interviews"]},"description":"Submit an exit interview on behalf of an employee\n\nAdmin variant. One interview per employee - submitting twice 409s. Use the self-service endpoint when the departing teammate wants to fill the form themselves.\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `profile:write`\n**Tags:** HR","body":{"mode":"raw","raw":"{\n  \"employeeId\": \"string\",\n  \"lastWorkingDay\": \"2026-01-01\",\n  \"reason\": \"VOLUNTARY\",\n  \"satisfaction\": 0,\n  \"wouldRecommend\": 0,\n  \"responses\": [],\n  \"notes\": \"string\"\n}","options":{"raw":{"language":"json"}}}},"response":[{"name":"Sample 201","status":"Created","code":201,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"id\": \"exi_01HW3T...\",\n  \"employeeId\": \"string\",\n  \"lastWorkingDay\": \"2026-01-01\",\n  \"reason\": \"VOLUNTARY\",\n  \"satisfaction\": 0,\n  \"wouldRecommend\": 0,\n  \"responses\": [\n    {\n      \"questionId\": null,\n      \"rating\": null,\n      \"comments\": null\n    }\n  ],\n  \"notes\": \"string\",\n  \"conductedAt\": \"2026-01-01T00:00:00.000Z\",\n  \"conductedById\": \"string\",\n  \"createdAt\": \"2026-01-01T00:00:00.000Z\",\n  \"updatedAt\": \"2026-01-01T00:00:00.000Z\"\n}"}]},{"name":"List exit interviews filed for a given employee","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/hr/exit-interviews/by-employee/{employeeId}","host":["{{baseUrl}}"],"path":["v1","hr","exit-interviews","by-employee",":employeeId"],"variable":[{"key":"employeeId","value":"","description":"Path parameter: employeeId"}]},"description":"List exit interviews filed for a given employee\n\nReturns the (at most one) interview tied to this employee. Empty array when none has been filed yet.\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `profile:read`\n**Tags:** HR"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"[\n  {\n    \"id\": \"exi_01HW3T...\",\n    \"employeeId\": \"string\",\n    \"lastWorkingDay\": \"2026-01-01\",\n    \"reason\": \"VOLUNTARY\",\n    \"satisfaction\": 0,\n    \"wouldRecommend\": 0,\n    \"responses\": [\n      null\n    ],\n    \"notes\": \"string\",\n    \"conductedAt\": \"2026-01-01T00:00:00.000Z\",\n    \"conductedById\": \"string\",\n    \"createdAt\": \"2026-01-01T00:00:00.000Z\",\n    \"updatedAt\": \"2026-01-01T00:00:00.000Z\"\n  }\n]"}]},{"name":"Submit your own exit interview","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/me/exit-interview","host":["{{baseUrl}}"],"path":["v1","me","exit-interview"]},"description":"Submit your own exit interview\n\nSelf-service variant. `employeeId` is derived from the session - never accepted from the body.\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `profile:write`\n**Tags:** HR","body":{"mode":"raw","raw":"{\n  \"lastWorkingDay\": \"2026-01-01\",\n  \"reason\": \"VOLUNTARY\",\n  \"satisfaction\": 0,\n  \"wouldRecommend\": 0,\n  \"responses\": [],\n  \"notes\": \"string\"\n}","options":{"raw":{"language":"json"}}}},"response":[{"name":"Sample 201","status":"Created","code":201,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"id\": \"exi_01HW3T...\",\n  \"employeeId\": \"string\",\n  \"lastWorkingDay\": \"2026-01-01\",\n  \"reason\": \"VOLUNTARY\",\n  \"satisfaction\": 0,\n  \"wouldRecommend\": 0,\n  \"responses\": [\n    {\n      \"questionId\": null,\n      \"rating\": null,\n      \"comments\": null\n    }\n  ],\n  \"notes\": \"string\",\n  \"conductedAt\": \"2026-01-01T00:00:00.000Z\",\n  \"conductedById\": \"string\",\n  \"createdAt\": \"2026-01-01T00:00:00.000Z\",\n  \"updatedAt\": \"2026-01-01T00:00:00.000Z\"\n}"}]},{"name":"List generated HR letters","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/hr/letters","host":["{{baseUrl}}"],"path":["v1","hr","letters"],"query":[{"key":"employeeId","value":"","disabled":true},{"key":"type","value":"","disabled":true},{"key":"limit","value":"","disabled":true}]},"description":"List generated HR letters\n\nReturns letters in descending generation order. Optionally filter by employee or letter type.\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `profile:read`\n**Tags:** HR"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"[\n  {\n    \"id\": \"hrl_01HW3T...\",\n    \"employeeId\": \"string\",\n    \"type\": \"OFFER\",\n    \"generatedAt\": \"2026-01-01T00:00:00.000Z\",\n    \"generatedById\": \"string\",\n    \"revoked\": false,\n    \"variables\": {\n      \"jobTitle\": null,\n      \"department\": null,\n      \"location\": null,\n      \"reportingManager\": null,\n      \"startDate\": null,\n      \"joiningDate\": null,\n      \"lastWorkingDay\": null,\n      \"effectiveDate\": null,\n      \"employeeNumber\": null,\n      \"annualCtc\": null,\n      \"monthlyCtc\": null,\n      \"oldAnnualCtc\": null,\n      \"newAnnualCtc\": null,\n      \"currency\": null,\n      \"designations\": null,\n      \"reason\": null,\n      \"terms\": null,\n      \"companyName\": null,\n      \"companyAddress\": null\n    }\n  }\n]"}]},{"name":"Generate an HR letter (offer, relieving, employment, etc.)","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/hr/letters","host":["{{baseUrl}}"],"path":["v1","hr","letters"]},"description":"Generate an HR letter (offer, relieving, employment, etc.)\n\nRenders a deterministic PDF body, persists the rendered text + variables for audit, and returns the letter envelope. Fetch the PDF blob via `/v1/hr/letters/{id}/pdf`.\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `profile:write`\n**Tags:** HR","body":{"mode":"raw","raw":"{\n  \"employeeId\": \"string\",\n  \"type\": \"OFFER\",\n  \"variables\": {\n    \"jobTitle\": \"string\",\n    \"department\": \"string\",\n    \"location\": \"string\",\n    \"reportingManager\": \"string\",\n    \"startDate\": \"string\",\n    \"joiningDate\": \"string\",\n    \"lastWorkingDay\": \"string\",\n    \"effectiveDate\": \"string\",\n    \"employeeNumber\": \"string\",\n    \"annualCtc\": 0,\n    \"monthlyCtc\": 0,\n    \"oldAnnualCtc\": 0,\n    \"newAnnualCtc\": 0,\n    \"currency\": \"INR\",\n    \"designations\": [\n      null\n    ],\n    \"reason\": \"string\",\n    \"terms\": [\n      null\n    ],\n    \"companyName\": \"string\",\n    \"companyAddress\": \"string\"\n  }\n}","options":{"raw":{"language":"json"}}}},"response":[{"name":"Sample 201","status":"Created","code":201,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"id\": \"hrl_01HW3T...\",\n  \"employeeId\": \"string\",\n  \"type\": \"OFFER\",\n  \"generatedAt\": \"2026-01-01T00:00:00.000Z\",\n  \"generatedById\": \"string\",\n  \"revoked\": false,\n  \"variables\": {\n    \"jobTitle\": \"string\",\n    \"department\": \"string\",\n    \"location\": \"string\",\n    \"reportingManager\": \"string\",\n    \"startDate\": \"string\",\n    \"joiningDate\": \"string\",\n    \"lastWorkingDay\": \"string\",\n    \"effectiveDate\": \"string\",\n    \"employeeNumber\": \"string\",\n    \"annualCtc\": 0,\n    \"monthlyCtc\": 0,\n    \"oldAnnualCtc\": 0,\n    \"newAnnualCtc\": 0,\n    \"currency\": \"INR\",\n    \"designations\": [\n      null\n    ],\n    \"reason\": \"string\",\n    \"terms\": [\n      null\n    ],\n    \"companyName\": \"string\",\n    \"companyAddress\": \"string\"\n  }\n}"}]},{"name":"Download a generated HR letter as PDF","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/hr/letters/{id}/pdf","host":["{{baseUrl}}"],"path":["v1","hr","letters",":id","pdf"],"variable":[{"key":"id","value":"","description":"Path parameter: id"}]},"description":"Download a generated HR letter as PDF\n\nReturns the rendered PDF blob. 404 if the letter was revoked or belongs to a different tenant.\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `profile:read`\n**Tags:** HR"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","body":""}]},{"name":"Revoke a previously generated HR letter","request":{"method":"PATCH","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/hr/letters/{id}/revoke","host":["{{baseUrl}}"],"path":["v1","hr","letters",":id","revoke"],"variable":[{"key":"id","value":"","description":"Path parameter: id"}]},"description":"Revoke a previously generated HR letter\n\nSets `revoked: true`. The row is preserved for audit but the PDF endpoint returns 404 thereafter.\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `profile:write`\n**Tags:** HR"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"id\": \"hrl_01HW3T...\",\n  \"employeeId\": \"string\",\n  \"type\": \"OFFER\",\n  \"generatedAt\": \"2026-01-01T00:00:00.000Z\",\n  \"generatedById\": \"string\",\n  \"revoked\": false,\n  \"variables\": {\n    \"jobTitle\": \"string\",\n    \"department\": \"string\",\n    \"location\": \"string\",\n    \"reportingManager\": \"string\",\n    \"startDate\": \"string\",\n    \"joiningDate\": \"string\",\n    \"lastWorkingDay\": \"string\",\n    \"effectiveDate\": \"string\",\n    \"employeeNumber\": \"string\",\n    \"annualCtc\": 0,\n    \"monthlyCtc\": 0,\n    \"oldAnnualCtc\": 0,\n    \"newAnnualCtc\": 0,\n    \"currency\": \"INR\",\n    \"designations\": [\n      null\n    ],\n    \"reason\": \"string\",\n    \"terms\": [\n      null\n    ],\n    \"companyName\": \"string\",\n    \"companyAddress\": \"string\"\n  }\n}"}]},{"name":"Read current headcount snapshot","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/hr/reports/headcount","host":["{{baseUrl}}"],"path":["v1","hr","reports","headcount"]},"description":"Read current headcount snapshot\n\nAggregate employee count optionally split by department and location. Computed on read; no caching.\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `profile:read`\n**Tags:** HR"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"total\": 142,\n  \"asOf\": \"2026-01-01T00:00:00.000Z\",\n  \"byDepartment\": [\n    {\n      \"departmentId\": \"string\",\n      \"departmentName\": \"string\",\n      \"count\": 0\n    }\n  ],\n  \"byLocation\": [\n    {\n      \"locationId\": \"string\",\n      \"locationName\": \"string\",\n      \"count\": 0\n    }\n  ]\n}"}]},{"name":"Read headcount over time (monthly buckets)","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/hr/reports/headcount/timeseries","host":["{{baseUrl}}"],"path":["v1","hr","reports","headcount","timeseries"],"query":[{"key":"months","value":"","disabled":true}]},"description":"Read headcount over time (monthly buckets)\n\nReturns a count per month for the most-recent `months` window (default 12, capped at 60).\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `profile:read`\n**Tags:** HR"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"points\": [\n    {\n      \"month\": \"2026-01\",\n      \"count\": 0\n    }\n  ]\n}"}]},{"name":"Read turnover rate over a window","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/hr/reports/turnover","host":["{{baseUrl}}"],"path":["v1","hr","reports","turnover"],"query":[{"key":"fromDate","value":"","disabled":true},{"key":"toDate","value":"","disabled":true}]},"description":"Read turnover rate over a window\n\nVoluntary + involuntary terminations divided by average headcount over the window. Returns the decimal rate (0.12 = 12%).\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `profile:read`\n**Tags:** HR"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"fromDate\": \"2026-01-01\",\n  \"toDate\": \"2026-01-01\",\n  \"rate\": 0,\n  \"terminations\": 0,\n  \"averageHeadcount\": 0\n}"}]},{"name":"Read leave utilization for a calendar year","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/hr/reports/leave-utilization","host":["{{baseUrl}}"],"path":["v1","hr","reports","leave-utilization"],"query":[{"key":"year","value":"","disabled":true}]},"description":"Read leave utilization for a calendar year\n\nPer leave-type allocated vs used for the chosen calendar year (defaults to current).\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `profile:read`\n**Tags:** HR"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"year\": 0,\n  \"rows\": [\n    {\n      \"leaveType\": \"string\",\n      \"allocated\": 0,\n      \"used\": 0,\n      \"utilizationRate\": 0\n    }\n  ]\n}"}]},{"name":"List HR tickets (admin view)","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/hr/tickets","host":["{{baseUrl}}"],"path":["v1","hr","tickets"],"query":[{"key":"status","value":"","disabled":true},{"key":"category","value":"","disabled":true},{"key":"priority","value":"","disabled":true},{"key":"employeeId","value":"","disabled":true},{"key":"assignedToId","value":"","disabled":true},{"key":"limit","value":"","disabled":true}]},"description":"List HR tickets (admin view)\n\nAdmin-only listing. Supports filtering by status, category, priority, employee, and assignee. Returns the same `HrTicket` shape as the per-id read; messages are included so the inbox view never needs a per-row fetch.\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `profile:read`\n**Tags:** HR"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"[\n  {\n    \"id\": \"hrt_01HW3T...\",\n    \"employeeId\": \"emp_01HW3T...\",\n    \"category\": \"LEAVE\",\n    \"subject\": \"string\",\n    \"body\": \"string\",\n    \"status\": \"OPEN\",\n    \"priority\": \"LOW\",\n    \"assignedToId\": \"string\",\n    \"resolvedAt\": \"2026-01-01T00:00:00.000Z\",\n    \"closedAt\": \"2026-01-01T00:00:00.000Z\",\n    \"satisfactionRating\": 0,\n    \"messages\": [\n      null\n    ],\n    \"createdAt\": \"2026-01-01T00:00:00.000Z\",\n    \"updatedAt\": \"2026-01-01T00:00:00.000Z\"\n  }\n]"}]},{"name":"Read a single HR ticket (admin view)","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/hr/tickets/{id}","host":["{{baseUrl}}"],"path":["v1","hr","tickets",":id"],"variable":[{"key":"id","value":"","description":"Path parameter: id"}]},"description":"Read a single HR ticket (admin view)\n\nReturns the full `HrTicket` including all messages (both public and internal notes). 404 if outside the tenant.\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `profile:read`\n**Tags:** HR"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"id\": \"hrt_01HW3T...\",\n  \"employeeId\": \"emp_01HW3T...\",\n  \"category\": \"LEAVE\",\n  \"subject\": \"string\",\n  \"body\": \"string\",\n  \"status\": \"OPEN\",\n  \"priority\": \"LOW\",\n  \"assignedToId\": \"string\",\n  \"resolvedAt\": \"2026-01-01T00:00:00.000Z\",\n  \"closedAt\": \"2026-01-01T00:00:00.000Z\",\n  \"satisfactionRating\": 0,\n  \"messages\": [\n    {\n      \"id\": null,\n      \"ticketId\": null,\n      \"authorId\": null,\n      \"body\": null,\n      \"isInternalNote\": null,\n      \"createdAt\": null\n    }\n  ],\n  \"createdAt\": \"2026-01-01T00:00:00.000Z\",\n  \"updatedAt\": \"2026-01-01T00:00:00.000Z\"\n}"}]},{"name":"Assign an HR ticket to an HR agent","request":{"method":"PATCH","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/hr/tickets/{id}/assign","host":["{{baseUrl}}"],"path":["v1","hr","tickets",":id","assign"],"variable":[{"key":"id","value":"","description":"Path parameter: id"}]},"description":"Assign an HR ticket to an HR agent\n\nSet `assignedToId` to the HR user id, or `null` to unassign.\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `profile:write`\n**Tags:** HR","body":{"mode":"raw","raw":"{\n  \"assignedToId\": \"usr_01HW3T...\"\n}","options":{"raw":{"language":"json"}}}},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"id\": \"hrt_01HW3T...\",\n  \"employeeId\": \"emp_01HW3T...\",\n  \"category\": \"LEAVE\",\n  \"subject\": \"string\",\n  \"body\": \"string\",\n  \"status\": \"OPEN\",\n  \"priority\": \"LOW\",\n  \"assignedToId\": \"string\",\n  \"resolvedAt\": \"2026-01-01T00:00:00.000Z\",\n  \"closedAt\": \"2026-01-01T00:00:00.000Z\",\n  \"satisfactionRating\": 0,\n  \"messages\": [\n    {\n      \"id\": null,\n      \"ticketId\": null,\n      \"authorId\": null,\n      \"body\": null,\n      \"isInternalNote\": null,\n      \"createdAt\": null\n    }\n  ],\n  \"createdAt\": \"2026-01-01T00:00:00.000Z\",\n  \"updatedAt\": \"2026-01-01T00:00:00.000Z\"\n}"}]},{"name":"Change ticket priority","request":{"method":"PATCH","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/hr/tickets/{id}/priority","host":["{{baseUrl}}"],"path":["v1","hr","tickets",":id","priority"],"variable":[{"key":"id","value":"","description":"Path parameter: id"}]},"description":"Change ticket priority\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `profile:write`\n**Tags:** HR","body":{"mode":"raw","raw":"{\n  \"priority\": \"LOW\"\n}","options":{"raw":{"language":"json"}}}},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"id\": \"hrt_01HW3T...\",\n  \"employeeId\": \"emp_01HW3T...\",\n  \"category\": \"LEAVE\",\n  \"subject\": \"string\",\n  \"body\": \"string\",\n  \"status\": \"OPEN\",\n  \"priority\": \"LOW\",\n  \"assignedToId\": \"string\",\n  \"resolvedAt\": \"2026-01-01T00:00:00.000Z\",\n  \"closedAt\": \"2026-01-01T00:00:00.000Z\",\n  \"satisfactionRating\": 0,\n  \"messages\": [\n    {\n      \"id\": null,\n      \"ticketId\": null,\n      \"authorId\": null,\n      \"body\": null,\n      \"isInternalNote\": null,\n      \"createdAt\": null\n    }\n  ],\n  \"createdAt\": \"2026-01-01T00:00:00.000Z\",\n  \"updatedAt\": \"2026-01-01T00:00:00.000Z\"\n}"}]},{"name":"Change ticket status","request":{"method":"PATCH","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/hr/tickets/{id}/status","host":["{{baseUrl}}"],"path":["v1","hr","tickets",":id","status"],"variable":[{"key":"id","value":"","description":"Path parameter: id"}]},"description":"Change ticket status\n\nUse `/resolve` and `/close` for the terminal states - those endpoints also stamp `resolvedAt` / `closedAt`.\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `profile:write`\n**Tags:** HR","body":{"mode":"raw","raw":"{\n  \"status\": \"OPEN\"\n}","options":{"raw":{"language":"json"}}}},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"id\": \"hrt_01HW3T...\",\n  \"employeeId\": \"emp_01HW3T...\",\n  \"category\": \"LEAVE\",\n  \"subject\": \"string\",\n  \"body\": \"string\",\n  \"status\": \"OPEN\",\n  \"priority\": \"LOW\",\n  \"assignedToId\": \"string\",\n  \"resolvedAt\": \"2026-01-01T00:00:00.000Z\",\n  \"closedAt\": \"2026-01-01T00:00:00.000Z\",\n  \"satisfactionRating\": 0,\n  \"messages\": [\n    {\n      \"id\": null,\n      \"ticketId\": null,\n      \"authorId\": null,\n      \"body\": null,\n      \"isInternalNote\": null,\n      \"createdAt\": null\n    }\n  ],\n  \"createdAt\": \"2026-01-01T00:00:00.000Z\",\n  \"updatedAt\": \"2026-01-01T00:00:00.000Z\"\n}"}]},{"name":"Post a message (or internal note) on an HR ticket","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/hr/tickets/{id}/messages","host":["{{baseUrl}}"],"path":["v1","hr","tickets",":id","messages"],"variable":[{"key":"id","value":"","description":"Path parameter: id"}]},"description":"Post a message (or internal note) on an HR ticket\n\nWhen `isInternalNote: true` the message stays HR-only and never appears on the employee timeline. Available on the admin surface only.\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `profile:write`\n**Tags:** HR","body":{"mode":"raw","raw":"{\n  \"body\": \"string\",\n  \"isInternalNote\": false\n}","options":{"raw":{"language":"json"}}}},"response":[{"name":"Sample 201","status":"Created","code":201,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"id\": \"hrm_01HW3T...\",\n  \"ticketId\": \"hrt_01HW3T...\",\n  \"authorId\": \"string\",\n  \"body\": \"string\",\n  \"isInternalNote\": false,\n  \"createdAt\": \"2026-01-01T00:00:00.000Z\"\n}"}]},{"name":"Mark an HR ticket resolved","request":{"method":"PATCH","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/hr/tickets/{id}/resolve","host":["{{baseUrl}}"],"path":["v1","hr","tickets",":id","resolve"],"variable":[{"key":"id","value":"","description":"Path parameter: id"}]},"description":"Mark an HR ticket resolved\n\nSets `status: RESOLVED` and stamps `resolvedAt`. The employee can still reopen by posting another message within the cooldown.\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `profile:write`\n**Tags:** HR"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"id\": \"hrt_01HW3T...\",\n  \"employeeId\": \"emp_01HW3T...\",\n  \"category\": \"LEAVE\",\n  \"subject\": \"string\",\n  \"body\": \"string\",\n  \"status\": \"OPEN\",\n  \"priority\": \"LOW\",\n  \"assignedToId\": \"string\",\n  \"resolvedAt\": \"2026-01-01T00:00:00.000Z\",\n  \"closedAt\": \"2026-01-01T00:00:00.000Z\",\n  \"satisfactionRating\": 0,\n  \"messages\": [\n    {\n      \"id\": null,\n      \"ticketId\": null,\n      \"authorId\": null,\n      \"body\": null,\n      \"isInternalNote\": null,\n      \"createdAt\": null\n    }\n  ],\n  \"createdAt\": \"2026-01-01T00:00:00.000Z\",\n  \"updatedAt\": \"2026-01-01T00:00:00.000Z\"\n}"}]},{"name":"Close an HR ticket","request":{"method":"PATCH","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/hr/tickets/{id}/close","host":["{{baseUrl}}"],"path":["v1","hr","tickets",":id","close"],"variable":[{"key":"id","value":"","description":"Path parameter: id"}]},"description":"Close an HR ticket\n\nTerminal state. Sets `status: CLOSED` and stamps `closedAt`. The employee can no longer reopen; a brand-new ticket is required.\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `profile:write`\n**Tags:** HR"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"id\": \"hrt_01HW3T...\",\n  \"employeeId\": \"emp_01HW3T...\",\n  \"category\": \"LEAVE\",\n  \"subject\": \"string\",\n  \"body\": \"string\",\n  \"status\": \"OPEN\",\n  \"priority\": \"LOW\",\n  \"assignedToId\": \"string\",\n  \"resolvedAt\": \"2026-01-01T00:00:00.000Z\",\n  \"closedAt\": \"2026-01-01T00:00:00.000Z\",\n  \"satisfactionRating\": 0,\n  \"messages\": [\n    {\n      \"id\": null,\n      \"ticketId\": null,\n      \"authorId\": null,\n      \"body\": null,\n      \"isInternalNote\": null,\n      \"createdAt\": null\n    }\n  ],\n  \"createdAt\": \"2026-01-01T00:00:00.000Z\",\n  \"updatedAt\": \"2026-01-01T00:00:00.000Z\"\n}"}]},{"name":"List the calling user's HR tickets","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/me/tickets","host":["{{baseUrl}}"],"path":["v1","me","tickets"]},"description":"List the calling user's HR tickets\n\nReturns only the calling user's own tickets. Internal HR notes are stripped from the returned `messages`.\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `profile:read`\n**Tags:** HR"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"[\n  {\n    \"id\": \"hrt_01HW3T...\",\n    \"employeeId\": \"emp_01HW3T...\",\n    \"category\": \"LEAVE\",\n    \"subject\": \"string\",\n    \"body\": \"string\",\n    \"status\": \"OPEN\",\n    \"priority\": \"LOW\",\n    \"assignedToId\": \"string\",\n    \"resolvedAt\": \"2026-01-01T00:00:00.000Z\",\n    \"closedAt\": \"2026-01-01T00:00:00.000Z\",\n    \"satisfactionRating\": 0,\n    \"messages\": [\n      null\n    ],\n    \"createdAt\": \"2026-01-01T00:00:00.000Z\",\n    \"updatedAt\": \"2026-01-01T00:00:00.000Z\"\n  }\n]"}]},{"name":"Open a new HR ticket as the calling user","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/me/tickets","host":["{{baseUrl}}"],"path":["v1","me","tickets"]},"description":"Open a new HR ticket as the calling user\n\nSelf-service create. `employeeId` is derived from the session - never accepted from the body.\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `profile:write`\n**Tags:** HR","body":{"mode":"raw","raw":"{\n  \"category\": \"LEAVE\",\n  \"subject\": \"Leave balance looks wrong\",\n  \"body\": \"My casual leave is showing 4 days; I only used 1 day this quarter.\",\n  \"priority\": \"LOW\"\n}","options":{"raw":{"language":"json"}}}},"response":[{"name":"Sample 201","status":"Created","code":201,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"id\": \"hrt_01HW3T...\",\n  \"employeeId\": \"emp_01HW3T...\",\n  \"category\": \"LEAVE\",\n  \"subject\": \"string\",\n  \"body\": \"string\",\n  \"status\": \"OPEN\",\n  \"priority\": \"LOW\",\n  \"assignedToId\": \"string\",\n  \"resolvedAt\": \"2026-01-01T00:00:00.000Z\",\n  \"closedAt\": \"2026-01-01T00:00:00.000Z\",\n  \"satisfactionRating\": 0,\n  \"messages\": [\n    {\n      \"id\": null,\n      \"ticketId\": null,\n      \"authorId\": null,\n      \"body\": null,\n      \"isInternalNote\": null,\n      \"createdAt\": null\n    }\n  ],\n  \"createdAt\": \"2026-01-01T00:00:00.000Z\",\n  \"updatedAt\": \"2026-01-01T00:00:00.000Z\"\n}"}]},{"name":"Read one of the calling user's HR tickets","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/me/tickets/{id}","host":["{{baseUrl}}"],"path":["v1","me","tickets",":id"],"variable":[{"key":"id","value":"","description":"Path parameter: id"}]},"description":"Read one of the calling user's HR tickets\n\n404 if the ticket belongs to another employee.\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `profile:read`\n**Tags:** HR"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"id\": \"hrt_01HW3T...\",\n  \"employeeId\": \"emp_01HW3T...\",\n  \"category\": \"LEAVE\",\n  \"subject\": \"string\",\n  \"body\": \"string\",\n  \"status\": \"OPEN\",\n  \"priority\": \"LOW\",\n  \"assignedToId\": \"string\",\n  \"resolvedAt\": \"2026-01-01T00:00:00.000Z\",\n  \"closedAt\": \"2026-01-01T00:00:00.000Z\",\n  \"satisfactionRating\": 0,\n  \"messages\": [\n    {\n      \"id\": null,\n      \"ticketId\": null,\n      \"authorId\": null,\n      \"body\": null,\n      \"isInternalNote\": null,\n      \"createdAt\": null\n    }\n  ],\n  \"createdAt\": \"2026-01-01T00:00:00.000Z\",\n  \"updatedAt\": \"2026-01-01T00:00:00.000Z\"\n}"}]},{"name":"Post a public message on the calling user's ticket","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/me/tickets/{id}/messages","host":["{{baseUrl}}"],"path":["v1","me","tickets",":id","messages"],"variable":[{"key":"id","value":"","description":"Path parameter: id"}]},"description":"Post a public message on the calling user's ticket\n\nSelf-service variant - cannot set `isInternalNote` and always posts a public message visible to HR.\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `profile:write`\n**Tags:** HR","body":{"mode":"raw","raw":"{\n  \"body\": \"string\"\n}","options":{"raw":{"language":"json"}}}},"response":[{"name":"Sample 201","status":"Created","code":201,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"id\": \"hrm_01HW3T...\",\n  \"ticketId\": \"hrt_01HW3T...\",\n  \"authorId\": \"string\",\n  \"body\": \"string\",\n  \"isInternalNote\": false,\n  \"createdAt\": \"2026-01-01T00:00:00.000Z\"\n}"}]},{"name":"Rate the resolution of a personal HR ticket","request":{"method":"PATCH","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/me/tickets/{id}/rate","host":["{{baseUrl}}"],"path":["v1","me","tickets",":id","rate"],"variable":[{"key":"id","value":"","description":"Path parameter: id"}]},"description":"Rate the resolution of a personal HR ticket\n\nCSAT. Accepts an integer 1-5; can only be set once the ticket is RESOLVED or CLOSED.\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `profile:write`\n**Tags:** HR","body":{"mode":"raw","raw":"{\n  \"satisfactionRating\": 5\n}","options":{"raw":{"language":"json"}}}},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"id\": \"hrt_01HW3T...\",\n  \"employeeId\": \"emp_01HW3T...\",\n  \"category\": \"LEAVE\",\n  \"subject\": \"string\",\n  \"body\": \"string\",\n  \"status\": \"OPEN\",\n  \"priority\": \"LOW\",\n  \"assignedToId\": \"string\",\n  \"resolvedAt\": \"2026-01-01T00:00:00.000Z\",\n  \"closedAt\": \"2026-01-01T00:00:00.000Z\",\n  \"satisfactionRating\": 0,\n  \"messages\": [\n    {\n      \"id\": null,\n      \"ticketId\": null,\n      \"authorId\": null,\n      \"body\": null,\n      \"isInternalNote\": null,\n      \"createdAt\": null\n    }\n  ],\n  \"createdAt\": \"2026-01-01T00:00:00.000Z\",\n  \"updatedAt\": \"2026-01-01T00:00:00.000Z\"\n}"}]},{"name":"List HR policies (admin view)","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/hr/policies","host":["{{baseUrl}}"],"path":["v1","hr","policies"],"query":[{"key":"category","value":"","disabled":true},{"key":"includeSuperseded","value":"","disabled":true}]},"description":"List HR policies (admin view)\n\nAdmin listing. Optionally include superseded (retired) policies; the self-service surface filters them out automatically.\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `profile:read`\n**Tags:** HR"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"[\n  {\n    \"id\": \"pol_01HW3T...\",\n    \"slug\": \"code-of-conduct\",\n    \"title\": \"Code of Conduct\",\n    \"category\": \"Conduct\",\n    \"version\": 0,\n    \"body\": \"string\",\n    \"requiresAcknowledgement\": false,\n    \"effectiveFrom\": \"2026-01-01\",\n    \"supersededAt\": \"2026-01-01T00:00:00.000Z\",\n    \"supersededByPolicyId\": \"string\",\n    \"createdAt\": \"2026-01-01T00:00:00.000Z\",\n    \"updatedAt\": \"2026-01-01T00:00:00.000Z\"\n  }\n]"}]},{"name":"Create an HR policy","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/hr/policies","host":["{{baseUrl}}"],"path":["v1","hr","policies"]},"description":"Create an HR policy\n\nSlug is per-tenant unique and stable forever (URL identity). Subsequent edits bump `version`.\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `profile:write`\n**Tags:** HR","body":{"mode":"raw","raw":"{\n  \"slug\": \"remote-work\",\n  \"title\": \"Remote Work Policy\",\n  \"category\": \"Workplace\",\n  \"body\": \"string\",\n  \"requiresAcknowledgement\": false,\n  \"effectiveFrom\": \"2026-04-01\"\n}","options":{"raw":{"language":"json"}}}},"response":[{"name":"Sample 201","status":"Created","code":201,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"id\": \"pol_01HW3T...\",\n  \"slug\": \"code-of-conduct\",\n  \"title\": \"Code of Conduct\",\n  \"category\": \"Conduct\",\n  \"version\": 0,\n  \"body\": \"string\",\n  \"requiresAcknowledgement\": false,\n  \"effectiveFrom\": \"2026-01-01\",\n  \"supersededAt\": \"2026-01-01T00:00:00.000Z\",\n  \"supersededByPolicyId\": \"string\",\n  \"createdAt\": \"2026-01-01T00:00:00.000Z\",\n  \"updatedAt\": \"2026-01-01T00:00:00.000Z\"\n}"}]},{"name":"Read an HR policy by slug","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/hr/policies/{slug}","host":["{{baseUrl}}"],"path":["v1","hr","policies",":slug"],"variable":[{"key":"slug","value":"","description":"Path parameter: slug"}]},"description":"Read an HR policy by slug\n\nAdmin lookup by stable slug. Returns the latest version regardless of supersession state.\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `profile:read`\n**Tags:** HR"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"id\": \"pol_01HW3T...\",\n  \"slug\": \"code-of-conduct\",\n  \"title\": \"Code of Conduct\",\n  \"category\": \"Conduct\",\n  \"version\": 0,\n  \"body\": \"string\",\n  \"requiresAcknowledgement\": false,\n  \"effectiveFrom\": \"2026-01-01\",\n  \"supersededAt\": \"2026-01-01T00:00:00.000Z\",\n  \"supersededByPolicyId\": \"string\",\n  \"createdAt\": \"2026-01-01T00:00:00.000Z\",\n  \"updatedAt\": \"2026-01-01T00:00:00.000Z\"\n}"}]},{"name":"Update an HR policy","request":{"method":"PATCH","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/hr/policies/{id}","host":["{{baseUrl}}"],"path":["v1","hr","policies",":id"],"variable":[{"key":"id","value":"","description":"Path parameter: id"}]},"description":"Update an HR policy\n\nPartial update; any non-empty field set bumps `version` and invalidates prior acknowledgements (employees are re-asked).\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `profile:write`\n**Tags:** HR","body":{"mode":"raw","raw":"{\n  \"title\": \"string\",\n  \"category\": \"string\",\n  \"body\": \"string\",\n  \"requiresAcknowledgement\": false,\n  \"effectiveFrom\": \"2026-01-01\"\n}","options":{"raw":{"language":"json"}}}},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"id\": \"pol_01HW3T...\",\n  \"slug\": \"code-of-conduct\",\n  \"title\": \"Code of Conduct\",\n  \"category\": \"Conduct\",\n  \"version\": 0,\n  \"body\": \"string\",\n  \"requiresAcknowledgement\": false,\n  \"effectiveFrom\": \"2026-01-01\",\n  \"supersededAt\": \"2026-01-01T00:00:00.000Z\",\n  \"supersededByPolicyId\": \"string\",\n  \"createdAt\": \"2026-01-01T00:00:00.000Z\",\n  \"updatedAt\": \"2026-01-01T00:00:00.000Z\"\n}"}]},{"name":"Mark an HR policy as superseded by a new version","request":{"method":"PATCH","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/hr/policies/{id}/supersede","host":["{{baseUrl}}"],"path":["v1","hr","policies",":id","supersede"],"variable":[{"key":"id","value":"","description":"Path parameter: id"}]},"description":"Mark an HR policy as superseded by a new version\n\nRetires the policy. Pass `supersededByPolicyId` to point at a replacement so callers can walk the chain; omit to sunset with no successor.\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `profile:write`\n**Tags:** HR","body":{"mode":"raw","raw":"{\n  \"supersededByPolicyId\": \"string\"\n}","options":{"raw":{"language":"json"}}}},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"id\": \"pol_01HW3T...\",\n  \"slug\": \"code-of-conduct\",\n  \"title\": \"Code of Conduct\",\n  \"category\": \"Conduct\",\n  \"version\": 0,\n  \"body\": \"string\",\n  \"requiresAcknowledgement\": false,\n  \"effectiveFrom\": \"2026-01-01\",\n  \"supersededAt\": \"2026-01-01T00:00:00.000Z\",\n  \"supersededByPolicyId\": \"string\",\n  \"createdAt\": \"2026-01-01T00:00:00.000Z\",\n  \"updatedAt\": \"2026-01-01T00:00:00.000Z\"\n}"}]},{"name":"List acknowledgement records for an HR policy","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/hr/policies/{id}/acknowledgements","host":["{{baseUrl}}"],"path":["v1","hr","policies",":id","acknowledgements"],"variable":[{"key":"id","value":"","description":"Path parameter: id"}]},"description":"List acknowledgement records for an HR policy\n\nAudit trail showing which employees acknowledged which version, with IP + user agent for compliance.\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `profile:read`\n**Tags:** HR"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"[\n  {\n    \"id\": \"ack_01HW3T...\",\n    \"policyId\": \"string\",\n    \"policyVersion\": 0,\n    \"employeeId\": \"string\",\n    \"acknowledgedAt\": \"2026-01-01T00:00:00.000Z\",\n    \"ipAddress\": \"string\",\n    \"userAgent\": \"string\"\n  }\n]"}]},{"name":"List active HR policies for the calling user","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/me/policies","host":["{{baseUrl}}"],"path":["v1","me","policies"]},"description":"List active HR policies for the calling user\n\nSelf-service surface. Hides superseded policies automatically.\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `profile:read`\n**Tags:** HR"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"[\n  {\n    \"id\": \"pol_01HW3T...\",\n    \"slug\": \"code-of-conduct\",\n    \"title\": \"Code of Conduct\",\n    \"category\": \"Conduct\",\n    \"version\": 0,\n    \"body\": \"string\",\n    \"requiresAcknowledgement\": false,\n    \"effectiveFrom\": \"2026-01-01\",\n    \"supersededAt\": \"2026-01-01T00:00:00.000Z\",\n    \"supersededByPolicyId\": \"string\",\n    \"createdAt\": \"2026-01-01T00:00:00.000Z\",\n    \"updatedAt\": \"2026-01-01T00:00:00.000Z\"\n  }\n]"}]},{"name":"Read an active HR policy by slug","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/me/policies/{slug}","host":["{{baseUrl}}"],"path":["v1","me","policies",":slug"],"variable":[{"key":"slug","value":"","description":"Path parameter: slug"}]},"description":"Read an active HR policy by slug\n\n404 if the policy is superseded or not yet effective. Use the admin endpoint to inspect retired policies.\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `profile:read`\n**Tags:** HR"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"id\": \"pol_01HW3T...\",\n  \"slug\": \"code-of-conduct\",\n  \"title\": \"Code of Conduct\",\n  \"category\": \"Conduct\",\n  \"version\": 0,\n  \"body\": \"string\",\n  \"requiresAcknowledgement\": false,\n  \"effectiveFrom\": \"2026-01-01\",\n  \"supersededAt\": \"2026-01-01T00:00:00.000Z\",\n  \"supersededByPolicyId\": \"string\",\n  \"createdAt\": \"2026-01-01T00:00:00.000Z\",\n  \"updatedAt\": \"2026-01-01T00:00:00.000Z\"\n}"}]},{"name":"Acknowledge an HR policy","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/me/policies/{id}/acknowledge","host":["{{baseUrl}}"],"path":["v1","me","policies",":id","acknowledge"],"variable":[{"key":"id","value":"","description":"Path parameter: id"}]},"description":"Acknowledge an HR policy\n\nOptional `policyVersion` pins the version the employee actually read - prevents a race where HR bumped the policy after the employee opened it.\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `profile:write`\n**Tags:** HR","body":{"mode":"raw","raw":"{\n  \"policyVersion\": 0\n}","options":{"raw":{"language":"json"}}}},"response":[{"name":"Sample 201","status":"Created","code":201,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"id\": \"ack_01HW3T...\",\n  \"policyId\": \"string\",\n  \"policyVersion\": 0,\n  \"employeeId\": \"string\",\n  \"acknowledgedAt\": \"2026-01-01T00:00:00.000Z\",\n  \"ipAddress\": \"string\",\n  \"userAgent\": \"string\"\n}"}]},{"name":"List probation records","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/hr/probations","host":["{{baseUrl}}"],"path":["v1","hr","probations"],"query":[{"key":"status","value":"","disabled":true},{"key":"employeeId","value":"","disabled":true}]},"description":"List probation records\n\nFilter by status or employee. Returns full `Probation` rows so the inbox view can render without per-row fetches.\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `profile:read`\n**Tags:** HR"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"[\n  {\n    \"id\": \"prb_01HW3T...\",\n    \"employeeId\": \"string\",\n    \"startDate\": \"2026-01-15\",\n    \"endDate\": \"2026-04-15\",\n    \"status\": \"PENDING\",\n    \"confirmedAt\": \"2026-01-01T00:00:00.000Z\",\n    \"confirmedById\": \"string\",\n    \"extendedToDate\": \"2026-01-01\",\n    \"terminationReason\": \"string\",\n    \"notes\": \"string\",\n    \"createdAt\": \"2026-01-01T00:00:00.000Z\",\n    \"updatedAt\": \"2026-01-01T00:00:00.000Z\"\n  }\n]"}]},{"name":"Initiate a probation period for an employee","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/hr/probations","host":["{{baseUrl}}"],"path":["v1","hr","probations"]},"description":"Initiate a probation period for an employee\n\nOpens a PENDING probation. `endDate` is the scheduled review date; extend or confirm before it lapses.\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `profile:write`\n**Tags:** HR","body":{"mode":"raw","raw":"{\n  \"employeeId\": \"string\",\n  \"startDate\": \"2026-01-15\",\n  \"endDate\": \"2026-04-15\",\n  \"notes\": \"string\"\n}","options":{"raw":{"language":"json"}}}},"response":[{"name":"Sample 201","status":"Created","code":201,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"id\": \"prb_01HW3T...\",\n  \"employeeId\": \"string\",\n  \"startDate\": \"2026-01-15\",\n  \"endDate\": \"2026-04-15\",\n  \"status\": \"PENDING\",\n  \"confirmedAt\": \"2026-01-01T00:00:00.000Z\",\n  \"confirmedById\": \"string\",\n  \"extendedToDate\": \"2026-01-01\",\n  \"terminationReason\": \"string\",\n  \"notes\": \"string\",\n  \"createdAt\": \"2026-01-01T00:00:00.000Z\",\n  \"updatedAt\": \"2026-01-01T00:00:00.000Z\"\n}"}]},{"name":"Read one probation record","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/hr/probations/{id}","host":["{{baseUrl}}"],"path":["v1","hr","probations",":id"],"variable":[{"key":"id","value":"","description":"Path parameter: id"}]},"description":"Read one probation record\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `profile:read`\n**Tags:** HR"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"id\": \"prb_01HW3T...\",\n  \"employeeId\": \"string\",\n  \"startDate\": \"2026-01-15\",\n  \"endDate\": \"2026-04-15\",\n  \"status\": \"PENDING\",\n  \"confirmedAt\": \"2026-01-01T00:00:00.000Z\",\n  \"confirmedById\": \"string\",\n  \"extendedToDate\": \"2026-01-01\",\n  \"terminationReason\": \"string\",\n  \"notes\": \"string\",\n  \"createdAt\": \"2026-01-01T00:00:00.000Z\",\n  \"updatedAt\": \"2026-01-01T00:00:00.000Z\"\n}"}]},{"name":"Confirm successful completion of a probation","request":{"method":"PATCH","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/hr/probations/{id}/confirm","host":["{{baseUrl}}"],"path":["v1","hr","probations",":id","confirm"],"variable":[{"key":"id","value":"","description":"Path parameter: id"}]},"description":"Confirm successful completion of a probation\n\nSets `status: CONFIRMED` and stamps `confirmedAt` / `confirmedById`. Terminal state.\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `profile:write`\n**Tags:** HR"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"id\": \"prb_01HW3T...\",\n  \"employeeId\": \"string\",\n  \"startDate\": \"2026-01-15\",\n  \"endDate\": \"2026-04-15\",\n  \"status\": \"PENDING\",\n  \"confirmedAt\": \"2026-01-01T00:00:00.000Z\",\n  \"confirmedById\": \"string\",\n  \"extendedToDate\": \"2026-01-01\",\n  \"terminationReason\": \"string\",\n  \"notes\": \"string\",\n  \"createdAt\": \"2026-01-01T00:00:00.000Z\",\n  \"updatedAt\": \"2026-01-01T00:00:00.000Z\"\n}"}]},{"name":"Extend a probation period","request":{"method":"PATCH","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/hr/probations/{id}/extend","host":["{{baseUrl}}"],"path":["v1","hr","probations",":id","extend"],"variable":[{"key":"id","value":"","description":"Path parameter: id"}]},"description":"Extend a probation period\n\nPushes the review date out to `extendedToDate`. Sets `status: EXTENDED`. Can be called multiple times.\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `profile:write`\n**Tags:** HR","body":{"mode":"raw","raw":"{\n  \"extendedToDate\": \"2026-05-15\",\n  \"notes\": \"string\"\n}","options":{"raw":{"language":"json"}}}},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"id\": \"prb_01HW3T...\",\n  \"employeeId\": \"string\",\n  \"startDate\": \"2026-01-15\",\n  \"endDate\": \"2026-04-15\",\n  \"status\": \"PENDING\",\n  \"confirmedAt\": \"2026-01-01T00:00:00.000Z\",\n  \"confirmedById\": \"string\",\n  \"extendedToDate\": \"2026-01-01\",\n  \"terminationReason\": \"string\",\n  \"notes\": \"string\",\n  \"createdAt\": \"2026-01-01T00:00:00.000Z\",\n  \"updatedAt\": \"2026-01-01T00:00:00.000Z\"\n}"}]},{"name":"Terminate a probation (unsuccessful outcome)","request":{"method":"PATCH","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/hr/probations/{id}/terminate","host":["{{baseUrl}}"],"path":["v1","hr","probations",":id","terminate"],"variable":[{"key":"id","value":"","description":"Path parameter: id"}]},"description":"Terminate a probation (unsuccessful outcome)\n\nSets `status: TERMINATED` and records `terminationReason`. Terminal state; pairs with the offboarding flow.\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `profile:write`\n**Tags:** HR","body":{"mode":"raw","raw":"{\n  \"reason\": \"string\"\n}","options":{"raw":{"language":"json"}}}},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"id\": \"prb_01HW3T...\",\n  \"employeeId\": \"string\",\n  \"startDate\": \"2026-01-15\",\n  \"endDate\": \"2026-04-15\",\n  \"status\": \"PENDING\",\n  \"confirmedAt\": \"2026-01-01T00:00:00.000Z\",\n  \"confirmedById\": \"string\",\n  \"extendedToDate\": \"2026-01-01\",\n  \"terminationReason\": \"string\",\n  \"notes\": \"string\",\n  \"createdAt\": \"2026-01-01T00:00:00.000Z\",\n  \"updatedAt\": \"2026-01-01T00:00:00.000Z\"\n}"}]},{"name":"List role-change requests","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/hr/role-changes","host":["{{baseUrl}}"],"path":["v1","hr","role-changes"],"query":[{"key":"employeeId","value":"","disabled":true},{"key":"status","value":"","disabled":true}]},"description":"List role-change requests\n\nTwo-step approval workflow inbox: PENDING -> MANAGER_APPROVED -> HR_APPROVED -> APPLIED, with REJECTED as a side branch.\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `profile:read`\n**Tags:** HR"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"[\n  {\n    \"id\": \"rch_01HW3T...\",\n    \"employeeId\": \"string\",\n    \"requestedById\": \"string\",\n    \"newJobTitle\": \"string\",\n    \"newDepartmentId\": \"string\",\n    \"newLocationId\": \"string\",\n    \"newManagerId\": \"string\",\n    \"effectiveFrom\": \"2026-01-01\",\n    \"reason\": \"string\",\n    \"status\": \"PENDING\",\n    \"managerApprovedAt\": \"2026-01-01T00:00:00.000Z\",\n    \"managerApprovedById\": \"string\",\n    \"hrApprovedAt\": \"2026-01-01T00:00:00.000Z\",\n    \"hrApprovedById\": \"string\",\n    \"rejectionReason\": \"string\",\n    \"appliedAt\": \"2026-01-01T00:00:00.000Z\",\n    \"createdAt\": \"2026-01-01T00:00:00.000Z\",\n    \"updatedAt\": \"2026-01-01T00:00:00.000Z\"\n  }\n]"}]},{"name":"Request a role change for an employee","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/hr/role-changes","host":["{{baseUrl}}"],"path":["v1","hr","role-changes"]},"description":"Request a role change for an employee\n\nOpens a PENDING request. The requester cannot also be the approving manager - a different user must call `/manager-approve`.\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `profile:write`\n**Tags:** HR","body":{"mode":"raw","raw":"{\n  \"employeeId\": \"string\",\n  \"newJobTitle\": \"Staff Engineer\",\n  \"newDepartmentId\": \"string\",\n  \"newLocationId\": \"string\",\n  \"newManagerId\": \"string\",\n  \"effectiveFrom\": \"2026-07-01\",\n  \"reason\": \"string\"\n}","options":{"raw":{"language":"json"}}}},"response":[{"name":"Sample 201","status":"Created","code":201,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"id\": \"rch_01HW3T...\",\n  \"employeeId\": \"string\",\n  \"requestedById\": \"string\",\n  \"newJobTitle\": \"string\",\n  \"newDepartmentId\": \"string\",\n  \"newLocationId\": \"string\",\n  \"newManagerId\": \"string\",\n  \"effectiveFrom\": \"2026-01-01\",\n  \"reason\": \"string\",\n  \"status\": \"PENDING\",\n  \"managerApprovedAt\": \"2026-01-01T00:00:00.000Z\",\n  \"managerApprovedById\": \"string\",\n  \"hrApprovedAt\": \"2026-01-01T00:00:00.000Z\",\n  \"hrApprovedById\": \"string\",\n  \"rejectionReason\": \"string\",\n  \"appliedAt\": \"2026-01-01T00:00:00.000Z\",\n  \"createdAt\": \"2026-01-01T00:00:00.000Z\",\n  \"updatedAt\": \"2026-01-01T00:00:00.000Z\"\n}"}]}]},{"name":"Integrations","item":[{"name":"List available integrations (Slack, GitHub, Microsoft, Linear, Gmail, calendars, SSO, ...)","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/integrations/catalog","host":["{{baseUrl}}"],"path":["v1","integrations","catalog"]},"description":"List available integrations (Slack, GitHub, Microsoft, Linear, Gmail, calendars, SSO, ...)\n\nAggregate state across the tenant: each entry shows whether the integration is `available`, `connected`, `requires-setup`, or `unavailable` in the current environment.\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `profile:read`\n**Tags:** Integrations"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"integrations\": [\n    {\n      \"id\": null,\n      \"name\": null,\n      \"category\": null,\n      \"description\": null,\n      \"status\": null,\n      \"docsUrl\": null,\n      \"installUrl\": null,\n      \"scopes\": null\n    }\n  ]\n}"}]}]},{"name":"KnowledgeBase","item":[{"name":"List knowledge base pages","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/wiki/pages","host":["{{baseUrl}}"],"path":["v1","wiki","pages"],"query":[{"key":"parentId","value":"","disabled":true},{"key":"ownerUserId","value":"","disabled":true},{"key":"isPublished","value":"","disabled":true},{"key":"tagSlug","value":"","disabled":true},{"key":"limit","value":"","disabled":true}]},"description":"List knowledge base pages\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `profile:read`\n**Tags:** KnowledgeBase"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"items\": [\n    {\n      \"id\": null,\n      \"tenantId\": null,\n      \"parentId\": null,\n      \"title\": null,\n      \"slug\": null,\n      \"bodyMarkdown\": null,\n      \"ownerUserId\": null,\n      \"isPublished\": null,\n      \"lastEditedByUserId\": null,\n      \"version\": null,\n      \"publishedAt\": null,\n      \"createdAt\": null,\n      \"updatedAt\": null,\n      \"tags\": null,\n      \"commentCount\": null\n    }\n  ]\n}"}]},{"name":"Create a knowledge base page","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/wiki/pages","host":["{{baseUrl}}"],"path":["v1","wiki","pages"]},"description":"Create a knowledge base page\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `profile:write`\n**Tags:** KnowledgeBase","body":{"mode":"raw","raw":"{\n  \"title\": \"string\",\n  \"slug\": \"string\",\n  \"bodyMarkdown\": \"string\",\n  \"parentId\": \"string\",\n  \"isPublished\": false\n}","options":{"raw":{"language":"json"}}}},"response":[{"name":"Sample 201","status":"Created","code":201,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"id\": \"string\",\n  \"tenantId\": \"string\",\n  \"parentId\": \"string\",\n  \"title\": \"string\",\n  \"slug\": \"string\",\n  \"bodyMarkdown\": \"string\",\n  \"ownerUserId\": \"string\",\n  \"isPublished\": false,\n  \"lastEditedByUserId\": \"string\",\n  \"version\": 0,\n  \"publishedAt\": \"2026-01-01T00:00:00.000Z\",\n  \"createdAt\": \"2026-01-01T00:00:00.000Z\",\n  \"updatedAt\": \"2026-01-01T00:00:00.000Z\",\n  \"tags\": [\n    {\n      \"id\": null,\n      \"slug\": null,\n      \"label\": null\n    }\n  ],\n  \"commentCount\": 0\n}"}]},{"name":"Full-text search across knowledge base pages","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/wiki/search","host":["{{baseUrl}}"],"path":["v1","wiki","search"],"query":[{"key":"q","value":"","disabled":false},{"key":"limit","value":"","disabled":true}]},"description":"Full-text search across knowledge base pages\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `profile:read`\n**Tags:** KnowledgeBase"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"items\": [\n    {\n      \"id\": null,\n      \"title\": null,\n      \"slug\": null,\n      \"snippet\": null,\n      \"isPublished\": null,\n      \"updatedAt\": null\n    }\n  ]\n}"}]},{"name":"Get the knowledge base page parent/child graph","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/wiki/graph","host":["{{baseUrl}}"],"path":["v1","wiki","graph"],"query":[{"key":"rootId","value":"","disabled":true}]},"description":"Get the knowledge base page parent/child graph\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `profile:read`\n**Tags:** KnowledgeBase"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"nodes\": [\n    {\n      \"id\": \"string\",\n      \"title\": \"string\",\n      \"slug\": \"string\"\n    }\n  ],\n  \"edges\": [\n    {\n      \"from\": \"string\",\n      \"to\": \"string\"\n    }\n  ]\n}"}]},{"name":"Read one knowledge base page with comments","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/wiki/pages/{id}","host":["{{baseUrl}}"],"path":["v1","wiki","pages",":id"],"variable":[{"key":"id","value":"","description":"Path parameter: id"}]},"description":"Read one knowledge base page with comments\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `profile:read`\n**Tags:** KnowledgeBase"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{}"}]},{"name":"Update a knowledge base page","request":{"method":"PATCH","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/wiki/pages/{id}","host":["{{baseUrl}}"],"path":["v1","wiki","pages",":id"],"variable":[{"key":"id","value":"","description":"Path parameter: id"}]},"description":"Update a knowledge base page\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `profile:write`\n**Tags:** KnowledgeBase","body":{"mode":"raw","raw":"{\n  \"title\": \"string\",\n  \"slug\": \"string\",\n  \"bodyMarkdown\": \"string\",\n  \"parentId\": \"string\"\n}","options":{"raw":{"language":"json"}}}},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"id\": \"string\",\n  \"tenantId\": \"string\",\n  \"parentId\": \"string\",\n  \"title\": \"string\",\n  \"slug\": \"string\",\n  \"bodyMarkdown\": \"string\",\n  \"ownerUserId\": \"string\",\n  \"isPublished\": false,\n  \"lastEditedByUserId\": \"string\",\n  \"version\": 0,\n  \"publishedAt\": \"2026-01-01T00:00:00.000Z\",\n  \"createdAt\": \"2026-01-01T00:00:00.000Z\",\n  \"updatedAt\": \"2026-01-01T00:00:00.000Z\",\n  \"tags\": [\n    {\n      \"id\": null,\n      \"slug\": null,\n      \"label\": null\n    }\n  ],\n  \"commentCount\": 0\n}"}]},{"name":"Delete a knowledge base page","request":{"method":"DELETE","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/wiki/pages/{id}","host":["{{baseUrl}}"],"path":["v1","wiki","pages",":id"],"variable":[{"key":"id","value":"","description":"Path parameter: id"}]},"description":"Delete a knowledge base page\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `profile:write`\n**Tags:** KnowledgeBase"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"id\": \"string\",\n  \"deleted\": true\n}"}]},{"name":"Toggle the publish flag for a knowledge base page","request":{"method":"PATCH","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/wiki/pages/{id}/publish","host":["{{baseUrl}}"],"path":["v1","wiki","pages",":id","publish"],"variable":[{"key":"id","value":"","description":"Path parameter: id"}]},"description":"Toggle the publish flag for a knowledge base page\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `profile:write`\n**Tags:** KnowledgeBase","body":{"mode":"raw","raw":"{\n  \"isPublished\": false\n}","options":{"raw":{"language":"json"}}}},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"id\": \"string\",\n  \"tenantId\": \"string\",\n  \"parentId\": \"string\",\n  \"title\": \"string\",\n  \"slug\": \"string\",\n  \"bodyMarkdown\": \"string\",\n  \"ownerUserId\": \"string\",\n  \"isPublished\": false,\n  \"lastEditedByUserId\": \"string\",\n  \"version\": 0,\n  \"publishedAt\": \"2026-01-01T00:00:00.000Z\",\n  \"createdAt\": \"2026-01-01T00:00:00.000Z\",\n  \"updatedAt\": \"2026-01-01T00:00:00.000Z\",\n  \"tags\": [\n    {\n      \"id\": null,\n      \"slug\": null,\n      \"label\": null\n    }\n  ],\n  \"commentCount\": 0\n}"}]},{"name":"Post a comment on a knowledge base page","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/wiki/pages/{id}/comments","host":["{{baseUrl}}"],"path":["v1","wiki","pages",":id","comments"],"variable":[{"key":"id","value":"","description":"Path parameter: id"}]},"description":"Post a comment on a knowledge base page\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `profile:write`\n**Tags:** KnowledgeBase","body":{"mode":"raw","raw":"{\n  \"body\": \"string\"\n}","options":{"raw":{"language":"json"}}}},"response":[{"name":"Sample 201","status":"Created","code":201,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"id\": \"string\",\n  \"wikiPageId\": \"string\",\n  \"authorUserId\": \"string\",\n  \"body\": \"string\",\n  \"createdAt\": \"2026-01-01T00:00:00.000Z\"\n}"}]},{"name":"Replace the tag set on a knowledge base page","request":{"method":"PUT","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/wiki/pages/{id}/tags","host":["{{baseUrl}}"],"path":["v1","wiki","pages",":id","tags"],"variable":[{"key":"id","value":"","description":"Path parameter: id"}]},"description":"Replace the tag set on a knowledge base page\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `profile:write`\n**Tags:** KnowledgeBase","body":{"mode":"raw","raw":"{\n  \"tagSlugs\": [\n    \"string\"\n  ]\n}","options":{"raw":{"language":"json"}}}},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"id\": \"string\",\n  \"tenantId\": \"string\",\n  \"parentId\": \"string\",\n  \"title\": \"string\",\n  \"slug\": \"string\",\n  \"bodyMarkdown\": \"string\",\n  \"ownerUserId\": \"string\",\n  \"isPublished\": false,\n  \"lastEditedByUserId\": \"string\",\n  \"version\": 0,\n  \"publishedAt\": \"2026-01-01T00:00:00.000Z\",\n  \"createdAt\": \"2026-01-01T00:00:00.000Z\",\n  \"updatedAt\": \"2026-01-01T00:00:00.000Z\",\n  \"tags\": [\n    {\n      \"id\": null,\n      \"slug\": null,\n      \"label\": null\n    }\n  ],\n  \"commentCount\": 0\n}"}]}]},{"name":"Linear","item":[{"name":"Read the Linear connection status for the calling tenant","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/integrations/linear/status","host":["{{baseUrl}}"],"path":["v1","integrations","linear","status"]},"description":"Read the Linear connection status for the calling tenant\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `profile:read`\n**Tags:** Linear, Integrations"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"connected\": false,\n  \"workspaceName\": \"string\",\n  \"lastSyncedAt\": \"2026-01-01T00:00:00.000Z\"\n}"}]},{"name":"Initiate the Linear OAuth connect flow","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/integrations/linear/connect","host":["{{baseUrl}}"],"path":["v1","integrations","linear","connect"]},"description":"Initiate the Linear OAuth connect flow\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `profile:write`\n**Tags:** Linear, Integrations"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"redirectUrl\": \"https://example.com\"\n}"}]},{"name":"Disconnect the Linear integration","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/integrations/linear/disconnect","host":["{{baseUrl}}"],"path":["v1","integrations","linear","disconnect"]},"description":"Disconnect the Linear integration\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `profile:write`\n**Tags:** Linear, Integrations"},"response":[{"name":"Sample 204","status":"Disconnected","code":204,"_postman_previewlanguage":"json","body":""}]},{"name":"Force a Linear sync (best-effort)","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/integrations/linear/sync-now","host":["{{baseUrl}}"],"path":["v1","integrations","linear","sync-now"]},"description":"Force a Linear sync (best-effort)\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `profile:write`\n**Tags:** Linear, Integrations"},"response":[{"name":"Sample 202","status":"Accepted - sync queued","code":202,"_postman_previewlanguage":"json","body":""}]}]},{"name":"Marketplace","item":[{"name":"List the public marketplace app catalog","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/marketplace/apps","host":["{{baseUrl}}"],"path":["v1","marketplace","apps"]},"description":"List the public marketplace app catalog\n\nPublic, unauthenticated read of the curated catalog. Returns a bare JSON array (no `{ items }` wrapper).\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `profile:read`\n**Tags:** Marketplace"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"[\n  {\n    \"id\": \"slack\",\n    \"slug\": \"slack\",\n    \"name\": \"Slack\",\n    \"vendor\": \"Slack Technologies\",\n    \"description\": \"string\",\n    \"iconUrl\": \"https://example.com\",\n    \"category\": \"communication\",\n    \"scopes\": [\n      \"string\"\n    ],\n    \"homepageUrl\": \"https://example.com\"\n  }\n]"}]},{"name":"List the calling tenant's marketplace app installs","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/marketplace/installs","host":["{{baseUrl}}"],"path":["v1","marketplace","installs"]},"description":"List the calling tenant's marketplace app installs\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `profile:read`\n**Tags:** Marketplace"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"[\n  {\n    \"installId\": \"string\",\n    \"appId\": \"string\",\n    \"installedAt\": \"2026-01-01T00:00:00.000Z\",\n    \"installedBy\": \"string\"\n  }\n]"}]},{"name":"Install an app for the calling tenant","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/marketplace/installs","host":["{{baseUrl}}"],"path":["v1","marketplace","installs"]},"description":"Install an app for the calling tenant\n\nIdempotent upsert; returns HTTP 200 even on re-install. When `scopesGranted` is supplied the scoped install flow records the explicit grants.\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `profile:write`\n**Tags:** Marketplace","body":{"mode":"raw","raw":"{\n  \"appId\": \"slack\",\n  \"scopesGranted\": [\n    \"string\"\n  ]\n}","options":{"raw":{"language":"json"}}}},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"installId\": \"string\",\n  \"appId\": \"string\",\n  \"status\": \"installed\",\n  \"installedAt\": \"2026-01-01T00:00:00.000Z\",\n  \"oauthClientId\": \"string\",\n  \"scopesGranted\": [\n    \"string\"\n  ]\n}"}]},{"name":"Uninstall an app from the calling tenant","request":{"method":"DELETE","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/marketplace/installs/{appId}","host":["{{baseUrl}}"],"path":["v1","marketplace","installs",":appId"],"variable":[{"key":"appId","value":"","description":"Path parameter: appId"}]},"description":"Uninstall an app from the calling tenant\n\nIdempotent; a double-uninstall returns 204 (never 404).\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `profile:write`\n**Tags:** Marketplace"},"response":[{"name":"Sample 204","status":"Uninstalled","code":204,"_postman_previewlanguage":"json","body":""}]},{"name":"Create a draft marketplace app from a manifest","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/marketplace/submit","host":["{{baseUrl}}"],"path":["v1","marketplace","submit"]},"description":"Create a draft marketplace app from a manifest\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `profile:write`\n**Tags:** Marketplace","body":{"mode":"raw","raw":"{\n  \"manifest\": {}\n}","options":{"raw":{"language":"json"}}}},"response":[{"name":"Sample 201","status":"Created","code":201,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"appId\": \"string\",\n  \"submissionId\": \"string\"\n}"}]},{"name":"Replace the draft manifest for one app","request":{"method":"PUT","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/marketplace/apps/{id}/manifest","host":["{{baseUrl}}"],"path":["v1","marketplace","apps",":id","manifest"],"variable":[{"key":"id","value":"","description":"Path parameter: id"}]},"description":"Replace the draft manifest for one app\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `profile:write`\n**Tags:** Marketplace","body":{"mode":"raw","raw":"{\n  \"manifest\": {}\n}","options":{"raw":{"language":"json"}}}},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"id\": \"string\",\n  \"slug\": \"string\",\n  \"name\": \"string\",\n  \"vendor\": \"string\",\n  \"vendorTenantId\": \"string\",\n  \"description\": \"string\",\n  \"iconUrl\": \"string\",\n  \"category\": \"string\",\n  \"scopes\": [\n    \"string\"\n  ],\n  \"homepageUrl\": \"string\",\n  \"manifestVersion\": \"string\",\n  \"manifest\": {},\n  \"publishStatus\": \"draft\",\n  \"submittedAt\": \"2026-01-01T00:00:00.000Z\",\n  \"publishedAt\": \"2026-01-01T00:00:00.000Z\",\n  \"reviewedBy\": \"string\",\n  \"reviewNotes\": \"string\",\n  \"rejectionReason\": \"string\",\n  \"revenueShareBps\": 0,\n  \"monthlyPriceCents\": 0,\n  \"freeForN\": 0,\n  \"createdAt\": \"2026-01-01T00:00:00.000Z\",\n  \"updatedAt\": \"2026-01-01T00:00:00.000Z\"\n}"}]},{"name":"Submit a draft app for moderator review","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/marketplace/apps/{id}/submit-for-review","host":["{{baseUrl}}"],"path":["v1","marketplace","apps",":id","submit-for-review"],"variable":[{"key":"id","value":"","description":"Path parameter: id"}]},"description":"Submit a draft app for moderator review\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `profile:write`\n**Tags:** Marketplace"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"submissionId\": \"string\"\n}"}]},{"name":"List the calling developer's marketplace apps","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/marketplace/developer/apps","host":["{{baseUrl}}"],"path":["v1","marketplace","developer","apps"],"query":[{"key":"vendorTenantId","value":"","description":"Only the literal `mine` is supported today.","disabled":false}]},"description":"List the calling developer's marketplace apps\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `profile:read`\n**Tags:** Marketplace"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"[\n  {\n    \"id\": \"string\",\n    \"slug\": \"string\",\n    \"name\": \"string\",\n    \"vendor\": \"string\",\n    \"vendorTenantId\": \"string\",\n    \"description\": \"string\",\n    \"iconUrl\": \"string\",\n    \"category\": \"string\",\n    \"scopes\": [\n      \"string\"\n    ],\n    \"homepageUrl\": \"string\",\n    \"manifestVersion\": \"string\",\n    \"manifest\": {},\n    \"publishStatus\": \"draft\",\n    \"submittedAt\": \"2026-01-01T00:00:00.000Z\",\n    \"publishedAt\": \"2026-01-01T00:00:00.000Z\",\n    \"reviewedBy\": \"string\",\n    \"reviewNotes\": \"string\",\n    \"rejectionReason\": \"string\",\n    \"revenueShareBps\": 0,\n    \"monthlyPriceCents\": 0,\n    \"freeForN\": 0,\n    \"createdAt\": \"2026-01-01T00:00:00.000Z\",\n    \"updatedAt\": \"2026-01-01T00:00:00.000Z\"\n  }\n]"}]},{"name":"Read one of the calling developer's marketplace apps","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/marketplace/developer/apps/{id}","host":["{{baseUrl}}"],"path":["v1","marketplace","developer","apps",":id"],"variable":[{"key":"id","value":"","description":"Path parameter: id"}]},"description":"Read one of the calling developer's marketplace apps\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `profile:read`\n**Tags:** Marketplace"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"id\": \"string\",\n  \"slug\": \"string\",\n  \"name\": \"string\",\n  \"vendor\": \"string\",\n  \"vendorTenantId\": \"string\",\n  \"description\": \"string\",\n  \"iconUrl\": \"string\",\n  \"category\": \"string\",\n  \"scopes\": [\n    \"string\"\n  ],\n  \"homepageUrl\": \"string\",\n  \"manifestVersion\": \"string\",\n  \"manifest\": {},\n  \"publishStatus\": \"draft\",\n  \"submittedAt\": \"2026-01-01T00:00:00.000Z\",\n  \"publishedAt\": \"2026-01-01T00:00:00.000Z\",\n  \"reviewedBy\": \"string\",\n  \"reviewNotes\": \"string\",\n  \"rejectionReason\": \"string\",\n  \"revenueShareBps\": 0,\n  \"monthlyPriceCents\": 0,\n  \"freeForN\": 0,\n  \"createdAt\": \"2026-01-01T00:00:00.000Z\",\n  \"updatedAt\": \"2026-01-01T00:00:00.000Z\"\n}"}]},{"name":"List the review history (submissions) for one developer app","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/marketplace/developer/apps/{id}/submissions","host":["{{baseUrl}}"],"path":["v1","marketplace","developer","apps",":id","submissions"],"variable":[{"key":"id","value":"","description":"Path parameter: id"}]},"description":"List the review history (submissions) for one developer app\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `profile:read`\n**Tags:** Marketplace"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"[\n  {\n    \"id\": \"string\",\n    \"appId\": \"string\",\n    \"manifestSnapshot\": {},\n    \"status\": \"pending\",\n    \"submittedBy\": \"string\",\n    \"submittedAt\": \"2026-01-01T00:00:00.000Z\",\n    \"reviewedBy\": \"string\",\n    \"reviewedAt\": \"2026-01-01T00:00:00.000Z\",\n    \"reviewerNotes\": \"string\"\n  }\n]"}]},{"name":"List the marketplace moderation queue (admin)","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/marketplace/admin/queue","host":["{{baseUrl}}"],"path":["v1","marketplace","admin","queue"],"query":[{"key":"status","value":"","disabled":true},{"key":"page","value":"","disabled":true},{"key":"pageSize","value":"","disabled":true}]},"description":"List the marketplace moderation queue (admin)\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `profile:read`\n**Tags:** Marketplace, SuperAdmin"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"items\": [\n    {\n      \"id\": null,\n      \"slug\": null,\n      \"name\": null,\n      \"vendor\": null,\n      \"vendorTenantId\": null,\n      \"description\": null,\n      \"iconUrl\": null,\n      \"category\": null,\n      \"scopes\": null,\n      \"homepageUrl\": null,\n      \"manifestVersion\": null,\n      \"manifest\": null,\n      \"publishStatus\": null,\n      \"submittedAt\": null,\n      \"publishedAt\": null,\n      \"reviewedBy\": null,\n      \"reviewNotes\": null,\n      \"rejectionReason\": null,\n      \"revenueShareBps\": null,\n      \"monthlyPriceCents\": null,\n      \"freeForN\": null,\n      \"createdAt\": null,\n      \"updatedAt\": null\n    }\n  ],\n  \"total\": 0,\n  \"page\": 0,\n  \"pageSize\": 0\n}"}]},{"name":"Approve a submitted marketplace app","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/marketplace/admin/apps/{id}/approve","host":["{{baseUrl}}"],"path":["v1","marketplace","admin","apps",":id","approve"],"variable":[{"key":"id","value":"","description":"Path parameter: id"}]},"description":"Approve a submitted marketplace app\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `profile:write`\n**Tags:** Marketplace, SuperAdmin","body":{"mode":"raw","raw":"{\n  \"reviewerNotes\": \"string\"\n}","options":{"raw":{"language":"json"}}}},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"id\": \"string\",\n  \"slug\": \"string\",\n  \"name\": \"string\",\n  \"vendor\": \"string\",\n  \"vendorTenantId\": \"string\",\n  \"description\": \"string\",\n  \"iconUrl\": \"string\",\n  \"category\": \"string\",\n  \"scopes\": [\n    \"string\"\n  ],\n  \"homepageUrl\": \"string\",\n  \"manifestVersion\": \"string\",\n  \"manifest\": {},\n  \"publishStatus\": \"draft\",\n  \"submittedAt\": \"2026-01-01T00:00:00.000Z\",\n  \"publishedAt\": \"2026-01-01T00:00:00.000Z\",\n  \"reviewedBy\": \"string\",\n  \"reviewNotes\": \"string\",\n  \"rejectionReason\": \"string\",\n  \"revenueShareBps\": 0,\n  \"monthlyPriceCents\": 0,\n  \"freeForN\": 0,\n  \"createdAt\": \"2026-01-01T00:00:00.000Z\",\n  \"updatedAt\": \"2026-01-01T00:00:00.000Z\"\n}"}]},{"name":"Reject a submitted marketplace app","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/marketplace/admin/apps/{id}/reject","host":["{{baseUrl}}"],"path":["v1","marketplace","admin","apps",":id","reject"],"variable":[{"key":"id","value":"","description":"Path parameter: id"}]},"description":"Reject a submitted marketplace app\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `profile:write`\n**Tags:** Marketplace, SuperAdmin","body":{"mode":"raw","raw":"{\n  \"reason\": \"string\"\n}","options":{"raw":{"language":"json"}}}},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"id\": \"string\",\n  \"slug\": \"string\",\n  \"name\": \"string\",\n  \"vendor\": \"string\",\n  \"vendorTenantId\": \"string\",\n  \"description\": \"string\",\n  \"iconUrl\": \"string\",\n  \"category\": \"string\",\n  \"scopes\": [\n    \"string\"\n  ],\n  \"homepageUrl\": \"string\",\n  \"manifestVersion\": \"string\",\n  \"manifest\": {},\n  \"publishStatus\": \"draft\",\n  \"submittedAt\": \"2026-01-01T00:00:00.000Z\",\n  \"publishedAt\": \"2026-01-01T00:00:00.000Z\",\n  \"reviewedBy\": \"string\",\n  \"reviewNotes\": \"string\",\n  \"rejectionReason\": \"string\",\n  \"revenueShareBps\": 0,\n  \"monthlyPriceCents\": 0,\n  \"freeForN\": 0,\n  \"createdAt\": \"2026-01-01T00:00:00.000Z\",\n  \"updatedAt\": \"2026-01-01T00:00:00.000Z\"\n}"}]},{"name":"Send a submitted app back to the developer for changes","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/marketplace/admin/apps/{id}/request-changes","host":["{{baseUrl}}"],"path":["v1","marketplace","admin","apps",":id","request-changes"],"variable":[{"key":"id","value":"","description":"Path parameter: id"}]},"description":"Send a submitted app back to the developer for changes\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `profile:write`\n**Tags:** Marketplace, SuperAdmin","body":{"mode":"raw","raw":"{\n  \"reviewerNotes\": \"string\"\n}","options":{"raw":{"language":"json"}}}},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"id\": \"string\",\n  \"slug\": \"string\",\n  \"name\": \"string\",\n  \"vendor\": \"string\",\n  \"vendorTenantId\": \"string\",\n  \"description\": \"string\",\n  \"iconUrl\": \"string\",\n  \"category\": \"string\",\n  \"scopes\": [\n    \"string\"\n  ],\n  \"homepageUrl\": \"string\",\n  \"manifestVersion\": \"string\",\n  \"manifest\": {},\n  \"publishStatus\": \"draft\",\n  \"submittedAt\": \"2026-01-01T00:00:00.000Z\",\n  \"publishedAt\": \"2026-01-01T00:00:00.000Z\",\n  \"reviewedBy\": \"string\",\n  \"reviewNotes\": \"string\",\n  \"rejectionReason\": \"string\",\n  \"revenueShareBps\": 0,\n  \"monthlyPriceCents\": 0,\n  \"freeForN\": 0,\n  \"createdAt\": \"2026-01-01T00:00:00.000Z\",\n  \"updatedAt\": \"2026-01-01T00:00:00.000Z\"\n}"}]},{"name":"Suspend a published marketplace app","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/marketplace/admin/apps/{id}/suspend","host":["{{baseUrl}}"],"path":["v1","marketplace","admin","apps",":id","suspend"],"variable":[{"key":"id","value":"","description":"Path parameter: id"}]},"description":"Suspend a published marketplace app\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `profile:write`\n**Tags:** Marketplace, SuperAdmin","body":{"mode":"raw","raw":"{\n  \"reason\": \"string\"\n}","options":{"raw":{"language":"json"}}}},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"id\": \"string\",\n  \"slug\": \"string\",\n  \"name\": \"string\",\n  \"vendor\": \"string\",\n  \"vendorTenantId\": \"string\",\n  \"description\": \"string\",\n  \"iconUrl\": \"string\",\n  \"category\": \"string\",\n  \"scopes\": [\n    \"string\"\n  ],\n  \"homepageUrl\": \"string\",\n  \"manifestVersion\": \"string\",\n  \"manifest\": {},\n  \"publishStatus\": \"draft\",\n  \"submittedAt\": \"2026-01-01T00:00:00.000Z\",\n  \"publishedAt\": \"2026-01-01T00:00:00.000Z\",\n  \"reviewedBy\": \"string\",\n  \"reviewNotes\": \"string\",\n  \"rejectionReason\": \"string\",\n  \"revenueShareBps\": 0,\n  \"monthlyPriceCents\": 0,\n  \"freeForN\": 0,\n  \"createdAt\": \"2026-01-01T00:00:00.000Z\",\n  \"updatedAt\": \"2026-01-01T00:00:00.000Z\"\n}"}]},{"name":"List per-tenant marketplace revenue for one calendar month (admin)","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/marketplace/admin/revenue","host":["{{baseUrl}}"],"path":["v1","marketplace","admin","revenue"],"query":[{"key":"month","value":"","description":"Calendar month in `YYYY-MM` format.","disabled":false}]},"description":"List per-tenant marketplace revenue for one calendar month (admin)\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `profile:read`\n**Tags:** Marketplace, SuperAdmin"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"[\n  {\n    \"id\": \"string\",\n    \"appId\": \"string\",\n    \"tenantId\": \"string\",\n    \"installId\": \"string\",\n    \"periodMonth\": \"2026-06\",\n    \"grossCents\": 0,\n    \"shareBps\": 0,\n    \"payoutCents\": 0,\n    \"status\": \"accrued\",\n    \"createdAt\": \"2026-01-01T00:00:00.000Z\"\n  }\n]"}]}]},{"name":"Microsoft","item":[{"name":"Read the Microsoft 365 connection status for the calling tenant","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/integrations/microsoft/status","host":["{{baseUrl}}"],"path":["v1","integrations","microsoft","status"]},"description":"Read the Microsoft 365 connection status for the calling tenant\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `profile:read`\n**Tags:** Microsoft, Integrations"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"connected\": false,\n  \"tenantDomain\": \"string\",\n  \"lastSyncedAt\": \"2026-01-01T00:00:00.000Z\",\n  \"scopes\": [\n    \"string\"\n  ]\n}"}]},{"name":"Initiate the Microsoft OAuth connect flow","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/integrations/microsoft/connect","host":["{{baseUrl}}"],"path":["v1","integrations","microsoft","connect"]},"description":"Initiate the Microsoft OAuth connect flow\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `profile:write`\n**Tags:** Microsoft, Integrations"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"redirectUrl\": \"https://example.com\"\n}"}]},{"name":"Disconnect the Microsoft 365 integration","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/integrations/microsoft/disconnect","host":["{{baseUrl}}"],"path":["v1","integrations","microsoft","disconnect"]},"description":"Disconnect the Microsoft 365 integration\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `profile:write`\n**Tags:** Microsoft, Integrations"},"response":[{"name":"Sample 204","status":"Disconnected","code":204,"_postman_previewlanguage":"json","body":""}]},{"name":"Force a synchronous Microsoft 365 sync (best-effort)","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/integrations/microsoft/sync-now","host":["{{baseUrl}}"],"path":["v1","integrations","microsoft","sync-now"]},"description":"Force a synchronous Microsoft 365 sync (best-effort)\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `profile:write`\n**Tags:** Microsoft, Integrations"},"response":[{"name":"Sample 202","status":"Accepted - sync queued","code":202,"_postman_previewlanguage":"json","body":""}]}]},{"name":"Notifications","item":[{"name":"List inbox notifications for the calling user","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/notifications","host":["{{baseUrl}}"],"path":["v1","notifications"],"query":[{"key":"status","value":"","disabled":true},{"key":"unreadOnly","value":"","description":"Legacy alias for `status=unread`.","disabled":true},{"key":"kinds","value":"","description":"Comma-separated list of notification kinds.","disabled":true},{"key":"projectId","value":"","disabled":true},{"key":"actorId","value":"","disabled":true},{"key":"q","value":"","disabled":true},{"key":"since","value":"","disabled":true},{"key":"before","value":"","disabled":true},{"key":"cursor","value":"","disabled":true},{"key":"limit","value":"","disabled":true}]},"description":"List inbox notifications for the calling user\n\nCursor-paginated, newest first. Filter by `status` (unread / read / archived / all / everything), by event `kinds`, by `projectId`, by `actorId`, by free-text `q`, or by a time window (`since` / `before`). Legacy `unreadOnly=true` is preserved as a shortcut for `status=unread`. Response carries the live unread count + a 4-bucket summary for the FE header.\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `profile:read`\n**Tags:** Notifications"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"items\": [\n    {\n      \"id\": null,\n      \"kind\": null,\n      \"title\": null,\n      \"body\": null,\n      \"link\": null,\n      \"context\": null,\n      \"readAt\": null,\n      \"archivedAt\": null,\n      \"snoozedUntil\": null,\n      \"createdAt\": null\n    }\n  ],\n  \"nextCursor\": \"string\",\n  \"unread\": 0,\n  \"summary\": {\n    \"total\": 0,\n    \"unread\": 0,\n    \"archived\": 0,\n    \"snoozed\": 0\n  }\n}"}]},{"name":"Read the daily-digest preview","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/notifications/digest","host":["{{baseUrl}}"],"path":["v1","notifications","digest"]},"description":"Read the daily-digest preview\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `profile:read`\n**Tags:** Notifications"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"windowStart\": \"2026-01-01T00:00:00.000Z\",\n  \"windowEnd\": \"2026-01-01T00:00:00.000Z\",\n  \"unread\": 0,\n  \"items\": [\n    {\n      \"id\": null,\n      \"kind\": null,\n      \"title\": null,\n      \"body\": null,\n      \"link\": null,\n      \"context\": null,\n      \"readAt\": null,\n      \"archivedAt\": null,\n      \"snoozedUntil\": null,\n      \"createdAt\": null\n    }\n  ]\n}"}]},{"name":"Five named snooze presets resolved to concrete future wake timestamps","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/notifications/snooze-presets","host":["{{baseUrl}}"],"path":["v1","notifications","snooze-presets"]},"description":"Five named snooze presets resolved to concrete future wake timestamps\n\nPrivacy-safe: only `{ id, label, wakeAt }` is returned.\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `profile:read`\n**Tags:** Notifications"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"[\n  {\n    \"id\": \"tomorrow_morning\",\n    \"label\": \"Tomorrow morning\",\n    \"wakeAt\": 1717747200000\n  }\n]"}]},{"name":"Read notification preferences for the calling user","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/notifications/preferences","host":["{{baseUrl}}"],"path":["v1","notifications","preferences"]},"description":"Read notification preferences for the calling user\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `profile:read`\n**Tags:** Notifications"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"kinds\": {},\n  \"channels\": {\n    \"inApp\": false,\n    \"push\": false,\n    \"email\": false\n  },\n  \"digest\": \"instant\",\n  \"quietHours\": {\n    \"start\": \"22:00\",\n    \"end\": \"07:00\",\n    \"tz\": \"America/Los_Angeles\"\n  },\n  \"lastSeenAt\": \"2026-01-01T00:00:00.000Z\"\n}"}]},{"name":"Update notification preferences (merge semantics)","request":{"method":"PATCH","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/notifications/preferences","host":["{{baseUrl}}"],"path":["v1","notifications","preferences"]},"description":"Update notification preferences (merge semantics)\n\nPATCH semantics: undefined fields are left untouched. Sub-objects (`kinds`, `channels`) merge per-key, so a request like `{ \"channels\": { \"push\": false } }` only flips the push toggle.\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `profile:write`\n**Tags:** Notifications","body":{"mode":"raw","raw":"{\n  \"kinds\": {},\n  \"channels\": {\n    \"inApp\": false,\n    \"push\": false,\n    \"email\": false\n  },\n  \"digest\": \"instant\",\n  \"quietHours\": {\n    \"start\": \"22:00\",\n    \"end\": \"07:00\",\n    \"tz\": \"America/Los_Angeles\"\n  },\n  \"lastSeenAt\": \"2026-01-01T00:00:00.000Z\"\n}","options":{"raw":{"language":"json"}}}},"response":[{"name":"Sample 200","status":"Updated","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"kinds\": {},\n  \"channels\": {\n    \"inApp\": false,\n    \"push\": false,\n    \"email\": false\n  },\n  \"digest\": \"instant\",\n  \"quietHours\": {\n    \"start\": \"22:00\",\n    \"end\": \"07:00\",\n    \"tz\": \"America/Los_Angeles\"\n  },\n  \"lastSeenAt\": \"2026-01-01T00:00:00.000Z\"\n}"}]},{"name":"Mark a notification as read","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/notifications/{id}/read","host":["{{baseUrl}}"],"path":["v1","notifications",":id","read"],"variable":[{"key":"id","value":"","description":"Path parameter: id"}]},"description":"Mark a notification as read\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `profile:write`\n**Tags:** Notifications"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"id\": \"ntf_01HW3T2K8X9Y2VPRZGQX9NDY40\",\n  \"kind\": \"comment.mention\",\n  \"title\": \"string\",\n  \"body\": \"string\",\n  \"link\": \"string\",\n  \"context\": {},\n  \"readAt\": \"2026-01-01T00:00:00.000Z\",\n  \"archivedAt\": \"2026-01-01T00:00:00.000Z\",\n  \"snoozedUntil\": \"2026-01-01T00:00:00.000Z\",\n  \"createdAt\": \"2026-01-01T00:00:00.000Z\"\n}"}]},{"name":"Mark a notification as unread","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/notifications/{id}/unread","host":["{{baseUrl}}"],"path":["v1","notifications",":id","unread"],"variable":[{"key":"id","value":"","description":"Path parameter: id"}]},"description":"Mark a notification as unread\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `profile:write`\n**Tags:** Notifications"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"id\": \"ntf_01HW3T2K8X9Y2VPRZGQX9NDY40\",\n  \"kind\": \"comment.mention\",\n  \"title\": \"string\",\n  \"body\": \"string\",\n  \"link\": \"string\",\n  \"context\": {},\n  \"readAt\": \"2026-01-01T00:00:00.000Z\",\n  \"archivedAt\": \"2026-01-01T00:00:00.000Z\",\n  \"snoozedUntil\": \"2026-01-01T00:00:00.000Z\",\n  \"createdAt\": \"2026-01-01T00:00:00.000Z\"\n}"}]},{"name":"Archive a notification (removes it from the live inbox)","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/notifications/{id}/archive","host":["{{baseUrl}}"],"path":["v1","notifications",":id","archive"],"variable":[{"key":"id","value":"","description":"Path parameter: id"}]},"description":"Archive a notification (removes it from the live inbox)\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `profile:write`\n**Tags:** Notifications"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"id\": \"ntf_01HW3T2K8X9Y2VPRZGQX9NDY40\",\n  \"kind\": \"comment.mention\",\n  \"title\": \"string\",\n  \"body\": \"string\",\n  \"link\": \"string\",\n  \"context\": {},\n  \"readAt\": \"2026-01-01T00:00:00.000Z\",\n  \"archivedAt\": \"2026-01-01T00:00:00.000Z\",\n  \"snoozedUntil\": \"2026-01-01T00:00:00.000Z\",\n  \"createdAt\": \"2026-01-01T00:00:00.000Z\"\n}"}]},{"name":"Unarchive a notification (restore to the live inbox)","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/notifications/{id}/unarchive","host":["{{baseUrl}}"],"path":["v1","notifications",":id","unarchive"],"variable":[{"key":"id","value":"","description":"Path parameter: id"}]},"description":"Unarchive a notification (restore to the live inbox)\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `profile:write`\n**Tags:** Notifications"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"id\": \"ntf_01HW3T2K8X9Y2VPRZGQX9NDY40\",\n  \"kind\": \"comment.mention\",\n  \"title\": \"string\",\n  \"body\": \"string\",\n  \"link\": \"string\",\n  \"context\": {},\n  \"readAt\": \"2026-01-01T00:00:00.000Z\",\n  \"archivedAt\": \"2026-01-01T00:00:00.000Z\",\n  \"snoozedUntil\": \"2026-01-01T00:00:00.000Z\",\n  \"createdAt\": \"2026-01-01T00:00:00.000Z\"\n}"}]},{"name":"Snooze a notification until a specified time","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/notifications/{id}/snooze","host":["{{baseUrl}}"],"path":["v1","notifications",":id","snooze"],"variable":[{"key":"id","value":"","description":"Path parameter: id"}]},"description":"Snooze a notification until a specified time\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `profile:write`\n**Tags:** Notifications","body":{"mode":"raw","raw":"{\n  \"until\": \"2026-06-07T09:00:00-07:00\"\n}","options":{"raw":{"language":"json"}}}},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"id\": \"ntf_01HW3T2K8X9Y2VPRZGQX9NDY40\",\n  \"kind\": \"comment.mention\",\n  \"title\": \"string\",\n  \"body\": \"string\",\n  \"link\": \"string\",\n  \"context\": {},\n  \"readAt\": \"2026-01-01T00:00:00.000Z\",\n  \"archivedAt\": \"2026-01-01T00:00:00.000Z\",\n  \"snoozedUntil\": \"2026-01-01T00:00:00.000Z\",\n  \"createdAt\": \"2026-01-01T00:00:00.000Z\"\n}"}]},{"name":"Mark every live notification as read","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/notifications/read-all","host":["{{baseUrl}}"],"path":["v1","notifications","read-all"]},"description":"Mark every live notification as read\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `profile:write`\n**Tags:** Notifications"},"response":[{"name":"Sample 204","status":"OK","code":204,"_postman_previewlanguage":"json","body":""}]},{"name":"Archive every notification that has been read","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/notifications/archive-all-read","host":["{{baseUrl}}"],"path":["v1","notifications","archive-all-read"]},"description":"Archive every notification that has been read\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `profile:write`\n**Tags:** Notifications"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"count\": 0\n}"}]}]},{"name":"PATs","item":[{"name":"List personal access tokens","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/pats","host":["{{baseUrl}}"],"path":["v1","pats"]},"description":"List personal access tokens\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `pats:manage`\n**Tags:** PATs"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"items\": [\n    {\n      \"id\": \"string\",\n      \"name\": \"string\",\n      \"prefix\": \"string\",\n      \"scopes\": [\n        null\n      ],\n      \"allowedIps\": [\n        null\n      ],\n      \"createdAt\": \"2026-01-01T00:00:00.000Z\",\n      \"lastUsedAt\": \"2026-01-01T00:00:00.000Z\",\n      \"expiresAt\": \"2026-01-01T00:00:00.000Z\",\n      \"revokedAt\": \"2026-01-01T00:00:00.000Z\"\n    }\n  ]\n}"}]},{"name":"Create a personal access token","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/pats","host":["{{baseUrl}}"],"path":["v1","pats"]},"description":"Create a personal access token\n\nMint a PAT (`atlas_pat_*`). The raw token is returned in the 201 body **exactly once** - capture it before navigating away or you will have to mint a new one. Pick the narrowest `scopes` that fit the workload (see `info.x-scopes`); empty `allowedIps` means any IP can call the API with this token. The integration that uses this token should hit `/v1/tasks` next; that's where every developer-facing example starts.\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `pats:manage`\n**Tags:** PATs","body":{"mode":"raw","raw":"{\n  \"name\": \"Slack ingestion bot\",\n  \"scopes\": [\n    \"tasks:read\",\n    \"projects:read\",\n    \"profile:read\"\n  ],\n  \"allowedIps\": [\n    \"203.0.113.4\"\n  ],\n  \"expiresAt\": \"2026-01-01T00:00:00.000Z\"\n}","options":{"raw":{"language":"json"}}}},"response":[{"name":"Sample 201","status":"Created. The raw token is included once and only once.","code":201,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"pat\": {\n    \"id\": \"string\",\n    \"name\": \"string\",\n    \"prefix\": \"string\",\n    \"scopes\": [\n      \"tasks:read\"\n    ],\n    \"allowedIps\": [\n      \"string\"\n    ],\n    \"createdAt\": \"2026-01-01T00:00:00.000Z\",\n    \"lastUsedAt\": \"2026-01-01T00:00:00.000Z\",\n    \"expiresAt\": \"2026-01-01T00:00:00.000Z\",\n    \"revokedAt\": \"2026-01-01T00:00:00.000Z\"\n  },\n  \"token\": \"string\"\n}"}]},{"name":"Rotate a PAT","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/pats/{id}/rotate","host":["{{baseUrl}}"],"path":["v1","pats",":id","rotate"],"variable":[{"key":"id","value":"","description":"Path parameter: id"}]},"description":"Rotate a PAT\n\nRevokes the selected PAT and returns a replacement token once. Optional body fields override the replacement label, scopes, IP allowlist, or expiration; omitting the body preserves the previous metadata.\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `pats:manage`\n**Tags:** PATs","body":{"mode":"raw","raw":"{\n  \"name\": \"string\",\n  \"scopes\": [\n    \"tasks:read\"\n  ],\n  \"allowedIps\": [\n    \"string\"\n  ],\n  \"expiresAt\": \"2026-01-01T00:00:00.000Z\"\n}","options":{"raw":{"language":"json"}}}},"response":[{"name":"Sample 200","status":"Rotated. The replacement raw token is included once and only once.","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"pat\": {\n    \"id\": \"string\",\n    \"name\": \"string\",\n    \"prefix\": \"string\",\n    \"scopes\": [\n      \"tasks:read\"\n    ],\n    \"allowedIps\": [\n      \"string\"\n    ],\n    \"createdAt\": \"2026-01-01T00:00:00.000Z\",\n    \"lastUsedAt\": \"2026-01-01T00:00:00.000Z\",\n    \"expiresAt\": \"2026-01-01T00:00:00.000Z\",\n    \"revokedAt\": \"2026-01-01T00:00:00.000Z\"\n  },\n  \"token\": \"string\"\n}"}]},{"name":"Revoke a PAT","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/pats/{id}/revoke","host":["{{baseUrl}}"],"path":["v1","pats",":id","revoke"],"variable":[{"key":"id","value":"","description":"Path parameter: id"}]},"description":"Revoke a PAT\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `pats:manage`\n**Tags:** PATs"},"response":[{"name":"Sample 204","status":"Revoked","code":204,"_postman_previewlanguage":"json","body":""}]}]},{"name":"Profile","item":[{"name":"Read the calling user's \"Additional\" profile fields","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/profile/me/extras","host":["{{baseUrl}}"],"path":["v1","profile","me","extras"]},"description":"Read the calling user's \"Additional\" profile fields\n\nReturns the 14 Iteration-5 profile fields. None of them count toward the profile-completeness percentage; the response is a flat object documented inline in the response body.\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `profile:read`\n**Tags:** Profile"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","body":""}]},{"name":"Update any subset of the Additional profile fields","request":{"method":"PATCH","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/profile/me/extras","host":["{{baseUrl}}"],"path":["v1","profile","me","extras"]},"description":"Update any subset of the Additional profile fields\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `profile:write`\n**Tags:** Profile"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","body":""}]},{"name":"Read the calling user's personal About page (block content)","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/profile/me/about","host":["{{baseUrl}}"],"path":["v1","profile","me","about"]},"description":"Read the calling user's personal About page (block content)\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `profile:read`\n**Tags:** Profile"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","body":""}]},{"name":"Replace the calling user's About page blocks","request":{"method":"PATCH","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/profile/me/about","host":["{{baseUrl}}"],"path":["v1","profile","me","about"]},"description":"Replace the calling user's About page blocks\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `profile:write`\n**Tags:** Profile"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","body":""}]},{"name":"Read another user's Additional profile fields","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/profile/{userId}/extras","host":["{{baseUrl}}"],"path":["v1","profile",":userId","extras"],"variable":[{"key":"userId","value":"","description":"Path parameter: userId"}]},"description":"Read another user's Additional profile fields\n\nHR-sensitive fields (`phone`, `emergencyContact`) are returned as `null` unless the caller is the user themselves, anywhere in their manager chain, or holds the workspace OWNER role. The `hrFiltered` flag on the response indicates whether filtering was applied.\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `profile:read`\n**Tags:** Profile"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","body":""}]},{"name":"Read another user's About page","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/profile/{userId}/about","host":["{{baseUrl}}"],"path":["v1","profile",":userId","about"],"variable":[{"key":"userId","value":"","description":"Path parameter: userId"}]},"description":"Read another user's About page\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `profile:read`\n**Tags:** Profile"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","body":""}]},{"name":"List managers up the chain (closest first, root last)","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/profile/{userId}/manager-chain","host":["{{baseUrl}}"],"path":["v1","profile",":userId","manager-chain"],"variable":[{"key":"userId","value":"","description":"Path parameter: userId"}]},"description":"List managers up the chain (closest first, root last)\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `profile:read`\n**Tags:** Profile"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","body":""}]},{"name":"List direct reports of the user","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/profile/{userId}/direct-reports","host":["{{baseUrl}}"],"path":["v1","profile",":userId","direct-reports"],"variable":[{"key":"userId","value":"","description":"Path parameter: userId"}]},"description":"List direct reports of the user\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `profile:read`\n**Tags:** Profile"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","body":""}]},{"name":"Tenant-wide org chart derived from `managerId` graph","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/profile/org-chart","host":["{{baseUrl}}"],"path":["v1","profile","org-chart"]},"description":"Tenant-wide org chart derived from `managerId` graph\n\nReturns `roots` (users with no manager) and `unparented` (users whose manager is outside the tenant). Each node carries its `reports` array recursively.\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `profile:read`\n**Tags:** Profile"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","body":""}]}]},{"name":"Projects","item":[{"name":"List tasks in a project","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/projects/{id}/tasks","host":["{{baseUrl}}"],"path":["v1","projects",":id","tasks"],"variable":[{"key":"id","value":"","description":"Path parameter: id"}]},"description":"List tasks in a project\n\nCursor-paginated task list scoped to one project. The default page size is 50, max 200 - pass `cursor` from the previous response's `nextCursor` to walk further. `nextCursor` is `null` on the last page. Soft-deleted tasks are filtered out by default; pass `?includeDeleted=true` to include them.\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `tasks:read`, `projects:read`\n**Tags:** Projects"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"items\": [\n    {\n      \"id\": \"tsk_01HW3T...\",\n      \"tenantId\": \"tnt_01HW3T...\",\n      \"projectId\": \"prj_01HW3T...\",\n      \"parentId\": \"string\",\n      \"title\": \"Ship public API + MCP\",\n      \"description\": \"string\",\n      \"visibility\": \"SHARED\",\n      \"recurrence\": \"NONE\",\n      \"priority\": \"NONE\",\n      \"status\": \"string\",\n      \"version\": 0,\n      \"dueOn\": \"2026-01-01T00:00:00.000Z\",\n      \"startsOn\": \"2026-01-01T00:00:00.000Z\",\n      \"remindAt\": \"2026-01-01T00:00:00.000Z\",\n      \"estimateMin\": 0,\n      \"deletedAt\": \"2026-01-01T00:00:00.000Z\",\n      \"createdAt\": \"2026-01-01T00:00:00.000Z\",\n      \"updatedAt\": \"2026-01-01T00:00:00.000Z\"\n    }\n  ],\n  \"nextCursor\": \"string\"\n}"}]},{"name":"List project-to-project dependencies for a project","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/project-dependencies","host":["{{baseUrl}}"],"path":["v1","project-dependencies"],"query":[{"key":"projectId","value":"","disabled":false},{"key":"direction","value":"","disabled":true}]},"description":"List project-to-project dependencies for a project\n\nReturns every live dependency edge involving the queried project. `direction=from` returns outgoing edges (this project blocks / relates / duplicates others), `direction=to` returns incoming edges. Omitting `direction` returns both. Each item carries the peer project name + status for at-a-glance display.\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `projects:read`\n**Tags:** Projects"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","body":""}]},{"name":"Create a project-to-project dependency","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/project-dependencies","host":["{{baseUrl}}"],"path":["v1","project-dependencies"]},"description":"Create a project-to-project dependency\n\nCreates a directed edge between two projects. `kind` defaults to BLOCKS; the server runs DFS-based cycle detection and rejects edges that would close a loop. Self-loops (`fromProjectId == toProjectId`) are rejected at the schema level.\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `projects:write`\n**Tags:** Projects","body":{"mode":"raw","raw":"{}","options":{"raw":{"language":"json"}}}},"response":[{"name":"Sample 201","status":"Created","code":201,"_postman_previewlanguage":"json","body":""}]},{"name":"Soft-delete a project dependency","request":{"method":"DELETE","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/project-dependencies/{id}","host":["{{baseUrl}}"],"path":["v1","project-dependencies",":id"],"variable":[{"key":"id","value":"","description":"Path parameter: id"}]},"description":"Soft-delete a project dependency\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `projects:write`\n**Tags:** Projects"},"response":[{"name":"Sample 204","status":"Deleted","code":204,"_postman_previewlanguage":"json","body":""}]},{"name":"List risks on a project","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/project-risks","host":["{{baseUrl}}"],"path":["v1","project-risks"],"query":[{"key":"projectId","value":"","disabled":false},{"key":"status","value":"","disabled":true}]},"description":"List risks on a project\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `projects:read`\n**Tags:** Projects"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","body":""}]},{"name":"Open a new project risk","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/project-risks","host":["{{baseUrl}}"],"path":["v1","project-risks"]},"description":"Open a new project risk\n\nFiles a new risk on `projectId`. Required body: `projectId`, `title`, `likelihood` (1-5), `impact` (1-5). Optional: `description`, `mitigation`, `ownerId`, `status` (defaults to `OPEN`). The product of `likelihood * impact` (1-25) drives the rollup's severity flag: ≥12 promotes the project badge to AMBER, ≥20 to RED.\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `projects:write`\n**Tags:** Projects","body":{"mode":"raw","raw":"{}","options":{"raw":{"language":"json"}}}},"response":[{"name":"Sample 201","status":"Created","code":201,"_postman_previewlanguage":"json","body":""}]},{"name":"List projects","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/projects","host":["{{baseUrl}}"],"path":["v1","projects"],"query":[{"key":"teamId","value":"","disabled":true},{"key":"status","value":"","disabled":true},{"key":"includeArchived","value":"","disabled":true},{"key":"cursor","value":"","disabled":true},{"key":"limit","value":"","disabled":true}]},"description":"List projects\n\nCursor-paginated. Filters: `teamId`, `status`, `includeArchived`. Default page size 50, max 100.\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `projects:read`\n**Tags:** Projects"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"items\": [\n    {\n      \"id\": null,\n      \"tenantId\": null,\n      \"teamId\": null,\n      \"name\": null,\n      \"status\": null,\n      \"ownerId\": null,\n      \"version\": null,\n      \"startsOn\": null,\n      \"endsOn\": null,\n      \"archivedAt\": null,\n      \"customAttributes\": null,\n      \"createdAt\": null,\n      \"updatedAt\": null\n    }\n  ],\n  \"nextCursor\": \"string\"\n}"}]},{"name":"Create a project","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true},{"key":"Idempotency-Key","value":"","type":"text","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/projects","host":["{{baseUrl}}"],"path":["v1","projects"]},"description":"Create a project\n\nMinimal body is `{ teamId, name }`; everything else has a server default. Status defaults to `PLANNED`, owner to the caller.\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `projects:write`\n**Tags:** Projects","body":{"mode":"raw","raw":"{\n  \"teamId\": \"string\",\n  \"name\": \"string\",\n  \"status\": \"PLANNED\",\n  \"ownerId\": \"string\",\n  \"startsOn\": \"2026-01-01T00:00:00.000Z\",\n  \"endsOn\": \"2026-01-01T00:00:00.000Z\",\n  \"labelIds\": [\n    \"string\"\n  ],\n  \"customAttributes\": {}\n}","options":{"raw":{"language":"json"}}}},"response":[{"name":"Sample 201","status":"Created","code":201,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"id\": \"prj_01HW3T...\",\n  \"tenantId\": \"string\",\n  \"teamId\": \"string\",\n  \"name\": \"string\",\n  \"status\": \"PLANNED\",\n  \"ownerId\": \"string\",\n  \"version\": 0,\n  \"startsOn\": \"2026-01-01T00:00:00.000Z\",\n  \"endsOn\": \"2026-01-01T00:00:00.000Z\",\n  \"archivedAt\": \"2026-01-01T00:00:00.000Z\",\n  \"customAttributes\": {},\n  \"createdAt\": \"2026-01-01T00:00:00.000Z\",\n  \"updatedAt\": \"2026-01-01T00:00:00.000Z\"\n}"}]},{"name":"Read a project","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/projects/{id}","host":["{{baseUrl}}"],"path":["v1","projects",":id"],"variable":[{"key":"id","value":"","description":"Path parameter: id"}]},"description":"Read a project\n\nReturns 404 if archived or owned by a different tenant - never leaks cross-tenant existence.\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `projects:read`\n**Tags:** Projects"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"id\": \"prj_01HW3T...\",\n  \"tenantId\": \"string\",\n  \"teamId\": \"string\",\n  \"name\": \"string\",\n  \"status\": \"PLANNED\",\n  \"ownerId\": \"string\",\n  \"version\": 0,\n  \"startsOn\": \"2026-01-01T00:00:00.000Z\",\n  \"endsOn\": \"2026-01-01T00:00:00.000Z\",\n  \"archivedAt\": \"2026-01-01T00:00:00.000Z\",\n  \"customAttributes\": {},\n  \"createdAt\": \"2026-01-01T00:00:00.000Z\",\n  \"updatedAt\": \"2026-01-01T00:00:00.000Z\"\n}"}]},{"name":"Update a project (optimistic concurrency)","request":{"method":"PATCH","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true},{"key":"If-Match","value":"","type":"text","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/projects/{id}","host":["{{baseUrl}}"],"path":["v1","projects",":id"],"variable":[{"key":"id","value":"","description":"Path parameter: id"}]},"description":"Update a project (optimistic concurrency)\n\nPartial body. Send `If-Match: <version>` or `version` in the body to enable optimistic concurrency - a stale version returns 409 instead of overwriting newer state.\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `projects:write`\n**Tags:** Projects","body":{"mode":"raw","raw":"{\n  \"name\": \"string\",\n  \"teamId\": \"string\",\n  \"status\": \"PLANNED\",\n  \"ownerId\": \"string\",\n  \"startsOn\": \"2026-01-01T00:00:00.000Z\",\n  \"endsOn\": \"2026-01-01T00:00:00.000Z\",\n  \"labelIds\": [\n    \"string\"\n  ],\n  \"customAttributes\": {},\n  \"version\": 0\n}","options":{"raw":{"language":"json"}}}},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"id\": \"prj_01HW3T...\",\n  \"tenantId\": \"string\",\n  \"teamId\": \"string\",\n  \"name\": \"string\",\n  \"status\": \"PLANNED\",\n  \"ownerId\": \"string\",\n  \"version\": 0,\n  \"startsOn\": \"2026-01-01T00:00:00.000Z\",\n  \"endsOn\": \"2026-01-01T00:00:00.000Z\",\n  \"archivedAt\": \"2026-01-01T00:00:00.000Z\",\n  \"customAttributes\": {},\n  \"createdAt\": \"2026-01-01T00:00:00.000Z\",\n  \"updatedAt\": \"2026-01-01T00:00:00.000Z\"\n}"}]},{"name":"Soft-delete a project","request":{"method":"DELETE","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/projects/{id}","host":["{{baseUrl}}"],"path":["v1","projects",":id"],"variable":[{"key":"id","value":"","description":"Path parameter: id"}]},"description":"Soft-delete a project\n\nSets `deletedAt`; the row stops appearing in list / search. Tasks inside the project are unaffected. Idempotent.\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `projects:write`\n**Tags:** Projects"},"response":[{"name":"Sample 204","status":"Deleted","code":204,"_postman_previewlanguage":"json","body":""}]},{"name":"Archive a project","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/projects/{id}/archive","host":["{{baseUrl}}"],"path":["v1","projects",":id","archive"],"variable":[{"key":"id","value":"","description":"Path parameter: id"}]},"description":"Archive a project\n\nSets `archivedAt`; the project disappears from default list views but its data is retained.\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `projects:write`\n**Tags:** Projects"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"id\": \"prj_01HW3T...\",\n  \"tenantId\": \"string\",\n  \"teamId\": \"string\",\n  \"name\": \"string\",\n  \"status\": \"PLANNED\",\n  \"ownerId\": \"string\",\n  \"version\": 0,\n  \"startsOn\": \"2026-01-01T00:00:00.000Z\",\n  \"endsOn\": \"2026-01-01T00:00:00.000Z\",\n  \"archivedAt\": \"2026-01-01T00:00:00.000Z\",\n  \"customAttributes\": {},\n  \"createdAt\": \"2026-01-01T00:00:00.000Z\",\n  \"updatedAt\": \"2026-01-01T00:00:00.000Z\"\n}"}]},{"name":"Restore an archived project","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/projects/{id}/restore","host":["{{baseUrl}}"],"path":["v1","projects",":id","restore"],"variable":[{"key":"id","value":"","description":"Path parameter: id"}]},"description":"Restore an archived project\n\nClears `archivedAt`. Idempotent.\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `projects:write`\n**Tags:** Projects"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"id\": \"prj_01HW3T...\",\n  \"tenantId\": \"string\",\n  \"teamId\": \"string\",\n  \"name\": \"string\",\n  \"status\": \"PLANNED\",\n  \"ownerId\": \"string\",\n  \"version\": 0,\n  \"startsOn\": \"2026-01-01T00:00:00.000Z\",\n  \"endsOn\": \"2026-01-01T00:00:00.000Z\",\n  \"archivedAt\": \"2026-01-01T00:00:00.000Z\",\n  \"customAttributes\": {},\n  \"createdAt\": \"2026-01-01T00:00:00.000Z\",\n  \"updatedAt\": \"2026-01-01T00:00:00.000Z\"\n}"}]},{"name":"Transfer project ownership to another user","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/projects/{id}/transfer","host":["{{baseUrl}}"],"path":["v1","projects",":id","transfer"],"variable":[{"key":"id","value":"","description":"Path parameter: id"}]},"description":"Transfer project ownership to another user\n\nAudits the old/new owner pair. Caller must be the current owner or have admin permissions.\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `projects:write`\n**Tags:** Projects","body":{"mode":"raw","raw":"{\n  \"newOwnerId\": \"string\"\n}","options":{"raw":{"language":"json"}}}},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"id\": \"prj_01HW3T...\",\n  \"tenantId\": \"string\",\n  \"teamId\": \"string\",\n  \"name\": \"string\",\n  \"status\": \"PLANNED\",\n  \"ownerId\": \"string\",\n  \"version\": 0,\n  \"startsOn\": \"2026-01-01T00:00:00.000Z\",\n  \"endsOn\": \"2026-01-01T00:00:00.000Z\",\n  \"archivedAt\": \"2026-01-01T00:00:00.000Z\",\n  \"customAttributes\": {},\n  \"createdAt\": \"2026-01-01T00:00:00.000Z\",\n  \"updatedAt\": \"2026-01-01T00:00:00.000Z\"\n}"}]},{"name":"Read aggregate task counters for a project","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/projects/{id}/summary-counts","host":["{{baseUrl}}"],"path":["v1","projects",":id","summary-counts"],"variable":[{"key":"id","value":"","description":"Path parameter: id"}]},"description":"Read aggregate task counters for a project\n\nTotal / done / in-progress / overdue counts + a progress percentage. O(1) - backed by a counters table.\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `projects:read`\n**Tags:** Projects"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"projectId\": \"string\",\n  \"totalTasks\": 0,\n  \"doneTasks\": 0,\n  \"inProgressTasks\": 0,\n  \"overdueTasks\": 0,\n  \"progressPct\": 0\n}"}]},{"name":"Read milestone rollup for a project","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/projects/{id}/milestone-rollup","host":["{{baseUrl}}"],"path":["v1","projects",":id","milestone-rollup"],"variable":[{"key":"id","value":"","description":"Path parameter: id"}]},"description":"Read milestone rollup for a project\n\nAggregates milestone counts by status, surfaces the nearest upcoming due date, and flags at-risk milestones.\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `projects:read`\n**Tags:** Projects"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"projectId\": \"string\",\n  \"milestones\": [\n    {\n      \"id\": \"mil_01HW3T...\",\n      \"projectId\": \"string\",\n      \"name\": \"string\",\n      \"description\": \"string\",\n      \"status\": null,\n      \"dueOn\": \"2026-01-01T00:00:00.000Z\",\n      \"completedAt\": \"2026-01-01T00:00:00.000Z\",\n      \"order\": 0,\n      \"createdAt\": \"2026-01-01T00:00:00.000Z\",\n      \"updatedAt\": \"2026-01-01T00:00:00.000Z\"\n    }\n  ],\n  \"nextDueAt\": \"2026-01-01T00:00:00.000Z\",\n  \"atRiskCount\": 0\n}"}]},{"name":"List milestones across all projects (filter by projectId)","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/project-milestones","host":["{{baseUrl}}"],"path":["v1","project-milestones"],"query":[{"key":"projectId","value":"","disabled":true},{"key":"status","value":"","disabled":true}]},"description":"List milestones across all projects (filter by projectId)\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `projects:read`\n**Tags:** Projects"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"items\": [\n    {\n      \"id\": \"mil_01HW3T...\",\n      \"projectId\": \"string\",\n      \"name\": \"string\",\n      \"description\": \"string\",\n      \"status\": null,\n      \"dueOn\": \"2026-01-01T00:00:00.000Z\",\n      \"completedAt\": \"2026-01-01T00:00:00.000Z\",\n      \"order\": 0,\n      \"createdAt\": \"2026-01-01T00:00:00.000Z\",\n      \"updatedAt\": \"2026-01-01T00:00:00.000Z\"\n    }\n  ]\n}"}]},{"name":"Create a project milestone","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/project-milestones","host":["{{baseUrl}}"],"path":["v1","project-milestones"]},"description":"Create a project milestone\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `projects:write`\n**Tags:** Projects","body":{"mode":"raw","raw":"{\n  \"projectId\": \"string\",\n  \"name\": \"string\",\n  \"description\": \"string\",\n  \"dueOn\": \"2026-01-01T00:00:00.000Z\",\n  \"status\": \"PENDING\",\n  \"order\": 0\n}","options":{"raw":{"language":"json"}}}},"response":[{"name":"Sample 201","status":"Created","code":201,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"id\": \"mil_01HW3T...\",\n  \"projectId\": \"string\",\n  \"name\": \"string\",\n  \"description\": \"string\",\n  \"status\": \"PENDING\",\n  \"dueOn\": \"2026-01-01T00:00:00.000Z\",\n  \"completedAt\": \"2026-01-01T00:00:00.000Z\",\n  \"order\": 0,\n  \"createdAt\": \"2026-01-01T00:00:00.000Z\",\n  \"updatedAt\": \"2026-01-01T00:00:00.000Z\"\n}"}]},{"name":"Read a single milestone","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/project-milestones/{id}","host":["{{baseUrl}}"],"path":["v1","project-milestones",":id"],"variable":[{"key":"id","value":"","description":"Path parameter: id"}]},"description":"Read a single milestone\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `projects:read`\n**Tags:** Projects"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"id\": \"mil_01HW3T...\",\n  \"projectId\": \"string\",\n  \"name\": \"string\",\n  \"description\": \"string\",\n  \"status\": \"PENDING\",\n  \"dueOn\": \"2026-01-01T00:00:00.000Z\",\n  \"completedAt\": \"2026-01-01T00:00:00.000Z\",\n  \"order\": 0,\n  \"createdAt\": \"2026-01-01T00:00:00.000Z\",\n  \"updatedAt\": \"2026-01-01T00:00:00.000Z\"\n}"}]},{"name":"Update a milestone","request":{"method":"PATCH","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/project-milestones/{id}","host":["{{baseUrl}}"],"path":["v1","project-milestones",":id"],"variable":[{"key":"id","value":"","description":"Path parameter: id"}]},"description":"Update a milestone\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `projects:write`\n**Tags:** Projects","body":{"mode":"raw","raw":"{\n  \"name\": \"string\",\n  \"description\": \"string\",\n  \"status\": \"PENDING\",\n  \"dueOn\": \"2026-01-01T00:00:00.000Z\",\n  \"completedAt\": \"2026-01-01T00:00:00.000Z\",\n  \"order\": 0\n}","options":{"raw":{"language":"json"}}}},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"id\": \"mil_01HW3T...\",\n  \"projectId\": \"string\",\n  \"name\": \"string\",\n  \"description\": \"string\",\n  \"status\": \"PENDING\",\n  \"dueOn\": \"2026-01-01T00:00:00.000Z\",\n  \"completedAt\": \"2026-01-01T00:00:00.000Z\",\n  \"order\": 0,\n  \"createdAt\": \"2026-01-01T00:00:00.000Z\",\n  \"updatedAt\": \"2026-01-01T00:00:00.000Z\"\n}"}]},{"name":"Delete a milestone","request":{"method":"DELETE","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/project-milestones/{id}","host":["{{baseUrl}}"],"path":["v1","project-milestones",":id"],"variable":[{"key":"id","value":"","description":"Path parameter: id"}]},"description":"Delete a milestone\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `projects:write`\n**Tags:** Projects"},"response":[{"name":"Sample 204","status":"Deleted","code":204,"_postman_previewlanguage":"json","body":""}]},{"name":"List baselines (point-in-time snapshots) for a project","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/projects/{projectId}/baselines","host":["{{baseUrl}}"],"path":["v1","projects",":projectId","baselines"],"variable":[{"key":"projectId","value":"","description":"Path parameter: projectId"}]},"description":"List baselines (point-in-time snapshots) for a project\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `projects:read`\n**Tags:** Projects"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"items\": [\n    {\n      \"id\": \"bsl_01HW3T...\",\n      \"projectId\": \"string\",\n      \"name\": \"string\",\n      \"description\": \"string\",\n      \"capturedAt\": \"2026-01-01T00:00:00.000Z\",\n      \"capturedById\": \"string\",\n      \"taskCount\": 0\n    }\n  ]\n}"}]},{"name":"Capture a new baseline snapshot","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/projects/{projectId}/baselines","host":["{{baseUrl}}"],"path":["v1","projects",":projectId","baselines"],"variable":[{"key":"projectId","value":"","description":"Path parameter: projectId"}]},"description":"Capture a new baseline snapshot\n\nSnapshots every task's current schedule + status. Used later via the delta endpoint to compute slippage.\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `projects:write`\n**Tags:** Projects","body":{"mode":"raw","raw":"{\n  \"name\": \"string\",\n  \"description\": \"string\"\n}","options":{"raw":{"language":"json"}}}},"response":[{"name":"Sample 201","status":"Created","code":201,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"id\": \"bsl_01HW3T...\",\n  \"projectId\": \"string\",\n  \"name\": \"string\",\n  \"description\": \"string\",\n  \"capturedAt\": \"2026-01-01T00:00:00.000Z\",\n  \"capturedById\": \"string\",\n  \"taskCount\": 0\n}"}]},{"name":"Read a single baseline","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/projects/{projectId}/baselines/{baselineId}","host":["{{baseUrl}}"],"path":["v1","projects",":projectId","baselines",":baselineId"],"variable":[{"key":"projectId","value":"","description":"Path parameter: projectId"},{"key":"baselineId","value":"","description":"Path parameter: baselineId"}]},"description":"Read a single baseline\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `projects:read`\n**Tags:** Projects"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"id\": \"bsl_01HW3T...\",\n  \"projectId\": \"string\",\n  \"name\": \"string\",\n  \"description\": \"string\",\n  \"capturedAt\": \"2026-01-01T00:00:00.000Z\",\n  \"capturedById\": \"string\",\n  \"taskCount\": 0\n}"}]},{"name":"Delete a baseline","request":{"method":"DELETE","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/projects/{projectId}/baselines/{baselineId}","host":["{{baseUrl}}"],"path":["v1","projects",":projectId","baselines",":baselineId"],"variable":[{"key":"projectId","value":"","description":"Path parameter: projectId"},{"key":"baselineId","value":"","description":"Path parameter: baselineId"}]},"description":"Delete a baseline\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `projects:write`\n**Tags:** Projects"},"response":[{"name":"Sample 204","status":"Deleted","code":204,"_postman_previewlanguage":"json","body":""}]},{"name":"Compute slippage delta against a baseline","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/projects/{projectId}/baselines/{baselineId}/delta","host":["{{baseUrl}}"],"path":["v1","projects",":projectId","baselines",":baselineId","delta"],"variable":[{"key":"projectId","value":"","description":"Path parameter: projectId"},{"key":"baselineId","value":"","description":"Path parameter: baselineId"}]},"description":"Compute slippage delta against a baseline\n\nFor each task, returns baseline vs current schedule and a per-row `slippedDays` integer. Summarises on-time / slipped / added / removed counts.\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `projects:read`\n**Tags:** Projects"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"baselineId\": \"string\",\n  \"capturedAt\": \"2026-01-01T00:00:00.000Z\",\n  \"rows\": [\n    {\n      \"taskId\": null,\n      \"title\": null,\n      \"baselineDueOn\": null,\n      \"currentDueOn\": null,\n      \"slippedDays\": null,\n      \"status\": null\n    }\n  ],\n  \"summary\": {\n    \"onTimeCount\": 0,\n    \"slippedCount\": 0,\n    \"addedCount\": 0,\n    \"removedCount\": 0\n  }\n}"}]},{"name":"List system-shipped starter project templates","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/projects/templates/starters","host":["{{baseUrl}}"],"path":["v1","projects","templates","starters"]},"description":"List system-shipped starter project templates\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `projects:read`\n**Tags:** Projects"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"items\": [\n    {\n      \"id\": \"ptpl_01HW3T...\",\n      \"name\": \"string\",\n      \"description\": \"string\",\n      \"isStarter\": false,\n      \"payload\": {},\n      \"createdAt\": \"2026-01-01T00:00:00.000Z\"\n    }\n  ]\n}"}]},{"name":"Save a project as a reusable template","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/projects/{id}/save-as-template","host":["{{baseUrl}}"],"path":["v1","projects",":id","save-as-template"],"variable":[{"key":"id","value":"","description":"Path parameter: id"}]},"description":"Save a project as a reusable template\n\nSnapshots the project + its tasks + milestones into a template the tenant can later instantiate.\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `projects:write`\n**Tags:** Projects","body":{"mode":"raw","raw":"{\n  \"name\": \"string\",\n  \"description\": \"string\"\n}","options":{"raw":{"language":"json"}}}},"response":[{"name":"Sample 201","status":"Created","code":201,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"id\": \"ptpl_01HW3T...\",\n  \"name\": \"string\",\n  \"description\": \"string\",\n  \"isStarter\": false,\n  \"payload\": {},\n  \"createdAt\": \"2026-01-01T00:00:00.000Z\"\n}"}]},{"name":"Create a new project from a template","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/projects/from-template","host":["{{baseUrl}}"],"path":["v1","projects","from-template"]},"description":"Create a new project from a template\n\nInstantiates a project + tasks + milestones from a saved template. Optional `startsOn` shifts all dates by the same delta.\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `projects:write`\n**Tags:** Projects","body":{"mode":"raw","raw":"{\n  \"templateId\": \"string\",\n  \"teamId\": \"string\",\n  \"name\": \"string\",\n  \"startsOn\": \"2026-01-01T00:00:00.000Z\",\n  \"ownerId\": \"string\"\n}","options":{"raw":{"language":"json"}}}},"response":[{"name":"Sample 201","status":"Created","code":201,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"id\": \"prj_01HW3T...\",\n  \"tenantId\": \"string\",\n  \"teamId\": \"string\",\n  \"name\": \"string\",\n  \"status\": \"PLANNED\",\n  \"ownerId\": \"string\",\n  \"version\": 0,\n  \"startsOn\": \"2026-01-01T00:00:00.000Z\",\n  \"endsOn\": \"2026-01-01T00:00:00.000Z\",\n  \"archivedAt\": \"2026-01-01T00:00:00.000Z\",\n  \"customAttributes\": {},\n  \"createdAt\": \"2026-01-01T00:00:00.000Z\",\n  \"updatedAt\": \"2026-01-01T00:00:00.000Z\"\n}"}]},{"name":"Risk roll-up for a project (active count, exposure, suggested RAG)","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/project-risks/rollup","host":["{{baseUrl}}"],"path":["v1","project-risks","rollup"],"query":[{"key":"projectId","value":"","disabled":false}]},"description":"Risk roll-up for a project (active count, exposure, suggested RAG)\n\nReturns the aggregate risk shape used by the project health badge: `active` (open + mitigating count), `exposure` (sum of likelihood*impact across active risks), `severeCount` (>=12), and a suggested RAG flag (`GREEN | AMBER | RED`).\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `projects:read`\n**Tags:** Projects"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","body":""}]},{"name":"Update a project risk","request":{"method":"PATCH","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/project-risks/{id}","host":["{{baseUrl}}"],"path":["v1","project-risks",":id"],"variable":[{"key":"id","value":"","description":"Path parameter: id"}]},"description":"Update a project risk\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `projects:write`\n**Tags:** Projects","body":{"mode":"raw","raw":"{}","options":{"raw":{"language":"json"}}}},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","body":""}]},{"name":"Soft-delete a project risk","request":{"method":"DELETE","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/project-risks/{id}","host":["{{baseUrl}}"],"path":["v1","project-risks",":id"],"variable":[{"key":"id","value":"","description":"Path parameter: id"}]},"description":"Soft-delete a project risk\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `projects:write`\n**Tags:** Projects"},"response":[{"name":"Sample 204","status":"Deleted","code":204,"_postman_previewlanguage":"json","body":""}]},{"name":"Read the budget snapshot for a project (planned vs actual)","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/projects/{id}/budget","host":["{{baseUrl}}"],"path":["v1","projects",":id","budget"],"variable":[{"key":"id","value":"","description":"Path parameter: id"}]},"description":"Read the budget snapshot for a project (planned vs actual)\n\nReturns the planned envelope (minutes + cents + currency), the actual minutes (rolled up from closed time entries), the variance, and a per-task breakdown of the top-25 contributors.\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `projects:read`\n**Tags:** Projects"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","body":""}]},{"name":"Update the planned budget for a project","request":{"method":"PATCH","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/projects/{id}/budget","host":["{{baseUrl}}"],"path":["v1","projects",":id","budget"],"variable":[{"key":"id","value":"","description":"Path parameter: id"}]},"description":"Update the planned budget for a project\n\nSet or clear `plannedBudgetMinutes`, `plannedBudgetCurrencyCents`, and `plannedBudgetCurrency`. Pass `null` to clear a value. The actual minutes / variance fields refresh on read.\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `projects:write`\n**Tags:** Projects","body":{"mode":"raw","raw":"{}","options":{"raw":{"language":"json"}}}},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","body":""}]},{"name":"List Objectives + Key Results linked to a project","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/projects/{id}/okrs","host":["{{baseUrl}}"],"path":["v1","projects",":id","okrs"],"variable":[{"key":"id","value":"","description":"Path parameter: id"}]},"description":"List Objectives + Key Results linked to a project\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `goals:read`, `projects:read`\n**Tags:** Projects, Goals"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","body":""}]},{"name":"Read milestones + tasks as a Gantt-ready timeline","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/projects/{id}/timeline","host":["{{baseUrl}}"],"path":["v1","projects",":id","timeline"],"variable":[{"key":"id","value":"","description":"Path parameter: id"}],"query":[{"key":"from","value":"","disabled":true},{"key":"to","value":"","disabled":true}]},"description":"Read milestones + tasks as a Gantt-ready timeline\n\nReturns a flat list of milestone and task items with start/end dates, parent grouping, status, and dependency edges. The optional `from` / `to` window defaults to the project bounds (or the project createdAt + 30 days when no bounds are set).\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `projects:read`\n**Tags:** Projects"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","body":""}]},{"name":"Read the daily burn-down (scope, completed, remaining)","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/projects/{id}/insights/burndown","host":["{{baseUrl}}"],"path":["v1","projects",":id","insights","burndown"],"variable":[{"key":"id","value":"","description":"Path parameter: id"}],"query":[{"key":"from","value":"","disabled":true},{"key":"to","value":"","disabled":true}]},"description":"Read the daily burn-down (scope, completed, remaining)\n\nFor each UTC day in the window, returns total scope minutes, cumulative completed minutes, and remaining minutes. Also returns the linear ideal-line endpoints so the front-end can render both lines without re-deriving the math. Default window is the last 14 days; pass `from` / `to` ISO timestamps to override.\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `projects:read`\n**Tags:** Projects"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","body":""}]},{"name":"Read cycle-time histogram, p50 / p90, and 7-day velocity","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/projects/{id}/insights/cycle-time","host":["{{baseUrl}}"],"path":["v1","projects",":id","insights","cycle-time"],"variable":[{"key":"id","value":"","description":"Path parameter: id"}],"query":[{"key":"bucketDays","value":"","disabled":true}]},"description":"Read cycle-time histogram, p50 / p90, and 7-day velocity\n\nReturns a histogram of cycle-time (days from create to done) bucketed by `bucketDays` (default 1), the p50 + p90 across completed tasks, the total sample size, and a velocity comparison of the last 7 days vs the prior 7 days.\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `projects:read`\n**Tags:** Projects"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","body":""}]},{"name":"Read the Slack + calendar bindings on a project","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/projects/{id}/integrations","host":["{{baseUrl}}"],"path":["v1","projects",":id","integrations"],"variable":[{"key":"id","value":"","description":"Path parameter: id"}]},"description":"Read the Slack + calendar bindings on a project\n\nReturns the current Slack workspace + channel binding and calendar connection bound to a project. All fields are nullable when no link exists.\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `projects:read`\n**Tags:** Projects"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","body":""}]},{"name":"Bind a project to a Slack workspace + channel (or clear it)","request":{"method":"PATCH","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/projects/{id}/slack","host":["{{baseUrl}}"],"path":["v1","projects",":id","slack"],"variable":[{"key":"id","value":"","description":"Path parameter: id"}]},"description":"Bind a project to a Slack workspace + channel (or clear it)\n\nPass `{\"binding\":{\"installationId\",\"channelId\",\"channelName\"}}` to bind, or `{\"binding\":null}` to unbind. Cross-tenant installations are rejected with 400.\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `projects:write`\n**Tags:** Projects, Slack","body":{"mode":"raw","raw":"{}","options":{"raw":{"language":"json"}}}},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","body":""}]},{"name":"Bind a project to a calendar connection (or clear it)","request":{"method":"PATCH","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/projects/{id}/calendar","host":["{{baseUrl}}"],"path":["v1","projects",":id","calendar"],"variable":[{"key":"id","value":"","description":"Path parameter: id"}]},"description":"Bind a project to a calendar connection (or clear it)\n\nPass `{\"binding\":{\"connectionId\"}}` to bind, or `{\"binding\":null}` to unbind. Cross-tenant connections are rejected with 400.\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `projects:write`\n**Tags:** Projects, Calendar","body":{"mode":"raw","raw":"{}","options":{"raw":{"language":"json"}}}},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","body":""}]},{"name":"List recent CSV / PDF / DECK exports for a project","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/projects/{id}/exports","host":["{{baseUrl}}"],"path":["v1","projects",":id","exports"],"variable":[{"key":"id","value":"","description":"Path parameter: id"}]},"description":"List recent CSV / PDF / DECK exports for a project\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `projects:read`\n**Tags:** Projects"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","body":""}]},{"name":"Kick off a new project export","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/projects/{id}/exports","host":["{{baseUrl}}"],"path":["v1","projects",":id","exports"],"variable":[{"key":"id","value":"","description":"Path parameter: id"}]},"description":"Kick off a new project export\n\nAccepts `{\"format\": \"CSV\" | \"PDF\" | \"DECK\"}`. CSV renders synchronously; PDF / DECK render an HTML status report the user opens in a new tab and prints. Returns the export row with `status: \"DONE\"` and a `downloadUrl`.\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `projects:write`\n**Tags:** Projects","body":{"mode":"raw","raw":"{}","options":{"raw":{"language":"json"}}}},"response":[{"name":"Sample 201","status":"Created","code":201,"_postman_previewlanguage":"json","body":""}]},{"name":"Download (CSV) or render (HTML for PDF / DECK) an export","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/projects/{id}/exports/{exportId}/download","host":["{{baseUrl}}"],"path":["v1","projects",":id","exports",":exportId","download"],"variable":[{"key":"id","value":"","description":"Path parameter: id"},{"key":"exportId","value":"","description":"Path parameter: exportId"}]},"description":"Download (CSV) or render (HTML for PDF / DECK) an export\n\nReturns the export body. CSV exports are served as `text/csv`. PDF and DECK exports return a printable HTML page; the user opens it in a new tab and uses the browser print dialog to save a PDF / set of slides. Expired downloads return `410 Gone`.\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `projects:read`\n**Tags:** Projects"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","body":""}]}]},{"name":"Push","item":[{"name":"List active push subscriptions for the calling user","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/push/subscriptions","host":["{{baseUrl}}"],"path":["v1","push","subscriptions"]},"description":"List active push subscriptions for the calling user\n\nReturns one row per device. Endpoints are digested (SHA-256 prefix) so the raw push URL never leaves the server.\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `profile:read`\n**Tags:** Push"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"items\": [\n    {\n      \"id\": \"psub_01HW3T2K8X9Y2VPRZGQX9NDY55\",\n      \"platform\": \"WEB\",\n      \"endpointDigest\": \"string\",\n      \"deviceLabel\": \"iPhone 15 - Safari\",\n      \"lastSeenAt\": \"2026-01-01T00:00:00.000Z\",\n      \"createdAt\": \"2026-01-01T00:00:00.000Z\"\n    }\n  ]\n}"}]},{"name":"Register a Web Push or Expo push subscription","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/push/subscribe","host":["{{baseUrl}}"],"path":["v1","push","subscribe"]},"description":"Register a Web Push or Expo push subscription\n\nDiscriminated by `platform`. WEB requires `endpoint` + `keys.{p256dh,auth}` (VAPID). EXPO requires `token` (or `endpoint` as alias) carrying the Expo push token. Idempotent on (`userId`, `endpoint`).\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `profile:read`\n**Tags:** Push","body":{"mode":"raw","raw":"{}","options":{"raw":{"language":"json"}}}},"response":[{"name":"Sample 201","status":"Registered","code":201,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"id\": \"string\",\n  \"platform\": \"WEB\"\n}"}]},{"name":"Unsubscribe a device by endpoint","request":{"method":"DELETE","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/push/subscribe","host":["{{baseUrl}}"],"path":["v1","push","subscribe"]},"description":"Unsubscribe a device by endpoint\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `profile:read`\n**Tags:** Push","body":{"mode":"raw","raw":"{\n  \"endpoint\": \"string\"\n}","options":{"raw":{"language":"json"}}}},"response":[{"name":"Sample 204","status":"Unsubscribed","code":204,"_postman_previewlanguage":"json","body":""}]},{"name":"Report push delivery / open / tap receipts","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/me/push/receipts","host":["{{baseUrl}}"],"path":["v1","me","push","receipts"]},"description":"Report push delivery / open / tap receipts\n\nMobile and web clients call this to confirm the OS handed the push to the app (`delivered`), the user saw it (`opened`), or the user tapped it (`tapped`). Powers the `/v1/super-admin/push/delivery-summary` open-rate / tap-rate dashboard.\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `profile:write`\n**Tags:** Push","body":{"mode":"raw","raw":"{\n  \"messageId\": \"string\",\n  \"event\": \"delivered\",\n  \"providerMessageId\": \"string\",\n  \"providerResponse\": {}\n}","options":{"raw":{"language":"json"}}}},"response":[{"name":"Sample 200","status":"Recorded","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"ok\": false\n}"}]},{"name":"Cross-tenant push delivery / open / tap aggregates (super admin)","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/super-admin/push/delivery-summary","host":["{{baseUrl}}"],"path":["v1","super-admin","push","delivery-summary"],"query":[{"key":"windowDays","value":"","disabled":true}]},"description":"Cross-tenant push delivery / open / tap aggregates (super admin)\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `profile:read`\n**Tags:** Push, SuperAdmin"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"windowDays\": 0,\n  \"totals\": {\n    \"attempted\": 0,\n    \"delivered\": 0,\n    \"opened\": 0,\n    \"tapped\": 0,\n    \"deliveryRate\": 0\n  },\n  \"providers\": [\n    {\n      \"provider\": \"expo\",\n      \"attempted\": 0,\n      \"delivered\": 0,\n      \"opened\": 0,\n      \"tapped\": 0,\n      \"deliveryRate\": 0,\n      \"openRate\": 0,\n      \"tapRate\": 0\n    }\n  ]\n}"}]}]},{"name":"RateLimits","item":[{"name":"Read the caller's rate-limit tier, buckets, and rolling usage","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/rate-limit-tiers/me","host":["{{baseUrl}}"],"path":["v1","rate-limit-tiers","me"]},"description":"Read the caller's rate-limit tier, buckets, and rolling usage\n\nPowers the `/settings/api-access` page. Returns the tier resolved from the tenant's billing plan, the per-class buckets, the full tier catalog for the comparison table, and a 60-minute rolling usage histogram for `read | write | ai`.\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `profile:read`\n**Tags:** RateLimits"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"tier\": \"free\",\n  \"label\": \"string\",\n  \"buckets\": {\n    \"read\": {\n      \"limit\": null,\n      \"windowMs\": null\n    },\n    \"write\": {\n      \"limit\": null,\n      \"windowMs\": null\n    },\n    \"ai\": {\n      \"limit\": null,\n      \"windowMs\": null\n    }\n  },\n  \"catalog\": [\n    {\n      \"tier\": null,\n      \"label\": null,\n      \"buckets\": null\n    }\n  ],\n  \"usage\": {\n    \"read\": {\n      \"endsAt\": null,\n      \"perMinute\": null,\n      \"total\": null\n    },\n    \"write\": {\n      \"endsAt\": null,\n      \"perMinute\": null,\n      \"total\": null\n    },\n    \"ai\": {\n      \"endsAt\": null,\n      \"perMinute\": null,\n      \"total\": null\n    }\n  }\n}"}]}]},{"name":"Slack","item":[{"name":"List Slack installations for the calling tenant","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/integrations/slack","host":["{{baseUrl}}"],"path":["v1","integrations","slack"]},"description":"List Slack installations for the calling tenant\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `profile:read`\n**Tags:** Slack, Integrations"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"items\": [\n    {\n      \"id\": \"string\",\n      \"teamId\": \"T0123456789\",\n      \"teamName\": \"Acme Industries\",\n      \"botUserId\": \"string\",\n      \"defaultChannelId\": \"string\",\n      \"installedById\": \"string\",\n      \"installedAt\": \"2026-01-01T00:00:00.000Z\"\n    }\n  ]\n}"}]},{"name":"Update a Slack installation (default channel)","request":{"method":"PATCH","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/integrations/slack/{id}","host":["{{baseUrl}}"],"path":["v1","integrations","slack",":id"],"variable":[{"key":"id","value":"","description":"Path parameter: id"}]},"description":"Update a Slack installation (default channel)\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `profile:write`\n**Tags:** Slack, Integrations","body":{"mode":"raw","raw":"{\n  \"defaultChannelId\": \"string\"\n}","options":{"raw":{"language":"json"}}}},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"id\": \"string\",\n  \"teamId\": \"T0123456789\",\n  \"teamName\": \"Acme Industries\",\n  \"botUserId\": \"string\",\n  \"defaultChannelId\": \"string\",\n  \"installedById\": \"string\",\n  \"installedAt\": \"2026-01-01T00:00:00.000Z\"\n}"}]},{"name":"Uninstall the Slack app for this tenant","request":{"method":"DELETE","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/integrations/slack/{id}","host":["{{baseUrl}}"],"path":["v1","integrations","slack",":id"],"variable":[{"key":"id","value":"","description":"Path parameter: id"}]},"description":"Uninstall the Slack app for this tenant\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `profile:write`\n**Tags:** Slack, Integrations"},"response":[{"name":"Sample 204","status":"Uninstalled","code":204,"_postman_previewlanguage":"json","body":""}]},{"name":"List joinable Slack channels for an installation","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/integrations/slack/installations/{id}/channels","host":["{{baseUrl}}"],"path":["v1","integrations","slack","installations",":id","channels"],"variable":[{"key":"id","value":"","description":"Path parameter: id"}],"query":[{"key":"cursor","value":"","disabled":true},{"key":"q","value":"","disabled":true}]},"description":"List joinable Slack channels for an installation\n\nReturns the workspace's public + private channels (archived and DMs filtered out) for a Slack installation owned by the calling tenant. Supports cursor-based pagination via Slack's `response_metadata.next_cursor`. Optional `q` is applied as a client-side substring filter ranked exact-match  starts-with  contains. Bot must be invited to a channel before posting; the response includes `isMember` so the caller can warn the user upfront. Responses are cached for 60s per (installation, cursor, query).\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `webhooks:manage`\n**Tags:** Slack"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","body":""}]}]},{"name":"Sso","item":[{"name":"Read the calling tenant's SAML connection (admin)","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/settings/sso","host":["{{baseUrl}}"],"path":["v1","settings","sso"]},"description":"Read the calling tenant's SAML connection (admin)\n\nReturns `{ configured: false }` when no SAML connection is set up; otherwise returns the public SAML row (no private key, only the cert fingerprint).\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `profile:read`\n**Tags:** Sso"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{}"}]},{"name":"Upsert the calling tenant's SAML connection (admin)","request":{"method":"PUT","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/settings/sso","host":["{{baseUrl}}"],"path":["v1","settings","sso"]},"description":"Upsert the calling tenant's SAML connection (admin)\n\nEither provide `idpMetadataXml` (Atlas parses it and back-fills the explicit fields) OR provide `entityId`, `ssoUrl`, and `x509Cert` directly. On UPDATE you can patch any subset; the service enforces required fields on the first create.\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `profile:write`\n**Tags:** Sso","body":{"mode":"raw","raw":"{\n  \"idpMetadataXml\": \"string\",\n  \"entityId\": \"string\",\n  \"ssoUrl\": \"https://example.com\",\n  \"x509Cert\": \"string\",\n  \"spEntityId\": \"string\",\n  \"wantAuthnRequestsSigned\": false,\n  \"wantAssertionsEncrypted\": false,\n  \"spPrivateKey\": \"string\",\n  \"provisioningMode\": \"TENANT_MEMBER\"\n}","options":{"raw":{"language":"json"}}}},"response":[{"name":"Sample 200","status":"Updated","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"id\": \"string\",\n  \"tenantSlug\": \"acme\",\n  \"configured\": false,\n  \"disabled\": false,\n  \"entityId\": \"string\",\n  \"ssoUrl\": \"https://example.com\",\n  \"spEntityId\": \"string\",\n  \"wantAuthnRequestsSigned\": false,\n  \"wantAssertionsEncrypted\": false,\n  \"provisioningMode\": \"TENANT_MEMBER\",\n  \"attributeMap\": {},\n  \"groupRoleMap\": {},\n  \"x509CertFingerprint\": \"string\",\n  \"spMetadataUrl\": \"https://example.com\",\n  \"createdAt\": \"2026-01-01T00:00:00.000Z\",\n  \"updatedAt\": \"2026-01-01T00:00:00.000Z\"\n}"}]},{"name":"Disable the SAML connection (soft-disable; preserves config)","request":{"method":"DELETE","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/settings/sso","host":["{{baseUrl}}"],"path":["v1","settings","sso"]},"description":"Disable the SAML connection (soft-disable; preserves config)\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `profile:write`\n**Tags:** Sso"},"response":[{"name":"Sample 204","status":"Disabled","code":204,"_postman_previewlanguage":"json","body":""}]},{"name":"Dry-run verify a sample SAMLResponse against the tenant's connection","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/settings/sso/test","host":["{{baseUrl}}"],"path":["v1","settings","sso","test"]},"description":"Dry-run verify a sample SAMLResponse against the tenant's connection\n\nUseful for diagnosing assertion-mapping issues without going through a full browser login. The response carries the parsed attributes, NameID, and (if present) signature verification result.\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `profile:write`\n**Tags:** Sso","body":{"mode":"raw","raw":"{\n  \"samlResponse\": \"string\"\n}","options":{"raw":{"language":"json"}}}},"response":[{"name":"Sample 200","status":"Verified","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"ok\": false,\n  \"assertion\": {\n    \"nameId\": \"string\",\n    \"email\": \"user@example.com\",\n    \"displayName\": \"string\",\n    \"firstName\": \"string\",\n    \"lastName\": \"string\",\n    \"attributes\": {},\n    \"responseId\": \"string\",\n    \"inResponseTo\": \"string\",\n    \"issuedAt\": \"2026-01-01T00:00:00.000Z\"\n  }\n}"}]},{"name":"SP metadata XML for IdP import (public)","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/sso/{tenantSlug}/metadata","host":["{{baseUrl}}"],"path":["v1","sso",":tenantSlug","metadata"],"variable":[{"key":"tenantSlug","value":"","description":"Path parameter: tenantSlug"}]},"description":"SP metadata XML for IdP import (public)\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `profile:read`\n**Tags:** Sso"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","body":""}]},{"name":"IdP-initiated entry (302 to the IdP with deflate+base64 AuthnRequest)","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/sso/{tenantSlug}/login","host":["{{baseUrl}}"],"path":["v1","sso",":tenantSlug","login"],"variable":[{"key":"tenantSlug","value":"","description":"Path parameter: tenantSlug"}],"query":[{"key":"relayState","value":"","disabled":true}]},"description":"IdP-initiated entry (302 to the IdP with deflate+base64 AuthnRequest)\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `profile:read`\n**Tags:** Sso"}},{"name":"Assertion Consumer Service (302 to app after refresh-cookie set)","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/sso/{tenantSlug}/acs","host":["{{baseUrl}}"],"path":["v1","sso",":tenantSlug","acs"],"variable":[{"key":"tenantSlug","value":"","description":"Path parameter: tenantSlug"}]},"description":"Assertion Consumer Service (302 to app after refresh-cookie set)\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `profile:write`\n**Tags:** Sso"}},{"name":"Single Logout - best-effort, always redirects to signed-out page","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/sso/{tenantSlug}/slo","host":["{{baseUrl}}"],"path":["v1","sso",":tenantSlug","slo"],"variable":[{"key":"tenantSlug","value":"","description":"Path parameter: tenantSlug"}],"query":[{"key":"SAMLRequest","value":"","disabled":true},{"key":"RelayState","value":"","disabled":true}]},"description":"Single Logout - best-effort, always redirects to signed-out page\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `profile:read`\n**Tags:** Sso"}},{"name":"Replace the SAML attribute → user-column map (super admin only)","request":{"method":"PATCH","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/admin/sso/saml/{id}/attribute-map","host":["{{baseUrl}}"],"path":["v1","admin","sso","saml",":id","attribute-map"],"variable":[{"key":"id","value":"","description":"Path parameter: id"}]},"description":"Replace the SAML attribute → user-column map (super admin only)\n\nLocked behind the SuperAdmin guard so a tenant ADMIN cannot edit attribute mappings on their own connection. Unknown atlas fields in the supplied map are silently dropped against the writable-column allowlist.\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `profile:write`\n**Tags:** Sso, SuperAdmin","body":{"mode":"raw","raw":"{\n  \"attributeMap\": {}\n}","options":{"raw":{"language":"json"}}}},"response":[{"name":"Sample 200","status":"Updated","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"id\": \"string\",\n  \"tenantSlug\": \"acme\",\n  \"configured\": false,\n  \"disabled\": false,\n  \"entityId\": \"string\",\n  \"ssoUrl\": \"https://example.com\",\n  \"spEntityId\": \"string\",\n  \"wantAuthnRequestsSigned\": false,\n  \"wantAssertionsEncrypted\": false,\n  \"provisioningMode\": \"TENANT_MEMBER\",\n  \"attributeMap\": {},\n  \"groupRoleMap\": {},\n  \"x509CertFingerprint\": \"string\",\n  \"spMetadataUrl\": \"https://example.com\",\n  \"createdAt\": \"2026-01-01T00:00:00.000Z\",\n  \"updatedAt\": \"2026-01-01T00:00:00.000Z\"\n}"}]},{"name":"Replace the SAML group → Atlas role map (super admin only)","request":{"method":"PATCH","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/admin/sso/saml/{id}/group-role-map","host":["{{baseUrl}}"],"path":["v1","admin","sso","saml",":id","group-role-map"],"variable":[{"key":"id","value":"","description":"Path parameter: id"}]},"description":"Replace the SAML group → Atlas role map (super admin only)\n\nLocked behind the SuperAdmin guard - this map can grant OWNER on a tenant, so a tenant ADMIN must NEVER be able to edit it on their own connection.\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `profile:write`\n**Tags:** Sso, SuperAdmin","body":{"mode":"raw","raw":"{\n  \"groupRoleMap\": {}\n}","options":{"raw":{"language":"json"}}}},"response":[{"name":"Sample 200","status":"Updated","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"id\": \"string\",\n  \"tenantSlug\": \"acme\",\n  \"configured\": false,\n  \"disabled\": false,\n  \"entityId\": \"string\",\n  \"ssoUrl\": \"https://example.com\",\n  \"spEntityId\": \"string\",\n  \"wantAuthnRequestsSigned\": false,\n  \"wantAssertionsEncrypted\": false,\n  \"provisioningMode\": \"TENANT_MEMBER\",\n  \"attributeMap\": {},\n  \"groupRoleMap\": {},\n  \"x509CertFingerprint\": \"string\",\n  \"spMetadataUrl\": \"https://example.com\",\n  \"createdAt\": \"2026-01-01T00:00:00.000Z\",\n  \"updatedAt\": \"2026-01-01T00:00:00.000Z\"\n}"}]}]},{"name":"StatusIncidents","item":[{"name":"Public status-page incident timeline","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/status/incidents-timeline","host":["{{baseUrl}}"],"path":["v1","status","incidents-timeline"],"query":[{"key":"tenantId","value":"","disabled":true},{"key":"platform","value":"","disabled":true},{"key":"windowDays","value":"","disabled":true}]},"description":"Public status-page incident timeline\n\nLast N days (default 30, clamped to [1, 365]) of incidents - either platform-wide or scoped to one tenant. No auth.\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `profile:read`\n**Tags:** StatusIncidents"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"items\": [\n    {\n      \"id\": null,\n      \"tenantId\": null,\n      \"severity\": null,\n      \"title\": null,\n      \"description\": null,\n      \"components\": null,\n      \"startedAt\": null,\n      \"resolvedAt\": null,\n      \"createdAt\": null,\n      \"updatedAt\": null\n    }\n  ]\n}"}]}]},{"name":"SuperAdmin","item":[{"name":"List feedback submissions across all tenants (super admin)","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/super-admin/feedback","host":["{{baseUrl}}"],"path":["v1","super-admin","feedback"],"query":[{"key":"status","value":"","disabled":true},{"key":"triageStatus","value":"","disabled":true},{"key":"category","value":"","disabled":true},{"key":"priority","value":"","disabled":true},{"key":"productArea","value":"","disabled":true},{"key":"impact","value":"","disabled":true},{"key":"assignedToUserId","value":"","disabled":true},{"key":"limit","value":"","disabled":true},{"key":"before","value":"","disabled":true}]},"description":"List feedback submissions across all tenants (super admin)\n\nCross-tenant triage queue. Supports the same filter shape as the per-tenant `/v1/feedback` list. Items ordered most-recent first, capped at `limit` (1..200).\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `profile:read`\n**Tags:** SuperAdmin, Feedback"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"items\": [\n    {\n      \"id\": null,\n      \"workspaceId\": null,\n      \"userId\": null,\n      \"email\": null,\n      \"contactName\": null,\n      \"contactCompany\": null,\n      \"contactPhone\": null,\n      \"title\": null,\n      \"route\": null,\n      \"userAgent\": null,\n      \"message\": null,\n      \"expectedBehavior\": null,\n      \"actualBehavior\": null,\n      \"stepsToReproduce\": null,\n      \"category\": null,\n      \"productArea\": null,\n      \"impact\": null,\n      \"status\": null,\n      \"triageStatus\": null,\n      \"priority\": null,\n      \"assignedToUserId\": null,\n      \"internalNote\": null,\n      \"screenshot\": null,\n      \"context\": null,\n      \"createdAt\": null,\n      \"updatedAt\": null\n    }\n  ]\n}"}]},{"name":"Read one feedback submission (super admin)","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/super-admin/feedback/{id}","host":["{{baseUrl}}"],"path":["v1","super-admin","feedback",":id"],"variable":[{"key":"id","value":"","description":"Path parameter: id"}]},"description":"Read one feedback submission (super admin)\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `profile:read`\n**Tags:** SuperAdmin, Feedback"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"id\": \"string\",\n  \"workspaceId\": \"string\",\n  \"userId\": \"string\",\n  \"email\": \"user@example.com\",\n  \"contactName\": \"string\",\n  \"contactCompany\": \"string\",\n  \"contactPhone\": \"string\",\n  \"title\": \"string\",\n  \"route\": \"string\",\n  \"userAgent\": \"string\",\n  \"message\": \"string\",\n  \"expectedBehavior\": \"string\",\n  \"actualBehavior\": \"string\",\n  \"stepsToReproduce\": \"string\",\n  \"category\": \"bug\",\n  \"productArea\": \"tasks\",\n  \"impact\": \"blocked\",\n  \"status\": \"new\",\n  \"triageStatus\": \"new\",\n  \"priority\": \"low\",\n  \"assignedToUserId\": \"string\",\n  \"internalNote\": \"string\",\n  \"screenshot\": {\n    \"dataUrl\": \"string\",\n    \"name\": \"string\",\n    \"mime\": \"image/png\"\n  },\n  \"context\": {},\n  \"createdAt\": \"2026-01-01T00:00:00.000Z\",\n  \"updatedAt\": \"2026-01-01T00:00:00.000Z\"\n}"}]},{"name":"Update triage state of a feedback submission","request":{"method":"PATCH","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/super-admin/feedback/{id}","host":["{{baseUrl}}"],"path":["v1","super-admin","feedback",":id"],"variable":[{"key":"id","value":"","description":"Path parameter: id"}]},"description":"Update triage state of a feedback submission\n\nPATCH semantics merge non-null fields; supply `assignedToUserId: null` or `internalNote: null` to clear. At least one field is required.\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `profile:write`\n**Tags:** SuperAdmin, Feedback","body":{"mode":"raw","raw":"{\n  \"status\": \"new\",\n  \"triageStatus\": \"new\",\n  \"priority\": \"low\",\n  \"assignedToUserId\": \"string\",\n  \"internalNote\": \"string\"\n}","options":{"raw":{"language":"json"}}}},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"id\": \"string\",\n  \"workspaceId\": \"string\",\n  \"userId\": \"string\",\n  \"email\": \"user@example.com\",\n  \"contactName\": \"string\",\n  \"contactCompany\": \"string\",\n  \"contactPhone\": \"string\",\n  \"title\": \"string\",\n  \"route\": \"string\",\n  \"userAgent\": \"string\",\n  \"message\": \"string\",\n  \"expectedBehavior\": \"string\",\n  \"actualBehavior\": \"string\",\n  \"stepsToReproduce\": \"string\",\n  \"category\": \"bug\",\n  \"productArea\": \"tasks\",\n  \"impact\": \"blocked\",\n  \"status\": \"new\",\n  \"triageStatus\": \"new\",\n  \"priority\": \"low\",\n  \"assignedToUserId\": \"string\",\n  \"internalNote\": \"string\",\n  \"screenshot\": {\n    \"dataUrl\": \"string\",\n    \"name\": \"string\",\n    \"mime\": \"image/png\"\n  },\n  \"context\": {},\n  \"createdAt\": \"2026-01-01T00:00:00.000Z\",\n  \"updatedAt\": \"2026-01-01T00:00:00.000Z\"\n}"}]},{"name":"Read cross-tenant marketplace revenue summary (super admin)","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/super-admin/marketplace/revenue/summary","host":["{{baseUrl}}"],"path":["v1","super-admin","marketplace","revenue","summary"]},"description":"Read cross-tenant marketplace revenue summary (super admin)\n\nLifetime gross, current-month MRR, ARR (MRR x 12), top-10 tenants by spend, and a 30-day daily revenue trend.\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `profile:read`\n**Tags:** SuperAdmin, Marketplace"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"totalRevenueCents\": 0,\n  \"mrr\": 0,\n  \"arr\": 0,\n  \"top10Tenants\": [\n    {\n      \"tenantId\": \"string\",\n      \"displayName\": \"string\",\n      \"totalCents\": 0,\n      \"lastInvoiceAt\": \"2026-01-01T00:00:00.000Z\"\n    }\n  ],\n  \"trend30d\": [\n    {\n      \"day\": \"2026-06-01\",\n      \"revenueCents\": 0\n    }\n  ]\n}"}]},{"name":"Cross-tenant marketplace install + usage funnel (super admin)","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/super-admin/marketplace/dashboard","host":["{{baseUrl}}"],"path":["v1","super-admin","marketplace","dashboard"]},"description":"Cross-tenant marketplace install + usage funnel (super admin)\n\nReturns installs by connector (with 30d delta + active-tenant count), top usage by event volume (24h / 7d), and connectors with auth failures in the last 24h plus a representative sample error.\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `profile:read`\n**Tags:** SuperAdmin, Marketplace"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"installsByConnector\": [\n    {\n      \"name\": \"string\",\n      \"totalInstalls\": 0,\n      \"last30dInstalls\": 0,\n      \"activeTenants\": 0\n    }\n  ],\n  \"topUsage\": [\n    {\n      \"connector\": \"string\",\n      \"eventsLast24h\": 0,\n      \"eventsLast7d\": 0\n    }\n  ],\n  \"failedAuths24h\": [\n    {\n      \"connector\": \"string\",\n      \"count\": 0,\n      \"sample_error\": \"string\"\n    }\n  ]\n}"}]},{"name":"List cross-tenant anomaly alerts (super admin)","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/super-admin/anomalies","host":["{{baseUrl}}"],"path":["v1","super-admin","anomalies"],"query":[{"key":"since","value":"","disabled":true},{"key":"status","value":"","disabled":true},{"key":"signal","value":"","disabled":true},{"key":"severity","value":"","disabled":true},{"key":"limit","value":"","disabled":true}]},"description":"List cross-tenant anomaly alerts (super admin)\n\nReturns the open/acknowledged/resolved anomaly alerts the nightly sweep has emitted. Filter by signal, severity, status, or a `since` timestamp.\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `profile:read`\n**Tags:** SuperAdmin, Anomalies"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"items\": [\n    {\n      \"id\": null,\n      \"tenantId\": null,\n      \"signal\": null,\n      \"severity\": null,\n      \"status\": null,\n      \"zScore\": null,\n      \"observedValue\": null,\n      \"baselineMean\": null,\n      \"baselineStdDev\": null,\n      \"baselineWindowDays\": null,\n      \"suggestedAction\": null,\n      \"context\": null,\n      \"detectedAt\": null,\n      \"acknowledgedAt\": null,\n      \"acknowledgedBy\": null,\n      \"resolvedAt\": null,\n      \"resolvedBy\": null\n    }\n  ]\n}"}]},{"name":"Acknowledge an anomaly alert (super admin)","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/super-admin/anomalies/{id}/ack","host":["{{baseUrl}}"],"path":["v1","super-admin","anomalies",":id","ack"],"variable":[{"key":"id","value":"","description":"Path parameter: id"}]},"description":"Acknowledge an anomaly alert (super admin)\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `profile:write`\n**Tags:** SuperAdmin, Anomalies","body":{"mode":"raw","raw":"{\n  \"reason\": \"string\"\n}","options":{"raw":{"language":"json"}}}},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"id\": \"anom_01HW3T2K8X9Y2VPRZGQX9NDY1F\",\n  \"tenantId\": \"string\",\n  \"signal\": \"auth.failures.spike\",\n  \"severity\": \"info\",\n  \"status\": \"open\",\n  \"zScore\": 0,\n  \"observedValue\": 0,\n  \"baselineMean\": 0,\n  \"baselineStdDev\": 0,\n  \"baselineWindowDays\": 0,\n  \"suggestedAction\": \"string\",\n  \"context\": {},\n  \"detectedAt\": \"2026-01-01T00:00:00.000Z\",\n  \"acknowledgedAt\": \"2026-01-01T00:00:00.000Z\",\n  \"acknowledgedBy\": \"string\",\n  \"resolvedAt\": \"2026-01-01T00:00:00.000Z\",\n  \"resolvedBy\": \"string\"\n}"}]},{"name":"Resolve an anomaly alert (super admin)","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/super-admin/anomalies/{id}/resolve","host":["{{baseUrl}}"],"path":["v1","super-admin","anomalies",":id","resolve"],"variable":[{"key":"id","value":"","description":"Path parameter: id"}]},"description":"Resolve an anomaly alert (super admin)\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `profile:write`\n**Tags:** SuperAdmin, Anomalies","body":{"mode":"raw","raw":"{\n  \"reason\": \"string\"\n}","options":{"raw":{"language":"json"}}}},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"id\": \"anom_01HW3T2K8X9Y2VPRZGQX9NDY1F\",\n  \"tenantId\": \"string\",\n  \"signal\": \"auth.failures.spike\",\n  \"severity\": \"info\",\n  \"status\": \"open\",\n  \"zScore\": 0,\n  \"observedValue\": 0,\n  \"baselineMean\": 0,\n  \"baselineStdDev\": 0,\n  \"baselineWindowDays\": 0,\n  \"suggestedAction\": \"string\",\n  \"context\": {},\n  \"detectedAt\": \"2026-01-01T00:00:00.000Z\",\n  \"acknowledgedAt\": \"2026-01-01T00:00:00.000Z\",\n  \"acknowledgedBy\": \"string\",\n  \"resolvedAt\": \"2026-01-01T00:00:00.000Z\",\n  \"resolvedBy\": \"string\"\n}"}]},{"name":"Read the audit-log mirror sweep health (super admin)","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/super-admin/audit-mirror/status","host":["{{baseUrl}}"],"path":["v1","super-admin","audit-mirror","status"]},"description":"Read the audit-log mirror sweep health (super admin)\n\nReturns the bucket configuration, lag (seconds since last succeeded run), counts of failing tenants, and the most recent per-tenant run rows.\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `profile:read`\n**Tags:** SuperAdmin, AuditMirror"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"ok\": false,\n  \"bucket\": \"string\",\n  \"retentionSeconds\": 0,\n  \"lastSucceededAt\": \"2026-01-01T00:00:00.000Z\",\n  \"lagSeconds\": 0,\n  \"lastRunAt\": \"2026-01-01T00:00:00.000Z\",\n  \"lastRunStatus\": {},\n  \"failingTenantCount\": 0,\n  \"recent\": [\n    {\n      \"id\": \"string\",\n      \"tenantId\": \"string\",\n      \"status\": null,\n      \"startedAt\": \"2026-01-01T00:00:00.000Z\",\n      \"finishedAt\": \"2026-01-01T00:00:00.000Z\",\n      \"eventCount\": 0,\n      \"objectKey\": \"string\",\n      \"errorMessage\": \"string\"\n    }\n  ]\n}"}]},{"name":"Force a mirror sweep for one tenant (super admin)","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/super-admin/audit-mirror/replay/{tenantId}","host":["{{baseUrl}}"],"path":["v1","super-admin","audit-mirror","replay",":tenantId"],"variable":[{"key":"tenantId","value":"","description":"Path parameter: tenantId"}]},"description":"Force a mirror sweep for one tenant (super admin)\n\nSynchronously kicks off a sweep so the operator does not have to wait for the next 10-minute tick. Returns the resulting run summary.\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `profile:write`\n**Tags:** SuperAdmin, AuditMirror"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"tenantId\": \"string\",\n  \"status\": \"running\",\n  \"eventCount\": 0,\n  \"objectKey\": \"string\",\n  \"sha256\": \"string\"\n}"}]},{"name":"List status-page incidents across all tenants (super admin)","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/super-admin/incidents","host":["{{baseUrl}}"],"path":["v1","super-admin","incidents"],"query":[{"key":"tenantId","value":"","disabled":true},{"key":"platform","value":"","description":"When true, restrict to incidents with no tenantId (platform-wide).","disabled":true},{"key":"includeResolved","value":"","disabled":true},{"key":"limit","value":"","disabled":true}]},"description":"List status-page incidents across all tenants (super admin)\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `profile:read`\n**Tags:** SuperAdmin, StatusIncidents"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"items\": [\n    {\n      \"id\": null,\n      \"tenantId\": null,\n      \"severity\": null,\n      \"title\": null,\n      \"description\": null,\n      \"components\": null,\n      \"startedAt\": null,\n      \"resolvedAt\": null,\n      \"createdAt\": null,\n      \"updatedAt\": null\n    }\n  ]\n}"}]},{"name":"Open a new status incident (super admin)","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/super-admin/incidents","host":["{{baseUrl}}"],"path":["v1","super-admin","incidents"]},"description":"Open a new status incident (super admin)\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `profile:write`\n**Tags:** SuperAdmin, StatusIncidents","body":{"mode":"raw","raw":"{\n  \"tenantId\": \"string\",\n  \"severity\": \"degraded\",\n  \"title\": \"string\",\n  \"description\": \"string\",\n  \"components\": [\n    \"string\"\n  ],\n  \"startedAt\": \"2026-01-01T00:00:00.000Z\"\n}","options":{"raw":{"language":"json"}}}},"response":[{"name":"Sample 201","status":"Created","code":201,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"id\": \"string\",\n  \"tenantId\": \"string\",\n  \"severity\": \"degraded\",\n  \"title\": \"string\",\n  \"description\": \"string\",\n  \"components\": [\n    \"string\"\n  ],\n  \"startedAt\": \"2026-01-01T00:00:00.000Z\",\n  \"resolvedAt\": \"2026-01-01T00:00:00.000Z\",\n  \"createdAt\": \"2026-01-01T00:00:00.000Z\",\n  \"updatedAt\": \"2026-01-01T00:00:00.000Z\"\n}"}]},{"name":"Read one status incident (super admin)","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/super-admin/incidents/{id}","host":["{{baseUrl}}"],"path":["v1","super-admin","incidents",":id"],"variable":[{"key":"id","value":"","description":"Path parameter: id"}]},"description":"Read one status incident (super admin)\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `profile:read`\n**Tags:** SuperAdmin, StatusIncidents"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"id\": \"string\",\n  \"tenantId\": \"string\",\n  \"severity\": \"degraded\",\n  \"title\": \"string\",\n  \"description\": \"string\",\n  \"components\": [\n    \"string\"\n  ],\n  \"startedAt\": \"2026-01-01T00:00:00.000Z\",\n  \"resolvedAt\": \"2026-01-01T00:00:00.000Z\",\n  \"createdAt\": \"2026-01-01T00:00:00.000Z\",\n  \"updatedAt\": \"2026-01-01T00:00:00.000Z\"\n}"}]},{"name":"Edit one status incident (super admin)","request":{"method":"PATCH","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/super-admin/incidents/{id}","host":["{{baseUrl}}"],"path":["v1","super-admin","incidents",":id"],"variable":[{"key":"id","value":"","description":"Path parameter: id"}]},"description":"Edit one status incident (super admin)\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `profile:write`\n**Tags:** SuperAdmin, StatusIncidents","body":{"mode":"raw","raw":"{\n  \"severity\": \"degraded\",\n  \"title\": \"string\",\n  \"description\": \"string\",\n  \"components\": [\n    \"string\"\n  ]\n}","options":{"raw":{"language":"json"}}}},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"id\": \"string\",\n  \"tenantId\": \"string\",\n  \"severity\": \"degraded\",\n  \"title\": \"string\",\n  \"description\": \"string\",\n  \"components\": [\n    \"string\"\n  ],\n  \"startedAt\": \"2026-01-01T00:00:00.000Z\",\n  \"resolvedAt\": \"2026-01-01T00:00:00.000Z\",\n  \"createdAt\": \"2026-01-01T00:00:00.000Z\",\n  \"updatedAt\": \"2026-01-01T00:00:00.000Z\"\n}"}]},{"name":"Resolve one status incident (super admin)","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/super-admin/incidents/{id}/resolve","host":["{{baseUrl}}"],"path":["v1","super-admin","incidents",":id","resolve"],"variable":[{"key":"id","value":"","description":"Path parameter: id"}]},"description":"Resolve one status incident (super admin)\n\nRecords `resolvedAt` server-side and emits a dedicated `incident.resolve` audit event so the action is distinct in the trail.\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `profile:write`\n**Tags:** SuperAdmin, StatusIncidents"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"id\": \"string\",\n  \"tenantId\": \"string\",\n  \"severity\": \"degraded\",\n  \"title\": \"string\",\n  \"description\": \"string\",\n  \"components\": [\n    \"string\"\n  ],\n  \"startedAt\": \"2026-01-01T00:00:00.000Z\",\n  \"resolvedAt\": \"2026-01-01T00:00:00.000Z\",\n  \"createdAt\": \"2026-01-01T00:00:00.000Z\",\n  \"updatedAt\": \"2026-01-01T00:00:00.000Z\"\n}"}]}]},{"name":"Tasks","item":[{"name":"Create a task","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true},{"key":"Idempotency-Key","value":"","type":"text","description":"Opaque key; identical retries within 24h return the cached 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/tasks","host":["{{baseUrl}}"],"path":["v1","tasks"]},"description":"Create a task\n\nCreate a task in `projectId`. The minimal body is `{ projectId, title }`; every other field has a server default. Send an `Idempotency-Key` header and the same `(key, body)` retried within 24h returns the cached 2xx response - safe to fire-and-forget from queues. Returns the full `Task` shape with `version: 0`; pass that version in `If-Match` on the next PATCH for optimistic concurrency.\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `tasks:write`\n**Tags:** Tasks","body":{"mode":"raw","raw":"{\n  \"projectId\": \"prj_01HW3T...\",\n  \"title\": \"Draft launch announcement\",\n  \"description\": \"string\",\n  \"visibility\": \"SHARED\",\n  \"recurrence\": \"NONE\",\n  \"priority\": \"NONE\",\n  \"status\": \"string\",\n  \"dueOn\": \"2026-01-01T00:00:00.000Z\",\n  \"startsOn\": \"2026-01-01T00:00:00.000Z\",\n  \"remindAt\": \"2026-01-01T00:00:00.000Z\",\n  \"estimateMin\": 0,\n  \"parentId\": \"string\"\n}","options":{"raw":{"language":"json"}}}},"response":[{"name":"Sample 201","status":"Created","code":201,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"id\": \"tsk_01HW3T...\",\n  \"tenantId\": \"tnt_01HW3T...\",\n  \"projectId\": \"prj_01HW3T...\",\n  \"parentId\": \"string\",\n  \"title\": \"Ship public API + MCP\",\n  \"description\": \"string\",\n  \"visibility\": \"SHARED\",\n  \"recurrence\": \"NONE\",\n  \"priority\": \"NONE\",\n  \"status\": \"string\",\n  \"version\": 0,\n  \"dueOn\": \"2026-01-01T00:00:00.000Z\",\n  \"startsOn\": \"2026-01-01T00:00:00.000Z\",\n  \"remindAt\": \"2026-01-01T00:00:00.000Z\",\n  \"estimateMin\": 0,\n  \"deletedAt\": \"2026-01-01T00:00:00.000Z\",\n  \"createdAt\": \"2026-01-01T00:00:00.000Z\",\n  \"updatedAt\": \"2026-01-01T00:00:00.000Z\"\n}"}]},{"name":"Read a task","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/tasks/{id}","host":["{{baseUrl}}"],"path":["v1","tasks",":id"],"variable":[{"key":"id","value":"","description":"Path parameter: id"}]},"description":"Read a task\n\nRead a single task by id. Returns 404 if the task is soft-deleted (`deletedAt != null`) or owned by a different tenant - never leaks cross-tenant existence. The returned `version` is the current optimistic-concurrency cursor; capture it before mutating.\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `tasks:read`\n**Tags:** Tasks"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"id\": \"tsk_01HW3T...\",\n  \"tenantId\": \"tnt_01HW3T...\",\n  \"projectId\": \"prj_01HW3T...\",\n  \"parentId\": \"string\",\n  \"title\": \"Ship public API + MCP\",\n  \"description\": \"string\",\n  \"visibility\": \"SHARED\",\n  \"recurrence\": \"NONE\",\n  \"priority\": \"NONE\",\n  \"status\": \"string\",\n  \"version\": 0,\n  \"dueOn\": \"2026-01-01T00:00:00.000Z\",\n  \"startsOn\": \"2026-01-01T00:00:00.000Z\",\n  \"remindAt\": \"2026-01-01T00:00:00.000Z\",\n  \"estimateMin\": 0,\n  \"deletedAt\": \"2026-01-01T00:00:00.000Z\",\n  \"createdAt\": \"2026-01-01T00:00:00.000Z\",\n  \"updatedAt\": \"2026-01-01T00:00:00.000Z\"\n}"}]},{"name":"Update a task (optimistic concurrency)","request":{"method":"PATCH","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true},{"key":"If-Match","value":"","type":"text","description":"Non-negative integer version. 409 if stale.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/tasks/{id}","host":["{{baseUrl}}"],"path":["v1","tasks",":id"],"variable":[{"key":"id","value":"","description":"Path parameter: id"}]},"description":"Update a task (optimistic concurrency)\n\nPatch any subset of fields. The body is a partial `CreateTaskInput`; only fields you include are touched. Send `If-Match: <version>` to enable optimistic concurrency - a stale version returns 409 instead of overwriting a newer version. Omit `If-Match` to last-write-wins (not recommended for concurrent editors).\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `tasks:write`\n**Tags:** Tasks","body":{"mode":"raw","raw":"{}","options":{"raw":{"language":"json"}}}},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"id\": \"tsk_01HW3T...\",\n  \"tenantId\": \"tnt_01HW3T...\",\n  \"projectId\": \"prj_01HW3T...\",\n  \"parentId\": \"string\",\n  \"title\": \"Ship public API + MCP\",\n  \"description\": \"string\",\n  \"visibility\": \"SHARED\",\n  \"recurrence\": \"NONE\",\n  \"priority\": \"NONE\",\n  \"status\": \"string\",\n  \"version\": 0,\n  \"dueOn\": \"2026-01-01T00:00:00.000Z\",\n  \"startsOn\": \"2026-01-01T00:00:00.000Z\",\n  \"remindAt\": \"2026-01-01T00:00:00.000Z\",\n  \"estimateMin\": 0,\n  \"deletedAt\": \"2026-01-01T00:00:00.000Z\",\n  \"createdAt\": \"2026-01-01T00:00:00.000Z\",\n  \"updatedAt\": \"2026-01-01T00:00:00.000Z\"\n}"}]},{"name":"Soft-delete a task","request":{"method":"DELETE","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/tasks/{id}","host":["{{baseUrl}}"],"path":["v1","tasks",":id"],"variable":[{"key":"id","value":"","description":"Path parameter: id"}]},"description":"Soft-delete a task\n\nSoft-deletes the task: sets `deletedAt` to \"now\" and the row stops appearing in list / search results. Subtasks remain live (orphaned at the parent). Idempotent - calling twice is a no-op rather than an error.\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `tasks:delete`\n**Tags:** Tasks"},"response":[{"name":"Sample 204","status":"Deleted","code":204,"_postman_previewlanguage":"json","body":""}]},{"name":"List dependencies for a task","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/tasks/{id}/dependencies","host":["{{baseUrl}}"],"path":["v1","tasks",":id","dependencies"],"variable":[{"key":"id","value":"","description":"Path parameter: id"}]},"description":"List dependencies for a task\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `tasks:read`\n**Tags:** Tasks"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"blockedBy\": [\n    {\n      \"direction\": null,\n      \"kind\": null,\n      \"task\": null\n    }\n  ],\n  \"blocking\": [\n    {\n      \"direction\": null,\n      \"kind\": null,\n      \"task\": null\n    }\n  ]\n}"}]},{"name":"Create a dependency from the path task to another task","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/tasks/{id}/dependencies","host":["{{baseUrl}}"],"path":["v1","tasks",":id","dependencies"],"variable":[{"key":"id","value":"","description":"Path parameter: id"}]},"description":"Create a dependency from the path task to another task\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `tasks:write`\n**Tags:** Tasks","body":{"mode":"raw","raw":"{\n  \"toTaskId\": \"string\",\n  \"kind\": \"BLOCKS\"\n}","options":{"raw":{"language":"json"}}}},"response":[{"name":"Sample 201","status":"Created","code":201,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"direction\": \"blockedBy\",\n  \"kind\": \"BLOCKS\",\n  \"task\": {\n    \"id\": \"string\",\n    \"projectId\": \"string\",\n    \"title\": \"string\",\n    \"status\": \"string\",\n    \"priority\": \"NONE\",\n    \"visibility\": \"SHARED\",\n    \"startsOn\": \"2026-01-01T00:00:00.000Z\",\n    \"dueOn\": \"2026-01-01T00:00:00.000Z\"\n  }\n}"}]},{"name":"Delete a dependency","request":{"method":"DELETE","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/tasks/{id}/dependencies/{toTaskId}","host":["{{baseUrl}}"],"path":["v1","tasks",":id","dependencies",":toTaskId"],"variable":[{"key":"id","value":"","description":"Path parameter: id"},{"key":"toTaskId","value":"","description":"Path parameter: toTaskId"}]},"description":"Delete a dependency\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `tasks:write`\n**Tags:** Tasks"},"response":[{"name":"Sample 204","status":"Deleted","code":204,"_postman_previewlanguage":"json","body":""}]},{"name":"Perform a workflow transition on a task","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/tasks/{id}/transition","host":["{{baseUrl}}"],"path":["v1","tasks",":id","transition"],"variable":[{"key":"id","value":"","description":"Path parameter: id"}]},"description":"Perform a workflow transition on a task\n\nRuns the transition identified by `transitionId`. The server validates that the transition is allowed from the current status under the task's workflow, runs any pre/post conditions, and atomically updates `status` + `statusId` + `version`.\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `tasks:write`\n**Tags:** Tasks","body":{"mode":"raw","raw":"{\n  \"transitionId\": \"string\",\n  \"comment\": \"string\",\n  \"fields\": {},\n  \"expectedVersion\": 0\n}","options":{"raw":{"language":"json"}}}},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"id\": \"tsk_01HW3T...\",\n  \"tenantId\": \"tnt_01HW3T...\",\n  \"projectId\": \"prj_01HW3T...\",\n  \"parentId\": \"string\",\n  \"title\": \"Ship public API + MCP\",\n  \"description\": \"string\",\n  \"visibility\": \"SHARED\",\n  \"recurrence\": \"NONE\",\n  \"priority\": \"NONE\",\n  \"status\": \"string\",\n  \"version\": 0,\n  \"dueOn\": \"2026-01-01T00:00:00.000Z\",\n  \"startsOn\": \"2026-01-01T00:00:00.000Z\",\n  \"remindAt\": \"2026-01-01T00:00:00.000Z\",\n  \"estimateMin\": 0,\n  \"deletedAt\": \"2026-01-01T00:00:00.000Z\",\n  \"createdAt\": \"2026-01-01T00:00:00.000Z\",\n  \"updatedAt\": \"2026-01-01T00:00:00.000Z\"\n}"}]},{"name":"Read a kanban board view (columns + tasks per column)","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/tasks/board","host":["{{baseUrl}}"],"path":["v1","tasks","board"],"query":[{"key":"boardId","value":"","disabled":false},{"key":"limitPerColumn","value":"","disabled":true}]},"description":"Read a kanban board view (columns + tasks per column)\n\nReturns one column per workflow status on the supplied `boardId`. Each column carries up to `limitPerColumn` tasks (default 50, max 200). Use `hasMore` / per-column pagination to walk further.\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `tasks:read`\n**Tags:** Tasks"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"boardId\": \"string\",\n  \"columns\": [\n    {\n      \"statusId\": null,\n      \"name\": null,\n      \"order\": null,\n      \"tasks\": null,\n      \"totalCount\": null,\n      \"hasMore\": null\n    }\n  ]\n}"}]},{"name":"Snooze a task until a future time (or clear with null)","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/tasks/{id}/snooze","host":["{{baseUrl}}"],"path":["v1","tasks",":id","snooze"],"variable":[{"key":"id","value":"","description":"Path parameter: id"}]},"description":"Snooze a task until a future time (or clear with null)\n\nSets `snoozedUntil` on the task. The task is hidden from default list views until the time elapses. Pass `until: null` to clear an existing snooze.\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `tasks:write`\n**Tags:** Tasks","body":{"mode":"raw","raw":"{\n  \"until\": \"2026-01-01T00:00:00.000Z\"\n}","options":{"raw":{"language":"json"}}}},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"id\": \"tsk_01HW3T...\",\n  \"tenantId\": \"tnt_01HW3T...\",\n  \"projectId\": \"prj_01HW3T...\",\n  \"parentId\": \"string\",\n  \"title\": \"Ship public API + MCP\",\n  \"description\": \"string\",\n  \"visibility\": \"SHARED\",\n  \"recurrence\": \"NONE\",\n  \"priority\": \"NONE\",\n  \"status\": \"string\",\n  \"version\": 0,\n  \"dueOn\": \"2026-01-01T00:00:00.000Z\",\n  \"startsOn\": \"2026-01-01T00:00:00.000Z\",\n  \"remindAt\": \"2026-01-01T00:00:00.000Z\",\n  \"estimateMin\": 0,\n  \"deletedAt\": \"2026-01-01T00:00:00.000Z\",\n  \"createdAt\": \"2026-01-01T00:00:00.000Z\",\n  \"updatedAt\": \"2026-01-01T00:00:00.000Z\"\n}"}]},{"name":"Archive a task","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/tasks/{id}/archive","host":["{{baseUrl}}"],"path":["v1","tasks",":id","archive"],"variable":[{"key":"id","value":"","description":"Path parameter: id"}]},"description":"Archive a task\n\nSets `archivedAt`; the task is hidden from default views but the row is retained. Reverse with `POST /v1/tasks/{id}/restore`.\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `tasks:write`\n**Tags:** Tasks"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"id\": \"tsk_01HW3T...\",\n  \"tenantId\": \"tnt_01HW3T...\",\n  \"projectId\": \"prj_01HW3T...\",\n  \"parentId\": \"string\",\n  \"title\": \"Ship public API + MCP\",\n  \"description\": \"string\",\n  \"visibility\": \"SHARED\",\n  \"recurrence\": \"NONE\",\n  \"priority\": \"NONE\",\n  \"status\": \"string\",\n  \"version\": 0,\n  \"dueOn\": \"2026-01-01T00:00:00.000Z\",\n  \"startsOn\": \"2026-01-01T00:00:00.000Z\",\n  \"remindAt\": \"2026-01-01T00:00:00.000Z\",\n  \"estimateMin\": 0,\n  \"deletedAt\": \"2026-01-01T00:00:00.000Z\",\n  \"createdAt\": \"2026-01-01T00:00:00.000Z\",\n  \"updatedAt\": \"2026-01-01T00:00:00.000Z\"\n}"}]},{"name":"Restore an archived or soft-deleted task","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/tasks/{id}/restore","host":["{{baseUrl}}"],"path":["v1","tasks",":id","restore"],"variable":[{"key":"id","value":"","description":"Path parameter: id"}]},"description":"Restore an archived or soft-deleted task\n\nClears `archivedAt` / `deletedAt`. Idempotent.\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `tasks:write`\n**Tags:** Tasks"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"id\": \"tsk_01HW3T...\",\n  \"tenantId\": \"tnt_01HW3T...\",\n  \"projectId\": \"prj_01HW3T...\",\n  \"parentId\": \"string\",\n  \"title\": \"Ship public API + MCP\",\n  \"description\": \"string\",\n  \"visibility\": \"SHARED\",\n  \"recurrence\": \"NONE\",\n  \"priority\": \"NONE\",\n  \"status\": \"string\",\n  \"version\": 0,\n  \"dueOn\": \"2026-01-01T00:00:00.000Z\",\n  \"startsOn\": \"2026-01-01T00:00:00.000Z\",\n  \"remindAt\": \"2026-01-01T00:00:00.000Z\",\n  \"estimateMin\": 0,\n  \"deletedAt\": \"2026-01-01T00:00:00.000Z\",\n  \"createdAt\": \"2026-01-01T00:00:00.000Z\",\n  \"updatedAt\": \"2026-01-01T00:00:00.000Z\"\n}"}]},{"name":"List reminders attached to a task","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/tasks/{id}/reminders","host":["{{baseUrl}}"],"path":["v1","tasks",":id","reminders"],"variable":[{"key":"id","value":"","description":"Path parameter: id"}]},"description":"List reminders attached to a task\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `tasks:read`\n**Tags:** Tasks"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"items\": [\n    {\n      \"id\": \"string\",\n      \"taskId\": \"string\",\n      \"remindAt\": \"2026-01-01T00:00:00.000Z\",\n      \"offsetMinutes\": 0,\n      \"firedAt\": \"2026-01-01T00:00:00.000Z\",\n      \"createdAt\": \"2026-01-01T00:00:00.000Z\"\n    }\n  ]\n}"}]},{"name":"Attach a label to a task","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/tasks/{taskId}/labels/{labelId}","host":["{{baseUrl}}"],"path":["v1","tasks",":taskId","labels",":labelId"],"variable":[{"key":"taskId","value":"","description":"Path parameter: taskId"},{"key":"labelId","value":"","description":"Path parameter: labelId"}]},"description":"Attach a label to a task\n\nIdempotent - re-attaching an existing link returns 200.\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `tasks:write`\n**Tags:** Tasks"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"taskId\": \"string\",\n  \"labelId\": \"string\",\n  \"createdAt\": \"2026-01-01T00:00:00.000Z\"\n}"}]},{"name":"Detach a label from a task","request":{"method":"DELETE","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/tasks/{taskId}/labels/{labelId}","host":["{{baseUrl}}"],"path":["v1","tasks",":taskId","labels",":labelId"],"variable":[{"key":"taskId","value":"","description":"Path parameter: taskId"},{"key":"labelId","value":"","description":"Path parameter: labelId"}]},"description":"Detach a label from a task\n\nIdempotent - 204 even if the link did not exist.\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `tasks:write`\n**Tags:** Tasks"},"response":[{"name":"Sample 204","status":"Detached","code":204,"_postman_previewlanguage":"json","body":""}]},{"name":"Bulk-import up to 500 tasks into a project","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/tasks/import","host":["{{baseUrl}}"],"path":["v1","tasks","import"]},"description":"Bulk-import up to 500 tasks into a project\n\nEach row is validated independently; valid rows are created, invalid rows are reported in `errors[]` by index. Cap is 500 rows per call to keep the API hot.\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `tasks:write`\n**Tags:** Tasks","body":{"mode":"raw","raw":"{\n  \"projectId\": \"string\",\n  \"tasks\": [\n    {\n      \"title\": null,\n      \"description\": null,\n      \"status\": null,\n      \"priority\": null,\n      \"recurrence\": null,\n      \"visibility\": null,\n      \"startsOn\": null,\n      \"dueOn\": null,\n      \"remindAt\": null,\n      \"estimateMin\": null,\n      \"labelIds\": null\n    }\n  ]\n}","options":{"raw":{"language":"json"}}}},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"created\": [\n    {\n      \"id\": null,\n      \"tenantId\": null,\n      \"projectId\": null,\n      \"parentId\": null,\n      \"title\": null,\n      \"description\": null,\n      \"visibility\": null,\n      \"recurrence\": null,\n      \"priority\": null,\n      \"status\": null,\n      \"version\": null,\n      \"dueOn\": null,\n      \"startsOn\": null,\n      \"remindAt\": null,\n      \"estimateMin\": null,\n      \"deletedAt\": null,\n      \"createdAt\": null,\n      \"updatedAt\": null\n    }\n  ],\n  \"errors\": [\n    {\n      \"index\": 0,\n      \"message\": \"string\"\n    }\n  ]\n}"}]},{"name":"Compute auto-schedule proposals (and optionally apply them)","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/tasks/auto-schedule","host":["{{baseUrl}}"],"path":["v1","tasks","auto-schedule"]},"description":"Compute auto-schedule proposals (and optionally apply them)\n\n`dryRun: true` (default) returns proposals without persisting. `dryRun: false` applies them inside a transaction; clients should always present the proposals to the user first.\n\n**Rate limit class:** `ai`\n**Required PAT scopes (any one):** `tasks:write`\n**Tags:** Tasks","body":{"mode":"raw","raw":"{\n  \"dryRun\": true,\n  \"horizonDays\": 7,\n  \"taskIds\": [\n    \"string\"\n  ]\n}","options":{"raw":{"language":"json"}}}},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"proposals\": [\n    {\n      \"taskId\": null,\n      \"version\": null,\n      \"previousStartsOn\": null,\n      \"previousDueOn\": null,\n      \"proposedStartsOn\": null,\n      \"proposedEndsOn\": null,\n      \"reason\": null\n    }\n  ],\n  \"appliedCount\": 0,\n  \"warnings\": [\n    \"string\"\n  ]\n}"}]},{"name":"Expand an RRULE between two dates without persisting","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/tasks/recurring-preview","host":["{{baseUrl}}"],"path":["v1","tasks","recurring-preview"]},"description":"Expand an RRULE between two dates without persisting\n\nReturns the list of occurrence dates the rule generates inside `[from, to]`. Pure compute; nothing is written.\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `tasks:read`\n**Tags:** Tasks","body":{"mode":"raw","raw":"{\n  \"dtstart\": \"2026-06-01\",\n  \"from\": \"2026-06-01\",\n  \"to\": \"2026-06-30\",\n  \"rule\": {\n    \"freq\": \"DAILY\",\n    \"interval\": 0,\n    \"byWeekday\": [\n      null\n    ],\n    \"byMonthDay\": 0,\n    \"count\": 0,\n    \"until\": \"string\"\n  }\n}","options":{"raw":{"language":"json"}}}},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"occurrences\": [\n    \"string\"\n  ]\n}"}]},{"name":"List task templates","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/task-templates","host":["{{baseUrl}}"],"path":["v1","task-templates"]},"description":"List task templates\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `tasks:read`\n**Tags:** Tasks"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"items\": [\n    {\n      \"id\": \"ttpl_01HW3T...\",\n      \"name\": \"string\",\n      \"projectId\": \"string\",\n      \"description\": \"string\",\n      \"payload\": {},\n      \"createdAt\": \"2026-01-01T00:00:00.000Z\"\n    }\n  ]\n}"}]},{"name":"Create a task template","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/task-templates","host":["{{baseUrl}}"],"path":["v1","task-templates"]},"description":"Create a task template\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `tasks:write`\n**Tags:** Tasks","body":{"mode":"raw","raw":"{\n  \"projectId\": \"string\",\n  \"name\": \"string\",\n  \"description\": \"string\",\n  \"payload\": {}\n}","options":{"raw":{"language":"json"}}}},"response":[{"name":"Sample 201","status":"Created","code":201,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"id\": \"ttpl_01HW3T...\",\n  \"name\": \"string\",\n  \"projectId\": \"string\",\n  \"description\": \"string\",\n  \"payload\": {},\n  \"createdAt\": \"2026-01-01T00:00:00.000Z\"\n}"}]},{"name":"Materialise a task template as a real task in a project","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/task-templates/{id}/apply","host":["{{baseUrl}}"],"path":["v1","task-templates",":id","apply"],"variable":[{"key":"id","value":"","description":"Path parameter: id"}]},"description":"Materialise a task template as a real task in a project\n\nLoads the saved payload, merges in any caller `overrides`, then creates a new task.\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `tasks:write`\n**Tags:** Tasks","body":{"mode":"raw","raw":"{\n  \"projectId\": \"string\",\n  \"overrides\": {\n    \"title\": \"string\",\n    \"description\": \"string\",\n    \"visibility\": \"SHARED\",\n    \"recurrence\": \"NONE\",\n    \"recurrenceRule\": {},\n    \"priority\": \"NONE\",\n    \"status\": \"string\",\n    \"startsOn\": \"2026-01-01T00:00:00.000Z\",\n    \"dueOn\": \"2026-01-01T00:00:00.000Z\",\n    \"remindAt\": \"2026-01-01T00:00:00.000Z\",\n    \"reminders\": [\n      null\n    ],\n    \"snoozedUntil\": \"2026-01-01T00:00:00.000Z\",\n    \"estimateMin\": 0,\n    \"parentId\": \"string\",\n    \"assigneeId\": \"string\",\n    \"customAttributes\": {},\n    \"typeId\": \"string\",\n    \"statusId\": \"string\",\n    \"workflowId\": \"string\",\n    \"fields\": {},\n    \"clearFields\": [\n      null\n    ],\n    \"version\": 0,\n    \"expectedVersion\": 0\n  }\n}","options":{"raw":{"language":"json"}}}},"response":[{"name":"Sample 201","status":"Created","code":201,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"id\": \"tsk_01HW3T...\",\n  \"tenantId\": \"tnt_01HW3T...\",\n  \"projectId\": \"prj_01HW3T...\",\n  \"parentId\": \"string\",\n  \"title\": \"Ship public API + MCP\",\n  \"description\": \"string\",\n  \"visibility\": \"SHARED\",\n  \"recurrence\": \"NONE\",\n  \"priority\": \"NONE\",\n  \"status\": \"string\",\n  \"version\": 0,\n  \"dueOn\": \"2026-01-01T00:00:00.000Z\",\n  \"startsOn\": \"2026-01-01T00:00:00.000Z\",\n  \"remindAt\": \"2026-01-01T00:00:00.000Z\",\n  \"estimateMin\": 0,\n  \"deletedAt\": \"2026-01-01T00:00:00.000Z\",\n  \"createdAt\": \"2026-01-01T00:00:00.000Z\",\n  \"updatedAt\": \"2026-01-01T00:00:00.000Z\"\n}"}]},{"name":"Delete a task template","request":{"method":"DELETE","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/task-templates/{id}","host":["{{baseUrl}}"],"path":["v1","task-templates",":id"],"variable":[{"key":"id","value":"","description":"Path parameter: id"}]},"description":"Delete a task template\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `tasks:write`\n**Tags:** Tasks"},"response":[{"name":"Sample 204","status":"Deleted","code":204,"_postman_previewlanguage":"json","body":""}]}]},{"name":"TenantBranding","item":[{"name":"Read the calling tenant's workspace branding","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/tenant/branding","host":["{{baseUrl}}"],"path":["v1","tenant","branding"]},"description":"Read the calling tenant's workspace branding\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `profile:read`\n**Tags:** TenantBranding"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"displayName\": \"string\",\n  \"logoUrl\": \"https://example.com\",\n  \"brandColor\": \"#1F6FEB\"\n}"}]},{"name":"Update workspace branding (display name, logo, brand colour)","request":{"method":"PUT","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/tenant/branding","host":["{{baseUrl}}"],"path":["v1","tenant","branding"]},"description":"Update workspace branding (display name, logo, brand colour)\n\nOWNER / ADMIN only. PUT is idempotent: empty string clears a field; omitting a field preserves the prior value.\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `profile:write`\n**Tags:** TenantBranding","body":{"mode":"raw","raw":"{\n  \"displayName\": \"string\",\n  \"logoUrl\": \"string\",\n  \"brandColor\": \"string\"\n}","options":{"raw":{"language":"json"}}}},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"displayName\": \"string\",\n  \"logoUrl\": \"https://example.com\",\n  \"brandColor\": \"#1F6FEB\"\n}"}]}]},{"name":"Themes","item":[{"name":"List the calling tenant's themes","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/themes","host":["{{baseUrl}}"],"path":["v1","themes"]},"description":"List the calling tenant's themes\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `profile:read`\n**Tags:** Themes"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"[\n  {\n    \"id\": \"string\",\n    \"name\": \"string\",\n    \"description\": \"string\",\n    \"publishedAt\": \"2026-01-01T00:00:00.000Z\",\n    \"authorTenantId\": \"string\",\n    \"tokens\": {}\n  }\n]"}]},{"name":"Import a BrandPack JSON blob as a new theme","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/themes/import-pack","host":["{{baseUrl}}"],"path":["v1","themes","import-pack"]},"description":"Import a BrandPack JSON blob as a new theme\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `profile:write`\n**Tags:** Themes","body":{"mode":"raw","raw":"{}","options":{"raw":{"language":"json"}}}},"response":[{"name":"Sample 201","status":"Created","code":201,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"id\": \"string\",\n  \"name\": \"string\",\n  \"description\": \"string\",\n  \"publishedAt\": \"2026-01-01T00:00:00.000Z\",\n  \"authorTenantId\": \"string\",\n  \"tokens\": {}\n}"}]},{"name":"List shared themes across tenants (marketplace catalog)","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/themes/marketplace","host":["{{baseUrl}}"],"path":["v1","themes","marketplace"]},"description":"List shared themes across tenants (marketplace catalog)\n\nBody-shaped GET because the marketplace filter set may grow; today it accepts free-text `q` and `limit`.\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `profile:read`\n**Tags:** Themes","body":{"mode":"raw","raw":"{\n  \"q\": \"string\",\n  \"limit\": 50\n}","options":{"raw":{"language":"json"}}}},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"[\n  {\n    \"id\": \"string\",\n    \"name\": \"string\",\n    \"description\": \"string\",\n    \"publishedAt\": \"2026-01-01T00:00:00.000Z\",\n    \"authorTenantId\": \"string\",\n    \"tokens\": {}\n  }\n]"}]},{"name":"Publish (share) or unpublish a theme","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/themes/{id}/publish","host":["{{baseUrl}}"],"path":["v1","themes",":id","publish"],"variable":[{"key":"id","value":"","description":"Path parameter: id"}]},"description":"Publish (share) or unpublish a theme\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `profile:write`\n**Tags:** Themes","body":{"mode":"raw","raw":"{\n  \"isPublished\": false\n}","options":{"raw":{"language":"json"}}}},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"id\": \"string\",\n  \"name\": \"string\",\n  \"description\": \"string\",\n  \"publishedAt\": \"2026-01-01T00:00:00.000Z\",\n  \"authorTenantId\": \"string\",\n  \"tokens\": {}\n}"}]},{"name":"Deep-copy a published theme into the calling tenant","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/themes/{id}/adopt","host":["{{baseUrl}}"],"path":["v1","themes",":id","adopt"],"variable":[{"key":"id","value":"","description":"Path parameter: id"}]},"description":"Deep-copy a published theme into the calling tenant\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `profile:write`\n**Tags:** Themes"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"id\": \"string\",\n  \"name\": \"string\",\n  \"description\": \"string\",\n  \"publishedAt\": \"2026-01-01T00:00:00.000Z\",\n  \"authorTenantId\": \"string\",\n  \"tokens\": {}\n}"}]}]},{"name":"Walkthroughs","item":[{"name":"List the caller's completed walkthroughs","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/me/walkthroughs/state","host":["{{baseUrl}}"],"path":["v1","me","walkthroughs","state"]},"description":"List the caller's completed walkthroughs\n\nThe walkthrough runner consults this on mount to skip any walkthrough the user has already finished.\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `profile:read`\n**Tags:** Walkthroughs"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"completions\": [\n    {\n      \"walkthroughId\": null,\n      \"completedAt\": null\n    }\n  ]\n}"}]},{"name":"Mark one walkthrough as completed for the caller (idempotent)","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/me/walkthroughs/{id}/complete","host":["{{baseUrl}}"],"path":["v1","me","walkthroughs",":id","complete"],"variable":[{"key":"id","value":"","description":"Path parameter: id"}]},"description":"Mark one walkthrough as completed for the caller (idempotent)\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `profile:write`\n**Tags:** Walkthroughs"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"walkthroughId\": \"first-task\",\n  \"completedAt\": \"2026-01-01T00:00:00.000Z\"\n}"}]}]},{"name":"Webhooks","item":[{"name":"List webhooks","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/webhooks","host":["{{baseUrl}}"],"path":["v1","webhooks"]},"description":"List webhooks\n\nReturns every webhook registered for the calling tenant. The `secret` field is **never** included - only the metadata developers need to identify a hook (id, target URL, events, enabled flag, last-success/last-failure timestamps).\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `webhooks:manage`\n**Tags:** Webhooks"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"items\": [\n    {\n      \"id\": \"wh_01HW3T2K8X9Y2VPRZGQX9NDY1D\",\n      \"url\": \"https://example.com\",\n      \"events\": [\n        null\n      ],\n      \"enabled\": false,\n      \"ownerLabel\": \"string\",\n      \"escalationEmail\": \"user@example.com\",\n      \"escalationNote\": \"string\",\n      \"lastSuccessAt\": \"2026-01-01T00:00:00.000Z\",\n      \"lastFailureAt\": \"2026-01-01T00:00:00.000Z\",\n      \"consecutiveFailures\": 0,\n      \"createdAt\": \"2026-01-01T00:00:00.000Z\"\n    }\n  ]\n}"}]},{"name":"Register a webhook","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/webhooks","host":["{{baseUrl}}"],"path":["v1","webhooks"]},"description":"Register a webhook\n\nRegister an outbound webhook. Atlas will POST a JSON body + an `X-Atlas-Signature` HMAC-SHA256 header (signed with the secret returned in this 201) to `url` for every event in `events`. The secret is returned **once** in the response body - store it; subsequent reads omit it. Failed deliveries retry with exponential backoff for 24h before pausing the hook.\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `webhooks:manage`\n**Tags:** Webhooks","body":{"mode":"raw","raw":"{\n  \"url\": \"https://example.com\",\n  \"events\": [\n    \"task.created\"\n  ],\n  \"ownerLabel\": \"string\",\n  \"escalationEmail\": \"user@example.com\",\n  \"escalationNote\": \"string\"\n}","options":{"raw":{"language":"json"}}}},"response":[{"name":"Sample 201","status":"Created. Includes the signing secret - capture it now.","code":201,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"webhook\": {\n    \"id\": \"wh_01HW3T2K8X9Y2VPRZGQX9NDY1D\",\n    \"url\": \"https://example.com\",\n    \"events\": [\n      null\n    ],\n    \"enabled\": false,\n    \"ownerLabel\": \"string\",\n    \"escalationEmail\": \"user@example.com\",\n    \"escalationNote\": \"string\",\n    \"lastSuccessAt\": \"2026-01-01T00:00:00.000Z\",\n    \"lastFailureAt\": \"2026-01-01T00:00:00.000Z\",\n    \"consecutiveFailures\": 0,\n    \"createdAt\": \"2026-01-01T00:00:00.000Z\"\n  },\n  \"secret\": \"whsec_3xK7p9aQzL2m...REDACTED-32-CHARS\"\n}"}]},{"name":"List recent delivery attempts across all webhooks in the tenant","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/webhook-deliveries","host":["{{baseUrl}}"],"path":["v1","webhook-deliveries"],"query":[{"key":"limit","value":"","description":"Page size cap. Default 50, max 200.","disabled":true}]},"description":"List recent delivery attempts across all webhooks in the tenant\n\nReturns the most-recent delivery attempts across **every** webhook in the tenant, newest first. Useful for an ops dashboard showing \"what just fired and did it work?\". For a single webhook's history, hit `/v1/webhooks/{id}/deliveries` instead.\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `webhooks:manage`\n**Tags:** Webhooks"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"items\": [\n    {\n      \"id\": \"whd_01HW3T2K8X9Y2VPRZGQX9NDY1F\",\n      \"action\": \"task.created\",\n      \"sourceAction\": \"TASK_CREATED\",\n      \"attempt\": 1,\n      \"statusCode\": 200,\n      \"ok\": true,\n      \"error\": \"string\",\n      \"errorKind\": \"NETWORK\",\n      \"isManualTest\": false,\n      \"retryState\": \"NONE\",\n      \"nextRetryAt\": \"2026-01-01T00:00:00.000Z\",\n      \"nextAttemptNumber\": 0,\n      \"url\": \"https://example.com\",\n      \"durationMs\": 0,\n      \"requestMethod\": \"POST\",\n      \"requestBody\": \"string\",\n      \"requestBodyTruncated\": false,\n      \"responseBody\": \"string\",\n      \"responseBodyTruncated\": false,\n      \"at\": \"2026-01-01T00:00:00.000Z\",\n      \"webhook\": {\n        \"id\": null,\n        \"url\": null,\n        \"events\": null\n      }\n    }\n  ]\n}"}]},{"name":"Update a webhook (url, events, ownership, or pause/resume)","request":{"method":"PATCH","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/webhooks/{id}","host":["{{baseUrl}}"],"path":["v1","webhooks",":id"],"variable":[{"key":"id","value":"","description":"Path parameter: id"}]},"description":"Update a webhook (url, events, ownership, or pause/resume)\n\nPatch any subset of `url`, `events`, `ownerLabel`, `escalationEmail`, `escalationNote`, and `disabled`. The signing secret is preserved across updates - rotate it explicitly via `POST /v1/webhooks/{id}/rotate-key` when you want to invalidate the old secret.\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `webhooks:manage`\n**Tags:** Webhooks","body":{"mode":"raw","raw":"{\n  \"url\": \"https://example.com\",\n  \"events\": [\n    \"task.created\"\n  ],\n  \"ownerLabel\": \"string\",\n  \"escalationEmail\": \"user@example.com\",\n  \"escalationNote\": \"string\",\n  \"disabled\": false\n}","options":{"raw":{"language":"json"}}}},"response":[{"name":"Sample 200","status":"Updated","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"id\": \"wh_01HW3T2K8X9Y2VPRZGQX9NDY1D\",\n  \"url\": \"https://example.com\",\n  \"events\": [\n    \"task.created\"\n  ],\n  \"enabled\": false,\n  \"ownerLabel\": \"string\",\n  \"escalationEmail\": \"user@example.com\",\n  \"escalationNote\": \"string\",\n  \"lastSuccessAt\": \"2026-01-01T00:00:00.000Z\",\n  \"lastFailureAt\": \"2026-01-01T00:00:00.000Z\",\n  \"consecutiveFailures\": 0,\n  \"createdAt\": \"2026-01-01T00:00:00.000Z\"\n}"}]},{"name":"Delete a webhook","request":{"method":"DELETE","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/webhooks/{id}","host":["{{baseUrl}}"],"path":["v1","webhooks",":id"],"variable":[{"key":"id","value":"","description":"Path parameter: id"}]},"description":"Delete a webhook\n\nPermanent delete. The webhook stops receiving events immediately and the signing secret is invalidated. Existing delivery rows are preserved (so the audit trail survives) but `replay` calls against them will 404 once the parent webhook is gone. Idempotent - deleting an already-deleted hook returns 204 rather than 404.\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `webhooks:manage`\n**Tags:** Webhooks"},"response":[{"name":"Sample 204","status":"Deleted","code":204,"_postman_previewlanguage":"json","body":""}]},{"name":"Rotate the HMAC signing key for a webhook","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/webhooks/{id}/rotate-key","host":["{{baseUrl}}"],"path":["v1","webhooks",":id","rotate-key"],"variable":[{"key":"id","value":"","description":"Path parameter: id"}]},"description":"Rotate the HMAC signing key for a webhook\n\nIssues a fresh signing secret (`whsec_*`) and returns it ONCE. The previous secret remains valid for 24 hours so receivers can roll forward without an outage window - both signatures verify during the overlap. After 24h the old secret is purged and only the new one is accepted.\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `webhooks:manage`\n**Tags:** Webhooks"},"response":[{"name":"Sample 200","status":"Rotated. Includes the NEW secret + the timestamp at which the previous one expires.","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"webhook\": {\n    \"id\": \"wh_01HW3T2K8X9Y2VPRZGQX9NDY1D\",\n    \"url\": \"https://example.com\",\n    \"events\": [\n      null\n    ],\n    \"enabled\": false,\n    \"ownerLabel\": \"string\",\n    \"escalationEmail\": \"user@example.com\",\n    \"escalationNote\": \"string\",\n    \"lastSuccessAt\": \"2026-01-01T00:00:00.000Z\",\n    \"lastFailureAt\": \"2026-01-01T00:00:00.000Z\",\n    \"consecutiveFailures\": 0,\n    \"createdAt\": \"2026-01-01T00:00:00.000Z\"\n  },\n  \"secret\": \"whsec_4yL8q0bRzM3n...\",\n  \"previousSecretExpiresAt\": \"2026-01-01T00:00:00.000Z\"\n}"}]},{"name":"List recent delivery attempts for a webhook","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/webhooks/{id}/deliveries","host":["{{baseUrl}}"],"path":["v1","webhooks",":id","deliveries"],"variable":[{"key":"id","value":"","description":"Path parameter: id"}],"query":[{"key":"limit","value":"","description":"Page size cap. Default 50, max 200.","disabled":true}]},"description":"List recent delivery attempts for a webhook\n\nPer-webhook delivery history, newest first. The shape is identical to `GET /v1/webhook-deliveries` but scoped to one hook - perfect for a \"Recent activity\" panel inside a webhook detail page.\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `webhooks:manage`\n**Tags:** Webhooks"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"items\": [\n    {\n      \"id\": \"whd_01HW3T2K8X9Y2VPRZGQX9NDY1F\",\n      \"action\": \"task.created\",\n      \"sourceAction\": \"TASK_CREATED\",\n      \"attempt\": 1,\n      \"statusCode\": 200,\n      \"ok\": true,\n      \"error\": \"string\",\n      \"errorKind\": \"NETWORK\",\n      \"isManualTest\": false,\n      \"retryState\": \"NONE\",\n      \"nextRetryAt\": \"2026-01-01T00:00:00.000Z\",\n      \"nextAttemptNumber\": 0,\n      \"url\": \"https://example.com\",\n      \"durationMs\": 0,\n      \"requestMethod\": \"POST\",\n      \"requestBody\": \"string\",\n      \"requestBodyTruncated\": false,\n      \"responseBody\": \"string\",\n      \"responseBodyTruncated\": false,\n      \"at\": \"2026-01-01T00:00:00.000Z\",\n      \"webhook\": {\n        \"id\": null,\n        \"url\": null,\n        \"events\": null\n      }\n    }\n  ]\n}"}]},{"name":"Send a manual test delivery to a webhook","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/webhooks/{id}/test-delivery","host":["{{baseUrl}}"],"path":["v1","webhooks",":id","test-delivery"],"variable":[{"key":"id","value":"","description":"Path parameter: id"}]},"description":"Send a manual test delivery to a webhook\n\nFires a synthetic `webhook.test` event to the hook's URL, signed with the same HMAC secret as production traffic. The request returns immediately (202); inspect the resulting row via `/v1/webhooks/{id}/deliveries`. `isManualTest` is set on the delivery row so dashboards can filter test traffic out.\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `webhooks:manage`\n**Tags:** Webhooks"},"response":[{"name":"Sample 202","status":"Accepted - the test delivery is queued.","code":202,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"ok\": false,\n  \"deliveryId\": \"string\"\n}"}]},{"name":"Replay a prior webhook delivery","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/webhooks/{id}/deliveries/{deliveryId}/replay","host":["{{baseUrl}}"],"path":["v1","webhooks",":id","deliveries",":deliveryId","replay"],"variable":[{"key":"id","value":"","description":"Path parameter: id"},{"key":"deliveryId","value":"","description":"Path parameter: deliveryId"}]},"description":"Replay a prior webhook delivery\n\nRe-sends the exact same request body that the original delivery attempt used - useful for \"the receiver was down for an hour, replay anything that 5xx'd during that window\". The replay creates a NEW delivery row (so the original audit trail is preserved); the new row's `attempt` resets to 1 and `isManualTest` is `false`.\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `webhooks:manage`\n**Tags:** Webhooks"},"response":[{"name":"Sample 202","status":"Accepted - the replay is queued.","code":202,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"ok\": false,\n  \"replayDeliveryId\": \"string\"\n}"}]},{"name":"Replay a webhook delivery from the retry / dead-letter inbox","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/webhook-deliveries/{id}/retry","host":["{{baseUrl}}"],"path":["v1","webhook-deliveries",":id","retry"],"variable":[{"key":"id","value":"","description":"Path parameter: id"}]},"description":"Replay a webhook delivery from the retry / dead-letter inbox\n\nEnqueues a fresh delivery row that the webhook-delivery worker picks up on its next tick. The original row is preserved for audit.\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `webhooks:manage`\n**Tags:** Webhooks"},"response":[{"name":"Sample 202","status":"Accepted - replay is queued.","code":202,"_postman_previewlanguage":"json","body":""}]},{"name":"Per-tenant webhook delivery dashboard","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/admin/webhooks/deliveries","host":["{{baseUrl}}"],"path":["v1","admin","webhooks","deliveries"],"query":[{"key":"webhookId","value":"","disabled":true},{"key":"status","value":"","disabled":true},{"key":"fromTs","value":"","disabled":true},{"key":"toTs","value":"","disabled":true},{"key":"limit","value":"","disabled":true},{"key":"cursor","value":"","disabled":true}]},"description":"Per-tenant webhook delivery dashboard\n\nRicher than `/v1/webhook-deliveries`: supports filtering by `webhookId`, lifecycle `status`, and an `[fromTs, toTs]` time window so the dashboard can show \"last hour\", \"last 24h\", etc. Cursor-paginated.\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `webhooks:manage`\n**Tags:** Webhooks"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"items\": [\n    {\n      \"id\": \"whd_01HW3T2K8X9Y2VPRZGQX9NDY1F\",\n      \"webhookId\": \"wh_01HW3T2K8X9Y2VPRZGQX9NDY1D\",\n      \"event\": \"task.created\",\n      \"status\": null,\n      \"statusCode\": 0,\n      \"attempt\": 0,\n      \"maxAttempts\": 0,\n      \"nextAttemptAt\": \"2026-01-01T00:00:00.000Z\",\n      \"durationMs\": 0,\n      \"errorMessage\": \"string\",\n      \"createdAt\": \"2026-01-01T00:00:00.000Z\",\n      \"updatedAt\": \"2026-01-01T00:00:00.000Z\"\n    }\n  ],\n  \"nextCursor\": \"string\"\n}"}]},{"name":"Read the full request + response capture for one delivery","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/admin/webhooks/deliveries/{id}/payload","host":["{{baseUrl}}"],"path":["v1","admin","webhooks","deliveries",":id","payload"],"variable":[{"key":"id","value":"","description":"Path parameter: id"}]},"description":"Read the full request + response capture for one delivery\n\nBodies may be truncated to 64 KiB; the `bodyTruncated` flags indicate when that happened.\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `webhooks:manage`\n**Tags:** Webhooks"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"delivery\": {\n    \"id\": \"whd_01HW3T2K8X9Y2VPRZGQX9NDY1F\",\n    \"webhookId\": \"wh_01HW3T2K8X9Y2VPRZGQX9NDY1D\",\n    \"event\": \"task.created\",\n    \"status\": null,\n    \"statusCode\": 0,\n    \"attempt\": 0,\n    \"maxAttempts\": 0,\n    \"nextAttemptAt\": \"2026-01-01T00:00:00.000Z\",\n    \"durationMs\": 0,\n    \"errorMessage\": \"string\",\n    \"createdAt\": \"2026-01-01T00:00:00.000Z\",\n    \"updatedAt\": \"2026-01-01T00:00:00.000Z\"\n  },\n  \"request\": {\n    \"url\": \"https://example.com\",\n    \"method\": \"POST\",\n    \"headers\": {},\n    \"body\": \"string\",\n    \"bodyTruncated\": false\n  },\n  \"response\": {\n    \"statusCode\": 0,\n    \"headers\": {},\n    \"body\": \"string\",\n    \"bodyTruncated\": false\n  }\n}"}]},{"name":"Re-queue a delivery from the admin dashboard","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/admin/webhooks/deliveries/{id}/retry","host":["{{baseUrl}}"],"path":["v1","admin","webhooks","deliveries",":id","retry"],"variable":[{"key":"id","value":"","description":"Path parameter: id"}]},"description":"Re-queue a delivery from the admin dashboard\n\nCreates a NEW delivery row; the original is preserved for audit. Returns 202 immediately - the worker picks it up on the next tick.\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `webhooks:manage`\n**Tags:** Webhooks"},"response":[{"name":"Sample 202","status":"Accepted - retry queued","code":202,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"ok\": false,\n  \"retryDeliveryId\": \"string\"\n}"}]}]},{"name":"Workflows","item":[{"name":"List status workflows for a project","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/projects/{projectId}/workflows","host":["{{baseUrl}}"],"path":["v1","projects",":projectId","workflows"],"variable":[{"key":"projectId","value":"","description":"Path parameter: projectId"}]},"description":"List status workflows for a project\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `projects:read`\n**Tags:** Workflows"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"items\": [\n    {\n      \"id\": \"wfl_01HW3T...\",\n      \"projectId\": \"string\",\n      \"key\": \"support_ticket\",\n      \"name\": \"string\",\n      \"description\": \"string\",\n      \"isPersonal\": false,\n      \"version\": 0,\n      \"createdAt\": \"2026-01-01T00:00:00.000Z\",\n      \"updatedAt\": \"2026-01-01T00:00:00.000Z\"\n    }\n  ]\n}"}]},{"name":"Create a workflow under a project","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/projects/{projectId}/workflows","host":["{{baseUrl}}"],"path":["v1","projects",":projectId","workflows"],"variable":[{"key":"projectId","value":"","description":"Path parameter: projectId"}]},"description":"Create a workflow under a project\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `projects:write`\n**Tags:** Workflows","body":{"mode":"raw","raw":"{\n  \"key\": \"string\",\n  \"name\": \"string\",\n  \"description\": \"string\",\n  \"isPersonal\": false\n}","options":{"raw":{"language":"json"}}}},"response":[{"name":"Sample 201","status":"Created","code":201,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"id\": \"wfl_01HW3T...\",\n  \"projectId\": \"string\",\n  \"key\": \"support_ticket\",\n  \"name\": \"string\",\n  \"description\": \"string\",\n  \"isPersonal\": false,\n  \"version\": 0,\n  \"createdAt\": \"2026-01-01T00:00:00.000Z\",\n  \"updatedAt\": \"2026-01-01T00:00:00.000Z\"\n}"}]},{"name":"Read a workflow by its project-unique key","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/projects/{projectId}/workflows/by-key/{key}","host":["{{baseUrl}}"],"path":["v1","projects",":projectId","workflows","by-key",":key"],"variable":[{"key":"projectId","value":"","description":"Path parameter: projectId"},{"key":"key","value":"","description":"Path parameter: key"}]},"description":"Read a workflow by its project-unique key\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `projects:read`\n**Tags:** Workflows"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"id\": \"wfl_01HW3T...\",\n  \"projectId\": \"string\",\n  \"key\": \"support_ticket\",\n  \"name\": \"string\",\n  \"description\": \"string\",\n  \"isPersonal\": false,\n  \"version\": 0,\n  \"createdAt\": \"2026-01-01T00:00:00.000Z\",\n  \"updatedAt\": \"2026-01-01T00:00:00.000Z\"\n}"}]},{"name":"Read a workflow","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/projects/{projectId}/workflows/{id}","host":["{{baseUrl}}"],"path":["v1","projects",":projectId","workflows",":id"],"variable":[{"key":"projectId","value":"","description":"Path parameter: projectId"},{"key":"id","value":"","description":"Path parameter: id"}]},"description":"Read a workflow\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `projects:read`\n**Tags:** Workflows"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"id\": \"wfl_01HW3T...\",\n  \"projectId\": \"string\",\n  \"key\": \"support_ticket\",\n  \"name\": \"string\",\n  \"description\": \"string\",\n  \"isPersonal\": false,\n  \"version\": 0,\n  \"createdAt\": \"2026-01-01T00:00:00.000Z\",\n  \"updatedAt\": \"2026-01-01T00:00:00.000Z\"\n}"}]},{"name":"Update a workflow (optimistic concurrency)","request":{"method":"PATCH","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/projects/{projectId}/workflows/{id}","host":["{{baseUrl}}"],"path":["v1","projects",":projectId","workflows",":id"],"variable":[{"key":"projectId","value":"","description":"Path parameter: projectId"},{"key":"id","value":"","description":"Path parameter: id"}]},"description":"Update a workflow (optimistic concurrency)\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `projects:write`\n**Tags:** Workflows","body":{"mode":"raw","raw":"{\n  \"name\": \"string\",\n  \"description\": \"string\",\n  \"isPersonal\": false,\n  \"expectedVersion\": 0\n}","options":{"raw":{"language":"json"}}}},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"id\": \"wfl_01HW3T...\",\n  \"projectId\": \"string\",\n  \"key\": \"support_ticket\",\n  \"name\": \"string\",\n  \"description\": \"string\",\n  \"isPersonal\": false,\n  \"version\": 0,\n  \"createdAt\": \"2026-01-01T00:00:00.000Z\",\n  \"updatedAt\": \"2026-01-01T00:00:00.000Z\"\n}"}]},{"name":"Delete a workflow","request":{"method":"DELETE","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/projects/{projectId}/workflows/{id}","host":["{{baseUrl}}"],"path":["v1","projects",":projectId","workflows",":id"],"variable":[{"key":"projectId","value":"","description":"Path parameter: projectId"},{"key":"id","value":"","description":"Path parameter: id"}]},"description":"Delete a workflow\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `projects:write`\n**Tags:** Workflows"},"response":[{"name":"Sample 204","status":"Deleted","code":204,"_postman_previewlanguage":"json","body":""}]},{"name":"List status assignments for a workflow","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/projects/{projectId}/workflows/{id}/statuses","host":["{{baseUrl}}"],"path":["v1","projects",":projectId","workflows",":id","statuses"],"variable":[{"key":"projectId","value":"","description":"Path parameter: projectId"},{"key":"id","value":"","description":"Path parameter: id"}]},"description":"List status assignments for a workflow\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `projects:read`\n**Tags:** Workflows"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"assignments\": [\n    {\n      \"statusId\": \"string\",\n      \"isInitial\": false,\n      \"orderInWorkflow\": 0\n    }\n  ]\n}"}]},{"name":"Atomically replace the workflow's status-set","request":{"method":"PUT","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"},{"key":"Idempotency-Key","value":"{{idempotencyKey}}","type":"text","description":"Optional. Replaying the same key within 24h returns the original 2xx response.","disabled":true}],"url":{"raw":"{{baseUrl}}/v1/projects/{projectId}/workflows/{id}/statuses","host":["{{baseUrl}}"],"path":["v1","projects",":projectId","workflows",":id","statuses"],"variable":[{"key":"projectId","value":"","description":"Path parameter: projectId"},{"key":"id","value":"","description":"Path parameter: id"}]},"description":"Atomically replace the workflow's status-set\n\nExactly one assignment must have `isInitial: true` (server returns 422 otherwise).\n\n**Rate limit class:** `write`\n**Required PAT scopes (any one):** `projects:write`\n**Tags:** Workflows","body":{"mode":"raw","raw":"{\n  \"assignments\": [\n    {\n      \"statusId\": null,\n      \"isInitial\": null,\n      \"orderInWorkflow\": null\n    }\n  ]\n}","options":{"raw":{"language":"json"}}}},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"assignments\": [\n    {\n      \"statusId\": \"string\",\n      \"isInitial\": false,\n      \"orderInWorkflow\": 0\n    }\n  ]\n}"}]},{"name":"List workflow runs for a workflow","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/workflows/{id}/runs","host":["{{baseUrl}}"],"path":["v1","workflows",":id","runs"],"variable":[{"key":"id","value":"","description":"Path parameter: id"}],"query":[{"key":"status","value":"","disabled":true},{"key":"limit","value":"","disabled":true},{"key":"cursor","value":"","disabled":true}]},"description":"List workflow runs for a workflow\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `projects:read`\n**Tags:** Workflows"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"items\": [\n    {\n      \"id\": \"wfr_01HW3T...\",\n      \"workflowId\": \"string\",\n      \"status\": \"queued\",\n      \"startedAt\": \"2026-01-01T00:00:00.000Z\",\n      \"completedAt\": \"2026-01-01T00:00:00.000Z\",\n      \"triggeredById\": \"string\",\n      \"contextSummary\": \"string\"\n    }\n  ],\n  \"nextCursor\": \"string\"\n}"}]},{"name":"List steps for a workflow run","request":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/v1/workflows/runs/{runId}/steps","host":["{{baseUrl}}"],"path":["v1","workflows","runs",":runId","steps"],"variable":[{"key":"runId","value":"","description":"Path parameter: runId"}]},"description":"List steps for a workflow run\n\n**Rate limit class:** `read`\n**Required PAT scopes (any one):** `projects:read`\n**Tags:** Workflows"},"response":[{"name":"Sample 200","status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":"{\n  \"items\": [\n    {\n      \"id\": \"string\",\n      \"runId\": \"string\",\n      \"index\": 0,\n      \"kind\": \"string\",\n      \"status\": \"queued\",\n      \"input\": {},\n      \"output\": {},\n      \"errorMessage\": \"string\",\n      \"startedAt\": \"2026-01-01T00:00:00.000Z\",\n      \"completedAt\": \"2026-01-01T00:00:00.000Z\"\n    }\n  ]\n}"}]}]}],"auth":{"type":"bearer","bearer":[{"key":"token","value":"{{apiKey}}","type":"string"}]},"variable":[{"key":"baseUrl","value":"https://api-production-50c0.up.railway.app","type":"string","description":"Atlas API base URL. Override per environment."},{"key":"apiKey","value":"","type":"string","description":"Personal Access Token (atlas_pat_...). Mint at /settings/api-access."},{"key":"idempotencyKey","value":"","type":"string","description":"Optional client-supplied idempotency key for POST/PATCH/PUT bodies. Postman pre-request script auto-fills a UUID when blank."}],"event":[{"listen":"prerequest","script":{"type":"text/javascript","exec":["// Auto-generate an idempotency key per request when the user hasn't pinned one.","if (!pm.collectionVariables.get('idempotencyKey')) {","  pm.collectionVariables.set('idempotencyKey', 'idem_' + Math.random().toString(36).slice(2) + '_' + Date.now());","}"]}}]}