Créer une clé API restreinte (envoi seul, lecture seule, un seul numéro)

Oui : à la création de la clé dans la console, choisissez ses portées (scopes) et, si besoin, les numéros autorisés ; une clé ne peut que réduire les droits du compte, jamais les élargir.

Créer une clé API restreinte (envoi seul, lecture seule, un seul numéro)

Astuce
Oui : à la création de la clé dans la console, choisissez ses portées (scopes) et, si besoin, les numéros autorisés ; une clé ne peut que réduire les droits du compte, jamais les élargir.

Scénario

Vous confiez une clé à un prestataire, à un script de caisse ou à un connecteur IA. Vous ne voulez pas qu'elle puisse tout faire. Oui, une clé peut être restreinte : par portées (ce qu'elle a le droit d'appeler) et par numéros (depuis lesquels elle a le droit d'agir). Cela se règle à la création, dans la console. Une clé existante ne se modifie pas : créez-en une nouvelle et révoquez l'ancienne.

Les portées

PortéeDonne accès à
messages:sendPOST /v1/messages, /v1/messages/reply, /v1/messages/interactive
messages:readGET /v1/messages/{id}, GET /v1/messages/inbound, GET /v1/media/{id}
templates:readGET /v1/templates
templates:writePOST et DELETE /v1/templates
balance:readGET /v1/ping, /v1/balance, /v1/pricing, /v1/numbers, /v1/logs, /v1/storage, /v1/credits/packs et l'achat de crédits
connection:writefinaliser la connexion d'un numéro, déconnecter un numéro, débloquer un palier

La liste que la console propose vient de GET /v1/console/keys/scopes : elle ne peut pas dériver de ce que le serveur applique.

Trois recettes de clés

Serveur qui n'envoie que des reçus   → messages:send
Tableau de bord qui lit seulement    → messages:read + balance:read
Intégration d'une seule agence       → messages:send + allowed_numbers = [le numéro de l'agence]

À la création, la console envoie ceci (session de console, pas une clé API) à POST /v1/console/keys :

{
  "label": "Caisse agence Douala",
  "scopes": ["messages:send"],
  "allowed_numbers": ["100000000000001"]
}

La réponse contient le secret (sk_live_…) une seule fois. Seule son empreinte est conservée : on peut vérifier la clé, jamais la relire.

Ce qui se passe quand la clé sort de son périmètre

Révoquer

POST /v1/console/keys/{id}/revoke (ou le bouton de la console). La clé cesse de fonctionner. GET /v1/console/keys liste vos clés avec leur préfixe, leurs portées et leurs numéros, jamais le secret.

Et une liste de templates autorisés ?

Une clé peut aussi être limitée à une liste de templates, mais vous ne la réglez pas vous-même à la création : la console ne la propose pas. Elle existe pour les clés que la console émet avec les workflows n8n de la galerie (la clé n'envoie alors que les templates de la recette, avec un 403 « Template non autorisé pour cette clé » pour les autres). Une limite de templates au niveau du compte est un réglage administrateur : demandez-la au support.

Attention
Piège : balance:read n'est pas une portée inoffensive. Elle couvre aussi POST /v1/credits/checkout, qui peut débiter la carte enregistrée (use_saved_card). Pour un tableau de bord qui doit seulement lire, ne donnez pas cette clé à quelqu'un qui ne doit pas pouvoir acheter des crédits.
Attention
Piège : une clé en envoi seul (messages:send) ne peut pas appeler GET /v1/ping pour se tester : ping demande balance:read. Testez-la avec un vrai envoi vers votre propre numéro.
Attention
Piège : une clé ne peut que réduire. Les portées proposées sont les six portées par défaut, rien de plus. Une clé n'a jamais plus de droits que le compte. Pour les numéros, voir Plusieurs numéros.

Une clé restreinte limite les dégâts d'une fuite, elle ne la rend pas inoffensive : ne l'écrivez jamais dans un dépôt de code. Pour la tester sans payer, voir Tester sans payer.

Preuve — vérifié dans le code de l'API : api_keys.py, console_api.py, api_numbers.py, public_api.py, api_quota.py, api_send.py.