# Erreur WhatsApp 200 : accès refusé (200-299), solution

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

> Erreur WhatsApp 200 sur la Cloud API : jeton absent, permission retirée ou utilisateur système sans accès au compte. Diagnostic et correction.

L'erreur WhatsApp 200, comme toute la plage 200 à 299, signifie que l'appel n'a pas les droits
nécessaires : jeton absent, permission non accordée ou retirée, ou utilisateur système sans accès au
compte WhatsApp visé. Rien à voir avec le statut HTTP 200. Elle se corrige en rendant l'accès, pas
en réessayant.

## Que signifie l'erreur 200 ?

Meta décrit deux entrées dans ses erreurs d'autorisation
([Meta, codes d'erreur de la Cloud API](https://developers.facebook.com/documentation/business-messaging/whatsapp/support/error-codes#authorization-errors)) :

| Code          | `details` selon Meta                                                                                                                                                                               | Ce que Meta conseille                                                                              |
| ------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------- |
| `200`         | « No access token was provided. » L'API répond alors « Provide valid app ID », sur certains endpoints `GET` comme `whatsapp_business_profile` ; d'autres endpoints renvoient 190 ou 104 à la place | « Ensure your request includes a valid access token. » Meta précise que ce cas est distinct du 190 |
| `200` à `299` | « Permission is either not granted or has been removed. »                                                                                                                                          | Vérifier dans le débogueur de jetons que l'app a les permissions exigées par l'endpoint            |

Le guide des jetons de Meta ajoute le cas le plus courant en production : la plupart des endpoints
vérifient que l'utilisateur derrière le jeton a accès à la ressource demandée, et refusent sinon
avec le code 200, « à ne pas confondre avec le statut HTTP 200 »
([Meta, Access tokens](https://developers.facebook.com/documentation/business-messaging/whatsapp/access-tokens#business-asset-access)).
Graph appelle cette plage « API Permission »
([Meta, Graph API, gestion des erreurs](https://developers.facebook.com/docs/graph-api/guides/error-handling)).

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

* **L'utilisateur système n'est pas assigné au compte.** Un utilisateur système « employé » doit
  recevoir un accès partiel ou complet au compte WhatsApp **et** au compte de messagerie : l'accès
  au second seul ne suffit pas (même page).
* **Une permission manque au jeton.** Désenregistrer un numéro sans `whatsapp_business_management`
  renvoie 200, par exemple
  ([Meta, Registration](https://developers.facebook.com/documentation/business-messaging/whatsapp/business-phone-numbers/registration)).
* **La requête part sans jeton**, typiquement un `GET` sur le profil professionnel.
* **L'entreprise a cessé de partager son compte avec le partenaire.** Meta émet alors l'événement
  `PARTNER_REMOVED` ([Meta, webhook account\_update](https://developers.facebook.com/documentation/business-messaging/whatsapp/webhooks/reference/account_update)),
  et l'utilisateur système du partenaire perd son accès au compte.

### Où la voir dans Genuka WA ?

Avec Genuka WA, le dernier cas est fréquent : votre client a retiré l'accès de Genuka à son compte
WhatsApp, dans son Business Manager ou, pour un numéro en coexistence, depuis l'application
WhatsApp Business ([Meta, coexistence](https://developers.facebook.com/documentation/business-messaging/whatsapp/embedded-signup/onboarding-business-app-users/)). Genuka reçoit le
`PARTNER_REMOVED`, passe la connexion en `disconnected` et relaie l'événement `account_update` à
vos [webhooks](https://wa.genuka.com/docs/webhooks). La même situation peut aussi revenir sous le code 100 avec le
sous-code 33, « … cannot be loaded due to missing permissions », voir
[erreur 100](https://wa.genuka.com/docs/errors/100).

Genuka ne range pas les codes 200 à 299 dans une classe dédiée : la classe découle du statut HTTP
renvoyé par Meta, `config` sur un 401 ou un 403, `unknown` sinon. Dans les deux cas, le refus n'est
pas réessayable.

| Canal                     | Ce que vous recevez                                            |
| ------------------------- | -------------------------------------------------------------- |
| `POST /api/v1/messages`   | `409 send_config` ou `400 send_unknown`, avec `meta.code: 200` |
| `POST /api/v1/templates`  | `403` ou `422`, `"error": "meta_rejected"`                     |
| `GET /api/v1/connections` | `"status": "disconnected"` sur le numéro concerné              |

Un numéro en coexistence peut aussi passer `offboarded` : Meta a signalé qu'il n'est plus relié à
l'API, par exemple après un changement d'appareil suivi d'un réenregistrement
([Meta, coexistence](https://developers.facebook.com/documentation/business-messaging/whatsapp/embedded-signup/onboarding-business-app-users/)). Genuka refuse alors les envois lui-même, avant
d'appeler Meta : `409 send_config`, avec un message qui nomme le retrait (« was offboarded by the
merchant… ») et sans `meta.code`. Un numéro que vous avez libéré de votre forfait est refusé de la
même façon, en `409 number_released`.

## Comment corriger l'erreur 200 ?

### Si vous passez par Genuka WA

1. **Regardez l'état du numéro.**

   ```bash title="GET /api/v1/connections"
   curl "https://wa.genuka.com/api/v1/connections?companyId=cmp_123" \
     -H "Authorization: Bearer $GENUKA_WA_API_KEY"
   ```

   ```json title="Réponse (extrait)"
   { "data": [ { "id": "con_1", "companyId": "cmp_123", "displayPhoneNumber": "+237 6 90 …",
                 "qualityRating": "GREEN", "status": "disconnected" } ] }
   ```

2. **S'il est `disconnected`, cherchez pourquoi avant de demander une reconnexion.** Ce statut dit
   que Meta a signalé le compte comme n'étant plus partagé avec Genuka, ou supprimé, ou que vous avez
   libéré le numéro vous-même. Un client qui a retiré l'accès repasse par le même lien
   `/connect/{votre-slug}` : l'accès revient sur la même fiche, messages, templates et statistiques
   conservés, sans nouvelle place dans votre forfait ([Connecter un numéro](https://wa.genuka.com/docs/onboarding)). Un
   numéro libéré demande de nouveau une place libre. Un compte supprimé, ou désactivé par Meta
   ([erreur 368](https://wa.genuka.com/docs/errors/368)), ne se rétablit pas par une reconnexion : l'événement
   `account_update` relayé à vos webhooks dit de quel cas il s'agit. S'il est `offboarded`, suivez le
   [guide coexistence](https://wa.genuka.com/docs/guides/coexistence).

3. **S'il est toujours `connected`, écrivez au support Genuka** avec l'en-tête `x-request-id` de la
   réponse et `meta.traceId`. Ce statut reflète les derniers événements reçus de Meta : il ne prouve
   pas que l'accès est intact.

### Si vous appelez la Cloud API avec votre propre jeton

1. **Assignez l'utilisateur système aux deux comptes.** Dans Meta Business Suite : paramètres du
   portefeuille, **Accounts > WhatsApp accounts**, choisissez le compte, onglet **People**,
   **+Add people**, puis l'utilisateur système et son niveau d'accès. Recommencez dans
   **Accounts > Messaging accounts**
   ([Meta, Access tokens](https://developers.facebook.com/documentation/business-messaging/whatsapp/access-tokens#business-asset-access)).
2. **Vérifiez les permissions du jeton** dans le
   [débogueur de jetons](https://developers.facebook.com/tools/debug/accesstoken/) :
   `whatsapp_business_management` et `whatsapp_business_messaging`, plus `business_management` si
   vous gérez des actifs du portefeuille.
3. **Ne comptez pas sur la cascade de l'API.** Un accès accordé par l'API sur le compte de messagerie
   s'applique aussi au compte WhatsApp lié, mais Meta qualifie ce comportement de provisoire, et
   Meta Business Suite ne le reproduit pas. Assignez les deux comptes explicitement (même page).

## Comment éviter l'erreur 200 ?

* **Abonnez un endpoint à `account_update`.** Un `PARTNER_REMOVED` vous prévient au moment où le
  client retire l'accès, avant que vos envois n'échouent.
* **Expliquez à vos clients ce que le retrait implique.** Retirer Genuka de son Business Manager
  coupe l'API sur tous les numéros de ce compte WhatsApp.
* **Si vous gérez vos propres jetons**, Meta indique qu'un utilisateur système administrateur a
  par défaut accès à tous les comptes WhatsApp possédés par votre portefeuille ou partagés avec
  lui ; un utilisateur employé doit être assigné compte par compte.

## Quels codes sont liés ?

* [190](https://wa.genuka.com/docs/errors/190) : le jeton a expiré ou a été invalidé.
* [10](https://wa.genuka.com/docs/errors/10) : permission non accordée ou retirée, y compris les templates OTP d'une
  entreprise non vérifiée.
* [3](https://wa.genuka.com/docs/errors/3) : capacité ou permission manquante pour cet endpoint.
* [0](https://wa.genuka.com/docs/errors/0) : Meta n'a pas pu authentifier l'utilisateur de l'app.

## FAQ

### L'erreur 200 a-t-elle un rapport avec le statut HTTP 200 ?

Aucun. C'est un code d'erreur de Meta, renvoyé dans le champ `code` d'une réponse en échec. Meta
le précise lui-même dans sa documentation.

### Mon client a retiré Genuka par erreur : que doit-il faire ?

Repasser par votre lien de connexion. Le numéro revient sur la même fiche, avec son historique, et
sans consommer de place supplémentaire.

### Pourquoi l'erreur ne touche-t-elle qu'une partie de mes numéros ?

Parce que l'accès se donne compte WhatsApp par compte WhatsApp. Les numéros d'un client qui a retiré
l'accès échouent ; ceux des autres clients continuent.

### Faut-il réessayer ?

Non. Tant que l'accès n'est pas rétabli, chaque nouvel appel produira la même erreur.

## Sources

* [Meta — Error codes](https://developers.facebook.com/documentation/business-messaging/whatsapp/support/error-codes)
* [Meta — Access tokens, business asset access](https://developers.facebook.com/documentation/business-messaging/whatsapp/access-tokens#business-asset-access)
* [Meta — Register a business phone number](https://developers.facebook.com/documentation/business-messaging/whatsapp/business-phone-numbers/registration)
* [Meta — account\_update webhook](https://developers.facebook.com/documentation/business-messaging/whatsapp/webhooks/reference/account_update)
* [Meta — Onboarding WhatsApp Business app users (coexistence)](https://developers.facebook.com/documentation/business-messaging/whatsapp/embedded-signup/onboarding-business-app-users/)
* [Meta — Graph API, Handling errors](https://developers.facebook.com/docs/graph-api/guides/error-handling)
