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.

bash
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é.

javascript
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? }.

nameQuand
un code de l'API tel que NON_CANADIAN_NUMBERl'API a refusé la requête; statusCode est son statut HTTP
network_erroraucune réponse n'est arrivée (DNS, connexion refusée, délai de 30 secondes); statusCode est null
application_errorle corps de la réponse n'était pas du JSON, par exemple une page d'erreur d'un proxy
invalid_argumentun identifiant était vide, . ou .., ou un appel de consentement nommait les deux sujets ou aucun; rien n'a été envoyé
invalid_signaturewebhooks.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).

javascript
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éthodeRouteDocumentation
honkio.messages.sendPOST /v1/messagesEnvoi de messages
honkio.messages.listGET /v1/messagesEnvoi de messages
honkio.messages.getGET /v1/messages/{id}Envoi de messages
honkio.messages.updatePATCH /v1/messages/{id}Envoi de messages
honkio.messages.cancelDELETE /v1/messages/{id}Envoi de messages

honkio.phoneNumbers

MéthodeRouteDocumentation
honkio.phoneNumbers.areaCodesGET /v1/phone-numbers/area-codesNuméros de téléphone
honkio.phoneNumbers.provisionPOST /v1/phone-numbersNuméros de téléphone
honkio.phoneNumbers.listGET /v1/phone-numbersNuméros de téléphone
honkio.phoneNumbers.getGET /v1/phone-numbers/{id}Numéros de téléphone
honkio.phoneNumbers.releaseDELETE /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éthodeRouteDocumentation
honkio.tollFreeVerifications.optionsGET /v1/toll-free-verifications/optionsNuméros sans frais
honkio.tollFreeVerifications.createPOST /v1/toll-free-verificationsNuméros sans frais
honkio.tollFreeVerifications.listGET /v1/toll-free-verificationsNuméros sans frais
honkio.tollFreeVerifications.getGET /v1/toll-free-verifications/{id}Numéros sans frais
honkio.tollFreeVerifications.updatePATCH /v1/toll-free-verifications/{id}Numéros sans frais
honkio.tollFreeVerifications.submitPOST /v1/toll-free-verifications/{id}/submitNuméros sans frais
honkio.tollFreeVerifications.cancelDELETE /v1/toll-free-verifications/{id}Numéros sans frais

honkio.businessVerification

MéthodeRouteDocumentation
honkio.businessVerification.getGET /v1/business-verificationTarifs et limites
honkio.businessVerification.savePUT /v1/business-verificationTarifs et limites
honkio.businessVerification.submitPOST /v1/business-verification/submitTarifs et limites

honkio.autoTopup

MéthodeRouteDocumentation
honkio.autoTopup.getGET /v1/auto-topupTarifs et limites

honkio.topupCapRequests

MéthodeRouteDocumentation
honkio.topupCapRequests.createPOST /v1/account/topup-cap-requestsTarifs et limites
honkio.topupCapRequests.listGET /v1/account/topup-cap-requestsTarifs et limites

honkio.sendLimit

MéthodeRouteDocumentation
honkio.sendLimit.getGET /v1/send-limitTarifs et limites

honkio.verify

MéthodeRouteDocumentation
honkio.verify.startPOST /v1/verifyVérification (codes à usage unique)
honkio.verify.checkPOST /v1/verify/{id}/checkVérification (codes à usage unique)
honkio.verify.getGET /v1/verify/{id}Vérification (codes à usage unique)
honkio.verify.listGET /v1/verifyVé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éthodeRouteDocumentation
honkio.consents.createPOST /v1/compliance/consentsConsentement (LCAP)
honkio.consents.listGET /v1/compliance/consentsConsentement (LCAP)
honkio.consents.checkGET /v1/compliance/consents/checkConsentement (LCAP)
honkio.consents.revokeDELETE /v1/compliance/consents/{phone}Consentement (LCAP)
honkio.consents.revokeDELETE /v1/compliance/consents/email/{address}LCAP et suppressions
honkio.consents.recordBatchPOST /v1/compliance/consents/batchConsentement (LCAP)
MéthodeRouteDocumentation

