> 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.

# Create a new adjustment

POST https://api.letsdeel.com/rest/adjustments
Content-Type: application/json

Create a payroll adjustment for a contract to add or correct a payment amount on an upcoming payment cycle. Use this endpoint when you need to programmatically apply one-off adjustments; each adjustment must reference a valid category from `GET /rest/adjustments/categories`, which determines its type and accounting treatment.

 **Token scopes**: `adjustments:write`

Reference: https://developer.deel.com/api/eor-endpoints/adjustments/create-contract-adjustment

## Authentication

- `Authorization` header (bearer token, required) — ## Authentication The Deel API uses bearer tokens to authenticate requests. All API calls must be made over HTTPS — calls over plain HTTP or without authentication will fail. ```curl curl -X GET 'https://api.letsdeel.com/rest/v2/contracts' \ -H 'Authorization: Bearer YOUR-TOKEN-HERE' ``` [Learn more about authentication](/api/authentication)
- `Authorization` header (bearer token, required) — Standard OAuth2 security scheme based on https://swagger.io/docs/specification/authentication/

## Servers

- `https://api.letsdeel.com/rest` (Production, default)
- `https://api-staging.letsdeel.com/rest` (Demo)

## Request

### Body (application/json)

This endpoint expects an object.

- `data` (AdjustmentsPostRequestBodyContentApplicationJsonSchemaData, required) — Details of adjustment to create

## Response

### 201

Successful operation.

- `data` (AdjustmentsPostResponsesContentApplicationJsonSchemaData, required)

## Errors

### 400 Bad Request Error

Bad Request – failed to create adjustments

- `errors` (list of AdjustmentsPostResponsesContentApplicationJsonSchemaErrorsItems, required)

### 401 Unauthorized Error

Operation failed.

- `request` (ApiErrorRequest, optional)
- `errors` (list of ApiError, optional)

### 403 Forbidden Error

Operation failed.

- `request` (ApiErrorRequest, optional)
- `errors` (list of ApiError, optional)

### 404 Not Found Error

Operation failed.

- `request` (ApiErrorRequest, optional)
- `errors` (list of ApiError, optional)

### 500 Internal Server Error

Operation failed.

- `request` (ApiErrorRequest, optional)
- `errors` (list of ApiError, optional)

## Types

### AdjustmentsPostRequestBodyContentApplicationJsonSchemaData

Details of adjustment to create

- `title` (string, required) — Title of adjustment.
- `amount` (AdjustmentsPostRequestBodyContentApplicationJsonSchemaDataAmount, required) — Amount of adjustment.
- `contract_id` (string, required) — The identifier of the contract associated with the adjustment
- `description` (string, required) — Description of adjustment.
- `adjustment_category_id` (string, required) — Adjustment category id.
- `vendor` (string, optional) — Vendor of adjustment. Conditionally required: for adjustment categories configured to require a vendor, which is typically an expense category, and for Global Payroll contracts whenever the organization has the compliance check enabled, which applies to any category. Leave the field out entirely when it does not apply - sending it empty is rejected, because the length constraint still applies to a value that is present.
- `country` (string, optional) — Country the expense was incurred in, which is not necessarily the contract country. Conditionally required: for adjustment categories configured to require a country, which is typically an expense category, and for Global Payroll contracts whenever the organization has the compliance check enabled, which applies to any category. Leave the field out entirely when it does not apply - sending it empty is rejected, because the pattern still applies to a value that is present.
- `odp_only` (boolean, optional) — EOR contracts only. Restrict the adjustment to on-demand payroll: when true it is never attached to a regular payroll cycle, and it is automatically denied if it is still not part of an on-demand payroll 30 days after creation. Sending it for any other contract type is rejected, because on-demand payroll does not exist there. Editable only through this API, and it forces move_next_cycle to false.
- `cycle_reference` (string, optional) — Cycle reference of adjustment.
- `move_next_cycle` (boolean, optional, nullable) — If an adjustments can belong to another payroll cycle.
- `date_of_adjustment` (string, optional, nullable) — Short date in format ISO-8601 (YYYY-MM-DD). For example: 2022-12-31.
- `submitter_profile_id` (integer, optional, nullable) — The identifier of the profile that submits the adjustment. Must be a profile authorized on the target contract. When omitted, the adjustment is attributed to the profile resolved from the API token.

