Développeurs

Un moteur commerce conçu pour être intégré.

Pas de thème à surcharger, pas de plugin à écrire : une API REST, des webhooks signés et un serveur MCP. Vous gardez votre stack.

http
GET  /v1/shop/public/storefront/maison-aurore
GET  /v1/shop/public/storefront/maison-aurore/products

POST /v1/shop/public/store/maison-aurore/carts
POST /v1/shop/public/store/maison-aurore/carts/{cartId}/items
POST /v1/shop/checkouts
REST API

Deux surfaces, deux publics

Publique

Ce que votre site appelle : la vitrine, le catalogue, le panier. Aucun secret, donc appelable depuis le navigateur.

  • Storefront
  • Catalogue
  • Panier
  • Checkout

Marchande

Ce que votre back-office appelle, avec la session du marchand : catalogue, commandes, clients, remboursements, webhooks, jetons MCP.

  • Stores
  • Produits
  • Commandes
  • Factures
  • Webhooks

Convention sur le fil : snake_case dans les payloads, montants en centimes entiers, horodatages UTC ISO 8601. Jamais de flottant sur une somme d'argent.

SDK

Un panier en trois appels

typescript
// Le panier est porté par la boutique : son slug est dans le chemin.
const base = "https://api.ts-services.com/v1/shop/public/store/maison-aurore";

// 1 · Créer le panier. Pas de corps : la boutique vient de l'URL.
const cart = await fetch(`${base}/carts`, { method: "POST" }).then((r) => r.json());

// 2 · Y ajouter un service. Le jeton de panier voyage dans X-Cart-Token,
//     pas dans Authorization : ce n'est pas une session, c'est une clé d'accès
//     à CE panier : anonyme, et rendue une seule fois.
await fetch(`${base}/carts/${cart.id}/items`, {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "X-Cart-Token": cart.anonymous_token,
  },
  body: JSON.stringify({ product_id: "prod_123", quantity: 1 }),
});

// 3 · Envoyer l'acheteur sur le checkout hébergé. Le panier ET son jeton :
//     sans les deux, la page ne peut pas prouver que ce panier est le sien.
const checkout = new URL("https://shop.ts-services.com/checkout/maison-aurore");
checkout.searchParams.set("cart", cart.id);
checkout.searchParams.set("token", cart.anonymous_token);
window.location.href = checkout.toString();

Le jeton de panier n'est rendu qu'à la création et n'est pas stocké en clair : c'est lui qui autorise l'acheteur anonyme à retrouver son panier. Un SDK JavaScript / TypeScript est prévu pour éviter d'écrire ces appels à la main.

Webhooks

Des événements signés, réessayés, rejouables

Signature

Chaque livraison porte un en-tête t=…,v1=… : l'empreinte HMAC du corps brut avec votre secret. Vérifiez-la avant de traiter quoi que ce soit.

Reprise

Un endpoint indisponible est réessayé en backoff, et toute livraison peut être rejouée à la main depuis le back-office : la tentative d'origine reste dans l'historique.

json
{
  "event_id": "evt_01J8…",
  "type": "order.paid",
  "created_at": "2026-04-30T12:32:11Z",
  "data": {
    "order_id": "ord_01J8…",
    "order_number": "TS-2026-000001",
    "total_incl_tax": 7900,
    "currency": "EUR"
  }
}

Votre site est déjà prêt. Ajoutez-lui le commerce.

Créez votre Store, ajoutez vos services et connectez Ts-Shop à votre site ou à votre IA.