# Estado de envio: este número pode iniciar conversas?

`GET /v1/connections/{id}/sending-status`

Antes de uma campanha, `GET /v1/connections/{id}/sending-status` (`{id}` = `conn_…` ou o seu `externalId`) diz se é preciso pausar **antes** de acumular rejeições e o que o seu cliente precisa corrigir. Vem do que já lemos da Meta: não chama a Meta.

**`canSend`**: `available`, `limited`, `blocked` ou `unknown` (ainda não lido), com `canSendReason`. Responder dentro das 24 h de um cliente não depende disso.

**Por quê.** `entities[]` (conta do WhatsApp, portfólio, app e número, cada um com o seu veredito e os códigos da Meta) e `reasonCodes[]` com o código original: `141006` forma de pagamento, `141010` verificação da empresa, `131042` enquanto a Meta continuar rejeitando envios pelo pagamento. Também `businessVerification`, `accountReviewStatus`, `qualityRating`, `payment` (`ok`, `missing` ou `unknown`; nunca dados de cartão) e `links` para a página da Meta que resolve.

**Limite diário.** `messagingLimit.tier` e `dailyLimit`: a Meta aplica ao **portfólio**, compartilhado por todos os seus números e provedores. O consumo nas 24 h móveis e a próxima liberação a Meta não expõe: vêm `unknown`, nunca aproximados. O mesmo vale para `payment.fundingSource` e `payment.creditLine`.

**Reler.** Quando o seu cliente disser que já resolveu: `POST /v1/connections/{id}/sending-status/refresh` relê na Meta (só leitura), uma vez por número a cada 10 min; antes disso, `429 RATE_LIMITED` com `Retry-After`.

**Avisos.** Assine no webhook `connection.sending_status_changed` (pelo nome) e receba cada mudança com `changed`, a assinatura anterior e o estado completo.

## Exemplos

### cURL

```bash
# 1) before a campaign: can this number start conversations?
curl https://api.waiaconnect.com/v1/connections/conn_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/sending-status -H "Authorization: Bearer wc_live_YOUR_API_KEY"
# → { "sendingStatus": { "canSend": "blocked", "reasonCodes": [141006],
#       "payment": { "status": "missing", "owner": "client", … },
#       "messagingLimit": { "tier": "TIER_250", "dailyLimit": 250, "used": "unknown", … }, … } }

# 2) your customer says they fixed it: re-read from Meta (once per number every 10 min)
curl -X POST https://api.waiaconnect.com/v1/connections/conn_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/sending-status/refresh -H "Authorization: Bearer wc_live_YOUR_API_KEY"
```

### Node.js

```javascript
const H = { "Authorization": "Bearer wc_live_YOUR_API_KEY" };
const { sendingStatus: s } = await (await fetch("https://api.waiaconnect.com/v1/connections/conn_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/sending-status", { headers: H })).json();
if (s.canSend === "blocked" || s.canSend === "limited") {
  // pause the campaign and tell your customer what to fix
  console.log(s.reasonCodes, s.payment.status, s.businessVerification.status, s.links.paymentSettings);
}
```

### PHP

```php
<?php
$ch = curl_init("https://api.waiaconnect.com/v1/connections/conn_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/sending-status");
curl_setopt_array($ch, [CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => ["Authorization: Bearer wc_live_YOUR_API_KEY"]]);
$s = json_decode(curl_exec($ch), true)["sendingStatus"];
if (in_array($s["canSend"], ["blocked", "limited"])) {
  // pause the campaign; $s["reasonCodes"], $s["payment"]["status"], $s["links"]["paymentSettings"]
}
```

### Python

```python
import requests
H = {"Authorization": "Bearer wc_live_YOUR_API_KEY"}
s = requests.get("https://api.waiaconnect.com/v1/connections/conn_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/sending-status", headers=H).json()["sendingStatus"]
if s["canSend"] in ("blocked", "limited"):
    print(s["reasonCodes"], s["payment"]["status"], s["links"]["paymentSettings"])  # pause + guide your customer
# after your customer fixed it (once per number every 10 min):
requests.post("https://api.waiaconnect.com/v1/connections/conn_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/sending-status/refresh", headers=H)
```

## Notas

- Um número de outra conta recebe o mesmo `404 CONNECTION_NOT_FOUND` de um que não existe.
- `readAt` diz quando foi lido; é relido a cada 12 h e com o refresh.
- `message.status` traz o código original da Meta (`errors[]`, com `subcode` numa rejeição do envio), a etapa (`stage`: `send` ou `delivery`) e o `pricing` da Meta (`billable`, `category`, `type`) para conciliar.