### AdjustmentsPostResponsesContentApplicationJsonSchemaData

- `id` (string, optional) — The unique identifier of the adjustment
- `file` (AdjustmentsPostResponsesContentApplicationJsonSchemaDataFile, optional, nullable) — Adjustment attachment
- `title` (string, optional) — The title of the adjustment
- `amount` (string, optional) — The amount of the adjustment
- `status` (AdjustmentsPostResponsesContentApplicationJsonSchemaDataStatus, optional) — The status of the adjustments
- `odp_only` (boolean, optional) — Whether the adjustment is restricted to on-demand payroll and never attached to a regular payroll cycle. Always false for contract types other than EOR
- `created_at` (string, optional) — The date and time when the adjustment was created
- `updated_at` (string, optional) — The date and time when the adjustment was last updated
- `contract_id` (string, optional) — The identifier of the contract associated with the adjustment
- `description` (string, optional) — The description of the adjustment
- `cycle_reference` (string, optional, nullable) — The reference to the cycle associated with the adjustment
- `move_next_cycle` (boolean, optional) — If an adjustments can belong to another payroll cycle
- `date_of_adjustment` (string, optional) — The date of the adjustment
- `actual_end_cycle_date` (string, optional) — The date of the actual end cycle date
- `adjustment_category_id` (string, optional) — The identifier of the adjustment category associated with the adjustment
- `actual_start_cycle_date` (string, optional) — The date of the actual start cycle date

### AdjustmentsPostResponsesContentApplicationJsonSchemaErrorsItems

- `message` (string, required)

### ApiErrorRequest

- `method` (string, optional) — The HTTP method of the failed request
- `url` (string, optional) — The relative URL of the failed request
- `status` (double, optional) — The status code of the response
- `api_req_id` (string, optional) — The request ID of the failed request
- `docs` (string, optional) — A link to the official documentation for the requested endpoint resource
- `source` (string, optional) — The source handler which produced the returned error
- `code` (double, optional) — The code of the source handler which produced the returned error

### ApiError

- `message` (string, optional) — A description of the returned error
- `path` (string, optional) — The JSON path where input validation failed

### AdjustmentsPostRequestBodyContentApplicationJsonSchemaDataAmount

Amount of adjustment.

### AdjustmentsPostResponsesContentApplicationJsonSchemaDataFile

Adjustment attachment

- `id` (string, optional) — The unique identifier of the file
- `name` (string, optional) — The name of the file
- `fileType` (string, optional) — The type of the file

### AdjustmentsPostResponsesContentApplicationJsonSchemaDataStatus

The status of the adjustments

## Examples

**Request**

```json
{
  "data": {
    "title": "Your title here",
    "amount": 100.25,
    "contract_id": "m3jk2j",
    "description": "Your description here",
    "adjustment_category_id": "c9cf4c2c0165f48f494415390c3b49"
  }
}
```

**Response**

```json
{
  "data": {
    "id": "123e4567-e89b-12d3-a456-426614174000",
    "file": {
      "id": "123e4567-e89b-12d3-a456-426614174000",
      "name": "your_file_name",
      "fileType": "pdf"
    },
    "title": "Your title here",
    "amount": "1234.56",
    "status": "OPEN",
    "odp_only": true,
    "created_at": "2020-11-02T12:00:00.000Z",
    "updated_at": "2020-11-02T12:00:00.000Z",
    "contract_id": "m3jk2j",
    "description": "Your description here",
    "cycle_reference": "your_cycle_reference",
    "move_next_cycle": true,
    "date_of_adjustment": "2020-11-02T12:00:00.000Z",
    "actual_end_cycle_date": "2023-11-15T00:00:00.000Z",
    "adjustment_category_id": "c9cf4c2c0165f48f494415390c3b49",
    "actual_start_cycle_date": "2023-11-01T00:00:00.000Z"
  }
}
```

**SDK Code**

