GuidesAPI ReferenceChangelog
Guides

EOR contract amendments

The EOR-Contract Amendment API allows clients to modify contract terms through a structured approval process while ensuring compliance with predefined rules.

An amendment is a change to one or more contract terms, referred to as data points, such as employment type, job title, scope, salary etc. It serves as an additional document created as an addendum to the employment agreement rather than altering the original contract document. The contract entity in the database, including its ID, remains the same—only specific values, like salary, are updated with new effective dates.

Amendments can be initiated by either the client or Deel. The process involves multiple steps, including review and approval by both the client and the employee. Modification and approval rules vary based on the amended data point and country-specific regulations.

Amendment flow overview

Scenario when client requests an amendment

  1. Client creates an amendment.
  2. Client confirms the amendment.
  3. Depending on the amendment items, the change could be instant or require acceptance from the employee and Deel. The status is returned in the response.
  4. If the amendment is not instant, Deel reviews the amendment and sends it to the employee.
  5. The employee reviews and signs using the Employee signs approved amendment endpoint.

Scenario when deel requests an amendment

  1. Deel creates an amendment.
  2. Client reviews the amendment and either accepts (using Client accepts amendment) or cancels (using Client Cancels Amendment).
  3. If accepted, the employee reviews and signs using the Employee signs approved amendment endpoint.

When does deel create amendments?

Deel may create amendments in the following cases:

  • By client request: When a client requests a change that requires Deel’s involvement.
  • For compliance reasons: When contract adjustments are needed to meet legal or regulatory requirements.
  • For changes not available to clients: Some modifications can only be made through an admin amendment due to system constraints or policy restrictions.

Amendment effective date

The effective date is the date when the amendment becomes active. This date determines when the changes in the amendment will take effect. It also determines when those changes appear in payroll, invoices, or other downstream processes.

Why it works this way

Different amendment fields trigger different business logic. Based on what you are changing, Deel dynamically calculates a valid effective date range.

To support this flexibility, Deel exposes the Effective Date Limitations API that you need to call to retrieve the valid effective date limits for a specific amendment. This ensures that:

  • Your system always works with the correct date limits.
  • Deel applies the correct validations automatically based on the amendment content, helping you avoid false validations or user errors.
  • You can choose to show or disable the effective date field in your UI.
  • You can apply validation rules or pre-fill values based on internal workflows.

📘

Amendments on contracts that are not yet active can't have an effective date.

When to fetch effective date limits

You must fetch the effective date limitations:

  • Immediately after creating or updating an amendment.
  • Before setting or submitting the effective date.
  • Before confirming the amendment, if any changes were made after fetching the last effective date.

🚧

Effective date validation depends on content

The valid effective date range is based on the specific changes in the amendment. Always fetch the date limits only after all changes to the amendment are finalized.

What happens based on the effective date

Effective dateWhat happens
Effective date in the futureThe amendment gets an upcoming status. It won’t affect contract values immediately.
Effective date today or in the pastThe amendment becomes active as soon as it’s processed and signed.
Effective date not providedThe amendment becomes active immediately after signing are completed, Deel uses the date when all parties confirm the amendment as the effective date.

Amendments in upcoming status do not affect payroll, invoicing, or contract terms until they are activated by Deel’s internal job on the effective date.

High-level flow

The diagram below shows how the effective date influences the amendment lifecycle, from creation to activation:

Effective date influence on the amendment lifecycle diagram

UI behavior: is_hidden and is_disabled

When you fetch effective date limitations, the response includes flags that guide you in rendering the field in your UI.

FieldClient-side behavior
is_hidden(Optional) Suggests that the field may be hidden from the user interface. You may decide whether to follow this behavior.
is_disabledIf true, the field should not be editable. You must use the default value provided.

📘

Hiding the field

If your use case involves applying an automatic default effective date, such as aligning it with the start of the payroll cycle, hiding the field might improve user experience.

Validation rules

The validation logic for effective dates ensures that all amendments respect configuration limits, providing flexibility while preventing invalid data entry.

ScenarioRequirement
is_disabled = true and is_hidden = trueField must not be included in the request.
is_disabled = true and default date is presentField must exactly match the default effective date.
min, max, or default is presentA valid effective date must be provided and must fall within range.
No limits definedField is optional. System will automatically set it to when all parties confirm the amendment.
Validation runs at two points
  • On create/update: Runs when you send the effective date in the request payload.
  • On confirmation: The effective date is always validated when the amendment is confirmed, regardless of its draft status.

📘

Draft amendments are validated only when you provide an effective date.

Webhook events

Webhooks trigger at each step of the amendment process, providing real-time status updates.

EventDescription
EOR_AMENDMENT_V2_IN_REVIEWTriggered when a client creates an amendment. Sent after the amendment is confirmed.
EOR_AMENDMENT_V2_CLIENT_SIGNTriggered when Deel creates an amendment. Sent after a Deel admin creates the amendment.
EOR_AMENDMENT_V2_EMPLOYEE_SIGNTriggered when a client accepts an amendment created by Deel. Sent after client review and acceptance.
EOR_AMENDMENT_V2_CLIENT_ACTIVETriggered when an amendment becomes active. Sent once all necessary approvals are completed.
EOR_AMENDMENT_V2_CLIENT_REJECTEDTriggered when an amendment is canceled. Sent when a Deel admin rejects the amendment.
EOR_AMENDMENT_V2_CLIENT_VOIDTriggered when an amendment is voided. Sent when the void deadline has passed for an in-progress amendment, meaning it can no longer become active.

Amendment types

Each amendment has a type that determines how it will be processed. The type is returned in the response when creating or updating an amendment. It is determined based on the amendment settings and the data points being amended.

An amendment can have one of the following types:

  • INSTANT: The amendment is activated immediately after the client confirms it. No review by Deel or employee signature is required.

  • AUTOMATED: The amendment is activated once the employee signs it. Deel review is not required.

  • LEGAL or OPS: The amendment requires review by Deel because at least one data point is configured to require internal review. The difference between LEGAL and OPS is purely internal and relates to how the review is conducted. For example, it may involve document preparation. After Deel completes the review, the amendment is sent to the employee for review and signature. The amendment is activated once the employee signs it.

  • DISABLED: The amendment contains at least one data point that is restricted from being changed by the amendment settings.

  • CUSTOM: The amendment is manually created by a Deel admin.

