Aller au contenu principal
API publique · v1

Référence développeur

Envoyez des messages WhatsApp et gérez vos contacts par API REST. Facturation à la consommation, sans abonnement — pensée pour les intégrations et le gros volume.

BASEhttps://api.whakup.com/v1

Introduction

L'API Whakup est une API REST : requêtes et réponses en JSON, dates au format ISO 8601. Toutes les données sont scopées au workspace de la clé utilisée.

  • Base : https://api.whakup.com/v1
  • En-tête Content-Type: application/json pour les requêtes avec corps.
  • Facturation à la consommation, agrégée par mois.

Authentification

Chaque requête porte une clé d'API du workspace (préfixe wk_), au choix dans l'un des deux en-têtes :

# Recommandé
Authorization: Bearer wk_votre_cle

# Alternative
X-Api-Key: wk_votre_cle

Création

Tableau de bord → Réglages → Clés API (offre Business).

Affichée une fois

La clé en clair n’apparaît qu’à la création — conservez-la.

Révocable

Révocation immédiate depuis le tableau de bord.

Sécurité

Seul le hash SHA-256 est stocké côté serveur.

Requête sans clé valide → 401 Unauthorized. Ne jamais exposer une clé côté navigateur.

Limites & quotas

LimitePortéeValeurDépassement
Débit APIpar clé1 200 / minrate_limited
Débit d’envoipar numéro80 / secondethroughput_exceeded
Quota marketingpar numéro / jourlimite Metamarketing_quota_reached
Quota mensuelpar offreinclus dans l’offrequota_reached

Le débit d'envoi (80/s) est partagé avec l'envoi de campagnes depuis l'app. Les réponses429 incluent un en-tête Retry-After (secondes) : respectez-le (back-off).

Erreurs

Forme : { "error": "message", "code": "machine_code" }

HTTPcodeSignification
400—Requête invalide (champ requis manquant).
401—Clé API invalide ou manquante.
402feature_lockedAccès API non inclus dans l’offre.
402quota_reachedQuota mensuel de messages atteint.
429rate_limitedTrop de requêtes pour cette clé.
429throughput_exceededDébit maximal du numéro atteint.
429marketing_quota_reachedQuota marketing quotidien atteint.
502—Échec côté fournisseur (non envoyé).

Vérifier la clé

GET/ping

Renvoie le workspace associé à la clé. Idéal pour tester l'authentification.

curl https://api.whakup.com/v1/ping \
  -H "Authorization: Bearer wk_votre_cle"

Réponse 200

{ "workspace": { "id": "018f…", "name": "Ma Boutique" } }

Lister les contacts

GET/contacts
ChampTypeRequisNotes
limitentier—défaut 50, max 100
offsetentier—pagination (défaut 0)
curl "https://api.whakup.com/v1/contacts?limit=20&offset=0" \
  -H "Authorization: Bearer wk_votre_cle"

Réponse 200

{
  "data": [
    {
      "id": "018f…",
      "displayName": "Jean Dupont",
      "phone": "+2250700000000",
      "email": "jean.dupont@example.com",
      "createdAt": "2026-09-09T14:30:00+00:00"
    }
  ],
  "total": 5032
}

Créer ou mettre à jour un contact

POST/contacts

Crée le contact, ou met à jourcelui qui a déjà ce numéro (quel que soit son format) : un même appel peut être rejoué sans créer de doublon — idéal pour n8n, Zapier ou un formulaire de votre site. Les groupes indiqués sont créés s'ils n'existent pas.

ChampTypeRequisNotes
firstNamestring—prénom
lastNamestring—nom
displayNamestring—nom affiché (par défaut : prénom + nom)
phonestring—format international conseillé (+225…) — clé de dédoublonnage
emailstring—
customFieldsobjet—champs personnalisés, ex. { "ville": "Abidjan" }
groupstableau—noms ou identifiants de groupes (20 max) — créés si besoin

Au moins un des champs firstName, displayName ou phone est requis.