honkio.optInConfirmations

MéthodeRouteDocumentation
honkio.optInConfirmations.sendPOST /v1/compliance/opt-in-confirmationsNuméros sans frais
honkio.optInConfirmations.listGET /v1/compliance/opt-in-confirmationsNuméros sans frais

honkio.emails

MéthodeRouteDocumentation
honkio.emails.sendPOST /v1/emailsEnvoi et envois groupés
honkio.emails.listGET /v1/emailsEnvoi et envois groupés
honkio.emails.getGET /v1/emails/{id}Envoi et envois groupés
honkio.emails.updatePATCH /v1/emails/{id}Envoi et envois groupés
honkio.emails.cancelDELETE /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éthodeRouteDocumentation
honkio.batch.sendPOST /v1/emails/batchEnvoi et envois groupés

honkio.emails.received

MéthodeRouteDocumentation
honkio.emails.received.listGET /v1/emails/receivedRéception
honkio.emails.received.addressGET /v1/emails/received/addressRéception
honkio.emails.received.setAddressEnabledPATCH /v1/emails/received/addressRéception
honkio.emails.received.getGET /v1/emails/received/{id}Réception
honkio.emails.received.rawGET /v1/emails/received/{id}/rawRéception
honkio.emails.received.attachmentGET /v1/emails/received/{id}/attachments/{attachmentId}Réception
honkio.emails.received.simulatePOST /v1/emails/received/simulateRé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éthodeRouteDocumentation
honkio.domains.createPOST /v1/email-domainsDomaines
honkio.domains.listGET /v1/email-domainsDomaines
honkio.domains.getGET /v1/email-domains/{id}Domaines
honkio.domains.updatePATCH /v1/email-domains/{id}Domaines
honkio.domains.verifyPOST /v1/email-domains/{id}/verifyDomaines
honkio.domains.removeDELETE /v1/email-domains/{id}Domaines

honkio.suppressions

MéthodeRouteDocumentation
honkio.suppressions.createPOST /v1/email-suppressionsLCAP et suppressions
honkio.suppressions.listGET /v1/email-suppressionsLCAP et suppressions
honkio.suppressions.removeDELETE /v1/email-suppressions/{address}LCAP et suppressions

honkio.templates

MéthodeRouteDocumentation
honkio.templates.createPOST /v1/templatesModèles
honkio.templates.listGET /v1/templatesModèles
honkio.templates.getGET /v1/templates/{idOrAlias}Modèles
honkio.templates.updatePATCH /v1/templates/{idOrAlias}Modèles
honkio.templates.publishPOST /v1/templates/{idOrAlias}/publishModèles
honkio.templates.rollbackPOST /v1/templates/{idOrAlias}/rollbackModèles
honkio.templates.versionsGET /v1/templates/{idOrAlias}/versionsModèles
honkio.templates.removeDELETE /v1/templates/{idOrAlias}Modèles

honkio.emailTemplates

MéthodeRouteDocumentation
honkio.emailTemplates.createPOST /v1/email-templatesModèles
honkio.emailTemplates.listGET /v1/email-templatesModèles
honkio.emailTemplates.getGET /v1/email-templates/{idOrAlias}Modèles
honkio.emailTemplates.updatePATCH /v1/email-templates/{idOrAlias}Modèles
honkio.emailTemplates.publishPOST /v1/email-templates/{idOrAlias}/publishModèles
honkio.emailTemplates.rollbackPOST /v1/email-templates/{idOrAlias}/rollbackModèles
honkio.emailTemplates.versionsGET /v1/email-templates/{idOrAlias}/versionsModèles
honkio.emailTemplates.removeDELETE /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éthodeRouteDocumentation
honkio.push.sendPOST /v1/pushEnvoi et repli
honkio.push.listGET /v1/pushEnvoi et repli
honkio.push.getGET /v1/push/{id}Envoi et repli
honkio.push.updatePATCH /v1/push/{id}Envoi et repli
honkio.push.cancelDELETE /v1/push/{id}Envoi et repli
honkio.push.usageGET /v1/push/usageEnvoi et repli

