SDK et outils
SDK
Les clients officiels de HonkIO pour Node.js, Python, PHP et Laravel : installation, démarrage rapide, résultats et erreurs, et chaque méthode avec la page qui l’explique.
Installation et démarrage rapide
Installez le paquet, puis créez un client avec une clé API.
npm install @honkio/node@honkio/node fonctionne avec Node 18 ou plus récent, est offert en ESM et CommonJS, et n’a aucune dépendance à l’exécution. @honkio/node sur npm
Créez une clé dans le tableau de bord, sous API Keys → Create key; la clé complète n'est affichée qu'une fois, juste après sa création. Commencez avec une clé de test (mk_test_...) : rien n'est livré ni facturé.
import { Honkio } from '@honkio/node'
const honkio = new Honkio(process.env.HONKIO_API_KEY)
const { data, error } = await honkio.messages.send({
from: '+1416XXXXXXX', // one of your HonkIO numbers
to: '+1613XXXXXXX', // a Canadian number you hold consent for
body: 'Hello from HonkIO!',
})
if (error) {
console.error(error.name, error.message) // e.g. NON_CANADIAN_NUMBER
} else {
console.log(data.id, data.status)
}new Honkio() sans argument lit HONKIO_API_KEY, et lève une exception si ni l'un ni l'autre n'est défini.
Résultats et erreurs
data contient la réponse de l'API telle qu'envoyée, en snake_case (scheduled_at, segment_count). En cas d'échec, error est { name, message, statusCode, details? }.
| name | Quand |
|---|---|
| un code de l'API tel que NON_CANADIAN_NUMBER | l'API a refusé la requête; statusCode est son statut HTTP |
| network_error | aucune réponse n'est arrivée (DNS, connexion refusée, délai de 30 secondes); statusCode est null |
| application_error | le corps de la réponse n'était pas du JSON, par exemple une page d'erreur d'un proxy |
| invalid_argument | un identifiant était vide, . ou .., ou un appel de consentement nommait les deux sujets ou aucun; rien n'a été envoyé |
| invalid_signature | webhooks.verify (ou verifyWebhook) n'a pas pu vérifier une livraison |
details contient le details de l'API quand elle en a envoyé un (chemins de validation, retry_after, clés de modèle manquantes). Sinon, il contient tout ce que l'API a envoyé à côté de l'enveloppe d'erreur, comme attempts_remaining sur VERIFICATION_INVALID_CODE.
Chaque code d’erreur que l’API peut renvoyer, et ce qu’il faut faire pour chacun, figure sur la page Erreurs.
Écrivez les champs de requête en camelCase (replyTo, scheduledAt, isCommercial, skipConsentCheck); ils sont envoyés en snake_case, comme l'attend l'API. Les clés à l'intérieur de variables, headers et metadata sont les vôtres et sont envoyées telles quelles.
Options et clés
Le second argument de new Honkio prend ces options : baseUrl, qui vaut https://api.honkio.ca par défaut; fetch, qui vaut le fetch global par défaut (Node 18 ou plus récent), à remplacer par le vôtre pour utiliser un polyfill ou pour intercepter les requêtes; et, à partir de la version 0.8.0, maxRetries et maxRetryDelayMs, qui règlent les nouvelles tentatives du client (ci-dessous).
import { Honkio } from '@honkio/node'
const honkio = new Honkio('mk_live_...', {
baseUrl: 'https://api.honkio.ca', // default
// default: the global fetch. Pass your own to log or proxy requests:
fetch: (url, init) => {
console.log(init?.method ?? 'GET', url)
return fetch(url, init)
},
maxRetries: 2, // default; 0 turns retrying off (from version 0.8.0)
maxRetryDelayMs: 60_000, // default: the longest single wait, in milliseconds
})À partir de la version 0.8.0, le client réessaie un refus qu’une attente règle : NUMBER_RATE_LIMITED, CARRIER_THROTTLED et CARRIER_UNAVAILABLE. Il attend le délai demandé par Retry-After, ou patiente brièvement quand l’API n’en indique aucun. RATE_LIMITED et les erreurs réseau ne sont réessayés que sur un GET ou sur une requête qui porte une Idempotency-Key, et chaque messages.send, emails.send et batch.send en porte maintenant une : la vôtre si vous passez idempotencyKey, sinon une que le client crée et garde pour chaque nouvelle tentative de cet appel, pour qu’une nouvelle tentative ne puisse ni envoyer ni facturer deux fois. Par défaut, il réessaie deux fois et n’attend jamais plus de 60 secondes d’un coup; une attente plus longue vous revient sous forme d’erreur. maxRetries: 0 désactive les nouvelles tentatives, et maxRetryDelayMs fixe l’attente la plus longue, en millisecondes. CARRIER_TIMEOUT n’est jamais réessayé : le message est peut-être parti.
Le préfixe d'une clé est son mode : les clés mk_test_ simulent tout et n'atteignent jamais l'opérateur ni votre solde; les clés mk_live_ envoient pour vrai. Rien d'autre ne change dans l'appel au SDK entre les deux.
Index des méthodes
Chaque méthode du client, la route REST qu’elle appelle et la page qui l’explique, avec des exemples en Node.js et en cURL.
honkio.messages
| Méthode | Route | Documentation |
|---|---|---|
| honkio.messages.send | POST /v1/messages | Envoi de messages |
| honkio.messages.list | GET /v1/messages | Envoi de messages |
| honkio.messages.get | GET /v1/messages/{id} | Envoi de messages |
| honkio.messages.update | PATCH /v1/messages/{id} | Envoi de messages |
| honkio.messages.cancel | DELETE /v1/messages/{id} | Envoi de messages |
honkio.phoneNumbers
| Méthode | Route | Documentation |
|---|---|---|
| honkio.phoneNumbers.areaCodes | GET /v1/phone-numbers/area-codes | Numéros de téléphone |
| honkio.phoneNumbers.search | GET /v1/phone-numbers/search | Numéros de téléphone |
| honkio.phoneNumbers.provision | POST /v1/phone-numbers | Numéros de téléphone |
| honkio.phoneNumbers.list | GET /v1/phone-numbers | Numéros de téléphone |
| honkio.phoneNumbers.get | GET /v1/phone-numbers/{id} | Numéros de téléphone |
| honkio.phoneNumbers.release | DELETE /v1/phone-numbers/{id} | Numéros de téléphone |
L'API ne lit pas d'Idempotency-Key sur cette route, donc provision n'en prend pas : les achats d'un même compte se font un à la fois (PURCHASE_IN_PROGRESS, réessayez sous peu), et un numéro que vous possédez déjà répond 409 CONFLICT, donc une nouvelle tentative après un délai ne peut pas l'acheter deux fois. Après un network_error, appelez list() avant de réessayer.
honkio.tollFreeVerifications
| Méthode | Route | Documentation |
|---|---|---|
| honkio.tollFreeVerifications.options | GET /v1/toll-free-verifications/options | Numéros sans frais |
| honkio.tollFreeVerifications.create | POST /v1/toll-free-verifications | Numéros sans frais |
| honkio.tollFreeVerifications.list | GET /v1/toll-free-verifications | Numéros sans frais |
| honkio.tollFreeVerifications.get | GET /v1/toll-free-verifications/{id} | Numéros sans frais |
| honkio.tollFreeVerifications.update | PATCH /v1/toll-free-verifications/{id} | Numéros sans frais |
| honkio.tollFreeVerifications.submit | POST /v1/toll-free-verifications/{id}/submit | Numéros sans frais |
| honkio.tollFreeVerifications.cancel | DELETE /v1/toll-free-verifications/{id} | Numéros sans frais |
honkio.businessVerification
| Méthode | Route | Documentation |
|---|---|---|
| honkio.businessVerification.get | GET /v1/business-verification | Tarifs et limites |
| honkio.businessVerification.save | PUT /v1/business-verification | Tarifs et limites |
| honkio.businessVerification.submit | POST /v1/business-verification/submit | Tarifs et limites |
honkio.autoTopup
| Méthode | Route | Documentation |
|---|---|---|
| honkio.autoTopup.get | GET /v1/auto-topup | Tarifs et limites |
honkio.topupCapRequests
| Méthode | Route | Documentation |
|---|---|---|
| honkio.topupCapRequests.create | POST /v1/account/topup-cap-requests | Tarifs et limites |
| honkio.topupCapRequests.list | GET /v1/account/topup-cap-requests | Tarifs et limites |
honkio.sendLimit
| Méthode | Route | Documentation |
|---|---|---|
| honkio.sendLimit.get | GET /v1/send-limit | Tarifs et limites |
honkio.verify
| Méthode | Route | Documentation |
|---|---|---|
| honkio.verify.start | POST /v1/verify | Vérification (codes à usage unique) |
| honkio.verify.check | POST /v1/verify/{id}/check | Vérification (codes à usage unique) |
| honkio.verify.get | GET /v1/verify/{id} | Vérification (codes à usage unique) |
| honkio.verify.list | GET /v1/verify | Vérification (codes à usage unique) |
start ne prend pas de clé d'idempotence : un seul démarrage par destinataire toutes les 60 secondes, une nouvelle tentative dans cette fenêtre répond RATE_LIMITED. Après un network_error, listez les vérifications en attente et faites correspondre le numéro avant d'en démarrer une nouvelle.
honkio.consents
| Méthode | Route | Documentation |
|---|---|---|
| honkio.consents.create | POST /v1/compliance/consents | Consentement (LCAP) |
| honkio.consents.list | GET /v1/compliance/consents | Consentement (LCAP) |
| honkio.consents.check | GET /v1/compliance/consents/check | Consentement (LCAP) |
| honkio.consents.revoke | DELETE /v1/compliance/consents/{phone} | Consentement (LCAP) |
| honkio.consents.revoke | DELETE /v1/compliance/consents/email/{address} | LCAP et suppressions |
| honkio.consents.recordBatch | POST /v1/compliance/consents/batch | Consentement (LCAP) |
honkio.consentBatches
| Méthode | Route | Documentation |
|---|---|---|
| honkio.consentBatches.list | GET /v1/compliance/consent-batches | Consentement (LCAP) |
| honkio.consentBatches.get | GET /v1/compliance/consent-batches/{id} | Consentement (LCAP) |
honkio.optInConfirmations
| Méthode | Route | Documentation |
|---|---|---|
| honkio.optInConfirmations.send | POST /v1/compliance/opt-in-confirmations | Numéros sans frais |
| honkio.optInConfirmations.list | GET /v1/compliance/opt-in-confirmations | Numéros sans frais |
honkio.emails
| Méthode | Route | Documentation |
|---|---|---|
| honkio.emails.send | POST /v1/emails | Envoi et envois groupés |
| honkio.emails.list | GET /v1/emails | Envoi et envois groupés |
| honkio.emails.get | GET /v1/emails/{id} | Envoi et envois groupés |
| honkio.emails.update | PATCH /v1/emails/{id} | Envoi et envois groupés |
| honkio.emails.cancel | DELETE /v1/emails/{id} | Envoi et envois groupés |
isCommercial vaut false par défaut : le courriel est transactionnel à moins de le définir. Le courriel commercial exige isCommercial: true, un consentement LCAP enregistré pour le destinataire, un seul destinataire, et un pied de page de désabonnement.
honkio.batch
| Méthode | Route | Documentation |
|---|---|---|
| honkio.batch.send | POST /v1/emails/batch | Envoi et envois groupés |
honkio.emails.received
| Méthode | Route | Documentation |
|---|---|---|
| honkio.emails.received.list | GET /v1/emails/received | Réception |
| honkio.emails.received.address | GET /v1/emails/received/address | Réception |
| honkio.emails.received.setAddressEnabled | PATCH /v1/emails/received/address | Réception |
| honkio.emails.received.get | GET /v1/emails/received/{id} | Réception |
| honkio.emails.received.raw | GET /v1/emails/received/{id}/raw | Réception |
| honkio.emails.received.attachment | GET /v1/emails/received/{id}/attachments/{attachmentId} | Réception |
| honkio.emails.received.simulate | POST /v1/emails/received/simulate | Réception |
raw et attachment téléchargent des octets, pas du JSON : les deux résolvent data en un Blob, à lire avec arrayBuffer() ou à rediriger vers un fichier. Les deux répondent ATTACHMENT_EXPIRED une fois la fenêtre de rétention de 40 jours passée.
honkio.domains
| Méthode | Route | Documentation |
|---|---|---|
| honkio.domains.create | POST /v1/email-domains | Domaines |
| honkio.domains.list | GET /v1/email-domains | Domaines |
| honkio.domains.get | GET /v1/email-domains/{id} | Domaines |
| honkio.domains.update | PATCH /v1/email-domains/{id} | Domaines |
| honkio.domains.verify | POST /v1/email-domains/{id}/verify | Domaines |
| honkio.domains.remove | DELETE /v1/email-domains/{id} | Domaines |
honkio.suppressions
| Méthode | Route | Documentation |
|---|---|---|
| honkio.suppressions.create | POST /v1/email-suppressions | LCAP et suppressions |
| honkio.suppressions.list | GET /v1/email-suppressions | LCAP et suppressions |
| honkio.suppressions.remove | DELETE /v1/email-suppressions/{address} | LCAP et suppressions |
honkio.templates
| Méthode | Route | Documentation |
|---|---|---|
| honkio.templates.create | POST /v1/templates | Modèles |
| honkio.templates.list | GET /v1/templates | Modèles |
| honkio.templates.get | GET /v1/templates/{idOrAlias} | Modèles |
| honkio.templates.update | PATCH /v1/templates/{idOrAlias} | Modèles |
| honkio.templates.publish | POST /v1/templates/{idOrAlias}/publish | Modèles |
| honkio.templates.rollback | POST /v1/templates/{idOrAlias}/rollback | Modèles |
| honkio.templates.versions | GET /v1/templates/{idOrAlias}/versions | Modèles |
| honkio.templates.remove | DELETE /v1/templates/{idOrAlias} | Modèles |
honkio.emailTemplates
| Méthode | Route | Documentation |
|---|---|---|
| honkio.emailTemplates.create | POST /v1/email-templates | Modèles |
| honkio.emailTemplates.list | GET /v1/email-templates | Modèles |
| honkio.emailTemplates.get | GET /v1/email-templates/{idOrAlias} | Modèles |
| honkio.emailTemplates.update | PATCH /v1/email-templates/{idOrAlias} | Modèles |
| honkio.emailTemplates.publish | POST /v1/email-templates/{idOrAlias}/publish | Modèles |
| honkio.emailTemplates.rollback | POST /v1/email-templates/{idOrAlias}/rollback | Modèles |
| honkio.emailTemplates.versions | GET /v1/email-templates/{idOrAlias}/versions | Modèles |
| honkio.emailTemplates.remove | DELETE /v1/email-templates/{idOrAlias} | Modèles |
Obsolète : utilisez honkio.templates, qui gère chaque modèle avec ses parties courriel, SMS et push en anglais et en français. honkio.emailTemplates ne montre que les modèles qui ont une partie courriel, dans l’ancienne forme limitée au courriel, et continue de fonctionner.
honkio.push
| Méthode | Route | Documentation |
|---|---|---|
| honkio.push.send | POST /v1/push | Envoi et repli |
| honkio.push.list | GET /v1/push | Envoi et repli |
| honkio.push.get | GET /v1/push/{id} | Envoi et repli |
| honkio.push.update | PATCH /v1/push/{id} | Envoi et repli |
| honkio.push.cancel | DELETE /v1/push/{id} | Envoi et repli |
| honkio.push.usage | GET /v1/push/usage | Envoi et repli |
honkio.push.apps
| Méthode | Route | Documentation |
|---|---|---|
| honkio.push.apps.create | POST /v1/push/apps | Identifiants |
| honkio.push.apps.list | GET /v1/push/apps | Identifiants |
| honkio.push.apps.get | GET /v1/push/apps/{id} | Identifiants |
| honkio.push.apps.update | PATCH /v1/push/apps/{id} | Identifiants |
| honkio.push.apps.delete | DELETE /v1/push/apps/{id} | Identifiants |
honkio.push.web
| Méthode | Route | Documentation |
|---|---|---|
| honkio.push.web.setVapidKeys | POST /v1/push/apps/{id}/web/vapid-keys | Web push (navigateurs) |
honkio.push.devices
honkio.notify
| Méthode | Route | Documentation |
|---|---|---|
| honkio.notify.send | POST /v1/notify | Envoyer une notification |
honkio.notifications
| Méthode | Route | Documentation |
|---|---|---|
| honkio.notifications.get | GET /v1/notifications/{id} | Envoyer une notification |
| honkio.notifications.list | GET /v1/notifications | Envoyer une notification |
honkio.recipients
| Méthode | Route | Documentation |
|---|---|---|
| honkio.recipients.upsert | PUT /v1/recipients/{user_id} | Profils de destinataires |
| honkio.recipients.update | PATCH /v1/recipients/{user_id} | Profils de destinataires |
| honkio.recipients.get | GET /v1/recipients/{user_id} | Profils de destinataires |
| honkio.recipients.list | GET /v1/recipients | Profils de destinataires |
| honkio.recipients.delete | DELETE /v1/recipients/{user_id} | Profils de destinataires |
honkio.webhooks
| Méthode | Route | Documentation |
|---|---|---|
| honkio.webhooks.create | POST /v1/webhooks | Vue d’ensemble |
| honkio.webhooks.list | GET /v1/webhooks | Vue d’ensemble |
| honkio.webhooks.get | GET /v1/webhooks/{id} | Vue d’ensemble |
| honkio.webhooks.update | PATCH /v1/webhooks/{id} | Vue d’ensemble |
| honkio.webhooks.remove | DELETE /v1/webhooks/{id} | Vue d’ensemble |
| honkio.webhooks.deliveries | GET /v1/webhooks/{id}/deliveries | Vue d’ensemble |
| honkio.webhooks.deadLetters | GET /v1/webhooks/{id}/dead-letters | Vue d’ensemble |
| honkio.webhooks.replay | POST /v1/webhooks/dead-letters/{dlid}/replay | Vue d’ensemble |
| honkio.webhooks.discard | DELETE /v1/webhooks/dead-letters/{dlid} | Vue d’ensemble |
| honkio.webhooks.reactivate | POST /v1/webhooks/{id}/reactivate | Vue d’ensemble |
| honkio.webhooks.rotateSecret | POST /v1/webhooks/{id}/rotate-secret | Vérifier les signatures |
honkio.authApps
L’API de gestion de HonkIO Auth : vos applications de connexion et leurs utilisateurs, organisations, réglages de sécurité et forfait. Chaque ligne donne aussi l’appel dans les SDK Python et PHP, et renvoie à la route dans la référence de l’API Auth, avec sa permission, ses champs et un exemple cURL.
| Méthode | Route | Documentation |
|---|---|---|
| honkio.authApps.createPythonclient.auth_apps.createPHP$honkio->authApps->create | POST /v1/auth-apps | Créer une application |
| honkio.authApps.listPythonclient.auth_apps.listPHP$honkio->authApps->list | GET /v1/auth-apps | Lister les applications |
| honkio.authApps.getPythonclient.auth_apps.getPHP$honkio->authApps->get | GET /v1/auth-apps/{id} | Obtenir une application |
| honkio.authApps.updatePythonclient.auth_apps.updatePHP$honkio->authApps->update | PATCH /v1/auth-apps/{id} | Modifier une application |
| honkio.authApps.removePythonclient.auth_apps.removePHP$honkio->authApps->remove | DELETE /v1/auth-apps/{id} | Supprimer une application |
| honkio.authApps.rotateSecretPythonclient.auth_apps.rotate_secretPHP$honkio->authApps->rotateSecret | POST /v1/auth-apps/{id}/rotate-secret | Remplacer le secret client |
| honkio.authApps.verifyDomainPythonclient.auth_apps.verify_domainPHP$honkio->authApps->verifyDomain | POST /v1/auth-apps/{id}/domain/verify | Vérifier le domaine |
| honkio.authApps.cancelHostnameChangePythonclient.auth_apps.cancel_hostname_changePHP$honkio->authApps->cancelHostnameChange | DELETE /v1/auth-apps/{id}/hostname-change | Annuler un changement de nom d’hôte |
| honkio.authApps.uploadLogoPythonclient.auth_apps.upload_logoPHP$honkio->authApps->uploadLogo | PUT /v1/auth-apps/{id}/logo | Téléverser un logo |
| honkio.authApps.removeLogoPythonclient.auth_apps.remove_logoPHP$honkio->authApps->removeLogo | DELETE /v1/auth-apps/{id}/logo | Retirer le logo |
honkio.authApps.security
| Méthode | Route | Documentation |
|---|---|---|
| honkio.authApps.security.getPythonclient.auth_apps.security.getPHP$honkio->authApps->security->get | GET /v1/auth-apps/{id}/security | Obtenir les réglages de sécurité |
| honkio.authApps.security.updatePythonclient.auth_apps.security.updatePHP$honkio->authApps->security->update | PATCH /v1/auth-apps/{id}/security | Modifier les réglages de sécurité |
| honkio.authApps.security.summaryPythonclient.auth_apps.security.summaryPHP$honkio->authApps->security->summary | GET /v1/auth-apps/{id}/security/summary | Obtenir le sommaire de sécurité |
honkio.authApps.blocklist
| Méthode | Route | Documentation |
|---|---|---|
| honkio.authApps.blocklist.listPythonclient.auth_apps.blocklist.listPHP$honkio->authApps->security->blocklist | GET /v1/auth-apps/{id}/security/blocklist | Lister la liste de blocage |
| honkio.authApps.blocklist.addPythonclient.auth_apps.blocklist.addPHP$honkio->authApps->security->addToBlocklist | POST /v1/auth-apps/{id}/security/blocklist | Ajouter à la liste de blocage |
| honkio.authApps.blocklist.removePythonclient.auth_apps.blocklist.removePHP$honkio->authApps->security->removeFromBlocklist | DELETE /v1/auth-apps/{id}/security/blocklist/{entryId} | Retirer de la liste de blocage |
honkio.authApps.plan
| Méthode | Route | Documentation |
|---|---|---|
| honkio.authApps.plan.getPythonclient.auth_apps.plan.getPHP$honkio->authApps->plan->get | GET /v1/auth-apps/{id}/plan | Obtenir le forfait |
| honkio.authApps.plan.changePythonclient.auth_apps.plan.changePHP$honkio->authApps->plan->change | PUT /v1/auth-apps/{id}/plan | Changer le forfait |
| honkio.authApps.plan.cancelScheduledPythonclient.auth_apps.plan.cancel_scheduledPHP$honkio->authApps->plan->cancelScheduledChange | DELETE /v1/auth-apps/{id}/plan/scheduled | Annuler une rétrogradation prévue |
| honkio.authApps.plan.costsPythonclient.auth_apps.plan.costsPHP$honkio->authApps->plan->costs | GET /v1/auth-apps/{id}/costs | Obtenir les coûts de connexion |
| honkio.authApps.plan.usagePythonclient.auth_apps.plan.usagePHP$honkio->authApps->plan->usage | GET /v1/auth-apps/{id}/usage | Obtenir l’utilisation |
honkio.authApps.signInPolicy
| Méthode | Route | Documentation |
|---|---|---|
| honkio.authApps.signInPolicy.getPythonclient.auth_apps.sign_in_policy.getPHP$honkio->authApps->signInPolicy | GET /v1/auth-apps/{id}/sign-in-policy | Obtenir la politique de connexion |
| honkio.authApps.signInPolicy.updatePythonclient.auth_apps.sign_in_policy.updatePHP$honkio->authApps->updateSignInPolicy | PATCH /v1/auth-apps/{id}/sign-in-policy | Modifier la politique de connexion |
honkio.authApps.organizations
| Méthode | Route | Documentation |
|---|---|---|
| honkio.authApps.organizations.listPythonclient.auth_apps.organizations.listPHP$honkio->authApps->organizations->list | GET /v1/auth-apps/{id}/organizations | Lister les organisations |
| honkio.authApps.organizations.createPythonclient.auth_apps.organizations.createPHP$honkio->authApps->organizations->create | POST /v1/auth-apps/{id}/organizations | Créer une organisation |
| honkio.authApps.organizations.getPythonclient.auth_apps.organizations.getPHP$honkio->authApps->organizations->get | GET /v1/auth-apps/{id}/organizations/{orgId} | Obtenir une organisation |
| honkio.authApps.organizations.updatePythonclient.auth_apps.organizations.updatePHP$honkio->authApps->organizations->update | PATCH /v1/auth-apps/{id}/organizations/{orgId} | Modifier une organisation |
| honkio.authApps.organizations.removePythonclient.auth_apps.organizations.removePHP$honkio->authApps->organizations->remove | DELETE /v1/auth-apps/{id}/organizations/{orgId} | Supprimer une organisation |
honkio.authApps.memberships
| Méthode | Route | Documentation |
|---|---|---|
| honkio.authApps.memberships.listPythonclient.auth_apps.memberships.listPHP$honkio->authApps->organizations->memberships | GET /v1/auth-apps/{id}/organizations/{orgId}/memberships | Lister les membres |
| honkio.authApps.memberships.addPythonclient.auth_apps.memberships.addPHP$honkio->authApps->organizations->addMembership | POST /v1/auth-apps/{id}/organizations/{orgId}/memberships | Ajouter un membre |
| honkio.authApps.memberships.getPythonclient.auth_apps.memberships.getPHP$honkio->authApps->organizations->membership | GET /v1/auth-apps/{id}/organizations/{orgId}/memberships/{userId} | Obtenir une adhésion |
| honkio.authApps.memberships.updatePythonclient.auth_apps.memberships.updatePHP$honkio->authApps->organizations->updateMembership | PATCH /v1/auth-apps/{id}/organizations/{orgId}/memberships/{userId} | Changer le rôle d’un membre |
| honkio.authApps.memberships.removePythonclient.auth_apps.memberships.removePHP$honkio->authApps->organizations->removeMembership | DELETE /v1/auth-apps/{id}/organizations/{orgId}/memberships/{userId} | Retirer un membre |
honkio.authApps.roles
| Méthode | Route | Documentation |
|---|---|---|
| honkio.authApps.roles.listPythonclient.auth_apps.roles.listPHP$honkio->authApps->organizations->roles | GET /v1/auth-apps/{id}/organizations/{orgId}/roles | Lister les rôles |
| honkio.authApps.roles.putPythonclient.auth_apps.roles.putPHP$honkio->authApps->organizations->putRole | PUT /v1/auth-apps/{id}/organizations/{orgId}/roles/{name} | Créer ou modifier un rôle |
| honkio.authApps.roles.removePythonclient.auth_apps.roles.removePHP$honkio->authApps->organizations->removeRole | DELETE /v1/auth-apps/{id}/organizations/{orgId}/roles/{name} | Supprimer un rôle |
roles.create(appId, orgId, { name }) et roles.update(appId, orgId, name, body) existent aussi : ce sont put(), qui crée le rôle ou le modifie, sous un autre nom. Python a la même paire, et PHP a createRole et updateRole.
honkio.authApps.invitations
| Méthode | Route | Documentation |
|---|---|---|
| honkio.authApps.invitations.listPythonclient.auth_apps.invitations.listPHP$honkio->authApps->invitations->list | GET /v1/auth-apps/{id}/invitations | Lister les invitations |
| honkio.authApps.invitations.createPythonclient.auth_apps.invitations.createPHP$honkio->authApps->invitations->create | POST /v1/auth-apps/{id}/invitations | Créer une invitation |
| honkio.authApps.invitations.getPythonclient.auth_apps.invitations.getPHP$honkio->authApps->invitations->get | GET /v1/auth-apps/{id}/invitations/{invitationId} | Obtenir une invitation |
| honkio.authApps.invitations.revokePythonclient.auth_apps.invitations.revokePHP$honkio->authApps->invitations->revoke | DELETE /v1/auth-apps/{id}/invitations/{invitationId} | Révoquer une invitation |
honkio.authApps.users
| Méthode | Route | Documentation |
|---|---|---|
| honkio.authApps.users.listPythonclient.auth_apps.users.listPHP$honkio->authApps->users->list | GET /v1/auth-apps/{id}/users | Lister les utilisateurs |
| honkio.authApps.users.getPythonclient.auth_apps.users.getPHP$honkio->authApps->users->get | GET /v1/auth-apps/{id}/users/{userId} | Obtenir un utilisateur |
| honkio.authApps.users.updatePythonclient.auth_apps.users.updatePHP$honkio->authApps->users->update | PATCH /v1/auth-apps/{id}/users/{userId} | Modifier un utilisateur |
| honkio.authApps.users.blockPythonclient.auth_apps.users.blockPHP$honkio->authApps->users->block | POST /v1/auth-apps/{id}/users/{userId}/block | Bloquer un utilisateur |
| honkio.authApps.users.unblockPythonclient.auth_apps.users.unblockPHP$honkio->authApps->users->unblock | POST /v1/auth-apps/{id}/users/{userId}/unblock | Débloquer un utilisateur |
| honkio.authApps.users.removePythonclient.auth_apps.users.removePHP$honkio->authApps->users->remove | DELETE /v1/auth-apps/{id}/users/{userId} | Supprimer un utilisateur |
| honkio.authApps.users.removeLikelyBotsPythonclient.auth_apps.users.remove_likely_botsPHP$honkio->authApps->users->removeLikelyBots | POST /v1/auth-apps/{id}/users/bulk-delete | Supprimer les robots probables |
| honkio.authApps.users.sessionsPythonclient.auth_apps.users.sessionsPHP$honkio->authApps->users->sessions | GET /v1/auth-apps/{id}/users/{userId}/sessions | Lister les sessions d’un utilisateur |
| honkio.authApps.users.signInsPythonclient.auth_apps.users.sign_insPHP$honkio->authApps->users->signIns | GET /v1/auth-apps/{id}/users/{userId}/sign-ins | Lister les connexions d’un utilisateur |
| honkio.authApps.users.passkeysPythonclient.auth_apps.users.passkeysPHP$honkio->authApps->users->passkeys | GET /v1/auth-apps/{id}/users/{userId}/passkeys | Lister les clés d’accès d’un utilisateur |
| honkio.authApps.users.removePasskeyPythonclient.auth_apps.users.remove_passkeyPHP$honkio->authApps->users->removePasskey | DELETE /v1/auth-apps/{id}/users/{userId}/passkeys/{passkeyId} | Retirer une clé d’accès d’un utilisateur |
honkio.authApps.sessions
| Méthode | Route | Documentation |
|---|---|---|
| honkio.authApps.sessions.revokePythonclient.auth_apps.sessions.revokePHP$honkio->authApps->users->revokeSession | DELETE /v1/auth-apps/{id}/sessions/{sessionId} | Révoquer une session |
honkio.authApps.signIns
| Méthode | Route | Documentation |
|---|---|---|
| honkio.authApps.signIns.listPythonclient.auth_apps.sign_ins.listPHP$honkio->authApps->signIns | GET /v1/auth-apps/{id}/sign-ins | Lister l’historique de connexion |
honkio.authApps.exports
| Méthode | Route | Documentation |
|---|---|---|
| honkio.authApps.exports.createPythonclient.auth_apps.exports.createPHP$honkio->authApps->exports->create | POST /v1/auth-apps/{id}/exports | Lancer une exportation |
| honkio.authApps.exports.latestPythonclient.auth_apps.exports.latestPHP$honkio->authApps->exports->latest | GET /v1/auth-apps/{id}/exports/latest | Obtenir la dernière exportation |
| honkio.authApps.exports.getPythonclient.auth_apps.exports.getPHP$honkio->authApps->exports->get | GET /v1/auth-apps/{id}/exports/{exportId} | Obtenir une exportation |
| honkio.authApps.exports.downloadPythonclient.auth_apps.exports.downloadPHP$honkio->authApps->exports->download | GET /v1/auth-exports/{token} | Télécharger une exportation |
download prend le jeton ou toute l’URL download_url et résout data en un Blob qui contient le fichier JSON. Le lien ne fonctionne qu’une fois, pendant 15 minutes après que l’exportation est prête. Il sert lui-même d’identifiant : la route ne demande donc aucune clé d’API, et le document OpenAPI public l’omet.
Webhooks
Passez le corps brut, pas du JSON déjà analysé, à webhooks.verify (ou l'export autonome verifyWebhook). Il ne lève jamais d'exception : un corps déjà analysé, un secret manquant ou des en-têtes manquants répondent invalid_argument, et une signature invalide ou périmée répond invalid_signature.
const webhookSecret = process.env.HONKIO_WEBHOOK_SECRET
if (!webhookSecret) throw new Error('Set HONKIO_WEBHOOK_SECRET')
app.post('/webhooks/honkio', express.raw({ type: 'application/json' }), (req, res) => {
const { data: event, error } = honkio.webhooks.verify(req.body, req.headers, webhookSecret)
if (error) return res.status(400).end()
if (!event.livemode) console.log('test event')
res.status(200).end()
})La signature est du HMAC-SHA256, en hexadécimal, sur l'horodatage et le corps brut, envoyée dans X-HonkIO-Signature avec X-HonkIO-Timestamp et X-HonkIO-Event. Les livraisons de plus de 300 secondes sont refusées par défaut; changez cela avec toleranceSeconds.
Un événement vérifié est l'enveloppe : id, type, created, account_id, livemode, data. Dédupliquez sur id : une livraison échouée est retentée pendant environ 24 heures, chaque tentative signée à nouveau avec le même id d'événement.
deliveries(id) liste les tentatives récentes. Les événements qui ont échoué à chaque tentative sont des lettres mortes : deadLetters(id) les liste, replay(deadLetterId) en renvoie une, et discard(deadLetterId) l'abandonne. reactivate(id) réactive un point de terminaison que la plateforme a désactivé.
Pagination
Les appels de liste suivent l'une de trois formes. Par page (page, limit, et un objet meta avec page, limit, total et pages) : messages.list et consents.list. Par décalage (limit, offset) : verify.list. Par curseur (limit, cursor, répondant avec data, has_more et next_cursor) : emails.list, emails.received.list, suppressions.list et templates.list. Tout le reste, comme phoneNumbers.list et webhooks.list, renvoie chaque ligne en un seul appel.
Python
Le paquet honkio demande Python 3.10 ou plus récent et ne dépend que de httpx. Il est typé, avec un client synchrone (Honkio) et un client asynchrone (AsyncHonkio) qui ont les mêmes ressources et les mêmes arguments.
pip install honkioCréez une clé comme ci-dessus. Honkio() sans argument lit HONKIO_API_KEY et lève InvalidArgumentError si aucune n’est définie. Les arguments après l’identifiant sont nommés et portent le nom des champs de l’API; from est un mot réservé de Python, donc il s’écrit from_. Omettez un argument pour ne pas l’envoyer; passez None pour envoyer null.
from honkio import ApiError, Honkio
client = Honkio() # reads HONKIO_API_KEY
try:
message = client.messages.send(
from_="+1416XXXXXXX", # one of your HonkIO numbers
to="+1613XXXXXXX", # a Canadian number you hold consent for
body="Hello from HonkIO!",
idempotency_key="order-1042",
)
print(message["id"], message["status"])
except ApiError as e:
print(e.code, e.message) # e.g. NON_CANADIAN_NUMBEREnvoyez un courriel de la même façon :
import os
from honkio import Honkio
client = Honkio(os.environ["HONKIO_API_KEY"])
sent = client.emails.send(
from_="Acme <onboarding@test.honkio.ca>",
to="delivered@test.honkio.ca",
subject="Hello from HonkIO",
html="<p>It works.</p>",
)
print(sent["id"])Les mêmes appels, en asynchrone :
import asyncio
from honkio import AsyncHonkio
async def main() -> None:
async with AsyncHonkio() as client:
message = await client.messages.send(from_="+1416XXXXXXX", to="+1613XXXXXXX", body="Hi")
print(message["id"])
asyncio.run(main())Contrairement au SDK Node.js, les erreurs sont des exceptions. Toute erreur de l’API est une sous-classe d’ApiError, avec code, message, status_code et details. L’absence de réponse lève APIConnectionError ou APITimeoutError, et un argument invalide lève InvalidArgumentError. À partir de la version 0.2.0, certains refus sont réessayés avant qu’une exception soit levée (ci-dessous).
from honkio import APIConnectionError, ApiError, UnprocessableEntityError
try:
client.verify.check("VERIFICATION_ID", code="123456")
except UnprocessableEntityError as e:
print(e.code, e.details) # e.g. VERIFICATION_INVALID_CODE {"attempts_remaining": 2}
except ApiError as e:
print(e.status_code, e.code, e.message)
except APIConnectionError:
... # no response arrived (timeouts too): safe to try the check againÀ partir de la version 0.2.0, Honkio et AsyncHonkio réessaient NUMBER_RATE_LIMITED, CARRIER_THROTTLED et CARRIER_UNAVAILABLE, en attendant le délai demandé par Retry-After. RATE_LIMITED et les erreurs de connexion ne sont réessayés que sur un GET ou sur une requête qui porte une clé d’idempotence, et messages.send, emails.send et batch.send en envoient toujours une : votre idempotency_key, sinon une que le client crée et garde pour chaque nouvelle tentative de cet appel. Par défaut, le client réessaie deux fois et n’attend jamais plus de 60 secondes d’un coup; quand réessayer n’aide pas, la dernière exception est levée. max_retries=0 désactive les nouvelles tentatives, et max_retry_delay fixe l’attente la plus longue, en secondes.
from honkio import Honkio
# The defaults (from version 0.2.0): 2 retries, no single wait over 60 seconds.
client = Honkio(max_retries=2, max_retry_delay=60)
# Retrying off: every refusal is raised at once.
no_retries = Honkio(max_retries=0)Chaque code d’erreur que l’API peut renvoyer, et ce qu’il faut faire pour chacun, figure sur la page Erreurs.
verify_webhook prend le corps brut (str ou bytes), les en-têtes et votre secret de signature. Elle retourne l’événement analysé et lève InvalidSignatureError quand la signature, l’horodatage (plus de 300 secondes) ou le corps est invalide. Passez le corps avant tout traitement JSON.
import os
from honkio import InvalidSignatureError, verify_webhook
WEBHOOK_SECRET = os.environ["HONKIO_WEBHOOK_SECRET"]
def handle(request): # a Flask-style request
try:
event = verify_webhook(request.get_data(), request.headers, WEBHOOK_SECRET)
except InvalidSignatureError:
return "bad signature", 400
if not event["livemode"]:
print("test event")
return "", 204PHP
honkio/honkio-php demande PHP 8.2 ou plus récent et Guzzle 7. Les requêtes sont des tableaux dont les clés sont celles de l’API, en snake_case, et les réponses sont des tableaux décodés. Omettez une clé pour ne pas l’envoyer; null envoie null.
composer require honkio/honkio-phpCréez une clé comme ci-dessus. new Honkio() sans argument lit HONKIO_API_KEY et lance InvalidArgumentException si aucune n’est définie.
<?php
use Honkio\Exception\ApiException;
use Honkio\Honkio;
$honkio = new Honkio(); // reads HONKIO_API_KEY
try {
$message = $honkio->messages->send([
'from' => '+1416XXXXXXX', // one of your HonkIO numbers
'to' => '+1613XXXXXXX', // a Canadian number you hold consent for
'body' => 'Hello from HonkIO!',
], idempotencyKey: 'order-1042');
echo $message['id'], ' ', $message['status'], "\n";
} catch (ApiException $e) {
echo $e->errorCode, ': ', $e->getMessage(), "\n"; // e.g. NON_CANADIAN_NUMBER
}Envoyez un courriel de la même façon :
<?php
use Honkio\Honkio;
$honkio = new Honkio(getenv('HONKIO_API_KEY'));
$email = $honkio->emails->send([
'from' => 'Acme <onboarding@test.honkio.ca>',
'to' => 'delivered@test.honkio.ca',
'subject' => 'Hello from HonkIO',
'html' => '<p>It works.</p>',
]);
echo $email['id'], "\n";Les erreurs sont des exceptions, et chacune implémente Honkio\Exception\HonkioException. Une erreur de l’API est une ApiException (ou la sous-classe de son statut) avec errorCode, statusCode, getMessage() et details. L’absence de réponse lance ConnectionException, et l’envoi a pu avoir lieu ou non. Passez une clé d’idempotence comme dernier argument de messages->send, emails->send et batch->send, et réutilisez-la en cas de nouvel essai.
<?php
use Honkio\Exception\ApiException;
use Honkio\Exception\ConnectionException;
try {
$honkio->verify->check('VERIFICATION_ID', ['code' => '123456']);
} catch (ApiException $e) {
if ($e->errorCode === 'VERIFICATION_INVALID_CODE') {
echo $e->details['attempts_remaining'];
}
} catch (ConnectionException $e) {
// No response arrived: safe to try the check again.
}À partir de la version 0.2.0, le client réessaie NUMBER_RATE_LIMITED, CARRIER_THROTTLED et CARRIER_UNAVAILABLE, en attendant le délai demandé par Retry-After. RATE_LIMITED et les erreurs de connexion ne sont réessayés que sur un GET ou sur une requête qui porte une clé d’idempotence, et messages->send, emails->send et batch->send en envoient toujours une : la vôtre, sinon une que le client crée et garde pour chaque nouvelle tentative de cet appel. Par défaut, le client réessaie deux fois et n’attend jamais plus de 60 secondes d’un coup; quand réessayer n’aide pas, la dernière exception est lancée. Dans le tableau d’options, max_retries => 0 désactive les nouvelles tentatives, et max_retry_delay fixe l’attente la plus longue, en secondes.
<?php
use Honkio\Honkio;
// The defaults (from version 0.2.0): 2 retries, no single wait over 60 seconds.
$honkio = new Honkio(null, ['max_retries' => 2, 'max_retry_delay' => 60]);
// Retrying off: every refusal is thrown at once.
$noRetries = new Honkio(null, ['max_retries' => 0]);Chaque code d’erreur que l’API peut renvoyer, et ce qu’il faut faire pour chacun, figure sur la page Erreurs.
Webhook::verify prend le corps brut, les en-têtes et votre secret de signature. Elle retourne l’événement sous forme de tableau et lance SignatureVerificationException quand elle ne peut pas vérifier une livraison. Passez le corps avant tout traitement JSON.
<?php
use Honkio\Exception\SignatureVerificationException;
use Honkio\Webhook;
$rawBody = file_get_contents('php://input');
try {
$event = Webhook::verify($rawBody, getallheaders(), getenv('HONKIO_WEBHOOK_SECRET'));
} catch (SignatureVerificationException $e) {
http_response_code(400);
exit;
}
if (! $event['livemode']) {
error_log('test event');
}
http_response_code(204);Laravel
honkio/laravel ajoute un transport de courriel et un canal de notification SMS au SDK PHP. Il demande PHP 8.2 ou plus récent et Laravel 12 ou 13, et Laravel le découvre automatiquement.
composer require honkio/laravelDéfinissez votre clé et le numéro d’où partent les notifications (HONKIO_BASE_URL ne sert qu’à viser un autre hôte d’API) :
HONKIO_API_KEY=mk_test_...
HONKIO_SMS_FROM=+14165550100
# MAIL_MAILER=honkioÀ partir de la version 0.2.0, HONKIO_MAX_RETRIES (2 par défaut; 0 désactive les nouvelles tentatives) et HONKIO_MAX_RETRY_DELAY (en secondes, 60 par défaut) règlent les nouvelles tentatives du client, comme pour le SDK PHP.
# The defaults, from version 0.2.0
HONKIO_MAX_RETRIES=2
HONKIO_MAX_RETRY_DELAY=60Ajoutez un mailer à config/mail.php, puis définissez MAIL_MAILER=honkio ou appelez Mail::mailer('honkio'). L’adresse d’expédition doit appartenir à un domaine d’envoi vérifié de votre compte.
<?php
// config/mail.php
return [
'mailers' => [
'honkio' => ['transport' => 'honkio'],
],
];Le courriel est transactionnel par défaut. Marquez un Mailable comme commercial avec l’en-tête X-HonkIO-Commercial : le transport le retire et envoie is_commercial à true, et l’API exige alors un consentement LCAP au dossier et un seul destinataire par message. Un refus lance l’exception du SDK depuis Mail::send(). Les nouvelles tentatives d’un courriel mis en file ne sont pas dédupliquées : une tâche relancée peut envoyer de nouveau.
<?php
use Illuminate\Mail\Mailable;
use Symfony\Component\Mime\Email;
class SpringSale extends Mailable
{
public function build(): static
{
return $this
->subject('Spring sale')
->view('mail.spring-sale')
->withSymfonyMessage(fn (Email $message) => $message->getHeaders()->addTextHeader('X-HonkIO-Commercial', 'true'));
}
}Une notification SMS utilise le canal honkio et retourne un HonkioMessage depuis toHonkio. Le numéro du destinataire (E.164) vient de routeNotificationForHonkio sur le notifiable, et un notifiable sans numéro est ignoré sans appeler l’API. Chaque destinataire doit avoir un consentement au dossier selon la LCAP. Les notifications portent une clé d’idempotence : une tâche en file relancée ne peut donc ni envoyer ni facturer deux fois.
<?php
use Honkio\Laravel\Notifications\HonkioMessage;
use Illuminate\Notifications\Notification;
class ShipmentSent extends Notification
{
public function via($notifiable): array
{
return ['honkio'];
}
public function toHonkio($notifiable): HonkioMessage
{
return HonkioMessage::create('Your order has shipped.')
->from('+14165550100'); // optional, defaults to HONKIO_SMS_FROM
}
}<?php
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
class User extends Authenticatable
{
use Notifiable;
// The recipient's number, in E.164. A user with none is skipped without calling the API.
public function routeNotificationForHonkio($notification): ?string
{
return $this->phone_number;
}
}Le client est aussi disponible par la façade Honkio (Honkio::messages()->send([...])) et, comme singleton, en typant Honkio\Honkio.
HonkIO