Opsender
API WHATSAPP OPSENDER

Intégrez WhatsApp à votre application

Envoyez des messages, suivez leur livraison, consultez les conversations et automatisez les événements.

65
opérations v1
8
domaines fonctionnels
HTTPS
production sécurisée
Endpoints opérationnels

Ces routes sont implémentées et protégées par clé API. Les actions WhatsApp nécessitent une instance connectée et peuvent dépendre des capacités du fournisseur.

01

Démarrage rapide

Gardez la clé API côté serveur et transmettez-la avec chaque requête protégée.

Connexion

Base URL
https://sender.opportail.com/v1

X-API-Key: votre_cle_api
Content-Type: application/json

Première requête

curl -sS \
  -H "X-API-Key: $OPSENDER_API_KEY" \
  https://sender.opportail.com/v1/instances

Envoyer un message texte

curl -sS -X POST \
  -H "X-API-Key: $OPSENDER_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: commande_20260904_0001" \
  -d '{"to":"+243000000000","type":"text","text":{"body":"Bonjour"}}' \
  https://sender.opportail.com/v1/instances/opportail-rdc/messages
02

Système, instances et capacités

Inspecter et piloter les numéros WhatsApp.

GET  /health
GET  /openapi.yaml
GET  /capabilities
GET  /instances
POST /instances
GET  /instances/{instanceId}
GET  /instances/{instanceId}/capabilities
POST /instances/{instanceId}/capabilities/probe
GET  /instances/{instanceId}/events
POST /instances/{instanceId}/connect
POST /instances/{instanceId}/restart
POST /instances/{instanceId}/disconnect
03

Messages et actions

Texte, médias, localisation, sondage, boutons expérimentaux et actions sur les messages.

GET  /instances/{instanceId}/messages
POST /instances/{instanceId}/messages
GET  /instances/{instanceId}/messages/search
GET  /instances/{instanceId}/messages/{messageId}
GET  /instances/{instanceId}/messages/{messageId}/media
GET  /instances/{instanceId}/messages/{messageId}/delivery
POST /instances/{instanceId}/messages/{messageId}/react
POST /instances/{instanceId}/messages/{messageId}/reply
POST /instances/{instanceId}/messages/{messageId}/forward
POST /instances/{instanceId}/messages/{messageId}/edit
POST /instances/{instanceId}/messages/{messageId}/delete
POST /instances/{instanceId}/chats/{chatId}/read

Boutons : envoyez type: buttons avec 1 à 3 éléments. Cette capacité est expérimentale et utilise un repli texte si WhatsApp rejette le rendu interactif ou ne confirme pas sa réception serveur. Les réponses 1, 2, 3 ou le libellé du choix sont automatiquement publiées dans message.button_response.

Recommandé : utilisez Idempotency-Key pour éviter les doublons pendant une reprise réseau.

04

Conversations et historique

Consulter le cache et synchroniser l'historique disponible.

GET  /instances/{instanceId}/conversations
GET  /instances/{instanceId}/conversations/{chatId}/messages
POST /instances/{instanceId}/conversations/{chatId}/read
POST /instances/{instanceId}/conversations/sync
GET  /instances/{instanceId}/conversations/sync
GET  /instances/{instanceId}/conversations/sync/{jobId}
GET  /instances/{instanceId}/chats
GET  /instances/{instanceId}/chats/{chatId}/messages
05

Groupes WhatsApp

Gérer les groupes, participants, administrateurs et invitations.

GET    /instances/{instanceId}/groups
GET    /instances/{instanceId}/groups/{groupId}
PATCH  /instances/{instanceId}/groups/{groupId}
GET    /instances/{instanceId}/groups/{groupId}/participants
POST   /instances/{instanceId}/groups/{groupId}/participants
DELETE /instances/{instanceId}/groups/{groupId}/participants
POST   /instances/{instanceId}/groups/{groupId}/admins
DELETE /instances/{instanceId}/groups/{groupId}/admins
GET    /instances/{instanceId}/groups/{groupId}/invite
POST   /instances/{instanceId}/groups/{groupId}/invite/reset
POST   /instances/{instanceId}/groups/{groupId}/leave
06

Contacts CRM

Créer et maintenir les contacts du compte client.

GET    /contacts
POST   /contacts
GET    /contacts/{contactId}
PATCH  /contacts/{contactId}
DELETE /contacts/{contactId}
07

Webhooks

Configurer les événements, secrets, tests et relances.

GET    /instances/{instanceId}/channels
POST   /instances/{instanceId}/channels
GET    /instances/{instanceId}/channels/{channelId}
PATCH  /instances/{instanceId}/channels/{channelId}
DELETE /instances/{instanceId}/channels/{channelId}
POST   /instances/{instanceId}/channels/{channelId}/subscribe
POST   /instances/{instanceId}/channels/{channelId}/unsubscribe
POST   /instances/{instanceId}/channels/{channelId}/messages
GET    /webhooks
POST   /webhooks
PATCH  /webhooks/{webhookId}
DELETE /webhooks/{webhookId}
POST   /webhooks/{webhookId}/active
POST   /webhooks/{webhookId}/rotate-secret
POST   /webhooks/{webhookId}/test
GET    /webhook-deliveries
POST   /webhook-deliveries/{deliveryId}/replay

Événements courants

message.sent, message.ack, message.failed, message.button_response, session.ready, session.disconnected

message.ack fournit deliveryStatus : pending, sent, delivered, read, played ou failed.

Signature

X-Opsender-Event
X-Opsender-Delivery
X-Opsender-Signature: sha256=...
08

Confirmer une annonce par WhatsApp

Parcours recommandé pour HuzaMarket et les plateformes de petites annonces.

Choix corrélés

"items": [
  { "id": "HM-4821.available", "body": "Oui" },
  { "id": "HM-4821.unavailable", "body": "Non" }
]

Les réponses 1/OUI et 2/NON déclenchent message.button_response. Utilisez response.buttonId, pas le texte libre, comme instruction métier.

Sécurité obligatoire

Vérifiez X-Opsender-Signature sur le corps brut, dédupliquez deliveryId, puis contrôlez que le numéro from appartient au propriétaire de l'annonce avant toute mise à jour.

Activez includeMessageContent, désactivez maskIdentifiers et confirmez sensitiveDataConsent dans la politique du webhook.

Livraison : toute réponse 2xx est acceptée, avec un délai maximal de 10 secondes. Opsender tente par défaut 5 livraisons avec reprises progressives. Le secret HMAC-SHA256 est retourné une seule fois à la création ou à la rotation.

09

Erreurs, pagination et limites

Prévoyez les reprises et traitements asynchrones.

202Traitement asynchrone
401Clé absente ou invalide
404Ressource inaccessible
409Conflit d'état
429Limite temporaire
503Capacité indisponible

Renvoyez nextCursor sans le modifier et consultez GET /capabilities avant une fonction avancée.

Prêt à intégrer Opsender ?

Créez votre compte et commencez par lister vos instances.