📘

If at least one data point requires review by Deel (i.e., LEGAL or OPS), the amendment type is set
accordingly. Any data points that would otherwise be INSTANT or AUTOMATED will follow the same review and activation process as LEGAL or OPS amendments.

Examples

Example 1: germany (instant amendment)

In this example for Germany, both holiday increase and time-off type change will be instant and will be
activated once the amendment is active. We can see the type in the type field, and in items, all data points have an INSTANT type:

{
  "type": "INSTANT",
  "items": [
    {
      "data_point": "holidays",
      "id": "59d9a2d5-9ea0-4f7f-8ac0-1db66e62d9fa",
      "item": "holidaysIncrease",
      "type": "INSTANT",
      "previous_value": "6",
      "new_value": "12"
    },
    {
      "data_point": "timeOffType",
      "id": "78743852-4dea-4b7c-bbac-44828a7d9b97",
      "item": "timeOffType",
      "type": "INSTANT",
      "previous_value": "STANDARD",
      "new_value": "SPECIFIC"
    }
  ]
}

Example 2: Greece (legal amendment)

For Greece, the same data points require Deel review because one of the items has the LEGAL type:

{
  "type": "LEGAL",
  "items": [
    {
      "data_point": "holidays",
      "id": "f783003f-777f-425a-9a14-faf6457b7585",
      "item": "holidaysIncrease",
      "type": "INSTANT",
      "previous_value": "6",
      "new_value": "10"
    },
    {
      "data_point": "timeOffType",
      "id": "d9dffd0a-6443-4992-9aa7-d859bd9d4d4d",
      "item": "timeOffType",
      "type": "LEGAL",
      "previous_value": "STANDARD",
      "new_value": "SPECIFIC"
    }
  ]
}

Amendment statuses

Amendment statuses are provided in an array within the API response. Users should check the latest relevant status to determine the amendment's current state.

StatusDescription
DraftThe amendment is in draft state and can be modified.
ActiveThe amendment is active.
CancelledThe amendment is canceled.
AwaitingSignature.SOW.PendingClientSignatureAwaiting client acceptance, used when the amendment is created by Deel.
AwaitingSignature.EA.PendingEmployeeSignaturePending employee signature, used when the amendment is accepted by the client and Deel.
PreparingDocuments.AmendmentRequested.EA.PendingDocumentSubmitPending review by Deel, used when the amendment type is Legal or Ops.
PreparingDocuments.AmendmentRequested.SOW.PendingDocumentSubmitPending review by Deel, used when the amendment type is Legal or Ops.

Example amendment status array and explanation

Below is an example of an amendment status array retrieved from the API response:

[
  {
    "name": "PreparingDocuments",
    "friendly_name": "Preparing documents",
    "_amendment_flow_status": {
      "created_at": "2025-03-19T17:15:02.053Z"
    }
  },
  {
    "name": "PreparingDocuments.AmendmentRequested",
    "friendly_name": "Amendment requested",
    "_amendment_flow_status": {
      "created_at": "2025-03-19T17:15:02.053Z"
    }
  },
  {
    "name": "PreparingDocuments.AmendmentRequested.SOW.PendingDocumentSubmit",
    "friendly_name": "Awaiting review",
    "_amendment_flow_status": {
      "created_at": "2025-03-19T17:15:02.053Z"
    }
  }
]

In this example:

  • The amendment is currently in the PreparingDocuments phase.
  • The amendment request has been logged (PreparingDocuments.AmendmentRequested).
  • The amendment is pending review by Deel (PreparingDocuments.AmendmentRequested.SOW.PendingDocumentSubmit), meaning further actions are required before proceeding.

Retrieve contracts (client)

Step 1: Retrieve the contractId

curl --location -g --request GET '{{host}}/rest/v2/contracts?limit=2&sort_by=worker_name&order_direction=desc' \
--header 'Authorization: Bearer {{token}}'

Retrieve amendment settings (client)

You can retrieve available settings and possible amendment options by specifying the contract_oid. Settings are generated based on the contract and country-specific rules and country specific amendment settings.

curl --location -g --request GET '{{host}}/rest/v2/eor/amendments/{{contract_oid}}/amendment-settings' \
--header 'Authorization: Bearer {{token}}'

Response example

[
  {
    "data_point": "noticePeriodType",
    "rules": [
      {
        "nullable": false,
        "is_editable": true,
        "possible_options": [
          "STANDARD",
          "CUSTOM"
        ],
        "requires": {
          "employment_type": "Full-time"
        }
      },
      {
        "nullable": false,
        "is_editable": true,
        "possible_options": [
          "STANDARD",
          "CUSTOM"
        ],
        "requires": {
          "employment_type": "Part-time"
        }
      }
    ]
  }
]

How amendment settings work

  • Each data_point represents an amendable contract attribute.
  • Amendments are restricted based on requires conditions.
  • All fields in the requires object must match either the current contract or the new amendment data to allow
    modification. This means that if a field is specified in the requires object, its value must be present and match in either the existing contract data or the data provided in the amendment request.
  • Numeric fields must respect min and max constraints.
  • possible_options lists valid values for the data point.
  • is_editable indicates if the data point can be changed. Currently in existing API version, we don’t share the reason why it is not editable. It could be due to country or amendment settings, other pending amendments present (e.g. currency), etc.
  • additional_details provide business logic notes and validation constraints.
  • It could also include min_date and max_date in format YYYY-MM-DD. Example 2025-06-17

Examples of amendment rules

  1. Ensuring required fields exist in contract or amendment request:
  • To match this rule, contract_term: "Definite" must exist either in the current contract or in the amendment request body.

    {
        "nullable": false,
        "is_editable": true,
        "min_date": "2025-06-02",
        "requires": {
            "contract_term": "Definite"
        }
    }
    
  1. Employment type restriction:
  • This rule ensures employment_type can only be Full-time if contract_term is Indefinite.

    {
        "nullable": false,
        "is_editable": true,
        "possible_options": ["Full-time"],
        "requires": { "contract_term": "Indefinite" }
    }
    
  1. Numeric constraints:
  • This rule enforces minimum and maximum values while ensuring the requirement for employment_type is met.

    {
        "nullable": false,
        "is_editable": true,
        "min": 6,
        "max": 12,
        "requires": { "employment_type": "Full-time" }
    }
    
  1. External validation example:
  • This rule ensures that validation is handled externally.

    {
        "nullable": false,
        "is_editable": true,
        "external_validation": true
    }
    

