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

# List IT seats

GET https://api.letsdeel.com/rest/it/seats

Use this endpoint to let HRIS and finance automations audit which worker holds each IT seat and reconcile seat usage, instead of checking the seat list manually in the Deel IT UI. Only available to organizations on a per-seat plan.

 **Token scopes**: `it-seats:read`

 **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 2026-12-25.

Reference: https://developer.deel.com/api/reference/endpoints/it-seats/list-it-seats-v-2026-09-25

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

### Query parameters

- `cursor` (string, optional) — Indicates where the next page of results starts, as returned in a paginated list response
- `limit` (integer, optional, default: 20) — Return a page of results with given number of records
- `status` (list of enum, optional) — Filter seats by their status — repeat the key for OR semantics. Omit to include seats of any status.
  - Allowed values: `ACTIVE`, `ASSIGNED`, `INACTIVE`, `PENDING_APPROVAL`
- `hris_profile_id` (list of string, optional) — Filter seats by the HRIS profile holding them — repeat the key for OR semantics. Ids not found in your organization match nothing. Omit to include seats of any worker.

### Headers

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

## Response

### 200

OK

- `data` (list of ItSeatsGetResponsesContentApplicationJsonSchemaDataItems, required)
- `has_more` (boolean, required) — Whether there are more results available
- `next_cursor` (string, required, nullable) — Cursor to the next page
- `total_count` (long, required) — Total number of records

## Errors

### 400 Bad Request Error

Bad Request

- `errors` (list of ItSeatsGetResponsesContentApplicationJsonSchemaErrorsItems, required)

### 401 Unauthorized Error

Unauthorized

- `errors` (list of ItSeatsGetResponsesContentApplicationJsonSchemaErrorsItems, required)

### 403 Forbidden Error

Forbidden

- `errors` (list of ItSeatsGetResponsesContentApplicationJsonSchemaErrorsItems, required)

### 404 Not Found Error

Not Found

- `errors` (list of ItSeatsGetResponsesContentApplicationJsonSchemaErrorsItems, required)

### 409 Conflict Error

Conflict

- `errors` (list of ItSeatsGetResponsesContentApplicationJsonSchemaErrorsItems, required)

### 500 Internal Server Error

Internal Server Error

- `errors` (list of ItSeatsGetResponsesContentApplicationJsonSchemaErrorsItems, required)

## Types

### ItSeatsGetResponsesContentApplicationJsonSchemaDataItems

- `id` (string, required) — Unique identifier of the seat.
- `status` (enum, required) — Current status of the seat.
  - Allowed values: `ACTIVE`, `ASSIGNED`, `INACTIVE`, `PENDING_APPROVAL`
- `active_on` (string, required, nullable) — Day the seat's paid features started being used. `null` while the seat is not in use.
- `created_at` (string, required) — When the seat was created.
- `assigned_at` (string, required, nullable) — When the seat was given to its worker. `null` when the seat has never been assigned.
- `declined_at` (string, required, nullable) — When the worker declined the seat. `null` unless the worker declined it.
- `deactivated_on` (string, required, nullable) — Day the seat was released. `null` while the seat is still held.
- `assigned_hris_profile` (ItSeatsGetResponsesContentApplicationJsonSchemaDataItemsAssignedHrisProfile, required, nullable) — Worker holding the seat. `null` when the seat is free or its worker has no Deel HRIS profile.

### ItSeatsGetResponsesContentApplicationJsonSchemaErrorsItems

- `code` (string, required) — Error code of the handler which produced the returned error
- `field` (string, required, nullable) — The field name where input validation failed
- `message` (string, required) — Description of the returned error

### ItSeatsGetResponsesContentApplicationJsonSchemaDataItemsAssignedHrisProfile

Worker holding the seat. `null` when the seat is free or its worker has no Deel HRIS profile.

- `emails` (list of string, required) — Array of user email addresses
- `last_name` (string, required) — Last name of the user
- `first_name` (string, required) — First name of the user
- `hris_profile_id` (string, required) — The unique identifier of the HRIS profile of the assigned user

## Examples

**Response**

