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

# Delete a shift

DELETE https://api.letsdeel.com/rest/time-tracking/shifts/{shift_id}

Removes a shift that should not have been recorded, before payroll closes its period. This action is irreversible.

 **Token scopes**: `time-tracking:write`, `worker:write`

 **Beta**: this version requires the `X-Beta: true` request header and its contract may change before it is promoted to stable. It is scheduled to become stable on 2027-02-13.

Reference: https://developer.deel.com/api/reference/endpoints/time-tracking-shifts/delete-shift-v-2026-11-13

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

- `shift_id` (string, required) — Deel ID of the shift, as returned in the shift's id field.

### Headers

- `X-Beta` (enum, required, default: true) — Opts in to the beta version of this endpoint. Must be `true`.
  - Allowed values: `true`

## Response

### 204

Shift deleted. No body.

## Errors

### 400 Bad Request Error

Operation failed.

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

### 401 Unauthorized Error

The token is missing, invalid, inactive or revoked (INVALID_TOKEN, TOKEN_INACTIVE, TOKEN_REVOKED or UNAUTHORIZED).

- `errors` (list of TimeTrackingShiftsShiftIdDeleteResponsesContentApplicationJsonSchemaErrorsItems, required) — Every problem found, not only the first.

### 403 Forbidden Error

INSUFFICIENT_SCOPES. The token lacks the scope this endpoint needs.

- `errors` (list of TimeTrackingShiftsShiftIdDeleteResponsesContentApplicationJsonSchemaErrorsItems, required) — Every problem found, not only the first.

### 404 Not Found Error

SHIFT_NOT_FOUND. No such shift in the caller's organization, it was deleted, or a worker token asked for another worker's shift.

- `errors` (list of TimeTrackingShiftsShiftIdDeleteResponsesContentApplicationJsonSchemaErrorsItems, required) — Every problem found, not only the first.

### 409 Conflict Error

SHIFT_LOCKED. The shift cannot change; details.reason is PAYROLL_LOCKED or FILE_UPLOAD_SHIFT. It has no details.reason when the policy refuses the change (the contract takes no shift changes from the caller, such as when the policy does not let the organization act on the worker's behalf) or when the lock could not be checked.

- `errors` (list of TimeTrackingShiftsShiftIdDeleteResponsesContentApplicationJsonSchemaErrorsItems, required) — Every problem found, not only the first.

### 422 Unprocessable Entity Error

CONTRACT_TYPE_NOT_SUPPORTED. This API cannot yet delete shifts on the contract's type.

- `errors` (list of TimeTrackingShiftsShiftIdDeleteResponsesContentApplicationJsonSchemaErrorsItems, required) — Every problem found, not only the first.

### 429 Too Many Requests Error

RATE_LIMITED. Over 5 requests per second for the organization.

- `errors` (list of TimeTrackingShiftsShiftIdDeleteResponsesContentApplicationJsonSchemaErrorsItems, required) — Every problem found, not only the first.

### 500 Internal Server Error

INTERNAL_ERROR. Unexpected failure; safe to retry.

- `errors` (list of TimeTrackingShiftsShiftIdDeleteResponsesContentApplicationJsonSchemaErrorsItems, required) — Every problem found, not only the first.

## Types

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

### TimeTrackingShiftsShiftIdDeleteResponsesContentApplicationJsonSchemaErrorsItems

One problem with the request.

- `code` (string, required) — Stable machine-readable error code.
- `message` (string, required) — Human-readable explanation. May change; do not parse it.
- `field` (string, optional) — Request field the error refers to, when there is one.
- `details` (map from string to any, optional) — Extra data for the error code, such as the reason a shift is locked.

## Examples

**SDK Code**

```python
import requests

url = "https://api.letsdeel.com/rest/time-tracking/shifts/9d2e4f6a-1b3c-4d5e-8f7a-2b4c6d8e0f1a"

headers = {
    "X-Beta": "true",
    "Authorization": "Bearer <token>"
}

response = requests.delete(url, headers=headers)

print(response.json())
```

```javascript
const url = 'https://api.letsdeel.com/rest/time-tracking/shifts/9d2e4f6a-1b3c-4d5e-8f7a-2b4c6d8e0f1a';
const options = {method: 'DELETE', headers: {'X-Beta': 'true', Authorization: 'Bearer <token>'}};

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"
	"net/http"
	"io"
)

func main() {

	url := "https://api.letsdeel.com/rest/time-tracking/shifts/9d2e4f6a-1b3c-4d5e-8f7a-2b4c6d8e0f1a"

	req, _ := http.NewRequest("DELETE", url, nil)

	req.Header.Add("X-Beta", "true")
	req.Header.Add("Authorization", "Bearer <token>")

	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/time-tracking/shifts/9d2e4f6a-1b3c-4d5e-8f7a-2b4c6d8e0f1a")

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

request = Net::HTTP::Delete.new(url)
request["X-Beta"] = 'true'
request["Authorization"] = 'Bearer <token>'

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.delete("https://api.letsdeel.com/rest/time-tracking/shifts/9d2e4f6a-1b3c-4d5e-8f7a-2b4c6d8e0f1a")
  .header("X-Beta", "true")
  .header("Authorization", "Bearer <token>")
  .asString();
```

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

$client = new \GuzzleHttp\Client();

$response = $client->request('DELETE', 'https://api.letsdeel.com/rest/time-tracking/shifts/9d2e4f6a-1b3c-4d5e-8f7a-2b4c6d8e0f1a', [
  'headers' => [
    'Authorization' => 'Bearer <token>',
    'X-Beta' => 'true',
  ],
]);

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

```csharp
using RestSharp;

var client = new RestClient("https://api.letsdeel.com/rest/time-tracking/shifts/9d2e4f6a-1b3c-4d5e-8f7a-2b4c6d8e0f1a");
var request = new RestRequest(Method.DELETE);
request.AddHeader("X-Beta", "true");
request.AddHeader("Authorization", "Bearer <token>");
IRestResponse response = client.Execute(request);
```

```swift
import Foundation

let headers = [
  "X-Beta": "true",
  "Authorization": "Bearer <token>"
]

let request = NSMutableURLRequest(url: NSURL(string: "https://api.letsdeel.com/rest/time-tracking/shifts/9d2e4f6a-1b3c-4d5e-8f7a-2b4c6d8e0f1a")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "DELETE"
request.allHTTPHeaderFields = headers

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()
```