openapi: 3.0.3 info: title: WorkMotion Partner API description: >- Partner / Open API for the WorkMotion global employment and Employer of Record (EOR) platform. It exposes employees (talents), employment contracts, onboarding workflows, absences and time-off, documents, employment cost calculations, and webhook subscriptions so that HRIS and payroll systems can integrate with WorkMotion's managed employment infrastructure across 160+ countries. NOTE: WorkMotion's partner API is access-gated and its reference documentation is not fully published to the open web. The paths and schemas below are a faithful, honest model of the documented product surfaces (employees, contracts, onboarding, absences, documents, cost calculator, webhooks) rather than a verbatim copy of an official OpenAPI file. Verify exact paths, fields, and semantics against the WorkMotion partner documentation during reconciliation. termsOfService: https://workmotion.com/terms-and-conditions/ contact: name: WorkMotion url: https://workmotion.com/integrations/ version: '1.0' servers: - url: https://api.workmotion.com/v1 description: Production (modeled base URL; confirm with partner documentation) security: - bearerAuth: [] tags: - name: Employees description: Talents employed through WorkMotion. - name: Contracts description: Employment contracts and contract changes. - name: Onboarding description: Accelerated global onboarding workflows. - name: Absences description: Time-off and leave management. - name: Documents description: Employment documents attached to a talent. - name: Cost Calculator description: Employment cost estimation by country. - name: Webhooks description: Event subscription management. paths: /employees: get: operationId: listEmployees tags: - Employees summary: List employees description: Returns a paginated list of talents employed through WorkMotion. parameters: - $ref: '#/components/parameters/PageParam' - $ref: '#/components/parameters/PageSizeParam' - name: status in: query required: false schema: type: string enum: [onboarding, active, offboarding, terminated] - name: country in: query required: false description: ISO 3166-1 alpha-2 country of employment. schema: type: string responses: '200': description: A page of employees. content: application/json: schema: $ref: '#/components/schemas/EmployeeList' '401': $ref: '#/components/responses/Unauthorized' post: operationId: createEmployee tags: - Employees summary: Create an employee description: Creates a new talent record, typically the first step of onboarding. requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/EmployeeCreate' responses: '201': description: Employee created. content: application/json: schema: $ref: '#/components/schemas/Employee' '401': $ref: '#/components/responses/Unauthorized' /employees/{employeeId}: parameters: - $ref: '#/components/parameters/EmployeeIdParam' get: operationId: getEmployee tags: - Employees summary: Retrieve an employee responses: '200': description: The requested employee. content: application/json: schema: $ref: '#/components/schemas/Employee' '404': $ref: '#/components/responses/NotFound' patch: operationId: updateEmployee tags: - Employees summary: Update an employee requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/EmployeeUpdate' responses: '200': description: The updated employee. content: application/json: schema: $ref: '#/components/schemas/Employee' '404': $ref: '#/components/responses/NotFound' /employees/{employeeId}/contracts: parameters: - $ref: '#/components/parameters/EmployeeIdParam' get: operationId: listEmployeeContracts tags: - Contracts summary: List contracts for an employee responses: '200': description: Contracts belonging to the employee. content: application/json: schema: $ref: '#/components/schemas/ContractList' post: operationId: createContract tags: - Contracts summary: Generate a contract for an employee description: Generates a legally compliant employment contract for the talent. requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/ContractCreate' responses: '201': description: Contract created. content: application/json: schema: $ref: '#/components/schemas/Contract' /contracts/{contractId}: parameters: - $ref: '#/components/parameters/ContractIdParam' get: operationId: getContract tags: - Contracts summary: Retrieve a contract responses: '200': description: The requested contract. content: application/json: schema: $ref: '#/components/schemas/Contract' '404': $ref: '#/components/responses/NotFound' patch: operationId: updateContract tags: - Contracts summary: Amend a contract description: Applies a contract change (e.g., compensation or terms) to an existing contract. requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/ContractChange' responses: '200': description: The amended contract. content: application/json: schema: $ref: '#/components/schemas/Contract' /onboardings: post: operationId: startOnboarding tags: - Onboarding summary: Start an onboarding description: Initiates an accelerated onboarding for a new hire in a given country. requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/OnboardingCreate' responses: '201': description: Onboarding started. content: application/json: schema: $ref: '#/components/schemas/Onboarding' /onboardings/{onboardingId}: parameters: - $ref: '#/components/parameters/OnboardingIdParam' get: operationId: getOnboarding tags: - Onboarding summary: Retrieve onboarding status responses: '200': description: The onboarding record with its current step. content: application/json: schema: $ref: '#/components/schemas/Onboarding' '404': $ref: '#/components/responses/NotFound' /absences: get: operationId: listAbsences tags: - Absences summary: List absences parameters: - name: employeeId in: query required: false schema: type: string - $ref: '#/components/parameters/PageParam' - $ref: '#/components/parameters/PageSizeParam' responses: '200': description: A page of absences. content: application/json: schema: $ref: '#/components/schemas/AbsenceList' post: operationId: createAbsence tags: - Absences summary: Submit an absence request requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/AbsenceCreate' responses: '201': description: Absence request created. content: application/json: schema: $ref: '#/components/schemas/Absence' /absences/{absenceId}: parameters: - $ref: '#/components/parameters/AbsenceIdParam' get: operationId: getAbsence tags: - Absences summary: Retrieve an absence responses: '200': description: The requested absence. content: application/json: schema: $ref: '#/components/schemas/Absence' '404': $ref: '#/components/responses/NotFound' /employees/{employeeId}/documents: parameters: - $ref: '#/components/parameters/EmployeeIdParam' get: operationId: listDocuments tags: - Documents summary: List documents for an employee responses: '200': description: Documents attached to the employee. content: application/json: schema: $ref: '#/components/schemas/DocumentList' post: operationId: uploadDocument tags: - Documents summary: Upload a document for an employee requestBody: required: true content: multipart/form-data: schema: type: object properties: file: type: string format: binary type: type: string description: Document category (e.g., contract, payslip, compliance). required: - file responses: '201': description: Document uploaded. content: application/json: schema: $ref: '#/components/schemas/Document' /documents/{documentId}: parameters: - $ref: '#/components/parameters/DocumentIdParam' get: operationId: downloadDocument tags: - Documents summary: Download a document responses: '200': description: The document binary. content: application/octet-stream: schema: type: string format: binary '404': $ref: '#/components/responses/NotFound' /cost-calculator: post: operationId: calculateEmploymentCost tags: - Cost Calculator summary: Calculate employment cost description: >- Returns the fully-loaded cost of employment for a given gross salary in a specific country, including employer taxes, contributions, and benefits. requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/CostCalculationRequest' responses: '200': description: The employment cost breakdown. content: application/json: schema: $ref: '#/components/schemas/CostCalculation' /webhooks: get: operationId: listWebhooks tags: - Webhooks summary: List webhook subscriptions responses: '200': description: The configured webhook subscriptions. content: application/json: schema: $ref: '#/components/schemas/WebhookList' post: operationId: createWebhook tags: - Webhooks summary: Create a webhook subscription requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/WebhookCreate' responses: '201': description: Webhook subscription created. content: application/json: schema: $ref: '#/components/schemas/Webhook' /webhooks/{webhookId}: parameters: - $ref: '#/components/parameters/WebhookIdParam' delete: operationId: deleteWebhook tags: - Webhooks summary: Delete a webhook subscription responses: '204': description: Deleted. '404': $ref: '#/components/responses/NotFound' components: securitySchemes: bearerAuth: type: http scheme: bearer bearerFormat: JWT description: >- OAuth 2.0 access token supplied as a Bearer token in the Authorization header. Partner credentials are issued by WorkMotion. parameters: PageParam: name: page in: query required: false schema: type: integer minimum: 0 default: 0 PageSizeParam: name: pageSize in: query required: false schema: type: integer minimum: 1 maximum: 200 default: 50 EmployeeIdParam: name: employeeId in: path required: true schema: type: string ContractIdParam: name: contractId in: path required: true schema: type: string OnboardingIdParam: name: onboardingId in: path required: true schema: type: string AbsenceIdParam: name: absenceId in: path required: true schema: type: string DocumentIdParam: name: documentId in: path required: true schema: type: string WebhookIdParam: name: webhookId in: path required: true schema: type: string responses: Unauthorized: description: Missing or invalid access token. content: application/json: schema: $ref: '#/components/schemas/Error' NotFound: description: Resource not found. content: application/json: schema: $ref: '#/components/schemas/Error' schemas: Error: type: object properties: code: type: string message: type: string Pagination: type: object properties: page: type: integer pageSize: type: integer total: type: integer Employee: type: object properties: id: type: string firstName: type: string lastName: type: string email: type: string format: email countryOfEmployment: type: string description: ISO 3166-1 alpha-2 country code. employmentType: type: string enum: [eor, direct, contractor] status: type: string enum: [onboarding, active, offboarding, terminated] startDate: type: string format: date createdAt: type: string format: date-time EmployeeCreate: type: object required: - firstName - lastName - email - countryOfEmployment - employmentType properties: firstName: type: string lastName: type: string email: type: string format: email countryOfEmployment: type: string employmentType: type: string enum: [eor, direct, contractor] startDate: type: string format: date EmployeeUpdate: type: object properties: email: type: string format: email status: type: string enum: [onboarding, active, offboarding, terminated] EmployeeList: type: object properties: data: type: array items: $ref: '#/components/schemas/Employee' pagination: $ref: '#/components/schemas/Pagination' Contract: type: object properties: id: type: string employeeId: type: string country: type: string status: type: string enum: [draft, pending_signature, active, amended, terminated] grossSalary: type: number currency: type: string paidTimeOffDays: type: integer startDate: type: string format: date createdAt: type: string format: date-time ContractCreate: type: object required: - grossSalary - currency properties: grossSalary: type: number currency: type: string paidTimeOffDays: type: integer startDate: type: string format: date ContractChange: type: object description: A change applied to an existing contract. properties: grossSalary: type: number currency: type: string paidTimeOffDays: type: integer effectiveDate: type: string format: date ContractList: type: object properties: data: type: array items: $ref: '#/components/schemas/Contract' pagination: $ref: '#/components/schemas/Pagination' Onboarding: type: object properties: id: type: string employeeId: type: string country: type: string currentStep: type: string enum: [country_selection, talent_details, contract_generation, e_signature, completed] status: type: string enum: [in_progress, completed, cancelled] createdAt: type: string format: date-time OnboardingCreate: type: object required: - country properties: employeeId: type: string description: Optional existing employee to onboard. country: type: string employmentType: type: string enum: [eor, direct, contractor] Absence: type: object properties: id: type: string employeeId: type: string type: type: string enum: [paid_time_off, sick_leave, unpaid_leave, other] startDate: type: string format: date endDate: type: string format: date status: type: string enum: [requested, approved, rejected, cancelled] AbsenceCreate: type: object required: - employeeId - type - startDate - endDate properties: employeeId: type: string type: type: string enum: [paid_time_off, sick_leave, unpaid_leave, other] startDate: type: string format: date endDate: type: string format: date AbsenceList: type: object properties: data: type: array items: $ref: '#/components/schemas/Absence' pagination: $ref: '#/components/schemas/Pagination' Document: type: object properties: id: type: string employeeId: type: string type: type: string fileName: type: string contentType: type: string createdAt: type: string format: date-time DocumentList: type: object properties: data: type: array items: $ref: '#/components/schemas/Document' CostCalculationRequest: type: object required: - country - grossSalary - currency properties: country: type: string description: ISO 3166-1 alpha-2 country code. grossSalary: type: number currency: type: string bonus: type: number CostCalculation: type: object properties: country: type: string currency: type: string grossSalary: type: number employerContributions: type: number taxes: type: number benefits: type: number totalEmploymentCost: type: number Webhook: type: object properties: id: type: string url: type: string format: uri events: type: array items: type: string active: type: boolean createdAt: type: string format: date-time WebhookCreate: type: object required: - url - events properties: url: type: string format: uri events: type: array items: type: string enum: - employee.created - employee.updated - contract.created - contract.amended - onboarding.completed - absence.approved WebhookList: type: object properties: data: type: array items: $ref: '#/components/schemas/Webhook'