```json
{
  "data": [
    {
      "id": "3b1a0000-0000-0000-0000-000000000000",
      "status": "ASSIGNED",
      "active_on": "2026-01-20",
      "created_at": "2026-01-15T09:00:00Z",
      "assigned_at": "2026-01-15T09:00:00Z",
      "declined_at": "2026-01-18T14:30:00Z",
      "deactivated_on": "2026-06-30",
      "assigned_hris_profile": {
        "emails": [
          "bruce.wayne@wayne-enterprise.com",
          "batman@gotham.com"
        ],
        "last_name": "Wayne",
        "first_name": "Bruce",
        "hris_profile_id": "550e8400-e29b-41d4-a716-446655440000"
      }
    }
  ],
  "has_more": true,
  "next_cursor": "d3m0d3m0d3m0d3m0d3m0d3m0d3m0d3m0d3m0d3m",
  "total_count": 133
}
```

**SDK Code**

```python
import requests

url = "https://api.letsdeel.com/rest/it/seats"

querystring = {"cursor":"d3m0d3m0d3m0d3m0d3m0d3m0d3m0d3m0d3m0d3m","hris_profile_id":"[\"6ad9f0f0-6e2a-4f9a-a3f8-2a9f5f2d6b71\"]","limit":"20","status":"[\"ASSIGNED\"]"}

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

response = requests.get(url, headers=headers, params=querystring)

print(response.json())
```

```javascript
const url = 'https://api.letsdeel.com/rest/it/seats?cursor=d3m0d3m0d3m0d3m0d3m0d3m0d3m0d3m0d3m0d3m&hris_profile_id=%5B%226ad9f0f0-6e2a-4f9a-a3f8-2a9f5f2d6b71%22%5D&limit=20&status=%5B%22ASSIGNED%22%5D';
const options = {method: 'GET', 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/it/seats?cursor=d3m0d3m0d3m0d3m0d3m0d3m0d3m0d3m0d3m0d3m&hris_profile_id=%5B%226ad9f0f0-6e2a-4f9a-a3f8-2a9f5f2d6b71%22%5D&limit=20&status=%5B%22ASSIGNED%22%5D"

	req, _ := http.NewRequest("GET", 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/it/seats?cursor=d3m0d3m0d3m0d3m0d3m0d3m0d3m0d3m0d3m0d3m&hris_profile_id=%5B%226ad9f0f0-6e2a-4f9a-a3f8-2a9f5f2d6b71%22%5D&limit=20&status=%5B%22ASSIGNED%22%5D")

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

request = Net::HTTP::Get.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.get("https://api.letsdeel.com/rest/it/seats?cursor=d3m0d3m0d3m0d3m0d3m0d3m0d3m0d3m0d3m0d3m&hris_profile_id=%5B%226ad9f0f0-6e2a-4f9a-a3f8-2a9f5f2d6b71%22%5D&limit=20&status=%5B%22ASSIGNED%22%5D")
  .header("X-Beta", "true")
  .header("Authorization", "Bearer <token>")
  .asString();
```

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

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.letsdeel.com/rest/it/seats?cursor=d3m0d3m0d3m0d3m0d3m0d3m0d3m0d3m0d3m0d3m&hris_profile_id=%5B%226ad9f0f0-6e2a-4f9a-a3f8-2a9f5f2d6b71%22%5D&limit=20&status=%5B%22ASSIGNED%22%5D', [
  'headers' => [
    'Authorization' => 'Bearer <token>',
    'X-Beta' => 'true',
  ],
]);

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

```csharp
using RestSharp;

var client = new RestClient("https://api.letsdeel.com/rest/it/seats?cursor=d3m0d3m0d3m0d3m0d3m0d3m0d3m0d3m0d3m0d3m&hris_profile_id=%5B%226ad9f0f0-6e2a-4f9a-a3f8-2a9f5f2d6b71%22%5D&limit=20&status=%5B%22ASSIGNED%22%5D");
var request = new RestRequest(Method.GET);
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/it/seats?cursor=d3m0d3m0d3m0d3m0d3m0d3m0d3m0d3m0d3m0d3m&hris_profile_id=%5B%226ad9f0f0-6e2a-4f9a-a3f8-2a9f5f2d6b71%22%5D&limit=20&status=%5B%22ASSIGNED%22%5D")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "GET"
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()
```