{"openapi":"3.1.0","info":{"title":"Callback API","description":"Director–Talent platform. Surfaces: /v1/public, /v1/app, /v1/admin.","license":{"name":""},"version":"0.1.0"},"paths":{"/v1/admin/accounts/{id}":{"get":{"tags":["staff"],"summary":"Read-only account lookup by id (FR-ADM-02, `ADMIN` only; the opening is audited). The phone is not\npart of this view.","operationId":"admin_account","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminAccountView"}}}},"404":{"description":""}}}},"/v1/admin/audit":{"get":{"tags":["admin"],"summary":"Search the audit log within the caller's scope.","operationId":"query","parameters":[{"name":"eventType","in":"query","description":"Event type (`config.param_changed`) or access kind (`AUDIT_QUERY`).","required":false,"schema":{"type":"string"}},{"name":"scope","in":"query","description":"`BUSINESS` or `TECHNICAL` (Super Admin only; Admin always gets `BUSINESS`).","required":false,"schema":{"type":"string"}},{"name":"actorAdminUserId","in":"query","required":false,"schema":{"type":"string","format":"uuid"}},{"name":"from","in":"query","description":"RFC 3339 instants.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"to","in":"query","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"cursor","in":"query","required":false,"schema":{"type":"string"}},{"name":"limit","in":"query","description":"1–100, default 50.","required":false,"schema":{"type":"integer","format":"int32","minimum":0}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuditPage"}}}},"400":{"description":""},"403":{"description":""},"422":{"description":""}}}},"/v1/admin/auth/login":{"post":{"tags":["staff"],"summary":"Staff login, step 1 (email + password) → `TOTP` or `TOTP_SETUP`.","operationId":"staff_login","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StaffLoginRequest"}}},"required":true},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginStep"}}}},"401":{"description":"INVALID_CREDENTIALS"}}}},"/v1/admin/auth/logout":{"post":{"tags":["staff"],"summary":"End the staff session; clears `cc_admin`.","operationId":"staff_logout","responses":{"204":{"description":""}}}},"/v1/admin/auth/password":{"post":{"tags":["staff"],"summary":"A staff member changes their own password; other staff sessions end.","operationId":"staff_password","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StaffPasswordRequest"}}},"required":true},"responses":{"204":{"description":""}}}},"/v1/admin/auth/session":{"get":{"tags":["staff"],"summary":"The current staff session.","operationId":"staff_session","responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StaffSessionView"}}}},"401":{"description":""}}}},"/v1/admin/auth/totp":{"post":{"tags":["staff"],"summary":"Staff login, step 2 (TOTP) → the session; sets `cc_admin`.","operationId":"staff_totp","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StaffTotpRequest"}}},"required":true},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StaffSessionView"}}}},"401":{"description":""}}}},"/v1/admin/config/catalogs":{"get":{"tags":["admin"],"summary":"Every catalog with its counts.","operationId":"list","responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CatalogList"}}}},"403":{"description":""}}}},"/v1/admin/config/catalogs/{name}":{"get":{"tags":["admin"],"summary":"One catalog with every value, hidden ones included.","operationId":"detail","parameters":[{"name":"name","in":"path","description":"Catalog name","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CatalogDetail"}}}},"403":{"description":""},"404":{"description":""}}}},"/v1/admin/config/catalogs/{name}/values":{"post":{"tags":["admin"],"summary":"Add a value with its first bilingual label (a value is visible only with both labels — CON-04).","operationId":"add_value","parameters":[{"name":"name","in":"path","description":"Catalog name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NewValue"}}},"required":true},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CatalogChange"}}}},"403":{"description":""},"404":{"description":""},"409":{"description":""},"422":{"description":""}}}},"/v1/admin/config/catalogs/{name}/values/{code}/hide":{"post":{"tags":["admin"],"summary":"Hide a value: old records keep it, new data cannot choose it. System reasons are never hidden.","operationId":"hide","parameters":[{"name":"name","in":"path","description":"Catalog name","required":true,"schema":{"type":"string"}},{"name":"code","in":"path","description":"Value code","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Hide"}}},"required":true},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CatalogChange"}}}},"403":{"description":""},"404":{"description":""},"409":{"description":""},"422":{"description":""}}}},"/v1/admin/config/catalogs/{name}/values/{code}/label":{"put":{"tags":["admin"],"summary":"Relabel a value: a new label version; the old wording stays readable for evidence (CG-7).","operationId":"relabel","parameters":[{"name":"name","in":"path","description":"Catalog name","required":true,"schema":{"type":"string"}},{"name":"code","in":"path","description":"Value code","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Relabel"}}},"required":true},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CatalogChange"}}}},"403":{"description":""},"404":{"description":""},"409":{"description":""},"422":{"description":""}}}},"/v1/admin/config/holidays":{"get":{"tags":["admin"],"summary":"The entries of one year, and whether next year is still empty.","operationId":"list","parameters":[{"name":"year","in":"query","description":"Calendar year (VN); default the current year.","required":false,"schema":{"type":"integer","format":"int32"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HolidayList"}}}},"403":{"description":""}}},"post":{"tags":["admin"],"summary":"Add an entry.","operationId":"create","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NewHoliday"}}},"required":true},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HolidayChange"}}}},"403":{"description":""},"409":{"description":""},"422":{"description":""}}}},"/v1/admin/config/holidays/{id}":{"delete":{"tags":["admin"],"summary":"Remove an entry (the date becomes an ordinary day under CFG-31).","operationId":"remove","parameters":[{"name":"id","in":"path","description":"Entry id","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HolidayChange"}}}},"403":{"description":""},"404":{"description":""}}}},"/v1/admin/config/params":{"get":{"tags":["admin"],"summary":"All parameters the caller may see, with their editable flag (Admin never receives *Technical*).","operationId":"list","responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ParamList"}}}},"403":{"description":""}}}},"/v1/admin/config/params/{key}":{"put":{"tags":["admin"],"summary":"Save a new version of a parameter.","operationId":"save","parameters":[{"name":"key","in":"path","description":"Parameter key","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SaveBody"}}},"required":true},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SaveOutcome"}}}},"403":{"description":""},"404":{"description":""},"409":{"description":""},"422":{"description":""}}}},"/v1/admin/config/params/{key}/history":{"get":{"tags":["admin"],"summary":"Every version of a parameter, newest first.","operationId":"history","parameters":[{"name":"key","in":"path","description":"Parameter key, for example CFG-55","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HistoryView"}}}},"403":{"description":""},"404":{"description":""}}}},"/v1/admin/dashboard":{"get":{"tags":["admin"],"summary":"The cards of the caller's role.","operationId":"get","responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Dashboard"}}}},"403":{"description":""}}}},"/v1/admin/notifications":{"get":{"tags":["notifications"],"summary":"The staff member's inbox, newest first.","operationId":"staff_inbox","parameters":[{"name":"cursor","in":"query","description":"Opaque cursor from the previous page.","required":false,"schema":{"type":"string"}},{"name":"limit","in":"query","description":"Page size, 1–100 (default 20).","required":false,"schema":{"type":"integer","format":"int32","minimum":0}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InboxPage"}}}},"400":{"description":""},"401":{"description":""}}}},"/v1/admin/notifications/deliveries":{"get":{"tags":["notifications"],"summary":"The delivery log for \"did not receive\" complaints (FR-NTF-06), Admin only. Destinations are\nmasked; each lookup is audited as `DELIVERY_LOOKUP`.","operationId":"lookup_deliveries","parameters":[{"name":"destination","in":"query","description":"A phone number or an email address (matched through its keyed hash; never stored by the lookup).","required":false,"schema":{"type":"string"}},{"name":"type","in":"query","description":"A notification type id.","required":false,"schema":{"type":"string"}},{"name":"sourceType","in":"query","description":"`<schema>.<table>` of the source record.","required":false,"schema":{"type":"string"}},{"name":"sourceId","in":"query","required":false,"schema":{"type":"string","format":"uuid"}},{"name":"from","in":"query","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"to","in":"query","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"limit","in":"query","description":"1–200 (default 100).","required":false,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Deliveries"}}}},"400":{"description":""},"401":{"description":""},"403":{"description":""}}}},"/v1/admin/notifications/read-all":{"post":{"tags":["notifications"],"summary":"Mark the whole staff inbox read.","operationId":"staff_read_all","responses":{"204":{"description":""},"401":{"description":""}}}},"/v1/admin/notifications/{id}/read":{"post":{"tags":["notifications"],"summary":"Mark one staff inbox item read.","operationId":"staff_read_one","parameters":[{"name":"id","in":"path","description":"Inbox item id","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"204":{"description":""},"401":{"description":""},"404":{"description":""}}}},"/v1/admin/ops/dead-letters":{"get":{"tags":["admin"],"summary":"Unresolved dead letters, newest first.","operationId":"dead_letters","parameters":[{"name":"cursor","in":"query","description":"Opaque cursor from the previous page.","required":false,"schema":{"type":"string"}},{"name":"limit","in":"query","description":"Page size, 1–100 (default 20).","required":false,"schema":{"type":"integer","format":"int32","minimum":0}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page_DeadLetterView"}}}},"403":{"description":""}}}},"/v1/admin/ops/dead-letters/{job_id}/retry":{"post":{"tags":["admin"],"summary":"Retry a dead-lettered job (operator action, audited).","operationId":"retry_dead_letter","parameters":[{"name":"job_id","in":"path","description":"The dead-lettered job","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RetryOutcome"}}}},"403":{"description":""},"404":{"description":""}}}},"/v1/admin/ops/jobs/summary":{"get":{"tags":["admin"],"summary":"Per-lane queue depth, dead letters and lag (2.03 §5.8).","operationId":"jobs_summary","responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobsSummary"}}}},"403":{"description":""}}}},"/v1/admin/ops/maintenance":{"get":{"tags":["admin"],"summary":"Whether maintenance mode is on.","operationId":"maintenance_state","responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MaintenanceState"}}}},"403":{"description":""}}},"put":{"tags":["admin"],"summary":"Switch maintenance mode on or off (a new version of `ops.maintenanceMode`, audited as TECHNICAL).","operationId":"set_maintenance","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MaintenanceToggle"}}},"required":true},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MaintenanceState"}}}},"403":{"description":""},"422":{"description":""}}}},"/v1/admin/queues":{"get":{"tags":["work-queues"],"summary":"Queue badges: open items per queue the caller may see, by SLA state (NFR-AVL-02).","operationId":"queues","responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/QueueCounts"}}}}},"401":{"description":""},"403":{"description":""}}}},"/v1/admin/queues/compliance":{"get":{"tags":["work-queues"],"summary":"The FR-ADM-11 SLA compliance report (Admin).","operationId":"compliance","parameters":[{"name":"from","in":"query","description":"First local VN date of finish (inclusive).","required":true,"schema":{"type":"string","format":"date"}},{"name":"to","in":"query","description":"Last local VN date of finish (inclusive); at most 366 days after `from`.","required":true,"schema":{"type":"string","format":"date"}},{"name":"period","in":"query","description":"`DAY`, `WEEK` (Monday start) or `MONTH`; default `DAY`.","required":false,"schema":{"$ref":"#/components/schemas/Period"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ComplianceReport"}}}},"400":{"description":""},"403":{"description":""},"422":{"description":""}}}},"/v1/admin/queues/{queue}/items":{"get":{"tags":["work-queues"],"summary":"A page of one queue in the default order (2.02 §5.7). `queue` is the Section 9.3 screen id.","operationId":"list","parameters":[{"name":"queue","in":"path","description":"Section 9.3 screen id, for example 5a","required":true,"schema":{"type":"string"}},{"name":"state","in":"query","description":"Comma-separated item states; default `OPEN,CLAIMED`.","required":false,"schema":{"type":"string"}},{"name":"slaState","in":"query","description":"`IN_TIME`, `DUE_SOON`, `OVERDUE` or `NOT_STARTED`.","required":false,"schema":{"type":"string"}},{"name":"assignee","in":"query","description":"`me`, `unassigned` or a staff id.","required":false,"schema":{"type":"string"}},{"name":"itemType","in":"query","description":"One item type of the queue.","required":false,"schema":{"type":"string"}},{"name":"cursor","in":"query","description":"Opaque cursor from the previous page.","required":false,"schema":{"type":"string"}},{"name":"limit","in":"query","description":"Page size, 1–100 (default 20).","required":false,"schema":{"type":"integer","format":"int32","minimum":0}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListPage"}}}},"400":{"description":""},"403":{"description":""},"404":{"description":""},"422":{"description":""}}}},"/v1/admin/staff":{"get":{"tags":["staff"],"summary":"Staff accounts (Super Admin).","operationId":"staff_list","responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/StaffMember"}}}}}}},"post":{"tags":["staff"],"summary":"Create a staff account (Super Admin). Audited.","operationId":"staff_create","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StaffCreateRequest"}}},"required":true},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StaffMember"}}}},"409":{"description":"STAFF_EMAIL_TAKEN"}}}},"/v1/admin/staff/{id}":{"patch":{"tags":["staff"],"summary":"Change a staff account's role or lock state (Super Admin). Ends its sessions. Audited.","operationId":"staff_patch","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StaffPatchRequest"}}},"required":true},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StaffMember"}}}}}}},"/v1/admin/staff/{id}/reset-totp":{"post":{"tags":["staff"],"summary":"Reset a staff account's TOTP factor (Super Admin). Audited.","operationId":"staff_reset_totp","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StaffMember"}}}}}}},"/v1/admin/work-items/{id}":{"get":{"tags":["work-queues"],"summary":"The generic item envelope and its history.","operationId":"detail","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ItemDetail"}}}},"403":{"description":""},"404":{"description":""}}}},"/v1/admin/work-items/{id}/assign":{"post":{"tags":["work-queues"],"summary":"Assign an item to a staff member (Admin only).","operationId":"assign","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssignBody"}}},"required":true},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkItem"}}}},"403":{"description":""},"404":{"description":""},"409":{"description":""},"422":{"description":""}}}},"/v1/admin/work-items/{id}/claim":{"post":{"tags":["work-queues"],"summary":"Claim an item (a courtesy lock visible to peers).","operationId":"claim","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkItem"}}}},"403":{"description":""},"404":{"description":""},"409":{"description":""}}}},"/v1/admin/work-items/{id}/release":{"post":{"tags":["work-queues"],"summary":"Release a claimed item (the holder, or an Admin).","operationId":"release","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkItem"}}}},"403":{"description":""},"404":{"description":""},"409":{"description":""}}}},"/v1/admin/work-items/{id}/reprioritize":{"post":{"tags":["work-queues"],"summary":"Change an item's priority (Admin). Lowering needs a reason (FR-RPT-02a).","operationId":"reprioritize","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReprioritizeBody"}}},"required":true},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkItem"}}}},"403":{"description":""},"404":{"description":""},"409":{"description":""},"422":{"description":""}}}},"/v1/app/agreements/platform-nda/current":{"get":{"tags":["agreements"],"summary":"The current platform NDA (to read and sign).","operationId":"current_document","responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlatformDocument"}}}},"503":{"description":"LEGAL_DOCUMENTS_NOT_PUBLISHED"}}}},"/v1/app/agreements/platform-nda/signatures":{"post":{"tags":["agreements"],"summary":"Re-sign the platform NDA after a new version (FR-AUT-06), `SELF` route only.","operationId":"sign","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignRequest"}}},"required":true},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignedResponse"}}}},"409":{"description":"PLATFORM_NDA_ALREADY_SIGNED"}}}},"/v1/app/agreements/platform-nda/status":{"get":{"tags":["agreements"],"summary":"`platformNdaStatus` of the account (FR-AUT-06, FR-AUT-03b).","operationId":"status","responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StatusView"}}}}}}},"/v1/app/auth/login":{"post":{"tags":["identity"],"summary":"Password login by phone or email (FR-AUT-07). Every failure is `INVALID_CREDENTIALS`.","operationId":"login_handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginRequest"}}},"required":true},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SessionResponse"}}}},"401":{"description":"INVALID_CREDENTIALS"},"429":{"description":"LOGIN_TEMPORARILY_LOCKED"}}}},"/v1/app/auth/logout":{"post":{"tags":["identity"],"summary":"End the current session (also during registration). Clears the web cookie.","operationId":"logout","responses":{"204":{"description":""}}}},"/v1/app/auth/logout-others":{"post":{"tags":["identity"],"summary":"Log out every other device and session of the account (FR-AUT-11).","operationId":"logout_others","responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EndedResponse"}}}}}}},"/v1/app/auth/otp":{"post":{"tags":["identity"],"summary":"Issue an OTP for `REGISTER` (the same answer and timing for every valid number — AC-63(a)).\n`PASSWORD_RESET` is not available in this release; any other purpose, `LOGIN` included, is refused\n(AC-61(a)). The code is verified by the registration step (`/v1/app/onboarding/phone/verify`).","operationId":"otp_issue","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OtpIssueRequest"}}},"required":true},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IssuedOtp"}}}}}}},"/v1/app/auth/phone-reverification/otp":{"post":{"tags":["identity"],"summary":"FR-AUT-07c: send the periodic-verification OTP to the registered phone.","operationId":"reverify_otp","responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IssuedOtp"}}}}}}},"/v1/app/auth/phone-reverification/verify":{"post":{"tags":["identity"],"summary":"FR-AUT-07c: verify the OTP; the session returns to `FULL`.","operationId":"reverify_verify","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OtpVerifyRequest"}}},"required":true},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReverifiedResponse"}}}}}}},"/v1/app/auth/refresh":{"post":{"tags":["identity"],"summary":"Rotate a mobile refresh token (FR-AUT-11); re-decides the scope (FR-AUT-07c). Needs `X-Device-Id`.","operationId":"refresh_handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RefreshRequest"}}},"required":true},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SessionResponse"}}}},"401":{"description":"INVALID_REFRESH_TOKEN"}}}},"/v1/app/auth/session":{"get":{"tags":["identity"],"summary":"The current session (allowed in restricted scopes and during registration).","operationId":"session_info","responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SessionInfo"}}}},"401":{"description":""}}}},"/v1/app/me":{"get":{"tags":["identity"],"summary":"The account basics (`GET /v1/app/me`). Never the phone number.","operationId":"me","responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MeResponse"}}}}}},"patch":{"tags":["identity"],"summary":"Account settings: language (FR-I18N-01) and theme (UI-02).","operationId":"me_patch","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MePatch"}}},"required":true},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MeResponse"}}}}}}},"/v1/app/me/devices":{"get":{"tags":["identity"],"summary":"The account's devices (FR-AUT-11, FR-AUT-15).","operationId":"devices","responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/DeviceView"}}}}}}}},"/v1/app/me/devices/{id}":{"delete":{"tags":["identity"],"summary":"Remote logout of one device (FR-AUT-11). Audited.","operationId":"delete_device","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"204":{"description":""},"404":{"description":""}}}},"/v1/app/me/password":{"put":{"tags":["identity"],"summary":"Password change (FR-AUT-07f): every other session ends.","operationId":"change_password","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PasswordChangeRequest"}}},"required":true},"responses":{"204":{"description":""},"401":{"description":"INVALID_CREDENTIALS"}}}},"/v1/app/notification-settings":{"get":{"tags":["notifications"],"summary":"The generated notification settings of the account (2.01 §5.2). Account-level: one setting\ncovers every profile (FR-AUT-18a).","operationId":"get_settings","responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Settings"}}}},"401":{"description":""}}},"put":{"tags":["notifications"],"summary":"Change switches. A pair whose types are all mandatory, and any `GUARDIAN` or `STAFF` pair, is\nrefused with `422 NOTIFICATION_MANDATORY` (FR-NTF-04, AC-44); an unknown pair with\n`422 NOTIFICATION_SETTING_UNKNOWN`.","operationId":"put_settings","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SettingsUpdate"}}},"required":true},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Settings"}}}},"400":{"description":""},"401":{"description":""},"422":{"description":""}}}},"/v1/app/notifications":{"get":{"tags":["notifications"],"summary":"The account's inbox (FR-NTF-05), newest first, in the request language.","operationId":"list_inbox","parameters":[{"name":"cursor","in":"query","description":"Opaque cursor from the previous page.","required":false,"schema":{"type":"string"}},{"name":"limit","in":"query","description":"Page size, 1–100 (default 20).","required":false,"schema":{"type":"integer","format":"int32","minimum":0}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InboxPage"}}}},"400":{"description":""},"401":{"description":""}}}},"/v1/app/notifications/read-all":{"post":{"tags":["notifications"],"summary":"Mark the whole inbox read.","operationId":"read_all","responses":{"204":{"description":""},"401":{"description":""}}}},"/v1/app/notifications/{id}/read":{"post":{"tags":["notifications"],"summary":"Mark one inbox item read.","operationId":"read_one","parameters":[{"name":"id","in":"path","description":"Inbox item id","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"204":{"description":""},"401":{"description":""},"404":{"description":""}}}},"/v1/app/onboarding":{"get":{"tags":["onboarding"],"summary":"The registration of the session: its step and state (resumable at every step — 3.02 §5.1).","operationId":"get_onboarding","responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OnboardingView"}}}}}}},"/v1/app/onboarding/account-type":{"put":{"tags":["onboarding"],"summary":"Step 3: the account type, immutable afterwards (FR-AUT-02).","operationId":"put_account_type","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccountTypeRequest"}}},"required":true},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OnboardingView"}}}},"409":{"description":""}}}},"/v1/app/onboarding/email":{"put":{"tags":["onboarding"],"summary":"Step 2: enter or correct the email; a link is sent (FR-AUT-01b), the previous one becomes invalid.","operationId":"put_email","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailRequest"}}},"required":true},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OnboardingView"}}}},"429":{"description":"EMAIL_LINK_RATE_LIMITED"}}}},"/v1/app/onboarding/email/resend":{"post":{"tags":["onboarding"],"summary":"Step 2: resend the link to the pending address (CFG-83).","operationId":"resend_email","responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OnboardingView"}}}}}}},"/v1/app/onboarding/nda":{"get":{"tags":["onboarding"],"summary":"Step 6: the platform NDA and the Terms / Privacy texts to accept.","operationId":"get_nda","responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NdaStepView"}}}}}}},"/v1/app/onboarding/nda/sign":{"post":{"tags":["onboarding"],"summary":"Step 6 + done: record the Terms/Privacy consent and the self-signed platform NDA (FR-AUT-03,\nFR-AUT-05, FR-SEC-14), complete the registration, activate the profile and publish\n`RegistrationCompleted`.","operationId":"sign_nda","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NdaSignRequest"}}},"required":true},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OnboardingView"}}}},"422":{"description":""}}}},"/v1/app/onboarding/password":{"put":{"tags":["onboarding"],"summary":"Step 5a: the password (Section 4.2.6: 8–64 characters, not the phone number). Repeatable until\nthe NDA is signed.","operationId":"put_password","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PasswordRequest"}}},"required":true},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OnboardingView"}}}},"422":{"description":""}}}},"/v1/app/onboarding/phone":{"post":{"tags":["onboarding"],"summary":"Step 1: send the registration OTP. Every valid number gets the same answer and timing (AC-63(a));\nrefused for everyone while the legal documents are not published (AC-16).","operationId":"phone","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PhoneRequest"}}},"required":true},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IssuedOtp"}}}},"503":{"description":"REGISTRATION_NOT_OPEN"}}}},"/v1/app/onboarding/phone/verify":{"post":{"tags":["onboarding"],"summary":"Step 1: verify the OTP; only then is the number looked up (AC-63(a)).","operationId":"phone_verify","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PhoneVerifyRequest"}}},"required":true},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PhoneVerifiedResponse"}}}}}}},"/v1/app/onboarding/required-fields":{"put":{"tags":["onboarding"],"summary":"Step 4: the Section 4.2.6 required fields; the draft profile is created through Profiles. A talent\nunder 18 is refused (`MINOR_FLOW_NOT_AVAILABLE`, 501).","operationId":"put_required_fields","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RequiredFieldsRequest"}}},"required":true},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OnboardingView"}}}},"422":{"description":""},"501":{"description":"MINOR_FLOW_NOT_AVAILABLE"}}}},"/v1/app/uploads":{"post":{"tags":["media"],"summary":"tus creation.","operationId":"create","parameters":[{"name":"Tus-Resumable","in":"header","description":"1.0.0","required":true,"schema":{"type":"string"}},{"name":"Upload-Length","in":"header","description":"Total size in bytes","required":true,"schema":{"type":"integer","format":"int64","minimum":0}},{"name":"Upload-Metadata","in":"header","description":"asset <base64 asset id>[, filetype <base64>][, duration <base64 ms>]","required":true,"schema":{"type":"string"}}],"responses":{"201":{"description":"Created; Location is the upload URL"},"400":{"description":""},"401":{"description":""},"404":{"description":""},"409":{"description":""},"412":{"description":""},"413":{"description":""},"507":{"description":""}}},"options":{"tags":["media"],"operationId":"discovery","responses":{"204":{"description":"tus discovery: Tus-Version, Tus-Extension, Tus-Max-Chunk-Size"}}}},"/v1/app/uploads/{id}":{"delete":{"tags":["media"],"summary":"tus termination.","operationId":"terminate","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"204":{"description":""},"404":{"description":""}}},"head":{"tags":["media"],"summary":"tus offset.","operationId":"status","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Upload-Offset, Upload-Length, Upload-Expires"},"404":{"description":""},"410":{"description":""}}},"patch":{"tags":["media"],"summary":"tus append.","operationId":"append","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"Upload-Offset","in":"header","description":"Offset of this chunk","required":true,"schema":{"type":"integer","format":"int64","minimum":0}}],"requestBody":{"content":{"application/offset+octet-stream":{"schema":{"type":"array","items":{"type":"integer","format":"int32","minimum":0}}}},"required":true},"responses":{"204":{"description":"New Upload-Offset"},"404":{"description":""},"409":{"description":""},"410":{"description":""},"413":{"description":""},"415":{"description":""}}}},"/v1/media/p/{asset_id}/{variant}":{"get":{"tags":["media"],"summary":"The authorizing proxy: the class authorizer decides on **every** request.","operationId":"proxy","parameters":[{"name":"asset_id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"variant","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The media, Cache-Control: private, no-store"},"206":{"description":""},"403":{"description":""},"404":{"description":""},"416":{"description":""}}}},"/v1/media/pub/{asset_id}/{variant}":{"get":{"tags":["media"],"summary":"A public asset (`PUBLIC_ASSET`).","operationId":"public","parameters":[{"name":"asset_id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"variant","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The image"},"206":{"description":""},"404":{"description":""},"416":{"description":""}}}},"/v1/media/s/{key}":{"get":{"tags":["media"],"summary":"A signed URL (`PROFILE_PHOTO` of unrestricted profiles).","operationId":"signed","parameters":[{"name":"key","in":"path","description":"Object key","required":true,"schema":{"type":"string"}},{"name":"exp","in":"query","description":"Expiry, Unix seconds.","required":true,"schema":{"type":"integer","format":"int64"}},{"name":"sig","in":"query","description":"`b64url(HMAC-SHA256(k, path ‖ \"\\n\" ‖ exp))`.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The image"},"206":{"description":""},"403":{"description":""},"404":{"description":""},"416":{"description":""}}}},"/v1/public/email-verifications/confirm":{"post":{"tags":["identity"],"summary":"Confirm an email link. Sent only when the person presses *Confirm*; returns the outcome only.","operationId":"confirm_email","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConfirmRequest"}}},"required":true},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConfirmResponse"}}}}}}},"/v1/public/email-verifications/landing":{"get":{"tags":["identity"],"summary":"The landing page of the link: one *Confirm* button, no account data. The token is in the URL\nfragment, so it never reaches a server log; the page posts it only when the button is pressed.","operationId":"landing","responses":{"200":{"description":"HTML page"}}}},"/v1/public/legal-documents/{key}":{"get":{"tags":["agreements"],"summary":"The effective Terms of Use, Privacy Policy or platform NDA text (both languages). Public: these\ntexts are shown before registration.","operationId":"legal_document","parameters":[{"name":"key","in":"path","description":"terms · privacy · platform-nda","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LegalDocumentView"}}}},"404":{"description":""}}}}},"components":{"schemas":{"AccountKind":{"type":"string","description":"`identity.account_kind` — never both (FR-AUT-02).","enum":["DIRECTOR","TALENT"]},"AccountTypeRequest":{"type":"object","required":["kind"],"properties":{"kind":{"$ref":"#/components/schemas/AccountKind"}}},"AdminAccountView":{"type":"object","required":["accountId","status","registrationState","emailLoginEligible","phoneState","language","createdAt","deviceCount"],"properties":{"accountId":{"type":"string","format":"uuid"},"accountKind":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/AccountKind"}]},"completedAt":{"type":["string","null"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"deviceCount":{"type":"integer","format":"int64"},"email":{"type":["string","null"]},"emailLoginEligible":{"type":"boolean"},"emailVerifiedAt":{"type":["string","null"],"format":"date-time"},"language":{"$ref":"#/components/schemas/Lang"},"phoneState":{"type":"string"},"registrationState":{"type":"string"},"status":{"type":"string"},"statusUntil":{"type":["string","null"],"format":"date-time"}}},"AssignBody":{"type":"object","description":"`POST …/assign`.","required":["adminUserId"],"properties":{"adminUserId":{"type":"string","format":"uuid"}}},"AuditPage":{"type":"object","required":["items"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/EntryView"}},"nextCursor":{"type":["string","null"]}}},"Basis":{"type":"string","description":"`workqueue.sla_clock_basis`.","enum":["BUSINESS","WALL_CLOCK"]},"Card":{"type":"object","required":["id","status","detail"],"properties":{"detail":{"type":"object"},"id":{"type":"string"},"status":{"type":"string","description":"`OK`, `INFO`, `WARNING` or `DANGER`."},"value":{"type":["integer","null"],"format":"int64"}}},"CatalogChange":{"type":"object","required":["catalogVersion","value"],"properties":{"catalogVersion":{"type":"integer","format":"int32"},"value":{"$ref":"#/components/schemas/CatalogValueView"}}},"CatalogDetail":{"type":"object","required":["name","adminEditable","version","values"],"properties":{"adminEditable":{"type":"boolean"},"cfgCode":{"type":["string","null"]},"name":{"type":"string"},"values":{"type":"array","items":{"$ref":"#/components/schemas/CatalogValueView"}},"version":{"type":"integer","format":"int32"}}},"CatalogList":{"type":"object","required":["catalogs"],"properties":{"catalogs":{"type":"array","items":{"$ref":"#/components/schemas/CatalogSummary"}}}},"CatalogSummary":{"type":"object","required":["name","adminEditable","version","valueCount","hiddenCount"],"properties":{"adminEditable":{"type":"boolean"},"cfgCode":{"type":["string","null"]},"hiddenCount":{"type":"integer","format":"int64"},"name":{"type":"string"},"valueCount":{"type":"integer","format":"int64"},"version":{"type":"integer","format":"int32"}}},"CatalogValueView":{"type":"object","required":["code","labelVi","labelEn","labelVersion","sortOrder","isSystem","hidden","selectable"],"properties":{"code":{"type":"string"},"hidden":{"type":"boolean"},"hiddenAt":{"type":["string","null"],"format":"date-time"},"isSystem":{"type":"boolean"},"labelEn":{"type":"string"},"labelVersion":{"type":"integer","format":"int32"},"labelVi":{"type":"string"},"parentCode":{"type":["string","null"]},"selectable":{"type":"boolean"},"sortOrder":{"type":"integer","format":"int32"},"successorCode":{"type":["string","null"]}}},"ClientPlatform":{"type":"string","description":"The client kind of a login (`identity.client_device_platform`).","enum":["web","ios","android"]},"ComplianceReport":{"type":"object","description":"The FR-ADM-11 report.","required":["from","to","period","rows","overdue","currentlyOverdue"],"properties":{"currentlyOverdue":{"type":"array","items":{"$ref":"#/components/schemas/OverdueRow"},"description":"Open items that are overdue now."},"from":{"type":"string","format":"date"},"overdue":{"type":"array","items":{"$ref":"#/components/schemas/OverdueRow"},"description":"Finished items of the period that breached."},"period":{"$ref":"#/components/schemas/Period"},"rows":{"type":"array","items":{"$ref":"#/components/schemas/ComplianceRow"}},"to":{"type":"string","format":"date"}}},"ComplianceRow":{"type":"object","description":"One row of the report.","required":["queue","itemType","priority","basis","periodStart","resolved","met","held","heldMet","cancelled"],"properties":{"basis":{"type":"string","description":"`BUSINESS`, `WALL_CLOCK` or `NONE` (no three-state measures — WQ-9)."},"cancelled":{"type":"integer","format":"int64"},"exposureHours":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/Stats","description":"Live-unreviewed exposure of `CASTING_CALL_NEW` / `CASTING_CALL_EDITED`, cancelled included."}]},"handlingHours":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/Stats","description":"Handling time of resolved items on the policy basis."}]},"held":{"type":"integer","format":"int64","description":"Shown separately; judged on the part outside the hold (FR-SEC-11e)."},"heldMet":{"type":"integer","format":"int64"},"itemType":{"type":"string"},"met":{"type":"integer","format":"int64"},"onTimeRate":{"type":["number","null"],"format":"double","description":"`met / resolved`; `None` without resolved items or without an SLA."},"periodStart":{"type":"string","format":"date"},"priority":{"$ref":"#/components/schemas/Priority","description":"The priority the item ended with."},"queue":{"$ref":"#/components/schemas/Queue"},"resolved":{"type":"integer","format":"int64"}}},"ComponentValues":{"type":"object","required":["code","values"],"properties":{"code":{"type":"string"},"values":{"type":"array","items":{"type":"object"}}}},"ComponentView":{"type":"object","description":"One component with its current and default values.","required":["code","valueType","unit","isList","isOptional","values","defaultValues"],"properties":{"code":{"type":"string"},"defaultValues":{"type":"array","items":{"type":"object"}},"durationBasis":{"type":["string","null"]},"isList":{"type":"boolean"},"isOptional":{"type":"boolean"},"unit":{"type":"string"},"valueType":{"type":"string"},"values":{"type":"array","items":{"type":"object"}}}},"ConfirmOutcome":{"type":"string","description":"The outcome shown on the landing page — nothing else (FR-AUT-01b(4)).","enum":["CONFIRMED","EXPIRED","INVALID"]},"ConfirmRequest":{"type":"object","required":["token"],"properties":{"token":{"type":"string"}}},"ConfirmResponse":{"type":"object","required":["outcome"],"properties":{"outcome":{"$ref":"#/components/schemas/ConfirmOutcome"}}},"ConstraintView":{"type":"object","description":"A constraint as the parameter list shows it.","required":["id","textVi","textEn","keys"],"properties":{"id":{"type":"string"},"keys":{"type":"array","items":{"type":"string"}},"textEn":{"type":"string"},"textVi":{"type":"string"}}},"Dashboard":{"type":"object","required":["role","cards"],"properties":{"cards":{"type":"array","items":{"$ref":"#/components/schemas/Card"}},"role":{"type":"string"}}},"DeadLetterView":{"type":"object","required":["deadLetterId","jobId","lane","taskName","attempts","deadLetteredAt","errorText"],"properties":{"attempts":{"type":"integer","format":"int32"},"deadLetterId":{"type":"string","format":"uuid"},"deadLetteredAt":{"type":"string","format":"date-time"},"errorText":{"type":"string","description":"The final error, PII-scrubbed by the runner (2.03 §9)."},"jobId":{"type":"string","format":"uuid"},"lane":{"type":"string"},"taskName":{"type":"string"}}},"Deliveries":{"type":"object","required":["items"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/Delivery"}}}},"Delivery":{"type":"object","description":"One delivery: the masked destination only.","required":["deliveryId","notificationId","typeId","sourceType","sourceId","leg","channel","status","attempts","createdAt"],"properties":{"acceptedAt":{"type":["string","null"],"format":"date-time"},"attempts":{"type":"integer","format":"int32"},"channel":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"deliveryId":{"type":"string","format":"uuid"},"destinationMasked":{"type":["string","null"]},"fallbackOf":{"type":["string","null"],"format":"uuid"},"finalAt":{"type":["string","null"],"format":"date-time"},"lastErrorCode":{"type":["string","null"]},"leg":{"type":"string","description":"`PUSH`, `EMAIL`, `PHONE` (ZNS with its SMS fallback) or `SMS`."},"notificationId":{"type":"string","format":"uuid"},"sourceId":{"type":"string","format":"uuid"},"sourceType":{"type":"string"},"status":{"type":"string"},"typeId":{"type":"string"},"undeliverableReason":{"type":["string","null"]}}},"DeviceView":{"type":"object","required":["deviceId","platform","firstLoginAt","lastLoginAt","current","loggedOut"],"properties":{"approximateLocation":{"type":["string","null"]},"client":{"type":["string","null"]},"current":{"type":"boolean","description":"The device of this session."},"deviceId":{"type":"string","format":"uuid"},"deviceName":{"type":["string","null"]},"firstLoginAt":{"type":"string","format":"date-time"},"lastLoginAt":{"type":"string","format":"date-time"},"loggedOut":{"type":"boolean","description":"Logged out remotely."},"platform":{"$ref":"#/components/schemas/ClientPlatform"}}},"EmailRequest":{"type":"object","required":["email"],"properties":{"email":{"type":"string"}}},"EmailStepView":{"type":"object","required":["confirmed","shared"],"properties":{"address":{"type":["string","null"],"description":"The address the person typed (pending) or confirmed — their own data."},"confirmed":{"type":"boolean"},"linkExpiresAt":{"type":["string","null"],"format":"date-time"},"shared":{"type":"boolean","description":"Only after confirmation: another account also holds this address, so it receives notices\nbut cannot be used to sign in (FR-AUT-07a(1))."}}},"EndedResponse":{"type":"object","required":["sessionsEnded"],"properties":{"sessionsEnded":{"type":"integer","format":"int64","minimum":0}}},"EntryView":{"type":"object","required":["id","occurredAt","scope","category","eventName","actorKind","change","resources"],"properties":{"actorAdminUserId":{"type":["string","null"],"format":"uuid"},"actorKind":{"type":"string"},"actorRole":{"type":["string","null"]},"authority":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/Ref"}]},"category":{"type":"string","description":"`ACTION` or `ACCESS`."},"change":{"type":"object","description":"`{field: {before, after}}` as the writer redacted it."},"eventName":{"type":"string"},"id":{"type":"string","format":"uuid"},"occurredAt":{"type":"string","format":"date-time"},"reasonCode":{"type":["string","null"]},"resources":{"type":"array","items":{"$ref":"#/components/schemas/Ref"}},"scope":{"type":"string"},"systemJob":{"type":["string","null"]}}},"FinishKind":{"type":"string","description":"How a terminal item finished (2.02 §4.1 `finish_kind`).","enum":["RESOLVED","CANCELLED","HELD"]},"Hide":{"type":"object","properties":{"successorCode":{"type":["string","null"],"description":"The value that replaces it (an administrative-unit change of provinces)."}},"additionalProperties":false},"HistoryEntry":{"type":"object","description":"One history row (`work_item_event`).","required":["id","kind","actorKind","at","detail"],"properties":{"actorId":{"type":["string","null"],"format":"uuid"},"actorKind":{"type":"string"},"at":{"type":"string","format":"date-time"},"detail":{"type":"object"},"id":{"type":"string","format":"uuid"},"kind":{"type":"string"}}},"HistoryView":{"type":"object","required":["key","versions"],"properties":{"key":{"type":"string"},"versions":{"type":"array","items":{"$ref":"#/components/schemas/VersionView"}}}},"HolidayChange":{"type":"object","required":["recomputedTimers","warnings"],"properties":{"entry":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/HolidayView"}]},"recomputedTimers":{"type":"integer","format":"int64","minimum":0},"warnings":{"type":"array","items":{"$ref":"#/components/schemas/Warning"}}}},"HolidayList":{"type":"object","required":["year","entries","nextYear","nextYearEmpty"],"properties":{"entries":{"type":"array","items":{"$ref":"#/components/schemas/HolidayView"}},"nextYear":{"type":"integer","format":"int32"},"nextYearEmpty":{"type":"boolean","description":"Next year's calendar is still empty (the dashboard and this screen warn — root §13 Q8)."},"year":{"type":"integer","format":"int32"}}},"HolidayView":{"type":"object","required":["id","date","kind","labelVi","labelEn","createdAt"],"properties":{"createdAt":{"type":"string","format":"date-time"},"createdByAdminUserId":{"type":["string","null"],"format":"uuid"},"date":{"type":"string","format":"date"},"id":{"type":"string","format":"uuid"},"kind":{"type":"string","description":"`HOLIDAY` (non-working day) or `EXTRA_WORKING_DAY` (make-up day with the CFG-31 hours)."},"labelEn":{"type":"string"},"labelVi":{"type":"string"}}},"InboxItem":{"type":"object","description":"One inbox item, rendered in the request language.","required":["id","notificationId","typeId","category","title","body","createdAt"],"properties":{"body":{"type":"string"},"category":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"deepLink":{"type":["string","null"]},"id":{"type":"string","format":"uuid"},"notificationId":{"type":"string","format":"uuid"},"readAt":{"type":["string","null"],"format":"date-time"},"title":{"type":"string"},"typeId":{"type":"string"}}},"InboxPage":{"type":"object","description":"A page of the inbox, newest first.","required":["items","unreadCount"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/InboxItem"}},"nextCursor":{"type":["string","null"]},"unreadCount":{"type":"integer","format":"int64"}}},"IssuedOtp":{"type":"object","description":"An issued challenge (what the client may know).","required":["challengeId","expiresAt"],"properties":{"challengeId":{"type":"string","format":"uuid"},"expiresAt":{"type":"string","format":"date-time"}}},"ItemDetail":{"type":"object","description":"An item with its history (the owner renders the business detail).","required":["item","history"],"properties":{"history":{"type":"array","items":{"$ref":"#/components/schemas/HistoryEntry"}},"item":{"$ref":"#/components/schemas/WorkItem"}}},"ItemState":{"type":"string","description":"`workqueue.work_item_state`.","enum":["OPEN","CLAIMED","RESOLVED","CANCELLED"]},"JobsSummary":{"type":"object","required":["lanes","openDeadLetters"],"properties":{"lanes":{"type":"array","items":{"$ref":"#/components/schemas/LaneSummary"}},"openDeadLetters":{"type":"integer","format":"int64"}}},"LaneSummary":{"type":"object","required":["lane","pending","due","deadLettered","lagSeconds"],"properties":{"deadLettered":{"type":"integer","format":"int64"},"due":{"type":"integer","format":"int64","description":"Pending and already due."},"lagSeconds":{"type":"integer","format":"int64","description":"`jobs_lag_seconds{lane}`: age of the oldest due job."},"lane":{"type":"string"},"pending":{"type":"integer","format":"int64"}}},"Lang":{"type":"string","description":"`kernel.language_code`.","enum":["vi","en"]},"LegalDocumentView":{"type":"object","required":["key","texts"],"properties":{"key":{"type":"string"},"texts":{"type":"array","items":{"$ref":"#/components/schemas/LegalText"}}}},"LegalText":{"type":"object","description":"One language version of a legal text.","required":["templateVersionId","versionNo","language","body","contentHash"],"properties":{"body":{"type":"string"},"contentHash":{"type":"string","description":"SHA-256 of the canonical content shown, hex."},"effectiveFrom":{"type":["string","null"],"format":"date-time"},"language":{"$ref":"#/components/schemas/Lang"},"templateVersionId":{"type":"string","format":"uuid"},"title":{"type":["string","null"]},"versionNo":{"type":"integer","format":"int32"}}},"ListPage":{"type":"object","description":"A page of a queue.","required":["items"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/WorkItem"}},"nextCursor":{"type":["string","null"]}}},"LoginRequest":{"type":"object","required":["identifier","password"],"properties":{"deviceName":{"type":["string","null"]},"identifier":{"type":"string","description":"The phone number or the email."},"password":{"type":"string"},"platform":{"$ref":"#/components/schemas/ClientPlatform"}}},"LoginStep":{"oneOf":[{"type":"object","description":"The account has a TOTP factor: send a code.","required":["challenge","step"],"properties":{"challenge":{"type":"string"},"step":{"type":"string","enum":["TOTP"]}}},{"type":"object","description":"First login: enrol the factor shown, then send a code from it.","required":["challenge","otpauthUri","secret","step"],"properties":{"challenge":{"type":"string"},"otpauthUri":{"type":"string"},"secret":{"type":"string"},"step":{"type":"string","enum":["TOTP_SETUP"]}}}],"description":"The first login step's answer."},"MaintenanceState":{"type":"object","required":["on","version","setAt"],"properties":{"on":{"type":"boolean"},"setAt":{"type":"string","format":"date-time"},"version":{"type":"integer","format":"int32"}}},"MaintenanceToggle":{"type":"object","description":"The toggle. The page text is the Admin-editable content template `ops.maintenanceMessage`\n(2.06 §4.2, root §13 Q36), so the message fields are refused here.","required":["on"],"properties":{"messageEn":{"type":["string","null"]},"messageVi":{"type":["string","null"]},"on":{"type":"boolean"}},"additionalProperties":false},"MePatch":{"type":"object","properties":{"language":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/Lang"}]},"theme":{"type":["string","null"],"description":"`dark` or `light` (UI-02)."}},"additionalProperties":false},"MeResponse":{"type":"object","required":["accountId","emailLoginEligible","language","theme","createdAt"],"properties":{"accountId":{"type":"string","format":"uuid"},"accountKind":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/AccountKind"}]},"createdAt":{"type":"string","format":"date-time"},"email":{"type":["string","null"],"description":"The account's own verified email (never a phone number)."},"emailLoginEligible":{"type":"boolean","description":"FR-AUT-07a, computed: exactly one account holds this verified email."},"language":{"$ref":"#/components/schemas/Lang"},"theme":{"type":"string"}}},"NdaSignRequest":{"type":"object","required":["documentId","language","signatureAssetId","strokes","acceptTerms","acceptPrivacy"],"properties":{"acceptPrivacy":{"type":"boolean"},"acceptTerms":{"type":"boolean"},"documentId":{"type":"string","format":"uuid"},"language":{"$ref":"#/components/schemas/Lang"},"signatureAssetId":{"type":"string","format":"uuid"},"strokes":{"type":"array","items":{"type":"array","items":{"type":"array","items":{"type":"number","format":"double"}}}}}},"NdaStatus":{"type":"string","description":"`platformNdaStatus(account)`.","enum":["CURRENT","RESIGN_NEW_VERSION","SELF_SIGN_AT18","AWAITING_GUARDIAN"]},"NdaStepView":{"type":"object","required":["platformNda","terms","privacy","signerFullName"],"properties":{"platformNda":{"$ref":"#/components/schemas/PlatformDocument"},"privacy":{"type":"array","items":{"$ref":"#/components/schemas/LegalText"}},"signerFullName":{"type":"string","description":"The name that will be written under the signature (the signer's own registration data)."},"terms":{"type":"array","items":{"$ref":"#/components/schemas/LegalText"}}}},"NewHoliday":{"type":"object","required":["date","kind","labelVi","labelEn"],"properties":{"date":{"type":"string","format":"date"},"kind":{"type":"string"},"labelEn":{"type":"string"},"labelVi":{"type":"string"}},"additionalProperties":false},"NewValue":{"type":"object","required":["code","labelVi","labelEn"],"properties":{"code":{"type":"string"},"labelEn":{"type":"string"},"labelVi":{"type":"string"},"parentCode":{"type":["string","null"]},"sortOrder":{"type":["integer","null"],"format":"int32"}},"additionalProperties":false},"OnboardingView":{"type":"object","description":"The registration as its owner sees it. Never a phone number or a date of birth.","required":["origin","step","state","email"],"properties":{"accountKind":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/AccountKind"}]},"email":{"$ref":"#/components/schemas/EmailStepView"},"flowId":{"type":["string","null"],"format":"uuid"},"origin":{"type":"string"},"state":{"type":"string","description":"`IN_PROGRESS`, `COMPLETED`, …"},"step":{"$ref":"#/components/schemas/Step"}}},"OtpIssueRequest":{"type":"object","required":["phone","purpose"],"properties":{"phone":{"type":"string"},"platform":{"$ref":"#/components/schemas/ClientPlatform"},"purpose":{"$ref":"#/components/schemas/OtpPurpose"}}},"OtpPurpose":{"type":"string","description":"`identity.otp_challenge_purpose`.","enum":["REGISTER","LOGIN","PASSWORD_RESET","REAUTH_EMAIL_CHANGE","REAUTH_ADD_CHILD","REAUTH_DSR","SPLIT_NEW_PHONE","GUARDIAN_PHONE","PERIODIC_VERIFICATION","PHONE_CHANGE_OLD","PHONE_CHANGE_NEW","PHONE_RELEASE","PHONE_RELEASE_OWNER_CHECK","RECOVERY_PHONE"]},"OtpVerifyRequest":{"type":"object","required":["challengeId","code"],"properties":{"challengeId":{"type":"string","format":"uuid"},"code":{"type":"string"}}},"OverdueRow":{"type":"object","description":"An item that breached.","required":["workItemId","queue","itemType","priority"],"properties":{"assigneeAdminUserId":{"type":["string","null"],"format":"uuid","description":"The assignee at resolution, or the current one while open."},"breachedAt":{"type":["string","null"],"format":"date-time"},"dueAt":{"type":["string","null"],"format":"date-time"},"finishedAt":{"type":["string","null"],"format":"date-time"},"itemType":{"type":"string"},"overdueHours":{"type":["number","null"],"format":"double"},"priority":{"$ref":"#/components/schemas/Priority"},"queue":{"$ref":"#/components/schemas/Queue"},"workItemId":{"type":"string","format":"uuid"}}},"Page_DeadLetterView":{"type":"object","description":"A page of results.","required":["items"],"properties":{"items":{"type":"array","items":{"type":"object","required":["deadLetterId","jobId","lane","taskName","attempts","deadLetteredAt","errorText"],"properties":{"attempts":{"type":"integer","format":"int32"},"deadLetterId":{"type":"string","format":"uuid"},"deadLetteredAt":{"type":"string","format":"date-time"},"errorText":{"type":"string","description":"The final error, PII-scrubbed by the runner (2.03 §9)."},"jobId":{"type":"string","format":"uuid"},"lane":{"type":"string"},"taskName":{"type":"string"}}}},"nextCursor":{"type":["string","null"]}}},"ParamList":{"type":"object","required":["params"],"properties":{"params":{"type":"array","items":{"$ref":"#/components/schemas/ParamView"}}}},"ParamView":{"type":"object","description":"One parameter as the editor shows it (3.03 §10.1).","required":["key","group","version","setAt","editable","recomputePolicy","components","constraints"],"properties":{"components":{"type":"array","items":{"$ref":"#/components/schemas/ComponentView"}},"constraints":{"type":"array","items":{"$ref":"#/components/schemas/ConstraintView"}},"descriptionVi":{"type":["string","null"]},"editable":{"type":"boolean","description":"Whether the caller may save a new version."},"group":{"type":"string","description":"`TECHNICAL`, `BUSINESS` or `BUSINESS_LEGAL` (⚠)."},"key":{"type":"string"},"readOnlyReason":{"type":["string","null"],"description":"`DERIVED` (CFG-16a) or `ROLE`."},"recomputePolicy":{"type":"string"},"setAt":{"type":"string","format":"date-time"},"setByAdminUserId":{"type":["string","null"],"format":"uuid"},"version":{"type":"integer","format":"int32"}}},"PasswordChangeRequest":{"type":"object","required":["currentPassword","newPassword"],"properties":{"currentPassword":{"type":"string"},"newPassword":{"type":"string"}}},"PasswordRequest":{"type":"object","required":["password"],"properties":{"password":{"type":"string"}}},"Period":{"type":"string","description":"The bucket of a report row.","enum":["DAY","WEEK","MONTH"]},"PhoneOutcome":{"type":"string","description":"What the phone step leads to, known only after the OTP (FR-AUT-01h(1)).","enum":["CONTINUE","RESUME_WITH_PASSWORD","NUMBER_TAKEN"]},"PhoneRequest":{"type":"object","required":["phone"],"properties":{"phone":{"type":"string"},"platform":{"$ref":"#/components/schemas/ClientPlatform"}}},"PhoneVerifiedResponse":{"type":"object","required":["outcome"],"properties":{"onboarding":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/OnboardingView"}]},"outcome":{"$ref":"#/components/schemas/PhoneOutcome"},"session":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/SessionTokens"}]}}},"PhoneVerifyRequest":{"type":"object","required":["phone","challengeId","code"],"properties":{"challengeId":{"type":"string","format":"uuid"},"code":{"type":"string"},"deviceName":{"type":["string","null"]},"phone":{"type":"string","description":"The number typed at the issue step (it is not stored with the challenge)."},"platform":{"$ref":"#/components/schemas/ClientPlatform"}}},"PlatformDocument":{"type":"object","description":"The current platform NDA document.","required":["documentId","versionNo","effectiveFrom","texts"],"properties":{"documentId":{"type":"string","format":"uuid"},"effectiveFrom":{"type":"string","format":"date-time"},"texts":{"type":"array","items":{"$ref":"#/components/schemas/LegalText"}},"versionNo":{"type":"integer","format":"int32"}}},"Priority":{"type":"string","description":"`workqueue.work_item_priority`: `P0`/`P1`/`P2` for reports, `HIGH`/`NORMAL` elsewhere.","enum":["P0","P1","P2","HIGH","NORMAL"]},"Queue":{"type":"string","description":"A queue of the Admin Portal, identified by its Section 9.3 screen (2.02 §4.3 catalog; 2.00 §4.2).\n\nThe design names each queue only by its screen, so the screen id (`\"5a\"`) is the queue code on\nthe wire.","enum":["3","4","5","5a","5b","5c","5d","5e","5f","5g","6","7","8","9","10","11","12","13"]},"QueueCounts":{"type":"object","description":"Open-item counts of one queue (badges, NFR-AVL-02). Only the types the caller may see are\ncounted, so a restricted queue's length never leaks (FR-RPT-04).","required":["open","unassigned","mine","inTime","dueSoon","overdue","notStarted","noSla"],"properties":{"dueSoon":{"type":"integer","format":"int64","description":"Near breach (Section 15.2.4 *Sắp quá hạn*)."},"inTime":{"type":"integer","format":"int64"},"mine":{"type":"integer","format":"int64"},"noSla":{"type":"integer","format":"int64","description":"Items of policies without SLA states (minor contact, live chat)."},"notStarted":{"type":"integer","format":"int64","description":"Items whose clock has not started (a DSR awaiting verification)."},"open":{"type":"integer","format":"int64"},"overdue":{"type":"integer","format":"int64"},"queue":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/Queue"}]},"unassigned":{"type":"integer","format":"int64"}}},"Ref":{"type":"object","required":["type","id"],"properties":{"id":{"type":"string","format":"uuid"},"type":{"type":"string"}}},"RefreshRequest":{"type":"object","required":["refreshToken"],"properties":{"refreshToken":{"type":"string"}}},"Relabel":{"type":"object","required":["labelVi","labelEn","expectedLabelVersion"],"properties":{"expectedLabelVersion":{"type":"integer","format":"int32","description":"The label version the editor was opened on."},"labelEn":{"type":"string"},"labelVi":{"type":"string"}},"additionalProperties":false},"ReprioritizeBody":{"type":"object","description":"`POST …/reprioritize`. Lowering needs a reason (FR-RPT-02a).","required":["priority"],"properties":{"priority":{"$ref":"#/components/schemas/Priority"},"reason":{"type":["string","null"]}}},"RequiredFieldsRequest":{"type":"object","description":"Step 4 fields. Talent: full name, full date of birth typed twice (root §13 Q51), gender, province.\nDirector: full name.","required":["fullName"],"properties":{"dateOfBirth":{"type":["string","null"],"format":"date"},"dateOfBirthConfirm":{"type":["string","null"],"format":"date"},"fullName":{"type":"string"},"genderCode":{"type":["string","null"]},"provinceCode":{"type":["string","null"]}}},"RetryOutcome":{"type":"object","required":["jobId","state"],"properties":{"jobId":{"type":"string","format":"uuid"},"state":{"type":"string"}}},"ReverifiedResponse":{"allOf":[{"$ref":"#/components/schemas/SessionTokens","description":"Mobile: a new access token carrying the `FULL` scope."},{"type":"object","required":["scope"],"properties":{"scope":{"type":"string"}}}]},"SaveBody":{"type":"object","description":"A save: every component's new values (omitted components keep their current values).","required":["expectedVersion","components"],"properties":{"approvalMediaAssetId":{"type":["string","null"],"format":"uuid","description":"The Product Owner's approval document (media class `APPROVAL_DOCUMENT`); mandatory for ⚠."},"components":{"type":"object"},"expectedVersion":{"type":"integer","format":"int32","description":"The version the editor was opened on (optimistic locking)."},"reason":{"type":["string","null"],"description":"Mandatory for a *Business ⚠* parameter."}},"additionalProperties":false},"SaveOutcome":{"type":"object","description":"The result of a save.","required":["key","version","warnings","recomputedTimers"],"properties":{"key":{"type":"string"},"recomputedTimers":{"type":"integer","format":"int64","minimum":0},"version":{"type":"integer","format":"int32"},"warnings":{"type":"array","items":{"$ref":"#/components/schemas/Warning"}}}},"SessionInfo":{"type":"object","required":["accountId","scope","registrationComplete","language"],"properties":{"accountId":{"type":"string","format":"uuid"},"accountKind":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/AccountKind"}]},"csrfToken":{"type":["string","null"],"description":"Web sessions: the CSRF token to send in `X-CSRF-Token`."},"language":{"$ref":"#/components/schemas/Lang"},"registrationComplete":{"type":"boolean"},"scope":{"type":"string"}}},"SessionResponse":{"allOf":[{"$ref":"#/components/schemas/SessionTokens"},{"type":"object","required":["accountId","scope","registrationComplete"],"properties":{"accountId":{"type":"string","format":"uuid"},"accountKind":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/AccountKind"}]},"registrationComplete":{"type":"boolean","description":"When false, the session reaches only the onboarding endpoints (FR-AUT-01d(1))."},"scope":{"type":"string","description":"`FULL`, `PHONE_REVERIFICATION` or `PHONE_CHANGE` (§5.10)."}}}],"description":"A session opened by a login or a registration step."},"SessionTokens":{"type":"object","description":"The tokens of a session, as returned to clients (never a phone number or account datum).","properties":{"accessToken":{"type":["string","null"],"description":"Mobile: `Authorization: Bearer` token."},"accessTokenExpiresAt":{"type":["string","null"],"format":"date-time"},"csrfToken":{"type":["string","null"],"description":"Web: send back in `X-CSRF-Token` on every mutation."},"refreshToken":{"type":["string","null"],"description":"Mobile: rotating refresh token, bound to the device."}}},"Setting":{"type":"object","description":"One switch. Pairs whose types are all mandatory are not listed; a listed pair that also holds\nmandatory types says so, and those keep arriving whatever the switch says (FR-NTF-04).","required":["category","channel","enabled","mandatoryTypesKeepArriving"],"properties":{"category":{"type":"string"},"channel":{"$ref":"#/components/schemas/SettingChannel"},"enabled":{"type":"boolean"},"mandatoryTypesKeepArriving":{"type":"boolean"}}},"SettingChange":{"type":"object","description":"One requested change.","required":["category","channel","enabled"],"properties":{"category":{"type":"string"},"channel":{"$ref":"#/components/schemas/SettingChannel"},"enabled":{"type":"boolean"}}},"SettingChannel":{"type":"string","description":"A settings channel (`PHONE` = ZNS and SMS as one switch).","enum":["PUSH","EMAIL","PHONE"]},"Settings":{"type":"object","required":["items"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/Setting"}}}},"SettingsUpdate":{"type":"object","required":["items"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/SettingChange"}}}},"SignRequest":{"type":"object","description":"A drawn signature submitted by the signer.","required":["documentId","language","signatureAssetId","strokes","signerFullName"],"properties":{"documentId":{"type":"string","format":"uuid"},"language":{"$ref":"#/components/schemas/Lang","description":"The language version the signer read."},"signatureAssetId":{"type":"string","format":"uuid","description":"The uploaded signature image (media class `SIGNATURE_IMAGE`)."},"signerFullName":{"type":"string","description":"The signer's full name as written under the signature."},"strokes":{"type":"array","items":{"type":"array","items":{"type":"array","items":{"type":"number","format":"double"}}},"description":"The drawn strokes: a list of strokes, each a list of `[x, y]` points."}}},"SignedResponse":{"type":"object","required":["signatureId"],"properties":{"signatureId":{"type":"string","format":"uuid"}}},"SignerRoute":{"type":"string","enum":["SELF","GUARDIAN_IN_APP","GUARDIAN_LINK"]},"SlaState":{"type":"string","description":"`workqueue.sla_clock_state` (Section 15.2.4 plus `NOT_STARTED` for a deferred clock).","enum":["NOT_STARTED","IN_TIME","DUE_SOON","OVERDUE"]},"SlaView":{"type":"object","description":"The SLA clock of an item, as shown (deadlines are effective for both bases).","required":["basis","paramKey","slaHours","warnRatio","state","clockVersion"],"properties":{"basis":{"$ref":"#/components/schemas/Basis"},"breachedAt":{"type":["string","null"],"format":"date-time"},"clockStartAt":{"type":["string","null"],"format":"date-time"},"clockVersion":{"type":"integer","format":"int32"},"dueAt":{"type":["string","null"],"format":"date-time"},"dueSoonAt":{"type":["string","null"],"format":"date-time"},"paramKey":{"type":"string","description":"The SLA parameter snapshotted at enqueue, for example `CFG-61`."},"remainingSeconds":{"type":["integer","null"],"format":"int64","description":"Time left until `due_at` on the policy basis (business seconds for `BUSINESS`), at the\nresponse instant; zero once due. The client never computes business hours (3.03 §5)."},"slaHours":{"type":"number","format":"double"},"state":{"$ref":"#/components/schemas/SlaState"},"warnRatio":{"type":"number","format":"double"}}},"StaffCreateRequest":{"type":"object","required":["email","displayName","role","temporaryPassword"],"properties":{"displayName":{"type":"string"},"email":{"type":"string"},"role":{"$ref":"#/components/schemas/StaffRole"},"temporaryPassword":{"type":"string"}}},"StaffLoginRequest":{"type":"object","required":["email","password"],"properties":{"email":{"type":"string"},"password":{"type":"string"}}},"StaffMember":{"type":"object","description":"A staff account as the Super Admin sees it.","required":["adminUserId","email","displayName","role","locked","totpEnrolled","createdAt"],"properties":{"adminUserId":{"type":"string","format":"uuid"},"createdAt":{"type":"string","format":"date-time"},"displayName":{"type":"string"},"email":{"type":"string"},"lastLoginAt":{"type":["string","null"],"format":"date-time"},"locked":{"type":"boolean"},"role":{"$ref":"#/components/schemas/StaffRole"},"totpEnrolled":{"type":"boolean"}}},"StaffPasswordRequest":{"type":"object","required":["current","new"],"properties":{"current":{"type":"string"},"new":{"type":"string"}}},"StaffPatchRequest":{"type":"object","properties":{"locked":{"type":["boolean","null"]},"role":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/StaffRole"}]}},"additionalProperties":false},"StaffRole":{"type":"string","description":"`identity.admin_user_role` (FR-ADM-01), a separate authentication realm.","enum":["SUPER_ADMIN","ADMIN","MODERATOR","SUPPORT","ACCOUNTANT"]},"StaffSessionView":{"type":"object","description":"The staff session body of the Admin Portal contract.","required":["adminUserId","email","displayName","role","csrfToken"],"properties":{"adminUserId":{"type":"string","format":"uuid"},"csrfToken":{"type":"string"},"displayName":{"type":"string"},"email":{"type":"string"},"role":{"$ref":"#/components/schemas/StaffRole"}}},"StaffTotpRequest":{"type":"object","required":["challenge","code"],"properties":{"challenge":{"type":"string"},"code":{"type":"string"}}},"Stats":{"type":"object","description":"Distribution of a measure in hours.","required":["count","mean","median","p95","max"],"properties":{"count":{"type":"integer","minimum":0},"max":{"type":"number","format":"double"},"mean":{"type":"number","format":"double"},"median":{"type":"number","format":"double"},"p95":{"type":"number","format":"double"}}},"StatusView":{"type":"object","required":["status"],"properties":{"signerRoute":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/SignerRoute"}]},"status":{"$ref":"#/components/schemas/NdaStatus"}}},"Step":{"type":"string","description":"`onboarding.onboarding_flow_step`.","enum":["PHONE_OTP","EMAIL","ACCOUNT_TYPE","REQUIRED_FIELDS","GUARDIAN","PASSWORD","NDA","DONE"]},"SubjectRef":{"type":"object","description":"The owner record of an item (`SourceRef`, root §7.1).","required":["entityType","id"],"properties":{"entityType":{"type":"string","description":"`<schema>.<table>`."},"id":{"type":"string","format":"uuid"}}},"VersionView":{"type":"object","description":"One saved version (the history shows who, when, old and new values, reason and attachment).","required":["version","setAt","components"],"properties":{"approvalMediaAssetId":{"type":["string","null"],"format":"uuid"},"components":{"type":"array","items":{"$ref":"#/components/schemas/ComponentValues"}},"reason":{"type":["string","null"]},"setAt":{"type":"string","format":"date-time"},"setByAdminUserId":{"type":["string","null"],"format":"uuid"},"version":{"type":"integer","format":"int32"}}},"Warning":{"type":"object","description":"A non-blocking warning returned by a save.","required":["code","detailVi","detailEn"],"properties":{"code":{"type":"string"},"detailEn":{"type":"string"},"detailVi":{"type":"string"},"fromDate":{"type":["string","null"],"format":"date"},"key":{"type":["string","null"]},"toDate":{"type":["string","null"],"format":"date"}}},"WorkItem":{"type":"object","description":"A work item (2.02 §4.1) as returned to owners and to the Admin Portal. It carries no personal\ndata: the subject is a reference and the summary is the owner's non-sensitive display object.","required":["id","itemType","queue","subject","priority","state","policy","summary","pinnedRank","reminderCount","flags","createdAt","version"],"properties":{"assigneeAdminUserId":{"type":["string","null"],"format":"uuid"},"cancelReasonCode":{"type":["string","null"]},"claimedAt":{"type":["string","null"],"format":"date-time"},"countdownAt":{"type":["string","null"],"format":"date-time"},"countdownLabelKey":{"type":["string","null"]},"createdAt":{"type":"string","format":"date-time"},"finishKind":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/FinishKind"}]},"finishedAt":{"type":["string","null"],"format":"date-time"},"flags":{"type":"array","items":{"type":"string"}},"id":{"type":"string","format":"uuid"},"itemType":{"type":"string"},"outcomeCode":{"type":["string","null"]},"pinnedRank":{"type":"integer","format":"int32","description":"Lower sorts first; pinned items are negative (2.02 §5.7)."},"policy":{"type":"string","description":"`BUSINESS`, `WALL_CLOCK`, `NONE_WITH_COUNTDOWN` or `CONVERSATION`."},"priority":{"$ref":"#/components/schemas/Priority"},"queue":{"$ref":"#/components/schemas/Queue"},"reminderCount":{"type":"integer","format":"int32"},"resolvedByAdminUserId":{"type":["string","null"],"format":"uuid"},"resolvedViaWorkItemId":{"type":["string","null"],"format":"uuid"},"shownDueAt":{"type":["string","null"],"format":"date-time","description":"The due time shown and sorted on: `due_at`, the countdown for queues without an SLA, and\nfor `KYC_ID_CARD` the earlier of `due_at` and the image deletion instant (root §13 Q39)."},"sla":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/SlaView"}]},"state":{"$ref":"#/components/schemas/ItemState"},"subject":{"$ref":"#/components/schemas/SubjectRef"},"summary":{"type":"object"},"supersededByWorkItemId":{"type":["string","null"],"format":"uuid"},"version":{"type":"integer","format":"int32","description":"Optimistic-lock version (`expectedVersion` of a resolution)."}}}}},"tags":[{"name":"admin","description":"Admin Portal: platform administration (3.03)"},{"name":"work-queues","description":"Staff work queues and SLA (2.02)"},{"name":"media","description":"Media uploads (tus 1.0) and delivery (2.04)"},{"name":"notifications","description":"In-app inbox, notification settings and the delivery log (2.01)"}]}