Cimolace/Vimbo — Documentation développeur

Brancher Vimbo sur votre site

Vimbo est le moteur e-commerce de Cimolace. Votre site existant garde son design ; Vimbo gère le catalogue, le panier et les commandes via une API REST authentifiée par clé. Aucun compte client requis pour acheter — checkout invité natif. Vous codez uniquement l'affichage ; les prix, le stock et les commandes vivent dans Vimbo.

Vue d'ensemble

Vous avez déjà un site (Next.js, WordPress, Shopify-like maison, Webflow…). Vimbo lui ajoute une vraie boutique sans que vous ayez à gérer une base de données produits, un panier ou un back-office. Le principe :

  • Vous appelez l'API Vimbo avec une clé tenant (mbk_…) pour lister le catalogue.
  • Vous affichez les produits avec votre propre design.
  • Vous postez la commande — Vimbo recalcule les prix, enregistre la commande, vous renvoie un numéro.
  • Le commerçant gère tout depuis le back-office Vimbo (catalogue, stock, commandes).

Vos acheteurs n'ont pas besoin de compte Cimolace : le checkout est invité (un email suffit). Vous gardez votre domaine et votre marque ; Vimbo reste invisible côté client.

💡 C'est le même modèle d'intégration que MedOS « Mode C » : une clé API tenant, des endpoints REST et un logiciel spécialisé. Un site peut combiner plusieurs moteurs Cimolace.

Quickstart (5 minutes)

1. Obtenir une clé API

Le commerçant génère une clé storefront depuis son espace Cimolace (ou le staff la crée). Elle ressemble à mbk_votreboutique_xxxxxxxx… et s'envoie en header Authorization: Bearer. La clé identifie le tenant : tous les appels sont automatiquement isolés à votre boutique.

2. Lister le catalogue

curl https://api.cimolace.space/v1/mbolo/storefront/products \
  -H "Authorization: Bearer mbk_votreboutique_xxxxxxxx"

3. Encaisser une commande

Postez le panier ; Vimbo recalcule tout et renvoie la commande.

bash
curl -X POST https://api.cimolace.space/v1/mbolo/storefront/orders \
  -H "Authorization: Bearer mbk_votreboutique_xxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{
    "customer": { "email": "client@example.com", "name": "Awa N." },
    "items": [
      { "slug": "equilibre-femme", "variantId": "<id-variante>", "quantity": 1 },
      { "slug": "vitalite-homme", "quantity": 2 }
    ]
  }'

Architecture

Une seule base de données, isolée par tenant. La clé API résout votre tenant_id ; chaque requête est filtrée automatiquement — vous ne voyez jamais le catalogue d'une autre boutique. Trois ressources :

  • Catégories — regroupent les produits (optionnel).
  • Produits — prix, stock, images, variantes, bénéfices, SEO.
  • Commandes — créées au checkout, consultables au back-office.

Base de l'API : https://api.cimolace.space/v1/mbolo/storefront

Authentification

Toutes les requêtes storefront exigent une clé API tenant dans le header Authorization. Préfixe mbk_ pour les clés Vimbo.

http
Authorization: Bearer mbk_votreboutique_xxxxxxxxxxxxxxxxxxxxxxxxxxxx
RègleDétail
StockageLa clé n'est jamais stockée en clair (hash SHA-256 côté serveur).
IsolationLa clé résout le tenant → vos données uniquement.
RévocationUne clé révoquée est refusée immédiatement (401).
SecretGardez la clé côté serveur. Ne l'exposez jamais dans le JS public du navigateur.

⚠️ La clé donne accès à votre catalogue ET à la création de commandes. Appelez l'API depuis votre backend (Server Component, route API, PHP…), pas depuis le navigateur.

Prix & devises

Tous les montants sont en centimes entiers (price_cents), avec un champ currency (défaut XAF). Pour afficher : divisez par 100. Une variante porte un price_delta_cents qui s'ajoute au prix de base.

Les prix envoyés par le client sont ignorés. Au checkout, Vimbo relit chaque produit/variante en base et recalcule le total — impossible de falsifier un prix côté navigateur.

GET /categories

Liste les catégories actives de votre boutique.

bash
curl https://api.cimolace.space/v1/mbolo/storefront/categories -H "Authorization: Bearer mbk_..."
json
{
  "data": [
    { "id": "a0…", "slug": "complements", "name": "Compléments", "sort_order": 1 }
  ]
}

