---
title: "Bulk upsert products"
method: POST
path: "/products/bulk"
tags: ["Products"]
---

# Bulk upsert products

`POST /products/bulk`

## Request

- Base URL: `https://api.savanto.ai`
- URL: `https://api.savanto.ai/products/bulk`
- Auth: HTTP bearer

Create or update up to 100 products in a single request.

## Request body

- object
  - `entities` ProductInput[], required
    - `id` string, required
    - `name` string, required
    - `content` string
    - `searchableText` string
    - `excerpt` string
    - `price` number, nullable
    - `salePrice` number, nullable
    - `regularPrice` number, nullable
    - `onSale` boolean
    - `priceMin` number, nullable
    - `priceMax` number, nullable
    - `stockQuantity` number, nullable
    - `stockStatus` 'instock' | 'outofstock' | 'onbackorder'
    - `sku` string
    - `type` 'simple' | 'variable' | 'grouped' | 'external'
    - `weight` number, nullable
    - `dimensions` object, nullable
      - `length` number, nullable
      - `width` number, nullable
      - `height` number, nullable
    - `rating` number, nullable
    - `reviewCount` number
    - `categories` string[]
    - `tags` string[]
    - `brands` string[]
    - `image` string, nullable
    - `url` string
    - `status` string
    - `visibility` string
    - `featured` boolean
    - `virtual` boolean
    - `downloadable` boolean
    - `attributes` object, nullable
    - `metadata` object
    - `source` string
    - `indexStatus` 'active' | 'hidden' | 'disabled'
  - `refresh` 'true' | 'false' | 'wait_for'

## Response `200`

Bulk upsert completed

- object
  - `object` 'bulk_operation', required
  - `requestId` string, required
  - `data` object, required
    - `processed` number, required
    - `succeeded` string[], required
    - `failed` object[], required
      - `id` string
      - `error` string, required
    - `skipped` number
    - `indexingLimitReached` boolean

## Other responses

- `400`: Validation error
- `401`: Unauthorized
- `403`: Forbidden
- `404`: Not found
- `409`: Conflict
- `413`: Payload too large
- `429`: Rate limit exceeded

---

[API](https://skmtc.dev/savanto/apis/savanto-api.md) · [All operations](https://skmtc.dev/savanto/apis/savanto-api/llms.txt) · [OpenAPI document](https://skmtc.dev/savanto/apis/savanto-api/revisions/82437327a878?raw)