Create or update a draft amendment (client)

You can create or update an amendment by specifying the contract_oid.

curl --location -g --request POST '{{host}}/rest/v2/eor/amendments/{{contract_oid}}' \
--header 'Authorization: Bearer {{token}}' \
--header 'Content-Type: application/json' \
--data-raw '{
    "data": {
        "time_off_type": "SPECIFIC",
        "holidays": 109082,
        "employment_type": "Part-time",
        "id": "5bbd6aa1-4f00-494e-b031-73c066140b4e"
    }
}'

id is optional used to update draft amendment, if not provided, a new amendment will be created.

400 bad request - validation errors and disabled amendments

When an amendment request fails validation, the API returns a 400 Bad Request response with details about validation

errors and disabled amendments.

Response structure

{
  "validation_error": [
    {
      "error": "The minimum holidays for NG is 6 day(s)",
      "item": "holidays",
      "previous_value": "6",
      "new_value": "2"
    }
  ],
  "disabled_amendments": [
    {
      "type": "DISABLED",
      "previous_value": "STANDARD",
      "new_value": "SPECIFIC",
      "data_point": "timeOffType",
      "error": "timeOffType is disabled in country Nigeria"
    }
  ]
}

400 bad request

This response occurs when there are validation errors or when amendments are disabled due to restrictions.

Response schema

{
  "validation_error": [
    {
      "error": "The minimum holidays for NG is 6 day(s)",
      "item": "holidays",
      "previous_value": "6",
      "new_value": "2"
    }
  ],
  "disabled_amendments": [
    {
      "type": "DISABLED",
      "previous_value": "STANDARD",
      "new_value": "SPECIFIC",
      "data_point": "timeOffType",
      "error": "timeOffType is disabled in country Nigeria"
    }
  ]
}

Response properties

validation_error (array)

A list of validation errors encountered during the amendment process.

  • error (string): Description of the validation error.
    • Example: "The minimum holidays for NG is 6 day(s)"
  • item (string): The data point where the error occurred.
    • Example: "holidays"
  • previous_value (string): The previous valid value before the attempted change.
    • Example: "6"
  • new_value (string): The new value that caused the validation error.
    • Example: "2"

disabled_amendments (array)

A list of amendments that were disabled due to restrictions.

  • type (string): The type of amendment restriction.
    • Example: "DISABLED"
  • previous_value (string): The previous valid value before the attempted change.
    • Example: "STANDARD"
  • new_value (string): The new value that is not allowed.
    • Example: "SPECIFIC"
  • data_point (string): The field that is disabled for amendment.
    • Example: "timeOffType"
  • error (string): Description of why the amendment is disabled.
    • Example: "timeOffType is disabled in country Nigeria"

status (integer)

The HTTP status code of the response.

  • 400

Confirm an amendment (client)

To confirm a draft amendment, use the contract_oid and amendment_flow_id. Only draft amendment can be confirmed. After it is confirmed, based on amendment type(it will be in response), it will be either instant or require acceptance from the employee and Deel.

curl --location -g --request PUT '{{host}}/rest/v2/eor/amendments/{{contract_oid}}/{{amendment_flow_id}}/actions/confirm' \
--header 'Authorization: Bearer {{token}}'

Validate data points (client)

To validate specific data points within an EOR contract that has external_validation:true, use the oid parameter.

curl --location -g --request POST '{{host}}/rest/v2/eor/amendments/:contract_oid/validate \
--header 'Authorization: Bearer {{token}}' \
--header 'Content-Type: application/json' \
--data-raw '{
    "jobTitle": "Software Engineer",
    "scope": "Test scope",
}'

Cancel an amendment (client)

To cancel an amendment, use the contract_oid and amendment_flow_id.Amendment can be canceled before employee signs it. After that, it can be deleted.

curl --location -g --request DELETE '{{host}}/rest/v2/eor/amendments/{{contract_oid}}/{{amendment_flow_id}}' \
--header 'Authorization: Bearer {{token}}'

Download amendment pdf (ea) (client and employee)

Retrieve the Statement of Work (EA) document download link for a confirmed amendment. Will be available only for
contracts that are in progress and after the amendment is confirmed. Link will expire after 15 minutes.

curl --location -g --request GET '{{host}}/rest/v2/eor/amendments/{{contract_oid}}/{{amendment_flow_id}}/pdf' \
--header 'Authorization: Bearer {{token}}'

Client accepts amendment (client)

A client can accept or decline(cancel) an amendment submitted by an admin. After accepting, the amendment based on amendment type(it will be in response), it will be either instant or require acceptance from the employee.

curl --location -g --request PUT '{{host}}/rest/v2/eor/amendments/{{contract_oid}}/{{amendment_flow_id}}/actions/accept' \
--header 'Authorization: Bearer {{token}}'

Employee signs approved amendment (employee)

An employee can sign an amendment approved by both the client and admin. After if the amendment will be active

curl --location -g --request PUT '{{host}}/rest/v2/eor/amendments/{{contract_oid}}/{{amendment_flow_id}}/actions/sign' \
--header 'Authorization: Bearer {{token}}'

Retrieve list of amendments (client and employee)

Retrieve all amendments for a specific contract.

curl --location -g --request GET '{{host}}/rest/v2/eor/amendments/{{contract_oid}}' \
--header 'Authorization: Bearer {{token}}'

Retrieve a specific amendment (client and employee)

Retrieve details of a specific amendment

curl --location -g --request GET '{{host}}/rest/v2/eor/amendments/{{contract_oid}}/{{amendment_flow_id}}' \
--header 'Authorization: Bearer {{token}}'

External apis for amendments

Seniority id amendment

To amend seniorityId, use the following API to retrieve the available seniority levels:

Get Seniority List

The retrieved seniorityId should be included in the amendment request.

Job title and scope amendment

To amend jobTitle or scope, the values must be validated before proceeding. This can be done using the Validate Data Points API.

Effective Date Limits for amendment

  1. Create an amendment using the Create Amendment endpoint.
  2. Call Get Effective Date Limitations.
  3. Apply the returned rules to populate or lock the effective date in the UI.
  4. (Optional) If required, submit the amendment with an effective date.

Specific settings for probationperiod

The probationPeriod settings may include the following configurations:

{
  "rule": "ONE_QUARTER_OF_CONTRACT_DURATION",
  "cap": 100
}

Additionally, tenure-based rules may be specified as follows:

{
  "minEmploymentDuration": 6,
  "maxEmploymentDuration": 12,
  "employmentDurationType": "MONTH",
  "probationPeriod": 90
}

General rules

  • For Indefinite contracts, the probation period must be between 90 and 180 days, regardless of whether the employment type is Full-time or Part-time.
  • For Definite contracts, the probation period has a minimum of 20 days, but the maximum value is dynamically calculated.

Dynamic calculation for definite contracts

When the contract term is Definite, the maximum probation period is determined based on the total contract
duration (contractDurationInDays) and a country-specific rule (eorCountryData.maxProbationTypeForDefinite):

  1. HALF_OF_CONTRACT_DURATION:
  • Maximum probation period is half of the contract duration.
  • Example: If a contract lasts 180 days, the max probation period is 180 / 2 = 90 days.
  1. ONE_QUARTER_OF_CONTRACT_DURATION:
  • Maximum probation period is one-fourth of the contract duration.
  • Example: If a contract lasts 180 days, the max probation period is 180 / 4 = 45 days.
  1. Default Case (ONE_THIRD_OF_CONTRACT_DURATION):
  • If no specific rule applies, the max probation period is one-third of the contract duration.
  • Example: If a contract lasts 180 days, the max probation period is 180 / 3 = 60 days.

Cap on maximum probation period

  • If the additional_details field contains a cap value, the calculated maximum probation period must be lower
    than the cap
    .
  • This cap limitation only applies when the probation period is determined based on:
    • HALF_OF_CONTRACT_DURATION
    • ONE_QUARTER_OF_CONTRACT_DURATION
    • ONE_THIRD_OF_CONTRACT_DURATION
  • Example:
    • If the contract duration is 180 days and the calculation method is HALF_OF_CONTRACT_DURATION, the max
      probation would be 90 days.
    • However, if a cap of 60 days exists in additional_details, the max probation must be limited to 60 days.

This ensures that the probation period for Definite contracts remains proportional to the total contract length
while complying with country-specific regulations and additional constraints.

📘

probationPeriod settings for Definite contracts can only have the above configurations.


Specific settings for notice period after probation rules

The noticePeriodAfterProbation data point follows specific rules based on the employment type and notice period type.

General rules

  • Applicable only when notice_period_type is set to CUSTOM.
  • The minimum and maximum notice period values range from 0 to 12 weeks.
  • Notice period rules differ for Full-time and Part-time employees.
  • A business constraint mandates that the notice period before probation must always be shorter than the notice period after probation.

Tenure-based notice period:

  • Only noticePeriodAfterProbation can have tenure-based rules.
  • Different rules apply based on the contract duration.
  • The contract duration dictates the applicable notice period limits.

Example rule definition:

{
  "data_point": "noticePeriodAfterProbation",
  "rules": [
    {
      "nullable": true,
      "min": 0,
      "max": 12,
      "is_editable": true,
      "requires": {
        "notice_period_type": "CUSTOM",
        "employment_type": "Full-time"
      },
      "additional_details": {
        "tenure_based_rules": [
          {
            "maxEmploymentDuration": 24,
            "minEmploymentDuration": 12,
            "noticeValue": 30,
            "employmentDurationType": "MONTH"
          },
          {
            "maxEmploymentDuration": 34,
            "minEmploymentDuration": 25,
            "noticeValue": 50,
            "employmentDurationType": "MONTH"
          }
        ],
        "time_unit": "WEEK",
        "note": "Notice period before probation should be less than notice period after probation"
      }
    },
    {
      "nullable": false,
      "min": 0,
      "max": 12,
      "is_editable": true,
      "requires": {
        "notice_period_type": "CUSTOM",
        "employment_type": "Part-time"
      },
      "additional_details": {
        "time_unit": "WEEK",
        "note": "Notice period before probation should be less than notice period after probation"
      }
    }
  ]
}

How to create and process amendment with examples

  1. Retrieve Amendment Settings
curl --location --request GET '{{host}}/rest/v2/eor/amendments/374xe7e/amendment-settings' \
--header 'accept: application/json' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer {{token}}' \
--data '{
    "data": {
        "timeOffType": "SPECIFIC",
        "holidays": 24
    }
}'

Response

