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

# Ordering new equipment for a worker

> Order new equipment from the Deel IT catalog and ship it to a worker.

When a new hire joins your organization, or an existing worker needs a device, IT needs to get them the right equipment. With the Deel IT Public API you can reproduce the Deel IT ordering flow from your own onboarding or procurement workflow: browse the catalog, pick a product variant, then place an order for the worker.

In the Deel app, the same flow happens under **Equipment > Orders > Create Order**.

> **Some endpoints in this guide are in Beta**
>
> The `GET /rest/it/orders/{order_id}` endpoint is stable. Other Deel IT endpoints in this guide are in Beta, require the `X-Beta: true` header, and may have changes to their request and response shapes. The examples below include the header where it is required. See [API versioning](/api/api-versioning) for details on endpoint lifecycle states.

> **Other ways to equip a worker**
>
> You can also equip a worker by shipping a device from your own inventory, or by reassigning a stored rental. See [Sending your equipment to a worker](/api/deel-it/use-cases/equipping-a-worker) for those two paths.

## Prerequisites

#### A Deel account with Deel IT enabled

Your organization must be onboarded to Deel IT. See [Getting Started with Deel IT](https://help.letsdeel.com/hc/en-gb/articles/28400594460305-Getting-Started-with-Deel-IT) for the account setup steps.

#### An API token with the required scopes

Four scopes cover the full flow:

* `people:read` to resolve a worker to an `hris_profile_id`.
* `it-products:read` to browse the catalog and read product variants.
* `it-orders:write` to place the order.
* `it-orders:read` to track the order.

#### A worker with a Human Resource Information System (HRIS) profile

The order is placed for a worker's HRIS profile. For workers without an active Deel contract, the profile must include first name, last name, group, country of residence, and email address.

#### A full delivery address for the worker

Every order ends in a shipment. Collect the full address the equipment ships to. See [Delivery Coverage, Delivery Times, and Express Shipping](https://help.letsdeel.com/hc/en-gb/articles/28246305093393-Delivery-Coverage-Delivery-Times-and-Express-Shipping-Deel-IT) for the countries Deel logistics operates in and available service tiers.

## Resolve the worker's HRIS profile

The Deel IT Public API identifies people by `hris_profile_id`. If your workflow does not already have it, look it up via the [List people](/api/reference/endpoints/people/get-people) endpoint on the Deel core Public API.

```bash
curl --request GET 'https://api.letsdeel.com/rest/people?search=Nina%20Doe' \
  --header 'Authorization: Bearer YOUR_API_TOKEN'
```

**Example response:**

```json focus={4}
{
  "data": [
    {
      "id": "9b9fc43a-a90c-4615-ac50-baf1e314b53e",
      "first_name": "Nina",
      "last_name": "Doe",
      "full_name": "Nina Doe",
      "emails": [
        {
          "type": "work",
          "value": "nina.doe@example.com"
        }
      ],
      "job_title": "Product Manager",
      "department": {
        "id": "5f8a2c1e-3b47-4e89-9f2c-8d1e3a4b5c6f",
        "name": "Product"
      },
      "hiring_status": "onboarding"
    }
  ]
}
```

Searching by name is one way to find the worker; use whichever filter fits your system. `search` matches on name, so confirm the match against `emails[].value` in your own code. The `id` field is the person's `hris_profile_id`. The rest of the workflow uses it as `destination.hris_profile_id` in the order request.

## Query the catalog

List the products available in the Deel IT catalog, filtered by the worker's delivery country and any other criteria. This is the equivalent of choosing from the available devices for the worker's country in the Deel app. Requires the `it-products:read` scope. See the [List products in the catalog](/api/deel-it/endpoints/it-products/list-it-products-v-2026-09-17) reference.

```bash
curl --request GET 'https://api.letsdeel.com/rest/it/products?country=GB&category=LAPTOP&acquisition_types=RENTAL&limit=20' \
  --header 'Authorization: Bearer YOUR_API_TOKEN' \
  --header 'X-Beta: true'
```

Use the query parameters to narrow the catalog:

* `country`: ISO 3166 alpha-2 country code. Restricts results to products whose variants ship to this country.
* `category`: Filter by one product category, such as `LAPTOP` or `MONITOR`.
* `acquisition_types`: Restrict results to products offering at least one of `PURCHASE`, `RENTAL`, or `REUSE`.
* `stock_condition`: `NEW` or `REFURBISHED`.
* `brands`, `operating_systems`, `keyboard_layouts`: Filter by manufacturer, operating system, or keyboard layout. Repeat a parameter for OR semantics.
* `search`: Case-insensitive match on product name or brand.
* `it_policy_ids`: Restrict results to products approved by these IT policies, to see what workers on those policies can order.

**Example response:**

```json focus={4,16-17}
{
  "data": [
    {
      "id": "8e9a2b4c-1d5f-4c3e-9b7a-2f6d8c1e4a5b",
      "name": "MacBook Pro 16",
      "brand": "Apple",
      "images": [
        {
          "id": "b1c3d5e7-8a9b-4c2d-9e0f-1a2b3c4d5e6f",
          "url": "https://cdn.deel.com/products/mbp16-space-black.png"
        }
      ],
      "category": "LAPTOP"
    }
  ],
  "has_more": true,
  "next_cursor": "eyJvZmZzZXQiOjIwLCJsaW1pdCI6MjB9",
  "total_count": 133
}
```

The response returns product metadata only: no variants, pricing, taxes, fees, or contract settings. Pick a product and use its `id` in the next step.

When `has_more` is `true`, pass the `next_cursor` value as the `cursor` query parameter on the next request to page through the rest of the catalog.

## Choose a variant and addons

Retrieve the product to see its variants and the addons you can attach to it. Pass the same `country` to restrict the variants to those that ship to the worker. Requires the `it-products:read` scope. See the [Retrieve a product's catalog details](/api/deel-it/endpoints/it-products/retrieve-an-it-product-v-2026-09-17) reference.

```bash
curl --request GET 'https://api.letsdeel.com/rest/it/products/8e9a2b4c-1d5f-4c3e-9b7a-2f6d8c1e4a5b?country=GB' \
  --header 'Authorization: Bearer YOUR_API_TOKEN' \
  --header 'X-Beta: true'
```

**Example response:**

```json focus={17,28-29,35,37,41,43}
{
  "data": {
    "id": "8e9a2b4c-1d5f-4c3e-9b7a-2f6d8c1e4a5b",
    "public_id": "PRD-8E9A2B4C",
    "name": "MacBook Pro 16",
    "brand": "Apple",
    "category": "LAPTOP",
    "description": "16-inch MacBook Pro with Apple M4 Pro chip.",
    "images": [
      {
        "id": "b1c3d5e7-8a9b-4c2d-9e0f-1a2b3c4d5e6f",
        "url": "https://cdn.deel.com/products/mbp16-space-black.png"
      }
    ],
    "variants": [
      {
        "id": "2f4e7ab1-9d3c-4b1f-9e34-6dfb0d6a12ab",
        "public_id": "VAR-2F4E7AB1",
        "sku": "MX2T3B/A",
        "size": null,
        "style": "Space Black",
        "operating_system": "MACOS",
        "keyboard_layout": "UK_ENGLISH_QWERTY",
        "image": {
          "id": "b1c3d5e7-8a9b-4c2d-9e0f-1a2b3c4d5e6f",
          "url": "https://cdn.deel.com/products/mbp16-space-black.png"
        },
        "allowed_acquisition_types": ["PURCHASE", "RENTAL"],
        "allowed_rental_terms": ["MONTH_12", "MONTH_24"],
        "available_countries": ["GB"]
      }
    ],
    "available_addons": [
      {
        "id": "5c1a7d3e-8b2f-4a6c-9e1d-3f5b7a8c9d0e",
        "name": "Device Management",
        "type": "SERVICE",
        "is_premium": false
      },
      {
        "id": "7d2b8e4f-9c3a-4b7d-8f2e-4a6c8b9d0e1f",
        "name": "Accidental Damage Protection",
        "type": "WARRANTY",
        "is_premium": true
      }
    ],
    "product_hardware_spec": {
      "product_category": "LAPTOP",
      "processor": "Apple M4 Pro",
      "memory_gb": 24,
      "storage_gb": 512,
      "storage_type": "SSD",
      "display_size": "16",
      "has_hdmi_port": true,
      "has_display_port": false,
      "has_usb_c_video_input": false,
      "usb_c_connections": 3
    }
  }
}
```

Pick the variant whose specifications match what the worker needs. Its `id` is the `variant_id` you pass in the order. Check `allowed_acquisition_types` and `allowed_rental_terms` to see which contract settings the variant supports. Each entry in `available_addons` has an `id` you can pass as an `addon_id` in the order, and a `type` of `SERVICE` or `WARRANTY`. You can attach at most one of each.

## Place the order

Create the order for the worker. The order is created pre-approved, so it does not wait on an approval step. Requires the `it-orders:write` scope. See the [Create an IT order](/api/deel-it/endpoints/it-orders/create-it-order-v-2026-09-17) reference.

> **Warning**
>
> Placing the order commits your organization to the equipment, addons, and fees shown in `pricing_details`. You can cancel the order only before its shipment is prepared.

Set `destination.assign_to` to `USER` and identify the worker with `destination.hris_profile_id`. For each device, pass the `variant_id` and its `contract_setting`:

* `acquisition_type`: `PURCHASE`, `RENTAL`, or `REUSE`.
* `rental_term`: `MONTH_12` or `MONTH_24`. Required for rentals, ignored otherwise.
* `payment_schema`: `MONTHLY` or `UPFRONT`. Required for rentals, ignored for purchases, which are always paid upfront.
* `addons`: Required. Pass an empty array when you do not attach any addons. Each variant takes at most two addons: one service and one warranty. Each addon can also take its own `payment_schema` and, for service addons only, a `duration_months`.

```bash
curl --request POST 'https://api.letsdeel.com/rest/it/orders' \
  --header 'Authorization: Bearer YOUR_API_TOKEN' \
  --header 'Content-Type: application/json' \
  --header 'X-Beta: true' \
  --data '{
    "data": {
      "variants": [
        {
          "variant_id": "2f4e7ab1-9d3c-4b1f-9e34-6dfb0d6a12ab",
          "contract_setting": {
            "acquisition_type": "RENTAL",
            "rental_term": "MONTH_12",
            "payment_schema": "MONTHLY",
            "addons": [
              {
                "addon_id": "5c1a7d3e-8b2f-4a6c-9e1d-3f5b7a8c9d0e",
                "payment_schema": "MONTHLY",
                "duration_months": 12
              }
            ]
          }
        }
      ],
      "destination": {
        "assign_to": "USER",
        "hris_profile_id": "9b9fc43a-a90c-4615-ac50-baf1e314b53e",
        "delivery_address": {
          "line1": "10 Onboarding Street",
          "line2": "Floor 2",
          "city": "London",
          "state": "England",
          "post_code": "EC1A 1BB",
          "country": "GB",
          "phone_number": "+447700900123"
        }
      },
      "is_express_delivery_requested": false
    }
  }'
```

Provide the full delivery address in `destination.delivery_address`: `line1`, `line2`, `city`, `state`, `post_code`, and `country`, plus `phone_number` and `delivery_instructions` where needed. The schema only requires `country`, but the order needs a full valid address to ship.

`is_express_delivery_requested` is required. Set it to `true` to request express shipping, or `false` otherwise. Shipping costs and delivery times vary by country and by express shipping availability.

**Example response:**

```json focus={3,5,18-19}
{
  "data": {
    "id": "3b7e1c9a-4f2d-4e68-a1b5-9c0d2e7f8a43",
    "public_id": "ORD-3B7E1C9A",
    "status": "APPROVED",
    "created_at": "2026-10-12T09:49:01.000Z",
    "updated_at": "2026-10-12T09:49:01.000Z",
    "user": {
      "hris_profile_id": "9b9fc43a-a90c-4615-ac50-baf1e314b53e",
      "first_name": "Nina",
      "last_name": "Doe",
      "emails": ["nina.doe@example.com"]
    },
    "order_items": [
      {
        "id": "d4a8f2b6-1c3e-4795-8b0a-6e2f9d1c7a35",
        "created_at": "2026-10-12T09:49:01.000Z",
        "status": "PROCESSING",
        "is_approved": true,
        "is_express_delivery_requested": false,
        "product": {
          "id": "8e9a2b4c-1d5f-4c3e-9b7a-2f6d8c1e4a5b",
          "name": "MacBook Pro 16",
          "brand": "Apple",
          "category": "LAPTOP"
        },
        "pricing_details": {
          "acquisition_type": "RENTAL",
          "asset_price": {
            "amount": "1999.99",
            "currency": "GBP"
          },
          "storefront_fee": {
            "amount": "40.00",
            "currency": "GBP"
          }
        }
      }
    ],
    "delivery_address": {
      "id": "e8b5d0a3-72c9-4a14-9f6e-3d1c8b40a257",
      "type": "DELIVERY",
      "line1": "10 Onboarding Street",
      "line2": "Floor 2",
      "city": "London",
      "state": "England",
      "post_code": "EC1A 1BB",
      "country": "GB",
      "phone_number": "+447700900123",
      "delivery_instructions": null,
      "date_of_birth": null,
      "tax_id_number": null,
      "passport_number": null,
      "is_valid": true
    }
  }
}
```

The `id` is the `order_id` you use to track the order in the next step. A `201 Created` response confirms the order was created, not that the device has been delivered.

## Track the order to delivery

Fulfillment happens asynchronously. Track the order through to delivery by polling or by subscribing to webhooks.

### Polling for the terminal state

Poll [`GET /rest/it/orders/{order_id}`](/api/deel-it/endpoints/it-orders/retrieve-an-it-order-v-2026-01-01) and watch the order `status` and each item's `status` in `order_items`. Requires the `it-orders:read` scope.

```bash
curl --request GET 'https://api.letsdeel.com/rest/it/orders/3b7e1c9a-4f2d-4e68-a1b5-9c0d2e7f8a43' \
  --header 'Authorization: Bearer YOUR_API_TOKEN'
```

The response has the same shape as the Create an IT order response, and also includes the worker's `address` under `user`. Item statuses only move forward, in this order: `PLACED`, `PROCESSING`, `AWAITING_PAYMENT`, `READY_TO_SHIP`, `SHIPPED`, `COMPLETED`. An item can also move to `CANCELLED`. Use this endpoint to check the delivery status of a specific worker's device.

### React to a webhook instead

If you would rather not poll, subscribe to the `it-order.created` and `it-order.updated` events. The `it-order.updated` payload reflects the order's current state each time it changes. Filter incoming events on the order `id` you created, and check `status` and each item's `status` in `order_items`.

**Example `it-order.updated` payload:**

```json focus={11,13,37}
{
  "data": {
    "meta": {
      "event_type": "it-order.updated",
      "event_type_id": "5dbb2bee-b647-4aa2-b979-1d646474d0ff",
      "organization_id": "54723d17-f023-4576-9a7c-1750cad66e76",
      "organization_name": "Acme Corporation",
      "tracking_id": "d09a72b0002191b65de3a453d177f1a7"
    },
    "resource": {
      "id": "3b7e1c9a-4f2d-4e68-a1b5-9c0d2e7f8a43",
      "public_id": "ORD-3B7E1C9A",
      "status": "APPROVED",
      "created_at": "2026-10-12T09:49:01.000Z",
      "updated_at": "2026-10-14T16:12:44.000Z",
      "user": {
        "hris_profile_id": "9b9fc43a-a90c-4615-ac50-baf1e314b53e",
        "first_name": "Nina",
        "last_name": "Doe",
        "emails": ["nina.doe@example.com"]
      },
      "order_items": [
        {
          "is_approved": true,
          "is_express_delivery_requested": false,
          "product": {
            "id": "8e9a2b4c-1d5f-4c3e-9b7a-2f6d8c1e4a5b",
            "name": "MacBook Pro 16",
            "brand": "Apple",
            "category": "LAPTOP"
          },
          "pricing_details": {
            "acquisition_type": "RENTAL",
            "asset_price": { "amount": "1999.99", "currency": "GBP" },
            "storefront_fee": { "amount": "40.00", "currency": "GBP" }
          },
          "status": "SHIPPED"
        }
      ]
    }
  },
  "timestamp": "2026-10-14T16:12:44.360Z"
}
```

See [Webhooks](/api/webhooks/introduction) for how to register an endpoint and verify signatures, and [Discovering available events](/api/webhooks/events) for the full event catalog.

To cancel an order before its shipment is prepared, see the [Cancel an IT order](/api/deel-it/endpoints/it-orders/cancel-it-order-v-2026-09-15) reference.

## Example automated flow

If you are building this as an automated service, here is one example of how the steps can be sequenced end to end. The API does not prescribe any particular order, so you can adapt or reorder these steps to fit your own policy.

#### Resolve the HRIS profile

Look up or receive the worker's `hris_profile_id`.

#### Query the catalog

Call `GET /rest/it/products?country={country}&category={category}` to see which products are available for the worker's country.

#### Choose a variant

Call `GET /rest/it/products/{product_id}?country={country}` and apply your own selection logic to pick a variant and any addons.

#### Place the order

Call `POST /rest/it/orders` with the selected `variant_id`, its `contract_setting`, and the worker's `hris_profile_id`.

#### Track the order

Watch the order status, either by polling `GET /rest/it/orders/{order_id}` or by subscribing to `it-order.updated`, then mark the task complete in your internal system.