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

# API changelog

> Release notes for the Retailgrid Public API, including new endpoints, breaking changes, and version updates across each release.

This changelog tracks changes to the Retailgrid Public API only. For product-wide changes, see the [main changelog](/changelog/product-updates).

## 2026-06-22 - Product store endpoints; variants folded into products

The catalog is keyed at the SKU (item) level. `item_id` is the required unique identifier for each item; `product_id` is now an optional product-level code that groups related items.

**Added:**

* **Product store** REST entity - `GET /v1/product_store` (list), `POST /v1/product_store` (upsert), `POST /v1/product_store/bulk`, and `GET` / `PATCH` / `DELETE /v1/product_store/{entity_id}` - per-store, market, or channel prices, costs, and stock. Upsert key `(item_id, store_id)`. See [Product store](/api-reference/product-store/list).
* `POST /v1/imports/product_store` - asynchronous CSV import for product store-level data. See [Import product store CSV](/api-reference/imports/product-store).

**Changed:**

* Product create now requires `item_id` (the unique SKU-level key); `product_id` is optional.

**Removed:**

* `POST` / `PATCH` / `DELETE /v1/product_variants/*` and `POST /v1/product_variants/bulk`. The variant level is now the item-level product, addressed by `item_id`. Migrate variant writes to the [Products](/api-reference/products/list) endpoints.

## 2026-06-03 - Store-level ingestion

The ingest path now supports store-level product data, so clients pushing data programmatically can send multiple prices per product per store, market, or channel.

**Added:**

* Ingest endpoints accept a `store_id` alongside `item_id` - one record per item-store combination, persisted per the [Product store data spec](/data-requirements/product-store-data).
* Upsert semantics use `(item_id, store_id)` as the natural key.
* Every incoming record is validated against existing stores and products; invalid records (unknown store, duplicate keys within a batch) return a 4xx with a specific error code per row.

**Backward compatible:** payloads that omit `store_id` are treated as product-level and behave exactly as before.

## 2026-05-21 - Read endpoints

The Public API now reads as well as writes. The inbound/outbound asymmetry that integrators raised at v1 launch is closed.

**Added:**

* `GET /v1/products` — list and filter enriched product records, including custom columns from product imports. See [List products](/api-reference/products/list).
* `GET /v1/transactions` — list and filter sales transactions. See [List transactions](/api-reference/transactions/list).
* `GET /v1/grids` — list grids in the account, including a column-schema summary and row count per grid. See [List grids](/api-reference/grids/list).
* `GET /v1/grids/{grid_id}/rows` — export the full row contents of a grid (canonical + custom + formula/calculated columns). See [Get grid rows](/api-reference/grids/get-rows).

## 2026-05-04 - v1 launch

The first public version of the Retailgrid API is live at `https://clientapi.retailgrid.io`.

**Available now:**

* **Auth** - `GET /v1/auth/verify` for key validation. Bearer tokens, prefixed `rg_live_`.
* **Imports (async CSV)** - products, transactions, competitor prices.
* **Products** - bulk upsert, create, patch, delete.
* **Product variants** - bulk upsert, create, patch, delete.
* **Transactions** - bulk upsert, create, patch, delete.
* **Competitor prices** - bulk upsert, create, patch, delete.
* **Jobs** - `GET /v1/jobs/{job_id}` for polling async import status.

**Known gaps we plan to close:**

* `Idempotency-Key` header support on non-idempotent creates.
* A documented rate-limit ceiling.
* Webhook callbacks for job completion (replacing polling).
