Votre ERP, votre caisse ou votre logiciel de bureau peut envoyer des messages WhatsApp depuis votre numéro connecté, afficher les données du client à côté du chat et ouvrir des dossiers. La route d'envoi utilise le même format de requête que l'API WhatsApp Cloud de Meta : un code écrit pour elle n'a besoin que d'une nouvelle URL de base et d'une clé d'appareil SyBox — et chaque envoi est transmis à Meta sous votre propre compte WhatsApp Business.
02Envoyez votre premier message
Un message texte simple. Le corps est le charge utile standard de l'API Cloud — nous le transmettons tel quel.
cURL
curl -X POST https://api.smartsybox.com/v26.0/PHONE_NUMBER_ID/messages \
-H "Authorization: Bearer YOUR_DEVICE_KEY" \
-H "Content-Type: application/json" \
-d '{
"messaging_product": "whatsapp",
"to": "15551234567",
"type": "text",
"text": { "body": "Hello from SyBox 👋" }
}'
C# · HttpClient
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
var http = new HttpClient();
http.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue("Bearer", "YOUR_DEVICE_KEY");
string json = @"{
""messaging_product"": ""whatsapp"",
""to"": ""15551234567"",
""type"": ""text"",
""text"": { ""body"": ""Hello from SyBox"" }
}";
var res = await http.PostAsync(
"https://api.smartsybox.com/v26.0/PHONE_NUMBER_ID/messages",
new StringContent(json, Encoding.UTF8, "application/json"));
Console.WriteLine(await res.Content.ReadAsStringAsync());
La réponse
Vous recevez exactement ce que Meta renvoie, avec le même statut HTTP.
200 OK · application/json
{
"messaging_product": "whatsapp",
"contacts": [{ "input": "15551234567", "wa_id": "15551234567" }],
"messages": [{ "id": "wamid.HBgLMTU1NTEyMzQ1NjcVAgARGBI…" }]
}
04Affichez vos données à côté de la conversation
À l'ouverture d'une conversation, SyBox appelle VOTRE point de terminaison et affiche votre réponse juste à côté du chat — commandes, solde, tickets du client. Nous envoyons le téléphone du client, ou son e-mail pour une conversation par e-mail.
Request · SyBox → your endpoint
POST YOUR_ERP_URL
Authorization: Bearer YOUR_ERP_KEY
X-Sybox-Action: lookup
# body: { "data": "<json string>" } — the decoded "data":
{
"phone": "15551234567",
"email": "customer@example.com",
"ref": ""
}
Your reply · application/json
{
"renderAs": "table",
"content": [
{ "Order": "#10432", "Status": "Shipped", "Total": "$1,250.00" }
]
}
renderAs
Définissez renderAs pour indiquer à SyBox comment afficher vos données — l'une de :
table
Rows & columns. content = an array of flat objects (or { rows: [ … ] }). Object keys become the column headers.
cards · kpi
Compact tiles (a balance, an order count). content = an array of { label, value } (or { cards: [ … ] }).
feed · list · thread
A timeline of rich cards. content = an array of { title, text, date, tags, media:[{ type, url, name }] }.
message
A single message-style card (one record laid out as a note).
html
Your own trusted HTML — content = a string. Use only for markup you generate yourself.
sections
Several blocks at once: content = { sections: [ { title, renderAs, content } ] } — mix a table + cards + a feed in one reply.
json
The default when renderAs is omitted — SyBox pretty-prints your content as-is.
Ajoutez un sybox_ref à une ligne de tableau ou une carte pour la rendre cliquable — SyBox vous rappelle avec ce ref afin que vous renvoyiez le détail de cet enregistrement.
Nous envoyons le téléphone et l'e-mail — l'un peut être vide ; faites la correspondance avec celui qui identifie le client dans votre système, et répondez avec { renderAs, content }.
Recherche de produits (X-Sybox-Action: products)
Le même endpoint peut aussi répondre aux recherches de produits. L'agent saisit ce que demande le client, SyBox l'envoie dans "q", et votre réponse s'affiche en fiches produits à côté de la conversation, avec un bouton Envoyer qui place le lien dans le champ de saisie.
Request · SyBox → your endpoint
POST YOUR_ERP_URL
Authorization: Bearer YOUR_ERP_KEY
X-Sybox-Action: products
# body: { "data": "<json string>" } — the decoded "data":
{
"q": "wireless keyboard",
"phone": "15551234567",
"email": "customer@example.com",
"ref": ""
}
Your reply · application/json
{
"content": [
{
"name": "Wireless Keyboard K380",
"price": 449,
"oldPrice": 520,
"currency": "USD",
"available": true,
"stock": 12,
"image": "https://cdn.example.com/k380.jpg",
"link": "https://shop.example.com/p/k380",
"note": "Ships in 24h"
}
]
}
name
Le seul champ obligatoire. Un produit réduit à son nom donne quand même une fiche propre.
price · oldPrice · currency
Des nombres, pas des chaînes formatées. N'envoyez oldPrice que s'il existe un vrai prix précédent — la remise est calculée à partir des deux.
available · stock
available vaut true/false ; stock est un compteur facultatif affiché à côté. Omettez-les si vous ne suivez pas le stock — un champ absent n'affiche rien et n'est jamais lu comme « rupture ».
image
Une URL d'image https directe. Une image qui ne charge pas laisse place à un fond neutre.
link
L'URL de la fiche produit. Sans elle, la carte est en lecture seule — Envoyer n'apparaît que s'il y a quelque chose à envoyer.
note
Une courte ligne libre sous le prix — délai de livraison, variante, condition.
Rien de plus que l'endpoint déjà en place : même URL, même clé, même enveloppe { "data": "…" }. Lisez X-Sybox-Action pour distinguer une recherche produit d'une recherche client. Répondez avec content sous forme de tableau (ou { items: [ … ] }).