Get the pricing table
The products.pricing_table operation: GET /api/v1/public/{brandSlug}/pricing_table in the REST API and the products_pricing_table tool in the MCP server.
/api/v1/public/{brandSlug}/pricing_tableReturns the brand's pricing table: its active products of kind: plan, in display order, with their active
prices and the features each plan grants (by name). Use it to render plans on your own site; it needs no API
key and is rate-limited per IP address.
Only what customers may see is included: no nicknames, metadata or internal fields. Archived products and prices are left out.
At a glance
- REST:
GET /api/v1/public/{brandSlug}/pricing_table - MCP tool:
products_pricing_table - Operation ID:
products.pricing_table - Scope: Brand
- Permission:
catalog:read - Risk tier:
read - Dry run: Not supported
- Idempotency: Not needed (read only)
- Modes: Test and live
- Authentication: None (a public endpoint, rate-limited per IP address)
- Since: M4
Request
Path parameters
| Field | Type | Description |
|---|---|---|
brandSlug | string | The brand's slug, e.g. acme-app. |
Query parameters
This operation takes no query parameters.
Response
200 OK with a JSON object:
| Field | Type | Description |
|---|---|---|
object | "pricing_table" | |
brand | object | |
brand.id | brd_… ID | |
brand.slug | string | |
brand.name | string | |
livemode | boolean | |
products | array of object | |
products[].id | prod_… ID | |
products[].name | string | |
products[].description | string or null | |
products[].images | array of string | |
products[].highlighted | boolean | |
products[].displayOrder | integer or null | |
products[].features | array of object | What the plan grants, with each feature's name. |
products[].features[].key | string | |
products[].features[].name | string | |
products[].features[].type | one of boolean, limit, enum | |
products[].features[].value | boolean or number or string | |
products[].prices | array of object | |
products[].prices[].id | price_… ID | |
products[].prices[].lookupKey | string or null | |
products[].prices[].type | one of one_time, recurring, credit_pack | |
products[].prices[].currency | string | |
products[].prices[].taxBehavior | one of inclusive, exclusive | |
products[].prices[].amount | money or null | Fixed one-time or credit-pack amount. |
products[].prices[].customAmount | object or null | The range a buyer may choose from (custom-amount prices). |
products[].prices[].creditPack | object or null | |
products[].prices[].recurring | object or null |
Examples
Acme App's plans
GET /api/v1/public/acme-app/pricing_table
Response (200):
{
"object": "pricing_table",
"brand": {
"id": "brd_01m4tx5nj8emwbyf7y9vcf47x4",
"slug": "acme-app",
"name": "Acme App"
},
"livemode": true,
"products": [
{
"id": "prod_01m4tx5nj8emwbyf7y9vcf47y0",
"name": "Pro",
"description": "For growing teams.",
"images": [],
"highlighted": true,
"displayOrder": 2,
"features": [
{
"key": "seats.max",
"name": "Seats",
"type": "limit",
"value": 10
},
{
"key": "feature.export",
"name": "Export",
"type": "boolean",
"value": true
}
],
"prices": [
{
"id": "price_01m4tx5nj8emwbyf7y9vcf47y2",
"lookupKey": "pro_monthly",
"type": "recurring",
"currency": "EUR",
"taxBehavior": "inclusive",
"amount": null,
"customAmount": null,
"creditPack": null,
"recurring": {
"interval": "month",
"intervalCount": 1,
"usageType": "licensed",
"billingScheme": "tiered",
"unitAmount": null,
"tiersMode": "graduated",
"tiers": [
{
"upTo": 10,
"unitAmountMicros": "12000000",
"flatAmount": null
},
{
"upTo": "inf",
"unitAmountMicros": "9000000",
"flatAmount": null
}
],
"trialDays": 14,
"includedCredits": null,
"metered": null
}
}
]
}
]
}
Errors
| Code | HTTP status | When | What to do |
|---|---|---|---|
resource_not_found | 404 | No brand with this slug is visible to the request. | Check the ID and that your credentials are scoped to the right organization, entity, brand and mode. |
It can also return these common errors: validation_failed, api_version_unsupported, scope_required, dry_run_not_supported, rate_limited, internal_error.