> This page is for API, version 2026-01-01 (Stable) (default).
> For other versions, use one of these documentation indexes:
> - 2026-01-01 (Stable) (default): https://developer.deel.com/api/stable/llms.txt

> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://developer.deel.com/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://developer.deel.com/_mcp/server.

# Accept quote

> Complete the three-party signature process for EOR contracts

After [creating an EOR contract](/api/employer-of-record/hiring), the contract must be signed by three parties to become legally valid. This guide explains the signature workflow and how to sign the contract between your organisation and Deel.

## Overview

EOR contracts involve **two separate agreements**:

1. **Client-Deel contract** - Between your organisation and Deel, establishing employment costs and responsibilities
2. **Employment agreement** - Between Deel (as employer of record) and the worker, formalising employment terms

This guide focuses on the **Client-Deel contract** and the three-party signature process.

## Three-party signature flow

The contract requires signatures in this sequence:

1. **Deel signs** - Deel reviews and signs the contract (automatic or within 24 hours)
2. **Your organisation signs** - You accept the quote and sign via API
3. **Worker signs** - Worker completes onboarding and signs the employment agreement

#### Deel signs

After contract creation, Deel reviews and automatically or manually signs.

#### You sign

Accept the quote and sign using the API endpoint.

#### Worker signs

Worker completes onboarding and signs the employment agreement.

## Step 1: Deel signs the contract

After you create the contract, Deel reviews it, issues a cost quote, and signs the contract.

**Automatic signature:**

* Available in select countries with validated job scopes
* Contract is signed immediately after creation
* Status changes from `under_review` to `waiting_for_client_sign`

**Manual signature:**

* Required when automatic signature is unavailable
* Takes up to 24 hours to review and sign
* You will be notified when ready for your signature

> **Info**
>
> Automatic signature depends on country-specific requirements and job scope validation. If you used a pre-validated job scope template or validation ID, the contract is more likely to be signed automatically.

### Check contract status

Monitor the contract status to know when it is ready for your signature.

**API endpoint**: `GET /eor/contracts/{contract_id}/details`

**`Python`**

```python Python
import requests
import os

contract_id = "eor_xyz789"
url = f"https://api.letsdeel.com/rest/eor/contracts/{contract_id}/details"
headers = {"Authorization": f"Bearer {os.getenv('DEEL_API_TOKEN')}"}

response = requests.get(url, headers=headers)
print(response.json())
```

**`Node.js`**

```javascript Node.js
const axios = require('axios');

const contractId = 'eor_xyz789';
const { data } = await axios.get(
  `https://api.letsdeel.com/rest/eor/contracts/${contractId}/details`,
  { headers: { Authorization: `Bearer ${process.env.DEEL_API_TOKEN}` } }
);
console.log(data);
```

**`cURL`**

```bash cURL
curl --request GET \
  --url 'https://api.letsdeel.com/rest/eor/contracts/eor_xyz789/details' \
  --header 'Authorization: Bearer $DEEL_API_TOKEN'
```

**`Response (under review)`**

```json Response (under review)
{
  "data": {
    "contract_id": "eor_xyz789",
    "status": "under_review",
    "worker": {
      "first_name": "Jane",
      "last_name": "Smith",
      "email": "jane.smith@example.com"
    },
    "quote": {
      "total_monthly_cost": 11250.00,
      "salary_monthly": 10000.00,
      "benefits_monthly": 850.00,
      "deel_fee_monthly": 400.00,
      "currency": "USD"
    },
    "created_at": "2025-10-17T15:30:00Z"
  }
}
```

**`Response (ready to sign)`**

```json Response (ready to sign)
{
  "data": {
    "contract_id": "eor_xyz789",
    "status": "waiting_for_client_sign",
    "worker": {
      "first_name": "Jane",
      "last_name": "Smith",
      "email": "jane.smith@example.com"
    },
    "quote": {
      "total_monthly_cost": 11250.00,
      "salary_monthly": 10000.00,
      "benefits_monthly": 850.00,
      "deel_fee_monthly": 400.00,
      "currency": "USD"
    },
    "signatures": {
      "deel_signed_at": "2025-10-17T16:00:00Z",
      "client_signed_at": null,
      "worker_signed_at": null
    }
  }
}
```

**Status values:**

* `under_review` - Deel is reviewing and preparing to sign
* `waiting_for_client_sign` - Ready for your signature
* `waiting_for_employee_contract` - Waiting for worker onboarding
* `active` - Fully signed and active

## Step 2: Review the quote

Before signing, review the cost quote to ensure it matches your expectations.

**Quote breakdown:**

* **Salary** - Monthly salary for the employee
* **Benefits** - Cost of selected benefits (health, pension, etc.)
* **Employer costs** - Taxes and statutory contributions
* **Deel fee** - Deel's service fee
* **Total monthly cost** - Sum of all costs

The quote is included in the contract details response from Step 1.

**`Python`**

```python Python
import requests
import os

contract_id = "eor_xyz789"
url = f"https://api.letsdeel.com/rest/eor/contracts/{contract_id}/details"
headers = {"Authorization": f"Bearer {os.getenv('DEEL_API_TOKEN')}"}

response = requests.get(url, headers=headers)
quote = response.json()["data"]["quote"]

