API
Products API
Create, list, retrieve and update the products in your catalogue.
On this page
Overview#
Products are the items in your catalogue (dashboard: Products), used on invoices, hosted checkout pages and debit order mandates. Keep them in sync with your own system through this API. Products can't be deleted through the API; disable them with enabled: false. Subscription pricing lives in plans, not products.
The product object#
{
"id": "cmg4r7q6p0004prd0001abcd",
"object": "product",
"sku": "SUP-HR",
"name": "Support hour",
"description": "One hour of remote support",
"amount": 650,
"currency": "ZAR",
"billingType": "once",
"frequency": null,
"taxable": true,
"enabled": true,
"createdAt": "2026-09-28T08:00:00.000Z",
"updatedAt": "2026-09-28T08:00:00.000Z"
}| Field | Type | Description |
|---|---|---|
idrequired | string | Product ID. |
objectrequired | string | product |
skurequired | string | null | Your stock-keeping code (up to 50 characters). |
name, descriptionrequired | string, string | null | Up to 100 and 2000 characters. |
amount, currencyrequired | number, string | Price (rounded to cents) and ISO 4217 currency. |
billingTyperequired | string | once or recurring. |
frequencyrequired | string | null | Recurring products: monthly, quarterly, biannually or annually; otherwise null. |
taxablerequired | boolean | Whether tax applies (see Tax & PDFs). |
enabledrequired | boolean | Disabled products are hidden from new sales. |
createdAt, updatedAtrequired | string |
Create a product#
/api/v1/products| Field | Type | Description |
|---|---|---|
namerequired | string | 1–100 characters. |
amountrequired | number | Greater than 0, up to 100 000 000. |
skuoptional | string | null | Up to 50 characters. |
descriptionoptional | string | null | Up to 2000 characters. |
currencyoptional | string | 3-letter ISO 4217 code, default ZAR. |
billingTypeoptional | string | once (default) or recurring. Recurring needs a frequency and Recurring billing in your plan. |
frequencyoptional | string | null | Required for recurring products. |
taxableoptional | boolean | Default true. |
enabledoptional | boolean | Default true. |
curl -X POST "https://app.centrapoint.co.za/api/v1/products" \
-H "Authorization: Bearer $CENTRAPOINT_API_KEY" \
-H "Idempotency-Key: 8d1e4b2a-6c3f-4a7e-9b0d-1f2e3a4b5c6d" \
-H "Content-Type: application/json" \
-d '{
"sku": "SUP-HR",
"name": "Support hour",
"description": "One hour of remote support",
"amount": 650
}'Returns 201 with the product. Unknown fields are rejected. Supports the Idempotency-Key header.
List products#
/api/v1/products| Field | Type | Description |
|---|---|---|
enabledoptional | string | true or false. |
billingTypeoptional | string | once or recurring; anything else returns 400. |
limitoptional | integer | 1–100, default 50. |
Returns { "data": [ … ] } in name order.
curl -X GET "https://app.centrapoint.co.za/api/v1/products?enabled=true" \
-H "Authorization: Bearer $CENTRAPOINT_API_KEY"Get a product#
/api/v1/products/{id}curl -X GET "https://app.centrapoint.co.za/api/v1/products/cmg4r7q6p0004prd0001abcd" \
-H "Authorization: Bearer $CENTRAPOINT_API_KEY"Update a product#
/api/v1/products/{id}Partial update with the same fields as create. null clears sku or description. Switching to recurring needs a frequency (sent or already stored) and Recurring billing; switching to once clears the frequency. Unknown fields are rejected. The Idempotency-Key header is not used.
curl -X PATCH "https://app.centrapoint.co.za/api/v1/products/cmg4r7q6p0004prd0001abcd" \
-H "Authorization: Bearer $CENTRAPOINT_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"amount": 700
}'Errors#
| Status | error | When |
|---|---|---|
| 400 | invalid_request | Validation failed, unknown field, invalid currency, recurring without frequency or without Recurring billing. |
| 403 | plan_restricted / account_restricted | No API access, or the account is read-only (writes). |
| 404 | not_found | No product with this ID in your organisation. |
| 409 | idempotency_conflict | Idempotency-Key reused with a different body (POST). |
| 401 / 429 / 500 | unauthorized / rate_limited / internal_error | See Errors |