{
  "data": [
    {
      "data_point": "contractTerm",
      "rules": [
        {
          "nullable": false,
          "is_editable": false,
          "possible_options": [
            "Definite",
            "Indefinite"
          ]
        }
      ]
    },
    {
      "data_point": "employmentType",
      "rules": [
        {
          "nullable": false,
          "is_editable": true,
          "possible_options": [
            "Full-time"
          ]
        }
      ]
    },
    {
      "data_point": "endDate",
      "rules": [
        {
          "nullable": false,
          "is_editable": true,
          "min_date": "2025-06-23",
          "requires": {
            "contract_term": "Definite"
          }
        }
      ]
    },
    {
      "data_point": "holidays",
      "rules": [
        {
          "nullable": false,
          "is_editable": true,
          "min": 6,
          "requires": {
            "employment_type": "Full-time",
            "time_off_type": "SPECIFIC"
          }
        },
        {
          "nullable": false,
          "is_editable": true,
          "min": 6,
          "requires": {
            "employment_type": "Part-time",
            "time_off_type": "SPECIFIC"
          }
        },
        {
          "nullable": false,
          "is_editable": true,
          "min": 6,
          "max": 6,
          "requires": {
            "employment_type": "Full-time",
            "time_off_type": "STANDARD"
          }
        },
        {
          "nullable": false,
          "is_editable": true,
          "min": 6,
          "max": 6,
          "requires": {
            "employment_type": "Part-time",
            "time_off_type": "STANDARD"
          }
        }
      ]
    },
    {
      "data_point": "jobTitle",
      "rules": [
        {
          "nullable": false,
          "is_editable": true,
          "external_validation": true
        }
      ]
    },
    {
      "data_point": "noticePeriodAfterProbation",
      "rules": [
        {
          "nullable": true,
          "min": 4,
          "max": 4,
          "is_editable": true,
          "requires": {
            "notice_period_type": "STANDARD",
            "contract_term": "Indefinite",
            "employment_type": "Full-time"
          },
          "additional_details": {
            "time_unit": "WEEK",
            "note": "Notice period before probation should be less than notice period after probation"
          }
        },
        {
          "nullable": true,
          "min": 0,
          "max": 12,
          "is_editable": true,
          "additional_details": {
            "time_unit": "WEEK",
            "note": "Notice period before probation should be less than notice period after probation",
            "tenure_based_rules": [
              {
                "min_employment_duration": 1,
                "max_employment_duration": 4,
                "employment_duration_type": "MONTH",
                "notice_value": 6
              },
              {
                "min_employment_duration": 5,
                "max_employment_duration": 9,
                "employment_duration_type": "MONTH",
                "notice_value": 10
              }
            ]
          },
          "requires": {
            "notice_period_type": "STANDARD",
            "contract_term": "Definite",
            "employment_type": "Full-time"
          }
        },
        {
          "nullable": true,
          "min": 0,
          "max": 12,
          "is_editable": true,
          "requires": {
            "notice_period_type": "CUSTOM",
            "contract_term": "Indefinite",
            "employment_type": "Full-time"
          },
          "additional_details": {
            "time_unit": "WEEK",
            "note": "Notice period before probation should be less than notice period after probation"
          }
        },
        {
          "nullable": true,
          "min": 0,
          "max": 12,
          "is_editable": true,
          "requires": {
            "notice_period_type": "CUSTOM",
            "contract_term": "Definite",
            "employment_type": "Full-time"
          },
          "additional_details": {
            "time_unit": "WEEK",
            "note": "Notice period before probation should be less than notice period after probation"
          }
        },
        {
          "nullable": true,
          "min": 4,
          "max": 4,
          "is_editable": true,
          "requires": {
            "notice_period_type": "STANDARD",
            "contract_term": "Indefinite",
            "employment_type": "Part-time"
          },
          "additional_details": {
            "time_unit": "WEEK",
            "note": "Notice period before probation should be less than notice period after probation"
          }
        },
        {
          "nullable": true,
          "min": 0,
          "max": 12,
          "is_editable": true,
          "additional_details": {
            "time_unit": "WEEK",
            "note": "Notice period before probation should be less than notice period after probation",
            "tenure_based_rules": [
              {
                "min_employment_duration": 1,
                "max_employment_duration": 4,
                "employment_duration_type": "MONTH",
                "notice_value": 6
              },
              {
                "min_employment_duration": 5,
                "max_employment_duration": 9,
                "employment_duration_type": "MONTH",
                "notice_value": 10
              }
            ]
          },
          "requires": {
            "notice_period_type": "STANDARD",
            "contract_term": "Definite",
            "employment_type": "Part-time"
          }
        },
        {
          "nullable": true,
          "min": 0,
          "max": 12,
          "is_editable": true,
          "requires": {
            "notice_period_type": "CUSTOM",
            "contract_term": "Indefinite",
            "employment_type": "Part-time"
          },
          "additional_details": {
            "time_unit": "WEEK",
            "note": "Notice period before probation should be less than notice period after probation"
          }
        },
        {
          "nullable": true,
          "min": 0,
          "max": 12,
          "is_editable": true,
          "requires": {
            "notice_period_type": "CUSTOM",
            "contract_term": "Definite",
            "employment_type": "Part-time"
          },
          "additional_details": {
            "time_unit": "WEEK",
            "note": "Notice period before probation should be less than notice period after probation"
          }
        }
      ]
    },
    {
      "data_point": "noticePeriodDuringProbation",
      "rules": [
        {
          "nullable": true,
          "min": 1,
          "max": 1,
          "is_editable": true,
          "requires": {
            "notice_period_type": "STANDARD",
            "contract_term": "Indefinite",
            "employment_type": "Full-time"
          },
          "additional_details": {
            "time_unit": "WEEK",
            "note": "Notice period before probation should be less than notice period after probation"
          }
        },
        {
          "nullable": true,
          "min": 2,
          "max": 2,
          "is_editable": true,
          "requires": {
            "notice_period_type": "STANDARD",
            "contract_term": "Definite",
            "employment_type": "Full-time"
          },
          "additional_details": {
            "time_unit": "WEEK",
            "note": "Notice period before probation should be less than notice period after probation"
          }
        },
        {
          "nullable": true,
          "min": 0,
          "max": 12,
          "is_editable": true,
          "requires": {
            "notice_period_type": "CUSTOM",
            "contract_term": "Indefinite",
            "employment_type": "Full-time"
          },
          "additional_details": {
            "time_unit": "WEEK",
            "note": "Notice period before probation should be less than notice period after probation"
          }
        },
        {
          "nullable": true,
          "min": 0,
          "max": 12,
          "is_editable": true,
          "requires": {
            "notice_period_type": "CUSTOM",
            "contract_term": "Definite",
            "employment_type": "Full-time"
          },
          "additional_details": {
            "time_unit": "WEEK",
            "note": "Notice period before probation should be less than notice period after probation"
          }
        },
        {
          "nullable": true,
          "min": 1,
          "max": 1,
          "is_editable": true,
          "requires": {
            "notice_period_type": "STANDARD",
            "contract_term": "Indefinite",
            "employment_type": "Part-time"
          },
          "additional_details": {
            "time_unit": "WEEK",
            "note": "Notice period before probation should be less than notice period after probation"
          }
        },
        {
          "nullable": true,
          "min": 2,
          "max": 2,
          "is_editable": true,
          "requires": {
            "notice_period_type": "STANDARD",
            "contract_term": "Definite",
            "employment_type": "Part-time"
          },
          "additional_details": {
            "time_unit": "WEEK",
            "note": "Notice period before probation should be less than notice period after probation"
          }
        },
        {
          "nullable": true,
          "min": 0,
          "max": 12,
          "is_editable": true,
          "requires": {
            "notice_period_type": "CUSTOM",
            "contract_term": "Indefinite",
            "employment_type": "Part-time"
          },
          "additional_details": {
            "time_unit": "WEEK",
            "note": "Notice period before probation should be less than notice period after probation"
          }
        },
        {
          "nullable": true,
          "min": 0,
          "max": 12,
          "is_editable": true,
          "requires": {
            "notice_period_type": "CUSTOM",
            "contract_term": "Definite",
            "employment_type": "Part-time"
          },
          "additional_details": {
            "time_unit": "WEEK",
            "note": "Notice period before probation should be less than notice period after probation"
          }
        }
      ]
    },
    {
      "data_point": "noticePeriodType",
      "rules": [
        {
          "nullable": false,
          "is_editable": true,
          "possible_options": [
            "STANDARD",
            "CUSTOM"
          ],
          "requires": {
            "employment_type": "Full-time"
          }
        },
        {
          "nullable": false,
          "is_editable": true,
          "possible_options": [
            "STANDARD",
            "CUSTOM"
          ],
          "requires": {
            "employment_type": "Part-time"
          }
        }
      ]
    },
    {
      "data_point": "probationPeriod",
      "rules": [
        {
          "nullable": true,
          "min": 90,
          "max": 180,
          "is_editable": true,
          "requires": {
            "employment_type": "Full-time",
            "contract_term": "Indefinite"
          }
        },
        {
          "nullable": true,
          "min": 90,
          "max": 180,
          "is_editable": true,
          "requires": {
            "employment_type": "Part-time",
            "contract_term": "Indefinite"
          }
        },
        {
          "nullable": true,
          "min": 90,
          "max": 0,
          "is_editable": true,
          "requires": {
            "contract_term": "Definite"
          },
          "additional_details": {
            "rule": "ONE_QUARTER_OF_CONTRACT_DURATION",
            "cap": 100
          }
        }
      ]
    },
    {
      "data_point": "scope",
      "rules": [
        {
          "nullable": false,
          "is_editable": true,
          "external_validation": true
        }
      ]
    },
    {
      "data_point": "seniority",
      "rules": [
        {
          "nullable": false,
          "is_editable": true,
          "external_validation": true
        }
      ]
    },
    {
      "data_point": "startDate",
      "rules": [
        {
          "nullable": false,
          "is_editable": false,
          "min_date": "2024-12-13"
        }
      ]
    },
    {
      "data_point": "timeOffType",
      "rules": [
        {
          "nullable": false,
          "is_editable": true,
          "possible_options": [
            "STANDARD",
            "SPECIFIC"
          ]
        }
      ]
    },
    {
      "data_point": "workHoursPerWeek",
      "rules": [
        {
          "nullable": false,
          "is_editable": true,
          "max": 40,
          "min": 40,
          "requires": {
            "employment_type": "Full-time"
          }
        },
        {
          "nullable": false,
          "is_editable": true,
          "max": 39,
          "min": 1,
          "requires": {
            "employment_type": "Part-time"
          }
        }
      ]
    },
    {
      "data_point": "employmentState",
      "rules": [
        {
          "nullable": false,
          "is_editable": false,
          "possible_options": []
        }
      ]
    },
    {
      "data_point": "salary",
      "rules": [
        {
          "nullable": false,
          "is_editable": true,
          "min": 527.7849922722874,
          "max": 259475.48134227723,
          "requires": {
            "employment_type": "full-time"
          }
        },
        {
          "nullable": false,
          "is_editable": true,
          "max": 259475.48134227723,
          "requires": {
            "employment_type": "part-time"
          }
        }
      ]
    }
  ]
}
  1. Create Amendment
