Kayroo Connect

Créer une intégration pour une boutique Kayroo

Tout ce qu'un développeur externe doit savoir pour lire les données d'une boutique et réagir à ses événements.

Dernière mise à jour : September 2026

1. Qu'est-ce que Kayroo Connect ?

Kayroo est une plateforme e-commerce (proche dans son fonctionnement de Shopify) qui permet à des marchands en Algérie de gérer une boutique en ligne — produits, commandes, livraison, paiement — sans écrire une ligne de code. « Kayroo Connect » est le nom donné à la couche d'intégration publique de la plateforme : une API REST et un système de webhooks qui permettent à une application externe de dialoguer avec la boutique d'un marchand depuis l'extérieur.

C'est le même modèle de confiance qu'une « app » Shopify ou un plugin WooCommerce hébergé sur son propre serveur : votre application vit entièrement sur votre propre infrastructure, dans votre propre dépôt de code. Elle ne reçoit jamais de copie du code source de Kayroo, jamais d'identifiants de base de données, jamais d'accès SSH ni au panneau d'administration. Chaque interaction passe par les deux canaux décrits sur cette page :

  • Une API REST authentifiée par jeton (token) — vous demandez des données (produits, commandes, informations sur la boutique, segments clients, paniers abandonnés) via HTTPS simple.
  • Des webhooks sortants — Kayroo envoie une petite notification HTTP à votre serveur dès qu'un événement se produit (nouvelle commande, changement de produit, nouveau lead, nouvel avis), pour éviter d'interroger l'API en continu.
Si une fonctionnalité que vous développez semble nécessiter un accès direct à la base de données, un identifiant employé Kayroo, ou une copie du code source de Kayroo — ce n'est pas le cas. Cela signifierait que l'API ne couvre pas encore ce besoin. Demandez au propriétaire de la boutique de transmettre la demande à l'équipe Kayroo afin que l'API soit étendue plutôt que contournée.

2. Comment la connexion fonctionne, de bout en bout

Il n'existe aujourd'hui ni marketplace d'applications, ni bouton OAuth « installer », ni compte développeur à créer chez Kayroo. C'est le propriétaire de la boutique (le marchand) qui accorde lui-même l'accès à votre application, directement depuis son panneau d'administration. Le déroulé est le suivant :

  1. Le marchand ouvre son panneau d'administration Kayroo, va dans Paramètres → Jetons API (API Tokens), et crée un nouveau jeton pour votre intégration — en lui donnant un nom et en choisissant précisément les permissions (« scopes ») qu'il doit avoir.
  2. Le marchand copie ce jeton et vous l'envoie (ou le colle directement dans l'écran de configuration de votre application, selon la conception de votre produit).
  3. Votre application stocke ce jeton de façon sécurisée et l'envoie comme Bearer token à chaque requête API adressée à la boutique de ce marchand.
  4. En option, le marchand se rend aussi dans Paramètres → Webhooks de son panneau d'administration, colle l'URL de votre serveur, et choisit les événements pour lesquels il souhaite être notifié. Kayroo envoie alors automatiquement ces événements vers votre URL.
Un jeton est propre à une seule boutique. Si votre produit sert plusieurs marchands, chacun répète cette même configuration et vous fournit son propre jeton — vous ne réutilisez jamais le jeton d'un marchand pour accéder aux données d'un autre.

3. Démarrage rapide

Une fois que vous avez un jeton fourni par un marchand, chaque requête fonctionne de la même façon : une requête HTTPS GET avec le jeton dans l'en-tête Authorization, adressée au domaine de la boutique de ce marchand, sous /api/v1.

bash
curl "https://example-store.kayroo.app/api/v1/store" \
  -H "Authorization: Bearer kt_live_XXXXXXXXXXXXXXXXXXXXXXXXXXXX" \
  -H "Accept: application/json"

Une réponse réussie ressemble à ceci :

