1. Extensions
  2. API

Exantrix API: seller documentation

The Exantrix API lets a seller connect any software to the marketplace: send the catalogue, keep stock up to date, read paid orders and declare shipping. The WooCommerce, PrestaShop and Shopify extensions use exactly this API. It is JSON over HTTPS, with no SDK to install.

GitHub: github.com/tony-dev-web/exantrix-api (Postman collection, OpenAPI specification and Python client).

Ready to use: WooCommerce extension, PrestaShop module, Shopify guide.

Authentication

Generate a token in your seller area (API section). Every request carries the header:

Authorization: Bearer VOTRE_JETON

The token identifies your seller account. It can be regenerated at any time from the seller area, the old one then becomes invalid. Limit: 600 requests per 10 minutes per token (429 beyond).

Base URL and format

All routes start with https://exantrix.com/api/v1. Bodies and responses are JSON (UTF-8). An error returns {"erreur": "message"} with the matching HTTP code: 400 invalid request, 401 invalid token, 404 not found, 405 method not allowed, 429 too many requests.

Routes

MethodRoutePurpose
GET/moiSeller account: status, permission to sell, commission rate, connected shop, webhook URL.
GET/produitsYour products on Exantrix (reference, price, stock, visibility, moderation).
PUT/produitsCreate or update by reference, 200 items per call maximum.
PATCH/produits/{reference}/stockUpdate the stock of one product.
DELETE/produits/{reference}Removes the product from listings (stock 0) without deleting it.
GET/commandes?depuis=YYYY-MM-DDPaid orders containing at least one of your products (last 500).
POST/commandes/{id}/expedierDeclares shipping: carrier and tracking number.

Product item (PUT /produits)

Each element of the produits array is a product item. The reference is the key: a known reference is updated, a new one is created and held for review by Exantrix before going live.

FieldTypeRequiredDetail
referencetext, 50 charsyesUnique identifier on your side (SKU).
titretext, 60 charsyesTitle shown on the marketplace.
categorietextyes3d, dtf, textile, flocage or decoupe.
prix_ttcnumberyesTax-included price in euros, positive. Published as is, the commission is deducted from the payout.
stockintegernoDefault 1. 0 removes the product from listings.
imagesarray of URLsnohttps image URLs, 5 maximum. Downloaded and converted by Exantrix.
descriptiontext, 160 charsnoSummary.
informationtext, 1255 charsnoLong description.
marquetext, 50 charsnoBrand.
sous_categorietext, 70 charsnoSub-category.
url_boutiquetext, 150 charsnoLink to the product on your shop.
curl -X PUT https://exantrix.com/api/v1/produits \  -H "Authorization: Bearer VOTRE_JETON" \  -H "Content-Type: application/json" \  -d '{"produits": [{"reference": "SKU-001", "titre": "Support casque imprime en 3D", "categorie": "3d",       "prix_ttc": 19.90, "stock": 12, "images": ["https://maboutique.fr/img/support.jpg"],       "description": "Support de casque en PLA, 3 coloris."}]}'

Response: {"produits": [...], "erreurs": [...]}. Each returned product carries cree (true on creation), moderation (attente, accepte, refuse) and visible. Rejected items are listed in erreurs with their reference and the reason; the HTTP code is 400 only when no item went through.

curl -X PATCH https://exantrix.com/api/v1/produits/SKU-001/stock \  -H "Authorization: Bearer VOTRE_JETON" -H "Content-Type: application/json" -d '{"stock": 7}'

Order (GET /commandes)

Each order contains only your lines. total_vendeur_ttc is the sum of your lines. The fields couleur, taille, position, texte_3d and renseignement carry the personalisation requested by the customer.

{  "id": 4821,  "statut": "PAYEE",  "date": "2026-09-13",  "transporteur": "",  "suivi": "",  "livraison": {    "nom": "Durand",    "prenom": "Marie",    "adresse": "12 rue des Lilas",    "code_postal": "72000",    "ville": "Le Mans",    "telephone": "0600000000",    "email": "marie@example.com",    "mode": "Colissimo"  },  "lignes": [    {      "reference": "SKU-001",      "produit_id": 9107,      "titre": "Support casque imprime en 3D",      "quantite": 2,      "prix_ttc": "19.90",      "total_ttc": "39.80",      "couleur": "noir",      "taille": "",      "position": "",      "texte_3d": "",      "renseignement": ""    }  ],  "total_vendeur_ttc": "39.80"}

Shipping (POST /commandes/{id}/expedier)

Sets the order to EXPEDIEE and stores carrier and tracking number, passed on to the customer.

curl -X POST https://exantrix.com/api/v1/commandes/4821/expedier \  -H "Authorization: Bearer VOTRE_JETON" -H "Content-Type: application/json" \  -d '{"transporteur": "Colissimo", "suivi": "6A12345678901"}'

Order webhook

If you set a notification URL in your seller area, every paid order is sent to it as a JSON POST, with the same order object as above and the event commande.payee. The body is signed: the X-Exantrix-Signature header is sha256= followed by the hex HMAC-SHA256 of the raw body, key = your API token. Verify the signature before any processing and answer 200; the order remains visible in the seller area and is emailed anyway.

Verification in Python:

import hashlib, hmacdef signature_valide(corps_brut: bytes, entete: str, jeton: str) -> bool:    attendu = "sha256=" + hmac.new(jeton.encode(), corps_brut, hashlib.sha256).hexdigest()    return hmac.compare_digest(attendu, entete)

Good practice