curl --location '{{host}}/rest/v2/eor/amendments/374xe7e/' \
--header 'accept: application/json' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer {{token}}' \
--data '{
    "data": {
        "time_off_type": "SPECIFIC",
        "holidays": 12,
        "employment_type": "Part-time"
    }
}'

Response


{
  "data": {
    "id": "116fdec2-d8b6-4c64-82d9-089cccf92731",
    "effective_date": null,
    "salary": "100000.0000",
    "employment_type": "Full-time",
    "seniority_id": 34,
    "job_title": "Account Executive",
    "time_off_type": "SPECIFIC",
    "probation_period_type_for_definite": null,
    "document_type": "SOW_EA",
    "holidays": 12,
    "probation_period": 90,
    "scope": "Duties and Responsibilities\n\n- Create detailed business plans designed to attain predetermined goals and quotas.\n- Manage the entire sales cycle from finding a client to securing a deal.\n- Unearth new sales opportunities through networking and turn them into long-term partnerships.\n- Present products to prospective clients.\n- Provide professional after-sales support to maximize customer loyalty.\n- Remain in regular contact with your clients to understand and meet their needs.\n- Respond to complaints and resolve issues to the customer's satisfaction and to maintain the company's reputation.\n- Negotiate agreements.\n- Maintains all sales databases necessary to report sales activity and customer information.\n- Attends all sales meetings and training sessions as required by management.",
    "employee_nationality": "NG",
    "employment_state": null,
    "start_date": "2024-12-13T00:00:00.000Z",
    "end_date": null,
    "work_hours_per_week": "40.00",
    "sick_leave_days": null,
    "type": "LEGAL",
    "created_at": "2025-03-25T11:32:35.320Z",
    "requested_by": 1430095,
    "is_hrx_action_needed": false,
    "legal_context": null,
    "rejection_context": null,
    "void_deadline": null,
    "void_deadline_type": null,
    "notice_period_type": "STANDARD",
    "notice_period_after_probation": "4",
    "notice_period_during_probation": "1",
    "notice_period_time_unit": "WEEK",
    "currency": "USD",
    "is_effective_date_updated": false,
    "description": null,
    "work_schedule_id": null,
    "work_schedule_rules_version": null,
    "source": "PUBLIC_API",
    "amendment_statuses": [
      {
        "name": "Draft",
        "friendly_name": "Draft",
        "_amendment_flow_status": {
          "created_at": "2025-03-25T11:32:35.358Z"
        }
      }
    ],
    "items": [
      {
        "data_point": "holidays",
        "id": "4bc539c7-50a7-41eb-b6a3-a5d00ed0a8f2",
        "item": "holidaysIncrease",
        "type": "INSTANT",
        "previous_value": "6",
        "new_value": "12"
      },
      {
        "data_point": "timeOffType",
        "id": "0deaa6a0-54be-43f4-af72-368548166323",
        "item": "timeOffType",
        "type": "LEGAL",
        "previous_value": "STANDARD",
        "new_value": "SPECIFIC"
      }
    ]
  }
}

2.1 Update the amendment if needed, using id from the response

curl --location '{{host}}/rest/v2/eor/amendments/374xe7e/' \
--header 'accept: application/json' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer {{token}}' \
--data '{
    "data": {
        "time_off_type": "SPECIFIC",
        "holidays": 16,
        "employment_type": "Part-time"
        id: "116fdec2-d8b6-4c64-82d9-089cccf92731"
    }
}'

