Votre produit
Crée les organisations, déclenche les messages et affiche les statuts à ses utilisateurs.
WhatsApp Business Platform officielle
SMSV gère l’activation officielle, l’isolation de chaque organisation, les modèles approuvés et les statuts de livraison. Votre application conserve son expérience et son identité.
curl -X POST "https://smsv.tech/api/v1/partner/cloud/messages/send-template" \
-H "X-Partner-Key: pk_cloud_xxxxx" \
-H "Idempotency-Key: order-1042-ready" \
-H "Content-Type: application/json" \
-d '{
"externalOrgId": "client-123",
"to": "+22370000000",
"template": {
"name": "order_ready",
"language": "fr",
"variables": ["1042", "12 500 FCFA"]
}
}'Crée les organisations, déclenche les messages et affiche les statuts à ses utilisateurs.
Accompagne l’activation Meta, protège les clés, route les messages et distribue les webhooks.
Examine l’entreprise, approuve les modèles et applique ses politiques et tarifs de messagerie.
La clé partenaire pilote plusieurs organisations. Conservez-la exclusivement côté serveur, dans un gestionnaire de secrets, et ne l’exposez jamais au navigateur ou à une application mobile.
X-Partner-Key: pk_cloud_xxxxxUtilisée avec les endpoints `/v1/partner/cloud/*`.
X-API-Key: sp_live_xxxxxRéservée aux opérations d’une seule application SMSV.
Le client termine le parcours Meta guidé par SMSV. Une fois son numéro enregistré et son sender créé, votre backend rattache ce sender à son identifiant dans votre produit.
Créez ou sélectionnez l’application SMSV correspondant à votre organisation cliente.
Le client autorise son portefeuille Meta, sélectionne son numéro et soumet les informations nécessaires.
Associez le sender officiel à votre externalOrgId avant d’envoyer le premier message.
/v1/partner/cloud/senders/{externalOrgId}/meta-linkRattache un sender Meta déjà créé dans SMSV à l’organisation correspondante dans votre produit. appId et senderId doivent appartenir au même espace autorisé.
{
"appId": "app_xxx",
"senderId": "sender_xxx"
}{
"id": "sender_xxx",
"externalOrgId": "client-123",
"displayName": "Boutique Awa",
"status": "ACTIVE",
"phoneNumber": "+22370000000"
}/v1/partner/cloud/senders?ownerExternalOrgId={ownerId}Liste les senders accessibles dans le périmètre du propriétaire indiqué.
{
"senders": [{
"id": "sender_xxx",
"externalOrgId": "client-123",
"displayName": "Boutique Awa",
"status": "ACTIVE",
"phoneNumber": "+22370000000"
}]
}/v1/partner/cloud/senders/{externalOrgId}/statusRetourne l’état du sender. Ne considérez le canal prêt que lorsque l’API renvoie un état actif utilisable.
{
"externalOrgId": "client-123",
"status": "ACTIVE",
"phoneNumber": "+22370000000",
"connectedAt": "2026-08-31T12:00:00Z"
}En dehors des 24 heures suivant le dernier message du client, utilisez un modèle approuvé. Les messages libres sont réservés à une fenêtre de service client ouverte.
/v1/partner/cloud/messages/send-templateEnvoie un modèle approuvé. Fournissez une clé d’idempotence stable afin qu’une reprise réseau ne crée pas de doublon.
{
"externalOrgId": "client-123",
"to": "+22370000000",
"template": {
"name": "order_ready",
"language": "fr",
"variables": ["1042", "12 500 FCFA"]
}
}{
"success": true,
"messageId": "msg_xxx",
"status": "queued"
}/v1/partner/cloud/messages/sendEnvoie un texte libre uniquement lorsqu’une fenêtre de service client est ouverte.
{
"externalOrgId": "client-123",
"to": "+22370000000",
"text": "Bonjour, comment pouvons-nous vous aider ?"
}{
"success": true,
"messageId": "msg_xxx",
"status": "queued"
}Répondez rapidement en `2xx`, puis traitez l’événement dans une file. Vérifiez la signature configurée pour votre endpoint et dédupliquez chaque événement par son identifiant.
message.queuedmessage.sentmessage.deliveredmessage.readmessage.failedmessage.received{
"id": "evt_xxx",
"type": "message.delivered",
"createdAt": "2026-08-31T12:01:05Z",
"data": {
"externalOrgId": "client-123",
"messageId": "msg_xxx",
"to": "+22370000000",
"status": "DELIVERED"
}
}| HTTP | Signification | Action |
|---|---|---|
| 400 | Payload ou numéro invalide | Corriger la requête, ne pas relancer à l’identique. |
| 401/403 | Clé absente, invalide ou hors périmètre | Vérifier le secret et l’organisation ciblée. |
| 409 | État incompatible ou doublon | Lire l’état courant avant de reprendre. |
| 429 | Limite temporaire | Appliquer un backoff exponentiel avec jitter. |
| 5xx | Erreur transitoire | Relancer avec la même clé d’idempotence. |
L’exemple suivant garde la clé partenaire côté serveur et réutilise une clé d’idempotence issue de la commande métier.
export async function notifyOrderReady(order) {
const response = await fetch(
"https://smsv.tech/api/v1/partner/cloud/messages/send-template",
{
method: "POST",
headers: {
"content-type": "application/json",
"x-partner-key": process.env.SMSV_PARTNER_KEY,
"idempotency-key": `order-${order.id}-ready`,
},
body: JSON.stringify({
externalOrgId: order.merchantId,
to: order.customerPhone,
template: {
name: "order_ready",
language: "fr",
variables: [order.reference, order.totalLabel],
},
}),
},
);
if (!response.ok) {
throw new Error(`SMSV request failed: ${response.status}`);
}
return response.json();
}Créez votre espace puis contactez l’équipe SMSV pour valider le parcours Meta et les webhooks avant le passage en production.