CentraPoint

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#

Product
{
  "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"
}
Product fields
FieldTypeDescription
idrequiredstringProduct ID.
objectrequiredstringproduct
skurequiredstring | nullYour stock-keeping code (up to 50 characters).
name, descriptionrequiredstring, string | nullUp to 100 and 2000 characters.
amount, currencyrequirednumber, stringPrice (rounded to cents) and ISO 4217 currency.
billingTyperequiredstringonce or recurring.
frequencyrequiredstring | nullRecurring products: monthly, quarterly, biannually or annually; otherwise null.
taxablerequiredbooleanWhether tax applies (see Tax & PDFs).
enabledrequiredbooleanDisabled products are hidden from new sales.
createdAt, updatedAtrequiredstring

Create a product#

POST/api/v1/products
Create product fields
FieldTypeDescription
namerequiredstring1–100 characters.
amountrequirednumberGreater than 0, up to 100 000 000.
skuoptionalstring | nullUp to 50 characters.
descriptionoptionalstring | nullUp to 2000 characters.
currencyoptionalstring3-letter ISO 4217 code, default ZAR.
billingTypeoptionalstringonce (default) or recurring. Recurring needs a frequency and Recurring billing in your plan.
frequencyoptionalstring | nullRequired for recurring products.
taxableoptionalbooleanDefault true.
enabledoptionalbooleanDefault 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#

GET/api/v1/products
List query parameters
FieldTypeDescription
enabledoptionalstringtrue or false.
billingTypeoptionalstringonce or recurring; anything else returns 400.
limitoptionalinteger1–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#

GET/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#

PATCH/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#

Product errors
StatuserrorWhen
400invalid_requestValidation failed, unknown field, invalid currency, recurring without frequency or without Recurring billing.
403plan_restricted / account_restrictedNo API access, or the account is read-only (writes).
404not_foundNo product with this ID in your organisation.
409idempotency_conflictIdempotency-Key reused with a different body (POST).
401 / 429 / 500unauthorized / rate_limited / internal_errorSee Errors