Skip to content

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:write or products:read scope and send it as a Bearer token.

Responses both endpoints share

StatusWhen
401No key, or not an organisation API key (they start kbd_).
403The key lacks the scope.
429The 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.

bash
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

ParameterBehaviour
searchMatches title, SKU and category.
sku, categoryExact match.
limit1 to 500, default 100.
cursorThe 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.