{"openapi":"3.1.0","info":{"title":"Uku API","description":"Task management and billing API for service companies.","version":"3.0.0"},"paths":{"/api/v3/health":{"get":{"tags":["Health"],"summary":"Health check","description":"Liveness/readiness probe. No auth required. Returns `200 {\"status\": \"ok\"}` when every component is up, or `503 {\"status\": \"degraded\"}` when any is down, with a `components` map of which subsystem is up/down. Component names are generic — no vendor or technology is exposed.","operationId":"health_health_check","responses":{"200":{"description":"All components up","content":{"application/json":{"schema":{}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"One or more components down"}}}},"/api/v3/auth/keys":{"get":{"tags":["Authentication"],"summary":"List API keys","description":"Lists all API keys for this company. Keys are masked — only prefix shown.","operationId":"authentication_get_keys","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_ApiKeyOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"CompanyUUID":[]},{"ApiKey":[]}]},"post":{"tags":["Authentication"],"summary":"Create API key","description":"Creates a new API key. The full key is returned ONCE in the response — save it immediately. `kind='integration'` (default) is a company-wide, scope-only key — unchanged existing behavior. `kind='personal'` creates a key that acts AS one specific person (default: yourself), scoped to exactly that person's own backoffice visibility/rights; its scopes are always fixed to read+write and cannot be chosen — see the `kind` field description for the full contract, including why personal keys always 403 on financial resources.","operationId":"authentication_post_key","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleResponse_ApiKeyCreated_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"CompanyUUID":[]},{"ApiKey":[]}]}},"/api/v3/auth/keys/{key_id}/rotate":{"post":{"tags":["Authentication"],"summary":"Rotate API key","description":"Creates a new key, old key works for 24h grace period. Save the new key immediately.","operationId":"authentication_post_rotate_key","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"integer","title":"Key Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleResponse_ApiKeyRotated_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v3/auth/keys/{key_id}":{"delete":{"tags":["Authentication"],"summary":"Revoke API key","description":"Revokes an API key. This cannot be undone.","operationId":"authentication_delete_key","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"integer","title":"Key Id"}}],"responses":{"204":{"description":"Successful Response"},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v3/clients":{"get":{"tags":["Clients"],"summary":"List clients","description":"Returns a paginated list of clients. Supports offset or cursor pagination.","operationId":"clients_get_clients","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","maximum":10000,"minimum":0,"default":0,"title":"Offset"}},{"name":"sort","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Sort field. Prefix with - for descending.","title":"Sort"},"description":"Sort field. Prefix with - for descending."},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Opaque cursor for cursor-based pagination.","title":"Cursor"},"description":"Opaque cursor for cursor-based pagination."},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by status (comma-separated)","title":"Status"},"description":"Filter by status (comma-separated)"},{"name":"name","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Exact name match","title":"Name"},"description":"Exact name match"},{"name":"reg_code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reg Code"}},{"name":"ext_client_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ext Client Id"}},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Search by name","title":"Q"},"description":"Search by name"},{"name":"default_person_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Default Person Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_ClientOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Clients"],"summary":"Create client","description":"Creates a new client. Requires write scope.","operationId":"clients_post_client","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClientCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleResponse_ClientOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v3/clients/{client_id}":{"get":{"tags":["Clients"],"summary":"Get client","description":"Returns a single client by ID.","operationId":"clients_get_client","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"client_id","in":"path","required":true,"schema":{"type":"integer","title":"Client Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleResponse_ClientOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Clients"],"summary":"Update client","description":"Partially updates a client. Only provided fields are changed.","operationId":"clients_patch_client","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"client_id","in":"path","required":true,"schema":{"type":"integer","title":"Client Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClientUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleResponse_ClientOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Clients"],"summary":"Delete client","description":"Soft-deletes a client.","operationId":"clients_remove_client","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"client_id","in":"path","required":true,"schema":{"type":"integer","title":"Client Id"}}],"responses":{"204":{"description":"Successful Response"},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v3/clients/{client_id}/documents-folder":{"post":{"tags":["Clients"],"summary":"Provision client documents folder","description":"Creates (or returns the existing) client's cloud-drive folder tree and pins it. Requires write scope + a connected drive.","operationId":"clients_post_client_documents_folder","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"client_id","in":"path","required":true,"schema":{"type":"integer","title":"Client Id"}}],"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleResponse_DocumentsFolderOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v3/tasks":{"get":{"tags":["Tasks"],"summary":"List tasks","description":"Returns a paginated list of tasks for the authenticated company.","operationId":"tasks_get_tasks","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","maximum":10000,"minimum":0,"default":0,"title":"Offset"}},{"name":"sort","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Sort field. Prefix with - for descending.","title":"Sort"},"description":"Sort field. Prefix with - for descending."},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Opaque cursor for cursor-based pagination.","title":"Cursor"},"description":"Opaque cursor for cursor-based pagination."},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by status (comma-separated)","title":"Status"},"description":"Filter by status (comma-separated)"},{"name":"type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by type: task, chat, button, request","title":"Type"},"description":"Filter by type: task, chat, button, request"},{"name":"client_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Client Id"}},{"name":"project_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Project Id"}},{"name":"topic_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Topic Id"}},{"name":"assignee_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Filter by assignee person ID","title":"Assignee Id"},"description":"Filter by assignee person ID"},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Search by title","title":"Q"},"description":"Search by title"},{"name":"is_important","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Important"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_TaskOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Tasks"],"summary":"Create task","description":"Creates a new task. Requires write scope.","operationId":"tasks_post_task","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TaskCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleResponse_TaskOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v3/tasks/{task_id}":{"get":{"tags":["Tasks"],"summary":"Get task","description":"Returns a single task by ID.","operationId":"tasks_get_task","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"task_id","in":"path","required":true,"schema":{"type":"integer","title":"Task Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleResponse_TaskOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Tasks"],"summary":"Update task","description":"Partially updates a task. Only provided fields are changed.","operationId":"tasks_patch_task","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"task_id","in":"path","required":true,"schema":{"type":"integer","title":"Task Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TaskUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleResponse_TaskOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Tasks"],"summary":"Delete task","description":"Soft-deletes a task.","operationId":"tasks_remove_task","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"task_id","in":"path","required":true,"schema":{"type":"integer","title":"Task Id"}}],"responses":{"204":{"description":"Successful Response"},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v3/time-entries":{"get":{"tags":["Time Entries"],"summary":"List time entries","description":"Returns a paginated list of time entries. Filter by task_id, person_id, client_id, topic_id, or date range.","operationId":"time_entries_get_time_entries","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","maximum":10000,"minimum":0,"default":0,"title":"Offset"}},{"name":"sort","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sort"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Opaque cursor for cursor-based pagination.","title":"Cursor"},"description":"Opaque cursor for cursor-based pagination."},{"name":"task_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Task Id"}},{"name":"person_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Person Id"}},{"name":"client_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Filter by the parent task's client ID","title":"Client Id"},"description":"Filter by the parent task's client ID"},{"name":"topic_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Filter by the parent task's topic ID","title":"Topic Id"},"description":"Filter by the parent task's topic ID"},{"name":"billable","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Billable"}},{"name":"start_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"Entries starting from (ISO 8601)","title":"Start From"},"description":"Entries starting from (ISO 8601)"},{"name":"start_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"Entries starting before (ISO 8601)","title":"Start To"},"description":"Entries starting before (ISO 8601)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_TimeEntryOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Time Entries"],"summary":"Create time entry","description":"Creates a new time entry on a task. Requires write scope.","operationId":"time_entries_post_time_entry","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TimeEntryCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleResponse_TimeEntryOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v3/time-entries/{time_entry_id}":{"get":{"tags":["Time Entries"],"summary":"Get time entry","operationId":"time_entries_get_time_entry","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"time_entry_id","in":"path","required":true,"schema":{"type":"integer","title":"Time Entry Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleResponse_TimeEntryOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Time Entries"],"summary":"Update time entry","operationId":"time_entries_patch_time_entry","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"time_entry_id","in":"path","required":true,"schema":{"type":"integer","title":"Time Entry Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TimeEntryUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleResponse_TimeEntryOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Time Entries"],"summary":"Delete time entry","operationId":"time_entries_remove_time_entry","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"time_entry_id","in":"path","required":true,"schema":{"type":"integer","title":"Time Entry Id"}}],"responses":{"204":{"description":"Successful Response"},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v3/contacts":{"get":{"tags":["Contacts"],"summary":"List contacts","description":"Returns a paginated list of contacts. Optionally filter by client_id.","operationId":"contacts_get_contacts","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","maximum":10000,"minimum":0,"default":0,"title":"Offset"}},{"name":"sort","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sort"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Opaque cursor for cursor-based pagination.","title":"Cursor"},"description":"Opaque cursor for cursor-based pagination."},{"name":"client_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Filter by client ID","title":"Client Id"},"description":"Filter by client ID"},{"name":"email","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by exact email","title":"Email"},"description":"Filter by exact email"},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Search by name","title":"Q"},"description":"Search by name"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_ContactOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Contacts"],"summary":"Create contact","description":"Creates a new contact for a client. Requires write scope.","operationId":"contacts_post_contact","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContactCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleResponse_ContactOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v3/contacts/{contact_id}":{"get":{"tags":["Contacts"],"summary":"Get contact","operationId":"contacts_get_contact","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"contact_id","in":"path","required":true,"schema":{"type":"integer","title":"Contact Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleResponse_ContactOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Contacts"],"summary":"Update contact","operationId":"contacts_patch_contact","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"contact_id","in":"path","required":true,"schema":{"type":"integer","title":"Contact Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContactUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleResponse_ContactOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Contacts"],"summary":"Delete contact","operationId":"contacts_remove_contact","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"contact_id","in":"path","required":true,"schema":{"type":"integer","title":"Contact Id"}}],"responses":{"204":{"description":"Successful Response"},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v3/invoices":{"get":{"tags":["Invoices"],"summary":"List invoices","description":"Returns a paginated list of invoices (read-only).","operationId":"invoices_get_invoices","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","maximum":10000,"minimum":0,"default":0,"title":"Offset"}},{"name":"sort","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sort"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Opaque cursor for cursor-based pagination.","title":"Cursor"},"description":"Opaque cursor for cursor-based pagination."},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by status (comma-separated)","title":"Status"},"description":"Filter by status (comma-separated)"},{"name":"client_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Client Id"}},{"name":"contract_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Filter by contract ID","title":"Contract Id"},"description":"Filter by contract ID"},{"name":"invoice_date_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"From date (ISO 8601)","title":"Invoice Date From"},"description":"From date (ISO 8601)"},{"name":"invoice_date_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"Before date (ISO 8601)","title":"Invoice Date To"},"description":"Before date (ISO 8601)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_InvoiceOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Invoices"],"summary":"Create draft invoice","description":"Creates a new invoice in `pending` status with no rows. Requires `admin` + `write`. Add rows via `POST /invoices/{id}/rows`, then PATCH status to `created`/`sent` once complete. Totals start at zero and recompute as rows land.","operationId":"invoices_post_invoice","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvoiceCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleResponse_InvoiceOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v3/invoices/{invoice_id}":{"get":{"tags":["Invoices"],"summary":"Get invoice","description":"Returns a single invoice by ID. The response includes a version tag in the `ETag` header; send it back as `If-Match` when you later edit this invoice so your change can't silently overwrite someone else's.","operationId":"invoices_get_invoice","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"invoice_id","in":"path","required":true,"schema":{"type":"integer","title":"Invoice Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleResponse_InvoiceOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Invoices"],"summary":"Update invoice header fields","description":"Updates invoice header fields. Requires the `financials` scope (held by `admin` keys) and a valid `If-Match` header. Invoices in locked statuses (`created`, `sent`, `paid`, `annulled`) accept only `status` (a narrow transition).","operationId":"invoices_patch_invoice","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"invoice_id","in":"path","required":true,"schema":{"type":"integer","title":"Invoice Id"}},{"name":"If-Match","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Version check: send back the ETag value from this resource's GET response so your change can't silently overwrite someone else's edit. If it is missing when required you get 428 (Precondition Required); if the record changed since you fetched it you get 412 (Precondition Failed) — re-GET and retry.","title":"If-Match"},"description":"Version check: send back the ETag value from this resource's GET response so your change can't silently overwrite someone else's edit. If it is missing when required you get 428 (Precondition Required); if the record changed since you fetched it you get 412 (Precondition Failed) — re-GET and retry."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvoiceUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleResponse_InvoiceOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v3/invoices/{invoice_id}/mark-paid":{"post":{"tags":["Invoices"],"summary":"Mark invoice paid","description":"Records payment: sets `paid_at` (now) and `paid_sum` (the full `total_sum` — no partial payments) and moves status to `paid`. Wraps the same backoffice flow as the app's \"Mark as paid\" action. Requires the `financials` scope and a valid `If-Match` header. Only `created`/`sent` invoices are eligible; anything else returns 409 `INVOICE_NOT_PAYABLE`.","operationId":"invoices_post_invoice_mark_paid","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"invoice_id","in":"path","required":true,"schema":{"type":"integer","title":"Invoice Id"}},{"name":"If-Match","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Version check: send back the ETag value from this resource's GET response so your change can't silently overwrite someone else's edit. If it is missing when required you get 428 (Precondition Required); if the record changed since you fetched it you get 412 (Precondition Failed) — re-GET and retry.","title":"If-Match"},"description":"Version check: send back the ETag value from this resource's GET response so your change can't silently overwrite someone else's edit. If it is missing when required you get 428 (Precondition Required); if the record changed since you fetched it you get 412 (Precondition Failed) — re-GET and retry."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleResponse_InvoiceOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v3/invoices/{invoice_id}/send":{"post":{"tags":["Invoices"],"summary":"Send invoice","description":"Queues the invoice for delivery (email / PDF / e-invoice) exactly as the backoffice \"Send\" action does — nothing is rendered or mailed synchronously in this request. Requires the `financials` scope and a valid `If-Match` header. Only `created`/`sent`/`paid` invoices are eligible for (re-)send; anything else returns 409 `INVOICE_NOT_SENDABLE`. The invoice's `status` updates to `sent` asynchronously once the worker completes — poll `GET /invoices/{id}` to observe it.","operationId":"invoices_post_invoice_send","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"invoice_id","in":"path","required":true,"schema":{"type":"integer","title":"Invoice Id"}},{"name":"If-Match","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Version check: send back the ETag value from this resource's GET response so your change can't silently overwrite someone else's edit. If it is missing when required you get 428 (Precondition Required); if the record changed since you fetched it you get 412 (Precondition Failed) — re-GET and retry.","title":"If-Match"},"description":"Version check: send back the ETag value from this resource's GET response so your change can't silently overwrite someone else's edit. If it is missing when required you get 428 (Precondition Required); if the record changed since you fetched it you get 412 (Precondition Failed) — re-GET and retry."}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleResponse_InvoiceSendOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v3/invoices/{invoice_id}/rows":{"get":{"tags":["Invoices"],"summary":"List invoice rows","description":"Lists rows for a single invoice (read). For PATCH/DELETE, use `/{invoice_id}/rows/{row_id}`.","operationId":"invoices_get_invoice_rows","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"invoice_id","in":"path","required":true,"schema":{"type":"integer","title":"Invoice Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_InvoiceRowOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Invoices"],"summary":"Create invoice row","description":"Creates a new row on the invoice. Requires `admin` scope and a valid `If-Match` header on the parent invoice. Parent invoice totals are recomputed.","operationId":"invoices_post_invoice_row","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"invoice_id","in":"path","required":true,"schema":{"type":"integer","title":"Invoice Id"}},{"name":"If-Match","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Version check: send back the ETag value from this resource's GET response so your change can't silently overwrite someone else's edit. If it is missing when required you get 428 (Precondition Required); if the record changed since you fetched it you get 412 (Precondition Failed) — re-GET and retry.","title":"If-Match"},"description":"Version check: send back the ETag value from this resource's GET response so your change can't silently overwrite someone else's edit. If it is missing when required you get 428 (Precondition Required); if the record changed since you fetched it you get 412 (Precondition Failed) — re-GET and retry."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvoiceRowCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleResponse_InvoiceRowOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v3/invoices/{invoice_id}/rows/{row_id}":{"get":{"tags":["Invoices"],"summary":"Get invoice row","operationId":"invoices_get_invoice_row","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"invoice_id","in":"path","required":true,"schema":{"type":"integer","title":"Invoice Id"}},{"name":"row_id","in":"path","required":true,"schema":{"type":"integer","title":"Row Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleResponse_InvoiceRowOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Invoices"],"summary":"Update invoice row","description":"Requires `admin` scope and a valid `If-Match` header on the row.","operationId":"invoices_patch_invoice_row","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"invoice_id","in":"path","required":true,"schema":{"type":"integer","title":"Invoice Id"}},{"name":"row_id","in":"path","required":true,"schema":{"type":"integer","title":"Row Id"}},{"name":"If-Match","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Version check: send back the ETag value from this resource's GET response so your change can't silently overwrite someone else's edit. If it is missing when required you get 428 (Precondition Required); if the record changed since you fetched it you get 412 (Precondition Failed) — re-GET and retry.","title":"If-Match"},"description":"Version check: send back the ETag value from this resource's GET response so your change can't silently overwrite someone else's edit. If it is missing when required you get 428 (Precondition Required); if the record changed since you fetched it you get 412 (Precondition Failed) — re-GET and retry."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvoiceRowUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleResponse_InvoiceRowOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Invoices"],"summary":"Soft-delete invoice row","description":"Requires `admin` scope and a valid `If-Match` header. Parent totals are recomputed.","operationId":"invoices_delete_invoice_row_endpoint","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"invoice_id","in":"path","required":true,"schema":{"type":"integer","title":"Invoice Id"}},{"name":"row_id","in":"path","required":true,"schema":{"type":"integer","title":"Row Id"}},{"name":"If-Match","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Version check: send back the ETag value from this resource's GET response so your change can't silently overwrite someone else's edit. If it is missing when required you get 428 (Precondition Required); if the record changed since you fetched it you get 412 (Precondition Failed) — re-GET and retry.","title":"If-Match"},"description":"Version check: send back the ETag value from this resource's GET response so your change can't silently overwrite someone else's edit. If it is missing when required you get 428 (Precondition Required); if the record changed since you fetched it you get 412 (Precondition Failed) — re-GET and retry."}],"responses":{"204":{"description":"Successful Response"},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v3/members":{"get":{"tags":["Members"],"summary":"List members","description":"Returns a paginated list of company team members.","operationId":"members_get_members","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","maximum":10000,"minimum":0,"default":0,"title":"Offset"}},{"name":"sort","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sort"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Opaque cursor for cursor-based pagination.","title":"Cursor"},"description":"Opaque cursor for cursor-based pagination."},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by status","title":"Status"},"description":"Filter by status"},{"name":"role","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by role","title":"Role"},"description":"Filter by role"},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Search by name","title":"Q"},"description":"Search by name"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_MemberOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v3/members/{member_id}":{"get":{"tags":["Members"],"summary":"Get member","description":"Returns a single team member by ID. The response carries a version tag in the `ETag` header; you only need it if you later edit money fields (flextime/vacation credit) — send it back as `If-Match` so your change can't silently overwrite someone else's.","operationId":"members_get_member","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"member_id","in":"path","required":true,"schema":{"type":"integer","title":"Member Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleResponse_MemberOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Members"],"summary":"Update a member","description":"PATCH a member. Requires `write`. Touching `flextime_credit` or `vacation_credit` additionally requires `admin` and an `If-Match` header.","operationId":"members_patch_member","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"member_id","in":"path","required":true,"schema":{"type":"integer","title":"Member Id"}},{"name":"If-Match","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Version check: send back the ETag value from this resource's GET response so your change can't silently overwrite someone else's edit. If it is missing when required you get 428 (Precondition Required); if the record changed since you fetched it you get 412 (Precondition Failed) — re-GET and retry.","title":"If-Match"},"description":"Version check: send back the ETag value from this resource's GET response so your change can't silently overwrite someone else's edit. If it is missing when required you get 428 (Precondition Required); if the record changed since you fetched it you get 412 (Precondition Failed) — re-GET and retry."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MemberUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleResponse_MemberOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v3/products":{"get":{"tags":["Products"],"summary":"List products","description":"Returns a paginated list of products/services.","operationId":"products_get_products","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","maximum":10000,"minimum":0,"default":0,"title":"Offset"}},{"name":"sort","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sort"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Opaque cursor for cursor-based pagination.","title":"Cursor"},"description":"Opaque cursor for cursor-based pagination."},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by status: active, inactive","title":"Status"},"description":"Filter by status: active, inactive"},{"name":"type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by type","title":"Type"},"description":"Filter by type"},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Search by name","title":"Q"},"description":"Search by name"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_ProductOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Products"],"summary":"Create product","description":"Creates a new product. Requires `admin`.","operationId":"products_post_product","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleResponse_ProductOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v3/products/{product_id}":{"get":{"tags":["Products"],"summary":"Get product","description":"Returns a single product by ID.","operationId":"products_get_product","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"product_id","in":"path","required":true,"schema":{"type":"integer","title":"Product Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleResponse_ProductOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Products"],"summary":"Update product","description":"Partially updates a product. Requires `write`. Money-bearing fields additionally require `admin`.","operationId":"products_patch_product","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"product_id","in":"path","required":true,"schema":{"type":"integer","title":"Product Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleResponse_ProductOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Products"],"summary":"Delete product","description":"Soft-deletes a product. Requires `admin`.","operationId":"products_remove_product","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"product_id","in":"path","required":true,"schema":{"type":"integer","title":"Product Id"}}],"responses":{"204":{"description":"Successful Response"},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v3/products/{product_id}/prices":{"get":{"tags":["Products"],"summary":"List prices for a product","description":"Returns **all** prices for the product — this bounded child collection is not paginated, so `limit` / `offset` are not accepted and `meta.has_more` is always false. Same convention as `/invoices/{id}/rows` and `/contracts/{id}/rows`.","operationId":"products_get_product_prices","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"product_id","in":"path","required":true,"schema":{"type":"integer","title":"Product Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_ProductPriceOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Products"],"summary":"Add a price to a product","description":"Requires `admin`.","operationId":"products_post_product_price","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"product_id","in":"path","required":true,"schema":{"type":"integer","title":"Product Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductPriceCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleResponse_ProductPriceOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v3/products/{product_id}/prices/{price_id}":{"get":{"tags":["Products"],"summary":"Get a product price","operationId":"products_get_product_price","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"product_id","in":"path","required":true,"schema":{"type":"integer","title":"Product Id"}},{"name":"price_id","in":"path","required":true,"schema":{"type":"integer","title":"Price Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleResponse_ProductPriceOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Products"],"summary":"Update a product price","description":"Requires `admin`.","operationId":"products_patch_product_price","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"product_id","in":"path","required":true,"schema":{"type":"integer","title":"Product Id"}},{"name":"price_id","in":"path","required":true,"schema":{"type":"integer","title":"Price Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductPriceUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleResponse_ProductPriceOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Products"],"summary":"Delete a product price","description":"Requires `admin`. Fails with 409 `LAST_PRICE_REQUIRED` if this is the product's only active price.","operationId":"products_remove_product_price","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"product_id","in":"path","required":true,"schema":{"type":"integer","title":"Product Id"}},{"name":"price_id","in":"path","required":true,"schema":{"type":"integer","title":"Price Id"}}],"responses":{"204":{"description":"Successful Response"},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v3/topics":{"get":{"tags":["Topics"],"summary":"List topics","description":"Returns a paginated list of topics/categories.","operationId":"topics_get_topics","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","maximum":10000,"minimum":0,"default":0,"title":"Offset"}},{"name":"sort","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sort"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Opaque cursor for cursor-based pagination.","title":"Cursor"},"description":"Opaque cursor for cursor-based pagination."},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by status: active, inactive","title":"Status"},"description":"Filter by status: active, inactive"},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Search by name","title":"Q"},"description":"Search by name"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_TopicOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Topics"],"summary":"Create topic","description":"Requires `write`.","operationId":"topics_post_topic","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TopicCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleResponse_TopicOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v3/topics/{topic_id}":{"get":{"tags":["Topics"],"summary":"Get topic","description":"Returns a single topic by ID.","operationId":"topics_get_topic","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"topic_id","in":"path","required":true,"schema":{"type":"integer","title":"Topic Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleResponse_TopicOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Topics"],"summary":"Update topic","operationId":"topics_patch_topic","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"topic_id","in":"path","required":true,"schema":{"type":"integer","title":"Topic Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TopicUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleResponse_TopicOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Topics"],"summary":"Delete topic","operationId":"topics_remove_topic","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"topic_id","in":"path","required":true,"schema":{"type":"integer","title":"Topic Id"}}],"responses":{"204":{"description":"Successful Response"},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v3/contracts":{"get":{"tags":["Contracts"],"summary":"List contracts","description":"Returns a paginated list of contracts (read-only).","operationId":"contracts_get_contracts","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","maximum":10000,"minimum":0,"default":0,"title":"Offset"}},{"name":"sort","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Sort field. Prefix with - for descending.","title":"Sort"},"description":"Sort field. Prefix with - for descending."},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Opaque cursor for cursor-based pagination.","title":"Cursor"},"description":"Opaque cursor for cursor-based pagination."},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by status (comma-separated: active,pending,finished)","title":"Status"},"description":"Filter by status (comma-separated: active,pending,finished)"},{"name":"type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by type: contract, template","title":"Type"},"description":"Filter by type: contract, template"},{"name":"client_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Filter by client ID","title":"Client Id"},"description":"Filter by client ID"},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Search by name","title":"Q"},"description":"Search by name"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_ContractOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Contracts"],"summary":"Create contract","description":"Creates a new contract in the requested status (default `pending`). Requires `admin`. Rows are added via `POST /contracts/{id}/rows`.","operationId":"contracts_post_contract","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContractCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleResponse_ContractOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v3/contracts/{contract_id}":{"get":{"tags":["Contracts"],"summary":"Get contract","description":"Returns a single contract by ID. The response includes a version tag in the `ETag` header; send it back as `If-Match` when you later edit this contract so your change can't silently overwrite someone else's.","operationId":"contracts_get_contract","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"contract_id","in":"path","required":true,"schema":{"type":"integer","title":"Contract Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleResponse_ContractOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Contracts"],"summary":"Delete contract","description":"Soft-deletes a contract. Requires `admin` + `If-Match`. Contracts in `active` or `finished` status must be moved to `pending` first (PATCH with `status=pending`) before they can be deleted.","operationId":"contracts_remove_contract","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"contract_id","in":"path","required":true,"schema":{"type":"integer","title":"Contract Id"}},{"name":"If-Match","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Version check: send back the ETag value from this resource's GET response so your change can't silently overwrite someone else's edit. If it is missing when required you get 428 (Precondition Required); if the record changed since you fetched it you get 412 (Precondition Failed) — re-GET and retry.","title":"If-Match"},"description":"Version check: send back the ETag value from this resource's GET response so your change can't silently overwrite someone else's edit. If it is missing when required you get 428 (Precondition Required); if the record changed since you fetched it you get 412 (Precondition Failed) — re-GET and retry."}],"responses":{"204":{"description":"Successful Response"},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Contracts"],"summary":"Update contract","description":"Updates a contract. Non-money fields (name, date_from, date_until) require `write`. Money fields (invoice_period, invoice_day, status) additionally require `admin`. `If-Match` is mandatory.","operationId":"contracts_patch_contract","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"contract_id","in":"path","required":true,"schema":{"type":"integer","title":"Contract Id"}},{"name":"If-Match","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Version check: send back the ETag value from this resource's GET response so your change can't silently overwrite someone else's edit. If it is missing when required you get 428 (Precondition Required); if the record changed since you fetched it you get 412 (Precondition Failed) — re-GET and retry.","title":"If-Match"},"description":"Version check: send back the ETag value from this resource's GET response so your change can't silently overwrite someone else's edit. If it is missing when required you get 428 (Precondition Required); if the record changed since you fetched it you get 412 (Precondition Failed) — re-GET and retry."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContractUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleResponse_ContractOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v3/contracts/{contract_id}/rows":{"get":{"tags":["Contracts"],"summary":"List contract rows","operationId":"contracts_get_contract_rows","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"contract_id","in":"path","required":true,"schema":{"type":"integer","title":"Contract Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_ContractRowOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Contracts"],"summary":"Create contract row","description":"Requires `admin` and a valid `If-Match` header on the parent contract.","operationId":"contracts_post_contract_row","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"contract_id","in":"path","required":true,"schema":{"type":"integer","title":"Contract Id"}},{"name":"If-Match","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Version check: send back the ETag value from this resource's GET response so your change can't silently overwrite someone else's edit. If it is missing when required you get 428 (Precondition Required); if the record changed since you fetched it you get 412 (Precondition Failed) — re-GET and retry.","title":"If-Match"},"description":"Version check: send back the ETag value from this resource's GET response so your change can't silently overwrite someone else's edit. If it is missing when required you get 428 (Precondition Required); if the record changed since you fetched it you get 412 (Precondition Failed) — re-GET and retry."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContractRowCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleResponse_ContractRowOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v3/contracts/{contract_id}/rows/{row_id}":{"get":{"tags":["Contracts"],"summary":"Get contract row","operationId":"contracts_get_contract_row","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"contract_id","in":"path","required":true,"schema":{"type":"integer","title":"Contract Id"}},{"name":"row_id","in":"path","required":true,"schema":{"type":"integer","title":"Row Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleResponse_ContractRowOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Contracts"],"summary":"Update contract row","description":"Requires `admin` and a valid `If-Match` header on the row.","operationId":"contracts_patch_contract_row","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"contract_id","in":"path","required":true,"schema":{"type":"integer","title":"Contract Id"}},{"name":"row_id","in":"path","required":true,"schema":{"type":"integer","title":"Row Id"}},{"name":"If-Match","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Version check: send back the ETag value from this resource's GET response so your change can't silently overwrite someone else's edit. If it is missing when required you get 428 (Precondition Required); if the record changed since you fetched it you get 412 (Precondition Failed) — re-GET and retry.","title":"If-Match"},"description":"Version check: send back the ETag value from this resource's GET response so your change can't silently overwrite someone else's edit. If it is missing when required you get 428 (Precondition Required); if the record changed since you fetched it you get 412 (Precondition Failed) — re-GET and retry."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContractRowUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleResponse_ContractRowOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Contracts"],"summary":"Soft-delete contract row","description":"Requires `admin` and a valid `If-Match` header on the row.","operationId":"contracts_delete_contract_row_endpoint","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"contract_id","in":"path","required":true,"schema":{"type":"integer","title":"Contract Id"}},{"name":"row_id","in":"path","required":true,"schema":{"type":"integer","title":"Row Id"}},{"name":"If-Match","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Version check: send back the ETag value from this resource's GET response so your change can't silently overwrite someone else's edit. If it is missing when required you get 428 (Precondition Required); if the record changed since you fetched it you get 412 (Precondition Failed) — re-GET and retry.","title":"If-Match"},"description":"Version check: send back the ETag value from this resource's GET response so your change can't silently overwrite someone else's edit. If it is missing when required you get 428 (Precondition Required); if the record changed since you fetched it you get 412 (Precondition Failed) — re-GET and retry."}],"responses":{"204":{"description":"Successful Response"},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v3/client-groups":{"get":{"tags":["Client Groups"],"summary":"List client groups","description":"Returns a paginated list of client groups.","operationId":"client_groups_get_client_groups","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","maximum":10000,"minimum":0,"default":0,"title":"Offset"}},{"name":"sort","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Sort field. Prefix with - for descending.","title":"Sort"},"description":"Sort field. Prefix with - for descending."},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by status (active, inactive)","title":"Status"},"description":"Filter by status (active, inactive)"},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Search by name","title":"Q"},"description":"Search by name"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_ClientGroupOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Client Groups"],"summary":"Create client group","description":"Requires `write`.","operationId":"client_groups_post_client_group","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClientGroupCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleResponse_ClientGroupOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v3/client-groups/{group_id}":{"get":{"tags":["Client Groups"],"summary":"Get client group","operationId":"client_groups_get_client_group","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"group_id","in":"path","required":true,"schema":{"type":"integer","title":"Group Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleResponse_ClientGroupOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Client Groups"],"summary":"Update client group","operationId":"client_groups_patch_client_group","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"group_id","in":"path","required":true,"schema":{"type":"integer","title":"Group Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClientGroupUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleResponse_ClientGroupOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Client Groups"],"summary":"Delete client group","operationId":"client_groups_remove_client_group","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"group_id","in":"path","required":true,"schema":{"type":"integer","title":"Group Id"}}],"responses":{"204":{"description":"Successful Response"},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v3/invoice-sellers":{"get":{"tags":["Invoice Sellers"],"summary":"List invoice sellers","description":"Returns a paginated list of invoice seller profiles (read-only).","operationId":"invoice_sellers_get_invoice_sellers","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","maximum":10000,"minimum":0,"default":0,"title":"Offset"}},{"name":"sort","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Sort field. Prefix with - for descending.","title":"Sort"},"description":"Sort field. Prefix with - for descending."},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Opaque cursor for cursor-based pagination.","title":"Cursor"},"description":"Opaque cursor for cursor-based pagination."},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by status (active, archived)","title":"Status"},"description":"Filter by status (active, archived)"},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Search by name","title":"Q"},"description":"Search by name"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_InvoiceSellerOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v3/invoice-sellers/{seller_id}":{"get":{"tags":["Invoice Sellers"],"summary":"Get invoice seller","description":"Returns a single invoice seller profile by ID (read-only).","operationId":"invoice_sellers_get_invoice_seller","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"seller_id","in":"path","required":true,"schema":{"type":"integer","title":"Seller Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleResponse_InvoiceSellerOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Invoice Sellers"],"summary":"Update invoice seller","description":"Partially updates an invoice seller profile. Requires `write`; only `status` and `logo_url` are write-tier — changes to the bank, IBAN, VAT, company-number, name, or address fields require `admin`.","operationId":"invoice_sellers_patch_invoice_seller","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"seller_id","in":"path","required":true,"schema":{"type":"integer","title":"Seller Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvoiceSellerUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleResponse_InvoiceSellerOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v3/agreements":{"get":{"tags":["Agreements"],"summary":"List company-wide agreements","description":"Returns company-wide agreements (those not tied to a specific member).","operationId":"agreements_get_company_agreements","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","maximum":10000,"minimum":0,"default":0,"title":"Offset"}},{"name":"date_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Date From"}},{"name":"date_until","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Date Until"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_AgreementOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Agreements"],"summary":"Create company-wide agreement","description":"Requires `admin`. Overlapping periods are accepted; response envelope includes a warning.","operationId":"agreements_post_company_agreement","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgreementCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleResponse_AgreementOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v3/agreements/{agreement_id}":{"get":{"tags":["Agreements"],"summary":"Get company-wide agreement","operationId":"agreements_get_company_agreement","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"agreement_id","in":"path","required":true,"schema":{"type":"integer","title":"Agreement Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleResponse_AgreementOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Agreements"],"summary":"Update company-wide agreement","description":"Requires `admin` scope and a valid `If-Match` header.","operationId":"agreements_patch_company_agreement","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"agreement_id","in":"path","required":true,"schema":{"type":"integer","title":"Agreement Id"}},{"name":"If-Match","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Version check: send back the ETag value from this resource's GET response so your change can't silently overwrite someone else's edit. If it is missing when required you get 428 (Precondition Required); if the record changed since you fetched it you get 412 (Precondition Failed) — re-GET and retry.","title":"If-Match"},"description":"Version check: send back the ETag value from this resource's GET response so your change can't silently overwrite someone else's edit. If it is missing when required you get 428 (Precondition Required); if the record changed since you fetched it you get 412 (Precondition Failed) — re-GET and retry."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgreementUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleResponse_AgreementOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Agreements"],"summary":"Soft-delete company-wide agreement","description":"Requires `admin` scope and a valid `If-Match` header.","operationId":"agreements_delete_company_agreement","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"agreement_id","in":"path","required":true,"schema":{"type":"integer","title":"Agreement Id"}},{"name":"If-Match","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Version check: send back the ETag value from this resource's GET response so your change can't silently overwrite someone else's edit. If it is missing when required you get 428 (Precondition Required); if the record changed since you fetched it you get 412 (Precondition Failed) — re-GET and retry.","title":"If-Match"},"description":"Version check: send back the ETag value from this resource's GET response so your change can't silently overwrite someone else's edit. If it is missing when required you get 428 (Precondition Required); if the record changed since you fetched it you get 412 (Precondition Failed) — re-GET and retry."}],"responses":{"204":{"description":"Successful Response"},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v3/members/{member_id}/agreements":{"get":{"tags":["Agreements"],"summary":"List member agreements","operationId":"agreements_get_member_agreements","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"member_id","in":"path","required":true,"schema":{"type":"integer","title":"Member Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","maximum":10000,"minimum":0,"default":0,"title":"Offset"}},{"name":"date_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Date From"}},{"name":"date_until","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Date Until"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_AgreementOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Agreements"],"summary":"Create member agreement","description":"Requires `admin`. Overlapping periods emit a warning (not an error).","operationId":"agreements_post_member_agreement","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"member_id","in":"path","required":true,"schema":{"type":"integer","title":"Member Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgreementCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleResponse_AgreementOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v3/members/{member_id}/agreements/{agreement_id}":{"get":{"tags":["Agreements"],"summary":"Get member agreement","operationId":"agreements_get_member_agreement","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"member_id","in":"path","required":true,"schema":{"type":"integer","title":"Member Id"}},{"name":"agreement_id","in":"path","required":true,"schema":{"type":"integer","title":"Agreement Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleResponse_AgreementOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Agreements"],"summary":"Update member agreement","operationId":"agreements_patch_member_agreement","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"member_id","in":"path","required":true,"schema":{"type":"integer","title":"Member Id"}},{"name":"agreement_id","in":"path","required":true,"schema":{"type":"integer","title":"Agreement Id"}},{"name":"If-Match","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Version check: send back the ETag value from this resource's GET response so your change can't silently overwrite someone else's edit. If it is missing when required you get 428 (Precondition Required); if the record changed since you fetched it you get 412 (Precondition Failed) — re-GET and retry.","title":"If-Match"},"description":"Version check: send back the ETag value from this resource's GET response so your change can't silently overwrite someone else's edit. If it is missing when required you get 428 (Precondition Required); if the record changed since you fetched it you get 412 (Precondition Failed) — re-GET and retry."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgreementUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleResponse_AgreementOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Agreements"],"summary":"Soft-delete member agreement","operationId":"agreements_delete_member_agreement","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"member_id","in":"path","required":true,"schema":{"type":"integer","title":"Member Id"}},{"name":"agreement_id","in":"path","required":true,"schema":{"type":"integer","title":"Agreement Id"}},{"name":"If-Match","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Version check: send back the ETag value from this resource's GET response so your change can't silently overwrite someone else's edit. If it is missing when required you get 428 (Precondition Required); if the record changed since you fetched it you get 412 (Precondition Failed) — re-GET and retry.","title":"If-Match"},"description":"Version check: send back the ETag value from this resource's GET response so your change can't silently overwrite someone else's edit. If it is missing when required you get 428 (Precondition Required); if the record changed since you fetched it you get 412 (Precondition Failed) — re-GET and retry."}],"responses":{"204":{"description":"Successful Response"},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v3/projects":{"get":{"tags":["Projects"],"summary":"List projects","description":"Paginated project list. Returns only `type=project` rows; workflow templates are excluded.","operationId":"projects_get_projects","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","maximum":10000,"minimum":0,"default":0,"title":"Offset"}},{"name":"sort","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sort"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type"}},{"name":"client_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Client Id"}},{"name":"manager_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Manager Id"}},{"name":"project_type_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Project Type Id"}},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_ProjectOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Projects"],"summary":"Create project","operationId":"projects_post_project","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleResponse_ProjectOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v3/projects/{project_id}":{"get":{"tags":["Projects"],"summary":"Get project","operationId":"projects_get_project","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"integer","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleResponse_ProjectOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Projects"],"summary":"Update project","operationId":"projects_patch_project","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"integer","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleResponse_ProjectOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Projects"],"summary":"Delete project","operationId":"projects_remove_project","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"integer","title":"Project Id"}}],"responses":{"204":{"description":"Successful Response"},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v3/monitors":{"get":{"tags":["Monitors"],"summary":"List monitors","operationId":"monitors_get_monitors","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","maximum":10000,"minimum":0,"default":0,"title":"Offset"}},{"name":"sort","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sort"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor"}},{"name":"client_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Client Id"}},{"name":"type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type"}},{"name":"role_person_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Role Person Id"}},{"name":"frequency","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Frequency"}},{"name":"active","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Active"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_ClientMonitorOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Monitors"],"summary":"Create monitor","description":"Requires `admin`. Emits a `MONITOR_OVERLAP` entry in `warnings[]` on overlap (also mirrored on the deprecated `X-Uku-Warning` header for one release).","operationId":"monitors_post_monitor","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClientMonitorCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleResponse_ClientMonitorOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v3/monitors/{monitor_id}":{"get":{"tags":["Monitors"],"summary":"Get monitor","operationId":"monitors_get_monitor","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"monitor_id","in":"path","required":true,"schema":{"type":"integer","title":"Monitor Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleResponse_ClientMonitorOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Monitors"],"summary":"Update monitor","description":"Requires `write`. Changes to `value` or `range_value` additionally require `admin` and a valid `If-Match` header.","operationId":"monitors_patch_monitor","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"monitor_id","in":"path","required":true,"schema":{"type":"integer","title":"Monitor Id"}},{"name":"If-Match","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Version check: send back the ETag value from this resource's GET response so your change can't silently overwrite someone else's edit. If it is missing when required you get 428 (Precondition Required); if the record changed since you fetched it you get 412 (Precondition Failed) — re-GET and retry.","title":"If-Match"},"description":"Version check: send back the ETag value from this resource's GET response so your change can't silently overwrite someone else's edit. If it is missing when required you get 428 (Precondition Required); if the record changed since you fetched it you get 412 (Precondition Failed) — re-GET and retry."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClientMonitorUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleResponse_ClientMonitorOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Monitors"],"summary":"Delete monitor","description":"Requires `admin` and a valid `If-Match` header.","operationId":"monitors_remove_monitor","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"monitor_id","in":"path","required":true,"schema":{"type":"integer","title":"Monitor Id"}},{"name":"If-Match","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Version check: send back the ETag value from this resource's GET response so your change can't silently overwrite someone else's edit. If it is missing when required you get 428 (Precondition Required); if the record changed since you fetched it you get 412 (Precondition Failed) — re-GET and retry.","title":"If-Match"},"description":"Version check: send back the ETag value from this resource's GET response so your change can't silently overwrite someone else's edit. If it is missing when required you get 428 (Precondition Required); if the record changed since you fetched it you get 412 (Precondition Failed) — re-GET and retry."}],"responses":{"204":{"description":"Successful Response"},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v3/clients/{client_id}/monitors":{"get":{"tags":["Monitors"],"summary":"List monitors for a client","operationId":"monitors_get_client_monitors","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"client_id","in":"path","required":true,"schema":{"type":"integer","title":"Client Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","maximum":10000,"minimum":0,"default":0,"title":"Offset"}},{"name":"sort","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sort"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor"}},{"name":"type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type"}},{"name":"role_person_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Role Person Id"}},{"name":"frequency","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Frequency"}},{"name":"active","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Active"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_ClientMonitorOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Monitors"],"summary":"Create monitor for a client","operationId":"monitors_post_client_monitor","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"client_id","in":"path","required":true,"schema":{"type":"integer","title":"Client Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClientMonitorCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleResponse_ClientMonitorOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v3/suppliers":{"get":{"tags":["Suppliers"],"summary":"List suppliers","operationId":"suppliers_get_suppliers","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","maximum":10000,"minimum":0,"default":0,"title":"Offset"}},{"name":"sort","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sort"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor"}},{"name":"type_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Type Id"}},{"name":"parent_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Parent Id"}},{"name":"country_code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country Code"}},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_SupplierOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Suppliers"],"summary":"Create supplier","operationId":"suppliers_post_supplier","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SupplierCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleResponse_SupplierOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v3/suppliers/{supplier_id}":{"get":{"tags":["Suppliers"],"summary":"Get supplier","operationId":"suppliers_get_supplier","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"supplier_id","in":"path","required":true,"schema":{"type":"integer","title":"Supplier Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleResponse_SupplierOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Suppliers"],"summary":"Update supplier","operationId":"suppliers_patch_supplier","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"supplier_id","in":"path","required":true,"schema":{"type":"integer","title":"Supplier Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SupplierUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleResponse_SupplierOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Suppliers"],"summary":"Delete supplier","operationId":"suppliers_remove_supplier","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"supplier_id","in":"path","required":true,"schema":{"type":"integer","title":"Supplier Id"}}],"responses":{"204":{"description":"Successful Response"},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v3/supplier-types":{"get":{"tags":["Suppliers"],"summary":"List supplier types","operationId":"suppliers_get_supplier_types","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","maximum":10000,"minimum":0,"default":0,"title":"Offset"}},{"name":"sort","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sort"}},{"name":"parent_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Parent Id"}},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_SupplierTypeOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v3/supplier-types/{type_id}":{"get":{"tags":["Suppliers"],"summary":"Get supplier type","operationId":"suppliers_get_supplier_type","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"type_id","in":"path","required":true,"schema":{"type":"integer","title":"Type Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleResponse_SupplierTypeOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Suppliers"],"summary":"Update supplier type","operationId":"suppliers_patch_supplier_type","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"type_id","in":"path","required":true,"schema":{"type":"integer","title":"Type Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SupplierTypeUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleResponse_SupplierTypeOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v3/taxes":{"get":{"tags":["Taxes"],"summary":"List taxes","operationId":"taxes_get_taxes","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","maximum":10000,"minimum":0,"default":0,"title":"Offset"}},{"name":"sort","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sort"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_TaxOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v3/taxes/{tax_id}":{"get":{"tags":["Taxes"],"summary":"Get tax","operationId":"taxes_get_tax","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"tax_id","in":"path","required":true,"schema":{"type":"integer","title":"Tax Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleResponse_TaxOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Taxes"],"summary":"Update tax","description":"Requires `write`. Changes to `rate` or `percent` additionally require `admin` — rate changes affect every invoice that uses this tax.","operationId":"taxes_patch_tax","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"tax_id","in":"path","required":true,"schema":{"type":"integer","title":"Tax Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TaxUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleResponse_TaxOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v3/notes":{"get":{"tags":["Notes"],"summary":"List notes","operationId":"notes_get_notes","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","maximum":10000,"minimum":0,"default":0,"title":"Offset"}},{"name":"related_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Related Type"}},{"name":"related_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Related Id"}},{"name":"type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type"}},{"name":"is_pinned","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Pinned"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_NoteOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Notes"],"summary":"Create note","operationId":"notes_post_note","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NoteCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleResponse_NoteOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v3/notes/{note_id}":{"get":{"tags":["Notes"],"summary":"Get note","operationId":"notes_get_note","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"note_id","in":"path","required":true,"schema":{"type":"integer","title":"Note Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleResponse_NoteOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Notes"],"summary":"Update note","operationId":"notes_patch_note","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"note_id","in":"path","required":true,"schema":{"type":"integer","title":"Note Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NoteUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleResponse_NoteOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Notes"],"summary":"Delete note","operationId":"notes_remove_note","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"note_id","in":"path","required":true,"schema":{"type":"integer","title":"Note Id"}}],"responses":{"204":{"description":"Successful Response"},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v3/custom-fields":{"get":{"tags":["Custom Fields"],"summary":"List custom field definitions","description":"Returns system + account-owned custom field definitions. Filter by `entity_type` (client, task, project, supplier, account_member, contact). `member` is accepted as an alias for `account_member`. Values themselves stay inline on the parent resource.","operationId":"custom_fields_get_custom_fields","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":100,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","maximum":10000,"minimum":0,"default":0,"title":"Offset"}},{"name":"entity_type","in":"query","required":false,"schema":{"anyOf":[{"enum":["client","task","project","supplier","account_member","contact","member"],"type":"string"},{"type":"null"}],"description":"`member` is accepted as an alias for `account_member`.","title":"Entity Type"},"description":"`member` is accepted as an alias for `account_member`."},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"enum":["active","inactive"],"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"is_system","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is System"}},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_CustomFieldOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Custom Fields"],"summary":"Create custom field","description":"Creates an account-owned custom field definition. System fields cannot be created via API.","operationId":"custom_fields_post_custom_field","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomFieldCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleResponse_CustomFieldOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v3/custom-fields/{field_id}":{"get":{"tags":["Custom Fields"],"summary":"Get custom field","operationId":"custom_fields_get_custom_field","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"field_id","in":"path","required":true,"schema":{"type":"integer","title":"Field Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleResponse_CustomFieldOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Custom Fields"],"summary":"Update custom field","description":"Updates an account-owned custom field. System fields are read-only (403). `name`, `field_type`, and `entity_type` are immutable. Removing an option whose value is in use returns 409 CUSTOM_FIELD_OPTION_IN_USE.","operationId":"custom_fields_patch_custom_field","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"field_id","in":"path","required":true,"schema":{"type":"integer","title":"Field Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomFieldUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleResponse_CustomFieldOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Custom Fields"],"summary":"Delete custom field","description":"Soft-deletes an account-owned custom field. System fields cannot be deleted (403).","operationId":"custom_fields_remove_custom_field","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"field_id","in":"path","required":true,"schema":{"type":"integer","title":"Field Id"}}],"responses":{"204":{"description":"Successful Response"},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v3/product-fields":{"get":{"tags":["Product Fields"],"summary":"List product fields","operationId":"product_fields_get_product_fields","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":100,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","maximum":10000,"minimum":0,"default":0,"title":"Offset"}},{"name":"sort","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sort"}},{"name":"type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by type: article, resource, cost_center, billing_project","title":"Type"},"description":"Filter by type: article, resource, cost_center, billing_project"},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code"}},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_ProductFieldOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Product Fields"],"summary":"Create product field","operationId":"product_fields_post_product_field","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductFieldCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleResponse_ProductFieldOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v3/product-fields/{field_id}":{"get":{"tags":["Product Fields"],"summary":"Get product field","operationId":"product_fields_get_product_field","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"field_id","in":"path","required":true,"schema":{"type":"integer","title":"Field Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleResponse_ProductFieldOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Product Fields"],"summary":"Update product field","operationId":"product_fields_patch_product_field","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"field_id","in":"path","required":true,"schema":{"type":"integer","title":"Field Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductFieldUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleResponse_ProductFieldOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Product Fields"],"summary":"Delete product field","operationId":"product_fields_remove_product_field","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"field_id","in":"path","required":true,"schema":{"type":"integer","title":"Field Id"}}],"responses":{"204":{"description":"Successful Response"},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v3/workflow-roles":{"get":{"tags":["Workflow Roles"],"summary":"List workflow roles","operationId":"workflow_roles_get_workflow_roles","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":100,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","maximum":10000,"minimum":0,"default":0,"title":"Offset"}},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_WorkflowRoleOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Workflow Roles"],"summary":"Create workflow role","operationId":"workflow_roles_post_workflow_role","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowRoleCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleResponse_WorkflowRoleOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v3/workflow-roles/{role_id}":{"get":{"tags":["Workflow Roles"],"summary":"Get workflow role","operationId":"workflow_roles_get_workflow_role","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"role_id","in":"path","required":true,"schema":{"type":"integer","title":"Role Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleResponse_WorkflowRoleOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Workflow Roles"],"summary":"Update workflow role","operationId":"workflow_roles_patch_workflow_role","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"role_id","in":"path","required":true,"schema":{"type":"integer","title":"Role Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowRoleUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleResponse_WorkflowRoleOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Workflow Roles"],"summary":"Delete workflow role","operationId":"workflow_roles_remove_workflow_role","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"role_id","in":"path","required":true,"schema":{"type":"integer","title":"Role Id"}}],"responses":{"204":{"description":"Successful Response"},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v3/roles":{"get":{"tags":["Roles"],"summary":"List roles","operationId":"roles_get_roles","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":100,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","maximum":10000,"minimum":0,"default":0,"title":"Offset"}},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_RoleOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Roles"],"summary":"Create role","operationId":"roles_post_role","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RoleCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleResponse_RoleOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v3/roles/{role_id}":{"get":{"tags":["Roles"],"summary":"Get role","operationId":"roles_get_role","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"role_id","in":"path","required":true,"schema":{"type":"integer","title":"Role Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleResponse_RoleOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Roles"],"summary":"Update role","operationId":"roles_patch_role","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"role_id","in":"path","required":true,"schema":{"type":"integer","title":"Role Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RoleUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleResponse_RoleOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Roles"],"summary":"Delete role","operationId":"roles_remove_role","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"role_id","in":"path","required":true,"schema":{"type":"integer","title":"Role Id"}}],"responses":{"204":{"description":"Successful Response"},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v3/content-templates":{"get":{"tags":["Content Templates"],"summary":"List content templates","operationId":"content_templates_get_content_templates","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","maximum":10000,"minimum":0,"default":0,"title":"Offset"}},{"name":"type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type"}},{"name":"channel","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Channel"}},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_ContentTemplateOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Content Templates"],"summary":"Create content template","operationId":"content_templates_post_content_template","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContentTemplateCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleResponse_ContentTemplateOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v3/content-templates/{template_id}":{"get":{"tags":["Content Templates"],"summary":"Get content template","operationId":"content_templates_get_content_template","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"template_id","in":"path","required":true,"schema":{"type":"integer","title":"Template Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleResponse_ContentTemplateOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Content Templates"],"summary":"Update content template","operationId":"content_templates_patch_content_template","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"template_id","in":"path","required":true,"schema":{"type":"integer","title":"Template Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContentTemplateUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleResponse_ContentTemplateOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Content Templates"],"summary":"Delete content template","operationId":"content_templates_remove_content_template","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"template_id","in":"path","required":true,"schema":{"type":"integer","title":"Template Id"}}],"responses":{"204":{"description":"Successful Response"},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v3/content-templates/{template_id}/rows":{"post":{"tags":["Content Templates"],"summary":"Upsert template row for a locale","description":"Creates or replaces the row for the given locale on this template.","operationId":"content_templates_post_content_template_row","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"template_id","in":"path","required":true,"schema":{"type":"integer","title":"Template Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContentTemplateRowInput"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleResponse_ContentTemplateRowOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v3/content-templates/{template_id}/rows/{row_id}":{"patch":{"tags":["Content Templates"],"summary":"Update template row","operationId":"content_templates_patch_content_template_row","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"template_id","in":"path","required":true,"schema":{"type":"integer","title":"Template Id"}},{"name":"row_id","in":"path","required":true,"schema":{"type":"integer","title":"Row Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContentTemplateRowUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleResponse_ContentTemplateRowOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Content Templates"],"summary":"Delete template row","operationId":"content_templates_remove_content_template_row","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"template_id","in":"path","required":true,"schema":{"type":"integer","title":"Template Id"}},{"name":"row_id","in":"path","required":true,"schema":{"type":"integer","title":"Row Id"}}],"responses":{"204":{"description":"Successful Response"},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v3/budgets":{"get":{"tags":["Budgets"],"summary":"List budgets","operationId":"budgets_get_budgets","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","maximum":10000,"minimum":0,"default":0,"title":"Offset"}},{"name":"client_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Client Id"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_BudgetOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Budgets"],"summary":"Create budget","operationId":"budgets_post_budget","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BudgetCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleResponse_BudgetOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v3/budgets/{bid}":{"get":{"tags":["Budgets"],"summary":"Get budget","operationId":"budgets_get_budget","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"bid","in":"path","required":true,"schema":{"type":"integer","title":"Bid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleResponse_BudgetOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Budgets"],"summary":"Update budget","operationId":"budgets_patch_budget","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"bid","in":"path","required":true,"schema":{"type":"integer","title":"Bid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BudgetUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleResponse_BudgetOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Budgets"],"summary":"Delete budget","operationId":"budgets_remove_budget","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"bid","in":"path","required":true,"schema":{"type":"integer","title":"Bid"}}],"responses":{"204":{"description":"Successful Response"},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v3/task-relations":{"get":{"tags":["Task Relations"],"summary":"List task relations","operationId":"task_relations_get_task_relations","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":100,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","maximum":10000,"minimum":0,"default":0,"title":"Offset"}},{"name":"task_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Task Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_TaskRelationOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Task Relations"],"summary":"Create task relation","operationId":"task_relations_post_task_relation","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TaskRelationCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleResponse_TaskRelationOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v3/task-relations/{rid}":{"delete":{"tags":["Task Relations"],"summary":"Delete task relation","operationId":"task_relations_remove_task_relation","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"integer","title":"Rid"}}],"responses":{"204":{"description":"Successful Response"},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v3/flextime":{"get":{"tags":["Flextime"],"summary":"List flextime entries","operationId":"flextime_get_flextime_entries","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","maximum":10000,"minimum":0,"default":0,"title":"Offset"}},{"name":"person_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Person Id"}},{"name":"type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"month","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Month"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_FlextimeOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Flextime"],"summary":"Create flextime entry","description":"Requires `admin` (flextime balance is money-adjacent).","operationId":"flextime_post_flextime","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FlextimeCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleResponse_FlextimeOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v3/flextime/{fid}":{"get":{"tags":["Flextime"],"summary":"Get flextime entry","operationId":"flextime_get_flextime_entry","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"fid","in":"path","required":true,"schema":{"type":"integer","title":"Fid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleResponse_FlextimeOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Flextime"],"summary":"Update flextime entry","operationId":"flextime_patch_flextime","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"fid","in":"path","required":true,"schema":{"type":"integer","title":"Fid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FlextimeUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleResponse_FlextimeOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Flextime"],"summary":"Delete flextime entry","operationId":"flextime_remove_flextime","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"fid","in":"path","required":true,"schema":{"type":"integer","title":"Fid"}}],"responses":{"204":{"description":"Successful Response"},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v3/client-members":{"get":{"tags":["Client Members"],"summary":"List client members","operationId":"client_members_get_client_members","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","maximum":10000,"minimum":0,"default":0,"title":"Offset"}},{"name":"client_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Client Id"}},{"name":"person_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Person Id"}},{"name":"role","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Role"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_ClientMemberOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Client Members"],"summary":"Assign client member","operationId":"client_members_post_client_member","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClientMemberCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleResponse_ClientMemberOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v3/client-members/{cmid}":{"get":{"tags":["Client Members"],"summary":"Get client member","operationId":"client_members_get_client_member","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"cmid","in":"path","required":true,"schema":{"type":"integer","title":"Cmid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleResponse_ClientMemberOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Client Members"],"summary":"Update client member","operationId":"client_members_patch_client_member","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"cmid","in":"path","required":true,"schema":{"type":"integer","title":"Cmid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClientMemberUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleResponse_ClientMemberOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Client Members"],"summary":"Unassign client member","operationId":"client_members_remove_client_member","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"cmid","in":"path","required":true,"schema":{"type":"integer","title":"Cmid"}}],"responses":{"204":{"description":"Successful Response"},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v3/attachments":{"get":{"tags":["Attachments"],"summary":"List attachments","description":"Filter by `related_type` + `related_id` for files on a specific parent entity.","operationId":"attachments_get_attachments","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","maximum":10000,"minimum":0,"default":0,"title":"Offset"}},{"name":"related_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Related Type"}},{"name":"related_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Related Id"}},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_AttachmentOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"413":{"description":"FILE_TOO_LARGE — upload exceeds the 150 MB limit.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"415":{"description":"UNSUPPORTED_MEDIA_TYPE — the extension/MIME allowlist or magic-byte content check rejected the file.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v3/attachments/{attachment_id}":{"get":{"tags":["Attachments"],"summary":"Get attachment metadata","operationId":"attachments_get_attachment","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"attachment_id","in":"path","required":true,"schema":{"type":"integer","title":"Attachment Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleResponse_AttachmentOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"413":{"description":"FILE_TOO_LARGE — upload exceeds the 150 MB limit.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"415":{"description":"UNSUPPORTED_MEDIA_TYPE — the extension/MIME allowlist or magic-byte content check rejected the file.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Attachments"],"summary":"Delete attachment","description":"Soft-delete. File stays in storage for backup/restore; becomes inaccessible via API.","operationId":"attachments_remove_attachment","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"attachment_id","in":"path","required":true,"schema":{"type":"integer","title":"Attachment Id"}}],"responses":{"204":{"description":"Successful Response"},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"413":{"description":"FILE_TOO_LARGE — upload exceeds the 150 MB limit.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"415":{"description":"UNSUPPORTED_MEDIA_TYPE — the extension/MIME allowlist or magic-byte content check rejected the file.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v3/attachments/{attachment_id}/download":{"get":{"tags":["Attachments"],"summary":"Download attachment file","description":"Streams the file with the original filename in Content-Disposition. Fetches from cloud if needed.","operationId":"attachments_download_attachment","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"attachment_id","in":"path","required":true,"schema":{"type":"integer","title":"Attachment Id"}}],"responses":{"200":{"description":"File bytes","content":{"application/json":{"schema":{}},"application/octet-stream":{}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Attachment not found"},"409":{"description":"File still being processed (retry shortly)"},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"413":{"description":"FILE_TOO_LARGE — upload exceeds the 150 MB limit.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"415":{"description":"UNSUPPORTED_MEDIA_TYPE — the extension/MIME allowlist or magic-byte content check rejected the file.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v3/tasks/{task_id}/attachments":{"post":{"tags":["Attachments"],"summary":"Attach a file to a task","description":"Uploads a file via `multipart/form-data`. Field name must be `file`. Max size 150MB. MIME allowlist + magic-byte check apply; executable extensions (.exe/.bat/.js/etc) are rejected regardless of content-type.","operationId":"attachments_upload_task_attachment","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"task_id","in":"path","required":true,"schema":{"type":"integer","title":"Task Id"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_attachments_upload_task_attachment"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleResponse_AttachmentOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"413":{"description":"FILE_TOO_LARGE — upload exceeds the 150 MB limit.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"415":{"description":"UNSUPPORTED_MEDIA_TYPE — the extension/MIME allowlist or magic-byte content check rejected the file.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v3/notes/{note_id}/attachments":{"post":{"tags":["Attachments"],"summary":"Attach a file to a note","description":"Uploads a file via `multipart/form-data`. Field name must be `file`. Max size 150MB. MIME allowlist + magic-byte check apply; executable extensions (.exe/.bat/.js/etc) are rejected regardless of content-type. The note's parent (client/project/supplier) determines tenant ownership, and the file surfaces on that client's Files page.","operationId":"attachments_upload_note_attachment","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"note_id","in":"path","required":true,"schema":{"type":"integer","title":"Note Id"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_attachments_upload_note_attachment"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleResponse_AttachmentOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"413":{"description":"FILE_TOO_LARGE — upload exceeds the 150 MB limit.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"415":{"description":"UNSUPPORTED_MEDIA_TYPE — the extension/MIME allowlist or magic-byte content check rejected the file.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v3/calendar":{"get":{"tags":["Calendar"],"summary":"List calendar entries","description":"Vacation / time-off / flextime entries for this company + global holidays. Filter `scope=company` for own-company only.","operationId":"calendar_get_calendar_entries","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","maximum":10000,"minimum":0,"default":0,"title":"Offset"}},{"name":"type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type"}},{"name":"person_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Person Id"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"date_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Date From"}},{"name":"date_until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Date Until"}},{"name":"scope","in":"query","required":false,"schema":{"type":"string","default":"all","title":"Scope"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_CalendarOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Calendar"],"summary":"Create calendar entry","description":"Creates a vacation/time-off/flextime/sick_leave entry. Holidays are system-managed and not writable via API.","operationId":"calendar_post_calendar_entry","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CalendarCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleResponse_CalendarOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v3/calendar/{cid}":{"get":{"tags":["Calendar"],"summary":"Get calendar entry","operationId":"calendar_get_calendar_entry","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"cid","in":"path","required":true,"schema":{"type":"integer","title":"Cid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleResponse_CalendarOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Calendar"],"summary":"Update calendar entry","operationId":"calendar_patch_calendar_entry","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"cid","in":"path","required":true,"schema":{"type":"integer","title":"Cid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CalendarUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleResponse_CalendarOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Calendar"],"summary":"Delete calendar entry","operationId":"calendar_remove_calendar_entry","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"cid","in":"path","required":true,"schema":{"type":"integer","title":"Cid"}}],"responses":{"204":{"description":"Successful Response"},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v3/task-automations":{"get":{"tags":["Task Automations"],"summary":"List task automations","operationId":"task_automations_get_task_automations","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","maximum":10000,"minimum":0,"default":0,"title":"Offset"}},{"name":"task_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Task Id"}},{"name":"client_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Client Id"}},{"name":"project_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Project Id"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"trigger","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Trigger"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_TaskAutomationOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Task Automations"],"summary":"Create task automation","operationId":"task_automations_post_task_automation","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TaskAutomationCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleResponse_TaskAutomationOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v3/task-automations/{aid}":{"get":{"tags":["Task Automations"],"summary":"Get task automation","operationId":"task_automations_get_task_automation","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"aid","in":"path","required":true,"schema":{"type":"integer","title":"Aid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleResponse_TaskAutomationOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Task Automations"],"summary":"Update task automation","operationId":"task_automations_patch_task_automation","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"aid","in":"path","required":true,"schema":{"type":"integer","title":"Aid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TaskAutomationUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleResponse_TaskAutomationOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Task Automations"],"summary":"Delete task automation","operationId":"task_automations_remove_task_automation","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"aid","in":"path","required":true,"schema":{"type":"integer","title":"Aid"}}],"responses":{"204":{"description":"Successful Response"},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v3/delegations":{"get":{"tags":["Delegations"],"summary":"List delegations","operationId":"delegations_get_delegations","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","maximum":10000,"minimum":0,"default":0,"title":"Offset"}},{"name":"person_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Person Id"}},{"name":"delegate_person_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Delegate Person Id"}},{"name":"calendar_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Calendar Id"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_DelegationOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Delegations"],"summary":"Create delegation","operationId":"delegations_post_delegation","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DelegationCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleResponse_DelegationOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v3/delegations/{did}":{"get":{"tags":["Delegations"],"summary":"Get delegation","operationId":"delegations_get_delegation","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"did","in":"path","required":true,"schema":{"type":"integer","title":"Did"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleResponse_DelegationOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Delegations"],"summary":"Update delegation","operationId":"delegations_patch_delegation","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"did","in":"path","required":true,"schema":{"type":"integer","title":"Did"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DelegationUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleResponse_DelegationOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Delegations"],"summary":"Delete delegation","operationId":"delegations_remove_delegation","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"did","in":"path","required":true,"schema":{"type":"integer","title":"Did"}}],"responses":{"204":{"description":"Successful Response"},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v3/reclaims":{"get":{"tags":["Reclaims"],"summary":"List billing reclaims","description":"Read-only visibility into reclaimed unbilled work items. Use PATCH to undo.","operationId":"reclaims_get_reclaims","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","maximum":10000,"minimum":0,"default":0,"title":"Offset"}},{"name":"client_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Client Id"}},{"name":"source_task_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Source Task Id"}},{"name":"target_task_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Target Task Id"}},{"name":"undone","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Undone"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_ReclaimOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v3/reclaims/{rid}":{"get":{"tags":["Reclaims"],"summary":"Get reclaim","operationId":"reclaims_get_reclaim","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"integer","title":"Rid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleResponse_ReclaimOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Reclaims"],"summary":"Undo/re-do reclaim","description":"Sets `undone_at` to mark the reclaim as undone, or null to re-enable. Requires `admin`.","operationId":"reclaims_patch_reclaim","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"integer","title":"Rid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReclaimUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleResponse_ReclaimOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v3/reclaims/{rid}/undo":{"post":{"tags":["Reclaims"],"summary":"Undo reclaim","description":"Reverses a reclaim: moves the reclaimed time entries back to the source task (or restores the field quantity) and marks the reclaim undone. Requires the `financials` scope. Wraps the same backoffice flow as the app's \"Undo reclaim\" action, and — like it — undoes the whole reclaim batch sharing this row's reclaim task, not just this one row. 409 `RECLAIM_NOT_UNDOABLE` if it's already undone, the reclaim/source task is gone, or the target period has a locked invoice (created/sent/paid).","operationId":"reclaims_post_reclaim_undo","security":[{"CompanyUUID":[]},{"ApiKey":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"integer","title":"Rid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleResponse_ReclaimOut_"}}}},"400":{"description":"VALIDATION_ERROR — the request body/query failed schema validation, or a domain rule was violated (e.g. `INVALID_DATE_RANGE`, `INVALID_GROUP`, `INVALID_TOPIC`, `INVALID_PERIOD`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"UNAUTHORIZED — missing or invalid `X-API-Key` / `X-Uku-Company`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"FORBIDDEN — valid key but missing scope/right for this action. Also covers `FINANCIAL_SCOPE_REQUIRED` (money field without `financials`), `READ_ONLY` (resource exists but this subtype is unwritable), and `SUBSCRIPTION_READ_ONLY` (tenant subscription gate).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"NOT_FOUND — resource does not exist, or belongs to another tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Domain conflict — e.g. `*_EXISTS`, `*_LOCKED`, `LAST_PRICE_REQUIRED`, `CUSTOM_FIELD_OPTION_IN_USE`, `INVOICE_LOCKED`, `STATUS_TRANSITION_NOT_SUPPORTED`, `RECLAIM_UNDO_NOT_SUPPORTED`, `TIMER_ALREADY_RUNNING`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"STALE_WRITE — the `If-Match` header no longer matches the resource's current `updated_at`. Re-`GET` and retry with the fresh ETag.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"428":{"description":"PRECONDITION_REQUIRED — this write requires `If-Match` and none was sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. See the `X-RateLimit-{Limit,Remaining,Reset,Tier}` response headers; wait for `Reset` (epoch seconds) rather than polling.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"AgreementCreate":{"properties":{"date_from":{"type":"string","format":"date-time","title":"Date From","description":"Period start (required)."},"date_until":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Date Until"},"work_weekends":{"type":"integer","title":"Work Weekends","default":0},"work_holidays":{"type":"integer","title":"Work Holidays","default":0},"office_rate":{"anyOf":[{"type":"number","minimum":0.0},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Office Rate"},"cost_type":{"type":"string","enum":["hour","month"],"title":"Cost Type","default":"hour"},"cost_price":{"anyOf":[{"type":"number","minimum":0.0},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Cost Price"},"cost_overhead":{"anyOf":[{"type":"number","minimum":0.0},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Cost Overhead"},"sales_price":{"anyOf":[{"type":"number","minimum":0.0},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Sales Price"}},"type":"object","required":["date_from"],"title":"AgreementCreate"},"AgreementOut":{"properties":{"id":{"type":"integer","title":"Id"},"person_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Person Id"},"date_from":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Date From"},"date_until":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Date Until"},"work_weekends":{"type":"integer","title":"Work Weekends","default":0},"work_holidays":{"type":"integer","title":"Work Holidays","default":0},"office_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Office Rate"},"cost_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cost Type"},"cost_price":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Cost Price"},"cost_overhead":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Cost Overhead"},"sales_price":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Sales Price"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"}},"type":"object","required":["id"],"title":"AgreementOut"},"AgreementUpdate":{"properties":{"date_from":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Date From"},"date_until":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Date Until"},"work_weekends":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Work Weekends"},"work_holidays":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Work Holidays"},"office_rate":{"anyOf":[{"type":"number","minimum":0.0},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Office Rate"},"cost_type":{"anyOf":[{"type":"string","enum":["hour","month"]},{"type":"null"}],"title":"Cost Type"},"cost_price":{"anyOf":[{"type":"number","minimum":0.0},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Cost Price"},"cost_overhead":{"anyOf":[{"type":"number","minimum":0.0},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Cost Overhead"},"sales_price":{"anyOf":[{"type":"number","minimum":0.0},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Sales Price"}},"type":"object","title":"AgreementUpdate"},"ApiKeyCreate":{"properties":{"name":{"type":"string","maxLength":100,"minLength":1,"title":"Name","description":"Friendly name for this key"},"kind":{"type":"string","enum":["integration","personal"],"title":"Kind","description":"'integration' (default): company-wide, scope-only key — current behavior, unchanged. Scopes are caller-chosen (see `scopes`). 'personal': the key acts AS a specific person — every request is scoped to that person's own backoffice visibility (Phase 6b reads) and write rights (Phase 6d), identical to what they'd see/do logged into the backoffice. Personal-key scopes are NOT caller-supplied: they are always fixed to read+write (never admin, never `financials`) — omit `scopes` entirely when `kind='personal'`, a 400 is returned if it is set. Because `financials` is never granted, personal keys always get 403 FINANCIAL_SCOPE_REQUIRED on money resources (invoices, contracts, agreements, taxes, budgets, reclaims, flextime, monitors) even though they carry `write` — that is the intended v1 boundary, not a bug: a personal key's financial exposure is nil regardless of the acting person's own backoffice rights. Only an admin-scoped key may create or manage any key (including personal ones); a personal key can never call any /auth/keys endpoint, including to manage its own siblings.","default":"integration"},"person_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Person Id","description":"Only used when kind='personal': the person this key acts as. Defaults to the calling key's own person_id (self-issuance). Must be an ACTIVE member of this company, or 400 INVALID_PERSON. Ignored for kind='integration'."},"scopes":{"items":{"type":"string"},"type":"array","title":"Scopes","description":"Grantable scopes: read, write, admin. Only meaningful for kind='integration' — see `kind`.","default":["read"]},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At","description":"Optional expiry date (ISO 8601)"},"ip_allowlist":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Ip Allowlist","description":"Optional list of allowed IP addresses"}},"type":"object","required":["name"],"title":"ApiKeyCreate"},"ApiKeyCreated":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"},"key_prefix":{"type":"string","title":"Key Prefix"},"full_key":{"type":"string","title":"Full Key","description":"SAVE THIS. The full key is shown only once."},"kind":{"type":"string","title":"Kind"},"person_id":{"type":"integer","title":"Person Id","description":"For kind='personal': the person this key acts as. For kind='integration': the issuing person (provenance only, not a scoping identity)."},"scopes":{"items":{"type":"string"},"type":"array","title":"Scopes"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"}},"type":"object","required":["id","name","key_prefix","full_key","kind","person_id","scopes"],"title":"ApiKeyCreated","description":"Returned only once on creation — includes the full key."},"ApiKeyOut":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"},"key_prefix":{"type":"string","title":"Key Prefix"},"auth_type":{"type":"string","title":"Auth Type"},"kind":{"type":"string","title":"Kind","description":"'integration': company-wide, scope-only key (Zapier/Make/custom scripts). 'personal': acts AS one specific person, with exactly that person's own backoffice visibility/rights — built for AI-assistant/MCP use (Claude Desktop, Claude Code)."},"scopes":{"items":{"type":"string"},"type":"array","title":"Scopes"},"is_active":{"type":"boolean","title":"Is Active"},"last_used_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Used At"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"},"ip_allowlist":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Ip Allowlist"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"}},"type":"object","required":["id","name","key_prefix","auth_type","kind","scopes","is_active"],"title":"ApiKeyOut","description":"API key output — never exposes full key or hash."},"ApiKeyRotated":{"properties":{"new_key":{"$ref":"#/components/schemas/ApiKeyCreated"},"old_key_id":{"type":"integer","title":"Old Key Id"},"old_key_grace_expires_at":{"type":"string","format":"date-time","title":"Old Key Grace Expires At","description":"Old key works until this time."}},"type":"object","required":["new_key","old_key_id","old_key_grace_expires_at"],"title":"ApiKeyRotated","description":"Returned on key rotation — new key + grace period info."},"ApiWarning":{"properties":{"code":{"type":"string","title":"Code"},"message":{"type":"string","title":"Message"}},"type":"object","required":["code","message"],"title":"ApiWarning"},"AttachmentOut":{"properties":{"id":{"type":"integer","title":"Id"},"related_type":{"type":"string","enum":["task","note"],"title":"Related Type"},"related_id":{"type":"integer","title":"Related Id"},"file_name":{"type":"string","title":"File Name"},"size":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Size"},"document_type":{"type":"string","title":"Document Type"},"author_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Author Id"},"has_cloud_backup":{"type":"boolean","title":"Has Cloud Backup"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"}},"type":"object","required":["id","related_type","related_id","file_name","document_type","has_cloud_backup"],"title":"AttachmentOut"},"Body_attachments_upload_note_attachment":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"}},"type":"object","required":["file"],"title":"Body_attachments_upload_note_attachment"},"Body_attachments_upload_task_attachment":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"}},"type":"object","required":["file"],"title":"Body_attachments_upload_task_attachment"},"BudgetCreate":{"properties":{"client_id":{"anyOf":[{"type":"integer","exclusiveMinimum":0.0},{"type":"null"}],"title":"Client Id"},"name":{"type":"string","maxLength":255,"minLength":1,"title":"Name"},"budget_net_sum":{"anyOf":[{"type":"number","minimum":0.0},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"}],"title":"Budget Net Sum"},"warning_rate":{"anyOf":[{"type":"number","maximum":100.0,"minimum":0.0},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Warning Rate"},"type":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Type"},"status":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Status","default":"active"},"date_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Date From"},"date_until":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Date Until"},"recurrence":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Recurrence"},"send_notification":{"type":"boolean","title":"Send Notification","default":false}},"type":"object","required":["name","budget_net_sum"],"title":"BudgetCreate"},"BudgetOut":{"properties":{"id":{"type":"integer","title":"Id"},"client_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Client Id"},"name":{"type":"string","title":"Name"},"status":{"type":"string","title":"Status"},"type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type"},"budget_net_sum":{"type":"number","title":"Budget Net Sum"},"net_sum":{"type":"number","title":"Net Sum"},"warning_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Warning Rate"},"date_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Date From"},"date_until":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Date Until"},"recurrence":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Recurrence"},"send_notification":{"type":"boolean","title":"Send Notification","default":false},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"}},"type":"object","required":["id","name","status","budget_net_sum","net_sum"],"title":"BudgetOut"},"BudgetUpdate":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":255,"minLength":1},{"type":"null"}],"title":"Name"},"budget_net_sum":{"anyOf":[{"type":"number","minimum":0.0},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Budget Net Sum"},"warning_rate":{"anyOf":[{"type":"number","maximum":100.0,"minimum":0.0},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Warning Rate"},"status":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Status"},"date_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Date From"},"date_until":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Date Until"},"send_notification":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Send Notification"}},"type":"object","title":"BudgetUpdate"},"CalendarCreate":{"properties":{"type":{"type":"string","enum":["vacation","flextime","sick_leave","time_off"],"title":"Type","description":"For 'vacation'/'flextime' (credit-affecting types), see `status` — an approved entry can't be created via this API."},"person_id":{"type":"integer","exclusiveMinimum":0.0,"title":"Person Id"},"date_from":{"type":"string","format":"date-time","title":"Date From"},"date_until":{"type":"string","format":"date-time","title":"Date Until"},"duration":{"type":"integer","minimum":0.0,"title":"Duration","description":"0 = full day, else seconds","default":0},"timezone":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Timezone"},"status":{"anyOf":[{"type":"string","enum":["approved","in_review","declined"]},{"type":"null"}],"title":"Status","description":"For credit-affecting types ('vacation'/'flextime'), 'approved' is rejected (409 CALENDAR_APPROVAL_UI_ONLY) — approving a vacation/flextime entry debits account_member credit based on a working-day duration computed in the Uku UI, which this API does not (and must not) recompute. Non-credit types are unaffected."},"comment":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Comment"}},"type":"object","required":["type","person_id","date_from","date_until"],"title":"CalendarCreate"},"CalendarOut":{"properties":{"id":{"type":"integer","title":"Id"},"type":{"type":"string","title":"Type"},"is_global":{"type":"boolean","title":"Is Global","description":"True for shared holidays (no company owner), False for own-company entries"},"person_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Person Id"},"approver_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Approver Id"},"date_from":{"type":"string","format":"date-time","title":"Date From"},"date_until":{"type":"string","format":"date-time","title":"Date Until"},"duration":{"type":"integer","title":"Duration"},"timezone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Timezone"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"comment":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Comment"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"country_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country Code"},"link":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Link"},"reduce_working_hours":{"type":"boolean","title":"Reduce Working Hours"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"}},"type":"object","required":["id","type","is_global","date_from","date_until","duration","reduce_working_hours"],"title":"CalendarOut"},"CalendarUpdate":{"properties":{"type":{"anyOf":[{"type":"string","enum":["vacation","flextime","sick_leave","time_off"]},{"type":"null"}],"title":"Type","description":"Changing the type of an already-'approved' credit-affecting entry ('vacation'/'flextime') — either as the current or the requested type — is rejected (409 CALENDAR_APPROVAL_UI_ONLY): it would strand or mint credit outside the backoffice approval flow."},"date_from":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Date From"},"date_until":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Date Until"},"duration":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Duration"},"timezone":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Timezone"},"status":{"anyOf":[{"type":"string","enum":["approved","in_review","declined"]},{"type":"null"}],"title":"Status","description":"For credit-affecting types ('vacation'/'flextime'), transitioning to OR away from 'approved' is rejected (409 CALENDAR_APPROVAL_UI_ONLY) — approval/un-approval is a backoffice-only action where the real working-day duration is computed. Non-credit types are unaffected."},"comment":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Comment"}},"type":"object","title":"CalendarUpdate"},"ClientCreate":{"properties":{"name":{"type":"string","maxLength":255,"minLength":1,"title":"Name"},"status":{"type":"string","title":"Status","default":"active"},"locale_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Locale Code"},"reg_code":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Reg Code"},"vat_code":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Vat Code"},"address_street":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Address Street"},"address_city":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Address City"},"address_state":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Address State"},"address_zip":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"title":"Address Zip"},"address_country_code":{"anyOf":[{"type":"string","maxLength":5},{"type":"null"}],"title":"Address Country Code"},"default_person_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Default Person Id","description":"ID of the Client Manager (responsible member) for this client"},"ext_client_id":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Ext Client Id"},"client_initials":{"anyOf":[{"type":"string","maxLength":5},{"type":"null"}],"title":"Client Initials"},"parent_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Parent Id"},"timing_required":{"type":"integer","title":"Timing Required","default":0},"topic_required":{"type":"integer","title":"Topic Required","default":0},"custom_fields":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Custom Fields"},"groups":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"Groups","description":"List of client_group IDs the client belongs to. Groups must exist (create via POST /client-groups first)."}},"type":"object","required":["name"],"title":"ClientCreate","description":"Input schema for creating a client.\n\nAccepts both `fields` and `custom_fields` on input."},"ClientGroupCreate":{"properties":{"name":{"type":"string","maxLength":255,"minLength":1,"title":"Name"},"status":{"type":"string","enum":["active","inactive"],"title":"Status","default":"active"},"color":{"anyOf":[{"type":"string","maxLength":10},{"type":"null"}],"title":"Color"}},"type":"object","required":["name"],"title":"ClientGroupCreate"},"ClientGroupOut":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"},"color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Color"},"status":{"type":"string","title":"Status"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"}},"type":"object","required":["id","name","status"],"title":"ClientGroupOut","description":"Curated client group output."},"ClientGroupUpdate":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":255,"minLength":1},{"type":"null"}],"title":"Name"},"status":{"anyOf":[{"type":"string","enum":["active","inactive"]},{"type":"null"}],"title":"Status"},"color":{"anyOf":[{"type":"string","maxLength":10},{"type":"null"}],"title":"Color"}},"type":"object","title":"ClientGroupUpdate"},"ClientMemberCreate":{"properties":{"client_id":{"type":"integer","exclusiveMinimum":0.0,"title":"Client Id"},"person_id":{"type":"integer","exclusiveMinimum":0.0,"title":"Person Id"},"role":{"type":"string","maxLength":50,"title":"Role","default":"user"},"is_portal_user":{"type":"boolean","title":"Is Portal User","default":false}},"type":"object","required":["client_id","person_id"],"title":"ClientMemberCreate"},"ClientMemberOut":{"properties":{"id":{"type":"integer","title":"Id"},"client_id":{"type":"integer","title":"Client Id"},"person_id":{"type":"integer","title":"Person Id"},"role":{"type":"string","title":"Role"},"is_portal_user":{"type":"boolean","title":"Is Portal User"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"}},"type":"object","required":["id","client_id","person_id","role","is_portal_user"],"title":"ClientMemberOut"},"ClientMemberUpdate":{"properties":{"role":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Role"},"is_portal_user":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Portal User"}},"type":"object","title":"ClientMemberUpdate"},"ClientMonitorCreate":{"properties":{"client_id":{"type":"integer","exclusiveMinimum":0.0,"title":"Client Id"},"type":{"type":"string","maxLength":100,"minLength":1,"title":"Type"},"role_person_id":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Role Person Id","description":"0 if role-agnostic","default":0},"value":{"anyOf":[{"type":"number","minimum":0.0},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"}],"title":"Value"},"range_value":{"anyOf":[{"type":"number","minimum":0.0},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"}],"title":"Range Value","default":"0"},"frequency":{"type":"string","enum":["monthly","quarterly","yearly"],"title":"Frequency","default":"monthly"},"valid_from":{"type":"string","format":"date","title":"Valid From"},"valid_until":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Valid Until"}},"type":"object","required":["client_id","type","value","valid_from"],"title":"ClientMonitorCreate"},"ClientMonitorOut":{"properties":{"id":{"type":"integer","title":"Id"},"client_id":{"type":"integer","title":"Client Id"},"type":{"type":"string","title":"Type"},"role_person_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Role Person Id"},"value":{"type":"number","title":"Value"},"range_value":{"type":"number","title":"Range Value"},"frequency":{"type":"string","enum":["monthly","quarterly","yearly"],"title":"Frequency"},"valid_from":{"type":"string","format":"date","title":"Valid From"},"valid_until":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Valid Until"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"}},"type":"object","required":["id","client_id","type","value","range_value","frequency","valid_from"],"title":"ClientMonitorOut"},"ClientMonitorUpdate":{"properties":{"type":{"anyOf":[{"type":"string","maxLength":100,"minLength":1},{"type":"null"}],"title":"Type"},"role_person_id":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Role Person Id"},"value":{"anyOf":[{"type":"number","minimum":0.0},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Value"},"range_value":{"anyOf":[{"type":"number","minimum":0.0},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Range Value"},"frequency":{"anyOf":[{"type":"string","enum":["monthly","quarterly","yearly"]},{"type":"null"}],"title":"Frequency"},"valid_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Valid From"},"valid_until":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Valid Until"}},"type":"object","title":"ClientMonitorUpdate"},"ClientOut":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"},"status":{"type":"string","title":"Status"},"type":{"type":"string","title":"Type","default":"client"},"locale_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Locale Code"},"reg_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reg Code"},"vat_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vat Code"},"address_street":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address Street"},"address_city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address City"},"address_state":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address State"},"address_zip":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address Zip"},"address_country_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address Country Code"},"default_person_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Default Person Id","description":"ID of the Client Manager (responsible member) for this client"},"ext_client_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ext Client Id"},"client_initials":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Initials"},"parent_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Parent Id"},"has_monitor":{"type":"integer","title":"Has Monitor","default":0},"timing_required":{"type":"integer","title":"Timing Required","default":0},"topic_required":{"type":"integer","title":"Topic Required","default":0},"custom_fields":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Custom Fields"},"groups":{"items":{"type":"integer"},"type":"array","title":"Groups"},"contacts":{"items":{"$ref":"#/components/schemas/ContactOut"},"type":"array","title":"Contacts"},"contacts_truncated":{"type":"boolean","title":"Contacts Truncated","default":false},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"}},"type":"object","required":["id","name","status"],"title":"ClientOut","examples":[{"address_city":"Tallinn","address_country_code":"ee","client_initials":"AC","contacts":[{"client_id":1234,"email":"mari@acme.ee","id":77,"is_primary":1,"job_title":"CFO","mobile_phone":"+3725551234","name":"Mari","surname":"Tamm"}],"contacts_truncated":false,"custom_fields":{"priority":"gold"},"default_person_id":42,"ext_client_id":"CRM-9012","groups":[3,5],"has_monitor":0,"id":1234,"locale_code":"et","name":"Acme Consulting OÜ","reg_code":"12345678","status":"active","timing_required":1,"topic_required":0,"type":"client","vat_code":"EE123456789"}]},"ClientUpdate":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":255,"minLength":1},{"type":"null"}],"title":"Name"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"locale_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Locale Code"},"reg_code":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Reg Code"},"vat_code":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Vat Code"},"address_street":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Address Street"},"address_city":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Address City"},"address_state":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Address State"},"address_zip":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"title":"Address Zip"},"address_country_code":{"anyOf":[{"type":"string","maxLength":5},{"type":"null"}],"title":"Address Country Code"},"default_person_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Default Person Id","description":"ID of the Client Manager (responsible member) for this client"},"ext_client_id":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Ext Client Id"},"client_initials":{"anyOf":[{"type":"string","maxLength":5},{"type":"null"}],"title":"Client Initials"},"parent_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Parent Id"},"timing_required":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Timing Required"},"topic_required":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Topic Required"},"custom_fields":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Custom Fields"},"groups":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"Groups","description":"Replaces the client's group membership. Pass an empty list to remove all groups."}},"type":"object","title":"ClientUpdate","description":"Input schema for updating a client. All fields optional (PATCH semantics)."},"ContactCreate":{"properties":{"client_id":{"type":"integer","title":"Client Id","description":"Client this contact belongs to"},"name":{"type":"string","maxLength":100,"minLength":1,"title":"Name"},"surname":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Surname"},"email":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Email"},"job_title":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Job Title"},"mobile_phone":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Mobile Phone"},"work_phone":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Work Phone"},"locale_code":{"anyOf":[{"type":"string","maxLength":5},{"type":"null"}],"title":"Locale Code"},"is_primary":{"type":"integer","title":"Is Primary","default":0},"birthday":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Birthday"},"ext_contact_id":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Ext Contact Id"},"custom_fields":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Custom Fields"}},"type":"object","required":["client_id","name"],"title":"ContactCreate"},"ContactOut":{"properties":{"id":{"type":"integer","title":"Id"},"client_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Client Id"},"person_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Person Id"},"is_primary":{"type":"integer","title":"Is Primary","default":0},"name":{"type":"string","title":"Name"},"surname":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Surname"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"job_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Job Title"},"mobile_phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mobile Phone"},"work_phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Work Phone"},"locale_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Locale Code"},"birthday":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Birthday"},"ext_contact_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ext Contact Id"},"custom_fields":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Custom Fields"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"}},"type":"object","required":["id","name"],"title":"ContactOut"},"ContactUpdate":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":100,"minLength":1},{"type":"null"}],"title":"Name"},"surname":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Surname"},"email":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Email"},"job_title":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Job Title"},"mobile_phone":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Mobile Phone"},"work_phone":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Work Phone"},"locale_code":{"anyOf":[{"type":"string","maxLength":5},{"type":"null"}],"title":"Locale Code"},"is_primary":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Is Primary"},"birthday":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Birthday"},"ext_contact_id":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Ext Contact Id"},"custom_fields":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Custom Fields"}},"type":"object","title":"ContactUpdate"},"ContentTemplateCreate":{"properties":{"type":{"type":"string","maxLength":128,"minLength":1,"title":"Type"},"channel":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Channel"},"template_name":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Template Name"},"rows":{"items":{"$ref":"#/components/schemas/ContentTemplateRowInput"},"type":"array","title":"Rows"}},"type":"object","required":["type"],"title":"ContentTemplateCreate"},"ContentTemplateOut":{"properties":{"id":{"type":"integer","title":"Id"},"type":{"type":"string","title":"Type"},"channel":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Channel"},"template_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Template Name"},"is_public":{"type":"boolean","title":"Is Public"},"rows":{"items":{"$ref":"#/components/schemas/ContentTemplateRowOut"},"type":"array","title":"Rows"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"}},"type":"object","required":["id","type","is_public"],"title":"ContentTemplateOut"},"ContentTemplateRowInput":{"properties":{"locale_code":{"type":"string","maxLength":5,"minLength":2,"title":"Locale Code"},"subject":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Subject"},"content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content"}},"type":"object","required":["locale_code"],"title":"ContentTemplateRowInput"},"ContentTemplateRowOut":{"properties":{"id":{"type":"integer","title":"Id"},"template_id":{"type":"integer","title":"Template Id"},"locale_code":{"type":"string","title":"Locale Code"},"subject":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subject"},"content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content"}},"type":"object","required":["id","template_id","locale_code"],"title":"ContentTemplateRowOut"},"ContentTemplateRowUpdate":{"properties":{"subject":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Subject"},"content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content"}},"type":"object","title":"ContentTemplateRowUpdate"},"ContentTemplateUpdate":{"properties":{"type":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"Type"},"channel":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Channel"},"template_name":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Template Name"}},"type":"object","title":"ContentTemplateUpdate"},"ContractCreate":{"properties":{"client_id":{"anyOf":[{"type":"integer","exclusiveMinimum":0.0},{"type":"null"}],"title":"Client Id"},"name":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Name"},"type":{"type":"string","enum":["contract","template"],"title":"Type","default":"contract"},"status":{"type":"string","enum":["pending","active","finished"],"title":"Status","description":"IGNORED: status is derived from date_from/date_until at creation time.","default":"pending","deprecated":true},"date_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Date From"},"date_until":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Date Until"},"invoice_period":{"type":"string","enum":["monthly","quarterly","yearly"],"title":"Invoice Period","default":"monthly"},"invoice_day":{"anyOf":[{"type":"integer","maximum":31.0,"minimum":-1.0},{"type":"null"}],"title":"Invoice Day","default":-1},"template_name":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Template Name"},"parent_id":{"anyOf":[{"type":"integer","exclusiveMinimum":0.0},{"type":"null"}],"title":"Parent Id","description":"Parent template contract ID"}},"type":"object","title":"ContractCreate","description":"POST /contracts body. Status is derived from date_from/date_until.\n\nRequires `admin`. Rows are added separately via `/contracts/{id}/rows`."},"ContractOut":{"properties":{"id":{"type":"integer","title":"Id"},"client_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Client Id"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"status":{"type":"string","title":"Status"},"type":{"type":"string","title":"Type"},"date_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Date From"},"date_until":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Date Until"},"invoice_period":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Invoice Period"},"invoice_day":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Invoice Day"},"template_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Template Name"},"parent_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Parent Id"},"settings":{"anyOf":[{"$ref":"#/components/schemas/ContractSettingsOut"},{"type":"null"}]},"rows":{"items":{"$ref":"#/components/schemas/ContractRowOut"},"type":"array","title":"Rows"},"rows_truncated":{"type":"boolean","title":"Rows Truncated","default":false},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"}},"type":"object","required":["id","status","type"],"title":"ContractOut","description":"Curated contract output. Only actual contracts, not templates."},"ContractRowCreate":{"properties":{"description":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Description"},"discount_rate":{"anyOf":[{"type":"number","maximum":100.0,"minimum":0.0},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Discount Rate"},"product_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Product Id"},"unit":{"anyOf":[{"type":"string","maxLength":32},{"type":"null"}],"title":"Unit"},"invoice_time_min":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Invoice Time Min"},"invoice_quantity_min":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Invoice Quantity Min"},"tax_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Tax Id"},"article_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Article Id"},"resource_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Resource Id"},"billing_project_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Billing Project Id"},"ext_variable":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"Ext Variable"}},"type":"object","title":"ContractRowCreate","description":"POST /contracts/{id}/rows body."},"ContractRowOut":{"properties":{"id":{"type":"integer","title":"Id"},"contract_id":{"type":"integer","title":"Contract Id"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"discount_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Discount Rate"},"product_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Product Id"},"quantity":{"anyOf":[{"type":"integer"},{"type":"number"},{"type":"null"}],"title":"Quantity"},"unit":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Unit"},"invoice_time_min":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Invoice Time Min"},"net_price":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Net Price"},"tax_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Tax Id"},"article_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Article Id"},"resource_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Resource Id"},"billing_project_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Billing Project Id"},"ext_variable":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ext Variable"}},"type":"object","required":["id","contract_id"],"title":"ContractRowOut","description":"A single row on a contract."},"ContractRowUpdate":{"properties":{"description":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Description"},"discount_rate":{"anyOf":[{"type":"number","maximum":100.0,"minimum":0.0},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Discount Rate"},"product_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Product Id"},"unit":{"anyOf":[{"type":"string","maxLength":32},{"type":"null"}],"title":"Unit"},"invoice_time_min":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Invoice Time Min"},"invoice_quantity_min":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Invoice Quantity Min"},"tax_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Tax Id"},"article_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Article Id"},"resource_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Resource Id"},"billing_project_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Billing Project Id"},"ext_variable":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"Ext Variable"}},"type":"object","title":"ContractRowUpdate","description":"PATCH /contracts/{id}/rows/{row_id} body. All fields optional."},"ContractSettingsOut":{"properties":{"ext_user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ext User Id"},"currency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Currency"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"invoice_due_date_period":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Invoice Due Date Period"},"invoice_number_format":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Invoice Number Format"},"invoice_recipients":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Invoice Recipients"},"invoice_time_rounding":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Invoice Time Rounding"},"is_description":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Is Description"},"is_reverse_charge":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Is Reverse Charge"},"is_summarized":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Is Summarized"},"locale_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Locale Code"},"reference_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reference Number"},"reply_to":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reply To"},"summarized_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summarized Description"}},"type":"object","title":"ContractSettingsOut","description":"Contract billing settings."},"ContractUpdate":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Name"},"date_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Date From"},"date_until":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Date Until"},"invoice_period":{"anyOf":[{"type":"string","maxLength":32},{"type":"null"}],"title":"Invoice Period"},"invoice_day":{"anyOf":[{"type":"integer","maximum":31.0,"minimum":-1.0},{"type":"null"}],"title":"Invoice Day"},"status":{"anyOf":[{"type":"string","enum":["pending","active","finished"]},{"type":"null"}],"title":"Status","description":"IGNORED: status is derived from date_from/date_until (pending before, active within, finished after). Edit the dates instead — they require the `financials` scope, since they drive the derived status.","deprecated":true}},"type":"object","title":"ContractUpdate","description":"PATCH /contracts/{id} body.\n\nStructural fields (name) require `write`. Money fields (invoice_period,\ninvoice_day, date_from, date_until) require `financials` — the dates drive\nthe DERIVED status (pending/active/finished), so date edits are money edits."},"CustomFieldChoice":{"properties":{"code":{"type":"string","title":"Code"},"label":{"type":"string","title":"Label"}},"type":"object","required":["code","label"],"title":"CustomFieldChoice"},"CustomFieldCreate":{"properties":{"entity_type":{"type":"string","enum":["client","task","project","supplier","account_member","contact"],"title":"Entity Type"},"name":{"type":"string","maxLength":100,"minLength":1,"title":"Name","description":"Stable data slug — NEVER changes once created"},"title":{"type":"string","maxLength":100,"minLength":1,"title":"Title","description":"Display label"},"field_type":{"type":"string","enum":["text","number","date","select","multi_select","boolean"],"title":"Field Type"},"group_name":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Group Name"},"options":{"anyOf":[{"items":{"$ref":"#/components/schemas/CustomFieldChoice"},"type":"array"},{"type":"null"}],"title":"Options"},"is_required":{"type":"boolean","title":"Is Required","default":false},"is_visible":{"type":"boolean","title":"Is Visible","default":true},"is_listed":{"type":"boolean","title":"Is Listed","default":false},"is_sortable":{"type":"boolean","title":"Is Sortable","default":false},"is_importable":{"type":"boolean","title":"Is Importable","default":false},"sort_order":{"type":"integer","minimum":0.0,"title":"Sort Order","default":99999}},"type":"object","required":["entity_type","name","title","field_type"],"title":"CustomFieldCreate"},"CustomFieldOut":{"properties":{"id":{"type":"integer","title":"Id"},"entity_type":{"type":"string","enum":["client","task","project","supplier","account_member","contact"],"title":"Entity Type"},"name":{"type":"string","title":"Name"},"title":{"type":"string","title":"Title"},"field_type":{"type":"string","title":"Field Type"},"group_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Group Name"},"options":{"anyOf":[{"items":{"$ref":"#/components/schemas/CustomFieldChoice"},"type":"array"},{"type":"null"}],"title":"Options"},"is_required":{"type":"boolean","title":"Is Required"},"is_visible":{"type":"boolean","title":"Is Visible"},"is_listed":{"type":"boolean","title":"Is Listed"},"is_sortable":{"type":"boolean","title":"Is Sortable"},"is_importable":{"type":"boolean","title":"Is Importable"},"sort_order":{"type":"integer","title":"Sort Order"},"status":{"type":"string","title":"Status"},"is_system":{"type":"boolean","title":"Is System"},"is_editable":{"type":"boolean","title":"Is Editable"},"is_deletable":{"type":"boolean","title":"Is Deletable"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"}},"type":"object","required":["id","entity_type","name","title","field_type","is_required","is_visible","is_listed","is_sortable","is_importable","sort_order","status","is_system","is_editable","is_deletable"],"title":"CustomFieldOut"},"CustomFieldUpdate":{"properties":{"title":{"anyOf":[{"type":"string","maxLength":100,"minLength":1},{"type":"null"}],"title":"Title"},"group_name":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Group Name"},"options":{"anyOf":[{"items":{"$ref":"#/components/schemas/CustomFieldChoice"},"type":"array"},{"type":"null"}],"title":"Options"},"is_required":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Required"},"is_visible":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Visible"},"is_listed":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Listed"},"is_sortable":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Sortable"},"is_importable":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Importable"},"sort_order":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Sort Order"},"status":{"anyOf":[{"type":"string","enum":["active","inactive"]},{"type":"null"}],"title":"Status"}},"additionalProperties":false,"type":"object","title":"CustomFieldUpdate","description":"PATCH body — `name`, `field_type`, `entity_type` are NOT editable.\n\n`extra=\"forbid\"` so sending an immutable field is a 400 VALIDATION_ERROR naming it,\nrather than a 200 that silently discards it (decision 16 calls them immutable; an\nimmutable field should be *rejected*, not quietly ignored)."},"DelegationCreate":{"properties":{"calendar_id":{"type":"integer","exclusiveMinimum":0.0,"title":"Calendar Id"},"person_id":{"type":"integer","exclusiveMinimum":0.0,"title":"Person Id"},"delegate_person_id":{"type":"integer","exclusiveMinimum":0.0,"title":"Delegate Person Id"}},"type":"object","required":["calendar_id","person_id","delegate_person_id"],"title":"DelegationCreate"},"DelegationOut":{"properties":{"id":{"type":"integer","title":"Id"},"calendar_id":{"type":"integer","title":"Calendar Id"},"person_id":{"type":"integer","title":"Person Id"},"delegate_person_id":{"type":"integer","title":"Delegate Person Id"},"status":{"type":"string","title":"Status"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"}},"type":"object","required":["id","calendar_id","person_id","delegate_person_id","status"],"title":"DelegationOut"},"DelegationUpdate":{"properties":{"status":{"anyOf":[{"type":"string","enum":["pending","active","completed","cancelled"]},{"type":"null"}],"title":"Status"},"delegate_person_id":{"anyOf":[{"type":"integer","exclusiveMinimum":0.0},{"type":"null"}],"title":"Delegate Person Id"}},"type":"object","title":"DelegationUpdate"},"DocumentsFolderOut":{"properties":{"folder_id":{"type":"string","title":"Folder Id"},"folder_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Folder Url"},"path":{"type":"string","title":"Path"},"skipped":{"type":"boolean","title":"Skipped","default":false}},"type":"object","required":["folder_id","path"],"title":"DocumentsFolderOut","examples":[{"folder_id":"1a2B3c4D5e6F7g8H9","folder_url":"https://drive.google.com/drive/folders/1a2B3c4D5e6F7g8H9","path":"Clients/Acme Consulting OÜ","skipped":false}]},"ErrorBody":{"properties":{"code":{"type":"string","title":"Code"},"message":{"type":"string","title":"Message"},"details":{"anyOf":[{"items":{"$ref":"#/components/schemas/ErrorDetail"},"type":"array"},{"type":"null"}],"title":"Details"}},"type":"object","required":["code","message"],"title":"ErrorBody"},"ErrorDetail":{"properties":{"field":{"type":"string","title":"Field"},"message":{"type":"string","title":"Message"}},"type":"object","required":["field","message"],"title":"ErrorDetail"},"ErrorResponse":{"properties":{"error":{"$ref":"#/components/schemas/ErrorBody"}},"type":"object","required":["error"],"title":"ErrorResponse"},"FlextimeCreate":{"properties":{"person_id":{"type":"integer","exclusiveMinimum":0.0,"title":"Person Id"},"type":{"type":"string","maxLength":50,"title":"Type"},"duration":{"type":"integer","title":"Duration"},"date_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Date From"},"date_until":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Date Until"},"week":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Week"},"month":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Month"},"comment":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Comment"}},"type":"object","required":["person_id","type","duration"],"title":"FlextimeCreate"},"FlextimeOut":{"properties":{"id":{"type":"integer","title":"Id"},"person_id":{"type":"integer","title":"Person Id"},"date_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Date From"},"date_until":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Date Until"},"type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type"},"duration":{"type":"integer","title":"Duration"},"week":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Week"},"month":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Month"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"comment":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Comment"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"}},"type":"object","required":["id","person_id","duration"],"title":"FlextimeOut"},"FlextimeUpdate":{"properties":{"duration":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Duration"},"status":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Status"},"comment":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Comment"}},"type":"object","title":"FlextimeUpdate"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"InvoiceCreate":{"properties":{"client_id":{"type":"integer","exclusiveMinimum":0.0,"title":"Client Id"},"seller_id":{"anyOf":[{"type":"integer","exclusiveMinimum":0.0},{"type":"null"}],"title":"Seller Id","description":"Copy seller fields from this InvoiceSeller profile"},"invoice_number":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Invoice Number"},"invoice_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Invoice Date"},"due_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Due Date"},"currency":{"anyOf":[{"type":"string","maxLength":3},{"type":"null"}],"title":"Currency"},"reference_number":{"anyOf":[{"type":"string","maxLength":32},{"type":"null"}],"title":"Reference Number"},"comments":{"anyOf":[{"type":"string","maxLength":10000},{"type":"null"}],"title":"Comments","description":"Free-text invoice notes"},"locale_code":{"anyOf":[{"type":"string","maxLength":10},{"type":"null"}],"title":"Locale Code"}},"type":"object","required":["client_id"],"title":"InvoiceCreate","description":"POST /invoices — create a draft (pending) sales invoice.\n\nAlways creates a standalone sales invoice. Contract-linked invoices cannot\nbe created via API — those are generated by the billing engine.\n\nThe invoice is created without rows (sums = 0). Add rows via\n`POST /invoices/{id}/rows`; the invoice recalculates automatically.\n\nRequires `admin` (invoices are financial). Client and seller details are\ndenormalized onto the invoice at creation time. Pass `seller_id` to copy\nfrom an InvoiceSeller profile; otherwise seller fields default to empty\nstrings. Client fields are always copied from the client referenced by\n`client_id`."},"InvoiceOut":{"properties":{"id":{"type":"integer","title":"Id"},"client_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Client Id"},"contract_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Contract Id"},"status":{"type":"string","title":"Status"},"invoice_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Invoice Number"},"invoice_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Invoice Date"},"due_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Due Date"},"net_sum":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Net Sum"},"tax_sum":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Tax Sum"},"total_sum":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Total Sum"},"paid_sum":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Paid Sum"},"currency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Currency"},"client_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Name"},"client_reg_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Reg Code"},"client_vat_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Vat Code"},"client_contact":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Contact"},"seller_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Seller Name"},"seller_reg_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Seller Reg Code"},"seller_vat_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Seller Vat Code"},"seller_address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Seller Address"},"seller_contact":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Seller Contact"},"locale_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Locale Code"},"comments":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Comments"},"reference_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reference Number"},"period_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Period Label"},"exported_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Exported At"},"sent_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Sent At"},"paid_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Paid At"},"rows":{"items":{"$ref":"#/components/schemas/InvoiceRowOut"},"type":"array","title":"Rows"},"rows_truncated":{"type":"boolean","title":"Rows Truncated","default":false},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"}},"type":"object","required":["id","status"],"title":"InvoiceOut","examples":[{"client_id":1234,"client_name":"Acme Consulting OÜ","client_reg_code":"12345678","client_vat_code":"EE123456789","contract_id":88,"currency":"EUR","due_date":"2026-04-24","id":55501,"invoice_date":"2026-04-10","invoice_number":"2026-0421","net_sum":1250.0,"paid_sum":0.0,"period_label":"2026-04","reference_number":"2026042100012","rows":[{"description":"Accounting services — April","invoice_id":55501,"net_price":125.0,"net_sum":1250.0,"quantity":10.0,"tax_id":1,"tax_name":"KM 22%","tax_rate":22.0,"tax_sum":275.0,"unit":"h"}],"rows_truncated":false,"seller_name":"Uku OÜ","seller_reg_code":"99999999","status":"sent","tax_sum":275.0,"total_sum":1525.0}]},"InvoiceRowCreate":{"properties":{"description":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Description"},"quantity":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Quantity"},"unit":{"anyOf":[{"type":"string","maxLength":32},{"type":"null"}],"title":"Unit"},"net_price":{"anyOf":[{"type":"number","minimum":0.0},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Net Price"},"net_sum":{"anyOf":[{"type":"number","minimum":0.0},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Net Sum"},"discount_rate":{"anyOf":[{"type":"number","maximum":100.0,"minimum":0.0},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Discount Rate"},"person_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Person Id"},"completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Completed At"},"tax_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Tax Id"},"tax_rate":{"anyOf":[{"type":"number","maximum":100.0,"minimum":0.0},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Tax Rate"},"tax_name":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Tax Name"},"tax_sum":{"anyOf":[{"type":"number","minimum":0.0},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Tax Sum"},"product_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Product Id"},"article_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Article Id"},"resource_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Resource Id"},"billing_project_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Billing Project Id"},"ext_variable":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"Ext Variable"}},"type":"object","title":"InvoiceRowCreate","description":"POST /invoices/{id}/rows body."},"InvoiceRowOut":{"properties":{"id":{"type":"integer","title":"Id"},"invoice_id":{"type":"integer","title":"Invoice Id"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"quantity":{"anyOf":[{"type":"integer"},{"type":"number"},{"type":"null"}],"title":"Quantity"},"unit":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Unit"},"net_price":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Net Price"},"net_sum":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Net Sum"},"discount_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Discount Rate"},"person_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Person Id"},"completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Completed At"},"tax_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Tax Id"},"tax_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Tax Rate"},"tax_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tax Name"},"tax_sum":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Tax Sum"},"product_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Product Id"},"article_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Article Id"},"resource_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Resource Id"},"billing_project_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Billing Project Id"},"ext_variable":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ext Variable"},"original_client_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Original Client Id"}},"type":"object","required":["id","invoice_id"],"title":"InvoiceRowOut","description":"A single row on an invoice. Use `id` to PATCH/DELETE the row via\n`/invoices/{id}/rows/{row_id}`."},"InvoiceRowUpdate":{"properties":{"description":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Description"},"quantity":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Quantity"},"unit":{"anyOf":[{"type":"string","maxLength":32},{"type":"null"}],"title":"Unit"},"net_price":{"anyOf":[{"type":"number","minimum":0.0},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Net Price"},"net_sum":{"anyOf":[{"type":"number","minimum":0.0},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Net Sum"},"discount_rate":{"anyOf":[{"type":"number","maximum":100.0,"minimum":0.0},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Discount Rate"},"person_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Person Id"},"completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Completed At"},"tax_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Tax Id"},"tax_rate":{"anyOf":[{"type":"number","maximum":100.0,"minimum":0.0},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Tax Rate"},"tax_name":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Tax Name"},"tax_sum":{"anyOf":[{"type":"number","minimum":0.0},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Tax Sum"},"product_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Product Id"},"article_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Article Id"},"resource_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Resource Id"},"billing_project_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Billing Project Id"},"ext_variable":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"Ext Variable"}},"type":"object","title":"InvoiceRowUpdate","description":"PATCH /invoices/{id}/rows/{row_id} body. All fields optional."},"InvoiceSellerOut":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"},"status":{"type":"string","title":"Status"},"address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address"},"company_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Number"},"vat_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vat Number"},"bank_1":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bank 1"},"iban_1":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Iban 1"},"bank_2":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bank 2"},"iban_2":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Iban 2"},"logo_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Logo Url"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"}},"type":"object","required":["id","name","status"],"title":"InvoiceSellerOut","description":"Curated invoice seller output."},"InvoiceSellerUpdate":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":255,"minLength":1},{"type":"null"}],"title":"Name"},"status":{"anyOf":[{"type":"string","enum":["active","archived"]},{"type":"null"}],"title":"Status"},"address":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Address"},"company_number":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Company Number"},"vat_number":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Vat Number"},"bank_1":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Bank 1"},"iban_1":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Iban 1"},"bank_2":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Bank 2"},"iban_2":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Iban 2"},"logo_url":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Logo Url"}},"type":"object","title":"InvoiceSellerUpdate"},"InvoiceSendOut":{"properties":{"id":{"type":"integer","title":"Id"},"status":{"type":"string","title":"Status"},"send_queued":{"type":"boolean","title":"Send Queued","default":true}},"type":"object","required":["id","status"],"title":"InvoiceSendOut","description":"POST /invoices/{id}/send response body.\n\nSending is asynchronous — nothing is mailed/rendered by the time this response\nreturns. `status` reflects the invoice's status at the moment it was queued (not\nyet flipped to `sent`); poll `GET /invoices/{id}` to observe the transition once\nthe worker completes."},"InvoiceUpdate":{"properties":{"status":{"anyOf":[{"type":"string","enum":["pending","created","annulled"]},{"type":"null"}],"title":"Status"},"invoice_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Invoice Date"},"due_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Due Date"},"reference_number":{"anyOf":[{"type":"string","maxLength":32},{"type":"null"}],"title":"Reference Number"},"comments":{"anyOf":[{"type":"string","maxLength":10000},{"type":"null"}],"title":"Comments"},"locale_code":{"anyOf":[{"type":"string","maxLength":10},{"type":"null"}],"title":"Locale Code"}},"type":"object","title":"InvoiceUpdate","description":"PATCH /invoices/{id} — metadata only.\n\nFinancial sums (net_sum, tax_sum, total_sum) are derived from rows and\ncannot be patched directly. To change amounts, POST/PATCH/DELETE the\ninvoice rows — the invoice recalculates automatically.\n\nStructural fields (client_id, invoice_number, currency, rows) are not\neditable; create a new draft if they need to change."},"MemberOut":{"properties":{"id":{"type":"integer","title":"Id"},"person_id":{"type":"integer","title":"Person Id"},"name":{"type":"string","title":"Name"},"surname":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Surname"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone"},"role":{"type":"string","title":"Role"},"status":{"type":"string","title":"Status"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"initials":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Initials"},"locale_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Locale Code"},"region_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Region Code"},"birthday":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Birthday"},"timezone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Timezone"},"address_city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address City"},"address_country_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address Country Code"},"avatar":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Avatar"},"group_ids":{"items":{"type":"integer"},"type":"array","title":"Group Ids"},"ext_user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ext User Id"},"member_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Member Type"},"hr_lead_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Hr Lead Id"},"flextime_credit":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Flextime Credit","description":"Null unless the key has the `financials` scope."},"vacation_credit":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Vacation Credit","description":"Null unless the key has the `financials` scope."},"custom_fields":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Custom Fields"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"}},"type":"object","required":["id","person_id","name","role","status"],"title":"MemberOut"},"MemberUpdate":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":100,"minLength":1},{"type":"null"}],"title":"Name"},"surname":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Surname"},"role":{"anyOf":[{"type":"string","enum":["member","admin","owner"]},{"type":"null"}],"title":"Role"},"member_type":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Member Type"},"ext_user_id":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Ext User Id"},"hr_lead_id":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Hr Lead Id"},"locale_code":{"anyOf":[{"type":"string","maxLength":10},{"type":"null"}],"title":"Locale Code"},"status":{"anyOf":[{"type":"string","enum":["active","inactive"]},{"type":"null"}],"title":"Status"},"flextime_credit":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Flextime Credit"},"vacation_credit":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Vacation Credit"}},"additionalProperties":false,"type":"object","title":"MemberUpdate","description":"PATCH body. `extra=\"forbid\"` so an unsupported field (e.g. `title`) is a 400 naming\nit, rather than a 200 that silently discards the write."},"NoteCreate":{"properties":{"related_type":{"type":"string","enum":["client","project","supplier","account_member"],"title":"Related Type"},"related_id":{"type":"integer","exclusiveMinimum":0.0,"title":"Related Id"},"type":{"type":"string","enum":["info","document","email","billing"],"title":"Type","default":"info"},"is_pinned":{"type":"boolean","title":"Is Pinned","default":false},"comments":{"anyOf":[{"type":"string","maxLength":100000},{"type":"null"}],"title":"Comments"}},"type":"object","required":["related_type","related_id"],"title":"NoteCreate"},"NoteOut":{"properties":{"id":{"type":"integer","title":"Id"},"related_type":{"type":"string","enum":["client","project","supplier","account_member"],"title":"Related Type"},"related_id":{"type":"integer","title":"Related Id"},"type":{"type":"string","enum":["info","document","email","billing","info_cp"],"title":"Type"},"is_pinned":{"type":"boolean","title":"Is Pinned"},"comments":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Comments"},"author_id":{"type":"integer","title":"Author Id"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"}},"type":"object","required":["id","related_type","related_id","type","is_pinned","author_id"],"title":"NoteOut"},"NoteUpdate":{"properties":{"type":{"anyOf":[{"type":"string","enum":["info","document","email","billing"]},{"type":"null"}],"title":"Type"},"is_pinned":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Pinned"},"comments":{"anyOf":[{"type":"string","maxLength":100000},{"type":"null"}],"title":"Comments"}},"type":"object","title":"NoteUpdate"},"PaginatedResponse_AgreementOut_":{"properties":{"data":{"items":{"$ref":"#/components/schemas/AgreementOut"},"type":"array","title":"Data"},"meta":{"$ref":"#/components/schemas/PaginationMeta"},"warnings":{"anyOf":[{"items":{"$ref":"#/components/schemas/ApiWarning"},"type":"array"},{"type":"null"}],"title":"Warnings"}},"type":"object","required":["data","meta"],"title":"PaginatedResponse[AgreementOut]"},"PaginatedResponse_ApiKeyOut_":{"properties":{"data":{"items":{"$ref":"#/components/schemas/ApiKeyOut"},"type":"array","title":"Data"},"meta":{"$ref":"#/components/schemas/PaginationMeta"},"warnings":{"anyOf":[{"items":{"$ref":"#/components/schemas/ApiWarning"},"type":"array"},{"type":"null"}],"title":"Warnings"}},"type":"object","required":["data","meta"],"title":"PaginatedResponse[ApiKeyOut]"},"PaginatedResponse_AttachmentOut_":{"properties":{"data":{"items":{"$ref":"#/components/schemas/AttachmentOut"},"type":"array","title":"Data"},"meta":{"$ref":"#/components/schemas/PaginationMeta"},"warnings":{"anyOf":[{"items":{"$ref":"#/components/schemas/ApiWarning"},"type":"array"},{"type":"null"}],"title":"Warnings"}},"type":"object","required":["data","meta"],"title":"PaginatedResponse[AttachmentOut]"},"PaginatedResponse_BudgetOut_":{"properties":{"data":{"items":{"$ref":"#/components/schemas/BudgetOut"},"type":"array","title":"Data"},"meta":{"$ref":"#/components/schemas/PaginationMeta"},"warnings":{"anyOf":[{"items":{"$ref":"#/components/schemas/ApiWarning"},"type":"array"},{"type":"null"}],"title":"Warnings"}},"type":"object","required":["data","meta"],"title":"PaginatedResponse[BudgetOut]"},"PaginatedResponse_CalendarOut_":{"properties":{"data":{"items":{"$ref":"#/components/schemas/CalendarOut"},"type":"array","title":"Data"},"meta":{"$ref":"#/components/schemas/PaginationMeta"},"warnings":{"anyOf":[{"items":{"$ref":"#/components/schemas/ApiWarning"},"type":"array"},{"type":"null"}],"title":"Warnings"}},"type":"object","required":["data","meta"],"title":"PaginatedResponse[CalendarOut]"},"PaginatedResponse_ClientGroupOut_":{"properties":{"data":{"items":{"$ref":"#/components/schemas/ClientGroupOut"},"type":"array","title":"Data"},"meta":{"$ref":"#/components/schemas/PaginationMeta"},"warnings":{"anyOf":[{"items":{"$ref":"#/components/schemas/ApiWarning"},"type":"array"},{"type":"null"}],"title":"Warnings"}},"type":"object","required":["data","meta"],"title":"PaginatedResponse[ClientGroupOut]"},"PaginatedResponse_ClientMemberOut_":{"properties":{"data":{"items":{"$ref":"#/components/schemas/ClientMemberOut"},"type":"array","title":"Data"},"meta":{"$ref":"#/components/schemas/PaginationMeta"},"warnings":{"anyOf":[{"items":{"$ref":"#/components/schemas/ApiWarning"},"type":"array"},{"type":"null"}],"title":"Warnings"}},"type":"object","required":["data","meta"],"title":"PaginatedResponse[ClientMemberOut]"},"PaginatedResponse_ClientMonitorOut_":{"properties":{"data":{"items":{"$ref":"#/components/schemas/ClientMonitorOut"},"type":"array","title":"Data"},"meta":{"$ref":"#/components/schemas/PaginationMeta"},"warnings":{"anyOf":[{"items":{"$ref":"#/components/schemas/ApiWarning"},"type":"array"},{"type":"null"}],"title":"Warnings"}},"type":"object","required":["data","meta"],"title":"PaginatedResponse[ClientMonitorOut]"},"PaginatedResponse_ClientOut_":{"properties":{"data":{"items":{"$ref":"#/components/schemas/ClientOut"},"type":"array","title":"Data"},"meta":{"$ref":"#/components/schemas/PaginationMeta"},"warnings":{"anyOf":[{"items":{"$ref":"#/components/schemas/ApiWarning"},"type":"array"},{"type":"null"}],"title":"Warnings"}},"type":"object","required":["data","meta"],"title":"PaginatedResponse[ClientOut]"},"PaginatedResponse_ContactOut_":{"properties":{"data":{"items":{"$ref":"#/components/schemas/ContactOut"},"type":"array","title":"Data"},"meta":{"$ref":"#/components/schemas/PaginationMeta"},"warnings":{"anyOf":[{"items":{"$ref":"#/components/schemas/ApiWarning"},"type":"array"},{"type":"null"}],"title":"Warnings"}},"type":"object","required":["data","meta"],"title":"PaginatedResponse[ContactOut]"},"PaginatedResponse_ContentTemplateOut_":{"properties":{"data":{"items":{"$ref":"#/components/schemas/ContentTemplateOut"},"type":"array","title":"Data"},"meta":{"$ref":"#/components/schemas/PaginationMeta"},"warnings":{"anyOf":[{"items":{"$ref":"#/components/schemas/ApiWarning"},"type":"array"},{"type":"null"}],"title":"Warnings"}},"type":"object","required":["data","meta"],"title":"PaginatedResponse[ContentTemplateOut]"},"PaginatedResponse_ContractOut_":{"properties":{"data":{"items":{"$ref":"#/components/schemas/ContractOut"},"type":"array","title":"Data"},"meta":{"$ref":"#/components/schemas/PaginationMeta"},"warnings":{"anyOf":[{"items":{"$ref":"#/components/schemas/ApiWarning"},"type":"array"},{"type":"null"}],"title":"Warnings"}},"type":"object","required":["data","meta"],"title":"PaginatedResponse[ContractOut]"},"PaginatedResponse_ContractRowOut_":{"properties":{"data":{"items":{"$ref":"#/components/schemas/ContractRowOut"},"type":"array","title":"Data"},"meta":{"$ref":"#/components/schemas/PaginationMeta"},"warnings":{"anyOf":[{"items":{"$ref":"#/components/schemas/ApiWarning"},"type":"array"},{"type":"null"}],"title":"Warnings"}},"type":"object","required":["data","meta"],"title":"PaginatedResponse[ContractRowOut]"},"PaginatedResponse_CustomFieldOut_":{"properties":{"data":{"items":{"$ref":"#/components/schemas/CustomFieldOut"},"type":"array","title":"Data"},"meta":{"$ref":"#/components/schemas/PaginationMeta"},"warnings":{"anyOf":[{"items":{"$ref":"#/components/schemas/ApiWarning"},"type":"array"},{"type":"null"}],"title":"Warnings"}},"type":"object","required":["data","meta"],"title":"PaginatedResponse[CustomFieldOut]"},"PaginatedResponse_DelegationOut_":{"properties":{"data":{"items":{"$ref":"#/components/schemas/DelegationOut"},"type":"array","title":"Data"},"meta":{"$ref":"#/components/schemas/PaginationMeta"},"warnings":{"anyOf":[{"items":{"$ref":"#/components/schemas/ApiWarning"},"type":"array"},{"type":"null"}],"title":"Warnings"}},"type":"object","required":["data","meta"],"title":"PaginatedResponse[DelegationOut]"},"PaginatedResponse_FlextimeOut_":{"properties":{"data":{"items":{"$ref":"#/components/schemas/FlextimeOut"},"type":"array","title":"Data"},"meta":{"$ref":"#/components/schemas/PaginationMeta"},"warnings":{"anyOf":[{"items":{"$ref":"#/components/schemas/ApiWarning"},"type":"array"},{"type":"null"}],"title":"Warnings"}},"type":"object","required":["data","meta"],"title":"PaginatedResponse[FlextimeOut]"},"PaginatedResponse_InvoiceOut_":{"properties":{"data":{"items":{"$ref":"#/components/schemas/InvoiceOut"},"type":"array","title":"Data"},"meta":{"$ref":"#/components/schemas/PaginationMeta"},"warnings":{"anyOf":[{"items":{"$ref":"#/components/schemas/ApiWarning"},"type":"array"},{"type":"null"}],"title":"Warnings"}},"type":"object","required":["data","meta"],"title":"PaginatedResponse[InvoiceOut]"},"PaginatedResponse_InvoiceRowOut_":{"properties":{"data":{"items":{"$ref":"#/components/schemas/InvoiceRowOut"},"type":"array","title":"Data"},"meta":{"$ref":"#/components/schemas/PaginationMeta"},"warnings":{"anyOf":[{"items":{"$ref":"#/components/schemas/ApiWarning"},"type":"array"},{"type":"null"}],"title":"Warnings"}},"type":"object","required":["data","meta"],"title":"PaginatedResponse[InvoiceRowOut]"},"PaginatedResponse_InvoiceSellerOut_":{"properties":{"data":{"items":{"$ref":"#/components/schemas/InvoiceSellerOut"},"type":"array","title":"Data"},"meta":{"$ref":"#/components/schemas/PaginationMeta"},"warnings":{"anyOf":[{"items":{"$ref":"#/components/schemas/ApiWarning"},"type":"array"},{"type":"null"}],"title":"Warnings"}},"type":"object","required":["data","meta"],"title":"PaginatedResponse[InvoiceSellerOut]"},"PaginatedResponse_MemberOut_":{"properties":{"data":{"items":{"$ref":"#/components/schemas/MemberOut"},"type":"array","title":"Data"},"meta":{"$ref":"#/components/schemas/PaginationMeta"},"warnings":{"anyOf":[{"items":{"$ref":"#/components/schemas/ApiWarning"},"type":"array"},{"type":"null"}],"title":"Warnings"}},"type":"object","required":["data","meta"],"title":"PaginatedResponse[MemberOut]"},"PaginatedResponse_NoteOut_":{"properties":{"data":{"items":{"$ref":"#/components/schemas/NoteOut"},"type":"array","title":"Data"},"meta":{"$ref":"#/components/schemas/PaginationMeta"},"warnings":{"anyOf":[{"items":{"$ref":"#/components/schemas/ApiWarning"},"type":"array"},{"type":"null"}],"title":"Warnings"}},"type":"object","required":["data","meta"],"title":"PaginatedResponse[NoteOut]"},"PaginatedResponse_ProductFieldOut_":{"properties":{"data":{"items":{"$ref":"#/components/schemas/ProductFieldOut"},"type":"array","title":"Data"},"meta":{"$ref":"#/components/schemas/PaginationMeta"},"warnings":{"anyOf":[{"items":{"$ref":"#/components/schemas/ApiWarning"},"type":"array"},{"type":"null"}],"title":"Warnings"}},"type":"object","required":["data","meta"],"title":"PaginatedResponse[ProductFieldOut]"},"PaginatedResponse_ProductOut_":{"properties":{"data":{"items":{"$ref":"#/components/schemas/ProductOut"},"type":"array","title":"Data"},"meta":{"$ref":"#/components/schemas/PaginationMeta"},"warnings":{"anyOf":[{"items":{"$ref":"#/components/schemas/ApiWarning"},"type":"array"},{"type":"null"}],"title":"Warnings"}},"type":"object","required":["data","meta"],"title":"PaginatedResponse[ProductOut]"},"PaginatedResponse_ProductPriceOut_":{"properties":{"data":{"items":{"$ref":"#/components/schemas/ProductPriceOut"},"type":"array","title":"Data"},"meta":{"$ref":"#/components/schemas/PaginationMeta"},"warnings":{"anyOf":[{"items":{"$ref":"#/components/schemas/ApiWarning"},"type":"array"},{"type":"null"}],"title":"Warnings"}},"type":"object","required":["data","meta"],"title":"PaginatedResponse[ProductPriceOut]"},"PaginatedResponse_ProjectOut_":{"properties":{"data":{"items":{"$ref":"#/components/schemas/ProjectOut"},"type":"array","title":"Data"},"meta":{"$ref":"#/components/schemas/PaginationMeta"},"warnings":{"anyOf":[{"items":{"$ref":"#/components/schemas/ApiWarning"},"type":"array"},{"type":"null"}],"title":"Warnings"}},"type":"object","required":["data","meta"],"title":"PaginatedResponse[ProjectOut]"},"PaginatedResponse_ReclaimOut_":{"properties":{"data":{"items":{"$ref":"#/components/schemas/ReclaimOut"},"type":"array","title":"Data"},"meta":{"$ref":"#/components/schemas/PaginationMeta"},"warnings":{"anyOf":[{"items":{"$ref":"#/components/schemas/ApiWarning"},"type":"array"},{"type":"null"}],"title":"Warnings"}},"type":"object","required":["data","meta"],"title":"PaginatedResponse[ReclaimOut]"},"PaginatedResponse_RoleOut_":{"properties":{"data":{"items":{"$ref":"#/components/schemas/RoleOut"},"type":"array","title":"Data"},"meta":{"$ref":"#/components/schemas/PaginationMeta"},"warnings":{"anyOf":[{"items":{"$ref":"#/components/schemas/ApiWarning"},"type":"array"},{"type":"null"}],"title":"Warnings"}},"type":"object","required":["data","meta"],"title":"PaginatedResponse[RoleOut]"},"PaginatedResponse_SupplierOut_":{"properties":{"data":{"items":{"$ref":"#/components/schemas/SupplierOut"},"type":"array","title":"Data"},"meta":{"$ref":"#/components/schemas/PaginationMeta"},"warnings":{"anyOf":[{"items":{"$ref":"#/components/schemas/ApiWarning"},"type":"array"},{"type":"null"}],"title":"Warnings"}},"type":"object","required":["data","meta"],"title":"PaginatedResponse[SupplierOut]"},"PaginatedResponse_SupplierTypeOut_":{"properties":{"data":{"items":{"$ref":"#/components/schemas/SupplierTypeOut"},"type":"array","title":"Data"},"meta":{"$ref":"#/components/schemas/PaginationMeta"},"warnings":{"anyOf":[{"items":{"$ref":"#/components/schemas/ApiWarning"},"type":"array"},{"type":"null"}],"title":"Warnings"}},"type":"object","required":["data","meta"],"title":"PaginatedResponse[SupplierTypeOut]"},"PaginatedResponse_TaskAutomationOut_":{"properties":{"data":{"items":{"$ref":"#/components/schemas/TaskAutomationOut"},"type":"array","title":"Data"},"meta":{"$ref":"#/components/schemas/PaginationMeta"},"warnings":{"anyOf":[{"items":{"$ref":"#/components/schemas/ApiWarning"},"type":"array"},{"type":"null"}],"title":"Warnings"}},"type":"object","required":["data","meta"],"title":"PaginatedResponse[TaskAutomationOut]"},"PaginatedResponse_TaskOut_":{"properties":{"data":{"items":{"$ref":"#/components/schemas/TaskOut"},"type":"array","title":"Data"},"meta":{"$ref":"#/components/schemas/PaginationMeta"},"warnings":{"anyOf":[{"items":{"$ref":"#/components/schemas/ApiWarning"},"type":"array"},{"type":"null"}],"title":"Warnings"}},"type":"object","required":["data","meta"],"title":"PaginatedResponse[TaskOut]"},"PaginatedResponse_TaskRelationOut_":{"properties":{"data":{"items":{"$ref":"#/components/schemas/TaskRelationOut"},"type":"array","title":"Data"},"meta":{"$ref":"#/components/schemas/PaginationMeta"},"warnings":{"anyOf":[{"items":{"$ref":"#/components/schemas/ApiWarning"},"type":"array"},{"type":"null"}],"title":"Warnings"}},"type":"object","required":["data","meta"],"title":"PaginatedResponse[TaskRelationOut]"},"PaginatedResponse_TaxOut_":{"properties":{"data":{"items":{"$ref":"#/components/schemas/TaxOut"},"type":"array","title":"Data"},"meta":{"$ref":"#/components/schemas/PaginationMeta"},"warnings":{"anyOf":[{"items":{"$ref":"#/components/schemas/ApiWarning"},"type":"array"},{"type":"null"}],"title":"Warnings"}},"type":"object","required":["data","meta"],"title":"PaginatedResponse[TaxOut]"},"PaginatedResponse_TimeEntryOut_":{"properties":{"data":{"items":{"$ref":"#/components/schemas/TimeEntryOut"},"type":"array","title":"Data"},"meta":{"$ref":"#/components/schemas/PaginationMeta"},"warnings":{"anyOf":[{"items":{"$ref":"#/components/schemas/ApiWarning"},"type":"array"},{"type":"null"}],"title":"Warnings"}},"type":"object","required":["data","meta"],"title":"PaginatedResponse[TimeEntryOut]"},"PaginatedResponse_TopicOut_":{"properties":{"data":{"items":{"$ref":"#/components/schemas/TopicOut"},"type":"array","title":"Data"},"meta":{"$ref":"#/components/schemas/PaginationMeta"},"warnings":{"anyOf":[{"items":{"$ref":"#/components/schemas/ApiWarning"},"type":"array"},{"type":"null"}],"title":"Warnings"}},"type":"object","required":["data","meta"],"title":"PaginatedResponse[TopicOut]"},"PaginatedResponse_WorkflowRoleOut_":{"properties":{"data":{"items":{"$ref":"#/components/schemas/WorkflowRoleOut"},"type":"array","title":"Data"},"meta":{"$ref":"#/components/schemas/PaginationMeta"},"warnings":{"anyOf":[{"items":{"$ref":"#/components/schemas/ApiWarning"},"type":"array"},{"type":"null"}],"title":"Warnings"}},"type":"object","required":["data","meta"],"title":"PaginatedResponse[WorkflowRoleOut]"},"PaginationMeta":{"properties":{"total":{"anyOf":[{"type":"integer"},{"type":"string"},{"type":"null"}],"title":"Total"},"limit":{"type":"integer","title":"Limit"},"offset":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Offset"},"has_more":{"type":"boolean","title":"Has More"},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Cursor"}},"type":"object","required":["limit","has_more"],"title":"PaginationMeta"},"ProductCreate":{"properties":{"name":{"type":"string","maxLength":255,"minLength":1,"title":"Name"},"status":{"type":"string","enum":["active","inactive"],"title":"Status","default":"active"},"type":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Type"},"unit":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Unit"},"pricelist_type":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Pricelist Type"},"bill_by":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"title":"Bill By"},"billable_filter":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Billable Filter"},"topics":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"Topics"},"translations":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Translations"},"tax_id":{"anyOf":[{"type":"integer","exclusiveMinimum":0.0},{"type":"null"}],"title":"Tax Id"},"article_id":{"anyOf":[{"type":"integer","exclusiveMinimum":0.0},{"type":"null"}],"title":"Article Id"},"resource_id":{"anyOf":[{"type":"integer","exclusiveMinimum":0.0},{"type":"null"}],"title":"Resource Id"},"billing_project_id":{"anyOf":[{"type":"integer","exclusiveMinimum":0.0},{"type":"null"}],"title":"Billing Project Id"},"ext_variable":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Ext Variable"},"prices":{"items":{"$ref":"#/components/schemas/ProductPriceCreate"},"type":"array","minItems":1,"title":"Prices","description":"At least one price is required."}},"type":"object","required":["name","prices"],"title":"ProductCreate","description":"POST /products. Products and prices are a bundle — at least one price\nmust be supplied inline via `prices`. Use the sub-resource\n`POST /products/{id}/prices` to add more prices later."},"ProductFieldCreate":{"properties":{"type":{"type":"string","maxLength":50,"minLength":1,"title":"Type"},"label":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Label"},"value":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Value"},"code":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Code"},"ext_code":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Ext Code"},"status":{"type":"string","enum":["active","inactive"],"title":"Status","default":"active"}},"type":"object","required":["type"],"title":"ProductFieldCreate"},"ProductFieldOut":{"properties":{"id":{"type":"integer","title":"Id"},"type":{"type":"string","title":"Type"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"},"value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Value"},"code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code"},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"},"ext_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ext Id"},"ext_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ext Code"},"is_integrated":{"type":"boolean","title":"Is Integrated","default":false},"status":{"type":"string","title":"Status"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"}},"type":"object","required":["id","type","status"],"title":"ProductFieldOut"},"ProductFieldUpdate":{"properties":{"label":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Label"},"value":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Value"},"code":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Code"},"ext_code":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Ext Code"},"status":{"anyOf":[{"type":"string","enum":["active","inactive"]},{"type":"null"}],"title":"Status"}},"type":"object","title":"ProductFieldUpdate"},"ProductOut":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"},"status":{"type":"string","title":"Status"},"type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type"},"type_args":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type Args"},"unit":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Unit","description":"Null unless the key has the `financials` scope."},"pricelist_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pricelist Type","description":"Null unless the key has the `financials` scope."},"bill_by":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bill By","description":"Null unless the key has the `financials` scope."},"billable_filter":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Billable Filter","description":"Null unless the key has the `financials` scope."},"topics":{"items":{"type":"integer"},"type":"array","title":"Topics"},"translations":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Translations"},"tax_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Tax Id","description":"Null unless the key has the `financials` scope."},"tax_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Tax Rate","description":"Null unless the key has the `financials` scope."},"tax_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tax Name","description":"Null unless the key has the `financials` scope."},"article_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Article Id","description":"Null unless the key has the `financials` scope."},"resource_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Resource Id","description":"Null unless the key has the `financials` scope."},"billing_project_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Billing Project Id","description":"Null unless the key has the `financials` scope."},"ext_variable":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ext Variable"},"prices":{"items":{"$ref":"#/components/schemas/ProductPriceOut"},"type":"array","title":"Prices","description":"Null unless the key has the `financials` scope. (empty list.)"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"}},"type":"object","required":["id","name","status"],"title":"ProductOut"},"ProductPriceCreate":{"properties":{"net_price":{"anyOf":[{"type":"number","minimum":0.0},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"}],"title":"Net Price"},"calculate_per":{"type":"string","maxLength":32,"title":"Calculate Per","default":"unit"},"quantity":{"anyOf":[{"type":"number","minimum":0.0},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Quantity"},"range_from":{"anyOf":[{"type":"number","minimum":0.0},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Range From"},"range_until":{"anyOf":[{"type":"number","minimum":0.0},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Range Until"},"active_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Active From"},"active_until":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Active Until"},"unit_label":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Unit Label"},"sort_order":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Sort Order","default":0}},"type":"object","required":["net_price"],"title":"ProductPriceCreate","description":"Body for POST /products/{product_id}/prices and for inline creation\nvia POST /products (embedded in ProductCreate.prices). `product_id` is\ninferred from the parent product in both cases."},"ProductPriceOut":{"properties":{"id":{"type":"integer","title":"Id"},"product_id":{"type":"integer","title":"Product Id"},"active_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Active From"},"active_until":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Active Until"},"net_price":{"type":"number","title":"Net Price"},"quantity":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Quantity"},"range_from":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Range From"},"range_until":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Range Until"},"calculate_per":{"type":"string","title":"Calculate Per"},"unit_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Unit Label"},"sort_order":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Sort Order"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"}},"type":"object","required":["id","product_id","net_price","calculate_per"],"title":"ProductPriceOut"},"ProductPriceUpdate":{"properties":{"net_price":{"anyOf":[{"type":"number","minimum":0.0},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Net Price"},"calculate_per":{"anyOf":[{"type":"string","maxLength":32},{"type":"null"}],"title":"Calculate Per"},"quantity":{"anyOf":[{"type":"number","minimum":0.0},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Quantity"},"range_from":{"anyOf":[{"type":"number","minimum":0.0},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Range From"},"range_until":{"anyOf":[{"type":"number","minimum":0.0},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Range Until"},"active_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Active From"},"active_until":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Active Until"},"unit_label":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Unit Label"},"sort_order":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Sort Order"}},"type":"object","title":"ProductPriceUpdate"},"ProductUpdate":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":255,"minLength":1},{"type":"null"}],"title":"Name"},"status":{"anyOf":[{"type":"string","enum":["active","inactive"]},{"type":"null"}],"title":"Status"},"type":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Type"},"unit":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Unit"},"pricelist_type":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Pricelist Type"},"bill_by":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"title":"Bill By"},"billable_filter":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Billable Filter"},"topics":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"Topics"},"translations":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Translations"},"tax_id":{"anyOf":[{"type":"integer","exclusiveMinimum":0.0},{"type":"null"}],"title":"Tax Id"},"article_id":{"anyOf":[{"type":"integer","exclusiveMinimum":0.0},{"type":"null"}],"title":"Article Id"},"resource_id":{"anyOf":[{"type":"integer","exclusiveMinimum":0.0},{"type":"null"}],"title":"Resource Id"},"billing_project_id":{"anyOf":[{"type":"integer","exclusiveMinimum":0.0},{"type":"null"}],"title":"Billing Project Id"},"ext_variable":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Ext Variable"}},"type":"object","title":"ProductUpdate"},"ProjectCreate":{"properties":{"name":{"type":"string","maxLength":255,"minLength":1,"title":"Name"},"type":{"type":"string","enum":["project","workflow"],"title":"Type","default":"project"},"project_type_id":{"type":"integer","exclusiveMinimum":0.0,"title":"Project Type Id"},"client_id":{"anyOf":[{"type":"integer","exclusiveMinimum":0.0},{"type":"null"}],"title":"Client Id"},"manager_id":{"anyOf":[{"type":"integer","exclusiveMinimum":0.0},{"type":"null"}],"title":"Manager Id"},"start_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Start Date"},"event_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Event Date"},"end_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"End Date"},"color":{"anyOf":[{"type":"string","maxLength":10},{"type":"null"}],"title":"Color"},"status_text":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Status Text","description":"Free-text status slug"},"custom_fields":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Custom Fields"}},"type":"object","required":["name","project_type_id"],"title":"ProjectCreate"},"ProjectOut":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"},"type":{"type":"string","enum":["project","workflow"],"title":"Type"},"status":{"type":"string","title":"Status"},"status_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status Text"},"client_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Client Id"},"manager_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Manager Id"},"project_type_id":{"type":"integer","title":"Project Type Id"},"start_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Start Date"},"event_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Event Date"},"end_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"End Date"},"color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Color"},"custom_fields":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Custom Fields"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"}},"type":"object","required":["id","name","type","status","project_type_id"],"title":"ProjectOut"},"ProjectUpdate":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":255,"minLength":1},{"type":"null"}],"title":"Name"},"project_type_id":{"anyOf":[{"type":"integer","exclusiveMinimum":0.0},{"type":"null"}],"title":"Project Type Id"},"client_id":{"anyOf":[{"type":"integer","exclusiveMinimum":0.0},{"type":"null"}],"title":"Client Id"},"manager_id":{"anyOf":[{"type":"integer","exclusiveMinimum":0.0},{"type":"null"}],"title":"Manager Id"},"start_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Start Date"},"event_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Event Date"},"end_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"End Date"},"color":{"anyOf":[{"type":"string","maxLength":10},{"type":"null"}],"title":"Color"},"status_text":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Status Text"},"custom_fields":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Custom Fields"},"status_action":{"anyOf":[{"type":"string","enum":["activate","cancel","archive","unarchive"]},{"type":"null"}],"title":"Status Action"}},"type":"object","title":"ProjectUpdate"},"ReclaimOut":{"properties":{"id":{"type":"integer","title":"Id"},"client_id":{"type":"integer","title":"Client Id"},"source_task_id":{"type":"integer","title":"Source Task Id"},"target_task_id":{"type":"integer","title":"Target Task Id"},"field_name":{"type":"string","title":"Field Name"},"period":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Period"},"target_period":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Period"},"person_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Person Id"},"value":{"type":"number","title":"Value"},"locked_invoice_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Locked Invoice Id"},"reclaimed_by":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Reclaimed By"},"undone_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Undone At"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"}},"type":"object","required":["id","client_id","source_task_id","target_task_id","field_name","value"],"title":"ReclaimOut"},"ReclaimUpdate":{"properties":{"undone_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Undone At","description":"NOT SUPPORTED: writing this field returns 409 RECLAIM_UNDO_NOT_SUPPORTED — a bare write cannot reverse the reclaimed time entries. Use POST /api/v3/reclaims/{id}/undo instead.","deprecated":true}},"type":"object","title":"ReclaimUpdate","description":"Reclaim creation is a billing-internal flow; undo via a bare field write is NOT supported."},"RecurrenceRuleOut":{"properties":{"type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type"},"date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Date"},"date_only":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Date Only"},"time":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Time"},"interval":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Interval"},"weekdays":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Weekdays"},"day_of_month":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Day Of Month"},"month_of_period":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Month Of Period"},"shift_to_workday":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Shift To Workday"},"has_due_date":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Has Due Date"},"due_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Due Date"},"due_calc_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Due Calc Type"},"due_calc_from":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Due Calc From"},"due_day_of_month":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Due Day Of Month"},"due_month_of_period":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Due Month Of Period"},"due_count_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Due Count Days"},"due_time":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Due Time"},"due_shift_to_workday":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Due Shift To Workday"},"recurrence_ends_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Recurrence Ends Date"},"start_date_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Start Date Type"},"custom_days_shift":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Custom Days Shift"},"custom_plus_minus_days_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Custom Plus Minus Days Type"},"start_date_custom_field":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Start Date Custom Field"},"start_date_custom_field_value":{"anyOf":[{},{"type":"null"}],"title":"Start Date Custom Field Value"}},"type":"object","title":"RecurrenceRuleOut","description":"Recurrence rule. `type` is the frequency."},"RoleCreate":{"properties":{"name":{"type":"string","maxLength":255,"minLength":1,"title":"Name"}},"type":"object","required":["name"],"title":"RoleCreate"},"RoleOut":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"}},"type":"object","required":["id","name"],"title":"RoleOut"},"RoleUpdate":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":255,"minLength":1},{"type":"null"}],"title":"Name"}},"type":"object","title":"RoleUpdate"},"SingleResponse_AgreementOut_":{"properties":{"data":{"$ref":"#/components/schemas/AgreementOut"},"warnings":{"anyOf":[{"items":{"$ref":"#/components/schemas/ApiWarning"},"type":"array"},{"type":"null"}],"title":"Warnings"}},"type":"object","required":["data"],"title":"SingleResponse[AgreementOut]"},"SingleResponse_ApiKeyCreated_":{"properties":{"data":{"$ref":"#/components/schemas/ApiKeyCreated"},"warnings":{"anyOf":[{"items":{"$ref":"#/components/schemas/ApiWarning"},"type":"array"},{"type":"null"}],"title":"Warnings"}},"type":"object","required":["data"],"title":"SingleResponse[ApiKeyCreated]"},"SingleResponse_ApiKeyRotated_":{"properties":{"data":{"$ref":"#/components/schemas/ApiKeyRotated"},"warnings":{"anyOf":[{"items":{"$ref":"#/components/schemas/ApiWarning"},"type":"array"},{"type":"null"}],"title":"Warnings"}},"type":"object","required":["data"],"title":"SingleResponse[ApiKeyRotated]"},"SingleResponse_AttachmentOut_":{"properties":{"data":{"$ref":"#/components/schemas/AttachmentOut"},"warnings":{"anyOf":[{"items":{"$ref":"#/components/schemas/ApiWarning"},"type":"array"},{"type":"null"}],"title":"Warnings"}},"type":"object","required":["data"],"title":"SingleResponse[AttachmentOut]"},"SingleResponse_BudgetOut_":{"properties":{"data":{"$ref":"#/components/schemas/BudgetOut"},"warnings":{"anyOf":[{"items":{"$ref":"#/components/schemas/ApiWarning"},"type":"array"},{"type":"null"}],"title":"Warnings"}},"type":"object","required":["data"],"title":"SingleResponse[BudgetOut]"},"SingleResponse_CalendarOut_":{"properties":{"data":{"$ref":"#/components/schemas/CalendarOut"},"warnings":{"anyOf":[{"items":{"$ref":"#/components/schemas/ApiWarning"},"type":"array"},{"type":"null"}],"title":"Warnings"}},"type":"object","required":["data"],"title":"SingleResponse[CalendarOut]"},"SingleResponse_ClientGroupOut_":{"properties":{"data":{"$ref":"#/components/schemas/ClientGroupOut"},"warnings":{"anyOf":[{"items":{"$ref":"#/components/schemas/ApiWarning"},"type":"array"},{"type":"null"}],"title":"Warnings"}},"type":"object","required":["data"],"title":"SingleResponse[ClientGroupOut]"},"SingleResponse_ClientMemberOut_":{"properties":{"data":{"$ref":"#/components/schemas/ClientMemberOut"},"warnings":{"anyOf":[{"items":{"$ref":"#/components/schemas/ApiWarning"},"type":"array"},{"type":"null"}],"title":"Warnings"}},"type":"object","required":["data"],"title":"SingleResponse[ClientMemberOut]"},"SingleResponse_ClientMonitorOut_":{"properties":{"data":{"$ref":"#/components/schemas/ClientMonitorOut"},"warnings":{"anyOf":[{"items":{"$ref":"#/components/schemas/ApiWarning"},"type":"array"},{"type":"null"}],"title":"Warnings"}},"type":"object","required":["data"],"title":"SingleResponse[ClientMonitorOut]"},"SingleResponse_ClientOut_":{"properties":{"data":{"$ref":"#/components/schemas/ClientOut"},"warnings":{"anyOf":[{"items":{"$ref":"#/components/schemas/ApiWarning"},"type":"array"},{"type":"null"}],"title":"Warnings"}},"type":"object","required":["data"],"title":"SingleResponse[ClientOut]"},"SingleResponse_ContactOut_":{"properties":{"data":{"$ref":"#/components/schemas/ContactOut"},"warnings":{"anyOf":[{"items":{"$ref":"#/components/schemas/ApiWarning"},"type":"array"},{"type":"null"}],"title":"Warnings"}},"type":"object","required":["data"],"title":"SingleResponse[ContactOut]"},"SingleResponse_ContentTemplateOut_":{"properties":{"data":{"$ref":"#/components/schemas/ContentTemplateOut"},"warnings":{"anyOf":[{"items":{"$ref":"#/components/schemas/ApiWarning"},"type":"array"},{"type":"null"}],"title":"Warnings"}},"type":"object","required":["data"],"title":"SingleResponse[ContentTemplateOut]"},"SingleResponse_ContentTemplateRowOut_":{"properties":{"data":{"$ref":"#/components/schemas/ContentTemplateRowOut"},"warnings":{"anyOf":[{"items":{"$ref":"#/components/schemas/ApiWarning"},"type":"array"},{"type":"null"}],"title":"Warnings"}},"type":"object","required":["data"],"title":"SingleResponse[ContentTemplateRowOut]"},"SingleResponse_ContractOut_":{"properties":{"data":{"$ref":"#/components/schemas/ContractOut"},"warnings":{"anyOf":[{"items":{"$ref":"#/components/schemas/ApiWarning"},"type":"array"},{"type":"null"}],"title":"Warnings"}},"type":"object","required":["data"],"title":"SingleResponse[ContractOut]"},"SingleResponse_ContractRowOut_":{"properties":{"data":{"$ref":"#/components/schemas/ContractRowOut"},"warnings":{"anyOf":[{"items":{"$ref":"#/components/schemas/ApiWarning"},"type":"array"},{"type":"null"}],"title":"Warnings"}},"type":"object","required":["data"],"title":"SingleResponse[ContractRowOut]"},"SingleResponse_CustomFieldOut_":{"properties":{"data":{"$ref":"#/components/schemas/CustomFieldOut"},"warnings":{"anyOf":[{"items":{"$ref":"#/components/schemas/ApiWarning"},"type":"array"},{"type":"null"}],"title":"Warnings"}},"type":"object","required":["data"],"title":"SingleResponse[CustomFieldOut]"},"SingleResponse_DelegationOut_":{"properties":{"data":{"$ref":"#/components/schemas/DelegationOut"},"warnings":{"anyOf":[{"items":{"$ref":"#/components/schemas/ApiWarning"},"type":"array"},{"type":"null"}],"title":"Warnings"}},"type":"object","required":["data"],"title":"SingleResponse[DelegationOut]"},"SingleResponse_DocumentsFolderOut_":{"properties":{"data":{"$ref":"#/components/schemas/DocumentsFolderOut"},"warnings":{"anyOf":[{"items":{"$ref":"#/components/schemas/ApiWarning"},"type":"array"},{"type":"null"}],"title":"Warnings"}},"type":"object","required":["data"],"title":"SingleResponse[DocumentsFolderOut]"},"SingleResponse_FlextimeOut_":{"properties":{"data":{"$ref":"#/components/schemas/FlextimeOut"},"warnings":{"anyOf":[{"items":{"$ref":"#/components/schemas/ApiWarning"},"type":"array"},{"type":"null"}],"title":"Warnings"}},"type":"object","required":["data"],"title":"SingleResponse[FlextimeOut]"},"SingleResponse_InvoiceOut_":{"properties":{"data":{"$ref":"#/components/schemas/InvoiceOut"},"warnings":{"anyOf":[{"items":{"$ref":"#/components/schemas/ApiWarning"},"type":"array"},{"type":"null"}],"title":"Warnings"}},"type":"object","required":["data"],"title":"SingleResponse[InvoiceOut]"},"SingleResponse_InvoiceRowOut_":{"properties":{"data":{"$ref":"#/components/schemas/InvoiceRowOut"},"warnings":{"anyOf":[{"items":{"$ref":"#/components/schemas/ApiWarning"},"type":"array"},{"type":"null"}],"title":"Warnings"}},"type":"object","required":["data"],"title":"SingleResponse[InvoiceRowOut]"},"SingleResponse_InvoiceSellerOut_":{"properties":{"data":{"$ref":"#/components/schemas/InvoiceSellerOut"},"warnings":{"anyOf":[{"items":{"$ref":"#/components/schemas/ApiWarning"},"type":"array"},{"type":"null"}],"title":"Warnings"}},"type":"object","required":["data"],"title":"SingleResponse[InvoiceSellerOut]"},"SingleResponse_InvoiceSendOut_":{"properties":{"data":{"$ref":"#/components/schemas/InvoiceSendOut"},"warnings":{"anyOf":[{"items":{"$ref":"#/components/schemas/ApiWarning"},"type":"array"},{"type":"null"}],"title":"Warnings"}},"type":"object","required":["data"],"title":"SingleResponse[InvoiceSendOut]"},"SingleResponse_MemberOut_":{"properties":{"data":{"$ref":"#/components/schemas/MemberOut"},"warnings":{"anyOf":[{"items":{"$ref":"#/components/schemas/ApiWarning"},"type":"array"},{"type":"null"}],"title":"Warnings"}},"type":"object","required":["data"],"title":"SingleResponse[MemberOut]"},"SingleResponse_NoteOut_":{"properties":{"data":{"$ref":"#/components/schemas/NoteOut"},"warnings":{"anyOf":[{"items":{"$ref":"#/components/schemas/ApiWarning"},"type":"array"},{"type":"null"}],"title":"Warnings"}},"type":"object","required":["data"],"title":"SingleResponse[NoteOut]"},"SingleResponse_ProductFieldOut_":{"properties":{"data":{"$ref":"#/components/schemas/ProductFieldOut"},"warnings":{"anyOf":[{"items":{"$ref":"#/components/schemas/ApiWarning"},"type":"array"},{"type":"null"}],"title":"Warnings"}},"type":"object","required":["data"],"title":"SingleResponse[ProductFieldOut]"},"SingleResponse_ProductOut_":{"properties":{"data":{"$ref":"#/components/schemas/ProductOut"},"warnings":{"anyOf":[{"items":{"$ref":"#/components/schemas/ApiWarning"},"type":"array"},{"type":"null"}],"title":"Warnings"}},"type":"object","required":["data"],"title":"SingleResponse[ProductOut]"},"SingleResponse_ProductPriceOut_":{"properties":{"data":{"$ref":"#/components/schemas/ProductPriceOut"},"warnings":{"anyOf":[{"items":{"$ref":"#/components/schemas/ApiWarning"},"type":"array"},{"type":"null"}],"title":"Warnings"}},"type":"object","required":["data"],"title":"SingleResponse[ProductPriceOut]"},"SingleResponse_ProjectOut_":{"properties":{"data":{"$ref":"#/components/schemas/ProjectOut"},"warnings":{"anyOf":[{"items":{"$ref":"#/components/schemas/ApiWarning"},"type":"array"},{"type":"null"}],"title":"Warnings"}},"type":"object","required":["data"],"title":"SingleResponse[ProjectOut]"},"SingleResponse_ReclaimOut_":{"properties":{"data":{"$ref":"#/components/schemas/ReclaimOut"},"warnings":{"anyOf":[{"items":{"$ref":"#/components/schemas/ApiWarning"},"type":"array"},{"type":"null"}],"title":"Warnings"}},"type":"object","required":["data"],"title":"SingleResponse[ReclaimOut]"},"SingleResponse_RoleOut_":{"properties":{"data":{"$ref":"#/components/schemas/RoleOut"},"warnings":{"anyOf":[{"items":{"$ref":"#/components/schemas/ApiWarning"},"type":"array"},{"type":"null"}],"title":"Warnings"}},"type":"object","required":["data"],"title":"SingleResponse[RoleOut]"},"SingleResponse_SupplierOut_":{"properties":{"data":{"$ref":"#/components/schemas/SupplierOut"},"warnings":{"anyOf":[{"items":{"$ref":"#/components/schemas/ApiWarning"},"type":"array"},{"type":"null"}],"title":"Warnings"}},"type":"object","required":["data"],"title":"SingleResponse[SupplierOut]"},"SingleResponse_SupplierTypeOut_":{"properties":{"data":{"$ref":"#/components/schemas/SupplierTypeOut"},"warnings":{"anyOf":[{"items":{"$ref":"#/components/schemas/ApiWarning"},"type":"array"},{"type":"null"}],"title":"Warnings"}},"type":"object","required":["data"],"title":"SingleResponse[SupplierTypeOut]"},"SingleResponse_TaskAutomationOut_":{"properties":{"data":{"$ref":"#/components/schemas/TaskAutomationOut"},"warnings":{"anyOf":[{"items":{"$ref":"#/components/schemas/ApiWarning"},"type":"array"},{"type":"null"}],"title":"Warnings"}},"type":"object","required":["data"],"title":"SingleResponse[TaskAutomationOut]"},"SingleResponse_TaskOut_":{"properties":{"data":{"$ref":"#/components/schemas/TaskOut"},"warnings":{"anyOf":[{"items":{"$ref":"#/components/schemas/ApiWarning"},"type":"array"},{"type":"null"}],"title":"Warnings"}},"type":"object","required":["data"],"title":"SingleResponse[TaskOut]"},"SingleResponse_TaskRelationOut_":{"properties":{"data":{"$ref":"#/components/schemas/TaskRelationOut"},"warnings":{"anyOf":[{"items":{"$ref":"#/components/schemas/ApiWarning"},"type":"array"},{"type":"null"}],"title":"Warnings"}},"type":"object","required":["data"],"title":"SingleResponse[TaskRelationOut]"},"SingleResponse_TaxOut_":{"properties":{"data":{"$ref":"#/components/schemas/TaxOut"},"warnings":{"anyOf":[{"items":{"$ref":"#/components/schemas/ApiWarning"},"type":"array"},{"type":"null"}],"title":"Warnings"}},"type":"object","required":["data"],"title":"SingleResponse[TaxOut]"},"SingleResponse_TimeEntryOut_":{"properties":{"data":{"$ref":"#/components/schemas/TimeEntryOut"},"warnings":{"anyOf":[{"items":{"$ref":"#/components/schemas/ApiWarning"},"type":"array"},{"type":"null"}],"title":"Warnings"}},"type":"object","required":["data"],"title":"SingleResponse[TimeEntryOut]"},"SingleResponse_TopicOut_":{"properties":{"data":{"$ref":"#/components/schemas/TopicOut"},"warnings":{"anyOf":[{"items":{"$ref":"#/components/schemas/ApiWarning"},"type":"array"},{"type":"null"}],"title":"Warnings"}},"type":"object","required":["data"],"title":"SingleResponse[TopicOut]"},"SingleResponse_WorkflowRoleOut_":{"properties":{"data":{"$ref":"#/components/schemas/WorkflowRoleOut"},"warnings":{"anyOf":[{"items":{"$ref":"#/components/schemas/ApiWarning"},"type":"array"},{"type":"null"}],"title":"Warnings"}},"type":"object","required":["data"],"title":"SingleResponse[WorkflowRoleOut]"},"SupplierCreate":{"properties":{"name":{"type":"string","maxLength":255,"minLength":1,"title":"Name"},"type_id":{"type":"integer","exclusiveMinimum":0.0,"title":"Type Id"},"parent_id":{"anyOf":[{"type":"integer","exclusiveMinimum":0.0},{"type":"null"}],"title":"Parent Id"},"reg_code":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Reg Code"},"vat_code":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Vat Code"},"address_street":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Address Street"},"address_city":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Address City"},"address_state":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Address State"},"address_zip":{"anyOf":[{"type":"string","maxLength":5},{"type":"null"}],"title":"Address Zip"},"address_country_code":{"anyOf":[{"type":"string","maxLength":5},{"type":"null"}],"title":"Address Country Code"},"custom_fields":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Custom Fields"}},"type":"object","required":["name","type_id"],"title":"SupplierCreate"},"SupplierOut":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"},"type_id":{"type":"integer","title":"Type Id"},"parent_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Parent Id"},"reg_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reg Code"},"vat_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vat Code"},"address_street":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address Street"},"address_city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address City"},"address_state":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address State"},"address_zip":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address Zip"},"address_country_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address Country Code"},"custom_fields":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Custom Fields"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"}},"type":"object","required":["id","name","type_id"],"title":"SupplierOut"},"SupplierTypeOut":{"properties":{"id":{"type":"integer","title":"Id"},"title":{"type":"string","title":"Title"},"parent_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Parent Id"},"sort_order":{"type":"integer","title":"Sort Order"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"}},"type":"object","required":["id","title","sort_order"],"title":"SupplierTypeOut"},"SupplierTypeUpdate":{"properties":{"title":{"anyOf":[{"type":"string","maxLength":255,"minLength":1},{"type":"null"}],"title":"Title"},"parent_id":{"anyOf":[{"type":"integer","exclusiveMinimum":0.0},{"type":"null"}],"title":"Parent Id"},"sort_order":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Sort Order"}},"type":"object","title":"SupplierTypeUpdate"},"SupplierUpdate":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":255,"minLength":1},{"type":"null"}],"title":"Name"},"type_id":{"anyOf":[{"type":"integer","exclusiveMinimum":0.0},{"type":"null"}],"title":"Type Id"},"parent_id":{"anyOf":[{"type":"integer","exclusiveMinimum":0.0},{"type":"null"}],"title":"Parent Id"},"reg_code":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Reg Code"},"vat_code":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Vat Code"},"address_street":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Address Street"},"address_city":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Address City"},"address_state":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Address State"},"address_zip":{"anyOf":[{"type":"string","maxLength":5},{"type":"null"}],"title":"Address Zip"},"address_country_code":{"anyOf":[{"type":"string","maxLength":5},{"type":"null"}],"title":"Address Country Code"},"custom_fields":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Custom Fields"}},"type":"object","title":"SupplierUpdate"},"TaskAutomationCreate":{"properties":{"trigger":{"type":"string","enum":["start_date","due_date","finished"],"title":"Trigger"},"days":{"type":"integer","maximum":3650.0,"minimum":-3650.0,"title":"Days","description":"Days offset from trigger. Negative = before."},"task_id":{"anyOf":[{"type":"integer","exclusiveMinimum":0.0},{"type":"null"}],"title":"Task Id"},"client_id":{"anyOf":[{"type":"integer","exclusiveMinimum":0.0},{"type":"null"}],"title":"Client Id"},"project_id":{"anyOf":[{"type":"integer","exclusiveMinimum":0.0},{"type":"null"}],"title":"Project Id"},"content_template_id":{"anyOf":[{"type":"integer","exclusiveMinimum":0.0},{"type":"null"}],"title":"Content Template Id"},"email_integration_id":{"anyOf":[{"type":"integer","exclusiveMinimum":0.0},{"type":"null"}],"title":"Email Integration Id"},"subject":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Subject"},"content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content"},"locale_code":{"anyOf":[{"type":"string","maxLength":10},{"type":"null"}],"title":"Locale Code"}},"type":"object","required":["trigger","days"],"title":"TaskAutomationCreate"},"TaskAutomationOut":{"properties":{"id":{"type":"integer","title":"Id"},"task_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Task Id"},"client_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Client Id"},"project_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Project Id"},"content_template_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Content Template Id"},"email_integration_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Email Integration Id"},"status":{"type":"string","title":"Status"},"subject":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subject"},"content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content"},"days":{"type":"integer","title":"Days"},"trigger":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Trigger"},"locale_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Locale Code"},"completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Completed At"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"}},"type":"object","required":["id","status","days"],"title":"TaskAutomationOut"},"TaskAutomationUpdate":{"properties":{"trigger":{"anyOf":[{"type":"string","enum":["start_date","due_date","finished"]},{"type":"null"}],"title":"Trigger"},"days":{"anyOf":[{"type":"integer","maximum":3650.0,"minimum":-3650.0},{"type":"null"}],"title":"Days"},"status":{"anyOf":[{"type":"string","enum":["new","finished","cancelled"]},{"type":"null"}],"title":"Status"},"subject":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Subject"},"content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content"},"locale_code":{"anyOf":[{"type":"string","maxLength":10},{"type":"null"}],"title":"Locale Code"},"content_template_id":{"anyOf":[{"type":"integer","exclusiveMinimum":0.0},{"type":"null"}],"title":"Content Template Id"}},"type":"object","title":"TaskAutomationUpdate"},"TaskCreate":{"properties":{"title":{"type":"string","maxLength":255,"minLength":1,"title":"Title"},"description":{"anyOf":[{"type":"string","maxLength":10000},{"type":"null"}],"title":"Description"},"status":{"type":"string","enum":["new","in_progress","finished","inactive","archived"],"title":"Status","default":"new"},"type":{"type":"string","enum":["task","chat","button","request"],"title":"Type","default":"task"},"client_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Client Id"},"project_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Project Id"},"topic_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Topic Id"},"is_important":{"type":"boolean","title":"Is Important","default":false},"is_extra":{"type":"boolean","title":"Is Extra","default":false},"date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Date"},"due_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Due Date"},"has_due_date":{"type":"integer","title":"Has Due Date","default":0},"estimation":{"anyOf":[{"type":"integer","maximum":2147483647.0,"minimum":0.0},{"type":"null"}],"title":"Estimation"},"assignees":{"items":{"type":"integer"},"type":"array","maxItems":100,"title":"Assignees"},"custom_fields":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Custom Fields"},"workflow_role_ids":{"anyOf":[{"items":{"type":"integer"},"type":"array","maxItems":50},{"type":"null"}],"title":"Workflow Role Ids"}},"type":"object","required":["title"],"title":"TaskCreate"},"TaskOut":{"properties":{"id":{"type":"integer","title":"Id"},"client_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Client Id"},"project_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Project Id"},"project_status_from":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Project Status From"},"topic_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Topic Id"},"title":{"type":"string","title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"status":{"type":"string","title":"Status"},"type":{"type":"string","title":"Type"},"is_important":{"type":"boolean","title":"Is Important","default":false},"is_extra":{"type":"boolean","title":"Is Extra","default":false},"is_recurring":{"type":"integer","title":"Is Recurring","default":0},"date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Date"},"due_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Due Date"},"finished_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Finished At"},"has_due_date":{"type":"integer","title":"Has Due Date","default":0},"estimation":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Estimation"},"timezone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Timezone"},"tracked_time":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Tracked Time"},"assignees":{"items":{"type":"integer"},"type":"array","title":"Assignees"},"checklist":{"anyOf":[{"additionalProperties":true,"type":"object"},{"items":{},"type":"array"},{"type":"null"}],"title":"Checklist"},"custom_fields":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Custom Fields"},"workflow_role_ids":{"items":{"type":"integer"},"type":"array","title":"Workflow Role Ids"},"recurrence_rule":{"anyOf":[{"$ref":"#/components/schemas/RecurrenceRuleOut"},{"type":"null"}]},"comments":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Comments"},"comments_truncated":{"type":"boolean","title":"Comments Truncated","default":false},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"}},"type":"object","required":["id","title","status","type"],"title":"TaskOut","examples":[{"assignees":[42,43],"client_id":1234,"comments":[{"id":1,"message":"Waiting on bank statement","person_id":42}],"comments_truncated":false,"custom_fields":{"risk_level":"medium"},"date":"2026-04-01T00:00:00","description":"Prepare and submit VAT return","due_date":"2026-04-20T23:59:59","estimation":3600,"has_due_date":1,"id":98765,"is_extra":false,"is_important":false,"is_recurring":1,"project_id":55,"project_status_from":"2026-01-01T00:00:00","recurrence_rule":{"due_calc_type":"calendar_days","due_count_days":20,"has_due_date":true,"interval":1,"shift_to_workday":1,"type":"quarterly"},"status":"in_progress","timezone":"Europe/Tallinn","title":"Quarterly VAT declaration","topic_id":9,"type":"task"}]},"TaskRelationCreate":{"properties":{"task_id":{"type":"integer","exclusiveMinimum":0.0,"title":"Task Id"},"depends_on_id":{"type":"integer","exclusiveMinimum":0.0,"title":"Depends On Id"}},"type":"object","required":["task_id","depends_on_id"],"title":"TaskRelationCreate"},"TaskRelationOut":{"properties":{"id":{"type":"integer","title":"Id"},"task_id":{"type":"integer","title":"Task Id"},"depends_on_id":{"type":"integer","title":"Depends On Id"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"}},"type":"object","required":["id","task_id","depends_on_id"],"title":"TaskRelationOut"},"TaskUpdate":{"properties":{"title":{"anyOf":[{"type":"string","maxLength":255,"minLength":1},{"type":"null"}],"title":"Title"},"description":{"anyOf":[{"type":"string","maxLength":10000},{"type":"null"}],"title":"Description"},"status":{"anyOf":[{"type":"string","enum":["new","in_progress","finished","inactive","archived"]},{"type":"null"}],"title":"Status"},"client_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Client Id"},"project_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Project Id"},"topic_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Topic Id"},"is_important":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Important"},"is_extra":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Extra"},"date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Date"},"due_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Due Date"},"has_due_date":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Has Due Date"},"estimation":{"anyOf":[{"type":"integer","maximum":2147483647.0,"minimum":0.0},{"type":"null"}],"title":"Estimation"},"assignees":{"anyOf":[{"items":{"type":"integer"},"type":"array","maxItems":100},{"type":"null"}],"title":"Assignees"},"custom_fields":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Custom Fields"},"workflow_role_ids":{"anyOf":[{"items":{"type":"integer"},"type":"array","maxItems":50},{"type":"null"}],"title":"Workflow Role Ids"}},"type":"object","title":"TaskUpdate"},"TaxOut":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"},"status":{"type":"string","title":"Status"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"percent":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Percent"},"rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Rate"},"effective_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Effective Rate"},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"},"ext_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ext Id"},"ext_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ext Code"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"}},"type":"object","required":["id","name","status"],"title":"TaxOut"},"TaxUpdate":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":255,"minLength":1},{"type":"null"}],"title":"Name"},"status":{"anyOf":[{"type":"string","enum":["active","inactive"]},{"type":"null"}],"title":"Status"},"description":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Description"},"percent":{"anyOf":[{"type":"string","maxLength":10},{"type":"null"}],"title":"Percent"},"rate":{"anyOf":[{"type":"number","minimum":0.0},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Rate"},"ext_code":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Ext Code"}},"type":"object","title":"TaxUpdate"},"TimeEntryCreate":{"properties":{"task_id":{"type":"integer","exclusiveMinimum":0.0,"title":"Task Id","description":"Task this time entry belongs to"},"person_id":{"type":"integer","exclusiveMinimum":0.0,"title":"Person Id","description":"Person who logged this time"},"start":{"type":"string","format":"date-time","title":"Start","description":"Start time (ISO 8601)"},"end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"End","description":"End time (ISO 8601)"},"duration":{"anyOf":[{"type":"integer","maximum":2147483647.0,"minimum":0.0},{"type":"null"}],"title":"Duration","description":"Duration in seconds"},"billable":{"type":"integer","title":"Billable","default":1},"description":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Description"}},"type":"object","required":["task_id","person_id","start"],"title":"TimeEntryCreate"},"TimeEntryOut":{"properties":{"id":{"type":"integer","title":"Id"},"task_id":{"type":"integer","title":"Task Id"},"task_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Task Name"},"client_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Client Id"},"topic_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Topic Id"},"person_id":{"type":"integer","title":"Person Id"},"start":{"type":"string","format":"date-time","title":"Start"},"end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"End"},"duration":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Duration"},"billable":{"type":"integer","title":"Billable","default":1},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"}},"type":"object","required":["id","task_id","person_id","start"],"title":"TimeEntryOut"},"TimeEntryUpdate":{"properties":{"start":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Start"},"end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"End"},"duration":{"anyOf":[{"type":"integer","maximum":2147483647.0,"minimum":0.0},{"type":"null"}],"title":"Duration"},"billable":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Billable"},"description":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Description"}},"type":"object","title":"TimeEntryUpdate"},"TopicCreate":{"properties":{"name":{"type":"string","maxLength":255,"minLength":1,"title":"Name"},"status":{"type":"string","enum":["active","inactive"],"title":"Status","default":"active"},"billable":{"type":"boolean","title":"Billable","default":true},"color":{"anyOf":[{"type":"string","maxLength":10},{"type":"null"}],"title":"Color"}},"type":"object","required":["name"],"title":"TopicCreate"},"TopicOut":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"},"status":{"type":"string","title":"Status"},"billable":{"type":"boolean","title":"Billable","default":true},"color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Color"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"}},"type":"object","required":["id","name","status"],"title":"TopicOut"},"TopicUpdate":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":255,"minLength":1},{"type":"null"}],"title":"Name"},"status":{"anyOf":[{"type":"string","enum":["active","inactive"]},{"type":"null"}],"title":"Status"},"billable":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Billable"},"color":{"anyOf":[{"type":"string","maxLength":10},{"type":"null"}],"title":"Color"}},"type":"object","title":"TopicUpdate"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"WorkflowRoleCreate":{"properties":{"name":{"type":"string","maxLength":100,"minLength":1,"title":"Name"},"color":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"title":"Color"},"sort_order":{"type":"integer","minimum":0.0,"title":"Sort Order","default":0}},"type":"object","required":["name"],"title":"WorkflowRoleCreate"},"WorkflowRoleOut":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"},"color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Color"},"sort_order":{"type":"integer","title":"Sort Order"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"}},"type":"object","required":["id","name","sort_order"],"title":"WorkflowRoleOut"},"WorkflowRoleUpdate":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":100,"minLength":1},{"type":"null"}],"title":"Name"},"color":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"title":"Color"},"sort_order":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Sort Order"}},"type":"object","title":"WorkflowRoleUpdate"}},"securitySchemes":{"CompanyUUID":{"type":"apiKey","description":"Company UUID (get from Settings → API)","in":"header","name":"X-Uku-Company"},"ApiKey":{"type":"apiKey","description":"API key (format: uku_live_...)","in":"header","name":"X-API-Key"}}},"x-tagGroups":[{"name":"Clients & CRM","tags":["Clients","Client Groups","Client Members","Contacts","Contracts","Monitors"]},{"name":"Tasks & Time","tags":["Tasks","Task Relations","Task Automations","Time Entries","Calendar","Delegations","Flextime"]},{"name":"Billing","tags":["Invoices","Invoice Sellers","Budgets","Reclaims","Taxes","Products","Product Fields","Suppliers"]},{"name":"Workflow & Organization","tags":["Projects","Members","Roles","Workflow Roles","Agreements","Topics"]},{"name":"Content & Configuration","tags":["Notes","Content Templates","Custom Fields","Attachments"]},{"name":"Platform","tags":["Authentication","Health","Documentation"]}],"tags":[{"name":"Clients"},{"name":"Client Groups"},{"name":"Client Members"},{"name":"Contacts"},{"name":"Contracts"},{"name":"Monitors"},{"name":"Tasks"},{"name":"Task Relations"},{"name":"Task Automations"},{"name":"Time Entries"},{"name":"Calendar"},{"name":"Delegations"},{"name":"Flextime"},{"name":"Invoices"},{"name":"Invoice Sellers"},{"name":"Budgets"},{"name":"Reclaims"},{"name":"Taxes"},{"name":"Products"},{"name":"Product Fields"},{"name":"Suppliers"},{"name":"Projects"},{"name":"Members"},{"name":"Roles"},{"name":"Workflow Roles"},{"name":"Agreements"},{"name":"Topics"},{"name":"Notes"},{"name":"Content Templates"},{"name":"Custom Fields"},{"name":"Attachments"},{"name":"Authentication"},{"name":"Health"},{"name":"Documentation"}]}