# Look up up to 100 products in one request

> POST /v1/products/batch resolves up to 100 identifiers at once, optionally with offers and reviews: synchronous up to 20, asynchronous with polling above that.

*Source: https://shopsavvy.com/data/documentation/product-batch* · Part of the [ShopSavvy Data API documentation](https://shopsavvy.com/data/documentation.md)

---

Look up multiple products at once. For small batches (up to 20 identifiers), results are returned immediately. For larger batches (21-100), processing happens asynchronously — you receive a batch ID and poll for results.

**Endpoint:** `POST /v1/products/batch`

**Credit Cost:** Same as individual lookups (1 credit per product found, + 3 per product that has offers if including offers, + 1 per product that has a review if including reviews)

**Request Body:**

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `identifiers` | string[] | Yes | Array of product identifiers (1-100). Supports barcodes, ASINs, URLs, model numbers. |
| `include` | string[] | No | Additional data to fetch: `"offers"` and/or `"reviews"` |

**Example Request (Synchronous, <=20 identifiers):**

```bash
curl -X POST 'https://api.shopsavvy.com/v1/products/batch' \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{
    "identifiers": ["B09XS7JWHH", "B0CHX3TW6K", "027242923782"],
    "include": ["offers"]
  }'
```

**Synchronous Response (<=20 identifiers):**

```json
{
  "success": true,
  "results": [
    { "identifier": "B09XS7JWHH", "status": "found", "product": { "title": "Sony WH-1000XM5", ... }, "offers": [...] },
    { "identifier": "B0CHX3TW6K", "status": "found", "product": { "title": "iPhone 15 Pro", ... }, "offers": [...] },
    { "identifier": "INVALID123", "status": "not_found", "product": null }
  ],
  "summary": { "total": 3, "found": 2, "not_found": 1 },
  "meta": { "request_id": "abc-123", "credits_used": 8, "credits_remaining": 992 }
}
```

**Async Response (>20 identifiers):**

When submitting more than 20 identifiers, you receive a batch ID immediately:

```json
{
  "success": true,
  "batch": {
    "id": "batch_abc123def456",
    "status": "processing",
    "total": 50,
    "processed": 0,
    "poll_url": "/v1/batch/batch_abc123def456",
    "estimated_seconds": 75
  }
}
```

Poll `GET /v1/batch/{batch_id}` until `status` is `"completed"`, then the response includes the full `results` array.