GET /products

Liste les produits actifs (les vedettes en premier), images jointes. Filtre optionnel ?category=<id>.

bash
curl "https://api.cimolace.space/v1/mbolo/storefront/products?category=a0…" -H "Authorization: Bearer mbk_..."
json
{
  "data": [
    {
      "id": "b0…",
      "name": "Équilibre Femme",
      "slug": "equilibre-femme",
      "price_cents": 2990000,
      "compare_at_price_cents": 3490000,
      "currency": "XAF",
      "stock": 50,
      "is_featured": true,
      "tagline": "Harmonie au naturel",
      "benefits": ["100% naturel", "Soutient le cycle"],
      "images": [{ "url": "https://…", "is_primary": true }]
    }
  ]
}

GET /products/:slug

Détail d'un produit par son slug, avec images et variantes.

bash
curl https://api.cimolace.space/v1/mbolo/storefront/products/equilibre-femme -H "Authorization: Bearer mbk_..."
json
{
  "data": {
    "id": "b0…",
    "name": "Équilibre Femme",
    "price_cents": 2990000,
    "currency": "XAF",
    "benefits": ["100% naturel"],
    "images": [{ "url": "https://…", "is_primary": true }],
    "variants": [
      { "id": "d0…", "label": "Cure 1 mois", "price_delta_cents": 0 },
      { "id": "d1…", "label": "Cure 3 mois", "price_delta_cents": 700000 }
    ]
  }
}

POST /orders — checkout invité

Crée une commande. customer.email est obligatoire ;items référence chaque produit par slug ou productId, avec un variantId optionnel et une quantity.

Corps de requête

json
{
  "customer": {
    "email": "client@example.com",
    "name": "Awa N.",
    "phone": "+241060000000",
    "address": { "city": "Libreville", "country": "GA" }
  },
  "items": [
    { "slug": "equilibre-femme", "variantId": "d1…", "quantity": 1 },
    { "productId": "b1…", "quantity": 2 }
  ]
}

Réponse

json
{
  "data": {
    "order": {
      "order_number": "MB-1896-MPTXPO5N",
      "status": "pending",
      "channel": "storefront",
      "total_cents": 9270000,
      "currency": "XAF",
      "customer_email": "client@example.com"
    },
    "items": [ /* lignes recalculées côté serveur */ ],
    "total_cents": 9270000,
    "currency": "XAF"
  }
}
ChampRègle
customer.emailRequis.
items[].slug / productIdL'un des deux. Produit inactif ou hors tenant → 400.
items[].variantIdOptionnel. Doit appartenir au produit, sinon 400.
total_centsCalculé serveur (prix base + deltas variantes × quantités).

Sécurité

  • Clé côté serveur uniquement — jamais dans le bundle navigateur.
  • Prix non falsifiables — recalcul systématique en base au checkout.
  • Isolation tenant — chaque requête est filtrée par le tenant de la clé.
  • Révocation immédiate — une clé compromise se coupe en un clic (401 instantané).
  • Paiement — la commande naît en pending. Branchez votre PSP (Stripe, PawaPay…) puis confirmez la commande au back-office / via webhook.

Back-office

Le commerçant gère sa boutique sans toucher au code, depuis l'espace Cimolace :

  • Catalogue — créer/éditer produits, catégories, images, variantes, stock, vedettes.
  • Commandes — suivre les commandes boutique et storefront, voir le détail des lignes et le client.

Les produits créés au back-office sont immédiatement disponibles via l'API storefront — votre site se met à jour tout seul.

Troubleshooting

SymptômeCause probable
401 sur tous les appelsHeader Authorization absent, mal formé, ou clé révoquée/inconnue.
401 « préfixe attendu »La clé ne commence pas par mbk_ (ou cml_).
400 « Produit introuvable »slug/productId erroné, produit inactif, ou appartenant à un autre tenant.
400 « customer.email requis »Le checkout exige au minimum un email.
Catalogue videAucun produit is_active = true dans votre tenant.

Changelog

  • Wave 2 — API storefront publique (clé API) + checkout invité.
  • Wave 1 — Catalogue riche : catégories, images, variantes, prix barrés, vedettes, bénéfices, SEO.