API v1 · WEBHOOKS

API développeur Mystoq

Connectez votre boutique à tout système externe — gestion de stock, tableaux de bord ou vos propres applications. Lisez vos produits et commandes, créez des commandes par programme et recevez les événements en temps réel via des Webhooks signés.

Démarrage rapide

Trois étapes, de zéro à votre première commande par API :

  1. Créez une clé API depuis Tableau de bord → Développeurs (portée read ou write).
  2. Envoyez la clé dans l’en-tête Authorization: Bearer à chaque requête.
  3. Appelez GET /v1/products, puis enregistrez une URL Webhook pour recevoir les événements.

Introduction

L’API Mystoq est RESTful, renvoie du JSON et est sécurisée par clés API. Chaque requête s’exécute uniquement dans votre boutique (isolation totale). Créez votre clé depuis Tableau de bord → Développeurs.

Authentification

Transmettez votre clé dans l’en-tête Authorization en Bearer. Les clés ont la forme msq_<prefix>_<secret> ; la partie secrète n’est affichée qu’une seule fois, à la création.

# Chaque requête nécessite cet en-tête
Authorization: Bearer msq_ab12cd34_your_secret_here
Conservez la clé en lieu sûr. La portée read est en lecture seule ; la portée write est requise pour créer des commandes.

URL de base & limites

URL de basehttps://mystoq.com/api/v1
FormatJSON (Accept: application/json)
Limite de débit120 requêtes par minute par clé
PaginationParamètre per_page (1–100, défaut 25). Chaque réponse de liste inclut meta.current_page, per_page, total, last_page.

Produits

GET/v1/products

Liste les produits publiés de votre boutique (status = active), paginés.

Paramètres (optionnels)

per_pageÉléments par page (1–100, défaut 25).
searchRecherche par nom de produit.
category_idFiltrer par identifiant de catégorie.
# Example
curl "https://mystoq.com/api/v1/products?per_page=2&search=jacket" \
  -H "Authorization: Bearer msq_ab12cd34_secret" \
  -H "Accept: application/json"
// Response
{
  "data": [
    { "id": 1027, "name": "Women's jacket", "slug": "womens-jacket",
      "price": 2000, "compare_price": 2800, "sku": "JCK-01",
      "stock": 100, "status": "active", "category_id": 4,
      "images": ["https://…/p1.jpg"] }
  ],
  "meta": { "current_page": 1, "per_page": 2, "total": 57, "last_page": 29 }
}
GET/v1/products/{id}

Un seul produit. Renvoie 404 s’il est introuvable ou non publié.

Commandes

GET/v1/orders

Liste les commandes de votre boutique (paginées, les plus récentes d’abord).

Paramètres (optionnels)

per_pageÉléments par page (1–100, défaut 25).
statusFiltrer par statut (ex. pending, confirmed, shipped, delivered, cancelled).
fromDate de début (incluse), YYYY-MM-DD.
toDate de fin (incluse), YYYY-MM-DD.
GET/v1/orders/{id}

Une commande avec ses articles et les informations du client.

// Réponse de la commande
{
  "data": {
    "id": 5821, "reference": "ORD-5821", "status": "pending",
    "payment_method": "cod", "payment_status": "unpaid",
    "subtotal": 2000, "shipping_cost": 500, "discount": 0, "total": 2500,
    "delivery_type": "home", "wilaya_id": 16, "commune": "Bab Ezzouar",
    "customer": { "name": "Ahmed Ben Ali", "phone": "0555123456" },
    "items": [ { "product_id": 1027, "name": "Women's jacket", "price": 2000, "qty": 1, "total": 2000 } ],
    "created_at": "2026-07-18T20:00:00Z"
  }
}

Créer une commande

POST/v1/orders

Créez une commande par programme. Nécessite une clé avec la portée write. La commande applique toutes les règles : recalcul du prix côté serveur, réservation du stock et frais de livraison par wilaya.

Corps de la requête

customer.name optionnelNom complet du client (ou utilisez first_name et last_name).
customer.phone requisUn numéro algérien à 10 chiffres commençant par 05, 06 ou 07 — ex. 0555123456.
customer.wilaya_id requisIdentifiant de wilaya (1–69).
customer.commune optionnelCommune.
items[] requisArticles : chacun a product_id (ou bundle_id) et qty.
payment_method optionnelMode de paiement : cod (défaut), chargily, ccp, baridimob
delivery_type optionnelType de livraison : home (défaut) ou desk (point relais).
curl -X POST "https://mystoq.com/api/v1/orders" \
  -H "Authorization: Bearer msq_ab12cd34_secret" \
  -H "Content-Type: application/json" \
  -d '{
    "customer": { "name": "Ahmed Ben Ali", "phone": "0555123456", "wilaya_id": 16, "commune": "Bab Ezzouar" },
    "items": [ { "product_id": 1027, "qty": 1 } ],
    "payment_method": "cod",
    "delivery_type": "home"
  }'
Le succès renvoie l’objet commande avec id, reference et totaux. Les Webhooks se déclenchent automatiquement.

Webhooks

Enregistrez une URL https dans le tableau de bord pour recevoir des notifications POST instantanées lors des événements.

ÉvénementSe déclenche quand
order.createdUne nouvelle commande est créée.
order.updatedLe statut d’une commande change (inclut old_status et new_status).
// Charge utile envoyée à votre URL
{
  "event": "order.created",
  "created_at": "2026-07-11T20:00:00Z",
  "data": {
    "id": 5821, "reference": "ORD-5821", "status": "pending",
    "total": 2500, "customer": { "name": "Ahmed", "phone": "0555…" }
  }
}

Vérifier la signature

Chaque Webhook porte un en-tête X-Mystoq-Signature = sha256=HMAC(secret, rawBody). Vérifiez-le pour confirmer l’origine et l’intégrité.

// Node.js — exemple de vérification
const crypto = require("crypto");
const expected = "sha256=" +
  crypto.createHmac("sha256", SECRET).update(rawBody).digest("hex");
if (expected === req.headers["x-mystoq-signature"]) { /* de confiance */ }
Répondez 2xx sous 8 secondes. En cas d’échec, nous réessayons jusqu’à 4 fois avec un délai croissant.

Erreurs

CodeSignification
200 / 201Succès
401Clé invalide ou manquante
403La clé n’a pas la portée requise (write)
404Ressource introuvable
422Validation échouée (détails dans errors)
429Limite de débit dépassée