2.2 Use the amendment id to fetch the effective date limits. If you support it, display a calendar using the date limits and flags returned in the response

curl --location 'https://api-gateway.deel.training/rest/v2/eor/amendments/mdyyevp/34c6ef5a-b18b-461f-a0d3-83a306d271d9/validation-rules/effective-date-limitations' \
--header 'Authorization: Bearer {API_TOKEN}'

Response

{
  "data": {
    "is_hidden": false,
    "is_disabled": false,
    "min_effective_date": "2025-07-01",
    "max_effective_date": "2025-12-31",
    "default_effective_date": "2025-08-01",
    "message": "The effective date should align with the payroll cycle."
  }
}

2.3 Set the effective date by calling the update amendment endpoint, using the id from the response.

curl --location '{{host}}/rest/v2/eor/amendments/374xe7e/' \
--header 'accept: application/json' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer {{token}}' \
--data 
'{
    "data": {
      "time_off_type": "SPECIFIC",
      "holidays": 16,
      "effective_date": "2025-08-01",
      id: "116fdec2-d8b6-4c64-82d9-089cccf92731"
    }
}'
  1. Confirm the amendment using id from the response
curl --location --request POST '{{host}}/rest/v2/eor/amendments/374xe7e/116fdec2-d8b6-4c64-82d9-089cccf92731/actions/confirm' \
--header 'accept: application/json' \
--header 'Authorization: Bearer {{token}}'

Response

{
  "data": {
    "id": "116fdec2-d8b6-4c64-82d9-089cccf92731",
    "effective_date": null,
    "salary": "100000.0000",
    "employment_type": "Full-time",
    "seniority_id": 34,
    "job_title": "Account Executive",
    "time_off_type": "SPECIFIC",
    "probation_period_type_for_definite": null,
    "document_type": "SOW_EA",
    "holidays": 12,
    "probation_period": 90,
    "scope": "Duties and Responsibilities\n\n- Create detailed business plans designed to attain predetermined goals and quotas.\n- Manage the entire sales cycle from finding a client to securing a deal.\n- Unearth new sales opportunities through networking and turn them into long-term partnerships.\n- Present products to prospective clients.\n- Provide professional after-sales support to maximize customer loyalty.\n- Remain in regular contact with your clients to understand and meet their needs.\n- Respond to complaints and resolve issues to the customer's satisfaction and to maintain the company's reputation.\n- Negotiate agreements.\n- Maintains all sales databases necessary to report sales activity and customer information.\n- Attends all sales meetings and training sessions as required by management.",
    "employee_nationality": "NG",
    "employment_state": null,
    "start_date": "2024-12-13T00:00:00.000Z",
    "end_date": null,
    "work_hours_per_week": "40.00",
    "sick_leave_days": null,
    "type": "LEGAL",
    "created_at": "2025-03-25T11:32:35.320Z",
    "requested_by": 1430095,
    "is_hrx_action_needed": false,
    "legal_context": null,
    "rejection_context": null,
    "void_deadline": null,
    "void_deadline_type": null,
    "notice_period_type": "STANDARD",
    "notice_period_after_probation": "4",
    "notice_period_during_probation": "1",
    "notice_period_time_unit": "WEEK",
    "currency": "USD",
    "is_effective_date_updated": false,
    "description": null,
    "work_schedule_id": null,
    "work_schedule_rules_version": null,
    "source": "PUBLIC_API",
    "amendment_statuses": [
      {
        "name": "PreparingDocuments.AmendmentRequested.EA",
        "friendly_name": "Ea",
        "_amendment_flow_status": {
          "created_at": "2025-03-25T11:32:52.963Z"
        }
      },
      {
        "name": "PreparingDocuments.AmendmentRequested.EA.PendingDocumentSubmit",
        "friendly_name": "Awaiting review",
        "_amendment_flow_status": {
          "created_at": "2025-03-25T11:32:52.963Z"
        }
      },
      {
        "name": "PreparingDocuments.AmendmentRequested.SOW",
        "friendly_name": "Sow",
        "_amendment_flow_status": {
          "created_at": "2025-03-25T11:32:52.963Z"
        }
      },
      {
        "name": "PreparingDocuments.AmendmentRequested.SOW.PendingDocumentSubmit",
        "friendly_name": "Awaiting review",
        "_amendment_flow_status": {
          "created_at": "2025-03-25T11:32:52.963Z"
        }
      },
      {
        "name": "PreparingDocuments.AmendmentRequested.CustomReview",
        "friendly_name": "Custom review",
        "_amendment_flow_status": {
          "created_at": "2025-03-25T11:32:52.963Z"
        }
      },
      {
        "name": "PreparingDocuments.AmendmentRequested.CustomReview.CustomSkipped",
        "friendly_name": "Custom skipped",
        "_amendment_flow_status": {
          "created_at": "2025-03-25T11:32:52.963Z"
        }
      },
      {
        "name": "PreparingDocuments.AmendmentRequested",
        "friendly_name": "Amendment requested",
        "_amendment_flow_status": {
          "created_at": "2025-03-25T11:32:52.963Z"
        }
      },
      {
        "name": "PreparingDocuments",
        "friendly_name": "Preparing documents",
        "_amendment_flow_status": {
          "created_at": "2025-03-25T11:32:52.963Z"
        }
      }
    ],
    "items": [
      {
        "data_point": "holidays",
        "id": "4bc539c7-50a7-41eb-b6a3-a5d00ed0a8f2",
        "item": "holidaysIncrease",
        "type": "INSTANT",
        "previous_value": "6",
        "new_value": "12"
      },
      {
        "data_point": "timeOffType",
        "id": "0deaa6a0-54be-43f4-af72-368548166323",
        "item": "timeOffType",
        "type": "LEGAL",
        "previous_value": "STANDARD",
        "new_value": "SPECIFIC"
      }
    ]
  }
}
  1. Wait for the amendment to be reviewed. You can monitor status using get endpoint.
curl --location '{{host}}/rest/v2/eor/amendments/374xe7e/116fdec2-d8b6-4c64-82d9-089cccf92731' \
--header 'accept: application/json' \
--header 'Authorization: Bearer {{token}}'

Response

