WorkMotion Webhooks API
Register and manage webhook subscriptions to receive event notifications for employee, contract, onboarding, and absence changes, keeping external HRIS and payroll systems in sync.
Register and manage webhook subscriptions to receive event notifications for employee, contract, onboarding, and absence changes, keeping external HRIS and payroll systems in sync.
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'