The products API
Push products into your catalogue from your own systems and read them back, with an API key.
Updated 23 September 2026
- Why
- Some systems push rather than answer.
- How
- Create a key in Settings, Integrations with the
products:writeorproducts:readscope and send it as a Bearer token.
| Status | When |
|---|---|
| 401 | No key, or not an organisation API key (they start kbd_). |
| 403 | The key lacks the scope. |
| 429 | The key is over its rate limit. |
Push products
The body is { schema_id?, products: [...] }. Each product carries sku and title (required), any of category, uom, price, currency, stock_qty and lead_time_days, an external_id, and attributes in an attrs object or as top level keys that match the schema's fields. Coercion is the import wizard's.
curl -X POST https://kabaido.ai/api/v1/products/bulk \
-H "Authorization: Bearer $KABAIDO_KEY" \
-H "Content-Type: application/json" \
-d '{ "schema_id": "<schema id>", "products": [ { "sku": "EM-12-4F", "title": "12 mm 4 flute end mill", "price": "42.50", "currency": "GBP", "attrs": { "diameter_mm": 12, "flutes": 4 } } ] }'It answers { "upserted": n, "errors": [{ "index", "reason" }] }, and a bad row never stops the rest.
Up to 10,000 products a call (more is 413). A call is refused with 402 before anything is written when the products you hold plus every product in it would pass your plan's product limit.
List products
| Parameter | Behaviour |
|---|---|
search | Matches title, SKU and category. |
sku, category | Exact match. |
limit | 1 to 500, default 100. |
cursor | The next_cursor of the previous page; it is null on the last. |
Products come ordered by SKU with id, sku, title, category, uom, price_minor, currency, stock_qty, lead_time_days, attrs, status, external_id, created_at and updated_at. Cost is never returned.
Money is stored in integer minor units (pence for GBP): the sample's "price": "42.50" is stored as a price_minor of 4250. Round half up only when you display it.
Related
- API keys and scopesCreate a key that can do exactly what one integration needs, and retire it safely.
- Rate limitsKnow every limit the API, the inbound endpoints and the webhooks apply, and what happens at each.
- REST connectionsPull products from your own REST API, map the fields once and refresh by hand or every night.