json
{
  "data": {
    "id": "9f2c1a...",
    "name": "Example Store",
    "subdomain": "example-store",
    "custom_domain": null,
    "currency": "DZD",
    "language": "fr",
    "delivery_fee": 400,
    "api_version": "v1"
  }
}
Kayroo détermine à quelle boutique appartient une requête uniquement à partir du jeton — en pratique, une requête vers n'importe quel hôte Kayroo (le sous-domaine kayroo.app du marchand, son domaine personnalisé, ou un hôte api. partagé) aboutit à la bonne boutique. Utiliser le sous-domaine propre du marchand, comme dans l'exemple ci-dessus, reste le choix le plus simple et le plus clair.

4. Authentification

Chaque requête doit inclure le jeton comme Bearer token dans l'en-tête Authorization :

text
Authorization: Bearer kt_live_XXXXXXXXXXXXXXXXXXXXXXXXXXXX

Un jeton peut éventuellement avoir une date d'expiration, définie par le marchand lors de sa création. Une fois expiré, révoqué ou supprimé, le jeton cesse de fonctionner immédiatement sur toutes les requêtes suivantes — il n'y a pas de période de grâce.

Un jeton manquant, mal formé, expiré ou révoqué reçoit toujours la même réponse :

json
HTTP/1.1 401 Unauthorized
{ "error": "Invalid or expired token." }

5. Scopes (permissions)

Un jeton n'a jamais plus de pouvoir que les scopes cochés par le marchand à sa création. Chaque endpoint de l'API exige exactement un scope — ne demandez que ce dont votre intégration a réellement besoin ; un marchand fera bien plus confiance à une intégration qui ne demande pas tout.

Scope Donne accès à
store.read Informations de base sur la boutique (nom, devise, langue, frais de livraison)
products.read Catalogue produits, y compris variantes et stock
orders.read Commandes et leurs lignes, totaux, et destination de livraison
customers.read Comptes de segments clients et paniers abandonnés

Si un jeton est utilisé pour appeler un endpoint pour lequel il n'a pas le scope requis, l'API répond :

json
HTTP/1.1 403 Forbidden
{
  "error": "insufficient_scope",
  "message": "This token is not authorized for the \"products.read\" scope.",
  "required_ability": "products.read"
}

6. Référence API

Tous les endpoints sont en lecture seule (GET) et se trouvent sous /api/v1. Toutes les réponses sont en JSON. Tous les montants sont des nombres en dinar algérien (DZD), sans conversion de devise.

GET /api/v1/store — scope : store.read

Informations de base sur la boutique : nom, sous-domaine, domaine personnalisé (le cas échéant), devise, langue de la boutique, et frais de livraison fixes.

bash
curl "https://example-store.kayroo.app/api/v1/store" \
  -H "Authorization: Bearer kt_live_XXXX"
GET /api/v1/products — scope : products.read

Une liste paginée des produits de la boutique. Paramètres de requête (tous optionnels) :

Paramètre Signification
visible_only=1 Uniquement les produits actuellement affichés sur la boutique
featured=1 Uniquement les produits mis en avant
search=term Recherche sur le nom du produit ou le SKU
per_page=25 Éléments par page (25 par défaut, 100 maximum)
json
{
  "data": [
    {
      "id": 41,
      "name": "Classic Leather Wallet",
      "slug": "classic-leather-wallet",
      "sku": "WAL-041",
      "description": "Full-grain leather, hand-stitched.",
      "price": 3500,
      "compare_price": 4200,
      "current_price": 3500,
      "on_sale": false,
      "currency": "DZD",
      "stock": 18,
      "in_stock": true,
      "is_visible": true,
      "is_featured": true,
      "category": "Accessories",
      "image_url": "https://example-store.kayroo.app/storage/products/41.jpg",
      "variants": [
        { "id": 101, "options": { "Color": "Brown" }, "price": null, "stock": 10 },
        { "id": 102, "options": { "Color": "Black" }, "price": null, "stock": 8 }
      ],
      "created_at": "2026-02-11T09:12:00+00:00",
      "updated_at": "2026-05-03T14:40:00+00:00"
    }
  ],
  "links": { "first": "...", "last": "...", "prev": null, "next": "..." },
  "meta": { "current_page": 1, "last_page": 4, "per_page": 25, "total": 87 }
}

