> ## Documentation Index
> Fetch the complete documentation index at: https://developers.criteo.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Store Inventory

export const EndpointBadge = ({method = "GET", children}) => {
  const METHOD_STYLES = {
    GET: {
      bg: "mint-bg-[#2AB673]"
    },
    POST: {
      bg: "mint-bg-[#3064E3]"
    },
    PUT: {
      bg: "mint-bg-[#C28C30]"
    },
    PATCH: {
      bg: "mint-bg-[#DA622B]"
    },
    DELETE: {
      bg: "mint-bg-[#CB3A32]"
    },
    API: {
      bg: "mint-bg-black"
    }
  };
  const key = method.toUpperCase();
  const styles = METHOD_STYLES[key] ?? METHOD_STYLES.API;
  return <div className="relative mt-7">
      <span className={`absolute -top-2 -left-2 z-10 ${styles.bg} text-white px-2.5 py-0.5 rounded-full text-xs font-bold tracking-wide`}>
        {key}
      </span>
      {children}
    </div>;
};

## Introduction

**Store Inventory** enables retailers to manage product availability and pricing at the store level, supporting accurate PDP/ad experiences. Inventory events (upserts and deletes) are sent in batches, enabling real-time updates for price and availability per store.

This API is **event-driven** and **multi-tenant**.

<Info>
  You can also find the Store Inventory endpoints in our API Reference [here](/retail-media/v2026-preview/reference/catalog/upsert-store-inventory-per-merchant-id) for `upsert`, and [here](/retail-media/v2026-preview/reference/catalog/delete-store-inventory-per-merchant-id) for `delete`.
</Info>

***

## URLs

