{"openapi":"3.1.0","info":{"title":"Align Public Developer API","version":"1.0.0","description":"Tenant-scoped REST API for the Align client-feedback & PM platform.\n\n**Authentication**: send your API key as either `Authorization: Bearer <key>` or `X-API-Key: <key>`.\n**Rate limit**: 600 requests / minute per key (sliding window). 429 responses include `Retry-After` and `X-RateLimit-*` headers.\n**Pagination**: list endpoints accept `page` and `pageSize` (max 100) and respond with `{ data, page, pageSize, total }`.\n**Idempotency**: POST endpoints accept an optional `Idempotency-Key` header (24 h cache).\n**Versioning**: only additive changes within v1. Breaking changes ship under `/api/v2`.\n\n**Key minting**: organization administrators can mint either organization-scoped or project-scoped keys from `/admin/developer`. Members with the `developer`, `tech_lead`, `devops_engineer`, or `manager` role can mint **project-scoped keys only** for projects they belong to. Project-scoped keys are restricted to `/projects/{scopedProjectId}/...` paths plus `/me`.","contact":{"name":"Align Developer Support","url":"https://app.alignsoft.us/admin/developer/keys"}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"servers":[{"url":"https://app.alignsoft.us/api/v1","description":"Current host"}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"Pass your API key as `Authorization: Bearer <key>`."},"apiKeyHeader":{"type":"apiKey","in":"header","name":"X-API-Key","description":"Pass your API key as `X-API-Key: <key>`."}},"responses":{"Unauthorized":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"Forbidden":{"description":"Authenticated but lacking the required permission, or the API v1 feature is disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"NotFound":{"description":"Resource not found or not visible to this API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"RateLimited":{"description":"Per-key sliding-window rate limit exceeded. Inspect the Retry-After header.","headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds until the limit resets."},"X-RateLimit-Limit":{"schema":{"type":"integer"}},"X-RateLimit-Remaining":{"schema":{"type":"integer"}},"X-RateLimit-Reset":{"schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"schemas":{"Error":{"type":"object","properties":{"reason":{"type":"string","description":"Machine-readable error code.","example":"validation_error"},"message":{"type":"string","description":"Human-readable error message.","example":"Invalid payload."},"details":{"type":"object","additionalProperties":{},"description":"Optional structured detail payload."}},"required":["reason","message"]},"Me":{"type":"object","properties":{"apiKeyId":{"type":"string","format":"uuid","example":"3fa85f64-5717-4562-b3fc-2c963f66afa6"},"keyName":{"type":["string","null"],"example":"CI Deploy Key"},"keyPrefix":{"type":["string","null"],"example":"ak_live_xxxx"},"organizationId":{"type":"string","format":"uuid","example":"7b1e2c3d-0000-0000-0000-000000000001"},"scope":{"type":"string","enum":["organization","project"],"example":"organization"},"scopedProjectId":{"type":["string","null"],"format":"uuid","example":null},"permissions":{"type":["array","null"],"items":{"type":"string"},"example":["read:project","write:entry"]},"createdByUserId":{"type":"string","format":"uuid","example":"9a8b7c6d-0000-0000-0000-000000000002"},"lastUsedAt":{"type":["string","null"],"format":"date-time","example":"2025-01-15T10:30:00Z"}},"required":["apiKeyId","keyName","keyPrefix","organizationId","scope","scopedProjectId","permissions","createdByUserId","lastUsedAt"]},"Project":{"type":"object","properties":{"id":{"type":"string","format":"uuid","example":"3fa85f64-5717-4562-b3fc-2c963f66afa6"},"name":{"type":"string","example":"Align v2 Redesign"},"description":{"type":"string","example":"Complete redesign of the Align platform."},"status":{"type":"string","enum":["active","on_hold","completed","archived"],"example":"active"},"organizationId":{"type":["string","null"],"format":"uuid","example":"7b1e2c3d-0000-0000-0000-000000000001"},"clientId":{"type":"string","format":"uuid","example":"9a8b7c6d-0000-0000-0000-000000000002"},"logoUrl":{"type":["string","null"],"format":"uri","example":null},"createdAt":{"type":"string","format":"date-time","example":"2025-01-01T00:00:00Z"}},"required":["id","name","description","status","organizationId","clientId","logoUrl","createdAt"]},"Entry":{"type":"object","properties":{"id":{"type":"string","format":"uuid","example":"3fa85f64-5717-4562-b3fc-2c963f66afa6"},"projectId":{"type":"string","format":"uuid","example":"7b1e2c3d-0000-0000-0000-000000000001"},"entryNumber":{"type":["integer","null"],"example":42},"type":{"type":"string","enum":["feature_request","bug_report","feedback","validation","documentation","platform_infrastructure","ci_cd","security"],"example":"bug_report"},"title":{"type":"string","example":"Login button unresponsive on mobile Safari"},"description":{"type":"string","example":"Steps to reproduce: 1. Open Safari on iOS..."},"status":{"type":"string","enum":["open","assigned","in_progress","deployed","solved"],"example":"open"},"priority":{"type":"string","enum":["low","medium","high","critical"],"example":"high"},"assignedToId":{"type":["string","null"],"format":"uuid","example":null},"releaseId":{"type":["string","null"],"format":"uuid","example":null},"typeMetadata":{"type":["object","null"],"additionalProperties":{},"description":"Per-type conditional metadata keyed by entry type."},"deploymentStage":{"type":["string","null"],"enum":["testing","staging","production"],"description":"Deployment environment stage. Set automatically by the Railway or GitHub `deployment_status` webhook when an entry is deployed. Null until the entry reaches a tracked environment.","example":null},"createdAt":{"type":"string","format":"date-time","example":"2025-01-01T00:00:00Z"},"updatedAt":{"type":"string","format":"date-time","example":"2025-01-15T10:30:00Z"}},"required":["id","projectId","entryNumber","type","title","description","status","priority","assignedToId","releaseId","typeMetadata","deploymentStage","createdAt","updatedAt"]},"Comment":{"type":"object","properties":{"id":{"type":"string","format":"uuid","example":"3fa85f64-5717-4562-b3fc-2c963f66afa6"},"entryId":{"type":"string","format":"uuid","example":"7b1e2c3d-0000-0000-0000-000000000001"},"body":{"type":"string","example":"Reproduced on iOS 17.2 as well."},"authorId":{"type":"string","format":"uuid","example":"9a8b7c6d-0000-0000-0000-000000000002"},"createdAt":{"type":"string","format":"date-time","example":"2025-01-15T10:30:00Z"}},"required":["id","entryId","body","authorId","createdAt"]},"Attachment":{"type":"object","properties":{"id":{"type":"string","format":"uuid","example":"3fa85f64-5717-4562-b3fc-2c963f66afa6"},"entryId":{"type":"string","format":"uuid","example":"7b1e2c3d-0000-0000-0000-000000000001"},"fileName":{"type":"string","example":"screenshot.png"},"fileSize":{"type":"string","description":"File size in bytes (stored as string for precision).","example":"204800"},"fileType":{"type":"string","description":"MIME type.","example":"image/png"},"objectPath":{"type":"string","example":"public/attachments/screenshot.png"},"category":{"type":["string","null"],"example":"product_business"},"createdAt":{"type":"string","format":"date-time","example":"2025-01-15T10:30:00Z"}},"required":["id","entryId","fileName","fileSize","fileType","objectPath","category","createdAt"]},"Release":{"type":"object","properties":{"id":{"type":"string","format":"uuid","example":"3fa85f64-5717-4562-b3fc-2c963f66afa6"},"projectId":{"type":"string","format":"uuid","example":"7b1e2c3d-0000-0000-0000-000000000001"},"name":{"type":"string","example":"v2.3.0"},"description":{"type":["string","null"],"example":"Performance improvements and bug fixes."},"version":{"type":["string","null"],"example":"2.3.0"},"status":{"type":"string","enum":["planning","active","in_progress","testing","completed","released","archived"],"example":"planning"},"type":{"type":"string","enum":["major","minor","hotfix","patch"],"example":"minor"},"startDate":{"type":"string","format":"date-time","example":"2025-02-01T00:00:00Z"},"endDate":{"type":"string","format":"date-time","example":"2025-02-28T00:00:00Z"},"releasedAt":{"type":["string","null"],"format":"date-time","example":null},"createdAt":{"type":"string","format":"date-time","example":"2025-01-01T00:00:00Z"},"updatedAt":{"type":"string","format":"date-time","example":"2025-01-15T10:30:00Z"}},"required":["id","projectId","name","description","version","status","type","startDate","endDate","releasedAt","createdAt","updatedAt"]},"User":{"type":"object","properties":{"id":{"type":"string","format":"uuid","example":"9a8b7c6d-0000-0000-0000-000000000002"},"name":{"type":"string","example":"Jane Smith"},"email":{"type":"string","format":"email","example":"jane@example.com"},"role":{"type":"string","enum":["user","client","tester","developer","tech_lead","product_owner","devops_engineer","manager","admin","platform_admin"],"example":"developer"},"organizationId":{"type":["string","null"],"format":"uuid","example":"7b1e2c3d-0000-0000-0000-000000000001"},"createdAt":{"type":"string","format":"date-time","example":"2025-01-01T00:00:00Z"}},"required":["id","name","email","role","organizationId","createdAt"]},"Webhook":{"type":"object","properties":{"id":{"type":"string","format":"uuid","example":"3fa85f64-5717-4562-b3fc-2c963f66afa6"},"destinationUrl":{"type":"string","format":"uri","example":"https://hooks.example.com/align"},"eventNames":{"type":"array","items":{"type":"string"},"example":["entry.created","entry.updated"]},"enabled":{"type":"boolean","example":true},"description":{"type":["string","null"],"example":"Notify CI pipeline on entry changes."},"createdAt":{"type":"string","format":"date-time","example":"2025-01-01T00:00:00Z"}},"required":["id","destinationUrl","eventNames","enabled","description","createdAt"],"description":"An outbound webhook subscription. Align signs each delivery with these request headers:\n- `X-Align-Event` — the event name (e.g. `entry.created`)\n- `X-Align-Delivery-Id` — unique domain-event UUID for this delivery\n- `X-Align-Timestamp` — Unix epoch seconds at time of delivery\n- `X-Align-Signature` — HMAC-SHA256 of the request body, prefixed `sha256=`"},"WebhookCreateResponse":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"destinationUrl":{"type":"string","format":"uri"},"eventNames":{"type":"array","items":{"type":"string"}},"enabled":{"type":"boolean"},"description":{"type":["string","null"]},"hmacSecret":{"type":"string","description":"HMAC signing secret. Only returned on creation — store it immediately.","example":"whsec_abc123..."},"createdAt":{"type":"string","format":"date-time"}},"required":["id","destinationUrl","eventNames","enabled","description","hmacSecret","createdAt"]},"AuditEvent":{"type":"object","properties":{"id":{"type":"string","format":"uuid","example":"3fa85f64-5717-4562-b3fc-2c963f66afa6"},"entityType":{"type":"string","example":"entry"},"action":{"type":"string","example":"create"},"entityId":{"type":"string","example":"7b1e2c3d-0000-0000-0000-000000000001"},"entityName":{"type":["string","null"],"example":"Login bug on mobile Safari"},"actorId":{"type":["string","null"],"format":"uuid","example":"9a8b7c6d-0000-0000-0000-000000000002"},"metadata":{"type":["object","null"],"additionalProperties":{},"description":"Structured metadata. API-key writes include `actorType: 'api_key'` and `apiKeyId`."},"createdAt":{"type":"string","format":"date-time","example":"2025-01-15T10:30:00Z"}},"required":["id","entityType","action","entityId","entityName","actorId","metadata","createdAt"]},"Agreement":{"type":"object","properties":{"id":{"type":"string","format":"uuid","example":"3fa85f64-5717-4562-b3fc-2c963f66afa6"},"projectId":{"type":["string","null"],"format":"uuid","example":"7b1e2c3d-0000-0000-0000-000000000001"},"title":{"type":"string","example":"Software Development Agreement"},"status":{"type":"string","example":"pending_signature"},"createdAt":{"type":"string","format":"date-time","example":"2025-01-01T00:00:00Z"}},"required":["id","projectId","title","status","createdAt"]},"WikiPage":{"type":"object","properties":{"id":{"type":"string","format":"uuid","example":"3fa85f64-5717-4562-b3fc-2c963f66afa6"},"projectId":{"type":"string","format":"uuid","example":"7b1e2c3d-0000-0000-0000-000000000001"},"title":{"type":"string","example":"Getting Started Guide"},"content":{"type":["string","null"],"description":"Markdown content."},"createdAt":{"type":"string","format":"date-time","example":"2025-01-01T00:00:00Z"},"updatedAt":{"type":"string","format":"date-time","example":"2025-01-15T10:30:00Z"}},"required":["id","projectId","title","content","createdAt","updatedAt"]},"WikiPageCreate":{"type":"object","properties":{"title":{"type":"string","minLength":1,"example":"Getting Started Guide"},"content":{"type":["string","null"],"description":"Markdown content."},"externalRef":{"type":"object","properties":{"provider":{"type":"string","minLength":1,"example":"illumera"},"externalType":{"type":"string","minLength":1,"example":"wiki_page"},"externalId":{"type":"string","minLength":1,"example":"ext-page-001"}},"required":["provider","externalType","externalId"],"description":"Optional external reference for idempotent upserts."}},"required":["title"]},"WikiPageUpdate":{"type":"object","properties":{"title":{"type":"string","minLength":1,"example":"Revised Guide"},"content":{"type":["string","null"],"description":"Markdown content."}}},"ProjectMember":{"type":"object","properties":{"id":{"type":"string","format":"uuid","example":"3fa85f64-5717-4562-b3fc-2c963f66afa6"},"projectId":{"type":"string","format":"uuid","example":"7b1e2c3d-0000-0000-0000-000000000001"},"userId":{"type":"string","format":"uuid","example":"9a8b7c6d-0000-0000-0000-000000000002"},"roleOverride":{"type":["string","null"],"description":"Optional role override for this project. Null = inherits org role.","example":"viewer"},"metadata":{"type":["object","null"],"additionalProperties":{},"description":"Provider-supplied metadata."},"createdAt":{"type":"string","format":"date-time","example":"2025-01-01T00:00:00Z"}},"required":["id","projectId","userId","roleOverride","metadata","createdAt"]},"TimeEntry":{"type":"object","properties":{"id":{"type":"string","format":"uuid","example":"3fa85f64-5717-4562-b3fc-2c963f66afa6"},"organizationId":{"type":"string","format":"uuid","example":"7b1e2c3d-0000-0000-0000-000000000001"},"projectId":{"type":"string","format":"uuid","example":"9a8b7c6d-0000-0000-0000-000000000002"},"userId":{"type":"string","format":"uuid","example":"3fa85f64-5717-4562-b3fc-2c963f66afa6"},"entryId":{"type":["string","null"],"format":"uuid","description":"Associated entry/ticket, if any.","example":null},"releaseId":{"type":["string","null"],"format":"uuid","example":null},"workDate":{"type":"string","description":"ISO date (YYYY-MM-DD).","example":"2025-01-15"},"hours":{"type":"string","description":"Logged hours (decimal string).","example":"2.5"},"minutes":{"type":"integer","description":"Logged minutes (derived from hours).","example":150},"description":{"type":["string","null"],"example":"Implemented login flow."},"billable":{"type":"boolean","example":true},"source":{"type":"string","description":"How the entry was created (api, ui, import).","example":"api"},"status":{"type":"string","enum":["draft","submitted","approved","rejected","locked","invoiced"],"example":"draft"},"invoiced":{"type":"boolean","example":false},"createdAt":{"type":"string","format":"date-time","example":"2025-01-15T08:00:00Z"},"updatedAt":{"type":"string","format":"date-time","example":"2025-01-15T10:30:00Z"}},"required":["id","organizationId","projectId","userId","entryId","releaseId","workDate","hours","minutes","description","billable","source","status","invoiced","createdAt","updatedAt"]},"TimeEntryCreate":{"type":"object","properties":{"userId":{"type":"string","format":"uuid","example":"9a8b7c6d-0000-0000-0000-000000000002"},"workDate":{"type":"string","example":"2025-01-15"},"minutes":{"type":"integer","minimum":1,"maximum":1440,"example":150},"hours":{"type":"string","example":"2.5"},"description":{"type":["string","null"],"example":"Implemented login flow."},"billable":{"type":"boolean","example":true},"entryId":{"type":["string","null"],"format":"uuid"},"releaseId":{"type":["string","null"],"format":"uuid"},"externalRef":{"type":"object","properties":{"provider":{"type":"string","minLength":1},"externalType":{"type":"string","minLength":1},"externalId":{"type":"string","minLength":1}},"required":["provider","externalType","externalId"],"description":"Optional external reference for idempotent upserts."}},"required":["userId","workDate"]},"TimeEntryUpdate":{"type":"object","properties":{"workDate":{"type":"string","example":"2025-01-16"},"minutes":{"type":"integer","minimum":1,"maximum":1440,"example":90},"hours":{"type":"string","example":"1.5"},"description":{"type":["string","null"]},"billable":{"type":"boolean"},"releaseId":{"type":["string","null"],"format":"uuid"}}},"TimeSummary":{"type":"object","properties":{"projectId":{"type":"string","format":"uuid","example":"7b1e2c3d-0000-0000-0000-000000000001"},"releaseId":{"type":["string","null"],"format":"uuid","example":null},"totalMinutes":{"type":"integer","example":3600},"totalHours":{"type":"string","example":"60.0"},"billableMinutes":{"type":"integer","example":2400},"byStatus":{"type":"object","additionalProperties":{"type":"integer"},"description":"Total minutes keyed by time entry status."},"byUser":{"type":"array","items":{"type":"object","properties":{"userId":{"type":"string","format":"uuid"},"totalMinutes":{"type":"integer"}},"required":["userId","totalMinutes"]},"description":"Per-user rollup."}},"required":["projectId","releaseId","totalMinutes","totalHours","billableMinutes","byStatus","byUser"]},"CostSummary":{"type":"object","properties":{"projectId":{"type":"string","format":"uuid","example":"7b1e2c3d-0000-0000-0000-000000000001"},"currency":{"type":"string","example":"USD"},"plannedCost":{"type":["string","null"],"example":"50000.00"},"actualCost":{"type":["string","null"],"example":"32500.00"},"approvedCost":{"type":["string","null"],"example":"31000.00"},"pendingCost":{"type":["string","null"],"example":"1500.00"}},"required":["projectId","currency","plannedCost","actualCost","approvedCost","pendingCost"]},"UserInviteRequest":{"type":"object","properties":{"email":{"type":"string","format":"email","example":"alice@example.com"},"name":{"type":"string","minLength":1,"example":"Alice Smith"},"role":{"type":"string","description":"Org role. admin/platform_admin are rejected. Defaults to 'user'.","example":"developer"},"projectIds":{"type":"array","items":{"type":"string","format":"uuid"},"description":"Projects to add the user to as member."},"sendInvite":{"type":"boolean","description":"Send email invitation. Default true.","example":true},"externalRef":{"type":"object","properties":{"provider":{"type":"string","minLength":1,"example":"illumera"},"externalType":{"type":"string","minLength":1,"example":"user"},"externalId":{"type":"string","minLength":1,"example":"illumera-user-001"}},"required":["provider","externalType","externalId"],"description":"Optional provider reference for idempotent upserts."},"metadata":{"type":"object","additionalProperties":{}}},"required":["email","name"]},"UserInviteResponse":{"type":"object","properties":{"userId":{"type":"string","format":"uuid","example":"9a8b7c6d-0000-0000-0000-000000000002"},"inviteId":{"type":["string","null"],"format":"uuid","description":"Set when an invitation email was dispatched.","example":"3fa85f64-5717-4562-b3fc-2c963f66afa6"},"created":{"type":"boolean","description":"True when a new user/invitation was created; false when an existing entity was returned.","example":true},"status":{"type":"string","enum":["invited","existing","linked"],"example":"invited"}},"required":["userId","inviteId","created","status"]},"BulkInviteItem":{"type":"object","properties":{"email":{"type":"string","format":"email","example":"bob@example.com"},"name":{"type":"string","minLength":1,"example":"Bob Jones"},"role":{"type":"string","example":"developer"},"projectIds":{"type":"array","items":{"type":"string","format":"uuid"}},"externalRef":{"type":"object","properties":{"provider":{"type":"string","minLength":1},"externalType":{"type":"string","minLength":1},"externalId":{"type":"string","minLength":1}},"required":["provider","externalType","externalId"]},"metadata":{"type":"object","additionalProperties":{}}},"required":["email","name"]},"BulkInviteRequest":{"type":"object","properties":{"invites":{"type":"array","items":{"$ref":"#/components/schemas/BulkInviteItem"},"minItems":1,"maxItems":50,"description":"Up to 50 invite items per request."},"sendInvite":{"type":"boolean","description":"Send invitation emails for all items. Default false for bulk.","example":false}},"required":["invites"]},"BulkInviteResultItem":{"type":"object","properties":{"email":{"type":"string","format":"email"},"status":{"type":"string","enum":["invited","existing","linked","error"]},"userId":{"type":["string","null"],"format":"uuid"},"inviteId":{"type":["string","null"],"format":"uuid"},"error":{"type":["string","null"]}},"required":["email","status","userId","inviteId","error"]},"BulkInviteResponse":{"type":"object","properties":{"results":{"type":"array","items":{"$ref":"#/components/schemas/BulkInviteResultItem"}},"successCount":{"type":"integer","example":9},"failureCount":{"type":"integer","example":1}},"required":["results","successCount","failureCount"]},"IntegrationLink":{"type":"object","properties":{"id":{"type":"string","format":"uuid","example":"3fa85f64-5717-4562-b3fc-2c963f66afa6"},"organizationId":{"type":"string","format":"uuid","example":"7b1e2c3d-0000-0000-0000-000000000001"},"provider":{"type":"string","example":"illumera"},"externalType":{"type":"string","example":"user"},"externalId":{"type":"string","example":"illumera-user-001"},"alignEntityType":{"type":"string","example":"user"},"alignEntityId":{"type":"string","format":"uuid","example":"9a8b7c6d-0000-0000-0000-000000000002"},"createdAt":{"type":"string","format":"date-time","example":"2025-01-01T00:00:00Z"}},"required":["id","organizationId","provider","externalType","externalId","alignEntityType","alignEntityId","createdAt"]},"SyncTimeEntry":{"type":"object","properties":{"projectId":{"type":"string","minLength":1,"description":"Align project UUID the time entry belongs to.","example":"7b1e2c3d-0000-0000-0000-000000000001"},"userId":{"type":"string","minLength":1,"description":"Align user UUID who performed the work.","example":"9a8b7c6d-0000-0000-0000-000000000002"},"workDate":{"type":"string","description":"ISO date (YYYY-MM-DD) or ISO 8601 datetime string for the day the work occurred.","example":"2025-01-15"},"minutes":{"type":"integer","minimum":1,"maximum":1440,"description":"Duration of the work in minutes (1–1440).","example":150},"billable":{"type":"boolean","description":"Whether the time is billable. Defaults to true.","example":true},"description":{"type":"string","maxLength":2000,"description":"Free-text description of the work performed (max 2000 chars).","example":"Sprint planning session."},"entryId":{"type":"string","description":"UUID of an existing Align entry/ticket to associate with this time entry. Must belong to the specified project.","example":"3fa85f64-5717-4562-b3fc-2c963f66afa6"},"externalSystem":{"type":"string","minLength":1,"description":"Identifier for the external system originating this time entry (e.g. `illumera`, `jira`, `harvest`).","example":"illumera"},"externalId":{"type":"string","minLength":1,"description":"Stable unique ID for this time entry within the external system. Used as the idempotency key: a second call with the same `externalSystem` + `externalId` returns the existing entry without creating a duplicate.","example":"illumera-te-001"},"externalMetadata":{"type":"object","additionalProperties":{},"description":"Arbitrary key-value metadata from the external system (e.g. task name, project code). Stored as-is and returned on reads."}},"required":["projectId","userId","workDate","minutes","externalSystem","externalId"]},"SyncTimeEntryResponse":{"type":"object","properties":{"id":{"type":"string","format":"uuid","example":"3fa85f64-5717-4562-b3fc-2c963f66afa6"},"organizationId":{"type":"string","format":"uuid","example":"7b1e2c3d-0000-0000-0000-000000000001"},"projectId":{"type":"string","format":"uuid","example":"9a8b7c6d-0000-0000-0000-000000000002"},"userId":{"type":"string","format":"uuid","example":"3fa85f64-5717-4562-b3fc-2c963f66afa6"},"entryId":{"type":["string","null"],"format":"uuid","example":null},"workDate":{"type":"string","example":"2025-01-15"},"hours":{"type":"string","example":"2.5"},"minutes":{"type":"integer","example":150},"notes":{"type":["string","null"],"example":"Sprint planning session."},"billable":{"type":"boolean","example":true},"source":{"type":"string","example":"illumera"},"status":{"type":"string","enum":["draft","submitted","approved","rejected","locked","invoiced"],"example":"draft"},"invoiced":{"type":"boolean","example":false},"createdAt":{"type":"string","format":"date-time","example":"2025-01-15T08:00:00Z"},"updatedAt":{"type":"string","format":"date-time","example":"2025-01-15T10:30:00Z"},"integrationLinkId":{"type":"string","format":"uuid","description":"UUID of the integration link that was created or matched for `externalSystem` + `externalId`.","example":"aa1b2c3d-0000-0000-0000-000000000099"},"created":{"type":"boolean","description":"True when a new time entry was created; false when the existing entry was returned (idempotent replay).","example":true}},"required":["id","organizationId","projectId","userId","entryId","workDate","hours","minutes","notes","billable","source","status","invoiced","createdAt","updatedAt","integrationLinkId","created"]},"TimeEntryWithLinks":{"type":"object","properties":{"id":{"type":"string","format":"uuid","example":"3fa85f64-5717-4562-b3fc-2c963f66afa6"},"organizationId":{"type":"string","format":"uuid","example":"7b1e2c3d-0000-0000-0000-000000000001"},"projectId":{"type":"string","format":"uuid","example":"9a8b7c6d-0000-0000-0000-000000000002"},"userId":{"type":"string","format":"uuid","example":"3fa85f64-5717-4562-b3fc-2c963f66afa6"},"entryId":{"type":["string","null"],"format":"uuid","example":null},"workDate":{"type":"string","example":"2025-01-15"},"hours":{"type":"string","example":"2.5"},"minutes":{"type":"integer","example":150},"notes":{"type":["string","null"],"example":"Sprint planning session."},"billable":{"type":"boolean","example":true},"source":{"type":"string","example":"illumera"},"status":{"type":"string","enum":["draft","submitted","approved","rejected","locked","invoiced"],"example":"draft"},"invoiced":{"type":"boolean","example":false},"createdAt":{"type":"string","format":"date-time","example":"2025-01-15T08:00:00Z"},"updatedAt":{"type":"string","format":"date-time","example":"2025-01-15T10:30:00Z"},"integrationLinks":{"type":"array","items":{"$ref":"#/components/schemas/IntegrationLink"},"description":"All integration links currently attached to this time entry. Each link records the external system and ID that created or is bound to this entry."}},"required":["id","organizationId","projectId","userId","entryId","workDate","hours","minutes","notes","billable","source","status","invoiced","createdAt","updatedAt","integrationLinks"]},"Snapshot":{"type":"object","properties":{"id":{"type":"string","format":"uuid","example":"3fa85f64-5717-4562-b3fc-2c963f66afa6"},"scopeType":{"type":"string","example":"project"},"scopeId":{"type":"string","format":"uuid","example":"7b1e2c3d-0000-0000-0000-000000000001"},"reportType":{"type":"string","example":"project_status"},"status":{"type":"string","example":"ready"},"narrativeSource":{"type":["string","null"],"enum":["ai","template"],"example":"ai"},"createdAt":{"type":"string","format":"date-time","example":"2025-01-15T10:30:00Z"}},"required":["id","scopeType","scopeId","reportType","status","narrativeSource","createdAt"]},"SearchResult":{"type":"object","properties":{"type":{"type":"string","description":"Resource type of the match.","example":"entry"},"id":{"type":"string","format":"uuid","example":"3fa85f64-5717-4562-b3fc-2c963f66afa6"},"title":{"type":"string","example":"Login button unresponsive on mobile Safari"},"projectId":{"type":["string","null"],"format":"uuid","example":"7b1e2c3d-0000-0000-0000-000000000001"},"url":{"type":"string","example":"/projects/7b1e2c3d.../entries/3fa85f64..."}},"required":["type","id","title","projectId","url"]},"ProjectList":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Project"}},"page":{"type":"integer","example":1},"pageSize":{"type":"integer","example":25},"total":{"type":"integer","example":100}},"required":["data","page","pageSize","total"]},"EntryList":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Entry"}},"page":{"type":"integer","example":1},"pageSize":{"type":"integer","example":25},"total":{"type":"integer","example":100}},"required":["data","page","pageSize","total"]},"CommentList":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Comment"}},"page":{"type":"integer","example":1},"pageSize":{"type":"integer","example":25},"total":{"type":"integer","example":100}},"required":["data","page","pageSize","total"]},"AttachmentList":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Attachment"}},"page":{"type":"integer","example":1},"pageSize":{"type":"integer","example":25},"total":{"type":"integer","example":100}},"required":["data","page","pageSize","total"]},"ReleaseList":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Release"}},"page":{"type":"integer","example":1},"pageSize":{"type":"integer","example":25},"total":{"type":"integer","example":100}},"required":["data","page","pageSize","total"]},"UserList":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/User"}},"page":{"type":"integer","example":1},"pageSize":{"type":"integer","example":25},"total":{"type":"integer","example":100}},"required":["data","page","pageSize","total"]},"WebhookList":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Webhook"}},"page":{"type":"integer","example":1},"pageSize":{"type":"integer","example":25},"total":{"type":"integer","example":100}},"required":["data","page","pageSize","total"]},"AuditEventList":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/AuditEvent"}},"page":{"type":"integer","example":1},"pageSize":{"type":"integer","example":25},"total":{"type":"integer","example":100}},"required":["data","page","pageSize","total"]},"AgreementList":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Agreement"}},"page":{"type":"integer","example":1},"pageSize":{"type":"integer","example":25},"total":{"type":"integer","example":100}},"required":["data","page","pageSize","total"]},"WikiPageList":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/WikiPage"}},"page":{"type":"integer","example":1},"pageSize":{"type":"integer","example":25},"total":{"type":"integer","example":100}},"required":["data","page","pageSize","total"]},"SnapshotList":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Snapshot"}},"page":{"type":"integer","example":1},"pageSize":{"type":"integer","example":25},"total":{"type":"integer","example":100}},"required":["data","page","pageSize","total"]},"SearchResultList":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/SearchResult"}},"page":{"type":"integer","example":1},"pageSize":{"type":"integer","example":25},"total":{"type":"integer","example":100}},"required":["data","page","pageSize","total"]},"ProjectMemberList":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/ProjectMember"}},"page":{"type":"integer","example":1},"pageSize":{"type":"integer","example":25},"total":{"type":"integer","example":100}},"required":["data","page","pageSize","total"]},"TimeEntryList":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/TimeEntry"}},"page":{"type":"integer","example":1},"pageSize":{"type":"integer","example":25},"total":{"type":"integer","example":100}},"required":["data","page","pageSize","total"]},"CreateProject":{"type":"object","properties":{"name":{"type":"string"},"description":{"type":"string"},"status":{"type":"string","enum":["active","on_hold","completed","archived"]},"logoUrl":{"type":["string","null"]},"wikiContent":{"type":["string","null"]},"slackWebhookUrl":{"type":["string","null"]},"devUrl":{"type":["string","null"]},"prodUrl":{"type":["string","null"]},"customLinks":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"},{"type":"object","additionalProperties":{}},{"type":"array","items":{}},{"type":"null"}]},"replitAppUrl":{"type":["string","null"]},"requireCascadeApproval":{"type":"boolean"},"invoicingMode":{"type":"string"},"githubCommentSyncEnabled":{"type":"boolean"},"githubAutoStatusEnabled":{"type":"boolean"},"githubAutoStatusTarget":{"type":"string"},"githubAdvancedEnabled":{"type":"boolean"},"enforceDependencyBlocking":{"type":"boolean"},"autoStatusOnUnblock":{"type":"boolean"},"autoStatusTargetStatus":{"type":"string"},"requireAutoStatusApproval":{"type":"boolean"},"ciRequired":{"type":"boolean"},"ciCheckRunName":{"type":"string"},"commitScorerEnabled":{"type":"boolean"},"flakyOverridesEnabled":{"type":"boolean"},"githubAiSuggesterEnabled":{"type":"boolean"},"githubAiRiskEnabled":{"type":"boolean"},"releaseNotesAiEnabled":{"type":"boolean"},"statusUpdateAiEnabled":{"type":"boolean"},"prDescriptionAiEnabled":{"type":"boolean"},"reviewerSuggesterAiEnabled":{"type":"boolean"},"commitLinterAiEnabled":{"type":"boolean"},"lastAiStatusUpdate":{"type":["string","null"]},"autoLinkThreshold":{"type":"string"},"suggestThreshold":{"type":"string"},"scorerRecencyDays":{"type":"integer","minimum":-2147483648,"maximum":2147483647},"replitWorkspaceId":{"type":["string","null"]},"replitBoardId":{"type":["string","null"]},"replitReplId":{"type":["string","null"]},"replitAppName":{"type":["string","null"]},"timeBillingEnabled":{"type":"boolean"},"committedCostLockedAt":{"type":["string","null"]}},"required":["name","description"],"description":"Fields for creating a project. `organizationId` and `clientId` are set server-side from the API key."},"UpdateProject":{"type":"object","properties":{"name":{"type":"string"},"description":{"type":"string"},"clientId":{"type":"string"},"status":{"type":"string","enum":["active","on_hold","completed","archived"]},"logoUrl":{"type":["string","null"]},"wikiContent":{"type":["string","null"]},"slackWebhookUrl":{"type":["string","null"]},"devUrl":{"type":["string","null"]},"prodUrl":{"type":["string","null"]},"customLinks":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"},{"type":"object","additionalProperties":{}},{"type":"array","items":{}},{"type":"null"}]},"replitAppUrl":{"type":["string","null"]},"requireCascadeApproval":{"type":"boolean"},"invoicingMode":{"type":"string"},"githubCommentSyncEnabled":{"type":"boolean"},"githubAutoStatusEnabled":{"type":"boolean"},"githubAutoStatusTarget":{"type":"string"},"githubAdvancedEnabled":{"type":"boolean"},"enforceDependencyBlocking":{"type":"boolean"},"autoStatusOnUnblock":{"type":"boolean"},"autoStatusTargetStatus":{"type":"string"},"requireAutoStatusApproval":{"type":"boolean"},"ciRequired":{"type":"boolean"},"ciCheckRunName":{"type":"string"},"commitScorerEnabled":{"type":"boolean"},"flakyOverridesEnabled":{"type":"boolean"},"githubAiSuggesterEnabled":{"type":"boolean"},"githubAiRiskEnabled":{"type":"boolean"},"releaseNotesAiEnabled":{"type":"boolean"},"statusUpdateAiEnabled":{"type":"boolean"},"prDescriptionAiEnabled":{"type":"boolean"},"reviewerSuggesterAiEnabled":{"type":"boolean"},"commitLinterAiEnabled":{"type":"boolean"},"lastAiStatusUpdate":{"type":["string","null"]},"autoLinkThreshold":{"type":"string"},"suggestThreshold":{"type":"string"},"scorerRecencyDays":{"type":"integer","minimum":-2147483648,"maximum":2147483647},"replitWorkspaceId":{"type":["string","null"]},"replitBoardId":{"type":["string","null"]},"replitReplId":{"type":["string","null"]},"replitAppName":{"type":["string","null"]},"timeBillingEnabled":{"type":"boolean"},"committedCostLockedAt":{"type":["string","null"]}},"additionalProperties":false,"description":"Fields to update on a project. Only supplied fields are changed. `organizationId` cannot be changed via the API."},"CreateEntry":{"type":"object","properties":{"assignedToId":{"type":["string","null"]},"releaseId":{"type":["string","null"]},"type":{"type":"string","enum":["feature_request","bug_report","feedback","validation","documentation","platform_infrastructure","ci_cd","security"]},"title":{"type":"string"},"description":{"type":"string"},"priority":{"type":"string","enum":["low","medium","high","critical"]},"status":{"type":"string","enum":["open","assigned","in_progress","deployed","solved"]},"webLink":{"type":["string","null"]},"stepsToReproduce":{"type":["string","null"]},"expectedBehavior":{"type":["string","null"]},"actualBehavior":{"type":["string","null"]},"environment":{"type":["string","null"]},"useCase":{"type":["string","null"]},"proposedSolution":{"type":["string","null"]},"approvalStatus":{"type":["string","null"],"enum":["pending","approved","rejected"]},"lowCost":{"type":["string","null"]},"mediumCost":{"type":["string","null"]},"highCost":{"type":["string","null"]},"committedCost":{"type":["string","null"]},"committedPosition":{"type":["string","null"]},"costSource":{"type":["string","null"]},"costApprovalStatus":{"type":["string","null"],"enum":["draft","pending_admin","pending_manager","pending_client","approved","rejected"]},"costOverrideReason":{"type":["string","null"]},"typeMetadata":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"},{"type":"object","additionalProperties":{}},{"type":"array","items":{}},{"type":"null"}]},"statusChangedAt":{"type":["string","null"]}},"required":["type","title","description"],"description":"Fields for creating an entry. `projectId` and `creatorId` are set server-side."},"UpdateEntry":{"type":"object","properties":{"assignedToId":{"type":["string","null"]},"releaseId":{"type":["string","null"]},"type":{"type":"string","enum":["feature_request","bug_report","feedback","validation","documentation","platform_infrastructure","ci_cd","security"]},"title":{"type":"string"},"description":{"type":"string"},"priority":{"type":"string","enum":["low","medium","high","critical"]},"status":{"type":"string","enum":["open","assigned","in_progress","deployed","solved"]},"webLink":{"type":["string","null"]},"stepsToReproduce":{"type":["string","null"]},"expectedBehavior":{"type":["string","null"]},"actualBehavior":{"type":["string","null"]},"environment":{"type":["string","null"]},"useCase":{"type":["string","null"]},"proposedSolution":{"type":["string","null"]},"approvalStatus":{"type":["string","null"],"enum":["pending","approved","rejected"]},"lowCost":{"type":["string","null"]},"mediumCost":{"type":["string","null"]},"highCost":{"type":["string","null"]},"committedCost":{"type":["string","null"]},"committedPosition":{"type":["string","null"]},"costSource":{"type":["string","null"]},"costApprovalStatus":{"type":["string","null"],"enum":["draft","pending_admin","pending_manager","pending_client","approved","rejected"]},"costOverrideReason":{"type":["string","null"]},"typeMetadata":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"},{"type":"object","additionalProperties":{}},{"type":"array","items":{}},{"type":"null"}]},"statusChangedAt":{"type":["string","null"]}},"additionalProperties":false,"description":"Fields to update on an entry. Only supplied fields are changed. `projectId` cannot be changed via the API."},"CreateComment":{"type":"object","properties":{"content":{"type":"string"},"isInternal":{"anyOf":[{"type":"string"},{"type":"string"},{"type":"null"},{"type":"null"}]},"isAiGenerated":{"type":["string","null"]}},"required":["content"],"description":"Fields for creating a comment. `entryId` and `authorId` are set server-side."},"UpdateComment":{"type":"object","properties":{"content":{"type":"string"},"isInternal":{"anyOf":[{"type":"string"},{"type":"string"},{"type":"null"},{"type":"null"}]},"isAiGenerated":{"type":["string","null"]}},"additionalProperties":false},"CreateAttachment":{"type":"object","properties":{"fileName":{"type":"string"},"fileSize":{"type":"string"},"fileType":{"type":"string"},"objectPath":{"type":"string"},"category":{"type":["string","null"]},"isAiGenerated":{"type":["string","null"]},"sourceAssistantUploadId":{"type":["string","null"]},"sourceAssistantConversationId":{"type":["string","null"]},"linkedByUserId":{"type":["string","null"]},"addedVia":{"type":["string","null"]},"attachmentSource":{"type":["string","null"]},"evidenceSummary":{"type":["string","null"]},"attachmentStatus":{"type":"string"},"removedAt":{"type":["string","null"]},"removedByUserId":{"type":["string","null"]},"removedVia":{"type":["string","null"]},"replacementAttachmentId":{"type":["string","null"]},"replacementOfAttachmentId":{"type":["string","null"]},"lifecycleReason":{"type":["string","null"]}},"required":["fileName","fileSize","fileType","objectPath"],"description":"Fields for registering an attachment. `entryId` and `uploadedById` are set server-side."},"CreateRelease":{"type":"object","properties":{"name":{"type":"string"},"description":{"type":["string","null"]},"version":{"type":["string","null"]},"status":{"type":"string","enum":["planning","active","in_progress","testing","completed","released","archived"]},"type":{"type":"string","enum":["major","minor","hotfix","patch"]},"targetAudience":{"type":["string","null"],"enum":["internal","beta","limited","general"]},"riskLevel":{"type":["string","null"],"enum":["low","standard","high"]},"rolloutPercentage":{"type":["string","null"]},"releaseNotes":{"type":["string","null"]},"retrospectiveNotes":{"type":["string","null"]},"dependsOnReleaseId":{"type":["string","null"]},"cascadeAdvance":{"type":"boolean"},"startDate":{"anyOf":[{"type":"string"},{"type":"string"}]},"endDate":{"anyOf":[{"type":"string"},{"type":"string"}]},"releasedAt":{"type":["string","null"]},"lowCost":{"type":["string","null"]},"mediumCost":{"type":["string","null"]},"highCost":{"type":["string","null"]},"committedCost":{"type":["string","null"]},"costUpdatedAt":{"type":["string","null"]},"costSource":{"type":["string","null"]},"updatedAt":{"type":"string"}},"required":["name","startDate","endDate"],"description":"Fields for creating a release. `projectId` is set from the URL path."},"UpdateRelease":{"type":"object","properties":{"name":{"type":"string"},"description":{"type":["string","null"]},"version":{"type":["string","null"]},"status":{"type":"string","enum":["planning","active","in_progress","testing","completed","released","archived"]},"type":{"type":"string","enum":["major","minor","hotfix","patch"]},"targetAudience":{"type":["string","null"],"enum":["internal","beta","limited","general"]},"riskLevel":{"type":["string","null"],"enum":["low","standard","high"]},"rolloutPercentage":{"type":["string","null"]},"releaseNotes":{"type":["string","null"]},"retrospectiveNotes":{"type":["string","null"]},"dependsOnReleaseId":{"type":["string","null"]},"cascadeAdvance":{"type":"boolean"},"startDate":{"anyOf":[{"type":"string"},{"type":"string"}]},"endDate":{"anyOf":[{"type":"string"},{"type":"string"}]},"releasedAt":{"type":["string","null"]},"lowCost":{"type":["string","null"]},"mediumCost":{"type":["string","null"]},"highCost":{"type":["string","null"]},"committedCost":{"type":["string","null"]},"costUpdatedAt":{"type":["string","null"]},"costSource":{"type":["string","null"]},"updatedAt":{"type":"string"}},"additionalProperties":false,"description":"Fields to update on a release. Only supplied fields are changed."},"CreateWebhook":{"type":"object","properties":{"destinationUrl":{"type":"string","format":"uri","example":"https://hooks.example.com/align"},"eventNames":{"type":"array","items":{"type":"string","enum":["entry.created","entry.updated","entry.status_changed","entry.assigned","entry.commented","release.created","release.status_changed","release.released","cost.estimate_requested","cost.estimation.run.started","cost.estimation.run.finished","cost.estimation.run.failed","invoice.paid","invoice.payment_failed","invoice.finalized","cost.approved","cost.rejected","agreement.signed","pr.merged","pr.reopened","github.identity.connected","github.identity.disconnected","github.identity.policy.violated","commit.linked","commit.unlinked","ci.run.attributed","commit.entry.suggestion.generated","commit.risk.generated","release.notes.generated","project.status.update.generated","pr.description.generated","commit.suggestion.surfaced","commit.suggestion.accepted","commit.suggestion.rejected","ci.flaky.override.set","ci.gate.evaluated","agreement.persissio.callback.received","tenant.created","tenant.verified","tenant.suspended","subscription.created","subscription.updated","usage.limit.hit","subscription.upgraded","subscription.downgraded","subscription.cancelled","trial.ending_soon","trial.ended","dunning.email.sent","analytics.tenant.opted_out","analytics.tenant.opted_in","status.incident.created","status.incident.updated","status.incident.resolved","status.component.overridden","changelog.entry.scheduled","changelog.entry.published","api_key.created","api_key.revoked","api_key.used","api.rate_limit.hit","webhook.subscription.created","webhook.subscription.deleted","time.logged","time.submitted","time.approved","time.rejected","time.unlocked","time.updated","time.deleted","report.viewed","report.exported","assistant.conversation_started","assistant.message_sent","assistant.tool_proposed","assistant.tool_confirmed","assistant.tool_executed","assistant.tool_failed","assistant.guardrail_blocked","assistant.action_denied","assistant.external_action_proposed","assistant.external_action_dry_run","assistant.external_action_confirmed","assistant.external_action_executed","assistant.external_action_failed","assistant.external_action_unknown","reviewer.suggestion.generated","commit.linter.advisory.posted","wiki_page.created","wiki_page.updated","wiki_page.deleted","user.invited","user.linked","user.updated","user.bulk_invited","project_member.added","project_member.updated","project_member.removed","integration_link.created","integration_link.updated","assistant.upload_presign_requested","assistant.upload_registered","assistant.upload_scan_started","assistant.upload_scan_passed","assistant.upload_scan_failed","assistant.upload_blocked","assistant.upload_extraction_started","assistant.upload_extracted","assistant.upload_extraction_failed","assistant.upload_redacted","assistant.upload_used_as_context","assistant.upload_deleted","assistant.entry_from_uploads_proposed","assistant.entry_from_uploads_created","assistant.upload_attachment_proposed","assistant.upload_attached_to_entry","assistant.upload_attachment_failed","assistant.comment_with_uploads_proposed","assistant.comment_with_uploads_created","assistant.attachment_lifecycle_viewed","assistant.attachment_remove_proposed","assistant.attachment_removed","assistant.attachment_replace_proposed","assistant.attachment_replaced","assistant.attachment_access_refreshed","assistant.attachment_lifecycle_failed","webhook.test","pi_board.created","pi_board.updated","pi_board.published","pi_board.deleted","pi_board.assignment_moved","pi_board.poker_opened","pi_board.poker_vote","pi_board.poker_revealed","pi_board.poker_committed","pi_board.state_changed"]},"minItems":1,"example":["entry.created","entry.updated"]},"description":{"type":["string","null"],"example":"Notify CI pipeline."}},"required":["destinationUrl","eventNames"]},"UpdateWebhook":{"type":"object","properties":{"destinationUrl":{"type":"string","format":"uri","example":"https://hooks.example.com/align"},"eventNames":{"type":"array","items":{"type":"string","enum":["entry.created","entry.updated","entry.status_changed","entry.assigned","entry.commented","release.created","release.status_changed","release.released","cost.estimate_requested","cost.estimation.run.started","cost.estimation.run.finished","cost.estimation.run.failed","invoice.paid","invoice.payment_failed","invoice.finalized","cost.approved","cost.rejected","agreement.signed","pr.merged","pr.reopened","github.identity.connected","github.identity.disconnected","github.identity.policy.violated","commit.linked","commit.unlinked","ci.run.attributed","commit.entry.suggestion.generated","commit.risk.generated","release.notes.generated","project.status.update.generated","pr.description.generated","commit.suggestion.surfaced","commit.suggestion.accepted","commit.suggestion.rejected","ci.flaky.override.set","ci.gate.evaluated","agreement.persissio.callback.received","tenant.created","tenant.verified","tenant.suspended","subscription.created","subscription.updated","usage.limit.hit","subscription.upgraded","subscription.downgraded","subscription.cancelled","trial.ending_soon","trial.ended","dunning.email.sent","analytics.tenant.opted_out","analytics.tenant.opted_in","status.incident.created","status.incident.updated","status.incident.resolved","status.component.overridden","changelog.entry.scheduled","changelog.entry.published","api_key.created","api_key.revoked","api_key.used","api.rate_limit.hit","webhook.subscription.created","webhook.subscription.deleted","time.logged","time.submitted","time.approved","time.rejected","time.unlocked","time.updated","time.deleted","report.viewed","report.exported","assistant.conversation_started","assistant.message_sent","assistant.tool_proposed","assistant.tool_confirmed","assistant.tool_executed","assistant.tool_failed","assistant.guardrail_blocked","assistant.action_denied","assistant.external_action_proposed","assistant.external_action_dry_run","assistant.external_action_confirmed","assistant.external_action_executed","assistant.external_action_failed","assistant.external_action_unknown","reviewer.suggestion.generated","commit.linter.advisory.posted","wiki_page.created","wiki_page.updated","wiki_page.deleted","user.invited","user.linked","user.updated","user.bulk_invited","project_member.added","project_member.updated","project_member.removed","integration_link.created","integration_link.updated","assistant.upload_presign_requested","assistant.upload_registered","assistant.upload_scan_started","assistant.upload_scan_passed","assistant.upload_scan_failed","assistant.upload_blocked","assistant.upload_extraction_started","assistant.upload_extracted","assistant.upload_extraction_failed","assistant.upload_redacted","assistant.upload_used_as_context","assistant.upload_deleted","assistant.entry_from_uploads_proposed","assistant.entry_from_uploads_created","assistant.upload_attachment_proposed","assistant.upload_attached_to_entry","assistant.upload_attachment_failed","assistant.comment_with_uploads_proposed","assistant.comment_with_uploads_created","assistant.attachment_lifecycle_viewed","assistant.attachment_remove_proposed","assistant.attachment_removed","assistant.attachment_replace_proposed","assistant.attachment_replaced","assistant.attachment_access_refreshed","assistant.attachment_lifecycle_failed","webhook.test","pi_board.created","pi_board.updated","pi_board.published","pi_board.deleted","pi_board.assignment_moved","pi_board.poker_opened","pi_board.poker_vote","pi_board.poker_revealed","pi_board.poker_committed","pi_board.state_changed"]},"minItems":1,"example":["entry.created","entry.updated"]},"description":{"type":["string","null"],"example":"Notify CI pipeline."},"enabled":{"type":"boolean","example":true}}},"TestWebhook":{"type":"object","properties":{"eventName":{"type":"string","enum":["entry.created","entry.updated","entry.status_changed","entry.assigned","entry.commented","release.created","release.status_changed","release.released","cost.estimate_requested","cost.estimation.run.started","cost.estimation.run.finished","cost.estimation.run.failed","invoice.paid","invoice.payment_failed","invoice.finalized","cost.approved","cost.rejected","agreement.signed","pr.merged","pr.reopened","github.identity.connected","github.identity.disconnected","github.identity.policy.violated","commit.linked","commit.unlinked","ci.run.attributed","commit.entry.suggestion.generated","commit.risk.generated","release.notes.generated","project.status.update.generated","pr.description.generated","commit.suggestion.surfaced","commit.suggestion.accepted","commit.suggestion.rejected","ci.flaky.override.set","ci.gate.evaluated","agreement.persissio.callback.received","tenant.created","tenant.verified","tenant.suspended","subscription.created","subscription.updated","usage.limit.hit","subscription.upgraded","subscription.downgraded","subscription.cancelled","trial.ending_soon","trial.ended","dunning.email.sent","analytics.tenant.opted_out","analytics.tenant.opted_in","status.incident.created","status.incident.updated","status.incident.resolved","status.component.overridden","changelog.entry.scheduled","changelog.entry.published","api_key.created","api_key.revoked","api_key.used","api.rate_limit.hit","webhook.subscription.created","webhook.subscription.deleted","time.logged","time.submitted","time.approved","time.rejected","time.unlocked","time.updated","time.deleted","report.viewed","report.exported","assistant.conversation_started","assistant.message_sent","assistant.tool_proposed","assistant.tool_confirmed","assistant.tool_executed","assistant.tool_failed","assistant.guardrail_blocked","assistant.action_denied","assistant.external_action_proposed","assistant.external_action_dry_run","assistant.external_action_confirmed","assistant.external_action_executed","assistant.external_action_failed","assistant.external_action_unknown","reviewer.suggestion.generated","commit.linter.advisory.posted","wiki_page.created","wiki_page.updated","wiki_page.deleted","user.invited","user.linked","user.updated","user.bulk_invited","project_member.added","project_member.updated","project_member.removed","integration_link.created","integration_link.updated","assistant.upload_presign_requested","assistant.upload_registered","assistant.upload_scan_started","assistant.upload_scan_passed","assistant.upload_scan_failed","assistant.upload_blocked","assistant.upload_extraction_started","assistant.upload_extracted","assistant.upload_extraction_failed","assistant.upload_redacted","assistant.upload_used_as_context","assistant.upload_deleted","assistant.entry_from_uploads_proposed","assistant.entry_from_uploads_created","assistant.upload_attachment_proposed","assistant.upload_attached_to_entry","assistant.upload_attachment_failed","assistant.comment_with_uploads_proposed","assistant.comment_with_uploads_created","assistant.attachment_lifecycle_viewed","assistant.attachment_remove_proposed","assistant.attachment_removed","assistant.attachment_replace_proposed","assistant.attachment_replaced","assistant.attachment_access_refreshed","assistant.attachment_lifecycle_failed","webhook.test","pi_board.created","pi_board.updated","pi_board.published","pi_board.deleted","pi_board.assignment_moved","pi_board.poker_opened","pi_board.poker_vote","pi_board.poker_revealed","pi_board.poker_committed","pi_board.state_changed"],"description":"Optional event to simulate. Must be one of the subscription's configured event names. Omit to send `webhook.test`.","example":"entry.created"}}},"TestWebhookResponse":{"type":"object","properties":{"deliveryId":{"type":["string","null"],"format":"uuid","example":"3fa85f64-5717-4562-b3fc-2c963f66afa6"},"subscriptionId":{"type":"string","format":"uuid","example":"3fa85f64-5717-4562-b3fc-2c963f66afa6"},"eventName":{"type":"string","example":"webhook.test"},"firedAt":{"type":"string","format":"date-time","example":"2025-01-15T10:30:00Z"},"deliveryError":{"type":"string","example":"Endpoint returned HTTP 500."}},"required":["deliveryId","subscriptionId","eventName","firedAt"]},"UserUpdate":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":255,"example":"Alice Smith"},"metadata":{"type":"object","additionalProperties":{}}}},"AddProjectMember":{"type":"object","properties":{"userId":{"type":"string","format":"uuid","example":"9a8b7c6d-0000-0000-0000-000000000002"},"roleOverride":{"type":"string","example":"viewer"},"externalRef":{"type":"object","properties":{"provider":{"type":"string","minLength":1},"externalType":{"type":"string","minLength":1},"externalId":{"type":"string","minLength":1}},"required":["provider","externalType","externalId"]},"metadata":{"type":"object","additionalProperties":{}}},"required":["userId"]},"UpdateProjectMember":{"type":"object","properties":{"roleOverride":{"type":["string","null"],"description":"Set null to clear the override and inherit the org role.","example":"tester"},"metadata":{"type":"object","additionalProperties":{}}}},"RejectTimeEntry":{"type":"object","properties":{"reason":{"type":"string","example":"Missing description."}}},"IntegrationLinkList":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/IntegrationLink"}},"page":{"type":"integer","example":1},"pageSize":{"type":"integer","example":25},"total":{"type":"integer","example":100}},"required":["data","page","pageSize","total"]},"EvidencePackage":{"type":"object","properties":{"schemaVersion":{"type":"integer","example":1},"generatedAt":{"type":"string","format":"date-time","example":"2025-01-15T10:30:00Z"},"status":{"type":"string","enum":["complete","incomplete"],"description":"`complete` when release is in completed/released status; `incomplete` otherwise.","example":"complete"},"release":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"version":{"type":["string","null"]},"status":{"type":"string"},"releasedAt":{"type":["string","null"],"format":"date-time"},"riskLevel":{"type":["string","null"]},"projectId":{"type":"string","format":"uuid"},"projectName":{"type":"string"}},"required":["id","name","version","status","releasedAt","riskLevel","projectId","projectName"]},"approvalChain":{"type":"object","properties":{"instanceId":{"type":["string","null"],"format":"uuid"},"overallStatus":{"type":"string"},"stages":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"approver":{"type":["string","null"]},"approvedAt":{"type":["string","null"],"format":"date-time"},"comment":{"type":["string","null"]},"status":{"type":"string"}},"required":["name","approver","approvedAt","comment","status"]}}},"required":["instanceId","overallStatus","stages"]},"qualityChecklists":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"items":{"type":"array","items":{"type":"object","properties":{"label":{"type":"string"},"completedBy":{"type":["string","null"]},"completedAt":{"type":["string","null"],"format":"date-time"},"isCompleted":{"type":"boolean"}},"required":["label","completedBy","completedAt","isCompleted"]}}},"required":["name","items"]}},"entrySummary":{"type":"object","properties":{"totalCount":{"type":"integer"},"byStatus":{"type":"object","additionalProperties":{"type":"integer"},"description":"Entry count keyed by status."},"releasedOrCompleted":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"title":{"type":"string"},"status":{"type":"string"}},"required":["id","title","status"]}}},"required":["totalCount","byStatus","releasedOrCompleted"]},"githubEvidence":{"type":"object","properties":{"entries":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"title":{"type":"string"},"status":{"type":"string"},"commits":{"type":"array","items":{"type":"object","properties":{"sha":{"type":"string"},"author":{"type":["string","null"]},"message":{"type":"string"},"committedAt":{"type":["string","null"],"format":"date-time"},"url":{"type":["string","null"]},"verified":{"type":"boolean"},"ciResult":{"type":["string","null"],"enum":["passed","failed","pending"]},"testsPassed":{"type":"integer"},"testsFailed":{"type":"integer"},"testsSkipped":{"type":"integer"}},"required":["sha","author","message","committedAt","url","verified","ciResult","testsPassed","testsFailed","testsSkipped"]}},"pullRequests":{"type":"array","items":{"type":"object","properties":{"number":{"type":"integer"},"title":{"type":"string"},"mergedAt":{"type":["string","null"],"format":"date-time"},"url":{"type":["string","null"]}},"required":["number","title","mergedAt","url"]}}},"required":["id","title","status","commits","pullRequests"]}}},"required":["entries"]},"completenessScore":{"type":"integer","minimum":0,"maximum":100,"description":"0–100. Mean of three fractions: (entries with linked commit) + (entries with passing CI) + (all checklist items complete → 1, else 0), divided by 3, × 100 rounded.","example":87}},"required":["schemaVersion","generatedAt","status","release","approvalChain","qualityChecklists","entrySummary","githubEvidence","completenessScore"]}},"parameters":{}},"paths":{"/me":{"get":{"tags":["Identity"],"summary":"Describe the current API key actor.","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Me"}}}},"401":{"$ref":"#/components/responses/Unauthorized"}}}},"/projects":{"get":{"tags":["Projects"],"summary":"List projects","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"page","in":"query","schema":{"type":"integer","default":1,"minimum":1},"description":"Page number (1-based)."},{"name":"pageSize","in":"query","schema":{"type":"integer","default":25,"minimum":1,"maximum":100},"description":"Items per page (max 100)."}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectList"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"429":{"$ref":"#/components/responses/RateLimited"}}},"post":{"tags":["Projects"],"summary":"Create project","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Optional idempotency key (24 h cache). Repeat calls with the same key and path return the cached response."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateProject"}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Project"}}}},"400":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/projects/{id}":{"get":{"tags":["Projects"],"summary":"Get project","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"},"description":"Resource UUID."}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Project"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimited"}}},"patch":{"tags":["Projects"],"summary":"Update project","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"},"description":"Resource UUID."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateProject"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Project"}}}},"400":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimited"}}},"delete":{"tags":["Projects"],"summary":"Delete project","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"},"description":"Resource UUID."}],"responses":{"204":{"description":"Deleted."},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/projects/{id}/entries":{"get":{"tags":["Entries"],"summary":"List entries for a project","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"},"description":"Resource UUID."},{"name":"page","in":"query","schema":{"type":"integer","default":1,"minimum":1},"description":"Page number (1-based)."},{"name":"pageSize","in":"query","schema":{"type":"integer","default":25,"minimum":1,"maximum":100},"description":"Items per page (max 100)."}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EntryList"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimited"}}},"post":{"tags":["Entries"],"summary":"Create entry","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"},"description":"Resource UUID."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Optional idempotency key (24 h cache). Repeat calls with the same key and path return the cached response."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateEntry"}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Entry"}}}},"400":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/entries/{id}":{"get":{"tags":["Entries"],"summary":"Get entry","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"},"description":"Resource UUID."}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Entry"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimited"}}},"patch":{"tags":["Entries"],"summary":"Update entry","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"},"description":"Resource UUID."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateEntry"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Entry"}}}},"400":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimited"}}},"delete":{"tags":["Entries"],"summary":"Delete entry","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"},"description":"Resource UUID."}],"responses":{"204":{"description":"Deleted."},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/entries/{id}/comments":{"get":{"tags":["Comments"],"summary":"List comments on an entry","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"},"description":"Resource UUID."},{"name":"page","in":"query","schema":{"type":"integer","default":1,"minimum":1},"description":"Page number (1-based)."},{"name":"pageSize","in":"query","schema":{"type":"integer","default":25,"minimum":1,"maximum":100},"description":"Items per page (max 100)."}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommentList"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimited"}}},"post":{"tags":["Comments"],"summary":"Create comment","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"},"description":"Resource UUID."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Optional idempotency key (24 h cache). Repeat calls with the same key and path return the cached response."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateComment"}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Comment"}}}},"400":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/comments/{id}":{"patch":{"tags":["Comments"],"summary":"Update comment","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"},"description":"Resource UUID."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateComment"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Comment"}}}},"400":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimited"}}},"delete":{"tags":["Comments"],"summary":"Delete comment","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"},"description":"Resource UUID."}],"responses":{"204":{"description":"Deleted."},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/entries/{id}/attachments":{"get":{"tags":["Attachments"],"summary":"List attachments on an entry","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"},"description":"Resource UUID."}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AttachmentList"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimited"}}},"post":{"tags":["Attachments"],"summary":"Register attachment","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"},"description":"Resource UUID."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Optional idempotency key (24 h cache). Repeat calls with the same key and path return the cached response."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateAttachment"}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Attachment"}}}},"400":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/attachments/{id}":{"delete":{"tags":["Attachments"],"summary":"Delete attachment","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"},"description":"Resource UUID."}],"responses":{"204":{"description":"Deleted."},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/projects/{id}/releases":{"get":{"tags":["Releases"],"summary":"List releases for a project","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"},"description":"Resource UUID."},{"name":"page","in":"query","schema":{"type":"integer","default":1,"minimum":1},"description":"Page number (1-based)."},{"name":"pageSize","in":"query","schema":{"type":"integer","default":25,"minimum":1,"maximum":100},"description":"Items per page (max 100)."}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReleaseList"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimited"}}},"post":{"tags":["Releases"],"summary":"Create release","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"},"description":"Resource UUID."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Optional idempotency key (24 h cache). Repeat calls with the same key and path return the cached response."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateRelease"}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Release"}}}},"400":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/releases/{id}":{"get":{"tags":["Releases"],"summary":"Get release","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"},"description":"Resource UUID."}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Release"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimited"}}},"patch":{"tags":["Releases"],"summary":"Update release","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"},"description":"Resource UUID."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateRelease"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Release"}}}},"400":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimited"}}},"delete":{"tags":["Releases"],"summary":"Delete release","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"},"description":"Resource UUID."}],"responses":{"204":{"description":"Deleted."},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/users":{"get":{"tags":["Users"],"summary":"List org members","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"page","in":"query","schema":{"type":"integer","default":1,"minimum":1},"description":"Page number (1-based)."},{"name":"pageSize","in":"query","schema":{"type":"integer","default":25,"minimum":1,"maximum":100},"description":"Items per page (max 100)."}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserList"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/users/invite":{"post":{"tags":["Users"],"summary":"Invite (or provision) a single user","description":"Creates a user account in the org and optionally sends an invitation email. If the email already exists in the org, the existing user is returned with `created: false`. Supply `externalRef` for idempotent upserts — a second call with the same ref returns the existing entity.","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Optional idempotency key (24 h cache). Repeat calls with the same key and path return the cached response."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserInviteRequest"}}}},"responses":{"200":{"description":"OK (user already existed)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserInviteResponse"}}}},"201":{"description":"Created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserInviteResponse"}}}},"400":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/users/bulk-invite":{"post":{"tags":["Users"],"summary":"Bulk invite up to 50 users","description":"Invites up to 50 users in a single request. Each item is processed independently. Partial failures do not roll back successful items — check per-item `status` in the response. Errors for individual items are included in the `results` array, not as HTTP errors.","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Optional idempotency key (24 h cache). Repeat calls with the same key and path return the cached response."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkInviteRequest"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkInviteResponse"}}}},"400":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/users/{id}":{"get":{"tags":["Users"],"summary":"Get a user","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"},"description":"Resource UUID."}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/User"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimited"}}},"patch":{"tags":["Users"],"summary":"Update a user","description":"Updates the user's name or provider metadata. Role cannot be changed via this endpoint — use the admin UI.","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"},"description":"Resource UUID."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserUpdate"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/User"}}}},"400":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/projects/{id}/members":{"get":{"tags":["ProjectMembers"],"summary":"List project members","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"},"description":"Resource UUID."},{"name":"page","in":"query","schema":{"type":"integer","default":1,"minimum":1},"description":"Page number (1-based)."},{"name":"pageSize","in":"query","schema":{"type":"integer","default":25,"minimum":1,"maximum":100},"description":"Items per page (max 100)."}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectMemberList"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimited"}}},"post":{"tags":["ProjectMembers"],"summary":"Add a user to a project","description":"Adds an org member to the project. Idempotent — re-adding an existing member returns the existing membership record.","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"},"description":"Resource UUID."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddProjectMember"}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectMember"}}}},"400":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/projects/{id}/members/{userId}":{"patch":{"tags":["ProjectMembers"],"summary":"Update a project member","description":"Updates the member's role override or metadata.","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"},"description":"Resource UUID."},{"name":"userId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateProjectMember"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectMember"}}}},"400":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimited"}}},"delete":{"tags":["ProjectMembers"],"summary":"Remove a user from a project","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"},"description":"Resource UUID."},{"name":"userId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"204":{"description":"Removed."},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/projects/{id}/time-entries":{"get":{"tags":["TimeTracking"],"summary":"List time entries for a project","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"},"description":"Resource UUID."},{"name":"page","in":"query","schema":{"type":"integer","default":1,"minimum":1},"description":"Page number (1-based)."},{"name":"pageSize","in":"query","schema":{"type":"integer","default":25,"minimum":1,"maximum":100},"description":"Items per page (max 100)."},{"name":"userId","in":"query","schema":{"type":"string"},"description":"Filter by user."},{"name":"status","in":"query","schema":{"type":"string"},"description":"Filter by status (draft, submitted, approved, ...)."},{"name":"workDateFrom","in":"query","schema":{"type":"string"},"description":"ISO date lower bound."},{"name":"workDateTo","in":"query","schema":{"type":"string"},"description":"ISO date upper bound."}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TimeEntryList"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimited"}}},"post":{"tags":["TimeTracking"],"summary":"Log a time entry","description":"Creates a time entry with status `draft`. Supply `externalRef` for idempotent upserts. Provide either `minutes` (integer) or `hours` (decimal string); both are accepted, `minutes` takes precedence.","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"},"description":"Resource UUID."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Optional idempotency key (24 h cache). Repeat calls with the same key and path return the cached response."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TimeEntryCreate"}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TimeEntry"}}}},"400":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/time-entries/{id}":{"get":{"tags":["TimeTracking"],"summary":"Get a time entry","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"},"description":"Resource UUID."}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TimeEntry"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimited"}}},"patch":{"tags":["TimeTracking"],"summary":"Update a time entry","description":"Only `draft` status entries can be mutated.","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"},"description":"Resource UUID."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TimeEntryUpdate"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TimeEntry"}}}},"400":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"description":"Conflict — entry is not in draft status.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"$ref":"#/components/responses/RateLimited"}}},"delete":{"tags":["TimeTracking"],"summary":"Delete a time entry","description":"Only `draft` status entries can be deleted.","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"},"description":"Resource UUID."}],"responses":{"204":{"description":"Deleted."},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"description":"Conflict — entry is not in draft status.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/time-entries/{id}/submit":{"post":{"tags":["TimeTracking"],"summary":"Submit a draft time entry for approval","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"},"description":"Resource UUID."}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TimeEntry"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"description":"Conflict — entry is not in draft status.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/time-entries/{id}/approve":{"post":{"tags":["TimeTracking"],"summary":"Approve a submitted time entry","description":"Requires the API key to have a manager or admin role.","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"},"description":"Resource UUID."}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TimeEntry"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"description":"Conflict — entry is not in submitted status.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/time-entries/{id}/reject":{"post":{"tags":["TimeTracking"],"summary":"Reject a submitted time entry","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"},"description":"Resource UUID."}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RejectTimeEntry"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TimeEntry"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"description":"Conflict — entry is not in submitted status.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/time-entries/{id}/unlock":{"post":{"tags":["TimeTracking"],"summary":"Unlock an approved time entry back to draft","description":"Requires the API key to have a manager or admin role. Only approved (not invoiced) entries can be unlocked.","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"},"description":"Resource UUID."}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TimeEntry"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"description":"Conflict — entry is not in approved status.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/projects/{id}/time-summary":{"get":{"tags":["TimeTracking"],"summary":"Time summary for a project","description":"Returns total and per-user minute rollups for the project.","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"},"description":"Resource UUID."},{"name":"workDateFrom","in":"query","schema":{"type":"string"},"description":"ISO date lower bound."},{"name":"workDateTo","in":"query","schema":{"type":"string"},"description":"ISO date upper bound."},{"name":"status","in":"query","schema":{"type":"string"},"description":"Filter by status."}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TimeSummary"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/projects/{id}/cost-summary":{"get":{"tags":["TimeTracking"],"summary":"Cost summary for a project","description":"Returns planned vs. actual cost breakdown derived from approved time entries and cost items.","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"},"description":"Resource UUID."}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CostSummary"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/integration-links":{"get":{"tags":["Integrations"],"summary":"List integration links","description":"Lists all provider integration links for the organisation. Optionally filter by provider, entity type, or Align entity ID.","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"page","in":"query","schema":{"type":"integer","default":1,"minimum":1},"description":"Page number (1-based)."},{"name":"pageSize","in":"query","schema":{"type":"integer","default":25,"minimum":1,"maximum":100},"description":"Items per page (max 100)."},{"name":"provider","in":"query","schema":{"type":"string"},"description":"Filter by provider (e.g. illumera)."},{"name":"alignEntityType","in":"query","schema":{"type":"string"},"description":"Filter by Align entity type (e.g. user, project)."},{"name":"alignEntityId","in":"query","schema":{"type":"string"},"description":"Filter by Align entity ID."}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntegrationLinkList"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/integration/time-entries":{"post":{"tags":["Integrations"],"summary":"Sync a time entry from an external system","description":"Idempotently creates a time entry from an external provider (e.g. Illumera). The combination of\n`externalSystem` + `externalId` is used as the idempotency key: a second call with the same pair\nreturns the existing entry (HTTP 200) without creating a duplicate.\n\n**Requires an org-scoped API key** — project-scoped keys are rejected with `scope_violation`.\n\n**Plan gate**: the organisation must have the `time_tracking` feature enabled; disabled workspaces\nreceive a 402 response with `reason: feature_disabled`.\n\nAccepts an optional `Idempotency-Key` header for network-level replay safety.","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Optional idempotency key (24 h cache). Repeat calls with the same key and path return the cached response."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SyncTimeEntry"}}}},"responses":{"200":{"description":"Time entry already existed (idempotent replay). `created` is false in the response body.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SyncTimeEntryResponse"}}}},"201":{"description":"Time entry created. Returned when `externalSystem` + `externalId` was not previously seen.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SyncTimeEntryResponse"}}}},"400":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"description":"Time tracking feature is not enabled for this workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"$ref":"#/components/responses/Forbidden"},"422":{"description":"Semantic validation failure — `projectId`, `userId`, or `entryId` not found or not owned by the org.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/integration/time-entries/{id}":{"get":{"tags":["Integrations"],"summary":"Get a synced time entry with its integration links","description":"Returns a single time entry together with its `integrationLinks` array — the list of\nexternal-system references bound to this entry.\n\n**Requires an org-scoped API key.**","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"},"description":"Time entry UUID."}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TimeEntryWithLinks"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"description":"Time tracking feature is not enabled for this workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/integration-links/{id}":{"delete":{"tags":["Integrations"],"summary":"Delete an integration link","description":"Removes a single `IntegrationLink` record. The associated Align entity (e.g. time entry) is\n**not** deleted — only the external-system binding is removed.\n\n**Requires an org-scoped API key** with `write:time_entry` permission.","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"},"description":"Integration link UUID."}],"responses":{"204":{"description":"Deleted. No content."},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/webhooks":{"get":{"tags":["Webhooks"],"summary":"List webhook subscriptions","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookList"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"429":{"$ref":"#/components/responses/RateLimited"}}},"post":{"tags":["Webhooks"],"summary":"Create webhook subscription","description":"The `hmacSecret` in the response is only returned on creation. Store it immediately — it cannot be retrieved again.","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Optional idempotency key (24 h cache). Repeat calls with the same key and path return the cached response."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateWebhook"}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookCreateResponse"}}}},"400":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/webhooks/{id}":{"get":{"tags":["Webhooks"],"summary":"Get webhook subscription","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"},"description":"Resource UUID."}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Webhook"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimited"}}},"patch":{"tags":["Webhooks"],"summary":"Update webhook subscription","description":"Updates a webhook subscription's destination URL, event names, description, or enabled state. The HMAC secret is never returned by this endpoint.","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"},"description":"Resource UUID."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateWebhook"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Webhook"}}}},"400":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimited"}}},"delete":{"tags":["Webhooks"],"summary":"Delete webhook subscription","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"},"description":"Resource UUID."}],"responses":{"204":{"description":"Deleted."},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/webhooks/{id}/test":{"post":{"tags":["Webhooks"],"summary":"Send a test webhook delivery","description":"Fires a synthetic signed delivery through the subscription. Limited to 10 calls per organization per hour.","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"},"description":"Resource UUID."}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestWebhook"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestWebhookResponse"}}}},"400":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/audit-events":{"get":{"tags":["Audit"],"summary":"List audit events","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"page","in":"query","schema":{"type":"integer","default":1,"minimum":1},"description":"Page number (1-based)."},{"name":"pageSize","in":"query","schema":{"type":"integer","default":25,"minimum":1,"maximum":100},"description":"Items per page (max 100)."},{"name":"entityType","in":"query","schema":{"type":"string"},"description":"Filter by entity type (e.g. entry, project)."},{"name":"action","in":"query","schema":{"type":"string"},"description":"Filter by action (e.g. create, update, delete)."}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuditEventList"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/search":{"get":{"tags":["Search"],"summary":"Global search across the tenant","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string"},"description":"Search query string."}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchResultList"}}}},"400":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/projects/{id}/agreements":{"get":{"tags":["Agreements"],"summary":"List agreements for a project","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"},"description":"Resource UUID."}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgreementList"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/projects/{id}/wiki-pages":{"get":{"tags":["Wiki"],"summary":"List wiki pages for a project","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"},"description":"Resource UUID."}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WikiPageList"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimited"}}},"post":{"tags":["Wiki"],"summary":"Create wiki page","description":"Creates a wiki page in the project. Supply `externalRef` for idempotent upserts — a second call with the same ref returns the existing page.","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"},"description":"Resource UUID."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Optional idempotency key (24 h cache). Repeat calls with the same key and path return the cached response."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WikiPageCreate"}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WikiPage"}}}},"400":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/wiki-pages/{id}":{"get":{"tags":["Wiki"],"summary":"Get wiki page","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"},"description":"Resource UUID."}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WikiPage"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimited"}}},"patch":{"tags":["Wiki"],"summary":"Update wiki page","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"},"description":"Resource UUID."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WikiPageUpdate"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WikiPage"}}}},"400":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimited"}}},"delete":{"tags":["Wiki"],"summary":"Delete wiki page","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"},"description":"Resource UUID."}],"responses":{"204":{"description":"Deleted."},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/projects/{id}/snapshots":{"get":{"tags":["Snapshots"],"summary":"List report snapshots for a project","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"},"description":"Resource UUID."}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SnapshotList"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/releases/{id}/evidence":{"get":{"tags":["Releases"],"summary":"Get release evidence package","description":"Returns a structured, auditable evidence package for a release. The package contains:\n- Release metadata (id, name, version, status, releasedAt, riskLevel)\n- Approval chain: each approval stage with approver, timestamp, and comment\n- Quality checklist completion status\n- Entry summary: count by status plus a list of released/completed entries\n- GitHub evidence: per-entry commits (SHA, author, message, committedAt) and merged PRs\n- CI gate summary: per-commit CI result (passed/failed/pending) and test counts\n- `completenessScore` (0–100): mean of three fractions — entries with linked commit, entries with passing CI, and checklist completeness\n\nIf an evidence signing key is configured for the organization, the response includes:\n- `X-Align-Evidence-Signature: sha256=<hex>` — HMAC-SHA256 of the canonical JSON body\n- `X-Align-Evidence-Key-Prefix` — prefix of the key used (for rotation tracking)\n\nReleases in `planning`/`active`/`in_progress`/`testing` state return `status: incomplete`.\nReleases in `completed` or `released` state return `status: complete`.","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"},"description":"Release ID."}],"responses":{"200":{"description":"Evidence package returned successfully.","headers":{"X-Align-Evidence-Signature":{"schema":{"type":"string"},"description":"HMAC-SHA256 of the response body (`sha256=<hex>`). Present only when a signing key is configured."},"X-Align-Evidence-Key-Prefix":{"schema":{"type":"string"},"description":"Prefix of the signing key used (e.g. `evk_9a3b1c2d`). Use to track key rotation."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvidencePackage"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimited"}}}}},"webhooks":{},"x-align-events":["entry.created","entry.updated","entry.status_changed","entry.assigned","entry.commented","release.created","release.status_changed","release.released","cost.estimate_requested","cost.estimation.run.started","cost.estimation.run.finished","cost.estimation.run.failed","invoice.paid","invoice.payment_failed","invoice.finalized","cost.approved","cost.rejected","agreement.signed","pr.merged","pr.reopened","github.identity.connected","github.identity.disconnected","github.identity.policy.violated","commit.linked","commit.unlinked","ci.run.attributed","commit.entry.suggestion.generated","commit.risk.generated","release.notes.generated","project.status.update.generated","pr.description.generated","commit.suggestion.surfaced","commit.suggestion.accepted","commit.suggestion.rejected","ci.flaky.override.set","ci.gate.evaluated","agreement.persissio.callback.received","tenant.created","tenant.verified","tenant.suspended","subscription.created","subscription.updated","usage.limit.hit","subscription.upgraded","subscription.downgraded","subscription.cancelled","trial.ending_soon","trial.ended","dunning.email.sent","analytics.tenant.opted_out","analytics.tenant.opted_in","status.incident.created","status.incident.updated","status.incident.resolved","status.component.overridden","changelog.entry.scheduled","changelog.entry.published","api_key.created","api_key.revoked","api_key.used","api.rate_limit.hit","webhook.subscription.created","webhook.subscription.deleted","time.logged","time.submitted","time.approved","time.rejected","time.unlocked","time.updated","time.deleted","report.viewed","report.exported","assistant.conversation_started","assistant.message_sent","assistant.tool_proposed","assistant.tool_confirmed","assistant.tool_executed","assistant.tool_failed","assistant.guardrail_blocked","assistant.action_denied","assistant.external_action_proposed","assistant.external_action_dry_run","assistant.external_action_confirmed","assistant.external_action_executed","assistant.external_action_failed","assistant.external_action_unknown","reviewer.suggestion.generated","commit.linter.advisory.posted","wiki_page.created","wiki_page.updated","wiki_page.deleted","user.invited","user.linked","user.updated","user.bulk_invited","project_member.added","project_member.updated","project_member.removed","integration_link.created","integration_link.updated","assistant.upload_presign_requested","assistant.upload_registered","assistant.upload_scan_started","assistant.upload_scan_passed","assistant.upload_scan_failed","assistant.upload_blocked","assistant.upload_extraction_started","assistant.upload_extracted","assistant.upload_extraction_failed","assistant.upload_redacted","assistant.upload_used_as_context","assistant.upload_deleted","assistant.entry_from_uploads_proposed","assistant.entry_from_uploads_created","assistant.upload_attachment_proposed","assistant.upload_attached_to_entry","assistant.upload_attachment_failed","assistant.comment_with_uploads_proposed","assistant.comment_with_uploads_created","assistant.attachment_lifecycle_viewed","assistant.attachment_remove_proposed","assistant.attachment_removed","assistant.attachment_replace_proposed","assistant.attachment_replaced","assistant.attachment_access_refreshed","assistant.attachment_lifecycle_failed","webhook.test","pi_board.created","pi_board.updated","pi_board.published","pi_board.deleted","pi_board.assignment_moved","pi_board.poker_opened","pi_board.poker_vote","pi_board.poker_revealed","pi_board.poker_committed","pi_board.state_changed"]}