API reference
Every v1 endpoint, its scope and how pagination works, plus the OpenAPI document.
The Kabaido API is REST over HTTPS, scoped to your organisation by the API key. All money fields are integer minor units with a currency code. The machine-readable specification lives at /api/v1/openapi.json.
curl "/api/v1/quotes?limit=2" -H "Authorization: Bearer kbd_..."- Q-26-00026£528.96inc VATvalid until 11 JulDraft
- Q-26-00025£202.08inc VATvalid until 10 JulDraft
Money in minor units. 600 requests per minute per key.
Endpoints
| Endpoint | Method | Scope | Purpose |
|---|---|---|---|
| /api/v1/products | GET | products:read | List and search products |
| /api/v1/products/bulk | POST | products:write | Upsert up to 10000 products by SKU |
| /api/v1/quotes | GET | quotes:read | List quotes, filter by status |
| /api/v1/quotes/{id} | GET | quotes:read | One quote with lines |
| /api/v1/orders | GET | orders:read | List orders, filter by status |
| /api/v1/orders/{id} | GET | orders:read | One order with lines |
| /api/v1/customers | GET | customers:read | List and search customers |
| /api/v1/customers | POST | customers:write | Upsert up to 500 customers |
| /api/v1/customers/{id} | GET | customers:read | One customer with contacts |
| /api/v1/requests | GET | requests:read | List request threads |
| /api/v1/requests | POST | requests:write | Open a request from RFQ text |
| /api/v1/requests/{id} | GET | requests:read | One request with messages |
Pagination
List endpoints return newest first with an opaque next_cursor when more results exist. Pass it back as the cursor query parameter for the next page; a null next_cursor means you have everything. Limits cap at 200 rows for commercial lists and 500 for products and customers.
Errors
Errors are JSON with a single error message. 401 means a missing or revoked key, 403 a missing scope, 404 a record outside your organisation, 422 a request that cannot be processed, 429 the per-key throttle and 5xx a fault on our side. Retry 429 and 5xx with a backoff; never retry 4xx unchanged.
Opening a request
curl -X POST https://kabaido.ai/api/v1/requests \
-H "Authorization: Bearer kbd_your_key_here" \
-H "Content-Type: application/json" \
-d '{ "text": "Please quote 50x DIN 933 M8x40 A2" }'Money, everywhere
Every money field is an integer in minor units with a currency code beside it: total_minor 58200 with currency GBP is £582.00. There are no floating point figures in the API and there are none in the platform either, because a penny lost to binary rounding on a quote line is a penny somebody has to find later.
Divide by 100 at the point you display, not before, and round half-up if you are doing arithmetic of your own.
Idempotency and retries
The write endpoints are upserts keyed on your own identifiers: products by SKU, customers by external id then email domain. Sending the same batch twice updates the same rows rather than creating duplicates, which is what makes a retry after a timeout safe.
Retry 429 and 5xx with a backoff. Never retry a 4xx unchanged: it will fail the same way, and 422 in particular means the body itself is the problem.
Creating a request costs nothing. Usage meters the AEI when it resolves lines, exactly as in the app.