* For AMERICAS: [api.us.criteo.com](https://api.us.criteo.com)
* For APAC: [api.as.criteo.com](https://api.as.criteo.com)
* For EMEA: [api.eu.criteo.com](https://api.eu.criteo.com)

***

## Endpoints

<table>
  <thead>
    <tr>
      <th>
        <p>
          Verb
        </p>
      </th>

      <th>
        <p>
          Endpoint
        </p>
      </th>

      <th>
        <p>
          Description
        </p>
      </th>
    </tr>
  </thead>

  <tbody>
    <tr>
      <td>
        <p>
          POST
        </p>
      </td>

      <td>
        <p>
          <code>
            /\{version}/catalog/merchants/\{merchantId}/store-inventory/upsert
          </code>
        </p>
      </td>

      <td>
        <p>
          Insert or update store(s)
        </p>
      </td>
    </tr>

    <tr>
      <td>
        <p>
          POST
        </p>
      </td>

      <td>
        <p>
          <code>
            /\{version}/catalog/merchants/\{merchantId}/store-inventory/delete
          </code>
        </p>
      </td>

      <td>
        <p>
          Delete store(s)
        </p>
      </td>
    </tr>
  </tbody>
</table>

***

## Store Inventory Attributes

<table>
  <thead>
    <tr>
      <th>
        <p>
          Attribute
        </p>
      </th>

      <th>
        <p>
          Data Type
        </p>
      </th>

      <th>
        <p>
          Description
        </p>
      </th>
    </tr>
  </thead>

  <tbody>
    <tr>
      <td>
        <p>
          <code>
            merchantId
          </code>

          <span>\*</span>
        </p>
      </td>

      <td>
        <p>
          integer
        </p>
      </td>

      <td>
        <p>
          The ID of the managing account.
        </p>

        <p>
          Criteo: the

          <code>
            partnerId
          </code>
        </p>

        <p>
          Accepted values: integer (int32)
        </p>

        <p>
          Writeable? N / Nullable? N
        </p>
      </td>
    </tr>

    <tr>
      <td>
        <p>
          <code>
            batchId
          </code>

          <span>\*</span>
        </p>
      </td>

      <td>
        <p>
          String
        </p>
      </td>

      <td>
        <p>
          Identifies this event. Should be unique for a given endpoint call.
        </p>

        <p>
          Writeable? Y / Nullable? N
        </p>
      </td>
    </tr>

    <tr>
      <td>
        <p>
          <code>
            productId
          </code>

          <span>\*</span>
        </p>
      </td>

      <td>
        <p>
          String
        </p>
      </td>

      <td>
        <p>
          Identifies a product
        </p>

        <p>
          Accepted values: up to 50 chars string
        </p>

        <p>
          Writeable? Y / Nullable? N
        </p>
      </td>
    </tr>

    <tr>
      <td>
        <p>
          <code>
            storeId
          </code>

          <span>\*</span>
        </p>
      </td>

      <td>
        <p>
          String
        </p>
      </td>

      <td>
        <p>
          Identifies the store for the customer.
        </p>

        <p>
          Accepted values: up to 64 chars string
        </p>

        <p>
          Writeable? Y / Nullable? N
        </p>
      </td>
    </tr>

    <tr>
      <td>
        <p>
          <code>
            availability
          </code>

          <span>\*</span>
        </p>
      </td>

      <td>
        <p>
          String
        </p>
      </td>

      <td>
        <p>
          Accepted values: In stock, Out of stock, Preorder, Backorder
        </p>

        <p>
          Writeable? Y / Nullable? N
        </p>
      </td>
    </tr>

    <tr>
      <td>
        <p>
          <code>
            price
          </code>

          <span>\*</span>
        </p>
      </td>

      <td>
        <p>
          String
        </p>
      </td>

      <td>
        <p>
          Product’s price at this store
        </p>

        <p>
          Accepted values: up to 14 chars string
        </p>

        <p>
          Writeable? Y / Nullable? N
        </p>
      </td>
    </tr>

    <tr>
      <td>
        <p>
          <code>
            salePrice
          </code>
        </p>
      </td>

      <td>
        <p>
          String
        </p>
      </td>

      <td>
        <p>
          The sale price of the product
        </p>

        <p>
          Accepted values: up to 14 chars string
        </p>

        <p>
          Writeable? Y / Nullable? Y
        </p>
      </td>
    </tr>
  </tbody>
</table>

(\*) Required

<Info>
  **Field Definitions**

  * **Writeable (Y/N)**: Indicates if the field can be modified in requests.
  * **Nullable (Y/N)**: Indicates if the field can accept null/empty values.
  * **Primary Key**: A unique, immutable identifier of the entity, generated internally by Criteo. Primary keys are typically ID fields (e.g., `merchantId`, `batchId`, `productId`) and are usually required in the URL path.
</Info>

***

## Upsert Store Inventory

Send a batch of inventory upsert events for a merchant.

<Info>
  **Use case**: Insert or update store-level inventory (price, availability) for one or more products.
</Info>

<EndpointBadge method="post">
  ```http theme={null}
  https://api.criteo.com/{version}/retail-media/catalog/merchants/{merchantId}/store-inventory/upsert
  ```
</EndpointBadge>

### Sample request

```json theme={null}
{
  "data": [
    {
      "type": "Upsert",
      "attributes": {
        "batchId": "batch1",
        "productId": "product1",
        "storeId": "store1",
        "availability": "IN_STOCK",
        "price": "19.99",
        "salePrice": "10.99"
      }
    },
    {
      "type": "Upsert",
      "attributes": {
        "batchId": "batch2",
        "productId": "product2",
        "storeId": "store2",
        "availability": "OUT_OF_STOCK",
        "price": "29.99"
      }
    }
  ]
}
```

### Sample Response

```json theme={null}
HTTP STATUS 204 (No Content)
&lt;EMPTY PAYLOAD&gt;
```

***

## Delete Store Inventory

Send a batch of inventory delete events for a merchant.

<Info>
  **Use case**: Remove outdated or unavailable inventory records.
</Info>

<EndpointBadge method="post">
  ```http theme={null}
  https://api.criteo.com/{version}/retail-media/catalog/merchants/{merchantId}/store-inventory/delete
  ```
</EndpointBadge>

### Sample Request

```json theme={null}
{
  "data": [
    {
      "type": "Delete",
      "attributes": {
        "batchId": "batch1",
        "productId": "product1",
        "storeId": "store1"
      }
    },
    {
      "type": "Delete",
      "attributes": {
        "batchId": "batch2",
        "productId": "product2",
        "storeId": "store2"
      }
    }
  ]
}
```

### Response Example

```json theme={null}
HTTP STATUS 204 (No Content)
&lt;EMPTY PAYLOAD&gt;
```

***

## Error Codes

<table>
  <thead>
    <tr>
      <th>
        <p>
          Error code
        </p>
      </th>

      <th>
        <p>
          Error text
        </p>
      </th>

      <th>
        <p>
          Description
        </p>
      </th>
    </tr>
  </thead>

  <tbody>
    <tr>
      <td>
        <p>
          400
        </p>
      </td>

      <td>
        <p>
          Bad request
        </p>
      </td>

      <td>
        <p>
          Validation errors, required fields, unique

          <code>
            batchId
          </code>

          /

          <code>
            productId
          </code>

          /

          <code>
            storeCode
          </code>
        </p>
      </td>
    </tr>

    <tr>
      <td>
        <p>
          400
        </p>
      </td>

      <td>
        <p>
          Request too large
        </p>
      </td>

      <td>
        <p>
          Payload exceeds 1000 events
        </p>
      </td>
    </tr>

    <tr>
      <td>
        <p>
          401
        </p>
      </td>

      <td>
        <p>
          Unauthorized
        </p>
      </td>

      <td>
        <p>
          Authentication required
        </p>
      </td>
    </tr>

    <tr>
      <td>
        <p>
          403
        </p>
      </td>

      <td>
        <p>
          Forbidden
        </p>
      </td>

      <td>
        <p>
          Not authorized
        </p>
      </td>
    </tr>

    <tr>
      <td>
        <p>
          429
        </p>
      </td>

      <td>
        <p>
          Too Many Requests
        </p>
      </td>

      <td>
        <p>
          Rate limiting
        </p>
      </td>
    </tr>

    <tr>
      <td>
        <p>
          500
        </p>
      </td>

      <td>
        <p>
          Internal Error
        </p>
      </td>

      <td>
        <p>
          Server error
        </p>
      </td>
    </tr>

    <tr>
      <td>
        <p>
          503
        </p>
      </td>

      <td>
        <p>
          Service Unavailable
        </p>
      </td>

      <td>
        <p>
          Service temporarily unavailable
        </p>
      </td>
    </tr>
  </tbody>
</table>