honkio.push.apps

MéthodeRouteDocumentation
honkio.push.apps.createPOST /v1/push/appsIdentifiants
honkio.push.apps.listGET /v1/push/appsIdentifiants
honkio.push.apps.getGET /v1/push/apps/{id}Identifiants
honkio.push.apps.updatePATCH /v1/push/apps/{id}Identifiants
honkio.push.apps.deleteDELETE /v1/push/apps/{id}Identifiants

honkio.push.web

MéthodeRouteDocumentation
honkio.push.web.setVapidKeysPOST /v1/push/apps/{id}/web/vapid-keysWeb push (navigateurs)

honkio.push.devices

MéthodeRouteDocumentation
honkio.push.devices.registerPUT /v1/push/devicesAppareils
honkio.push.devices.listGET /v1/push/devicesAppareils
honkio.push.devices.deleteDELETE /v1/push/devices/{id}Appareils

honkio.notify

MéthodeRouteDocumentation
honkio.notify.sendPOST /v1/notifyEnvoyer une notification

honkio.notifications

MéthodeRouteDocumentation
honkio.notifications.getGET /v1/notifications/{id}Envoyer une notification
honkio.notifications.listGET /v1/notificationsEnvoyer une notification

honkio.recipients

MéthodeRouteDocumentation
honkio.recipients.upsertPUT /v1/recipients/{user_id}Profils de destinataires
honkio.recipients.updatePATCH /v1/recipients/{user_id}Profils de destinataires
honkio.recipients.getGET /v1/recipients/{user_id}Profils de destinataires
honkio.recipients.listGET /v1/recipientsProfils de destinataires
honkio.recipients.deleteDELETE /v1/recipients/{user_id}Profils de destinataires

honkio.webhooks

MéthodeRouteDocumentation
honkio.webhooks.createPOST /v1/webhooksVue d’ensemble
honkio.webhooks.listGET /v1/webhooksVue d’ensemble
honkio.webhooks.getGET /v1/webhooks/{id}Vue d’ensemble
honkio.webhooks.updatePATCH /v1/webhooks/{id}Vue d’ensemble
honkio.webhooks.removeDELETE /v1/webhooks/{id}Vue d’ensemble
honkio.webhooks.deliveriesGET /v1/webhooks/{id}/deliveriesVue d’ensemble
honkio.webhooks.deadLettersGET /v1/webhooks/{id}/dead-lettersVue d’ensemble
honkio.webhooks.replayPOST /v1/webhooks/dead-letters/{dlid}/replayVue d’ensemble
honkio.webhooks.discardDELETE /v1/webhooks/dead-letters/{dlid}Vue d’ensemble
honkio.webhooks.reactivatePOST /v1/webhooks/{id}/reactivateVue d’ensemble
honkio.webhooks.rotateSecretPOST /v1/webhooks/{id}/rotate-secretVé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éthodeRouteDocumentation
honkio.authApps.createPythonclient.auth_apps.createPHP$honkio->authApps->createPOST /v1/auth-appsCréer une application
honkio.authApps.listPythonclient.auth_apps.listPHP$honkio->authApps->listGET /v1/auth-appsLister les applications
honkio.authApps.getPythonclient.auth_apps.getPHP$honkio->authApps->getGET /v1/auth-apps/{id}Obtenir une application
honkio.authApps.updatePythonclient.auth_apps.updatePHP$honkio->authApps->updatePATCH /v1/auth-apps/{id}Modifier une application
honkio.authApps.removePythonclient.auth_apps.removePHP$honkio->authApps->removeDELETE /v1/auth-apps/{id}Supprimer une application
honkio.authApps.rotateSecretPythonclient.auth_apps.rotate_secretPHP$honkio->authApps->rotateSecretPOST /v1/auth-apps/{id}/rotate-secretRemplacer le secret client
honkio.authApps.verifyDomainPythonclient.auth_apps.verify_domainPHP$honkio->authApps->verifyDomainPOST /v1/auth-apps/{id}/domain/verifyVérifier le domaine
honkio.authApps.cancelHostnameChangePythonclient.auth_apps.cancel_hostname_changePHP$honkio->authApps->cancelHostnameChangeDELETE /v1/auth-apps/{id}/hostname-changeAnnuler un changement de nom d’hôte