GET /api/v1/products/{id} renvoie le même format pour un produit unique (un objet simple sous « data »), ou un corps JSON 404 si l'ID n'existe pas sur cette boutique.

GET /api/v1/orders — scope : orders.read

Une liste paginée des commandes. Paramètres de requête (tous optionnels) :

Paramètre Signification
status=confirmed Une valeur parmi : pending, confirmed, delivered, cancelled
since=2026-06-01 Uniquement les commandes créées à partir de cette date
per_page=25 Éléments par page (25 par défaut, 100 maximum)
json
{
  "data": [
    {
      "id": 1032,
      "status": "confirmed",
      "customer": {
        "name": "Amine K.",
        "phone": "0555xxxxxx",
        "email": null,
        "address": "Cité 100 logements, Bt 4"
      },
      "items": [
        { "product_id": 41, "variant_id": 101, "name": "Classic Leather Wallet", "qty": 2, "line_total": 7000 }
      ],
      "subtotal": 7000,
      "discount_amount": 0,
      "coupon_code": null,
      "delivery_price": 400,
      "total": 7400,
      "currency": "DZD",
      "wilaya": "Alger",
      "commune": "Bab Ezzouar",
      "tracking_number": "YAL-88213",
      "landing_page_id": null,
      "created_at": "2026-06-30T10:02:00+00:00",
      "updated_at": "2026-07-01T08:15:00+00:00"
    }
  ],
  "links": { "...": "..." },
  "meta": { "...": "..." }
}
Les réponses de commande n'incluent jamais l'adresse IP du client, son user-agent, le statut interne de fraude/risque, les notes internes de l'administrateur, ni le jeton du lien public de confirmation — ces éléments restent internes à Kayroo.
GET /api/v1/customers/segments — scope : customers.read

Des comptes agrégés de clients regroupés en segments comportementaux — nouveaux, récurrents, champions (fréquents et à forte valeur), et à risque (clients qui achetaient mais plus récemment). Paramètre de requête optionnel : lookback_days (90 par défaut, entre 7 et 365).

json
{
  "data": {
    "new": 128,
    "repeat": 54,
    "champions": 12,
    "at_risk": 31
  },
  "meta": { "lookback_days": 90 }
}
GET /api/v1/abandoned-checkouts — scope : customers.read

Une liste paginée des paniers que des clients ont commencés sans finaliser — utile pour des relances de récupération de panier. Paramètres de requête (tous optionnels) :

Paramètre Signification
days=30 Uniquement les paniers commencés au cours des N derniers jours (30 par défaut, 365 max)
include_recovered=1 Inclure ceux ayant ensuite abouti à une commande (exclus par défaut)
json
{
  "data": [
    {
      "id": 77,
      "customer_name": "Yasmine B.",
      "customer_phone": "0661xxxxxx",
      "customer_email": null,
      "cart": { "items": [ { "product_id": 41, "qty": 1 } ] },
      "recovered": false,
      "created_at": "2026-07-02T19:40:00+00:00"
    }
  ]
}

8. Limites de débit

Chaque jeton est limité par défaut à 120 requêtes par minute. Au-delà, vous recevrez une réponse HTTP 429 — ralentissez et réessayez après un court délai. Mettez en place une logique de nouvelle tentative avec backoff plutôt que de marteler l'API en boucle serrée ; cela protège aussi votre intégration d'être confondue avec un trafic abusif.

9. Erreurs