print(f"Salary: {quote['currency']} {quote['salary_monthly']}/month")
print(f"Benefits: {quote['currency']} {quote['benefits_monthly']}/month")
print(f"Deel fee: {quote['currency']} {quote['deel_fee_monthly']}/month")
print(f"Total: {quote['currency']} {quote['total_monthly_cost']}/month")
print(f"Annual total: {quote['currency']} {float(quote['total_monthly_cost']) * 12}")
```

**`Node.js`**

```javascript Node.js
const axios = require('axios');

const contractId = 'eor_xyz789';
const { data } = await axios.get(
  `https://api.letsdeel.com/rest/eor/contracts/${contractId}/details`,
  { headers: { Authorization: `Bearer ${process.env.DEEL_API_TOKEN}` } }
);

const quote = data.data.quote;
console.log(`Salary: ${quote.currency} ${quote.salary_monthly}/month`);
console.log(`Benefits: ${quote.currency} ${quote.benefits_monthly}/month`);
console.log(`Deel fee: ${quote.currency} ${quote.deel_fee_monthly}/month`);
console.log(`Total: ${quote.currency} ${quote.total_monthly_cost}/month`);
console.log(`Annual total: ${quote.currency} ${quote.total_monthly_cost * 12}`);
```

## Step 3: Sign the contract

Once the status is `waiting_for_client_sign` and you have reviewed the quote, sign the contract to proceed.

**API endpoint**: `POST /contracts/{contract_id}/signatures`

**`Python`**

```python Python
import requests
import os

contract_id = "eor_xyz789"
url = f"https://api.letsdeel.com/rest/contracts/{contract_id}/signatures"
headers = {
    "Authorization": f"Bearer {os.getenv('DEEL_API_TOKEN')}",
    "Content-Type": "application/json"
}
payload = {
    "data": {
        "client_signature": "John Doe"
    }
}

response = requests.post(url, json=payload, headers=headers)
print(response.json())
```

**`Node.js`**

```javascript Node.js
const axios = require('axios');

const contractId = 'eor_xyz789';
const { data } = await axios.post(
  `https://api.letsdeel.com/rest/contracts/${contractId}/signatures`,
  { data: { client_signature: 'John Doe' } },
  { headers: { Authorization: `Bearer ${process.env.DEEL_API_TOKEN}` } }
);
console.log(data);
```

**`cURL`**

```bash cURL
curl --request POST \
  --url 'https://api.letsdeel.com/rest/contracts/eor_xyz789/signatures' \
  --header 'Authorization: Bearer $DEEL_API_TOKEN' \
  --header 'Content-Type: application/json' \
  --data '{
    "data": {
      "client_signature": "John Doe",
      "contract_template_id": "12345"
    }
  }'
```

**`Response`**

```json Response
{
  "data": {
    "created": true
  }
}
```

**Request parameters:**

| Parameter              | Type   | Required | Description                                               |
| ---------------------- | ------ | -------- | --------------------------------------------------------- |
| `client_signature`     | string | Yes      | Name of the person signing on behalf of your organisation |
| `contract_template_id` | string | No       | Custom employee agreement template ID                     |

> **Note**
>
> If you want to use a custom employee agreement template instead of the default, include the `contract_template_id`. You can retrieve available templates from the contract templates endpoint. Custom templates can only be created from the Deel UI.

**After signing:**

* Contract status changes to `waiting_for_employee_contract`
* Deel prepares the employee agreement
* Worker receives a welcome email to begin onboarding

## Step 4: Worker onboarding begins

After you sign the contract, Deel sends a welcome email to the worker with instructions to:

1. Sign up to the Deel platform
2. Complete identity verification (KYC)
3. Provide banking and tax information
4. Review and sign the employment agreement

The worker must complete onboarding before the employment agreement can be signed and the contract becomes active.

## Best practices

#### Use webhooks instead of polling

Subscribe to `contract.status.updated` events to receive real-time notifications when the contract status changes. This is more efficient than repeatedly calling the contract details endpoint.

#### Review quotes carefully

Verify total costs match your budget before signing. Once signed, the contract enters the worker onboarding flow and cannot easily be cancelled without incurring costs in some jurisdictions.

#### Store contract IDs

Keep a record of contract IDs in your system from the moment of creation. You will need them for future amendments, terminations, and payslip queries.

#### Automate signing for standard contracts

For contracts where the total cost is within an approved budget range, consider implementing automated signing in your workflow. Add a manual review step only when costs exceed a threshold.

#### Handle errors gracefully

Implement retry logic for failed signature attempts. A common cause of failure is attempting to sign before the contract has reached `waiting_for_client_sign` status — always check the status before calling the signature endpoint.

## Troubleshooting

#### Contract stuck in under_review

If a contract remains in `under_review` for more than 24 hours:

* Check if the job scope requires manual validation
* Verify all required fields were provided during contract creation
* Contact Deel support with the contract ID

#### Signature request fails

Common reasons for signature failures:

* Contract is not in `waiting_for_client_sign` status
* Invalid contract ID
* Missing required `client_signature` field
* Invalid `contract_template_id` (if using custom templates)

#### Worker not receiving onboarding email

After signing:

* Verify the worker's email address in the contract details
* Check spam and junk folders
* Allow up to 30 minutes for email delivery
* Contact Deel support if the email does not arrive after 30 minutes

## Next steps

#### [EOR hiring](/api/employer-of-record/hiring)

Review the contract creation flow that precedes this step.

#### [EOR amendments](/api/employer-of-record/amendments)

Modify a contract after it has been signed and activated.

#### [Webhooks](/api/webhooks/quickstart)

Subscribe to contract status events to avoid polling.

#### [Authentication](/api/authentication)

Set up API authentication before making requests.