# Batch get listing inventory

> Eto API reference for `GET /api/v1/listings/batch/inventory`. Base URL `https://eto.tools/api/v1/`. Authenticate with the `X-Eto-API-Key` header.

Part of the [Eto API reference](https://eto.tools/dev/docs/). The full reference in one file is at [llms-full.txt](https://eto.tools/dev/docs/llms-full.txt); the machine-readable schema is at [openapi.json](https://eto.tools/dev/docs/openapi.json).

## GET /api/v1/listings/batch/inventory

Batch get listing inventory

- Operation ID: `listings_batch_inventory`
- Slug: `listings-batch-inventory`
- Category: Listings
- Authentication: API key plus at least one connected store. Etsy needs a seller token for this read but not ownership: Eto uses the token of your store that owns the listing (so SKUs come back), otherwise one of your healthy stores.
- HTML: https://eto.tools/dev/docs/#ep-listings-batch-inventory
- Markdown: https://eto.tools/dev/docs/listings/listings-batch-inventory.md

Retrieve the inventory record (products, offerings, prices, quantities, SKUs) for up to 100 listings in one call. If any listing_id does not exist, Etsy fails the whole request with 404.
Etsy only returns SKUs for listings in the shop whose token is used. Eto uses the connected store that owns most of the requested listings; pass shop_id to choose it. For SKUs on every listing, batch the ids by shop.

Proxied to the Etsy API at `/v3/application/listings/batch/inventory`. Fields Etsy returns are passed through untouched.

### Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `listing_ids` | query | `string` | yes | Comma-separated listing IDs (max 100) |
| `shop_id` | query | `integer` | no | Optional. The connected shop whose token to use (SKUs come back for its listings). |

### Request

```bash
curl -H "X-Eto-API-Key: eto_your_key" "https://eto.tools/api/v1/listings/batch/inventory?listing_ids=123,456,789&shop_id=12345678"
```

```python
import requests

url = "https://eto.tools/api/v1/listings/batch/inventory?listing_ids=123,456,789&shop_id=12345678"
headers = {"X-Eto-API-Key": "eto_your_key"}

response = requests.get(url, headers=headers, timeout=120)
response.raise_for_status()
print(response.json())
```

```javascript
const url = "https://eto.tools/api/v1/listings/batch/inventory?listing_ids=123,456,789&shop_id=12345678";

const response = await fetch(url, {
  method: "GET",
  headers: {
    "X-Eto-API-Key": "eto_your_key",
  },
});
if (!response.ok) throw new Error(`Eto API ${response.status}`);
const data = await response.json();
```

### Response

`application/json`, passed through from Etsy’s `/v3/application/listings/batch/inventory` verbatim. The field-by-field data model is in the [v2 preview reference](https://eto.tools/eto-dev-api-v2/), which documents these same routes alongside the whole Etsy schema.

### Errors

Failures answer with the shared error body described in the Errors section: `{"error": {"code", "status", "message", "hint", "docs"}}`. Branch on `code`, not on the message.

This endpoint can additionally return `STORE_NOT_CONNECTED` (403) when the shop is not linked to your account, and `STORE_TOKEN_EXPIRED` (503) when its Etsy authorisation has lapsed and needs reconnecting.
