> ## Documentation Index
> Fetch the complete documentation index at: https://docs.notifique.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# Pricing lookup

> GET /v1/pricing returns plans, per-channel prices, and the official WhatsApp table by country, with no authentication.

<Tip>
  It's the platform's **price tag**, always showing today's value. No API Key needed: you can call it straight from a browser, a static page, or a script.
</Tip>

## In short

* **One public endpoint**, no authentication: `GET /v1/pricing`.
* Returns **plans**, **per-channel prices**, the official WhatsApp **software fee**, and the table by **country and category**.
* Includes `updatedAt`, the date the prices took effect.

***

## Request

No `Authorization`, no workspace, no special header.

```http theme={null}
GET /v1/pricing
Host: api.notifique.dev
```

```bash theme={null}
curl https://api.notifique.dev/v1/pricing
```

## Response (200)

Abbreviated example with illustrative values. In the real response, `plans`, `skus`, and `rates` come complete (the country table has over a thousand rows).

```json theme={null}
{
  "success": true,
  "data": {
    "version": 12,
    "updatedAt": "2026-07-29T03:10:00.000Z",
    "currency": "BRL",
    "creditValueCents": 0.1,
    "plans": [
      { "plan": "BASIC", "credits": 55000, "priceCents": 4990, "maxInstances": 1 },
      { "plan": "PRO", "credits": 92000, "priceCents": 7990, "maxInstances": 2 },
      { "plan": "BUSINESS", "credits": 580000, "priceCents": 49990, "maxInstances": 9 }
    ],
    "extraInstanceSlot": { "priceCents": 790, "maxSlots": 20 },
    "skus": [
      { "code": "PUSH_SEND", "label": "Push", "credits": 2, "paygCents": 1 },
      { "code": "SMS_STANDARD", "label": "SMS Standard", "credits": 100, "paygCents": 12 },
      { "code": "RCS_RICH", "label": "RCS (card, carrossel, arquivo)", "credits": 200, "paygCents": 25 }
    ],
    "whatsappOfficial": {
      "fallbackCountry": "ZZ",
      "softwareFee": { "credits": 70, "paygCents": 9 },
      "countries": [
        { "code": "BR", "name": "Brazil", "callingCode": "55" },
        { "code": "US", "name": "United States", "callingCode": "1" }
      ],
      "rates": [
        {
          "country": "BR",
          "countryName": "Brazil",
          "callingCode": "55",
          "category": "MARKETING",
          "credits": 519,
          "paygCents": 63,
          "available": true,
          "unavailableReason": null
        },
        {
          "country": "US",
          "countryName": "United States",
          "callingCode": "1",
          "category": "MARKETING",
          "credits": 70,
          "paygCents": 9,
          "available": false,
          "unavailableReason": "Meta não entrega mensagens de marketing para números dos EUA (erro 131049)."
        }
      ]
    }
  }
}
```

## Fields

| Field                              | What it is                                                                                     |
| ---------------------------------- | ---------------------------------------------------------------------------------------------- |
| `version`                          | Active table version. `null` while SKU pricing is not enabled                                  |
| `updatedAt`                        | When this table took effect. This is the "last updated" you show on your page                  |
| `currency`                         | Always `"BRL"`                                                                                 |
| `creditValueCents`                 | Value of one credit in cents (`0.1`, that is R\$ 0.001)                                        |
| `plans[]`                          | `plan`, monthly `credits`, `priceCents`, and `maxInstances` **per channel**                    |
| `extraInstanceSlot`                | `priceCents` for the extra slot and `maxSlots` per workspace                                   |
| `skus[]`                           | Fixed price per channel: `code`, `label`, `credits`, and `paygCents`                           |
| `whatsappOfficial.fallbackCountry` | Reserve country when the destination has no row of its own (`ZZ`)                              |
| `whatsappOfficial.softwareFee`     | `credits` and `paygCents` charged per send when **you pay Meta directly** for the conversation |
| `whatsappOfficial.countries[]`     | Countries only, to build a picker without scanning every rate                                  |
| `whatsappOfficial.rates[]`         | One row per country × category, with `credits`, `paygCents`, and availability                  |

<Info>
  `credits` is what comes out of the plan; `paygCents` is what comes out of the BRL balance. To convert credits to BRL, multiply by `creditValueCents` and divide by 100.
</Info>

<Warning>
  **Which of the two prices to use.** On a Tech Provider or BYOK connection (the default path), Meta bills conversations directly to you and Notifique charges only `softwareFee`; the `rates` rows are **not charged**, because they already include the Meta rate that's on your invoice. The `rates` rows apply to **BSP** connections, where Notifique is the one paying Meta. See [Official WhatsApp by country](/en/guides/precos/whatsapp-oficial-por-pais).
</Warning>

<Note>
  `rates` is still useful on the default path for one thing: knowing whether the destination **accepts** the category. Availability applies in both models.
</Note>

<Note>
  A row with `available: false` is a destination Meta does not accept in that category. The reason comes in `unavailableReason`, and the send is refused with **400** `DESTINATION_NOT_AVAILABLE`. See [Official WhatsApp by country](/en/guides/precos/whatsapp-oficial-por-pais).
</Note>

***

## Cache and usage limit

The response is the same for everyone and changes at most once a day, so it's worth caching:

* `Cache-Control: public, max-age=300, stale-while-revalidate=3600`
* Content-based `ETag`, and **304** when you send the same value back in `If-None-Match`
* `Access-Control-Allow-Origin: *`, so you can call it straight from the browser

<Warning>
  The default limit is **120 requests per minute per IP**. Go over it and the API returns **429** with `RATE_LIMIT_EXCEEDED` and a `Retry-After: 60` header. Cache the response instead of fetching it on every page load.
</Warning>

```json theme={null}
{
  "success": false,
  "error": "Too Many Requests",
  "message": "Pricing rate limit exceeded. Try again in a minute.",
  "code": "RATE_LIMIT_EXCEEDED"
}
```

***

## Next steps

* [Official WhatsApp by country](/en/guides/precos/whatsapp-oficial-por-pais): software fee, country, and category
* [Billing](/en/guides/introducao/cobranca-e-pague-pelo-uso): credits, plans, and pay-as-you-go
* [Error responses](/en/guides/conceitos/resposta-de-erros): HTTP codes and `code`
