Aller au contenu
TRAXODocumentation API
EN

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.

HTTPS · JSONUne requête POST par commande.
Sans codeWooCommerce, FedaPay, Zapier, Make, n8n, Excel.
Rien de facturé à la réceptionRien n’est facturé avant que la demande devienne une livraison.

Démarrer

Premiers pas

  1. 1
    Dans TRAXO : Paramètres › Intégrations › Ajouter une source.
  2. 2
    Choisissez Zapier, Make, n8n ou votre site.
  3. 3
    Copiez l’adresse de réception (avec son jeton) et le secret de signature. Ils ne sont affichés qu’une fois.
  4. 4
    Envoyez 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

POSThttps://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.

ChampTypeDescription
referencetexte, 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.nametexteNom du client. Aussi : customer_name.
customer.phonetexteTéléphone, de préférence au format international (+229 …). Aussi : customer_phone.
customer.phone_countrycode paysPays d’un numéro écrit sans indicatif (BJ, TG, CI…). Par défaut : le pays de votre entreprise.
customer.emailtexteE-mail : TRAXO peut y envoyer le lien du client. Aussi : customer_email.
address.neighborhoodtexteQuartier ou zone. Aussi : address.zone, address.district ou address en texte.
address.landmarktextePoint de repère.
cash_to_collectentier, F CFAMontant à encaisser à la livraison, frais compris.
delivery_feeentier, F CFAFrais de livraison, compris dans cash_to_collect.
amountentier, F CFAMontant d’une commande déjà payée : rien à encaisser.
items[]liste, 20 au plusArticles : name, qty (1 à 999), unit_price.
package_descriptiontexteContenu du colis, si vous n’envoyez pas items.
windowobjet ou texteCréneau souhaité : from et to en ISO 8601, ou un texte.
notetexteConsigne de livraison, visible par le client.
testbooléentrue : essai, aucune demande créée.
cancelbooléentrue 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éthodeAdresse et en-têtesUsage
Jeton dans l’adressehttps://app.gettraxo.app/api/in/src_…/whk_…Le plus simple : Zapier, Make, n8n.
Jeton en en-têtehttps://app.gettraxo.app/api/in/src_…
X-Traxo-Token: whk_…
ou Authorization: Bearer whk_…
L’adresse ne contient plus le jeton.
Signaturehttps://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émentValeur
Secretwhsec_…, affiché une fois à la création de la source.
Contenu signé{webhook-id}.{webhook-timestamp}.{body}
AlgorithmeHMAC-SHA256, clé = secret sans whsec_ décodé en base64 ; résultat en base64.
webhook-idIdentifiant unique de l’envoi.
webhook-timestampSecondes Unix ; 5 minutes d’écart au plus.
webhook-signaturev1,<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

CodeSignification
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.
401Source inconnue, jeton ou signature invalide, ou signature de plus de 5 minutes.
413Corps de plus de 512 Ko.
429Trop d’envois : 120 par minute et par source. Réessayez plus tard.
503Ré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

  1. 1
    TRAXO : Ajouter une source › WooCommerce. Copiez l’URL de livraison et le secret.
  2. 2
    WordPress : WooCommerce › Réglages › Avancé › Webhooks › Ajouter un webhook.
  3. 3
    Nom : TRAXO · État : Actif · Sujet : Commande créée · URL et secret copiés · API : WP REST API v3.
  4. 4
    Ajoutez un second webhook identique, sujet Commande mise à jour.
CommandeDans TRAXO
En cours (payée), ou paiement à la livraisonDemande créée
Pas encore payée, retrait en boutique, antérieure au branchementIgnorée
Annulée, remboursée, échouée ou suppriméeDemande 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

  1. 1
    TRAXO : Ajouter une source › FedaPay. Copiez l’URL du webhook.
  2. 2
    FedaPay : Webhooks › Créer un webhook avec cette URL et l’événement transaction.approved.
  3. 3
    Collez 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éeTitres reconnus (exemples)
RéférenceRéférence, Commande, N° commande, Order
NomNom, Nom du client, Client, Destinataire, Name
Téléphone ou e-mailTéléphone, Tel, Numéro, Mobile, WhatsApp, Phone · E-mail, Mail, Courriel
QuartierQuartier, Zone, Adresse, Lieu, Ville, Commune, Address
RepèreRepère, Point de repère, Indications, Précisions, Landmark
NoteNote, Commentaire, Remarque, Instructions, Message
Montant à encaisserMontant à encaisser, Montant, Total, Prix, Cash
Frais de livraisonFrais de livraison, Livraison, Frais, Shipping
ArticlesArticles, 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ésultatSignification
Demande crééeLa demande attend la confirmation du client.
Déjà reçueCette référence existe déjà.
IgnoréeRien à 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.
ÉchecErreur 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.