Les erreurs sont toujours du JSON brut avec une clé « error », et parfois un « message » lisible. Voici les codes de statut que vous rencontrerez :

Statut Signification Cause typique
401 Unauthenticated Jeton manquant, invalide, expiré, ou révoqué
403 insufficient_scope Le jeton n'a pas le scope requis par l'endpoint
404 not_found L'ID de l'enregistrement n'existe pas sur cette boutique
422 Erreur de validation Un paramètre de requête avait une valeur invalide
429 Too many requests Limite de débit dépassée — ralentissez et réessayez

10. Webhooks

Plutôt que d'interroger l'API en continu pour savoir « est-ce que quelque chose a changé ? », vous pouvez demander à Kayroo de notifier votre serveur dès qu'un événement se produit. Le marchand enregistre l'URL de votre endpoint depuis Paramètres → Webhooks dans son panneau d'administration et choisit parmi les événements suivants lesquels vous envoyer :

Événement Se déclenche quand…
order.created Une nouvelle commande est passée (depuis le paiement, ou créée manuellement par le marchand)
order.updated Le statut d'une commande change (ex. pending → confirmed → delivered)
order.cancelled Une commande est annulée
product.created Un nouveau produit est ajouté au catalogue
product.updated Un produit est modifié (prix, stock, détails, …)
product.deleted Un produit est retiré du catalogue
lead.created Un visiteur soumet le formulaire de contact de la boutique
review.created Un acheteur vérifié soumet un avis produit

Chaque webhook est une requête HTTP POST vers l'URL enregistrée par le marchand, avec ce format de corps JSON :

json
{
  "event": "order.created",
  "data": {
    "id": 1032,
    "status": "pending",
    "total": 7400,
    "customer_name": "Amine K.",
    "customer_phone": "0555xxxxxx",
    "created_at": "2026-06-30T10:02:00+00:00"
  },
  "timestamp": "2026-06-30T10:02:01+00:00"
}
Les charges utiles (payloads) des webhooks sont volontairement minces — juste ce qu'il faut pour identifier l'événement. Quand vous en recevez un, appelez l'endpoint REST correspondant (ex. GET /orders/{id}) si vous avez besoin de l'enregistrement complet et à jour.

La requête transporte aussi deux en-têtes sur lesquels vous pouvez vous appuyer :

En-tête Rôle
X-Webhook-Event Le nom de l'événement, identique au champ « event » du corps (ex. order.created)
X-Webhook-Signature Une signature HMAC-SHA256 du corps brut de la requête — voir la vérification ci-dessous

11. Vérifier qu'un webhook provient bien de Kayroo

Avant de faire confiance à un webhook, vérifiez sa signature. Chaque abonnement webhook possède son propre secret, généré par Kayroo lorsque le marchand enregistre votre endpoint, et affiché une seule fois au marchand pour qu'il vous le transmette de façon sécurisée. Pour vérifier une requête :

  1. Prenez les octets bruts exacts du corps de la requête (ne re-sérialisez ni ne reformatez le JSON).
  2. Calculez le HMAC-SHA256 de ces octets en utilisant le secret partagé comme clé.
  3. Comparez le résultat, sous forme de chaîne hexadécimale en minuscules, à l'en-tête X-Webhook-Signature, avec une comparaison à temps constant.
  4. En cas de non-correspondance, rejetez la requête (répondez 401 et ignorez-la) — la charge utile ne provient pas de Kayroo, ou a été modifiée en transit.

Exemple de vérification en PHP :

php
$rawBody   = file_get_contents('php://input');
$expected  = hash_hmac('sha256', $rawBody, $sharedSecret);
$received  = $_SERVER['HTTP_X_WEBHOOK_SIGNATURE'] ?? '';

if (! hash_equals($expected, $received)) {
    http_response_code(401);
    exit;
}

// Signature vérifiée — vous pouvez traiter $rawBody en toute sécurité.