curl -X POST https://api.whakup.com/v1/contacts \
  -H "Authorization: Bearer wk_votre_cle" \
  -H "Content-Type: application/json" \
  -d '{
    "firstName": "Jean",
    "lastName": "Dupont",
    "phone": "+2250700000000",
    "groups": ["Prospects"]
  }'

Réponse 201 (créé) / 200 (mis à jour)

{
  "id": "018f…",
  "displayName": "Jean Dupont",
  "phone": "+2250700000000",
  "email": null,
  "createdAt": "2026-09-09T14:30:00+00:00",
  "groups": [{ "id": "018f…", "name": "Prospects" }],
  "created": true
}

L'ajout à un groupe déclenche les automatisations « Ajout à un groupe » actives de ce groupe (ex. message de bienvenue).

Lister les groupes

GET/groups

Groupes de contacts du workspace, triés par nom, avec leur nombre de membres.

curl https://api.whakup.com/v1/groups \
  -H "Authorization: Bearer wk_votre_cle"

Réponse 200

{
  "data": [
    { "id": "018f…", "name": "Prospects", "memberCount": 248 }
  ]
}

Ajouter des contacts à un groupe

POST/groups/{groupe}/contacts

Ajoute des contacts existants à un groupe désigné par son identifiant ou son nom(encodé dans l'URL) ; le groupe est créé s'il n'existe pas. Un contact déjà membre est ignoré.

ChampTypeRequisNotes
contactIdstableau✓identifiants des contacts (1 à 1 000)
curl -X POST "https://api.whakup.com/v1/groups/Prospects/contacts" \
  -H "Authorization: Bearer wk_votre_cle" \
  -H "Content-Type: application/json" \
  -d '{ "contactIds": ["018f…", "018f…"] }'

Réponse 201

{
  "group": { "id": "018f…", "name": "Clients VIP", "memberCount": 250 },
  "added": 2
}

Déclenche les automatisations « Ajout à un groupe » pour les nouveaux membres.contactIds vide ou plus de 1 000 → 400.

Envoyer un message WhatsApp

POST/messages

Envoi immédiat sur le canal WhatsApp du workspace. Facturé au message (voir Tarifs).

ChampTypeRequisNotes
tostring✓numéro destinataire (international)
bodystring✓contenu du message
categorystring—marketing | utility | authentication | service — défaut utility

La catégoriedoit refléter la nature réelle du message (règles Meta) : elle détermine les frais Meta et l'application du quota marketing.

curl -X POST https://api.whakup.com/v1/messages \
  -H "Authorization: Bearer wk_votre_cle" \
  -H "Content-Type: application/json" \
  -d '{
    "to": "+2250700000000",
    "body": "Votre commande est prête !",
    "category": "utility"
  }'

Réponse 201

{
  "id": "wamid.HBg…",
  "status": "sent",
  "to": "+2250700000000",
  "category": "utility",
  "cost": { "whakup": 0.0088, "meta": 0.0248, "total": 0.0336 }
}

Prérequis : un canal WhatsApp configuré (sinon 400). Voir la table des erreurs pour 402 / 429 / 502.

Lister les templates

GET/templates
ChampTypeRequisNotes
limitentier—défaut 25, max 100
offsetentier—pagination (défaut 0)
statusstring—draft | pending | approved | rejected (filtre)
curl "https://api.whakup.com/v1/templates?status=approved" \
  -H "Authorization: Bearer wk_votre_cle"

Réponse 200

{
  "data": [
    {
      "id": "018f…",
      "name": "confirmation_commande",
      "language": "fr",
      "category": "utility",
      "status": "approved",
      "body": "Bonjour {{1}}, votre commande est confirmée.",
      "variables": ["1"]
    }
  ],
  "total": 12
}

Créer un template

POST/templates

