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

# Add off-cycle payment

POST https://api.letsdeel.com/rest/contracts/{contract_id}/off-cycle-payments
Content-Type: application/json

Adds a one-off payment to a contract outside its regular payment cycle, such as a bonus, a reimbursement or a correction that the contractor should receive on top of the scheduled amount. Set is\_auto\_approved to skip the manual approval step. Use GET /contracts/\{contract\_id}/off-cycle-payments/\{off\_cycle\_payment\_id} to follow the payment afterwards.

**Token scopes**: `off-cycle-payments:write`

Reference: https://developer.deel.com/api/endpoints/off-cycle/create-contract-off-cycle-payment

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

### Path parameters

- `contract_id` (string, required) — The unique identifier (ID) of the Deel contract for which the off-cycle payment is being created.

### Body (application/json)

This endpoint expects an object.

- `data` (ContractsContractIdOffCyclePaymentsPostRequestBodyContentApplicationJsonSchemaData, optional) — The off-cycle payment data to submit.

## Response

### 201

The off-cycle payment was successfully created.

- `data` (ContractsContractIdOffCyclePaymentsPostResponsesContentApplicationJsonSchemaData, required) — Details of the newly created off-cycle payment.

## Errors

### 400 Bad Request Error

Bad Request - The request payload failed validation, the contract type does not support off-cycle payments, or payment_due_date is not a valid calendar date, is in the past or after the contract end date.

- `errors` (list of ContractsContractIdOffCyclePaymentsPostResponsesContentApplicationJsonSchemaErrorsItems, required) — Validation or business rule errors describing why the off-cycle payment could not be created, such as invalid input or an unsupported contract type.

### 401 Unauthorized Error

Operation failed.

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

### 403 Forbidden Error

Forbidden - The requesting token is not authorized to create off-cycle payments on this contract.

- `errors` (list of ContractsContractIdOffCyclePaymentsPostResponsesContentApplicationJsonSchemaErrorsItems, required) — Errors describing why the off-cycle payment could not be created.

### 404 Not Found Error

Not Found - The specified contract does not exist.

- `errors` (list of ContractsContractIdOffCyclePaymentsPostResponsesContentApplicationJsonSchemaErrorsItems, required) — Errors describing why the contract could not be found.

### 500 Internal Server Error

Internal Server Error - The off-cycle payment could not be created due to an unexpected upstream or internal failure.

- `errors` (list of ContractsContractIdOffCyclePaymentsPostResponsesContentApplicationJsonSchemaErrorsItems, required) — Generic upstream or internal errors emitted when the off-cycle payment cannot be created.

## Types

### ContractsContractIdOffCyclePaymentsPostRequestBodyContentApplicationJsonSchemaData

The off-cycle payment data to submit.

- `amount` (double, required) — The amount of the off-cycle payment.
- `description` (string, required) — A description or reason for the off-cycle payment.
- `date_submitted` (string, required) — The date the off-cycle payment is submitted, in ISO-8601 format (YYYY-MM-DD).
- `is_auto_approved` (boolean, optional) — If true, the off-cycle payment will be automatically approved as part of the request.
- `payment_due_date` (string, optional, nullable) — Due date of the resulting one-off invoice, in ISO-8601 format (YYYY-MM-DD) in the contract timezone. Defaults to today when omitted or null. Must be today or later and, when the contract is active and has an end date, not after that end date.
- `hourly_report_preset_id` (string, optional, nullable) — Id of an existing preset.

### ContractsContractIdOffCyclePaymentsPostResponsesContentApplicationJsonSchemaData

Details of the newly created off-cycle payment.

- `created` (boolean, required) — Indicates whether the off-cycle payment was successfully created.
- `id` (string, optional) — The unique identifier of the created off-cycle payment.

### ContractsContractIdOffCyclePaymentsPostResponsesContentApplicationJsonSchemaErrorsItems

- `message` (string, required) — Human-readable error message describing the unexpected condition.
- `code` (string, optional) — Machine-readable error code identifying the failure category.

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

## Examples

**Request**

```json
{
  "data": {
    "amount": 500,
    "description": "Reimbursement for travel expenses",
    "date_submitted": "2024-12-01"
  }
}
```

**Response**

```json
{
  "data": {
    "created": true,
    "id": "00000000-0000-0000-0000-000000000000"
  }
}
```

**SDK Code**

```python success
import requests

url = "https://api.letsdeel.com/rest/contracts/abcdefg/off-cycle-payments"

payload = { "data": {
        "amount": 500,
        "description": "Reimbursement for travel expenses",
        "date_submitted": "2024-12-01"
    } }
headers = {
    "Authorization": "Bearer <token>",
    "Content-Type": "application/json"
}

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

print(response.json())
```

```javascript success
const url = 'https://api.letsdeel.com/rest/contracts/abcdefg/off-cycle-payments';
const options = {
  method: 'POST',
  headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
  body: '{"data":{"amount":500,"description":"Reimbursement for travel expenses","date_submitted":"2024-12-01"}}'
};

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

```go success
package main

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

func main() {

	url := "https://api.letsdeel.com/rest/contracts/abcdefg/off-cycle-payments"

	payload := strings.NewReader("{\n  \"data\": {\n    \"amount\": 500,\n    \"description\": \"Reimbursement for travel expenses\",\n    \"date_submitted\": \"2024-12-01\"\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 success
require 'uri'
require 'net/http'

url = URI("https://api.letsdeel.com/rest/contracts/abcdefg/off-cycle-payments")

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    \"amount\": 500,\n    \"description\": \"Reimbursement for travel expenses\",\n    \"date_submitted\": \"2024-12-01\"\n  }\n}"

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

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

HttpResponse<String> response = Unirest.post("https://api.letsdeel.com/rest/contracts/abcdefg/off-cycle-payments")
  .header("Authorization", "Bearer <token>")
  .header("Content-Type", "application/json")
  .body("{\n  \"data\": {\n    \"amount\": 500,\n    \"description\": \"Reimbursement for travel expenses\",\n    \"date_submitted\": \"2024-12-01\"\n  }\n}")
  .asString();
```

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

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.letsdeel.com/rest/contracts/abcdefg/off-cycle-payments', [
  'body' => '{
  "data": {
    "amount": 500,
    "description": "Reimbursement for travel expenses",
    "date_submitted": "2024-12-01"
  }
}',
  'headers' => [
    'Authorization' => 'Bearer <token>',
    'Content-Type' => 'application/json',
  ],
]);

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

```csharp success
using RestSharp;

var client = new RestClient("https://api.letsdeel.com/rest/contracts/abcdefg/off-cycle-payments");
var request = new RestRequest(Method.POST);
request.AddHeader("Authorization", "Bearer <token>");
request.AddHeader("Content-Type", "application/json");
request.AddParameter("application/json", "{\n  \"data\": {\n    \"amount\": 500,\n    \"description\": \"Reimbursement for travel expenses\",\n    \"date_submitted\": \"2024-12-01\"\n  }\n}", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
```

```swift success
import Foundation

let headers = [
  "Authorization": "Bearer <token>",
  "Content-Type": "application/json"
]
let parameters = ["data": [
    "amount": 500,
    "description": "Reimbursement for travel expenses",
    "date_submitted": "2024-12-01"
  ]] as [String : Any]

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

let request = NSMutableURLRequest(url: NSURL(string: "https://api.letsdeel.com/rest/contracts/abcdefg/off-cycle-payments")! 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()
```