REST API·intermediate·6 min
Products API
Create, list, read, update, and delete products with REST.
The Products API is a thin REST surface over the products table. All endpoints live under /api/public/v1/products and require a bearer token.
Object
{
"id": "prd_01HZK...",
"sku": "TSHIRT-BLACK-M",
"title": "Heavyweight tee",
"description": "12oz cotton, boxy fit.",
"brand": "Atelier",
"price_amount": 48.00,
"price_currency": "USD",
"inventory_quantity": 120,
"image_url": "https://cdn.example.com/tee-black.jpg",
"url": "https://shop.example.com/tee-black-m",
"tags": ["staple", "unisex"],
"updated_at": "2025-01-12T09:24:11Z"
}List
GET /api/public/v1/products?limit=50&cursor=<id>&q=teeCursor pagination. limit defaults to 50, max 200. q matches title, sku, and brand.
Get
GET /api/public/v1/products/:id:id can be the internal id or the SKU. SKUs are URL-encoded.
Create
POST /api/public/v1/products
Content-Type: application/json
{
"sku": "TSHIRT-BLACK-M",
"title": "Heavyweight tee",
"price_amount": 48.00,
"price_currency": "USD",
"inventory_quantity": 120
}SKUs must be unique within a workspace. Re-posting the same SKU returns 409 sku_conflict — use PATCH to update instead, or the bulk endpoint for idempotent upserts.
Update
PATCH /api/public/v1/products/:id
Content-Type: application/json
{ "inventory_quantity": 96 }Partial: send only the fields you want to change.
Delete
DELETE /api/public/v1/products/:idSoft-deletes by default; the row is hidden from feeds and the API immediately, and purged after 30 days. Pass ?hard=true to delete now.