GuidesAPI ReferenceChangelog
Guides

Hiring EOR employees

Learn how to create EOR contracts, sign them, and invite workers using the Deel API

When you want to hire workers in a country where you don't have a business, you can use our EOR. With the EOR service, workers are hired using one of Deel's legal entities in 150+ countries.
Using EOR allows you to stay compliant when it comes to contracts, minimum wage, terminations, and other local laws, without the need to set up a local legal entity in the country you want to hire.

This guide explains how to create EOR contracts, sign them, and invite workers using the Deel API.

In this guide

Part 1: Retrieve information to create the contract

The first part of the hiring flow is to retrieve information to create the contract.

Diagram showing the first part of the hiring flow, where you retrieve information to create the contract

Diagram showing the first part of the hiring flow, where you retrieve information to create the contract

Step 1. Retrieve country-specific information

EOR workers are subject to laws and regulation of the country they are hired in. To understand the requirements for hiring an EOR worker in a particular country, you can retrieve country-specific information.

The Retrieve detailed hiring guide for a country endpoint returns information about hiring in each country, so that you can understand requirements, such as holidays, sick leave, minimum salary, probation period, pension, available insurance providers, and so on.

You need the information retrieved with this endpoint to fill the details of the contract you want to create.

Below you will find an example of what the response looks like:

{
  "data": {
    "holiday": {
      "min": "23",
      "max": null,
      "mostCommon": "25"
    },
    "part_time_holiday": {
      "type": "STANDARD",
      "min": "23"
    },
    "sick_days": {
      "min": "0",
      "max": "365"
    },
    "salary": {
      "min": "15120.00",
      "max": "800000.00",
      "frequency": "monthly"
    },
    "probation": {
      "min": null,
      "max": 180
    },
    "part_time_probation": {
      "min": null,
      "max": 180
    },
    "work_schedule": {
      "days": {
        "max": null,
        "min": "5.0000"
      },
      "hours": {
        "max": null,
        "min": "8.0000"
      }
    },
    "currency": "EUR",
    "hiring_guide_country_name": "spain",
    "start_date_buffer": 3,
    "definite_contract": {
      "type": "NOT_ALLOWED",
      "maximum_limitation": null
    },
    "adjustments_information_box": "For reimbursable costs connected to carrying out work, choose \"expenses\".\nFor fixed or recurring amounts provided as a benefit to employee, choose \"allowances\".",
    "health_insurance": {
      "status": "ENABLED",
      "providers": [
         …
      ]
    },
    "pension": {
      "status": "REQUIRED",
      "providers": [
        {
          "id": "c1631641-1d6e-41ad-bc0c-cbbbe3f565ca",
          "name": "Fidelity",
          "home_page_url": "https://www.fidelity.com/",
          "contribution": {
            "type": "PERCENTAGE",
            "minimum": "2.00",
            "maximum": "2.00"
          }
        }
      ]
    },
    "mandatory_fields": [
      …
    ]
  }
}

Step 2: Retrieve other information

Filling the payload to create a contract requires information that you can retrieve using other endpoints. Here's a list of the info you will need and the respective endpoints:

InfoEndpoint
Legal entity IDList of legal entities
Team IDGet team list
Seniority levelRetrieve seniority levels

Part 2: Create the contract

After retrieving the information to create the contract, you can create it using the Create EOR contract endpoint.

Diagram showing the second part of the hiring flow, where you create the contract

Diagram showing the second part of the hiring flow, where you create the contract

Following is a sample request for your reference:

curl --request POST \
     --url https://api-sandbox.demo.deel.com/rest/v2/eor \
     --header 'accept: application/json' \
     --header 'authorization: Bearer Token' \
     --header 'content-type: application/json' \
     --data '
{
  "data": {
    "client": {
      "team": {
        "id": "0c7012ce-2843-4b59-85b0-21c8dfa5fc5b"
      },
      "legal_entity": {
        "id": "0a71b451-4979-490b-b0be-1461f81bf994"
      }
    },
    "employee": {
      "address": {
        "zip": "18509",
        "city": "Scranton",
        "state": "PA",
        "street": "1725 Slough Avenue",
        "country": "US"
      },
      "email": "[email protected]",
      "last_name": "Scott",
      "first_name": "Michael",
      "nationality": "US"
    },
    "seniority": {
      "id": "6"
    },
    "employment": {
      "work_visa_required": false,
      "type": "Full-time",
      "country": "US",
      "start_date": "2025-02-13",
      "scope_of_work": "Overseeing the Scranton branch for Dunder Mifflin",
      "time_off_type": "STANDARD"
    },
    "compensation_details": {
      "salary": 300000,
      "currency": "US"
    },
    "job_title": "Regional manager"
  }
}
'