honkio.authApps.security

MéthodeRouteDocumentation
honkio.authApps.security.getPythonclient.auth_apps.security.getPHP$honkio->authApps->security->getGET /v1/auth-apps/{id}/securityObtenir les réglages de sécurité
honkio.authApps.security.updatePythonclient.auth_apps.security.updatePHP$honkio->authApps->security->updatePATCH /v1/auth-apps/{id}/securityModifier les réglages de sécurité
honkio.authApps.security.summaryPythonclient.auth_apps.security.summaryPHP$honkio->authApps->security->summaryGET /v1/auth-apps/{id}/security/summaryObtenir le sommaire de sécurité

honkio.authApps.blocklist

MéthodeRouteDocumentation
honkio.authApps.blocklist.listPythonclient.auth_apps.blocklist.listPHP$honkio->authApps->security->blocklistGET /v1/auth-apps/{id}/security/blocklistLister la liste de blocage
honkio.authApps.blocklist.addPythonclient.auth_apps.blocklist.addPHP$honkio->authApps->security->addToBlocklistPOST /v1/auth-apps/{id}/security/blocklistAjouter à la liste de blocage
honkio.authApps.blocklist.removePythonclient.auth_apps.blocklist.removePHP$honkio->authApps->security->removeFromBlocklistDELETE /v1/auth-apps/{id}/security/blocklist/{entryId}Retirer de la liste de blocage

honkio.authApps.plan

MéthodeRouteDocumentation
honkio.authApps.plan.getPythonclient.auth_apps.plan.getPHP$honkio->authApps->plan->getGET /v1/auth-apps/{id}/planObtenir le forfait
honkio.authApps.plan.changePythonclient.auth_apps.plan.changePHP$honkio->authApps->plan->changePUT /v1/auth-apps/{id}/planChanger le forfait
honkio.authApps.plan.cancelScheduledPythonclient.auth_apps.plan.cancel_scheduledPHP$honkio->authApps->plan->cancelScheduledChangeDELETE /v1/auth-apps/{id}/plan/scheduledAnnuler une rétrogradation prévue
honkio.authApps.plan.costsPythonclient.auth_apps.plan.costsPHP$honkio->authApps->plan->costsGET /v1/auth-apps/{id}/costsObtenir les coûts de connexion
honkio.authApps.plan.usagePythonclient.auth_apps.plan.usagePHP$honkio->authApps->plan->usageGET /v1/auth-apps/{id}/usageObtenir l’utilisation

honkio.authApps.signInPolicy

MéthodeRouteDocumentation
honkio.authApps.signInPolicy.getPythonclient.auth_apps.sign_in_policy.getPHP$honkio->authApps->signInPolicyGET /v1/auth-apps/{id}/sign-in-policyObtenir la politique de connexion
honkio.authApps.signInPolicy.updatePythonclient.auth_apps.sign_in_policy.updatePHP$honkio->authApps->updateSignInPolicyPATCH /v1/auth-apps/{id}/sign-in-policyModifier la politique de connexion

honkio.authApps.organizations