{
  "data": {
    "id": "116fdec2-d8b6-4c64-82d9-089cccf92731",
    "effective_date": null,
    "salary": "100000.0000",
    "employment_type": "Full-time",
    "seniority_id": 34,
    "job_title": "Account Executive",
    "time_off_type": "SPECIFIC",
    "probation_period_type_for_definite": null,
    "document_type": "SOW_EA",
    "holidays": 12,
    "probation_period": 90,
    "scope": "Duties and Responsibilities\n\n- Create detailed business plans designed to attain predetermined goals and quotas.\n- Manage the entire sales cycle from finding a client to securing a deal.\n- Unearth new sales opportunities through networking and turn them into long-term partnerships.\n- Present products to prospective clients.\n- Provide professional after-sales support to maximize customer loyalty.\n- Remain in regular contact with your clients to understand and meet their needs.\n- Respond to complaints and resolve issues to the customer's satisfaction and to maintain the company's reputation.\n- Negotiate agreements.\n- Maintains all sales databases necessary to report sales activity and customer information.\n- Attends all sales meetings and training sessions as required by management.",
    "employee_nationality": "NG",
    "employment_state": null,
    "start_date": "2024-12-13T00:00:00.000Z",
    "end_date": null,
    "work_hours_per_week": "40.00",
    "sick_leave_days": null,
    "type": "LEGAL",
    "created_at": "2025-03-25T11:32:35.320Z",
    "requested_by": 1430095,
    "is_hrx_action_needed": false,
    "legal_context": null,
    "rejection_context": null,
    "void_deadline": null,
    "void_deadline_type": null,
    "notice_period_type": "STANDARD",
    "notice_period_after_probation": "4",
    "notice_period_during_probation": "1",
    "notice_period_time_unit": "WEEK",
    "currency": "USD",
    "is_effective_date_updated": false,
    "description": null,
    "work_schedule_id": null,
    "work_schedule_rules_version": null,
    "source": "PUBLIC_API",
    "amendment_statuses": [
      {
        "name": "PreparingDocuments.AmendmentRequested.EA",
        "friendly_name": "Ea",
        "_amendment_flow_status": {
          "created_at": "2025-03-25T11:32:52.963Z"
        }
      },
      {
        "name": "PreparingDocuments.AmendmentRequested.EA.PendingDocumentSubmit",
        "friendly_name": "Awaiting review",
        "_amendment_flow_status": {
          "created_at": "2025-03-25T11:32:52.963Z"
        }
      },
      {
        "name": "PreparingDocuments.AmendmentRequested.SOW",
        "friendly_name": "Sow",
        "_amendment_flow_status": {
          "created_at": "2025-03-25T11:32:52.963Z"
        }
      },
      {
        "name": "PreparingDocuments.AmendmentRequested.SOW.PendingDocumentSubmit",
        "friendly_name": "Awaiting review",
        "_amendment_flow_status": {
          "created_at": "2025-03-25T11:32:52.963Z"
        }
      },
      {
        "name": "PreparingDocuments.AmendmentRequested.CustomReview",
        "friendly_name": "Custom review",
        "_amendment_flow_status": {
          "created_at": "2025-03-25T11:32:52.963Z"
        }
      },
      {
        "name": "PreparingDocuments.AmendmentRequested.CustomReview.CustomSkipped",
        "friendly_name": "Custom skipped",
        "_amendment_flow_status": {
          "created_at": "2025-03-25T11:32:52.963Z"
        }
      },
      {
        "name": "PreparingDocuments.AmendmentRequested",
        "friendly_name": "Amendment requested",
        "_amendment_flow_status": {
          "created_at": "2025-03-25T11:32:52.963Z"
        }
      },
      {
        "name": "PreparingDocuments",
        "friendly_name": "Preparing documents",
        "_amendment_flow_status": {
          "created_at": "2025-03-25T11:32:52.963Z"
        }
      }
    ],
    "items": [
      {
        "data_point": "holidays",
        "id": "4bc539c7-50a7-41eb-b6a3-a5d00ed0a8f2",
        "item": "holidaysIncrease",
        "type": "INSTANT",
        "previous_value": "6",
        "new_value": "12"
      },
      {
        "data_point": "timeOffType",
        "id": "0deaa6a0-54be-43f4-af72-368548166323",
        "item": "timeOffType",
        "type": "LEGAL",
        "previous_value": "STANDARD",
        "new_value": "SPECIFIC"
      }
    ]
  }
}

Or you can use the webhook to get the status of the amendment

{
  "data": {
    "meta": {
      "event_type": "eor.amendment.status.updated",
      "event_type_id": "de688244-7869-46db-8ac7-00083965cc9b",
      "organization_id": "9c09a153-1418-4127-8c44-e99483e7c321",
      "organization_name": "20TT65OV",
      "tracking_id": "d09a72b0002191b65de3a453d177f1a7"
    },
    "resource": {
      "amendment_flow_id": "116fdec2-d8b6-4c64-82d9-089cccf92731",
      "organization_id": "9c09a153-1418-4127-8c44-e99483e7c321",
      "status": "EOR_AMENDMENT_V2_CLIENT_ACTIVE"
    }
  },
  "timestamp": "2025-02-07T12:36:16.360Z"
}

To get link to download the EA document

curl --location '{{host}}/rest/v2/eor/amendments/374xe7e/51005644-d775-421c-9e59-c0aeacd8d4c1/pdf' \
--header 'accept: application/json' \
--header 'Authorization: Bearer {{token}}'

Response

{
  "data": {
    "url": "{{host}}/eor-experience-dev/amendment_documents/fb4a3959-0a93-4dd9-9b46-7f1af60b2bbd.pdf?AWSAccessKeyId=TEST_ACCESS_KEY&Expires=1673158576&Signature=TEST_SIGNATURE"
  }
}
  1. While the amendment in not active you can cancel it
curl --location --request DELETE '{{host}}/rest/v2/eor/amendments/374xe7e/3c810625-8108-43c2-8aca-14a552255148' \
--header 'accept: application/json' \
--header 'Authorization: Bearer {{token}}'

Response

{
    "data": {
        "success": true
    }
}
  1. Once its review by Deel employee need to sign it
curl --location --request POST '{{host}}/rest/v2/eor/amendments/374xe7e/116fdec2-d8b6-4c64-82d9-089cccf92731/actions/sign' \
--header 'accept: application/json' \
--header 'Authorization: Bearer {{token}}'