Part 3: Receive a quote from Deel

Since we're the formal employers of the worker you're hiring, we will issue a quote for the new contract being created.

Diagram showing the third part of the hiring flow, where you receive a quote from Deel

Diagram showing the third part of the hiring flow, where you receive a quote from Deel

📘

Quote issuance timeline

The time it takes to receive the quote depends on the possibility to automate the quote issuance on our end.

  • If the quote can be issued automatically, you'll receive it within a few minutes
  • If the quote must be issued manually, it takes up to 24 hours to receive the quote

You can review the quote by subscribing to the dedicated eor.quote.created webhook. You can subscribe to webhooks using the Create a webhook endpoint.

For more information on how to subscribe to a webhook, visit Getting started with webhooks.

If you accept the quote, you can proceed to signing the contract, and it will count as accepting the quote. In the same way, not signing the contract will count as rejecting the quote.

Following is a sample webhook payload emitted when the quote is available:

{
    "data": {
        "meta": {
            "event_type": "eor.quote.created",
            "event_type_id": "d3m0d3m0-d3m0-d3m0-d3m0-d3m0d3m0d3m0",
            "organization_id": "d3m0d3m0-d3m0-d3m0-d3m0-d3m0d3m0d3m0",
            "organization_name": "API Integration Account",
            "tracking_id": "abcdefg1234567890abdcefg1234567"
        },
        "resource": {
            "annual_salary": "300000.00",
            "breakdown_costs": {
                "monthly": {
                    "costs": [
                        {
                            "currency": "INR",
                            "name": "Employees' Deposit Linked Insurance (EDLI)",
                            "total": "75.00",
                            "total_usd": "0.91"
                        },
                        {
                            "currency": "INR",
                            "name": "Employee's Provident Fund (EPF)",
                            "total": "1800.00",
                            "total_usd": "21.74"
                        },
                        {
                            "currency": "INR",
                            "name": "Provident Fund Office EPF Admin Fee",
                            "total": "75.00",
                            "total_usd": "0.91"
                        }
                    ],
                    "total": "1950.00",
                    "total_usd": "23.56"
                }
            },
            "cba_total": "0.00",
            "cba_total_usd": "0.00",
            "contract_id": "d3m0d3m",
            "contract_name": "Michael Scott - Regional Manager",
            "country_name": "India",
            "created_at": "2024-11-07T13:16:25.747Z",
            "currency": "INR",
            "employer_cost_total": "1950.00",
            "employer_cost_total_usd": "23.56",
            "gross_salary_total": null,
            "gross_salary_total_usd": "25000.00",
            "mobility_fee_total": null,
            "mobility_fee_total_usd": null,
            "monthly_cost_total": "68636.66",
            "monthly_cost_total_usd": "829.15",
            "platform_fee_total": "40644.99",
            "platform_fee_total_usd": "491.00",
            "recurring_allowance_total": "0.00",
            "recurring_allowance_total_usd": "0.00",
            "salary_total": "25000.00",
            "salary_total_usd": "302.01",
            "severance_accrual_total": "1041.67",
            "severance_accrual_total_usd": "0.00",
            "updated_at": "2024-11-07T13:16:25.747Z"
        }
    },
    "timestamp": "2024-11-07T13:22:47.823Z"
}

👍

You can also review the quote from the UI

For more information, visit How to create an Employer of Record (EOR) contract and How to review your quote in our Help Center.

Part 4: Sign the contract

If you agree with the quote for the contract, you can go ahead and sign it and it will be automatically accepted.

Diagram showing the fourth part of the hiring flow, where you sign the contract

Diagram showing the fourth part of the hiring flow, where you sign the contract

To sign a contract, you can use the Sign a contract endpoint. For more information, visit the Sign a contract endpoint reference.

Part 5: The worker signs the contract

Once you sign the contract, the worker receives an invitation email to create their Deel account and sign the contract.

Diagram showing the fifth part of the hiring flow, where the worker onboards to Deel and signs the contract

Diagram showing the fifth part of the hiring flow, where the worker onboards to Deel and signs the contract

You can also monitor the contract status by subscribing to the dedicated contract.status.updated webhook. review the quote by subscribing to the dedicated eor.quote.created webhook.

For more information on how to subscribe to a webhook, visit Getting started with webhooks.