callable tient compte de l'accord, de l'opposition, du refus de moins de 60 jours et du quota de 4 appels sur 30 jours ; within_legal_hours indique si l'heure actuelle est dans les horaires légaux, next_window donne le prochain créneau autorisé sinon.
Liste les accords avec filtres et pagination par curseur. Le paramètre status accepte active, pending, withdrawn et expired ; chaque élément suit le format complet ci-dessous.
Retire un accord et enregistre la note associée. La réponse reprend le même objet complet ; si l’accord était déjà retiré, elle contient aussi "already": true.
curl -X POST "https://tuzanhultqcubdubhojy.supabase.co/functions/v1/api/v1/consents/CONSENT_ID/withdraw" \
-H "Authorization: Bearer apl_live_…" -H "Content-Type: application/json" -d '{"note":"Demande reçue par téléphone"}'
Dédoublonnez les traitements sur id : un même événement peut être renvoyé en cas de réessai.
Vérifier la signature en Node.js
L'en-tête Appelable-Signature vaut t=<unix>,v1=<hex>. La signature est HMAC-SHA256 du secret appliqué à « timestamp.corps brut ». Rejetez les requêtes de plus de 300 secondes.
import crypto from "node:crypto";
// signature = req.headers["appelable-signature"]
// secret = le whsec_ du webhook
// rawBody = le corps brut non reparsé (par exemple avec express.raw())
const [tPart, v1Part] = signature.split(",");
const timestamp = Number(tPart.replace("t=", ""));
if (Math.abs(Date.now() / 1000 - timestamp) > 300) throw new Error("Signature expirée");
const expected = crypto.createHmac("sha256", secret).update(`${timestamp}.${rawBody}`).digest("hex");
const received = v1Part.replace("v1=", "");
const a = Buffer.from(expected, "hex");
const b = Buffer.from(received, "hex");
if (a.length !== b.length || !crypto.timingSafeEqual(a, b)) throw new Error("Signature invalide");
Réessais automatiques après 1, 5, 30, 120 et 720 minutes, soit 6 tentatives au total. Toute réponse 2xx vaut succès.
Relier votre CRM
Automatisez la synchronisation via Make, Zapier ou n8n. Il ne s'agit pas d'une intégration native.
1. Déclencheur : dans Make, choisissez « Webhooks → Custom webhook » ; dans Zapier, « Webhooks by Zapier → Catch Hook » ; dans n8n, le nœud « Webhook ». Collez l'URL dans Appelable → Intégrations → Webhooks, cochez consent.confirmed et consent.withdrawn, puis cliquez sur « Tester ».
2. Recherche : dans HubSpot, utilisez « Search objects / Find contact » pour retrouver le contact par téléphone, puis créez ou mettez à jour la fiche.
4. Retrait : pour consent.withdrawn, passez « Statut accord » à « retiré » et videz « Accord d'appel jusqu'au ».
5. Avant une campagne : exportez la liste du CRM, envoyez-la à POST /v1/check par lots de 1 000 numéros, puis ne gardez que les résultats avec callable = true.