Intégrations

Brancher Heurix sur votre plateforme.

Des guides techniques avec du vrai code, pas des promesses en l'air. Chaque intégration couvre deux choses : afficher les résultats Heurix à la place de la recherche native, et garder votre catalogue synchronisé.

Honnêteté d'abord : ce sont des guides d'intégration destinés à un développeur, pas des applications "installer en un clic" depuis les stores Shopify/PrestaShop/etc. — ça viendra si la demande le justifie, mais on n'a pas voulu vous le faire croire avant que ce soit vrai.

Particularité Shopify. Shopify ne permet pas d'exécuter du code serveur avec une clé secrète directement dans un thème (Liquid est rendu côté serveur mais sans appels sortants authentifiés possibles). La bonne architecture : une petite fonction serverless (Cloudflare Worker ci-dessous, gratuit jusqu'à 100 000 requêtes/jour) qui détient la vraie clé Heurix et sert de relais entre votre thème et l'API — votre clé n'est jamais exposée dans le navigateur.

1. Brancher la recherche

Le relais (Cloudflare Worker) :

// worker.js — déployé sur Cloudflare Workers (gratuit pour ce volume)
export default {
  async fetch(request, env) {
    const url = new URL(request.url);
    const q = url.searchParams.get("q") || "";
    const res = await fetch("https://api.heurix.fr/v1/index/" + env.HEURIX_CATALOG + "/search", {
      method: "POST",
      headers: {
        "Authorization": "Bearer " + env.HEURIX_API_KEY,  // secret Cloudflare, jamais exposé
        "Content-Type": "application/json"
      },
      body: JSON.stringify({ q, limit: 20 })
    });
    return new Response(await res.text(), {
      headers: { "Content-Type": "application/json", "Access-Control-Allow-Origin": "https://votre-boutique.myshopify.com" }
    });
  }
}

Dans le thème (Online Store 2.0), remplacez le rendu de sections/search-results.liquid par un appel à ce relais :

<div id="heurix-results"></div>
<script>
  const params = new URLSearchParams(window.location.search);
  fetch("https://votre-worker.workers.dev/search?q=" + encodeURIComponent(params.get("q") || ""))
    .then(r => r.json())
    .then(data => {
      document.getElementById("heurix-results").innerHTML = data.hits.map(h =>
        `<a href="/products/${h.product.handle}" class="heurix-hit">
           <span>${h.product.name}</span><span>${h.product.price} €</span>
         </a>`
      ).join("");
    });
</script>

2. Synchroniser le catalogue

Enregistrez un webhook Shopify (Admin API ou shopify.app.toml pour une app custom) sur les sujets products/create, products/update, products/delete, pointé vers le même Worker :

// Ajout dans worker.js : gestion du webhook Shopify
async function handleWebhook(request, env) {
  const product = await request.json();
  await fetch("https://api.heurix.fr/v1/index/" + env.HEURIX_CATALOG + "/items", {
    method: "POST",
    headers: { "Authorization": "Bearer " + env.HEURIX_API_KEY, "Content-Type": "application/json" },
    body: JSON.stringify({
      rulepack: "mode",
      items: [{
        id: String(product.id),
        name: product.title,
        ref: product.variants?.[0]?.sku || "",
        description: product.body_html?.replace(/<[^>]+>/g, "") || "",
        stock: product.variants?.reduce((s, v) => s + (v.inventory_quantity || 0), 0) || 0,
        handle: product.handle,
        price: product.variants?.[0]?.price
      }]
    })
  });
}

Pensez à vérifier la signature HMAC du webhook Shopify (X-Shopify-Hmac-Sha256) avant de traiter la charge utile, pour ne pas accepter de requêtes forgées.

Une question sur votre plateforme ?

Ces guides sont un point de départ technique, pas un module clé en main. Si votre configuration sort de l'ordinaire, écrivez-nous.

Essai gratuit 14 jours

Testez le Search API sur votre catalogue, sans carte bancaire.

Voir les tarifs