MéthodeRouteDocumentation
honkio.authApps.organizations.listPythonclient.auth_apps.organizations.listPHP$honkio->authApps->organizations->listGET /v1/auth-apps/{id}/organizationsLister les organisations
honkio.authApps.organizations.createPythonclient.auth_apps.organizations.createPHP$honkio->authApps->organizations->createPOST /v1/auth-apps/{id}/organizationsCréer une organisation
honkio.authApps.organizations.getPythonclient.auth_apps.organizations.getPHP$honkio->authApps->organizations->getGET /v1/auth-apps/{id}/organizations/{orgId}Obtenir une organisation
honkio.authApps.organizations.updatePythonclient.auth_apps.organizations.updatePHP$honkio->authApps->organizations->updatePATCH /v1/auth-apps/{id}/organizations/{orgId}Modifier une organisation
honkio.authApps.organizations.removePythonclient.auth_apps.organizations.removePHP$honkio->authApps->organizations->removeDELETE /v1/auth-apps/{id}/organizations/{orgId}Supprimer une organisation

honkio.authApps.memberships

MéthodeRouteDocumentation
honkio.authApps.memberships.listPythonclient.auth_apps.memberships.listPHP$honkio->authApps->organizations->membershipsGET /v1/auth-apps/{id}/organizations/{orgId}/membershipsLister les membres
honkio.authApps.memberships.addPythonclient.auth_apps.memberships.addPHP$honkio->authApps->organizations->addMembershipPOST /v1/auth-apps/{id}/organizations/{orgId}/membershipsAjouter un membre
honkio.authApps.memberships.getPythonclient.auth_apps.memberships.getPHP$honkio->authApps->organizations->membershipGET /v1/auth-apps/{id}/organizations/{orgId}/memberships/{userId}Obtenir une adhésion
honkio.authApps.memberships.updatePythonclient.auth_apps.memberships.updatePHP$honkio->authApps->organizations->updateMembershipPATCH /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->removeMembershipDELETE /v1/auth-apps/{id}/organizations/{orgId}/memberships/{userId}Retirer un membre

honkio.authApps.roles

MéthodeRouteDocumentation
honkio.authApps.roles.listPythonclient.auth_apps.roles.listPHP$honkio->authApps->organizations->rolesGET /v1/auth-apps/{id}/organizations/{orgId}/rolesLister les rôles
honkio.authApps.roles.putPythonclient.auth_apps.roles.putPHP$honkio->authApps->organizations->putRolePUT /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->removeRoleDELETE /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éthodeRouteDocumentation
honkio.authApps.invitations.listPythonclient.auth_apps.invitations.listPHP$honkio->authApps->invitations->listGET /v1/auth-apps/{id}/invitationsLister les invitations
honkio.authApps.invitations.createPythonclient.auth_apps.invitations.createPHP$honkio->authApps->invitations->createPOST /v1/auth-apps/{id}/invitationsCréer une invitation
honkio.authApps.invitations.getPythonclient.auth_apps.invitations.getPHP$honkio->authApps->invitations->getGET /v1/auth-apps/{id}/invitations/{invitationId}Obtenir une invitation
honkio.authApps.invitations.revokePythonclient.auth_apps.invitations.revokePHP$honkio->authApps->invitations->revokeDELETE /v1/auth-apps/{id}/invitations/{invitationId}Révoquer une invitation

honkio.authApps.users

