Products
Browse the active business’s catalogue. List endpoints accept rich filters; detail endpoints return a single product with its variants, add-ons, schedules, and deals.
GET /api/v1/catalogue/products
List products with filters and pagination.
Query parameters
| Param | Type | Description |
|---|---|---|
category_id | string | Restrict to one category. |
category_slug | string | Restrict by category slug. |
taxonomy_id | string | Filter by taxonomy node. |
search | string | Free-text search on name / description. |
tags | string | Comma-separated tag list. |
featured | boolean | Only featured products. |
in_stock | boolean | Only items currently in stock. |
min_price | number | Minimum unit price. |
max_price | number | Maximum unit price. |
properties | string | JSON-encoded property filters, e.g. {"size":"M,L"}. |
sort_by | string | Field name (e.g. price, name). |
sort_order | string | asc or desc. |
limit / page / cursor | int / string | Pagination knobs. |
location_id | string | Scope pricing / stock to a single location. |
Request
curl "https://api.cimplify.io/api/v1/catalogue/products?category_id=cat_drinks&limit=10" \
-H "X-Public-Key: pk_test_your_publishable_key"Response
{
"success": true,
"data": {
"items": [
{
"id": "prod_abc123",
"name": "Espresso",
"slug": "espresso",
"description": "Rich double shot espresso",
"category_id": "cat_drinks",
"image_url": "https://cdn.cimplify.io/p/espresso.jpg",
"default_price": "4.50",
"currency": "GHS",
"product_type": "product",
"inventory_type": "none",
"is_active": true
}
],
"pagination": { "limit": 10, "next_cursor": null }
}
}GET /api/v1/catalogue/products/{product_id}
Full detail for one product, including variants, add-on groups, and images.
curl https://api.cimplify.io/api/v1/catalogue/products/prod_abc123 \
-H "X-Public-Key: pk_test_your_publishable_key"Response
{
"success": true,
"data": {
"id": "prod_abc123",
"name": "Espresso",
"slug": "espresso",
"default_price": "4.50",
"product_type": "product",
"variants": [
{ "id": "var_single", "name": "Single", "price_adjustment": "0.00", "is_default": true },
{ "id": "var_double", "name": "Double", "price_adjustment": "1.50", "is_default": false }
],
"add_ons": [
{
"id": "addon_milk",
"name": "Milk choice",
"selection_type": "single",
"is_required": false,
"options": [
{ "id": "opt_oat", "name": "Oat milk", "price": "0.50" },
{ "id": "opt_almond", "name": "Almond milk", "price": "0.50" }
]
}
],
"images": [
{ "url": "https://cdn.cimplify.io/p/espresso.jpg", "is_primary": true }
]
}
}GET /api/v1/catalogue/products/{product_id}/schedules
Returns the schedule rules attached to a product (e.g. only available for delivery between 9am and 5pm).
curl https://api.cimplify.io/api/v1/catalogue/products/prod_abc123/schedules \
-H "X-Public-Key: pk_test_your_publishable_key"GET /api/v1/catalogue/products/{product_id}/available-now
Boolean check: can this product be ordered right now from location_id? Combines schedule rules with live inventory. location_id is required.
curl "https://api.cimplify.io/api/v1/catalogue/products/prod_abc123/available-now?location_id=loc_01H…" \
-H "X-Public-Key: pk_test_your_publishable_key"GET /api/v1/catalogue/products/{product_id}/billing-plans/eligible
Subscription billing plans the product is eligible for, optionally filtered by customer_id, quantity, or order_value.
curl "https://api.cimplify.io/api/v1/catalogue/products/prod_abc123/billing-plans/eligible?quantity=1" \
-H "X-Public-Key: pk_test_your_publishable_key"POST /api/v1/catalogue/quotes
Create a price quote that bakes in variant, add-on, bundle / composite selections, and location-specific pricing. Pass the resulting quote_id on POST /cart/items to lock the price.
Body
| Field | Description |
|---|---|
product_id | Required. |
variant_id | Optional selected variant. |
quantity | Optional, defaults to 1. |
location_id | Optional location for pricing. |
add_on_option_ids | Add-on options. |
bundle_selections | { component_id, variant_id?, quantity } array. |
composite_selections | { component_id, quantity, variant_id?, add_on_option_id? } array. |
curl -X POST https://api.cimplify.io/api/v1/catalogue/quotes \
-H "X-Public-Key: pk_test_your_publishable_key" \
-H "Content-Type: application/json" \
-d '{
"product_id": "prod_abc123",
"variant_id": "var_double",
"quantity": 2,
"add_on_option_ids": ["opt_oat"]
}'Response
{
"success": true,
"data": {
"quote_id": "pq_01H…",
"product_id": "prod_abc123",
"unit_price": "6.50",
"quantity": 2,
"subtotal": "13.00",
"currency": "GHS",
"expires_at": "2026-05-07T17:00:00Z"
}
}GET /api/v1/catalogue/quotes/{quote_id}
Re-read a previously created quote.
curl https://api.cimplify.io/api/v1/catalogue/quotes/pq_01H… \
-H "X-Public-Key: pk_test_your_publishable_key"POST /api/v1/catalogue/quotes/{quote_id}/refresh
Refresh an existing quote with current pricing. Pass any of the same fields as POST /catalogue/quotes; the server replaces the locked numbers.
curl -X POST https://api.cimplify.io/api/v1/catalogue/quotes/pq_01H…/refresh \
-H "X-Public-Key: pk_test_your_publishable_key" \
-H "Content-Type: application/json" \
-d '{"quantity": 3}'POST /api/v1/catalogue/deals/validate
Validate a discount code against an order subtotal before applying it to the cart.
Body
curl -X POST https://api.cimplify.io/api/v1/catalogue/deals/validate \
-H "X-Public-Key: pk_test_your_publishable_key" \
-H "Content-Type: application/json" \
-d '{
"discount_code": "WELCOME10",
"order_subtotal": "13.00",
"location_id": "loc_01H…"
}'Contracts
The SDK and the backend agree on shapes by snapshotting both sides as JSON Schema and diffing on every CI run. The pipeline runs on every PR; drift breaks the build before it can reach a storefront.
Variants
Variants are options on a product (size, colour, duration, etc.). They are returned inline on the product detail endpoint, but there are also dedicated endpoints to list variants, look up a single variant by ID, and resolve a variant from a set of axis selections.