API · Intégrations
Envoyez vos commandes à TRAXO
Votre site, Zapier, Make ou n8n envoie chaque commande à une adresse de réception. TRAXO crée la demande, et votre client reçoit un lien pour indiquer où le livrer.
Démarrer
Premiers pas
- 1Dans TRAXO : Paramètres › Intégrations › Ajouter une source.
- 2Choisissez Zapier, Make, n8n ou votre site.
- 3Copiez l’adresse de réception (avec son jeton) et le secret de signature. Ils ne sont affichés qu’une fois.
- 4Envoyez un essai (
"test": true), puis ouvrez le Journal.
Boutique WooCommerce ou liens de paiement FedaPay : rien à coder, voir WooCommerce et FedaPay.
Format TRAXO
Envoyer une commande
https://app.gettraxo.app/api/in/src_…/whk_…En-tête Content-Type: application/json · 512 Ko au plus
curl -X POST "$TRAXO_URL" \
-H "Content-Type: application/json" \
-d '{
"reference": "CMD-1042",
"customer": { "name": "Awa Dossou", "phone": "+229 01 95 12 34 56" },
"address": { "neighborhood": "Fidjrossè" },
"cash_to_collect": 15000
}'$TRAXO_URL : l’adresse complète copiée dans TRAXO. Gardez-la dans votre serveur ou votre outil d’automatisation, jamais dans une page web publique.
Exemple complet
{
"reference": "CMD-1042",
"customer": {
"name": "Awa Dossou",
"phone": "+229 01 95 12 34 56",
"email": "[email protected]"
},
"address": {
"neighborhood": "Fidjrossè",
"landmark": "Derrière la pharmacie"
},
"cash_to_collect": 15000,
"delivery_fee": 1500,
"items": [{ "name": "Pagne wax", "qty": 2, "unit_price": 6750 }],
"window": { "from": "2026-11-10T10:00:00+01:00", "to": "2026-11-10T13:00:00+01:00" },
"note": "Appeler avant d’arriver"
}Format TRAXO
Champs
Obligatoire : customer.phone ou customer.email. Tout le reste est facultatif.
| Champ | Type | Description |
|---|---|---|
reference | texte, 80 car. | Votre numéro de commande. Une référence ne crée qu’une demande ; elle sert aussi à annuler. Aussi : order_id, id. |
customer.name | texte | Nom du client. Aussi : customer_name. |
customer.phone | texte | Téléphone, de préférence au format international (+229 …). Aussi : customer_phone. |
customer.phone_country | code pays | Pays d’un numéro écrit sans indicatif (BJ, TG, CI…). Par défaut : le pays de votre entreprise. |
customer.email | texte | E-mail : TRAXO peut y envoyer le lien du client. Aussi : customer_email. |
address.neighborhood | texte | Quartier ou zone. Aussi : address.zone, address.district ou address en texte. |
address.landmark | texte | Point de repère. |
cash_to_collect | entier, F CFA | Montant à encaisser à la livraison, frais compris. |
delivery_fee | entier, F CFA | Frais de livraison, compris dans cash_to_collect. |
amount | entier, F CFA | Montant d’une commande déjà payée : rien à encaisser. |
items[] | liste, 20 au plus | Articles : name, qty (1 à 999), unit_price. |
package_description | texte | Contenu du colis, si vous n’envoyez pas items. |
window | objet ou texte | Créneau souhaité : from et to en ISO 8601, ou un texte. |
note | texte | Consigne de livraison, visible par le client. |
test | booléen | true : essai, aucune demande créée. |
cancel | booléen | true avec reference : annule la commande. Aussi : "status": "cancelled". |
Montants en francs CFA entiers ; 15000, "15 000 F" ou "15000.00" sont acceptés.
Format TRAXO
Authentification
| Méthode | Adresse et en-têtes | Usage |
|---|---|---|
| Jeton dans l’adresse | https://app.gettraxo.app/api/in/src_…/whk_… | Le plus simple : Zapier, Make, n8n. |
| Jeton en en-tête | https://app.gettraxo.app/api/in/src_…X-Traxo-Token: whk_…ou Authorization: Bearer whk_… | L’adresse ne contient plus le jeton. |
| Signature | https://app.gettraxo.app/api/in/src_…en-têtes webhook-* | Recommandé pour un site. Signer un envoi. |
Avec un jeton seul, votre équipe valide chaque demande confirmée par le client avant l’envoi d’un livreur (« À vérifier »), et le lien ne part pas par e-mail sauf si vous l’activez. Une demande signée est validée dès que le client confirme.
Format TRAXO
Signer un envoi
Format Standard Webhooks : les bibliothèques de ce format produisent les mêmes en-têtes.
| Élément | Valeur |
|---|---|
| Secret | whsec_…, affiché une fois à la création de la source. |
| Contenu signé | {webhook-id}.{webhook-timestamp}.{body} |
| Algorithme | HMAC-SHA256, clé = secret sans whsec_ décodé en base64 ; résultat en base64. |
webhook-id | Identifiant unique de l’envoi. |
webhook-timestamp | Secondes Unix ; 5 minutes d’écart au plus. |
webhook-signature | v1,<signature> |
const crypto = require('crypto');
const secret = process.env.TRAXO_SECRET; // whsec_…
const url = process.env.TRAXO_SOURCE_URL; // https://app.gettraxo.app/api/in/src_…
const body = JSON.stringify(order);
const id = `msg_${crypto.randomUUID()}`;
const timestamp = Math.floor(Date.now() / 1000).toString();
const key = Buffer.from(secret.replace(/^whsec_/, ''), 'base64');
const signature = crypto.createHmac('sha256', key)
.update(`${id}.${timestamp}.${body}`)
.digest('base64');
await fetch(url, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'webhook-id': id,
'webhook-timestamp': timestamp,
'webhook-signature': `v1,${signature}`,
},
body,
});import base64, hashlib, hmac, json, os, time, uuid, urllib.request
secret = os.environ["TRAXO_SECRET"] # whsec_…
url = os.environ["TRAXO_SOURCE_URL"] # https://app.gettraxo.app/api/in/src_…
body = json.dumps(order).encode()
msg_id = f"msg_{uuid.uuid4().hex}"
timestamp = str(int(time.time()))
key = base64.b64decode(secret.removeprefix("whsec_"))
signed = f"{msg_id}.{timestamp}.".encode() + body
signature = base64.b64encode(hmac.new(key, signed, hashlib.sha256).digest()).decode()
request = urllib.request.Request(url, data=body, method="POST", headers={
"Content-Type": "application/json",
"webhook-id": msg_id,
"webhook-timestamp": timestamp,
"webhook-signature": f"v1,{signature}",
})
urllib.request.urlopen(request)Signez exactement les octets envoyés : ne reformatez pas le JSON après le calcul.
Format TRAXO
Réponses
| Code | Signification |
|---|---|
200{ "ok": true } | Avis reçu et vérifié. Le résultat (demande créée, doublon, ignoré, mis de côté) se lit dans le Journal. Ne renvoyez pas. |
| 401 | Source inconnue, jeton ou signature invalide, ou signature de plus de 5 minutes. |
| 413 | Corps de plus de 512 Ko. |
| 429 | Trop d’envois : 120 par minute et par source. Réessayez plus tard. |
| 503 | Réception momentanément fermée. Réessayez plus tard. |
Réessayez seulement après un 429, un 503 ou une erreur réseau, en espaçant les essais. Un même corps envoyé deux fois n’est noté qu’une fois.
Format TRAXO
Tester
{
"test": true,
"reference": "ESSAI-1",
"customer": { "name": "Essai", "phone": "+229 01 95 12 34 56" }
}Réponse 200. Le Journal affiche « Ignorée · Essai reçu » avec le nom et le téléphone lus. Aucune demande n’est créée.
Format TRAXO
Annuler
{ "reference": "CMD-1042", "cancel": true }Tant que la livraison n’est pas créée, la demande passe à « Refusée ». Ensuite, rien ne change tout seul : le Journal le signale à votre équipe.
Sans code
WooCommerce
- 1TRAXO : Ajouter une source › WooCommerce. Copiez l’URL de livraison et le secret.
- 2WordPress : WooCommerce › Réglages › Avancé › Webhooks › Ajouter un webhook.
- 3Nom : TRAXO · État : Actif · Sujet : Commande créée · URL et secret copiés · API : WP REST API v3.
- 4Ajoutez un second webhook identique, sujet Commande mise à jour.
| Commande | Dans TRAXO |
|---|---|
| En cours (payée), ou paiement à la livraison | Demande créée |
| Pas encore payée, retrait en boutique, antérieure au branchement | Ignorée |
| Annulée, remboursée, échouée ou supprimée | Demande refusée |
Montants : total moins frais de port = articles ; frais de port = frais de livraison. Paiement à la livraison : le total est à encaisser.
Sans code
FedaPay
- 1TRAXO : Ajouter une source › FedaPay. Copiez l’URL du webhook.
- 2FedaPay : Webhooks › Créer un webhook avec cette URL et l’événement
transaction.approved. - 3Collez dans TRAXO la clé secrète affichée par FedaPay.
Chaque paiement approuvé crée une demande déjà payée : rien à encaisser. Coordonnées lues : le client FedaPay (nom, téléphone, e-mail) et les métadonnées quartier / neighborhood, repere / landmark.
Vous encaissez aussi des paiements sans livraison ? Indiquez un mot-clé dans les réglages de la source : seuls les paiements dont la description le contient créent une demande.
Sans code
Import Excel ou CSV
Excel (.xlsx) ou CSV, 2 Mo et 500 lignes au plus ; la première ligne porte les titres. Modèles : Paramètres › Intégrations › Importer un fichier.
| Donnée | Titres reconnus (exemples) |
|---|---|
| Référence | Référence, Commande, N° commande, Order |
| Nom | Nom, Nom du client, Client, Destinataire, Name |
| Téléphone ou e-mail | Téléphone, Tel, Numéro, Mobile, WhatsApp, Phone · E-mail, Mail, Courriel |
| Quartier | Quartier, Zone, Adresse, Lieu, Ville, Commune, Address |
| Repère | Repère, Point de repère, Indications, Précisions, Landmark |
| Note | Note, Commentaire, Remarque, Instructions, Message |
| Montant à encaisser | Montant à encaisser, Montant, Total, Prix, Cash |
| Frais de livraison | Frais de livraison, Livraison, Frais, Shipping |
| Articles | Articles, Produits, Colis, Contenu, Description, Items |
Majuscules, accents et ponctuation ne comptent pas. Les lignes à corriger sont montrées avant l’import ; une référence déjà importée n’est pas recréée.
Suivre
Règles et limites
- Une référence crée une seule demande ; un même corps envoyé deux fois est noté une fois.
- Plafond par source : 100 demandes sur 24 heures par défaut, réglable de 1 à 1 000. Au-delà, l’avis est mis de côté : relevez le plafond, puis rejouez-le depuis le Journal.
- 10 sources au plus par entreprise ; 120 envois par minute et par source.
- Le lien du client reste valable 7 jours.
- E-mail au client : 2 au plus par adresse et par 24 heures, 300 par entreprise. Sinon, le lien attend dans « À envoyer », avec un bouton WhatsApp.
- Contenu des avis gardé 7 jours ; journal gardé 30 jours.
Suivre
Journal
Paramètres › Intégrations › Journal : les 50 derniers avis, filtrés par source et par résultat.
| Résultat | Signification |
|---|---|
| Demande créée | La demande attend la confirmation du client. |
| Déjà reçue | Cette référence existe déjà. |
| Ignorée | Rien à livrer : essai, commande pas encore payée, retrait en boutique, contenu illisible… |
| Mise de côté | Plafond atteint, source en pause, client sans téléphone ni e-mail, espace suspendu. Rejouable. |
| Échec | Erreur de traitement après plusieurs essais. Rejouable. |
Suivre
Sécurité
- Secrets et jetons sont affichés une seule fois, à la création. Ensuite, ni l’écran, ni l’API, ni les journaux ne les montrent.
- Secrets de signature chiffrés (AES-256-GCM) ; jetons gardés seulement sous forme d’empreinte (SHA-256).
- Perdu ou exposé ? Réglages de la source › Nouveau secret : l’ancien cesse aussitôt de fonctionner.
- L’entreprise est toujours celle de la source : aucun champ envoyé ne peut viser une autre entreprise.
- TRAXO ne vous demande jamais un secret par e-mail ou par WhatsApp.