MéthodeRouteDocumentation
honkio.authApps.users.listPythonclient.auth_apps.users.listPHP$honkio->authApps->users->listGET /v1/auth-apps/{id}/usersLister les utilisateurs
honkio.authApps.users.getPythonclient.auth_apps.users.getPHP$honkio->authApps->users->getGET /v1/auth-apps/{id}/users/{userId}Obtenir un utilisateur
honkio.authApps.users.updatePythonclient.auth_apps.users.updatePHP$honkio->authApps->users->updatePATCH /v1/auth-apps/{id}/users/{userId}Modifier un utilisateur
honkio.authApps.users.blockPythonclient.auth_apps.users.blockPHP$honkio->authApps->users->blockPOST /v1/auth-apps/{id}/users/{userId}/blockBloquer un utilisateur
honkio.authApps.users.unblockPythonclient.auth_apps.users.unblockPHP$honkio->authApps->users->unblockPOST /v1/auth-apps/{id}/users/{userId}/unblockDébloquer un utilisateur
honkio.authApps.users.removePythonclient.auth_apps.users.removePHP$honkio->authApps->users->removeDELETE /v1/auth-apps/{id}/users/{userId}Supprimer un utilisateur
honkio.authApps.users.removeLikelyBotsPythonclient.auth_apps.users.remove_likely_botsPHP$honkio->authApps->users->removeLikelyBotsPOST /v1/auth-apps/{id}/users/bulk-deleteSupprimer les robots probables
honkio.authApps.users.sessionsPythonclient.auth_apps.users.sessionsPHP$honkio->authApps->users->sessionsGET /v1/auth-apps/{id}/users/{userId}/sessionsLister les sessions d’un utilisateur
honkio.authApps.users.signInsPythonclient.auth_apps.users.sign_insPHP$honkio->authApps->users->signInsGET /v1/auth-apps/{id}/users/{userId}/sign-insLister les connexions d’un utilisateur
honkio.authApps.users.passkeysPythonclient.auth_apps.users.passkeysPHP$honkio->authApps->users->passkeysGET /v1/auth-apps/{id}/users/{userId}/passkeysLister les clés d’accès d’un utilisateur
honkio.authApps.users.removePasskeyPythonclient.auth_apps.users.remove_passkeyPHP$honkio->authApps->users->removePasskeyDELETE /v1/auth-apps/{id}/users/{userId}/passkeys/{passkeyId}Retirer une clé d’accès d’un utilisateur

honkio.authApps.sessions

MéthodeRouteDocumentation
honkio.authApps.sessions.revokePythonclient.auth_apps.sessions.revokePHP$honkio->authApps->users->revokeSessionDELETE /v1/auth-apps/{id}/sessions/{sessionId}Révoquer une session

honkio.authApps.signIns

MéthodeRouteDocumentation
honkio.authApps.signIns.listPythonclient.auth_apps.sign_ins.listPHP$honkio->authApps->signInsGET /v1/auth-apps/{id}/sign-insLister l’historique de connexion

honkio.authApps.exports

MéthodeRouteDocumentation
honkio.authApps.exports.createPythonclient.auth_apps.exports.createPHP$honkio->authApps->exports->createPOST /v1/auth-apps/{id}/exportsLancer une exportation
honkio.authApps.exports.latestPythonclient.auth_apps.exports.latestPHP$honkio->authApps->exports->latestGET /v1/auth-apps/{id}/exports/latestObtenir la dernière exportation
honkio.authApps.exports.getPythonclient.auth_apps.exports.getPHP$honkio->authApps->exports->getGET /v1/auth-apps/{id}/exports/{exportId}Obtenir une exportation
honkio.authApps.exports.downloadPythonclient.auth_apps.exports.downloadPHP$honkio->authApps->exports->downloadGET /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.

javascript
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.

bash
pip install honkio

Cré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.

python
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_NUMBER

Envoyez un courriel de la même façon :

python
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 :

python
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).

python
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.

python
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.

python
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 "", 204

PHP

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.

bash
composer require honkio/honkio-php

Créez une clé comme ci-dessus. new Honkio() sans argument lit HONKIO_API_KEY et lance InvalidArgumentException si aucune n’est définie.

php
<?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
<?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
<?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
<?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
<?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.

bash
composer require honkio/laravel

Dé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) :

dotenv
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.

dotenv
# The defaults, from version 0.2.0
HONKIO_MAX_RETRIES=2
HONKIO_MAX_RETRY_DELAY=60

Ajoutez 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
<?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
<?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
<?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
<?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.