# Erreur WhatsApp 80007 : limite d'appels du compte, solution

URL: https://wa.genuka.com/docs/errors/80007
Language: French

> Erreur WhatsApp 80007 : le compte WhatsApp Business a atteint sa limite d'appels API (200 ou 5 000 par heure). Quels appels comptent, comment l'éviter.

L'erreur WhatsApp 80007 signifie qu'une application a fait trop d'appels sur un même compte
WhatsApp Business dans l'heure : 200 par défaut, 5 000 pour un compte actif qui a un numéro
enregistré. Les appels comptés sont ceux de gestion du compte, comme les templates et les numéros,
pas l'envoi de messages. Attendez, puis appelez moins souvent.

## Que signifie l'erreur 80007 ?

Meta la range parmi les erreurs de limitation de débit :

> « The WhatsApp Business Account has reached its rate limit. »
> — [Meta, codes d'erreur de la Cloud API](https://developers.facebook.com/documentation/business-messaging/whatsapp/support/error-codes#throttling-errors)

Solution proposée : consulter les limites d'appels du compte WhatsApp Business, puis « try again
later or reduce the frequency or amount of API queries the app is making ».

Ces limites sont décrites dans la présentation de la plateforme : les requêtes d'une app sur un
compte se comptent sur une heure glissante, à raison de 200 par heure, par app et par compte par
défaut, et de 5 000 par heure pour un compte actif dont au moins un numéro est enregistré
([Meta, About the platform](https://developers.facebook.com/documentation/business-messaging/whatsapp/about-the-platform#rate-limits)).
Elles portent sur ces endpoints :

| Requête                 | Endpoint                              |
| ----------------------- | ------------------------------------- |
| `GET`                   | `/{WABA_ID}`                          |
| `GET`, `POST`, `DELETE` | `/{WABA_ID}/assigned_users`           |
| `GET`                   | `/{WABA_ID}/phone_numbers`            |
| `GET`, `POST`, `DELETE` | `/{WABA_ID}/message_templates`        |
| `GET`, `POST`, `DELETE` | `/{WABA_ID}/subscribed_apps`          |
| `GET`                   | `/{WABA_TO_NUMBER_CURRENT_STATUS_ID}` |

La page générale des limites de Graph associe par ailleurs le code `80008` au type de limite
« WhatsApp Business Management API ». Traitez les deux de la même façon
([Meta, Rate limits](https://developers.facebook.com/docs/graph-api/overview/rate-limiting)).

## Quand l'erreur 80007 apparaît-elle ?

* **Un polling des templates.** Relire la liste des templates toutes les minutes pour savoir si
  l'un d'eux est approuvé coûte 60 appels par heure sur ce compte, avant tout le reste.
* **Une création de templates en masse.** Un script qui soumet, supprime et recrée des dizaines de
  templates d'affilée.
* **Un compte encore inactif.** Tant qu'aucun numéro n'y est enregistré, le compte reste à 200
  appels par heure.

### Où la voir dans Genuka WA ?

La limite se compte par application **et** par compte WhatsApp. Avec Genuka WA, l'application est
celle de Genuka : tous les appels faits sur le compte d'un client comptent ensemble, qu'ils viennent
de votre code, du tableau de bord ou du portail client. En revanche, le compte d'un client ne
consomme pas la limite du compte d'un autre.

Côté Genuka WA, ces appels-là passent par :

| Endpoint Genuka WA                                               | Appel Meta compté                                                        |
| ---------------------------------------------------------------- | ------------------------------------------------------------------------ |
| `POST /api/v1/templates`                                         | `POST /{WABA_ID}/message_templates`                                      |
| `DELETE /api/v1/templates/{id}`                                  | `DELETE /{WABA_ID}/message_templates`                                    |
| `POST /api/v1/templates/sync`, `GET /api/v1/templates?sync=true` | `GET /{WABA_ID}/message_templates`, une fois par compte WhatsApp couvert |

Genuka range le code 80007 dans la classe `retryable`. Une création de template refusée revient
en `422 meta_rejected` avec `meta.retryable: true`, ou en `502` si Meta a répondu par un 429 ou un
5xx. Une actualisation reste un `200` tant qu'au moins un compte a répondu : le compte limité y
figure avec `"ok": false` et le motif de Meta dans `error`. Si tous les comptes ont refusé, la
réponse est un `502 meta_rejected`.

Un `502` vous arrive sans corps JSON : notre CDN le remplace par la seule ligne `error code: 502`
([référence API](https://wa.genuka.com/docs/api)). Lisez le statut HTTP avant le corps, et traitez ce cas comme un échec
passager.

## Comment corriger l'erreur 80007 ?

1. **Arrêtez de demander ce qui arrive tout seul.** La revue d'un template arrive par webhook,
   événement `message_template_status_update` ([Webhooks](https://wa.genuka.com/docs/webhooks)). Abonnez-y un endpoint et
   supprimez la boucle de lecture.
2. **Gardez l'actualisation pour la réparation.** `POST /api/v1/templates/sync` sert à rattraper un
   webhook manqué : une fois par heure suffit largement, et `companyId` ou `connectionId` la limitent
   au seul compte concerné ([référence API](https://wa.genuka.com/docs/api#templates)).
3. **Réessayez plus tard ce qui a été refusé.** Une création de template marquée `retryable` peut être
   soumise de nouveau après un délai ; la limite se libère au fil de l'heure glissante.
4. **Étalez les créations en masse.** Soumettez les templates d'un nouveau client par petits lots
   plutôt qu'en une rafale.

Si vous appelez Graph vous-même, l'en-tête `X-Business-Use-Case-Usage` donne le pourcentage
d'appels consommés (`call_count`) et, une fois limité, `estimated_time_to_regain_access`, le nombre
de minutes avant le retour à la normale
([Meta, Rate limits](https://developers.facebook.com/docs/graph-api/overview/rate-limiting)).

**Node.js**

```ts
// Une actualisation par heure, limitée à un client, qui signale les comptes en échec.
const response = await fetch("https://wa.genuka.com/api/v1/templates/sync", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${process.env.GENUKA_WA_API_KEY}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({ companyId: "cmp_1" }),
});
// Un 502 arrive sans JSON : notre CDN le remplace par « error code: 502 ».
const json = await response.json().catch(() => null);

if (!response.ok) {
  console.error("Aucun compte n'a répondu", response.status, json?.message ?? "");
} else {
  for (const waba of json.data.wabas.filter((w: { ok: boolean }) => !w.ok)) {
    console.warn("Compte non actualisé, à reprendre à l'heure suivante", waba.wabaId, waba.error);
  }
}
```

**Python**

```python
import os
import requests

response = requests.post(
    "https://wa.genuka.com/api/v1/templates/sync",
    headers={"Authorization": f"Bearer {os.environ['GENUKA_WA_API_KEY']}"},
    json={"companyId": "cmp_1"},
    timeout=60,
)
try:
    body = response.json()
except ValueError:
    body = {}  # un 502 arrive sans JSON : notre CDN le remplace par « error code: 502 »

if not response.ok:
    print("Aucun compte n'a répondu", response.status_code, body.get("message"))
else:
    for waba in body["data"]["wabas"]:
        if not waba["ok"]:
            print("Compte non actualisé, à reprendre à l'heure suivante", waba["wabaId"], waba.get("error"))
```

**PHP**

```php
<?php
$ch = curl_init("https://wa.genuka.com/api/v1/templates/sync");
curl_setopt_array($ch, [
    CURLOPT_POST => true,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_USERAGENT => "acme-crm/1.0 (+https://example.com)",
    CURLOPT_HTTPHEADER => [
        "Authorization: Bearer " . getenv("GENUKA_WA_API_KEY"),
        "Content-Type: application/json",
    ],
    CURLOPT_POSTFIELDS => json_encode(["companyId" => "cmp_1"]),
]);
$raw = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE); // 0 si la requête n'a pas abouti
curl_close($ch);
// Un 502 arrive sans JSON : notre CDN le remplace par « error code: 502 ».
$body = is_string($raw) ? json_decode($raw, true) : null;

if ($status === 0 || $status >= 400 || !is_array($body)) {
    error_log("Aucun compte n'a répondu : HTTP $status " . ($body["message"] ?? ""));
} else {
    foreach ($body["data"]["wabas"] as $waba) {
        if (!$waba["ok"]) error_log("Compte non actualisé : {$waba['wabaId']} " . ($waba["error"] ?? ""));
    }
}
```

**curl**

```bash
# Un 502 arrive en texte brut (« error code: 502 ») : jq échoue alors à le lire.
curl -s -X POST https://wa.genuka.com/api/v1/templates/sync \
  -H "Authorization: Bearer $GENUKA_WA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "companyId": "cmp_1" }' \
  | jq '.data.wabas[] | select(.ok == false)'
```

## Comment éviter l'erreur 80007 ?

* **Webhooks d'abord.** Un statut de template, un changement de qualité ou une mise à jour du
  compte vous parviennent sans que vous ayez à les demander.
* **Une actualisation planifiée, pas déclenchée par l'affichage.** Un tableau de bord qui relit
  Meta à chaque ouverture multiplie les appels par le nombre de visiteurs.
* **Connectez le numéro avant de créer les templates.** Un compte actif avec un numéro enregistré
  dispose de 5 000 appels par heure au lieu de 200.

## Quels codes sont liés ?

* [4](https://wa.genuka.com/docs/errors/4) : la limite d'appels de l'application tout entière.
* [130429](https://wa.genuka.com/docs/errors/130429) : le débit d'envoi de messages d'un numéro.
* `80008` : le code que la page des limites de Graph associe à l'API WhatsApp Business Management.

## FAQ

### Pourquoi mon compte est-il limité à 200 appels par heure et pas à 5 000 ?

Meta réserve les 5 000 appels par heure aux comptes actifs dont au moins un numéro est enregistré.
Un compte créé sans numéro, ou dont le numéro n'est pas encore enregistré, reste à 200.

### L'envoi de messages compte-t-il dans cette limite ?

Les endpoints que Meta liste pour cette limite sont ceux de gestion du compte, pas l'envoi. Les
envois ont leurs propres plafonds, dont le débit par numéro, code [130429](https://wa.genuka.com/docs/errors/130429).

### Le compte d'un client peut-il épuiser la limite d'un autre ?

Non. La limite se compte par application et par compte WhatsApp : chaque compte a la sienne.

## Sources

* [Meta — Error codes](https://developers.facebook.com/documentation/business-messaging/whatsapp/support/error-codes)
* [Meta — About the platform, rate limits](https://developers.facebook.com/documentation/business-messaging/whatsapp/about-the-platform#rate-limits)
* [Meta — Graph API, Rate limits](https://developers.facebook.com/docs/graph-api/overview/rate-limiting)
