Skip to content

The products API

Push products into your catalogue from your own systems with an authenticated bulk upsert endpoint and read them back with a list endpoint.

For organisations whose systems push data, Kabaido exposes a bulk upsert endpoint. It applies the same validation and coercion as the import wizard and upserts by sku within your organisation. A companion list endpoint reads your catalogue back out.

Endpoint

POST /api/v1/products/bulk accepts up to 10000 products per call. Larger payloads are rejected.

Authentication and scopes

Authenticate with an organisation API key as a Bearer token in the Authorization header. Keys start with kbd_ and are created in Settings, then Integrations. The key must hold the products:write scope, or the request is rejected with 403.

Rate limit

Requests are limited to 600 per minute per key. Over the limit the endpoint returns 429.

Request

The body is an object with an optional schema_id and a products array. Each product carries core fields by their key (sku and title are required) and attributes either nested under an attrs object or as top level keys matching your schema field keys. An external_id ties a record to its source for future upserts.

bash
curl -X POST https://kabaido.ai/api/v1/products/bulk \
 -H "Authorization: Bearer kbd_your_key_here" \
 -H "Content-Type: application/json" \
 -d '{
 "schema_id": "your-schema-id",
 "products": [
 {
 "sku": "END-12-4F",
 "title": "12mm 4 flute end mill",
 "category": "End mills",
 "price": "42.50",
 "currency": "GBP",
 "external_id": "ERP-10481",
 "attrs": { "diameter_mm": "12", "flutes": "4" }
 }
 ]
 }'

Response

On success the endpoint returns the number of products upserted and an array of per row errors, each with the index of the failing product and a reason. Rows that fail validation do not stop the rest of the batch.

json
{
 "upserted": 1,
 "errors": []
}

The endpoint is checked against your plan product limit before it writes. If the incoming products would take your catalogue over the limit the call is rejected with 402 and nothing is written.

Listing products

GET /api/v1/products returns your products ordered by sku. The key must hold the products:read scope, or the request is rejected with 403. The same 600 requests per minute rate limit applies.

ParameterBehaviour
searchMatches against title, sku and category.
skuExact sku match.
categoryExact category match.
limitPage size, 1 to 500. Defaults to 100.
cursorThe next_cursor value from the previous page.
bash
curl "https://kabaido.ai/api/v1/products?category=End%20mills&limit=100" \
 -H "Authorization: Bearer kbd_your_key_here"

The response carries a products array and a next_cursor. Each product returns its core fields (id, sku, title, category, uom, price_minor, currency, stock_qty, lead_time_days, status, external_id) plus its attrs object. Prices are integer minor units, so a price_minor of 4250 in GBP is £42.50. Pass next_cursor back as cursor to fetch the next page; it is null on the last page.

json
{
 "products": [
 {
 "id": "...",
 "sku": "END-12-4F",
 "title": "12mm 4 flute end mill",
 "category": "End mills",
 "uom": "EA",
 "price_minor": 4250,
 "currency": "GBP",
 "stock_qty": 18,
 "lead_time_days": 5,
 "attrs": { "diameter_mm": 12, "flutes": 4 },
 "status": "active",
 "external_id": "ERP-10481",
 "created_at": "2026-05-02T09:14:00Z",
 "updated_at": "2026-06-01T16:40:00Z"
 }
 ],
 "next_cursor": null
}