Hiring & contracts

This guide covers EOR contract creation from initial company setup through employer signing. These phases are sequential: create the group before creating any contract for that client.

All endpoints require an admin-scoped API token. See Getting started for authentication and environment setup. For managing active employment after a contract is signed, see Employment management.

1

Create a group

Each client company is represented as a group in Deel. Create one group per client during their onboarding.

MethodEndpointPurpose
POST/groupsCreate a new group for a client company
POST/groups/{id}/cloneClone an existing group for a subsidiary

The response includes the group id. Store it; it maps to client.team in all EOR contract requests for this client. Use the external_metadata object to store your platform’s internal identifiers on the group record, so you can reconcile records across systems without a separate mapping table.

For clients with multiple subsidiaries that share the same structural configuration, use the clone endpoint rather than repeating setup manually.

2

Estimate employment costs

Surface a full cost breakdown before the employer confirms the hire. Showing the total cost upfront reduces the risk of abandonment at the contract submission step.

MethodEndpointPurpose
POST/eor/employment_costCalculate total employment cost for a country and salary
GET/eor/additional-costs/{country}Retrieve mandatory statutory fees beyond salary

Surface both the base cost and additional costs as a combined total before proceeding to contract creation.

3

Fetch the contract form

Every country has different required fields, validation constraints, and data dependencies. Retrieve the field specification for the target country at the start of each contract creation flow.

MethodEndpointPurpose
GET/forms/eor/create-contract/{country_code}Country-specific contract field specification
GET/eor/start-dateEarliest permissible employment start date

Pass start_date and work_hours_per_week as query parameters. The response pages array contains sections and questions. Each question includes the field name, type, validation constraints, and, where applicable, a data_source URL for dropdown values.

Field requirements and validation rules change as local regulations are updated. Do not cache form schemas across countries or sessions.

4

Retrieve reference data

Before rendering the contract form, populate dropdown fields with reference data from the lookup endpoints.

MethodEndpointPurpose
GET/lookups/job-titlesAvailable job titles
GET/lookups/currenciesSupported salary currencies
GET/eor/benefitsAvailable benefits by country, including statutory and optional
GET/eor/validations/{country_code}Country-specific hiring requirements and compliance constraints

Retrieve these in parallel to minimize form load time. The benefits endpoint distinguishes statutory (mandatory, employer-paid) from optional benefits; use this to control what you surface in the form.

5

Validate the job scope

If using a custom job description, validate it before contract creation. An unvalidated custom scope triggers a 24-hour Deel review after submission, blocking the contract from progressing.

MethodEndpointPurpose
POST/eor/job-scopes/validateValidate a custom job description
GET/eor/job-scopesRetrieve pre-approved job scope templates

If validation succeeds, pass the returned validation id in employment.scope_of_work when creating the contract. To avoid validation delay entirely, use a pre-approved template from GET /eor/job-scopes and pass the scope_template_id instead.

6

Create the EOR contract

Submit the contract with the data collected from the previous steps.

MethodEndpointPurpose
POST/eorCreate an EOR contract

The request body requires four nested objects: employee, employment, client (containing team set to the group id from step 1), and compensation_details. Store the returned id immediately; it is required for all subsequent operations on this contract.

The initial contract status is under_review. It transitions to waiting_for_client_sign after Deel completes its review.

7

Handle compliance agreements

Some countries require side agreements to be fetched and signed before the main framework agreement. This step applies to Belgium, Germany, Spain, Italy, and Tunisia.

MethodEndpointPurpose
GET/eor/contracts/{contract_id}/documents/{type}List documents available for the contract
POST/eor/contracts/{contract_id}/documents/{type}/signSign a specific contract document

Retrieve the document list first and filter for documents with status pending_signature. Sign each before proceeding to the framework agreement.

This step is only required for the countries listed above. For all other countries, proceed directly to framework agreement signing.

Fetching and signing side agreements requires a personal access token. Organization tokens are not supported for these endpoints.

8

Sign the framework agreement

Once the contract reaches waiting_for_client_sign status, sign the framework agreement to complete the employer signing phase.

MethodEndpointPurpose
POST/eor/contracts/{contract_id}/documents/FRAMEWORK_AGREEMENT/signSign the framework agreement as the employer

After signing, the contract moves to the worker signing phase. The worker receives their invitation and completes onboarding. See Worker onboarding.

Key webhook events

EventTrigger
eor.quote.createdEOR contract quote created
contract.createdContract submitted and queued for Deel review
contract.status.updatedStatus changed (e.g. waiting_for_client_sign, active)

See the Webhooks guide for event payload structure and signature verification.

Next steps