Crée un template (reste en draft jusqu'à soumission à Meta).

ChampTypeRequisNotes
namestring✓minuscules, chiffres, underscores
languagestring✓ex. fr, en_US
categorystring✓marketing | utility | authentication
bodystring✓≤ 1024 caractères, variables {{1}}
headerobjet—{ type: text|image|video|document, text?, mediaUrl? }
footerstring—≤ 60 caractères
buttonstableau—quick_reply | url | phone_number
samplesobjet—valeurs d’exemple des variables
curl -X POST https://api.whakup.com/v1/templates \
  -H "Authorization: Bearer wk_votre_cle" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "confirmation_commande",
    "language": "fr",
    "category": "utility",
    "body": "Bonjour {{1}}, votre commande est confirmée.",
    "samples": { "1": "Jean" }
  }'

Réponse 201

{
  "id": "018f…",
  "name": "confirmation_commande",
  "language": "fr",
  "category": "utility",
  "status": "draft",
  "variables": ["1"]
}

Nécessite l'accès API (402 feature_locked sinon). Nom déjà pris dans la langue → 409.

Soumettre à Meta

POST/templates/{id}/submit

Envoie le template en revue Meta (→ pending). Un canal WhatsApp connecté est requis.

curl -X POST https://api.whakup.com/v1/templates/018f…/submit \
  -H "Authorization: Bearer wk_votre_cle"

Erreurs : 409 no_channel_connected (aucun canal),422 (non conforme aux règles Meta),502 (refus Meta).

Supprimer un template

DELETE/templates/{id}
curl -X DELETE https://api.whakup.com/v1/templates/018f… \
  -H "Authorization: Bearer wk_votre_cle"

Réponse 204 (aucun contenu). Introuvable → 404.

Assistants IA (MCP)

Connectez Claude, Cursor ou tout assistant compatible MCP(Model Context Protocol) à votre compte, avec la même clé API. L'assistant consulte vos contacts, groupes, campagnes et statistiques, templates, conversations et automatisations, et prépare le travail (contacts, groupes, brouillons de templates et de campagnes). Il n'envoie jamais de message : vous lancez les campagnes depuis Whakup.

POSThttps://api.whakup.com/v1/mcp

Claude Code (terminal)

claude mcp add --transport http whakup https://api.whakup.com/v1/mcp \
  --header "Authorization: Bearer wk_votre_cle"

Cursor (.cursor/mcp.json)

{
  "mcpServers": {
    "whakup": {
      "url": "https://api.whakup.com/v1/mcp",
      "headers": { "Authorization": "Bearer wk_votre_cle" }
    }
  }
}

Claude Desktop (claude_desktop_config.json, Node.js requis)

{
  "mcpServers": {
    "whakup": {
      "command": "npx",
      "args": ["-y", "mcp-remote", "https://api.whakup.com/v1/mcp", "--header", "Authorization:${WHAKUP_AUTH}"],
      "env": { "WHAKUP_AUTH": "Bearer wk_votre_cle" }
    }
  }
}

Configuration aussi disponible, prête à copier avec votre clé, dans le tableau de bord (Réglages → Clés API → Assistant IA). Transport « Streamable HTTP », mêmes limites de débit que l'API, réservé aux offres incluant l'accès API (Business). Bientôt : connexion directe depuis claude.ai et ChatGPT.

Tarifs (à l'usage)

Coût par message = frais Whakup fixes + frais Meta selon la catégorie (€, indicatifs).

CatégorieWhakupMetaTotal
marketing0,0088 €0,0712 €0,0800 €
utility0,0088 €0,0248 €0,0336 €
authentication0,0088 €0,0248 €0,0336 €
service0,0088 €0,0000 €0,0088 €

Consommation du mois en cours visible dans le tableau de bord (facturation).

Bonnes pratiques

  • Stockez la clé côté serveur (variable d'environnement) ; jamais dans le navigateur.
  • Gérez les 429 avec l'en-tête Retry-After (back-off exponentiel).
  • Renseignez la bonne category — impact tarifaire et conformité Meta.
  • Pour de gros volumes, lissez les envois sous 80 msg/s par numéro.

Prêt à intégrer ?

Créez une clé API depuis votre tableau de bord et envoyez votre premier message.

Ouvrir le tableau de bord