```python
import requests

url = "https://api.letsdeel.com/rest/adjustments"

payload = { "data": {
        "title": "Your title here",
        "amount": 100.25,
        "contract_id": "m3jk2j",
        "description": "Your description here",
        "adjustment_category_id": "c9cf4c2c0165f48f494415390c3b49"
    } }
headers = {
    "Authorization": "Bearer <token>",
    "Content-Type": "application/json"
}

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

print(response.json())
```

```javascript
const url = 'https://api.letsdeel.com/rest/adjustments';
const options = {
  method: 'POST',
  headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
  body: '{"data":{"title":"Your title here","amount":100.25,"contract_id":"m3jk2j","description":"Your description here","adjustment_category_id":"c9cf4c2c0165f48f494415390c3b49"}}'
};

try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```

```go
package main

import (
	"fmt"
	"strings"
	"net/http"
	"io"
)

func main() {

	url := "https://api.letsdeel.com/rest/adjustments"

	payload := strings.NewReader("{\n  \"data\": {\n    \"title\": \"Your title here\",\n    \"amount\": 100.25,\n    \"contract_id\": \"m3jk2j\",\n    \"description\": \"Your description here\",\n    \"adjustment_category_id\": \"c9cf4c2c0165f48f494415390c3b49\"\n  }\n}")

	req, _ := http.NewRequest("POST", url, payload)

	req.Header.Add("Authorization", "Bearer <token>")
	req.Header.Add("Content-Type", "application/json")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
```

```ruby
require 'uri'
require 'net/http'

url = URI("https://api.letsdeel.com/rest/adjustments")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n  \"data\": {\n    \"title\": \"Your title here\",\n    \"amount\": 100.25,\n    \"contract_id\": \"m3jk2j\",\n    \"description\": \"Your description here\",\n    \"adjustment_category_id\": \"c9cf4c2c0165f48f494415390c3b49\"\n  }\n}"

response = http.request(request)
puts response.read_body
```

```java
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.post("https://api.letsdeel.com/rest/adjustments")
  .header("Authorization", "Bearer <token>")
  .header("Content-Type", "application/json")
  .body("{\n  \"data\": {\n    \"title\": \"Your title here\",\n    \"amount\": 100.25,\n    \"contract_id\": \"m3jk2j\",\n    \"description\": \"Your description here\",\n    \"adjustment_category_id\": \"c9cf4c2c0165f48f494415390c3b49\"\n  }\n}")
  .asString();
```

```php
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.letsdeel.com/rest/adjustments', [
  'body' => '{
  "data": {
    "title": "Your title here",
    "amount": 100.25,
    "contract_id": "m3jk2j",
    "description": "Your description here",
    "adjustment_category_id": "c9cf4c2c0165f48f494415390c3b49"
  }
}',
  'headers' => [
    'Authorization' => 'Bearer <token>',
    'Content-Type' => 'application/json',
  ],
]);

echo $response->getBody();
```

```csharp
using RestSharp;

var client = new RestClient("https://api.letsdeel.com/rest/adjustments");
var request = new RestRequest(Method.POST);
request.AddHeader("Authorization", "Bearer <token>");
request.AddHeader("Content-Type", "application/json");
request.AddParameter("application/json", "{\n  \"data\": {\n    \"title\": \"Your title here\",\n    \"amount\": 100.25,\n    \"contract_id\": \"m3jk2j\",\n    \"description\": \"Your description here\",\n    \"adjustment_category_id\": \"c9cf4c2c0165f48f494415390c3b49\"\n  }\n}", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
```

```swift
import Foundation

let headers = [
  "Authorization": "Bearer <token>",
  "Content-Type": "application/json"
]
let parameters = ["data": [
    "title": "Your title here",
    "amount": 100.25,
    "contract_id": "m3jk2j",
    "description": "Your description here",
    "adjustment_category_id": "c9cf4c2c0165f48f494415390c3b49"
  ]] as [String : Any]

let postData = JSONSerialization.data(withJSONObject: parameters, options: [])

let request = NSMutableURLRequest(url: NSURL(string: "https://api.letsdeel.com/rest/adjustments")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "POST"
request.allHTTPHeaderFields = headers
request.httpBody = postData as Data

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error as Any)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
```