Skip to main content

Pay a number’s extra-number charge

An extra number is a WhatsApp number past the capacity your workspace has paid for. It is charged when the number first connects — see Extra numbers. When that charge is refused (card declined, no balance), the number stays connected but sending from it is blocked until the charge is paid. POST /v1/numbers/{id}/pay charges it now — wallet credits first, the remainder on the saved card — and lifts the block.
Response:
Requires a tenant-scoped key — the same rule as POST /v1/subscription/extra-numbers. With an OAuth / MCP token, only the workspace Owner may pay (billing:manage) — 403 PERMISSION_DENIED otherwise.
This call charges. With credits in the wallet or a saved card, the prorated price of one extra number is taken on the spot.

When to use it

  • When GET /v1/numbers or GET /v1/numbers/{id} shows extraChargeUnpaidSince set on a number.
  • When POST /v1/messages/send answers 409 NUMBER_BLOCKED with reason: "extra_charge_unpaid".
  • Right after you fixed what refused the charge — a new card, for example — and do not want to wait.
You do not have to call it. On a paid plan, a wallet top-up or a newly saved card retries the charge of every blocked number of the workspace automatically. On the Free plan this call cannot pay — see PLAN_NUMBER_LIMIT_REACHED below. In the dashboard, the workspace owner can also use Pay now on the Numbers page.

How to know a number is blocked

GET /v1/numbers and GET /v1/numbers/{id} carry two fields on every number: These fields are not part of health. A blocked number keeps its state, can have health.sendable: true, and never shows extra_charge_unpaid in health.code. See List & get numbers.

Request parameters

No request body.

Response

Success (200)

Errors

Branch on code, never on the HTTP status: three of the refusals are 402. Error body: { "error": "<message>", "code": "<CODE>", … }.
  • The PAYMENT_FAILED and INSUFFICIENT_FUNDS bodies also carry proratedTotal and currency — the amount that was attempted. INSUFFICIENT_FUNDS adds walletReason. Their error is a human-readable message in Portuguese.
  • The PLAN_NUMBER_LIMIT_REACHED, 502, 409 and 404 bodies carry only error and code. Their error is a bilingual sentence, English | Português.
After a 402 the number stays blocked. After a 502 nothing changes: a number that was already blocked stays blocked until a retry goes through, and a processor failure never blocks a number by itself.
502 PAYMENT_PROVIDER_ERROR does not mean “nothing was charged”. The request to the processor failed or its response was lost, so the charge may have completed on the processor’s side. The automatic retry repeats the same charge request, which lets the processor recognise a charge it already took instead of taking it again. Check your statement before paying again.

What happens if it stays unpaid

  • A number connected by QR code that stays unpaid for 7 days is disconnected at extraChargeDisconnectAt: its device is logged out and it stops counting toward your capacity. You get a reminder 2 days before. Connecting it again is a new first connection, charged like any other.
  • A Meta Cloud API number is never disconnected. It stays blocked for sending until it is paid.

Notes

  • The call is idempotent: once nothing is owed, it answers not_required and charges nothing.
  • Messages queued before the block are not sent: they fail and show NUMBER_BLOCKED in Log error codes. Send them again after paying.
  • Receiving is not affected. The block is on sending only.