Products
Introduction
A product represents the item being sold to a customer. It should contain all the necessary information about what the customer is purchasing including the price and product details.
Breeze supports both one-time purchases (using REGULAR products) and recurring billing (using SUBSCRIPTION products). For a full guide on recurring billing, see Subscription Quick Start.
Create a Product
There are 2 types of products you can create,
- A
Regularproduct used for one-time purchases in a payment page. - A
Subscriptionproduct used for making recurring purchases.
1a. Creating a Regular Product
Create a regular product by sending a request with the most basic parameters. See 📄 API Reference — Create a product.
curl -X POST 'https://api.breeze.cash/v2/products' \
-u "YOUR_API_KEY:" \
--header 'Content-Type: application/json' \
--data-raw '{
"displayName": "Example Regular Product",
"description": "More details about this product",
"image": "https://example.com/test.jpg",
"clientProductId": "<(optional)your-unique-product-id>",
"type": "REGULAR",
"unitAmount": 10000,
"currency": "USD"
}'A successful response should look like:
{
"status": "SUCCEEDED",
"data": {
"id": "prd_123abc456",
"displayName": "Example Regular Product",
"type": "REGULAR",
"status": "ACTIVE",
"merchantId": "mch_123abc456",
"defaultPriceId": "prc_123abc456",
"livemode": true,
"createdAt": 1776108219235,
"updatedAt": 1776108219236
}
}Note:
unitAmount,currency,description,image, andclientProductIdare accepted in the request but are not echoed in the create response (which returns the product envelope). Store them in your own system, or call Get a product to read the price back.Amount fields: Set the price with
unitAmount— a positive integer in minor units (cents). For example, withcurrency: "USD",unitAmount: 10000= USD 100.00. The olderamountfield (a number in major units) is deprecated; it still works, but it is mutually exclusive withunitAmount, so send only one. In responses, each price carries bothunitAmount(minor units) and the deprecatedamountStr(the same value as a major-units string) — preferunitAmount.Note: For
REGULARproducts, a price (unitAmount, or the deprecatedamount) andcurrencyare required — omitting them returns a validation error, despite being marked optional in the API Reference. The minimum price of100minor units (e.g. USD 1.00) is enforced only when the product is used in a payment page, not at creation time.
REGULARandSUBSCRIPTIONproducts are bothACTIVEimmediately after creation — there is no separate activation step. (A legacyPOST /v2/products/{productId}/activateendpoint remains for backward compatibility but is a no-op for products that are already active, and is not part of the current API.)
1b. Creating a Subscription Product
Create a subscription product by sending a request with the most basic parameters.
curl -X POST 'https://api.breeze.cash/v2/products' \
-u "YOUR_API_KEY:" \
--header 'Content-Type: application/json' \
--data-raw '{
"displayName": "Example Subscription Product",
"description": "More details about this product",
"image": "https://example.com/test.jpg",
"type": "SUBSCRIPTION",
"clientProductId": "<your-unique-product-id>"
}'A successful response should look like:
{
"status": "SUCCEEDED",
"data": {
"name": "Example Subscription Product",
"description": "More details about this product",
"image": "https://example.com/test.jpg",
"clientProductId": "<your-unique-product-id>",
"status": "ACTIVE",
"type": "SUBSCRIPTION",
"id": "prd_234abc567",
...
}
}GET Products
Request
curl -X GET 'https://api.breeze.cash/v2/products' \
-u "YOUR_API_KEY:" \
--header 'Content-Type: application/json' \
Response
{
"status": "SUCCEEDED",
"data": [
{
"clientProductId": "testId",
"_lock": {
"locked": false
},
"image": "https://example.com/product.jpg",
"type": "REGULAR",
"livemode": false,
"description": "test",
"merchantId": "mch_123abc456",
"status": "ACTIVE",
"id": "prd_123abc456",
"createdAt": 1767778980568,
"displayName": "Test Display",
"defaultPriceId": "prc_123abc456",
"updatedAt": 1767778980604,
"prices": [
{
"type": "ONE_TIME",
"createdAt": 1767778980604,
"id": "prc_234abc567",
"currency": "USD",
"_lock": {
"locked": false
},
"livemode": false,
"status": "ACTIVE",
"unitAmount": 10000,
"amountStr": "100",
"productId": "prd_123abc456"
}
]
}
]Edit a Product
To change a product's presentation details after creation, send a PATCH request with only the fields you want to update. See 📄 API Reference — Update a product.
Editable fields are displayName, description, image, and defaultPriceId. A product's type, its prices' amount/currency, status, and clientProductId are immutable after creation — to change pricing, create a new price and point defaultPriceId at it.
curl -X PATCH 'https://api.breeze.cash/v2/products/prd_123abc456' \
-u "YOUR_API_KEY:" \
--header 'Content-Type: application/json' \
--data-raw '{
"displayName": "Updated Product Name",
"description": "Updated description",
"defaultPriceId": "prc_234abc567"
}'A successful response returns the updated product:
{
"status": "SUCCEEDED",
"data": {
"id": "prd_123abc456",
"displayName": "Updated Product Name",
"description": "Updated description",
"defaultPriceId": "prc_234abc567",
"type": "REGULAR",
"status": "ACTIVE",
"merchantId": "mch_123abc456",
"livemode": true,
"createdAt": 1776108219235,
"updatedAt": 1776201928374
}
}Note: At least one field must be provided — an empty body is rejected. When setting
defaultPriceId, the price must belong to this product and must not be deleted.
2. Creating a Subscription Product Price
Create a price for a subscription product. See 📄 API Reference — Create a product price.
curl -X POST 'https://api.breeze.cash/v2/products/prd_234abc567/price' \
-u "YOUR_API_KEY:" \
--header 'Content-Type: application/json' \
--data-raw '{
"currency": "USD",
"unitAmount": 1000,
"type": "RECURRING",
"billingCycleConfig": {
"interval": "month",
"frequency": 1
}
}'A successful response should look like:
{
"status": "SUCCEEDED",
"data": {
"currency": "USD",
"unitAmount": 1000,
"amountStr": "10",
"status": "ACTIVE",
"productId": "prd_234abc567",
"type": "RECURRING",
"billingCycleConfig": {
"interval": "month",
"frequency": 1
},
"id": "prc_345abc678",
...
}
}Note: The
houroption for theintervalfield withinbillingCycleConfigis only supported in non-live mode environments (livemode = false) and cannot be used in live mode.
Creating a Payment Page with an existing Regular Product
With your product created, create a payment page for this product by passing a list of product IDs into the request.
curl -X POST 'https://api.breeze.cash/v1/payment_pages' \
-u "YOUR_API_KEY:" \
--header 'Content-Type: application/json' \
--data-raw '{
"lineItems": [
{
"product": "prd_123abc456",
"quantity": 1
}
],
"billingEmail": "[email protected]",
"clientReferenceId": "order-001",
"successReturnUrl": "https://your-domain.com/order-complete",
"failReturnUrl": "https://your-domain.com/order-aborted",
"customer": {
"referenceId": "<your-unique-user-id>"
}
}'Continue reading here: https://docs.breeze.cash/docs/quick-start#/
Creating a Subscription with an existing Product
You can also create a subscription by passing the product and price into the request.
Note: A customer must exist before creating a subscription. See Customer Overview for details.
curl -X POST 'https://api.breeze.cash/v1/subscriptions' \
-u "YOUR_API_KEY:" \
--header 'Content-Type: application/json' \
--data-raw '{
"clientReferenceId": "your-unique-subscription-reference-id",
"productId": "prd_abc123xyz",
"priceId": "prc_abc123xyz",
"customer": {
"id": "cust_123xyz"
}
}'Continue reading here: https://docs.breeze.cash/docs/quick-start-subscription#/
Error codes — For a complete list of errors returned by the product endpoints, see the Error Reference.
Updated 10 days ago