Exemple de vérification en Node.js :

javascript
const crypto = require('crypto');

function isValidSignature(rawBody, signatureHeader, sharedSecret) {
  const expected = crypto
    .createHmac('sha256', sharedSecret)
    .update(rawBody)
    .digest('hex');

  return crypto.timingSafeEqual(
    Buffer.from(expected),
    Buffer.from(signatureHeader || '')
  );
}
Répondez à la requête webhook rapidement (en quelques secondes) avec un statut 2xx dès que vous l'avez acceptée — effectuez votre traitement plus lent ensuite, de façon asynchrone. Si votre endpoint échoue à répondre correctement 10 fois de suite, Kayroo désactive automatiquement cet abonnement webhook et le marchand devra le réactiver.

12. Sécurité et attentes en matière de traitement des données

  • Ne demandez que les scopes dont vous avez réellement besoin. Ne demandez pas à un marchand toutes les permissions « au cas où » — cela rend votre intégration suspecte, et la plupart des marchands refuseront.
  • Stockez les jetons et secrets de webhook chiffrés au repos, jamais en clair dans des logs, et ne les exposez jamais dans du code côté client.
  • Vérifiez la signature de chaque webhook avant d'agir dessus — ne faites jamais confiance à une charge utile non vérifiée.
  • Respectez immédiatement toute révocation. Si un marchand supprime votre jeton ou retire votre abonnement webhook, tout accès s'arrête instantanément côté Kayroo — assurez-vous que votre application gère cela proprement (par exemple en marquant la connexion comme déconnectée) plutôt que de traiter chaque échec comme une erreur transitoire.
  • N'utilisez les données récupérées d'une boutique que pour le bénéfice de ce même marchand. Ne les agrégez, ne les revendez, ni ne les partagez jamais entre marchands, et ne les utilisez jamais pour un usage auquel le marchand n'a pas consenti.
  • Définissez une durée de conservation pour tout ce que vous mettez en cache depuis l'API, et supprimez-le lorsqu'un marchand déconnecte votre intégration ou vous le demande.

13. Périmètre actuel et limitations connues

  • Lecture seule aujourd'hui. Il n'existe pas encore d'endpoint pour créer ou modifier quoi que ce soit sur une boutique (pas de création de commande, pas de mise à jour de stock, etc.) — tout ce qui précède est uniquement en GET.
  • Pas de compte développeur en libre-service ni de marketplace d'applications. Un jeton est créé manuellement par chaque marchand depuis son propre panneau d'administration ; il n'existe pas encore d'endroit central pour vous enregistrer en tant qu'« application Kayroo ».
  • Un jeton continue de fonctionner même si le forfait d'abonnement du marchand change, jusqu'à ce que le marchand le révoque ou qu'il expire — la vérification du forfait n'a lieu aujourd'hui qu'à la création du jeton.
  • Les nouvelles tentatives de livraison des webhooks sont limitées : Kayroo ne réessaie pas actuellement une livraison échouée avec un backoff ; un abonnement webhook est simplement désactivé après 10 échecs consécutifs, et le marchand doit le réactiver une fois votre endpoint de nouveau opérationnel.

L'accès API et les webhooks sont disponibles pour les marchands sur le forfait Scale de Kayroo et sur le forfait à la consommation (Pay-As-You-Go). Si un marchand avec qui vous vous intégrez ne trouve pas Paramètres → Jetons API dans son panneau d'administration, c'est généralement la raison — demandez-lui de vérifier son forfait actuel.

14. Des questions ou un élément manquant ?

Cette API continuera d'évoluer. Si votre intégration a besoin d'une donnée ou d'un événement qui n'est pas couvert ici, ne cherchez pas de contournement via un accès direct — demandez au marchand de transmettre votre demande à l'équipe Kayroo, ou contactez-nous directement à [email protected].

Plateforme Kayroo
retour en haut