# 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.

Returns 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

```http
GET /api/v1/public/acme-app/pricing_table
```

Response (`200`):

```json
{
  "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`](https://ownrecord.io/docs/reference/errors.md#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](https://ownrecord.io/docs/reference.md#common-errors): [`validation_failed`](https://ownrecord.io/docs/reference/errors.md#validation_failed), [`api_version_unsupported`](https://ownrecord.io/docs/reference/errors.md#api_version_unsupported), [`scope_required`](https://ownrecord.io/docs/reference/errors.md#scope_required), [`dry_run_not_supported`](https://ownrecord.io/docs/reference/errors.md#dry_run_not_supported), [`rate_limited`](https://ownrecord.io/docs/reference/errors.md#rate_limited), [`internal_error`](https://ownrecord.io/docs/reference/errors.md#internal_error).
