{"openapi":"3.1.0","info":{"title":"HR Studio","description":"\nA complete, populated HR platform for **Meridian Networks** — exposed twice over\nthe same domain core:\n\n* **REST** — everything under `/api/v1`, documented here and in `/openapi.json`.\n* **MCP** — the same operations as tools at `/mcp`, for AI agents.\n\nThere is one service layer behind both. A business rule enforced over HTTP is\nenforced identically over MCP.\n\n### Where to start\n\n| Goal | Call |\n| --- | --- |\n| Understand the organisation | `GET /api/v1/analytics/overview` |\n| Find a person | `GET /api/v1/employees?search=...` |\n| See the reporting tree | `GET /api/v1/employees/org-chart` |\n| Approve leave | `GET /api/v1/leave/requests?status=pending` |\n| Check hiring | `GET /api/v1/analytics/recruitment-funnel` |\n\n### Conventions\n\n* List endpoints return `{items, total, limit, offset}`. Page with `offset`.\n* Money is annual gross, denominated in USD, unless stated\n  otherwise. Employees and payslips carry a `settlement_currency` — the local\n  currency the pay is actually settled in.\n* Locations are city + country; the organisation is international.\n* Dates are ISO-8601. `PATCH` bodies are partial — send only what changes.\n* Errors return `{\"detail\": \"...\"}`: `404` not found, `409` conflict,\n  `422` business-rule violation.\n","contact":{"name":"AI Studio","email":"studio@meridiannetworks.com"},"license":{"name":"Demo use"},"version":"1.0.0"},"paths":{"/health":{"get":{"tags":["Service"],"summary":"Liveness probe","operationId":"health_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Health Health Get"}}}}}}},"/api/v1":{"get":{"tags":["Service"],"summary":"Service metadata and entry points","operationId":"service_info_api_v1_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Service Info Api V1 Get"}}}}}}},"/api/v1/analytics/overview":{"get":{"tags":["Analytics"],"summary":"Whole-company snapshot","description":"One call that answers 'what does this organisation look like right now'.","operationId":"overview_api_v1_analytics_overview_get","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompanyOverview"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/analytics/headcount":{"get":{"tags":["Analytics"],"summary":"Headcount and cost by department","operationId":"headcount_api_v1_analytics_headcount_get","parameters":[{"name":"as_of","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Point in time. Defaults to today.","title":"As Of"},"description":"Point in time. Defaults to today."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HeadcountReport"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/analytics/attrition":{"get":{"tags":["Analytics"],"summary":"Hires, leavers and attrition","operationId":"attrition_api_v1_analytics_attrition_get","parameters":[{"name":"period_start","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Defaults to 12 months ago.","title":"Period Start"},"description":"Defaults to 12 months ago."},{"name":"period_end","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Defaults to today.","title":"Period End"},"description":"Defaults to today."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AttritionReport"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/analytics/salary-bands":{"get":{"tags":["Analytics"],"summary":"Salary spread by job level","operationId":"salary_bands_api_v1_analytics_salary_bands_get","parameters":[{"name":"department_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Department Id"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SalaryBandRow"},"title":"Response Salary Bands Api V1 Analytics Salary Bands Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/analytics/leave-utilisation":{"get":{"tags":["Analytics"],"summary":"Leave taken against entitlement","operationId":"leave_utilisation_api_v1_analytics_leave_utilisation_get","parameters":[{"name":"year","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Defaults to the current year.","title":"Year"},"description":"Defaults to the current year."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/LeaveUtilisationRow"},"title":"Response Leave Utilisation Api V1 Analytics Leave Utilisation Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/analytics/recruitment-funnel":{"get":{"tags":["Analytics"],"summary":"Pipeline conversion and time to hire","operationId":"recruitment_funnel_api_v1_analytics_recruitment_funnel_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":1095,"minimum":1,"default":180,"title":"Days"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecruitmentFunnel"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/analytics/anniversaries":{"get":{"tags":["Analytics"],"summary":"Upcoming work anniversaries","operationId":"anniversaries_api_v1_analytics_anniversaries_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"default":30,"title":"Days"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response Anniversaries Api V1 Analytics Anniversaries Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/analytics/reviews-outstanding/{cycle}":{"get":{"tags":["Analytics"],"summary":"Active employees with no review in a cycle","operationId":"reviews_outstanding_api_v1_analytics_reviews_outstanding__cycle__get","parameters":[{"name":"cycle","in":"path","required":true,"schema":{"type":"string","title":"Cycle"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response Reviews Outstanding Api V1 Analytics Reviews Outstanding  Cycle  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/employees":{"get":{"tags":["Employees"],"summary":"Search the directory","operationId":"list_employees_api_v1_employees_get","parameters":[{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free text across name, employee number, email and job title.","title":"Search"},"description":"Free text across name, employee number, email and job title."},{"name":"department_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Department Id"}},{"name":"department_code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by department code, e.g. 'ENG'.","title":"Department Code"},"description":"Filter by department code, e.g. 'ENG'."},{"name":"manager_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Direct reports of this manager.","title":"Manager Id"},"description":"Direct reports of this manager."},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/EmployeeStatus"},{"type":"null"}],"title":"Status"}},{"name":"job_level","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/JobLevel"},{"type":"null"}],"title":"Job Level"}},{"name":"employment_type","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/EmploymentType"},{"type":"null"}],"title":"Employment Type"}},{"name":"location","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Partial match on city.","title":"Location"},"description":"Partial match on city."},{"name":"country","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Partial match on country.","title":"Country"},"description":"Partial match on country."},{"name":"hired_after","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Hired After"}},{"name":"hired_before","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Hired Before"}},{"name":"include_terminated","in":"query","required":false,"schema":{"type":"boolean","description":"Terminated employees are excluded by default.","default":false,"title":"Include Terminated"},"description":"Terminated employees are excluded by default."},{"name":"sort","in":"query","required":false,"schema":{"type":"string","description":"Sort field: last_name, first_name, hire_date, salary, employee_number. Prefix with '-' for descending.","default":"last_name","title":"Sort"},"description":"Sort field: last_name, first_name, hire_date, salary, employee_number. Prefix with '-' for descending."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"description":"Maximum rows to return (1-500).","default":50,"title":"Limit"},"description":"Maximum rows to return (1-500)."},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"Rows to skip, for paging.","default":0,"title":"Offset"},"description":"Rows to skip, for paging."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page_EmployeeSummary_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Employees"],"summary":"Onboard a new employee","operationId":"create_employee_api_v1_employees_post","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmployeeCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmployeeRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/employees/org-chart":{"get":{"tags":["Employees"],"summary":"Reporting tree","operationId":"org_chart_api_v1_employees_org_chart_get","parameters":[{"name":"root_employee_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Start from this employee. Omit for the whole company.","title":"Root Employee Id"},"description":"Start from this employee. Omit for the whole company."},{"name":"max_depth","in":"query","required":false,"schema":{"type":"integer","maximum":12,"minimum":1,"default":6,"title":"Max Depth"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/OrgNode"},"title":"Response Org Chart Api V1 Employees Org Chart Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/employees/by-number/{employee_number}":{"get":{"tags":["Employees"],"summary":"Look up by employee number","operationId":"get_by_number_api_v1_employees_by_number__employee_number__get","parameters":[{"name":"employee_number","in":"path","required":true,"schema":{"type":"string","title":"Employee Number"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmployeeDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/employees/by-email/{email}":{"get":{"tags":["Employees"],"summary":"Look up by work email","operationId":"get_by_email_api_v1_employees_by_email__email__get","parameters":[{"name":"email","in":"path","required":true,"schema":{"type":"string","title":"Email"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmployeeDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/employees/{employee_id}":{"get":{"tags":["Employees"],"summary":"Get one employee","operationId":"get_employee_api_v1_employees__employee_id__get","parameters":[{"name":"employee_id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"title":"Employee Id"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmployeeDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Employees"],"summary":"Update an employee","operationId":"update_employee_api_v1_employees__employee_id__patch","parameters":[{"name":"employee_id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"title":"Employee Id"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmployeeUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmployeeRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/employees/{employee_id}/terminate":{"post":{"tags":["Employees"],"summary":"Terminate an employee","description":"Marks the employee terminated and re-parents their direct reports to the terminated employee's own manager.","operationId":"terminate_employee_api_v1_employees__employee_id__terminate_post","parameters":[{"name":"employee_id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"title":"Employee Id"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TerminateEmployee"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmployeeDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/employees/{employee_id}/direct-reports":{"get":{"tags":["Employees"],"summary":"Direct reports","operationId":"direct_reports_api_v1_employees__employee_id__direct_reports_get","parameters":[{"name":"employee_id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"title":"Employee Id"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/EmployeeSummary"},"title":"Response Direct Reports Api V1 Employees  Employee Id  Direct Reports Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/employees/{employee_id}/reporting-chain":{"get":{"tags":["Employees"],"summary":"Management chain up to the top","operationId":"reporting_chain_api_v1_employees__employee_id__reporting_chain_get","parameters":[{"name":"employee_id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"title":"Employee Id"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/EmployeeSummary"},"title":"Response Reporting Chain Api V1 Employees  Employee Id  Reporting Chain Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/departments":{"get":{"tags":["Departments"],"summary":"List departments","operationId":"list_departments_api_v1_departments_get","parameters":[{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Match on name or code.","title":"Search"},"description":"Match on name or code."},{"name":"location","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Location"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"description":"Maximum rows to return (1-500).","default":50,"title":"Limit"},"description":"Maximum rows to return (1-500)."},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"Rows to skip, for paging.","default":0,"title":"Offset"},"description":"Rows to skip, for paging."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page_DepartmentDetail_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Departments"],"summary":"Create a department","operationId":"create_department_api_v1_departments_post","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DepartmentCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DepartmentRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/departments/by-code/{code}":{"get":{"tags":["Departments"],"summary":"Look up by department code","operationId":"get_by_code_api_v1_departments_by_code__code__get","parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DepartmentDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/departments/{department_id}":{"get":{"tags":["Departments"],"summary":"Get one department with headcount and cost","operationId":"get_department_api_v1_departments__department_id__get","parameters":[{"name":"department_id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"title":"Department Id"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DepartmentDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Departments"],"summary":"Update a department","operationId":"update_department_api_v1_departments__department_id__patch","parameters":[{"name":"department_id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"title":"Department Id"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DepartmentUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DepartmentRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Departments"],"summary":"Delete an empty department","operationId":"delete_department_api_v1_departments__department_id__delete","parameters":[{"name":"department_id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"title":"Department Id"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/leave/types":{"get":{"tags":["Leave"],"summary":"Leave type catalogue","operationId":"list_leave_types_api_v1_leave_types_get","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/LeaveTypeRead"},"title":"Response List Leave Types Api V1 Leave Types Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/leave/balances/{employee_id}":{"get":{"tags":["Leave"],"summary":"An employee's leave balances","operationId":"leave_balances_api_v1_leave_balances__employee_id__get","parameters":[{"name":"employee_id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"title":"Employee Id"}},{"name":"year","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Defaults to the current year.","title":"Year"},"description":"Defaults to the current year."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/LeaveBalanceRead"},"title":"Response Leave Balances Api V1 Leave Balances  Employee Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/leave/who-is-out":{"get":{"tags":["Leave"],"summary":"Who is on leave on a given day","operationId":"who_is_out_api_v1_leave_who_is_out_get","parameters":[{"name":"on_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Defaults to today.","title":"On Date"},"description":"Defaults to today."},{"name":"department_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Department Id"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/LeaveRequestDetail"},"title":"Response Who Is Out Api V1 Leave Who Is Out Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/leave/requests":{"get":{"tags":["Leave"],"summary":"List leave requests","operationId":"list_requests_api_v1_leave_requests_get","parameters":[{"name":"employee_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Employee Id"}},{"name":"manager_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Requests raised by this manager's direct reports.","title":"Manager Id"},"description":"Requests raised by this manager's direct reports."},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/LeaveStatus"},{"type":"null"}],"title":"Status"}},{"name":"leave_type_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Leave Type Id"}},{"name":"start_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Start From"}},{"name":"start_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Start To"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"description":"Maximum rows to return (1-500).","default":50,"title":"Limit"},"description":"Maximum rows to return (1-500)."},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"Rows to skip, for paging.","default":0,"title":"Offset"},"description":"Rows to skip, for paging."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page_LeaveRequestDetail_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Leave"],"summary":"Submit a leave request","description":"Validates the balance and rejects overlaps with existing pending or approved requests. Leave types that do not require approval (sick leave) are approved on submission.","operationId":"create_request_api_v1_leave_requests_post","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LeaveRequestCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LeaveRequestDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/leave/requests/{request_id}":{"get":{"tags":["Leave"],"summary":"Get one leave request","operationId":"get_request_api_v1_leave_requests__request_id__get","parameters":[{"name":"request_id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"title":"Request Id"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LeaveRequestDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/leave/requests/{request_id}/approve":{"post":{"tags":["Leave"],"summary":"Approve a pending request","operationId":"approve_api_v1_leave_requests__request_id__approve_post","parameters":[{"name":"request_id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"title":"Request Id"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LeaveDecision"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LeaveRequestDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/leave/requests/{request_id}/reject":{"post":{"tags":["Leave"],"summary":"Reject a pending request","operationId":"reject_api_v1_leave_requests__request_id__reject_post","parameters":[{"name":"request_id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"title":"Request Id"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LeaveDecision"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LeaveRequestDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/leave/requests/{request_id}/cancel":{"post":{"tags":["Leave"],"summary":"Cancel a request and return the days to the balance","operationId":"cancel_api_v1_leave_requests__request_id__cancel_post","parameters":[{"name":"request_id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"title":"Request Id"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LeaveRequestDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/time/entries":{"get":{"tags":["Time & Attendance"],"summary":"List time entries","operationId":"list_entries_api_v1_time_entries_get","parameters":[{"name":"employee_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Employee Id"}},{"name":"project_code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Project Code"}},{"name":"date_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Date From"}},{"name":"date_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Date To"}},{"name":"billable","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Billable"}},{"name":"approved","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Approved"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"description":"Maximum rows to return (1-500).","default":100,"title":"Limit"},"description":"Maximum rows to return (1-500)."},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"Rows to skip, for paging.","default":0,"title":"Offset"},"description":"Rows to skip, for paging."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page_TimeEntryRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Time & Attendance"],"summary":"Log hours","operationId":"log_time_api_v1_time_entries_post","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TimeEntryCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TimeEntryRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/time/entries/approve":{"post":{"tags":["Time & Attendance"],"summary":"Approve time entries in bulk","operationId":"approve_entries_api_v1_time_entries_approve_post","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_approve_entries_api_v1_time_entries_approve_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TimeEntryRead"},"title":"Response Approve Entries Api V1 Time Entries Approve Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/time/timesheet/{employee_id}":{"get":{"tags":["Time & Attendance"],"summary":"Timesheet totals for one employee","operationId":"timesheet_api_v1_time_timesheet__employee_id__get","parameters":[{"name":"employee_id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"title":"Employee Id"}},{"name":"period_start","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Defaults to 30 days ago.","title":"Period Start"},"description":"Defaults to 30 days ago."},{"name":"period_end","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Defaults to today.","title":"Period End"},"description":"Defaults to today."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TimesheetSummary"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/performance/reviews":{"get":{"tags":["Performance"],"summary":"List performance reviews","operationId":"list_reviews_api_v1_performance_reviews_get","parameters":[{"name":"employee_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Employee Id"}},{"name":"reviewer_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Reviewer Id"}},{"name":"cycle","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Exact cycle, e.g. '2026-H1'.","title":"Cycle"},"description":"Exact cycle, e.g. '2026-H1'."},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/ReviewStatus"},{"type":"null"}],"title":"Status"}},{"name":"review_type","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/ReviewType"},{"type":"null"}],"title":"Review Type"}},{"name":"min_rating","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":5,"minimum":1},{"type":"null"}],"title":"Min Rating"}},{"name":"max_rating","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":5,"minimum":1},{"type":"null"}],"title":"Max Rating"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"description":"Maximum rows to return (1-500).","default":50,"title":"Limit"},"description":"Maximum rows to return (1-500)."},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"Rows to skip, for paging.","default":0,"title":"Offset"},"description":"Rows to skip, for paging."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page_ReviewDetail_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Performance"],"summary":"Open a review","operationId":"create_review_api_v1_performance_reviews_post","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviewCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviewDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/performance/reviews/{review_id}":{"get":{"tags":["Performance"],"summary":"Get one review","operationId":"get_review_api_v1_performance_reviews__review_id__get","parameters":[{"name":"review_id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"title":"Review Id"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviewDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Performance"],"summary":"Update or submit a review","description":"Submitting requires an overall rating. Acknowledged reviews are read-only.","operationId":"update_review_api_v1_performance_reviews__review_id__patch","parameters":[{"name":"review_id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"title":"Review Id"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviewUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviewDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/performance/reviews/{review_id}/acknowledge":{"post":{"tags":["Performance"],"summary":"Employee acknowledges a submitted review","operationId":"acknowledge_review_api_v1_performance_reviews__review_id__acknowledge_post","parameters":[{"name":"review_id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"title":"Review Id"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviewDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/performance/goals":{"get":{"tags":["Performance"],"summary":"List goals","operationId":"list_goals_api_v1_performance_goals_get","parameters":[{"name":"employee_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Employee Id"}},{"name":"cycle","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cycle"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/GoalStatus"},{"type":"null"}],"title":"Status"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"description":"Maximum rows to return (1-500).","default":50,"title":"Limit"},"description":"Maximum rows to return (1-500)."},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"Rows to skip, for paging.","default":0,"title":"Offset"},"description":"Rows to skip, for paging."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page_GoalRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Performance"],"summary":"Set a goal","description":"Goal weights within one cycle may not exceed 100% in total.","operationId":"create_goal_api_v1_performance_goals_post","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoalCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoalRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/performance/goals/{goal_id}":{"patch":{"tags":["Performance"],"summary":"Update goal progress","description":"Setting progress to 100% completes the goal automatically.","operationId":"update_goal_api_v1_performance_goals__goal_id__patch","parameters":[{"name":"goal_id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"title":"Goal Id"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoalUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoalRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Performance"],"summary":"Delete a goal","operationId":"delete_goal_api_v1_performance_goals__goal_id__delete","parameters":[{"name":"goal_id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"title":"Goal Id"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/recruitment/postings":{"get":{"tags":["Recruitment"],"summary":"List job postings","operationId":"list_postings_api_v1_recruitment_postings_get","parameters":[{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Match on job title.","title":"Search"},"description":"Match on job title."},{"name":"department_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Department Id"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/PostingStatus"},{"type":"null"}],"title":"Status"}},{"name":"job_level","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/JobLevel"},{"type":"null"}],"title":"Job Level"}},{"name":"location","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Location"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"description":"Maximum rows to return (1-500).","default":50,"title":"Limit"},"description":"Maximum rows to return (1-500)."},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"Rows to skip, for paging.","default":0,"title":"Offset"},"description":"Rows to skip, for paging."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page_JobPostingDetail_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Recruitment"],"summary":"Open a vacancy","operationId":"create_posting_api_v1_recruitment_postings_post","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobPostingCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobPostingRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/recruitment/postings/{posting_id}":{"get":{"tags":["Recruitment"],"summary":"Get one posting with its pipeline counts","operationId":"get_posting_api_v1_recruitment_postings__posting_id__get","parameters":[{"name":"posting_id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"title":"Posting Id"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobPostingDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Recruitment"],"summary":"Update a posting","operationId":"update_posting_api_v1_recruitment_postings__posting_id__patch","parameters":[{"name":"posting_id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"title":"Posting Id"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobPostingUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobPostingRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/recruitment/postings/{posting_id}/pipeline":{"get":{"tags":["Recruitment"],"summary":"Applications bucketed by stage","operationId":"pipeline_api_v1_recruitment_postings__posting_id__pipeline_get","parameters":[{"name":"posting_id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"title":"Posting Id"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":{"type":"array","items":{"$ref":"#/components/schemas/ApplicationDetail"}},"title":"Response Pipeline Api V1 Recruitment Postings  Posting Id  Pipeline Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/recruitment/candidates":{"get":{"tags":["Recruitment"],"summary":"Search candidates","operationId":"list_candidates_api_v1_recruitment_candidates_get","parameters":[{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Match on name, email or current employer.","title":"Search"},"description":"Match on name, email or current employer."},{"name":"source","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/CandidateSource"},{"type":"null"}],"title":"Source"}},{"name":"min_experience","in":"query","required":false,"schema":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}],"title":"Min Experience"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"description":"Maximum rows to return (1-500).","default":50,"title":"Limit"},"description":"Maximum rows to return (1-500)."},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"Rows to skip, for paging.","default":0,"title":"Offset"},"description":"Rows to skip, for paging."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page_CandidateRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Recruitment"],"summary":"Add a candidate","operationId":"create_candidate_api_v1_recruitment_candidates_post","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CandidateCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CandidateRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/recruitment/candidates/{candidate_id}":{"get":{"tags":["Recruitment"],"summary":"Get one candidate","operationId":"get_candidate_api_v1_recruitment_candidates__candidate_id__get","parameters":[{"name":"candidate_id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"title":"Candidate Id"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CandidateRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/recruitment/applications":{"get":{"tags":["Recruitment"],"summary":"List applications","operationId":"list_applications_api_v1_recruitment_applications_get","parameters":[{"name":"job_posting_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Job Posting Id"}},{"name":"candidate_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Candidate Id"}},{"name":"stage","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/ApplicationStage"},{"type":"null"}],"title":"Stage"}},{"name":"recruiter_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Recruiter Id"}},{"name":"applied_after","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Applied After"}},{"name":"min_rating","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":5,"minimum":1},{"type":"null"}],"title":"Min Rating"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"description":"Maximum rows to return (1-500).","default":50,"title":"Limit"},"description":"Maximum rows to return (1-500)."},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"Rows to skip, for paging.","default":0,"title":"Offset"},"description":"Rows to skip, for paging."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page_ApplicationDetail_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Recruitment"],"summary":"Apply a candidate to a posting","operationId":"create_application_api_v1_recruitment_applications_post","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApplicationCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApplicationDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/recruitment/applications/{application_id}":{"get":{"tags":["Recruitment"],"summary":"Get one application","operationId":"get_application_api_v1_recruitment_applications__application_id__get","parameters":[{"name":"application_id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"title":"Application Id"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApplicationDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/recruitment/applications/{application_id}/advance":{"post":{"tags":["Recruitment"],"summary":"Move an application to the next stage","description":"Enforces the pipeline flow: applied → screening → interview/assessment → offer → hired. Rejecting or withdrawing is allowed from any live stage. Hiring the last open seat closes the posting automatically.","operationId":"advance_application_api_v1_recruitment_applications__application_id__advance_post","parameters":[{"name":"application_id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"title":"Application Id"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApplicationStageUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApplicationDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/payroll/periods":{"get":{"tags":["Payroll"],"summary":"Periods with payroll data","operationId":"list_periods_api_v1_payroll_periods_get","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"string"},"title":"Response List Periods Api V1 Payroll Periods Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/payroll/records":{"get":{"tags":["Payroll"],"summary":"List payroll records","operationId":"list_records_api_v1_payroll_records_get","parameters":[{"name":"employee_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Employee Id"}},{"name":"period","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"YYYY-MM, e.g. '2026-07'.","title":"Period"},"description":"YYYY-MM, e.g. '2026-07'."},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/PayrollStatus"},{"type":"null"}],"title":"Status"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"description":"Maximum rows to return (1-500).","default":50,"title":"Limit"},"description":"Maximum rows to return (1-500)."},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"Rows to skip, for paging.","default":0,"title":"Offset"},"description":"Rows to skip, for paging."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page_PayrollRecordRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/payroll/payslip/{employee_id}/{period}":{"get":{"tags":["Payroll"],"summary":"One payslip","operationId":"get_payslip_api_v1_payroll_payslip__employee_id___period__get","parameters":[{"name":"period","in":"path","required":true,"schema":{"type":"string","title":"Period"}},{"name":"employee_id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"title":"Employee Id"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayrollRecordRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/payroll/summary/{period}":{"get":{"tags":["Payroll"],"summary":"Totals for a period","operationId":"summary_api_v1_payroll_summary__period__get","parameters":[{"name":"period","in":"path","required":true,"schema":{"type":"string","title":"Period"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayrollRunSummary"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/payroll/run/{period}":{"post":{"tags":["Payroll"],"summary":"Run payroll for a period","description":"Generates a payroll record for every payable employee who does not already have one for the period, so re-running is safe.","operationId":"run_payroll_api_v1_payroll_run__period__post","parameters":[{"name":"period","in":"path","required":true,"schema":{"type":"string","title":"Period"}},{"name":"department_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Limit the run to one department.","title":"Department Id"},"description":"Limit the run to one department."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayrollRunSummary"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/training/courses":{"get":{"tags":["Learning & Development"],"summary":"Course catalogue","operationId":"list_courses_api_v1_training_courses_get","parameters":[{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Match on title, code or provider.","title":"Search"},"description":"Match on title, code or provider."},{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"}},{"name":"certification_only","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Certification Only"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"description":"Maximum rows to return (1-500).","default":50,"title":"Limit"},"description":"Maximum rows to return (1-500)."},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"Rows to skip, for paging.","default":0,"title":"Offset"},"description":"Rows to skip, for paging."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page_TrainingCourseRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/training/courses/{course_id}":{"get":{"tags":["Learning & Development"],"summary":"Get one course","operationId":"get_course_api_v1_training_courses__course_id__get","parameters":[{"name":"course_id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"title":"Course Id"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrainingCourseRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/training/enrollments":{"get":{"tags":["Learning & Development"],"summary":"List enrollments","operationId":"list_enrollments_api_v1_training_enrollments_get","parameters":[{"name":"employee_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Employee Id"}},{"name":"course_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Course Id"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/EnrollmentStatus"},{"type":"null"}],"title":"Status"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"description":"Maximum rows to return (1-500).","default":50,"title":"Limit"},"description":"Maximum rows to return (1-500)."},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"Rows to skip, for paging.","default":0,"title":"Offset"},"description":"Rows to skip, for paging."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page_EnrollmentDetail_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Learning & Development"],"summary":"Enroll an employee on a course","operationId":"enroll_api_v1_training_enrollments_post","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnrollmentCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnrollmentDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/training/enrollments/{enrollment_id}":{"patch":{"tags":["Learning & Development"],"summary":"Update enrollment progress","description":"Marking an enrollment completed or failed requires a score.","operationId":"update_enrollment_api_v1_training_enrollments__enrollment_id__patch","parameters":[{"name":"enrollment_id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"title":"Enrollment Id"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnrollmentUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnrollmentDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/training/record/{employee_id}":{"get":{"tags":["Learning & Development"],"summary":"An employee's full training record","operationId":"training_record_api_v1_training_record__employee_id__get","parameters":[{"name":"employee_id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"title":"Employee Id"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Training Record Api V1 Training Record  Employee Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"ApplicationCreate":{"properties":{"job_posting_id":{"type":"integer","title":"Job Posting Id"},"candidate_id":{"type":"integer","title":"Candidate Id"},"recruiter_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Recruiter Id"},"stage":{"$ref":"#/components/schemas/ApplicationStage","default":"applied"},"rating":{"anyOf":[{"type":"number","maximum":5.0,"minimum":1.0},{"type":"null"}],"title":"Rating"},"notes":{"type":"string","maxLength":800,"title":"Notes","default":""},"applied_on":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Applied On","description":"Defaults to today."}},"type":"object","required":["job_posting_id","candidate_id"],"title":"ApplicationCreate"},"ApplicationDetail":{"properties":{"id":{"type":"integer","title":"Id"},"reference":{"type":"string","title":"Reference"},"job_posting_id":{"type":"integer","title":"Job Posting Id"},"candidate_id":{"type":"integer","title":"Candidate Id"},"stage":{"$ref":"#/components/schemas/ApplicationStage"},"rating":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Rating"},"recruiter_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Recruiter Id"},"notes":{"type":"string","title":"Notes"},"applied_on":{"type":"string","format":"date","title":"Applied On"},"stage_updated_on":{"type":"string","format":"date","title":"Stage Updated On"},"candidate_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Candidate Name"},"candidate_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Candidate Email"},"job_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Job Title"},"job_reference":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Job Reference"},"days_in_pipeline":{"type":"integer","title":"Days In Pipeline","default":0}},"type":"object","required":["id","reference","job_posting_id","candidate_id","stage","rating","recruiter_id","notes","applied_on","stage_updated_on"],"title":"ApplicationDetail"},"ApplicationStage":{"type":"string","enum":["applied","screening","interview","assessment","offer","hired","rejected","withdrawn"],"title":"ApplicationStage"},"ApplicationStageUpdate":{"properties":{"stage":{"$ref":"#/components/schemas/ApplicationStage"},"note":{"type":"string","maxLength":800,"title":"Note","default":""},"rating":{"anyOf":[{"type":"number","maximum":5.0,"minimum":1.0},{"type":"null"}],"title":"Rating"}},"type":"object","required":["stage"],"title":"ApplicationStageUpdate"},"AttritionReport":{"properties":{"period_start":{"type":"string","format":"date","title":"Period Start"},"period_end":{"type":"string","format":"date","title":"Period End"},"starting_headcount":{"type":"integer","title":"Starting Headcount"},"ending_headcount":{"type":"integer","title":"Ending Headcount"},"hires":{"type":"integer","title":"Hires"},"terminations":{"type":"integer","title":"Terminations"},"attrition_rate_pct":{"type":"number","title":"Attrition Rate Pct"},"by_reason":{"additionalProperties":{"type":"integer"},"type":"object","title":"By Reason"},"by_department":{"additionalProperties":{"type":"integer"},"type":"object","title":"By Department"}},"type":"object","required":["period_start","period_end","starting_headcount","ending_headcount","hires","terminations","attrition_rate_pct","by_reason","by_department"],"title":"AttritionReport"},"Body_approve_entries_api_v1_time_entries_approve_post":{"properties":{"entry_ids":{"items":{"type":"integer"},"type":"array","title":"Entry Ids","description":"Time entry ids to approve."}},"type":"object","required":["entry_ids"],"title":"Body_approve_entries_api_v1_time_entries_approve_post"},"CandidateCreate":{"properties":{"first_name":{"type":"string","maxLength":60,"title":"First Name"},"last_name":{"type":"string","maxLength":60,"title":"Last Name"},"email":{"type":"string","format":"email","title":"Email"},"phone":{"anyOf":[{"type":"string","maxLength":32},{"type":"null"}],"title":"Phone"},"source":{"$ref":"#/components/schemas/CandidateSource","default":"careers_page"},"linkedin_url":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Linkedin Url"},"years_experience":{"type":"number","maximum":60.0,"minimum":0.0,"title":"Years Experience","default":0.0},"current_employer":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Current Employer"},"location":{"type":"string","maxLength":80,"title":"Location","description":"City.","default":""},"country":{"type":"string","maxLength":60,"title":"Country","default":""}},"type":"object","required":["first_name","last_name","email"],"title":"CandidateCreate"},"CandidateRead":{"properties":{"id":{"type":"integer","title":"Id"},"first_name":{"type":"string","title":"First Name"},"last_name":{"type":"string","title":"Last Name"},"email":{"type":"string","title":"Email"},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone"},"source":{"$ref":"#/components/schemas/CandidateSource"},"linkedin_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Linkedin Url"},"years_experience":{"type":"number","title":"Years Experience"},"current_employer":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Current Employer"},"location":{"type":"string","title":"Location"},"country":{"type":"string","title":"Country"}},"type":"object","required":["id","first_name","last_name","email","phone","source","linkedin_url","years_experience","current_employer","location","country"],"title":"CandidateRead"},"CandidateSource":{"type":"string","enum":["referral","job_board","linkedin","agency","careers_page","university"],"title":"CandidateSource"},"CompanyOverview":{"properties":{"organisation":{"type":"string","title":"Organisation"},"as_of":{"type":"string","format":"date","title":"As Of"},"currency":{"type":"string","title":"Currency"},"total_employees":{"type":"integer","title":"Total Employees"},"active_employees":{"type":"integer","title":"Active Employees"},"departments":{"type":"integer","title":"Departments"},"avg_tenure_years":{"type":"number","title":"Avg Tenure Years"},"median_salary":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Median Salary"},"total_annual_salary_cost":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Total Annual Salary Cost"},"open_positions":{"type":"integer","title":"Open Positions"},"pending_leave_requests":{"type":"integer","title":"Pending Leave Requests"},"reviews_outstanding":{"type":"integer","title":"Reviews Outstanding"},"headcount_by_department":{"additionalProperties":{"type":"integer"},"type":"object","title":"Headcount By Department"},"headcount_by_location":{"additionalProperties":{"type":"integer"},"type":"object","title":"Headcount By Location","description":"Keyed 'City, Country'."},"headcount_by_country":{"additionalProperties":{"type":"integer"},"type":"object","title":"Headcount By Country"},"headcount_by_employment_type":{"additionalProperties":{"type":"integer"},"type":"object","title":"Headcount By Employment Type"},"tenure_distribution":{"items":{"$ref":"#/components/schemas/TenureBucket"},"type":"array","title":"Tenure Distribution"}},"type":"object","required":["organisation","as_of","currency","total_employees","active_employees","departments","avg_tenure_years","median_salary","total_annual_salary_cost","open_positions","pending_leave_requests","reviews_outstanding","headcount_by_department","headcount_by_location","headcount_by_country","headcount_by_employment_type","tenure_distribution"],"title":"CompanyOverview","description":"The one-call snapshot — handy as a first MCP tool for an agent."},"DepartmentCreate":{"properties":{"code":{"type":"string","maxLength":12,"title":"Code","description":"Short unique code, e.g. 'ENG'."},"name":{"type":"string","maxLength":120,"title":"Name"},"cost_center":{"type":"string","maxLength":20,"title":"Cost Center"},"location":{"type":"string","maxLength":80,"title":"Location","description":"City of the base office."},"country":{"type":"string","maxLength":60,"title":"Country","default":""},"head_employee_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Head Employee Id","description":"Employee id of the department head."},"annual_budget":{"anyOf":[{"type":"number","minimum":0.0},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"}],"title":"Annual Budget","default":"0"},"description":{"type":"string","maxLength":500,"title":"Description","default":""}},"type":"object","required":["code","name","cost_center","location"],"title":"DepartmentCreate"},"DepartmentDetail":{"properties":{"id":{"type":"integer","title":"Id"},"code":{"type":"string","title":"Code"},"name":{"type":"string","title":"Name"},"cost_center":{"type":"string","title":"Cost Center"},"location":{"type":"string","title":"Location"},"country":{"type":"string","title":"Country"},"head_employee_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Head Employee Id"},"annual_budget":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Annual Budget"},"description":{"type":"string","title":"Description"},"head_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Head Name"},"headcount":{"type":"integer","title":"Headcount","description":"Active (non-terminated) employees."},"total_salary_cost":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Total Salary Cost","description":"Sum of active annual salaries."},"open_positions":{"type":"integer","title":"Open Positions"}},"type":"object","required":["id","code","name","cost_center","location","country","head_employee_id","annual_budget","description","headcount","total_salary_cost","open_positions"],"title":"DepartmentDetail"},"DepartmentRead":{"properties":{"id":{"type":"integer","title":"Id"},"code":{"type":"string","title":"Code"},"name":{"type":"string","title":"Name"},"cost_center":{"type":"string","title":"Cost Center"},"location":{"type":"string","title":"Location"},"country":{"type":"string","title":"Country"},"head_employee_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Head Employee Id"},"annual_budget":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Annual Budget"},"description":{"type":"string","title":"Description"}},"type":"object","required":["id","code","name","cost_center","location","country","head_employee_id","annual_budget","description"],"title":"DepartmentRead"},"DepartmentUpdate":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Name"},"cost_center":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"title":"Cost Center"},"location":{"anyOf":[{"type":"string","maxLength":80},{"type":"null"}],"title":"Location"},"country":{"anyOf":[{"type":"string","maxLength":60},{"type":"null"}],"title":"Country"},"head_employee_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Head Employee Id"},"annual_budget":{"anyOf":[{"type":"number","minimum":0.0},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Annual Budget"},"description":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Description"}},"type":"object","title":"DepartmentUpdate"},"EmployeeCreate":{"properties":{"first_name":{"type":"string","maxLength":60,"title":"First Name"},"last_name":{"type":"string","maxLength":60,"title":"Last Name"},"preferred_name":{"anyOf":[{"type":"string","maxLength":60},{"type":"null"}],"title":"Preferred Name"},"work_email":{"type":"string","format":"email","title":"Work Email"},"phone":{"anyOf":[{"type":"string","maxLength":32},{"type":"null"}],"title":"Phone"},"department_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Department Id"},"manager_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Manager Id","description":"Employee id this person reports to."},"position_title":{"type":"string","maxLength":120,"title":"Position Title"},"job_level":{"$ref":"#/components/schemas/JobLevel"},"employment_type":{"$ref":"#/components/schemas/EmploymentType","default":"full_time"},"status":{"$ref":"#/components/schemas/EmployeeStatus","default":"probation"},"location":{"type":"string","maxLength":80,"title":"Location","description":"City the employee works from."},"country":{"type":"string","maxLength":60,"title":"Country"},"hire_date":{"type":"string","format":"date","title":"Hire Date"},"annual_salary":{"anyOf":[{"type":"number","exclusiveMinimum":0.0},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"}],"title":"Annual Salary","description":"Annual gross, denominated in USD."},"currency":{"type":"string","maxLength":3,"minLength":3,"title":"Currency","default":"USD"},"settlement_currency":{"anyOf":[{"type":"string","maxLength":3,"minLength":3},{"type":"null"}],"title":"Settlement Currency","description":"Local currency the pay is settled in. Defaults to the country's currency when omitted."},"pay_grade":{"type":"string","maxLength":8,"title":"Pay Grade","default":"C1"},"date_of_birth":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Date Of Birth"},"employee_number":{"anyOf":[{"type":"string","maxLength":16},{"type":"null"}],"title":"Employee Number","description":"Optional. Auto-generated (EMP####) when omitted."}},"type":"object","required":["first_name","last_name","work_email","position_title","job_level","location","country","hire_date","annual_salary"],"title":"EmployeeCreate"},"EmployeeDetail":{"properties":{"id":{"type":"integer","title":"Id"},"employee_number":{"type":"string","title":"Employee Number"},"first_name":{"type":"string","title":"First Name"},"last_name":{"type":"string","title":"Last Name"},"preferred_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Preferred Name"},"work_email":{"type":"string","title":"Work Email"},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone"},"department_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Department Id"},"manager_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Manager Id"},"position_title":{"type":"string","title":"Position Title"},"job_level":{"$ref":"#/components/schemas/JobLevel"},"employment_type":{"$ref":"#/components/schemas/EmploymentType"},"status":{"$ref":"#/components/schemas/EmployeeStatus"},"location":{"type":"string","title":"Location"},"country":{"type":"string","title":"Country"},"hire_date":{"type":"string","format":"date","title":"Hire Date"},"termination_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Termination Date"},"termination_reason":{"anyOf":[{"$ref":"#/components/schemas/TerminationReason"},{"type":"null"}]},"annual_salary":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Annual Salary"},"currency":{"type":"string","title":"Currency"},"settlement_currency":{"type":"string","title":"Settlement Currency"},"pay_grade":{"type":"string","title":"Pay Grade"},"date_of_birth":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Date Of Birth"},"full_name":{"type":"string","title":"Full Name"},"department_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Department Name"},"manager_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Manager Name"},"direct_report_count":{"type":"integer","title":"Direct Report Count","default":0},"tenure_years":{"type":"number","title":"Tenure Years","default":0.0}},"type":"object","required":["id","employee_number","first_name","last_name","preferred_name","work_email","phone","department_id","manager_id","position_title","job_level","employment_type","status","location","country","hire_date","termination_date","termination_reason","annual_salary","currency","settlement_currency","pay_grade","date_of_birth","full_name"],"title":"EmployeeDetail"},"EmployeeRead":{"properties":{"id":{"type":"integer","title":"Id"},"employee_number":{"type":"string","title":"Employee Number"},"first_name":{"type":"string","title":"First Name"},"last_name":{"type":"string","title":"Last Name"},"preferred_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Preferred Name"},"work_email":{"type":"string","title":"Work Email"},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone"},"department_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Department Id"},"manager_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Manager Id"},"position_title":{"type":"string","title":"Position Title"},"job_level":{"$ref":"#/components/schemas/JobLevel"},"employment_type":{"$ref":"#/components/schemas/EmploymentType"},"status":{"$ref":"#/components/schemas/EmployeeStatus"},"location":{"type":"string","title":"Location"},"country":{"type":"string","title":"Country"},"hire_date":{"type":"string","format":"date","title":"Hire Date"},"termination_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Termination Date"},"termination_reason":{"anyOf":[{"$ref":"#/components/schemas/TerminationReason"},{"type":"null"}]},"annual_salary":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Annual Salary"},"currency":{"type":"string","title":"Currency"},"settlement_currency":{"type":"string","title":"Settlement Currency"},"pay_grade":{"type":"string","title":"Pay Grade"},"date_of_birth":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Date Of Birth"}},"type":"object","required":["id","employee_number","first_name","last_name","preferred_name","work_email","phone","department_id","manager_id","position_title","job_level","employment_type","status","location","country","hire_date","termination_date","termination_reason","annual_salary","currency","settlement_currency","pay_grade","date_of_birth"],"title":"EmployeeRead"},"EmployeeStatus":{"type":"string","enum":["active","probation","on_leave","suspended","terminated"],"title":"EmployeeStatus"},"EmployeeSummary":{"properties":{"id":{"type":"integer","title":"Id"},"employee_number":{"type":"string","title":"Employee Number"},"full_name":{"type":"string","title":"Full Name"},"work_email":{"type":"string","title":"Work Email"},"position_title":{"type":"string","title":"Position Title"},"job_level":{"$ref":"#/components/schemas/JobLevel"},"status":{"$ref":"#/components/schemas/EmployeeStatus"},"department_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Department Id"},"department_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Department Name"},"manager_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Manager Id"},"location":{"type":"string","title":"Location"},"country":{"type":"string","title":"Country","default":""},"hire_date":{"type":"string","format":"date","title":"Hire Date"},"annual_salary":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Annual Salary"},"currency":{"type":"string","title":"Currency","default":"USD"},"settlement_currency":{"type":"string","title":"Settlement Currency","default":"USD"}},"type":"object","required":["id","employee_number","full_name","work_email","position_title","job_level","status","department_id","location","hire_date","annual_salary"],"title":"EmployeeSummary","description":"Compact shape used in lists and nested references.\n\nCarries `annual_salary` so a caller that sorted or filtered on pay can read the\nfigure it sorted by, instead of following up with a request per row."},"EmployeeUpdate":{"properties":{"first_name":{"anyOf":[{"type":"string","maxLength":60},{"type":"null"}],"title":"First Name"},"last_name":{"anyOf":[{"type":"string","maxLength":60},{"type":"null"}],"title":"Last Name"},"preferred_name":{"anyOf":[{"type":"string","maxLength":60},{"type":"null"}],"title":"Preferred Name"},"work_email":{"anyOf":[{"type":"string","format":"email"},{"type":"null"}],"title":"Work Email"},"phone":{"anyOf":[{"type":"string","maxLength":32},{"type":"null"}],"title":"Phone"},"department_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Department Id"},"manager_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Manager Id"},"position_title":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Position Title"},"job_level":{"anyOf":[{"$ref":"#/components/schemas/JobLevel"},{"type":"null"}]},"employment_type":{"anyOf":[{"$ref":"#/components/schemas/EmploymentType"},{"type":"null"}]},"status":{"anyOf":[{"$ref":"#/components/schemas/EmployeeStatus"},{"type":"null"}]},"location":{"anyOf":[{"type":"string","maxLength":80},{"type":"null"}],"title":"Location"},"country":{"anyOf":[{"type":"string","maxLength":60},{"type":"null"}],"title":"Country","description":"Relocations re-derive settlement_currency unless one is sent explicitly."},"settlement_currency":{"anyOf":[{"type":"string","maxLength":3,"minLength":3},{"type":"null"}],"title":"Settlement Currency"},"annual_salary":{"anyOf":[{"type":"number","exclusiveMinimum":0.0},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Annual Salary"},"pay_grade":{"anyOf":[{"type":"string","maxLength":8},{"type":"null"}],"title":"Pay Grade"}},"type":"object","title":"EmployeeUpdate","description":"Partial update. Only the fields you send are changed."},"EmploymentType":{"type":"string","enum":["full_time","part_time","contract","intern"],"title":"EmploymentType"},"EnrollmentCreate":{"properties":{"employee_id":{"type":"integer","title":"Employee Id"},"course_id":{"type":"integer","title":"Course Id"},"enrolled_on":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Enrolled On","description":"Defaults to today."}},"type":"object","required":["employee_id","course_id"],"title":"EnrollmentCreate"},"EnrollmentDetail":{"properties":{"id":{"type":"integer","title":"Id"},"employee_id":{"type":"integer","title":"Employee Id"},"course_id":{"type":"integer","title":"Course Id"},"status":{"$ref":"#/components/schemas/EnrollmentStatus"},"enrolled_on":{"type":"string","format":"date","title":"Enrolled On"},"completed_on":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Completed On"},"score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Score"},"employee_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Employee Name"},"course_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Course Title"},"course_category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Course Category"}},"type":"object","required":["id","employee_id","course_id","status","enrolled_on","completed_on","score"],"title":"EnrollmentDetail"},"EnrollmentStatus":{"type":"string","enum":["enrolled","in_progress","completed","failed","cancelled"],"title":"EnrollmentStatus"},"EnrollmentUpdate":{"properties":{"status":{"$ref":"#/components/schemas/EnrollmentStatus"},"score":{"anyOf":[{"type":"number","maximum":100.0,"minimum":0.0},{"type":"null"}],"title":"Score"},"completed_on":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Completed On"}},"type":"object","required":["status"],"title":"EnrollmentUpdate"},"GoalCreate":{"properties":{"employee_id":{"type":"integer","title":"Employee Id"},"cycle":{"type":"string","maxLength":16,"title":"Cycle"},"title":{"type":"string","maxLength":200,"title":"Title"},"description":{"type":"string","maxLength":600,"title":"Description","default":""},"metric":{"type":"string","maxLength":160,"title":"Metric","default":""},"target_date":{"type":"string","format":"date","title":"Target Date"},"weight_pct":{"type":"integer","maximum":100.0,"minimum":0.0,"title":"Weight Pct","default":25}},"type":"object","required":["employee_id","cycle","title","target_date"],"title":"GoalCreate"},"GoalRead":{"properties":{"id":{"type":"integer","title":"Id"},"employee_id":{"type":"integer","title":"Employee Id"},"cycle":{"type":"string","title":"Cycle"},"title":{"type":"string","title":"Title"},"description":{"type":"string","title":"Description"},"metric":{"type":"string","title":"Metric"},"target_date":{"type":"string","format":"date","title":"Target Date"},"progress_pct":{"type":"integer","title":"Progress Pct"},"status":{"$ref":"#/components/schemas/GoalStatus"},"weight_pct":{"type":"integer","title":"Weight Pct"}},"type":"object","required":["id","employee_id","cycle","title","description","metric","target_date","progress_pct","status","weight_pct"],"title":"GoalRead"},"GoalStatus":{"type":"string","enum":["not_started","in_progress","at_risk","completed","abandoned"],"title":"GoalStatus"},"GoalUpdate":{"properties":{"title":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Title"},"description":{"anyOf":[{"type":"string","maxLength":600},{"type":"null"}],"title":"Description"},"metric":{"anyOf":[{"type":"string","maxLength":160},{"type":"null"}],"title":"Metric"},"target_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Target Date"},"progress_pct":{"anyOf":[{"type":"integer","maximum":100.0,"minimum":0.0},{"type":"null"}],"title":"Progress Pct"},"status":{"anyOf":[{"$ref":"#/components/schemas/GoalStatus"},{"type":"null"}]},"weight_pct":{"anyOf":[{"type":"integer","maximum":100.0,"minimum":0.0},{"type":"null"}],"title":"Weight Pct"}},"type":"object","title":"GoalUpdate"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"HeadcountReport":{"properties":{"as_of":{"type":"string","format":"date","title":"As Of"},"total_headcount":{"type":"integer","title":"Total Headcount"},"total_salary_cost":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Total Salary Cost"},"currency":{"type":"string","title":"Currency"},"rows":{"items":{"$ref":"#/components/schemas/HeadcountRow"},"type":"array","title":"Rows"}},"type":"object","required":["as_of","total_headcount","total_salary_cost","currency","rows"],"title":"HeadcountReport"},"HeadcountRow":{"properties":{"department_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Department Id"},"department_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Department Code"},"department_name":{"type":"string","title":"Department Name"},"headcount":{"type":"integer","title":"Headcount"},"active":{"type":"integer","title":"Active"},"on_leave":{"type":"integer","title":"On Leave"},"probation":{"type":"integer","title":"Probation"},"contractors":{"type":"integer","title":"Contractors"},"avg_salary":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Avg Salary"},"total_salary":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Total Salary"}},"type":"object","required":["department_id","department_code","department_name","headcount","active","on_leave","probation","contractors","avg_salary","total_salary"],"title":"HeadcountRow"},"JobLevel":{"type":"string","enum":["intern","junior","intermediate","senior","lead","manager","head","executive"],"title":"JobLevel"},"JobPostingCreate":{"properties":{"title":{"type":"string","maxLength":140,"title":"Title"},"department_id":{"type":"integer","title":"Department Id"},"hiring_manager_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Hiring Manager Id"},"location":{"type":"string","maxLength":80,"title":"Location","description":"City the role is based in."},"country":{"type":"string","maxLength":60,"title":"Country","default":""},"employment_type":{"$ref":"#/components/schemas/EmploymentType","default":"full_time"},"job_level":{"$ref":"#/components/schemas/JobLevel","default":"intermediate"},"openings":{"type":"integer","minimum":1.0,"title":"Openings","default":1},"salary_min":{"anyOf":[{"type":"number","exclusiveMinimum":0.0},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"}],"title":"Salary Min"},"salary_max":{"anyOf":[{"type":"number","exclusiveMinimum":0.0},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"}],"title":"Salary Max"},"currency":{"type":"string","maxLength":3,"minLength":3,"title":"Currency","default":"USD"},"status":{"$ref":"#/components/schemas/PostingStatus","default":"open"},"description":{"type":"string","maxLength":2000,"title":"Description","default":""},"posted_on":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Posted On","description":"Defaults to today."},"closes_on":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Closes On"}},"type":"object","required":["title","department_id","location","salary_min","salary_max"],"title":"JobPostingCreate"},"JobPostingDetail":{"properties":{"id":{"type":"integer","title":"Id"},"reference":{"type":"string","title":"Reference"},"title":{"type":"string","title":"Title"},"department_id":{"type":"integer","title":"Department Id"},"hiring_manager_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Hiring Manager Id"},"location":{"type":"string","title":"Location"},"country":{"type":"string","title":"Country"},"employment_type":{"$ref":"#/components/schemas/EmploymentType"},"job_level":{"$ref":"#/components/schemas/JobLevel"},"openings":{"type":"integer","title":"Openings"},"salary_min":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Salary Min"},"salary_max":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Salary Max"},"currency":{"type":"string","title":"Currency"},"status":{"$ref":"#/components/schemas/PostingStatus"},"description":{"type":"string","title":"Description"},"posted_on":{"type":"string","format":"date","title":"Posted On"},"closes_on":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Closes On"},"department_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Department Name"},"hiring_manager_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hiring Manager Name"},"application_count":{"type":"integer","title":"Application Count","default":0},"applications_by_stage":{"additionalProperties":{"type":"integer"},"type":"object","title":"Applications By Stage"},"days_open":{"type":"integer","title":"Days Open","default":0}},"type":"object","required":["id","reference","title","department_id","hiring_manager_id","location","country","employment_type","job_level","openings","salary_min","salary_max","currency","status","description","posted_on","closes_on"],"title":"JobPostingDetail"},"JobPostingRead":{"properties":{"id":{"type":"integer","title":"Id"},"reference":{"type":"string","title":"Reference"},"title":{"type":"string","title":"Title"},"department_id":{"type":"integer","title":"Department Id"},"hiring_manager_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Hiring Manager Id"},"location":{"type":"string","title":"Location"},"country":{"type":"string","title":"Country"},"employment_type":{"$ref":"#/components/schemas/EmploymentType"},"job_level":{"$ref":"#/components/schemas/JobLevel"},"openings":{"type":"integer","title":"Openings"},"salary_min":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Salary Min"},"salary_max":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Salary Max"},"currency":{"type":"string","title":"Currency"},"status":{"$ref":"#/components/schemas/PostingStatus"},"description":{"type":"string","title":"Description"},"posted_on":{"type":"string","format":"date","title":"Posted On"},"closes_on":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Closes On"}},"type":"object","required":["id","reference","title","department_id","hiring_manager_id","location","country","employment_type","job_level","openings","salary_min","salary_max","currency","status","description","posted_on","closes_on"],"title":"JobPostingRead"},"JobPostingUpdate":{"properties":{"title":{"anyOf":[{"type":"string","maxLength":140},{"type":"null"}],"title":"Title"},"status":{"anyOf":[{"$ref":"#/components/schemas/PostingStatus"},{"type":"null"}]},"openings":{"anyOf":[{"type":"integer","minimum":1.0},{"type":"null"}],"title":"Openings"},"hiring_manager_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Hiring Manager Id"},"salary_min":{"anyOf":[{"type":"number","exclusiveMinimum":0.0},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Salary Min"},"salary_max":{"anyOf":[{"type":"number","exclusiveMinimum":0.0},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Salary Max"},"closes_on":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Closes On"},"description":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Description"}},"type":"object","title":"JobPostingUpdate"},"LeaveBalanceRead":{"properties":{"id":{"type":"integer","title":"Id"},"employee_id":{"type":"integer","title":"Employee Id"},"leave_type_id":{"type":"integer","title":"Leave Type Id"},"leave_type_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Leave Type Code"},"leave_type_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Leave Type Name"},"year":{"type":"integer","title":"Year"},"entitled_days":{"type":"number","title":"Entitled Days"},"carried_over_days":{"type":"number","title":"Carried Over Days"},"taken_days":{"type":"number","title":"Taken Days"},"pending_days":{"type":"number","title":"Pending Days"},"available_days":{"type":"number","title":"Available Days"}},"type":"object","required":["id","employee_id","leave_type_id","year","entitled_days","carried_over_days","taken_days","pending_days","available_days"],"title":"LeaveBalanceRead"},"LeaveDecision":{"properties":{"approver_id":{"type":"integer","title":"Approver Id","description":"Employee id of the person deciding."},"note":{"type":"string","maxLength":400,"title":"Note","default":""}},"type":"object","required":["approver_id"],"title":"LeaveDecision"},"LeaveRequestCreate":{"properties":{"employee_id":{"type":"integer","title":"Employee Id"},"leave_type_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Leave Type Id","description":"Provide this or `leave_type_code`."},"leave_type_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Leave Type Code","description":"Convenience alternative to `leave_type_id`, e.g. 'AL'."},"start_date":{"type":"string","format":"date","title":"Start Date"},"end_date":{"type":"string","format":"date","title":"End Date"},"reason":{"type":"string","maxLength":400,"title":"Reason","default":""}},"type":"object","required":["employee_id","start_date","end_date"],"title":"LeaveRequestCreate"},"LeaveRequestDetail":{"properties":{"id":{"type":"integer","title":"Id"},"reference":{"type":"string","title":"Reference"},"employee_id":{"type":"integer","title":"Employee Id"},"leave_type_id":{"type":"integer","title":"Leave Type Id"},"start_date":{"type":"string","format":"date","title":"Start Date"},"end_date":{"type":"string","format":"date","title":"End Date"},"working_days":{"type":"number","title":"Working Days"},"reason":{"type":"string","title":"Reason"},"status":{"$ref":"#/components/schemas/LeaveStatus"},"approver_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Approver Id"},"decision_note":{"type":"string","title":"Decision Note"},"requested_at":{"type":"string","format":"date-time","title":"Requested At"},"decided_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Decided At"},"employee_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Employee Name"},"employee_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Employee Number"},"leave_type_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Leave Type Name"},"approver_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Approver Name"}},"type":"object","required":["id","reference","employee_id","leave_type_id","start_date","end_date","working_days","reason","status","approver_id","decision_note","requested_at","decided_at"],"title":"LeaveRequestDetail"},"LeaveStatus":{"type":"string","enum":["pending","approved","rejected","cancelled"],"title":"LeaveStatus"},"LeaveTypeRead":{"properties":{"id":{"type":"integer","title":"Id"},"code":{"type":"string","title":"Code"},"name":{"type":"string","title":"Name"},"annual_entitlement_days":{"type":"number","title":"Annual Entitlement Days"},"is_paid":{"type":"boolean","title":"Is Paid"},"requires_approval":{"type":"boolean","title":"Requires Approval"},"max_carryover_days":{"type":"number","title":"Max Carryover Days"},"accrual_method":{"type":"string","title":"Accrual Method"},"description":{"type":"string","title":"Description"}},"type":"object","required":["id","code","name","annual_entitlement_days","is_paid","requires_approval","max_carryover_days","accrual_method","description"],"title":"LeaveTypeRead"},"LeaveUtilisationRow":{"properties":{"leave_type_code":{"type":"string","title":"Leave Type Code"},"leave_type_name":{"type":"string","title":"Leave Type Name"},"employees_with_balance":{"type":"integer","title":"Employees With Balance"},"total_entitled":{"type":"number","title":"Total Entitled"},"total_taken":{"type":"number","title":"Total Taken"},"total_pending":{"type":"number","title":"Total Pending"},"utilisation_pct":{"type":"number","title":"Utilisation Pct"}},"type":"object","required":["leave_type_code","leave_type_name","employees_with_balance","total_entitled","total_taken","total_pending","utilisation_pct"],"title":"LeaveUtilisationRow"},"OrgNode":{"properties":{"id":{"type":"integer","title":"Id"},"employee_number":{"type":"string","title":"Employee Number"},"full_name":{"type":"string","title":"Full Name"},"position_title":{"type":"string","title":"Position Title"},"job_level":{"$ref":"#/components/schemas/JobLevel"},"department_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Department Name"},"direct_reports":{"items":{"$ref":"#/components/schemas/OrgNode"},"type":"array","title":"Direct Reports"},"total_subtree_size":{"type":"integer","title":"Total Subtree Size","default":0}},"type":"object","required":["id","employee_number","full_name","position_title","job_level","department_name"],"title":"OrgNode","description":"One node of the reporting tree, with its subtree inlined."},"Page_ApplicationDetail_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/ApplicationDetail"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total","description":"Total rows matching the filter, ignoring paging."},"limit":{"type":"integer","title":"Limit"},"offset":{"type":"integer","title":"Offset"}},"type":"object","required":["items","total","limit","offset"],"title":"Page[ApplicationDetail]"},"Page_CandidateRead_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/CandidateRead"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total","description":"Total rows matching the filter, ignoring paging."},"limit":{"type":"integer","title":"Limit"},"offset":{"type":"integer","title":"Offset"}},"type":"object","required":["items","total","limit","offset"],"title":"Page[CandidateRead]"},"Page_DepartmentDetail_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/DepartmentDetail"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total","description":"Total rows matching the filter, ignoring paging."},"limit":{"type":"integer","title":"Limit"},"offset":{"type":"integer","title":"Offset"}},"type":"object","required":["items","total","limit","offset"],"title":"Page[DepartmentDetail]"},"Page_EmployeeSummary_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/EmployeeSummary"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total","description":"Total rows matching the filter, ignoring paging."},"limit":{"type":"integer","title":"Limit"},"offset":{"type":"integer","title":"Offset"}},"type":"object","required":["items","total","limit","offset"],"title":"Page[EmployeeSummary]"},"Page_EnrollmentDetail_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/EnrollmentDetail"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total","description":"Total rows matching the filter, ignoring paging."},"limit":{"type":"integer","title":"Limit"},"offset":{"type":"integer","title":"Offset"}},"type":"object","required":["items","total","limit","offset"],"title":"Page[EnrollmentDetail]"},"Page_GoalRead_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/GoalRead"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total","description":"Total rows matching the filter, ignoring paging."},"limit":{"type":"integer","title":"Limit"},"offset":{"type":"integer","title":"Offset"}},"type":"object","required":["items","total","limit","offset"],"title":"Page[GoalRead]"},"Page_JobPostingDetail_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/JobPostingDetail"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total","description":"Total rows matching the filter, ignoring paging."},"limit":{"type":"integer","title":"Limit"},"offset":{"type":"integer","title":"Offset"}},"type":"object","required":["items","total","limit","offset"],"title":"Page[JobPostingDetail]"},"Page_LeaveRequestDetail_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/LeaveRequestDetail"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total","description":"Total rows matching the filter, ignoring paging."},"limit":{"type":"integer","title":"Limit"},"offset":{"type":"integer","title":"Offset"}},"type":"object","required":["items","total","limit","offset"],"title":"Page[LeaveRequestDetail]"},"Page_PayrollRecordRead_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/PayrollRecordRead"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total","description":"Total rows matching the filter, ignoring paging."},"limit":{"type":"integer","title":"Limit"},"offset":{"type":"integer","title":"Offset"}},"type":"object","required":["items","total","limit","offset"],"title":"Page[PayrollRecordRead]"},"Page_ReviewDetail_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/ReviewDetail"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total","description":"Total rows matching the filter, ignoring paging."},"limit":{"type":"integer","title":"Limit"},"offset":{"type":"integer","title":"Offset"}},"type":"object","required":["items","total","limit","offset"],"title":"Page[ReviewDetail]"},"Page_TimeEntryRead_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/TimeEntryRead"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total","description":"Total rows matching the filter, ignoring paging."},"limit":{"type":"integer","title":"Limit"},"offset":{"type":"integer","title":"Offset"}},"type":"object","required":["items","total","limit","offset"],"title":"Page[TimeEntryRead]"},"Page_TrainingCourseRead_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/TrainingCourseRead"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total","description":"Total rows matching the filter, ignoring paging."},"limit":{"type":"integer","title":"Limit"},"offset":{"type":"integer","title":"Offset"}},"type":"object","required":["items","total","limit","offset"],"title":"Page[TrainingCourseRead]"},"PayrollRecordRead":{"properties":{"id":{"type":"integer","title":"Id"},"employee_id":{"type":"integer","title":"Employee Id"},"period":{"type":"string","title":"Period"},"gross_pay":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Gross Pay"},"tax":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Tax"},"pension":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Pension"},"medical_aid":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Medical Aid"},"other_deductions":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Other Deductions"},"bonus":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Bonus"},"net_pay":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Net Pay"},"currency":{"type":"string","title":"Currency","description":"Currency the amounts are denominated in."},"settlement_currency":{"type":"string","title":"Settlement Currency","description":"Local currency the payment is settled in."},"status":{"$ref":"#/components/schemas/PayrollStatus"},"paid_on":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Paid On"}},"type":"object","required":["id","employee_id","period","gross_pay","tax","pension","medical_aid","other_deductions","bonus","net_pay","currency","settlement_currency","status","paid_on"],"title":"PayrollRecordRead"},"PayrollRunSummary":{"properties":{"period":{"type":"string","title":"Period"},"employees_paid":{"type":"integer","title":"Employees Paid"},"total_gross":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Total Gross"},"total_tax":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Total Tax"},"total_pension":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Total Pension"},"total_medical_aid":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Total Medical Aid"},"total_bonus":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Total Bonus"},"total_net":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Total Net"},"currency":{"type":"string","title":"Currency"},"by_department":{"additionalProperties":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},"type":"object","title":"By Department"},"by_settlement_currency":{"additionalProperties":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},"type":"object","title":"By Settlement Currency","description":"Gross pay per settlement currency (amounts still denominated in `currency`) — how much of the run settles in each local currency."}},"type":"object","required":["period","employees_paid","total_gross","total_tax","total_pension","total_medical_aid","total_bonus","total_net","currency","by_department"],"title":"PayrollRunSummary"},"PayrollStatus":{"type":"string","enum":["draft","approved","paid"],"title":"PayrollStatus"},"PostingStatus":{"type":"string","enum":["draft","open","on_hold","filled","closed"],"title":"PostingStatus"},"RecruitmentFunnel":{"properties":{"open_postings":{"type":"integer","title":"Open Postings"},"total_openings":{"type":"integer","title":"Total Openings"},"total_applications":{"type":"integer","title":"Total Applications"},"by_stage":{"additionalProperties":{"type":"integer"},"type":"object","title":"By Stage"},"conversion_to_interview_pct":{"type":"number","title":"Conversion To Interview Pct"},"conversion_to_offer_pct":{"type":"number","title":"Conversion To Offer Pct"},"conversion_to_hire_pct":{"type":"number","title":"Conversion To Hire Pct"},"avg_days_to_hire":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg Days To Hire"},"by_source":{"additionalProperties":{"type":"integer"},"type":"object","title":"By Source"}},"type":"object","required":["open_postings","total_openings","total_applications","by_stage","conversion_to_interview_pct","conversion_to_offer_pct","conversion_to_hire_pct","avg_days_to_hire","by_source"],"title":"RecruitmentFunnel"},"ReviewCreate":{"properties":{"employee_id":{"type":"integer","title":"Employee Id"},"reviewer_id":{"type":"integer","title":"Reviewer Id"},"cycle":{"type":"string","maxLength":16,"title":"Cycle","description":"e.g. '2026-H1'."},"review_type":{"$ref":"#/components/schemas/ReviewType","default":"annual"},"overall_rating":{"anyOf":[{"type":"number","maximum":5.0,"minimum":1.0},{"type":"null"}],"title":"Overall Rating"},"goals_rating":{"anyOf":[{"type":"number","maximum":5.0,"minimum":1.0},{"type":"null"}],"title":"Goals Rating"},"competency_rating":{"anyOf":[{"type":"number","maximum":5.0,"minimum":1.0},{"type":"null"}],"title":"Competency Rating"},"strengths":{"type":"string","maxLength":1000,"title":"Strengths","default":""},"improvements":{"type":"string","maxLength":1000,"title":"Improvements","default":""},"reviewer_comments":{"type":"string","maxLength":1000,"title":"Reviewer Comments","default":""}},"type":"object","required":["employee_id","reviewer_id","cycle"],"title":"ReviewCreate"},"ReviewDetail":{"properties":{"id":{"type":"integer","title":"Id"},"employee_id":{"type":"integer","title":"Employee Id"},"reviewer_id":{"type":"integer","title":"Reviewer Id"},"cycle":{"type":"string","title":"Cycle"},"review_type":{"$ref":"#/components/schemas/ReviewType"},"status":{"$ref":"#/components/schemas/ReviewStatus"},"overall_rating":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Overall Rating"},"goals_rating":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Goals Rating"},"competency_rating":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Competency Rating"},"strengths":{"type":"string","title":"Strengths"},"improvements":{"type":"string","title":"Improvements"},"reviewer_comments":{"type":"string","title":"Reviewer Comments"},"submitted_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Submitted At"},"employee_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Employee Name"},"reviewer_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reviewer Name"}},"type":"object","required":["id","employee_id","reviewer_id","cycle","review_type","status","overall_rating","goals_rating","competency_rating","strengths","improvements","reviewer_comments","submitted_at"],"title":"ReviewDetail"},"ReviewStatus":{"type":"string","enum":["draft","submitted","acknowledged"],"title":"ReviewStatus"},"ReviewType":{"type":"string","enum":["annual","mid_year","probation","project"],"title":"ReviewType"},"ReviewUpdate":{"properties":{"status":{"anyOf":[{"$ref":"#/components/schemas/ReviewStatus"},{"type":"null"}]},"overall_rating":{"anyOf":[{"type":"number","maximum":5.0,"minimum":1.0},{"type":"null"}],"title":"Overall Rating"},"goals_rating":{"anyOf":[{"type":"number","maximum":5.0,"minimum":1.0},{"type":"null"}],"title":"Goals Rating"},"competency_rating":{"anyOf":[{"type":"number","maximum":5.0,"minimum":1.0},{"type":"null"}],"title":"Competency Rating"},"strengths":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Strengths"},"improvements":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Improvements"},"reviewer_comments":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Reviewer Comments"}},"type":"object","title":"ReviewUpdate"},"SalaryBandRow":{"properties":{"job_level":{"$ref":"#/components/schemas/JobLevel"},"employees":{"type":"integer","title":"Employees"},"min_salary":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Min Salary"},"median_salary":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Median Salary"},"max_salary":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Max Salary"},"avg_salary":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Avg Salary"},"currency":{"type":"string","title":"Currency"}},"type":"object","required":["job_level","employees","min_salary","median_salary","max_salary","avg_salary","currency"],"title":"SalaryBandRow"},"TenureBucket":{"properties":{"bucket":{"type":"string","title":"Bucket"},"employees":{"type":"integer","title":"Employees"},"pct_of_workforce":{"type":"number","title":"Pct Of Workforce"}},"type":"object","required":["bucket","employees","pct_of_workforce"],"title":"TenureBucket"},"TerminateEmployee":{"properties":{"termination_date":{"type":"string","format":"date","title":"Termination Date"},"reason":{"$ref":"#/components/schemas/TerminationReason"},"note":{"type":"string","maxLength":400,"title":"Note","default":""}},"type":"object","required":["termination_date","reason"],"title":"TerminateEmployee"},"TerminationReason":{"type":"string","enum":["resignation","retirement","redundancy","dismissal","end_of_contract"],"title":"TerminationReason"},"TimeEntryCreate":{"properties":{"employee_id":{"type":"integer","title":"Employee Id"},"work_date":{"type":"string","format":"date","title":"Work Date"},"hours":{"type":"number","maximum":24.0,"exclusiveMinimum":0.0,"title":"Hours"},"project_code":{"type":"string","maxLength":20,"title":"Project Code"},"billable":{"type":"boolean","title":"Billable","default":true},"description":{"type":"string","maxLength":300,"title":"Description","default":""}},"type":"object","required":["employee_id","work_date","hours","project_code"],"title":"TimeEntryCreate"},"TimeEntryRead":{"properties":{"id":{"type":"integer","title":"Id"},"employee_id":{"type":"integer","title":"Employee Id"},"work_date":{"type":"string","format":"date","title":"Work Date"},"hours":{"type":"number","title":"Hours"},"project_code":{"type":"string","title":"Project Code"},"billable":{"type":"boolean","title":"Billable"},"description":{"type":"string","title":"Description"},"approved":{"type":"boolean","title":"Approved"}},"type":"object","required":["id","employee_id","work_date","hours","project_code","billable","description","approved"],"title":"TimeEntryRead"},"TimesheetSummary":{"properties":{"employee_id":{"type":"integer","title":"Employee Id"},"employee_name":{"type":"string","title":"Employee Name"},"period_start":{"type":"string","format":"date","title":"Period Start"},"period_end":{"type":"string","format":"date","title":"Period End"},"total_hours":{"type":"number","title":"Total Hours"},"billable_hours":{"type":"number","title":"Billable Hours"},"non_billable_hours":{"type":"number","title":"Non Billable Hours"},"billable_pct":{"type":"number","title":"Billable Pct"},"approved_hours":{"type":"number","title":"Approved Hours"},"entries":{"type":"integer","title":"Entries"},"by_project":{"additionalProperties":{"type":"number"},"type":"object","title":"By Project"}},"type":"object","required":["employee_id","employee_name","period_start","period_end","total_hours","billable_hours","non_billable_hours","billable_pct","approved_hours","entries","by_project"],"title":"TimesheetSummary"},"TrainingCourseRead":{"properties":{"id":{"type":"integer","title":"Id"},"code":{"type":"string","title":"Code"},"title":{"type":"string","title":"Title"},"provider":{"type":"string","title":"Provider"},"category":{"type":"string","title":"Category"},"duration_hours":{"type":"number","title":"Duration Hours"},"cost":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Cost"},"currency":{"type":"string","title":"Currency"},"grants_certification":{"type":"boolean","title":"Grants Certification"},"description":{"type":"string","title":"Description"}},"type":"object","required":["id","code","title","provider","category","duration_hours","cost","currency","grants_certification","description"],"title":"TrainingCourseRead"},"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"}}},"tags":[{"name":"Analytics","description":"Read-only aggregate reporting."},{"name":"Employees","description":"Directory, lifecycle and hierarchy."},{"name":"Departments","description":"Org structure, budgets and cost centres."},{"name":"Leave","description":"Entitlements, balances, requests and approvals."},{"name":"Time & Attendance","description":"Timesheets and project hours."},{"name":"Performance","description":"Review cycles and goals."},{"name":"Recruitment","description":"Vacancies, candidates and the pipeline."},{"name":"Payroll","description":"Payslips, runs and period totals."},{"name":"Learning & Development","description":"Course catalogue and enrollments."},{"name":"Service","description":"Health and service metadata."}]}