WorkMotion Cost Calculator API
Calculate the fully-loaded cost of employment for a given gross salary in a specific country, returning employer taxes, contributions, and benefits so employers can price an offer before hiring.
Calculate the fully-loaded cost of employment for a given gross salary in a specific country, returning employer taxes, contributions, and benefits so employers can price an offer before hiring.
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'