Aller au contenu

Documentation

Une balise script par site, une API REST et un serveur MCP pour tout gérer, et des webhooks signés pour les achats vérifiés. Remplacez les valeurs d'exemple comme site_your_site_key, provedly_your_key et pp_your_widget_token par celles de votre tableau de bord.

Installer sur votre site

Collez le snippet de votre site avant la balise de fermeture du body sur chaque page. Il charge tous les widgets et barres CTA actifs de ce site, en asynchrone, dans un Shadow DOM.

Chaque site a sa propre clé. Copiez la ligne exacte depuis Sites, votre site, Install on this site. Mettre en pause, relancer ou créer des widgets et des barres depuis le tableau de bord, ou depuis un assistant IA, ne demande aucune modification du code. Les changements du tableau de bord atteignent vos visiteurs en une minute environ.

index.html
...
    <script src="https://provedly.app/w/site.js" data-site="site_your_site_key" async></script>
  </body>
</html>

App Shopify et plugin WordPress

Si vous utilisez l'app Provedly pour Shopify, n'installez rien : l'app embed du thème charge tout. Le Extension WordPress continue de fonctionner tel quel.

Avancé : une balise par élément

Le snippet du site couvre presque tous les cas. Chaque widget et chaque barre a aussi sa propre balise, dans Advanced sur son onglet Embed, pour deux situations : une barre intégrée qui doit s'afficher à un endroit précis de la page (elle apparaît là où sa balise est collée), et les constructeurs de pages qui n'acceptent du code que par bloc. Une page qui contient les deux types de balises ne charge jamais un élément deux fois.

Domaines autorisés

L'endpoint de configuration ne répond qu'aux domaines listés sur le site. Les sous-domaines sont inclus : example.com couvre donc shop.example.com. Ajoutez explicitement vos hôtes de préproduction. Une liste vide autorise n'importe quel domaine, ce que nous déconseillons.

Ce qui se passe au chargement

  1. Le snippet du site fait une seule requête, GET https://provedly.app/api/s/{site key}/manifest, qui renvoie chaque widget et barre actifs avec leurs réglages et jusqu'à 30 enregistrements récents par widget, ainsi que la version actuelle du code.
  2. Il charge ensuite le code du widget et celui de la barre, seulement si la page en a besoin. Ce sont deux fichiers versionnés que votre navigateur garde en cache jusqu'à la prochaine version.
  3. Le cycle des notifications démarre après le délai initial que vous avez choisi. Chaque affichage envoie une impression à /track.
  4. Tant que l'onglet est ouvert, un signal de présence appelle /presence toutes les 30 secondes pour le compteur en direct.

Afficher le compteur en direct dans votre page

Ajoutez un élément là où le nombre doit apparaître, par exemple sous le titre du produit ou le bouton Ajouter au panier. Sur Shopify, utilisez un bloc Custom liquid dans l'éditeur de thème. Le snippet du site le remplit avec le même nombre réel que la notification (visiteurs vus au cours des 90 dernières secondes) et le masque sous votre minimum.

Page produit
<div data-provedly-live data-template="{n} people are viewing this product right now"></div>

Ajoutez data-style="card" pour une version en carte avec le nombre en grand et un lien Verify vers votre page de vérification, ou data-dot="off" pour retirer le point. Avec plusieurs widgets sur une page, mettez le token d'un widget dans l'attribut (data-provedly-live="pp_…") pour choisir lequel.

Tutoriels vidéo : n'importe quel site ou WordPress et Shopify.

Clés d'API

Créez des clés dans Settings, API keys. Une même clé fonctionne pour l'API REST, le serveur MCP et le flux de statistiques. Disponible sur toutes les offres, y compris Free.

AccèsPeut lirePeut modifier
Lecture seuleListes et statistiquesRien
Lecture et écritureListes et statistiquesMettre en pause et relancer widgets et barres, créer et modifier des barres, ajouter des enregistrements

Fonctionnement des clés

  • Les clés commencent par provedly_ et appartiennent à l'espace de travail, pas à un widget précis.
  • La clé ne s'affiche qu'une fois, à sa création. Nous n'en gardons qu'un hash : copiez-la tout de suite.
  • Révoquez une clé à tout moment depuis la même page. Les requêtes avec une clé révoquée reçoivent un 401.

REST API

Lisez vos sites, widgets, barres et statistiques, et faites les mêmes modifications que dans le tableau de bord. Les réponses sont du JSON enveloppé dans un champ data.

URL de base
https://provedly.app/api/v1
Authorization: Bearer provedly_your_key
EndpointCléRemarques
GET /accountreadOffre, consommation et limites.
GET /sitesread
GET /sites/{site}/snippetreadLe code d'installation de ce site.
GET /widgets[?site=]readFiltrage facultatif par site.
GET /widgets/{widget}read
PATCH /widgets/{widget}writeN'importe lequel de name, status et des réglages de widget ci-dessous. Seuls les champs envoyés changent. Une relance au-delà de la limite de widgets de l'offre est refusée.
GET /bars[?site=]readFiltrage facultatif par site.
GET /bars/{bar}read
POST /barswriteCrée une barre. Les nouvelles barres démarrent en pause.
PATCH /bars/{bar}writeN'importe lequel de name, kind, message, button_text, button_url, ends_at, status et des réglages de barre ci-dessous. Un nouveau kind change le type en gardant les statistiques, le design et le ciblage de la barre ; countdown exige une date de fin. Les barres terminées ou archivées ne peuvent pas être modifiées.
GET /stats?days=30[&site=]readdays de 1 à 365.
POST /widgets/{token}/recordswriteL'API des enregistrements. Accepte aussi la clé propre du widget.

Identifiants

Les widgets et les barres acceptent leur id (un UUID) ou leur token. Les sites acceptent leur id ou leur domaine.

curl -X PATCH https://provedly.app/api/v1/widgets/pp_your_widget_token \
  -H "Authorization: Bearer provedly_your_key" \
  -H "Content-Type: application/json" \
  -d '{"status": "paused"}'

Créer une barre (POST /bars)

ChampRèglesRemarques
siteobligatoireId ou domaine du site.
nameobligatoire
kindobligatoireAu choix : countdown, evergreen, counter, orders, static.
messageobligatoireUtilisez {timer} à l'endroit du minuteur. S'il manque sur les types avec minuteur, il est ajouté à la fin.
button_textfacultatif
button_urlfacultatif
ends_atfacultatif"2026-12-01 09:00" lu dans le fuseau horaire de la barre, ou ISO 8601. Les comptes à rebours durent 7 jours par défaut.
timezonefacultatifNom IANA. UTC par défaut.

Les nouvelles barres sont créées en pause. Activez-en une avec PATCH /bars/{bar} {"status": "active"}.

Réglages modifiables

Les lectures renvoient les mêmes champs : vous pouvez lire un widget ou une barre, changer une valeur et la renvoyer. Les règles d'URL acceptent une liste de chemins ou un chemin par ligne. Si la modification place deux éléments actifs au même endroit sur les mêmes pages, la réponse contient une entrée warnings.

ÉlémentEndpointChamps
WidgetsPATCH /widgets/{widget}message_template, theme, position, device, url_include, url_exclude, start_delay, display_seconds, gap_seconds, max_per_session, click_url, click_new_tab, verified_only, live_counter_enabled, live_counter_template, live_counter_min_show
BarresPATCH /bars/{bar}theme, position, target_id (barres intégrées : affichées dans l'élément portant cet id), device, url_include, url_exclude, delay_seconds, finish_action, finish_url, finish_message, evergreen_minutes, counter_start, counter_end, counter_step, counter_interval, orders_window_hours (24, 168, 720), orders_min

Le branding, la page de vérification publique, les enregistrements d'exemple et le design détaillé restent dans le tableau de bord.

Statistiques (GET /stats)

Impressions et clics des widgets et des barres, commandes et chiffre d'affaires vérifiés, commandes et chiffre d'affaires assistés par la preuve, et un détail par widget sur le nombre de jours choisi.

Erreurs et limites

{ "error": "...", "message": "..." }

401  missing or invalid key
403  read-only key used for a change
404  not in this workspace
422  refused: validation, plan limit, or an ended or archived bar

Chaque clé peut faire 120 requêtes par minute.

MCP : Claude, Cursor et autres outils d'IA

Connectez un assistant IA à votre espace de travail via le serveur MCP. Il utilise la même clé d'API et suit les mêmes règles que le tableau de bord.

Serveur
https://provedly.app/mcp   (streamable HTTP)
Authorization: Bearer provedly_your_key
Terminal
claude mcp add --transport http provedly https://provedly.app/mcp --header "Authorization: Bearer provedly_YOUR_KEY"

Outils

get_account, list_sites, list_widgets, list_bars, get_stats, set_widget_status, update_widget, set_bar_status, create_bar, update_bar, add_record, get_install_snippet.

Règles

  • Les mêmes limites d'offre s'appliquent que dans le tableau de bord.
  • Les barres créées par un assistant démarrent en pause jusqu'à ce que vous demandiez de les activer.
  • Une clé en lecture seule ne peut rien modifier.
  • Les enregistrements ajoutés via l'API ou MCP ne sont jamais marqués comme vérifiés. Seuls les webhooks signés de Stripe, Shopify et WooCommerce le sont.

Exemples de requêtes

  • « Combien d'impressions et de commandes vérifiées mes widgets ont-ils eues sur les 7 derniers jours ? »
  • « Crée une barre de compte à rebours sur example.com pour les soldes d'hiver qui se terminent le 1er décembre à 9 h, heure de New York. »
  • « Mets en pause tous les widgets de mon site de préproduction. »
  • « Donne-moi le code d'installation de ma boutique. »

Flux de statistiques

Un seul endpoint en lecture seule avec les chiffres clés de votre espace de travail, conçu pour les widgets de bureau et les tableaux de bord. Une clé en lecture seule suffit.

Endpoint
GET https://provedly.app/api/widget/summary?tz=America/New_York
X-API-Key: provedly_your_key

# or
Authorization: Bearer provedly_your_key
curl "https://provedly.app/api/widget/summary?tz=America/New_York" \
  -H "X-API-Key: provedly_your_key"

Ce qu'il renvoie

Uniquement les chiffres de cet espace de travail. Le paramètre tz est facultatif.

ChampContenuRemarques
impressionsSérie
clicksSérie
ctrTaux de clic
visitorslive, unique_today
ordersverified, assisted_30d, revenue_30d, assisted_revenue_30d, currencyverified est une série.
productsites, widgets_active, bars_active
usageimpressions_month, impressions_limit, percentCe mois-ci par rapport à votre offre.

Les champs de série contiennent today, yesterday, change_pct, last_7d, last_30d, total, trend_24h, trend_7d, trend_30d.

Les chiffres sont recalculés au plus une fois par minute. Chaque clé peut faire 60 requêtes par minute.

API des enregistrements

Envoyez un enregistrement depuis votre backend à chaque achat. De serveur à serveur uniquement. Utilisez la clé propre du widget, que vous pouvez renouveler depuis l'onglet Data, ou une clé de compte en lecture et écriture.

Endpoint
POST https://provedly.app/api/v1/widgets/pp_your_widget_token/records
Authorization: Bearer pk_your_api_key
Content-Type: application/json
curl -X POST https://provedly.app/api/v1/widgets/pp_your_widget_token/records \
  -H "Authorization: Bearer pk_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Jane Doe",
    "city": "Berlin",
    "country": "DE",
    "product_name": "Pro Plan",
    "price": "€49",
    "external_id": "order_123",
    "occurred_at": "2026-10-15T14:03:00Z"
  }'
ChampRèglesRemarques
nameobligatoire, texte, max. 120Mis en forme selon votre réglage de format de nom avant l'affichage.
cityfacultatif, max. 100
statefacultatif, max. 100Utilisé par le format de localisation « ville, état ».
countryfacultatif, 2 lettresISO 3166-1 alpha-2. Mis en majuscules à l'enregistrement.
product_namefacultatif, max. 150À défaut, le nom de produit par défaut du widget est utilisé.
pricefacultatif, max. 30Texte libre, par ex. « $49 » ou « €39 ».
avatar_urlfacultatif, URLUtilisé quand le style d'avatar est « image ».
external_idfacultatif, max. 120Unique par widget. Un doublon renvoie 422.
occurred_atfacultatif, dateISO 8601. Maintenant par défaut.

Réponses

201 Created
{ "id": 812, "hash": "9c1e0b7a…", "verified": false, "occurred_at": "2026-10-15T14:03:00+00:00" }

401 Unauthorized   wrong or missing bearer key
422 Unprocessable  validation errors, including a duplicate external_id

Le widget affiche les enregistrements de l'API, mais ne les marque jamais comme vérifiés. La mention vérifiée est réservée aux webhooks signés. Voir Webhooks.

Import CSV

Importez votre historique depuis un tableur dans l'onglet Data du widget. Seul le nom est obligatoire.

records.csv
name,city,state,country,product_name,price,avatar_url,occurred_at
Sarah Mitchell,Austin,TX,US,Pro Plan,$49,,2026-10-15T13:49:00Z
Hugo Martin,Paris,,FR,Annual Pass,€39,,2026-10-15T11:03:00Z
Yui Tanaka,Tokyo,,JP,Lifetime,,,2026-10-14T14:03:00Z

Règles

  • Ligne d'en-tête obligatoire, colonnes dans n'importe quel ordre, colonnes en trop ignorées.
  • Dates au format ISO 8601. Sans date, l'heure de l'import est utilisée.
  • « Skip duplicates » ignore les lignes dont le nom et la ville correspondent à un enregistrement existant à moins d'une heure d'écart.
  • Les lignes importées ont la source csv et ne sont pas vérifiées. Les lignes plus anciennes que votre fenêtre d'affichage sont conservées, mais pas affichées.

Webhooks (achats vérifiés)

Les enregistrements issus de webhooks sont les seuls à recevoir la mention vérifiée. Ajoutez l'endpoint dans l'onglet Data du widget, collez le secret de signature, puis enregistrez l'URL chez le fournisseur. Disponible sur toutes les offres, y compris la gratuite.

Stripe

  1. Dans l'onglet Data du widget, ajoutez une source Stripe. Copiez l'URL de l'endpoint :
https://provedly.app/api/hooks/stripe/pp_your_widget_token
  1. Dans Stripe, allez dans Developers, Webhooks, Add endpoint. Collez l'URL et sélectionnez les événements envoyés par votre checkout : checkout.session.completed pour les paiements Checkout ponctuels, invoice.paid pour les abonnements, et payment_intent.succeeded uniquement si vous encaissez des Payment Intents sans Checkout. Un achat n'est enregistré qu'une fois, même si plusieurs de ces événements se déclenchent.
  2. Copiez le secret de signature (whsec_…) dans le champ secret de la source dans Provedly.
  3. Envoyez un événement de test depuis Stripe. La source affiche « last event » en quelques secondes.

Nous lisons le nom du client, le pays et la ville de livraison ou de facturation s'ils sont présents, le premier article comme produit et le total formaté comme prix.

App Shopify (recommandée pour les boutiques Shopify)

  1. Installez Provedly depuis le Shopify App Store (fiche bientôt disponible).
  2. Sur la page d'accueil de l'app, cliquez sur « Open theme editor », vérifiez que l'app embed Provedly est activé, puis enregistrez. Sans code, sans balise script.
  3. Les commandes deviennent automatiquement des enregistrements vérifiés : les 60 derniers jours sont importés à l'installation et chaque nouvelle commande arrive par un webhook signé.

L'app fonctionne dans votre admin Shopify avec les mêmes outils de design, de données et d'analyse que ce tableau de bord. Les offres sont facturées par Shopify sur votre facture Shopify habituelle ; l'offre Free ne demande aucun moyen de paiement. Les noms et villes des acheteurs n'apparaissent qu'une fois que Shopify a approuvé l'accès de l'app aux données clients ; d'ici là, les notifications affichent « Someone just purchased… ».

Webhook Shopify (manuel)

  1. Ajoutez une source Shopify dans l'onglet Data et copiez l'URL :
https://provedly.app/api/hooks/shopify/pp_your_widget_token
  1. Dans l'admin Shopify, Settings, Notifications, Webhooks, créez un webhook pour Order payment (orders/paid), au format JSON, avec cette URL. Order creation fonctionne aussi si vous voulez inclure les commandes non payées ; une même commande n'est jamais enregistrée deux fois.
  2. Copiez le secret partagé affiché sous la liste des webhooks dans le champ secret de la source.

Les payloads sont vérifiés grâce à l'en-tête HMAC-SHA256. Un échec est journalisé et l'événement ignoré. Sans secret, les événements sont acceptés mais affichés « No signing secret set » dans votre tableau de bord, et ne sont pas marqués comme vérifiés.

WooCommerce (plugin WordPress ou webhook manuel)

  1. Ajoutez une source WooCommerce dans l'onglet Data, copiez l'URL et choisissez un secret de signature (n'importe quelle chaîne d'au moins 8 caractères) :
https://provedly.app/api/hooks/woocommerce/pp_your_widget_token
  1. Avec le plugin : installez Provedly depuis WordPress.org (Extensions, Ajouter, recherchez « Provedly »), ouvrez Provedly dans le menu d'administration, collez le token du widget, l'URL et le secret, puis enregistrez. Le plugin ajoute les balises script, crée le webhook WooCommerce et transmet l'id du visiteur avec chaque commande pour l'attribution.
  2. Manuellement : WooCommerce, Settings, Advanced, Webhooks, Add webhook. Sujet Order updated, l'URL de livraison ci-dessus, le même secret, version d'API WP REST API v3.

WooCommerce signe chaque envoi en HMAC-SHA256 dans X-WC-Webhook-Signature. Seules les commandes en Processing ou Completed deviennent des enregistrements, une fois chacune : les commandes en attente, échouées ou annulées n'apparaissent jamais.

Attribution (commandes assistées par la preuve)

Le tableau de bord ne compte une commande comme assistée par la preuve que si l'acheteur portait un id de visiteur ayant vu une notification du même widget dans les 30 jours précédant l'achat. Rien n'est estimé. Sur les boutiques Shopify qui utilisent l'app, c'est automatique : le widget écrit l'id du visiteur dans le panier sous l'attribut provedly_visitor et le webhook de commande le relit.

Partout ailleurs, transmettez vous-même l'id du visiteur. Le widget le conserve dans le cookie first-party pv_vid et l'expose via window.Provedly.visitorId().

  • Stripe : définissez metadata.provedly_visitor sur la Checkout Session ou le PaymentIntent.
  • API des enregistrements : envoyez-le dans le champ facultatif visitor.
// at checkout time, on your site
const visitor = window.Provedly?.visitorId();
// Stripe: pass it as metadata.provedly_visitor
// Records API: POST { ..., "visitor": visitor }

Page de vérification

Chaque widget a une page publique qui liste ses sources, sa politique et les racines de son registre. Le badge de la notification y renvoie. Vous pouvez aussi la lier depuis n'importe où.

https://provedly.app/verify/pp_your_widget_token

Ce qu'elle affiche

Le nombre d'achats vérifiés sur 24 heures, 7 jours et depuis le début ; la fenêtre et le minimum du compteur en direct ; si des exemples sont affichés ; si seuls les achats vérifiés sont affichés ; chaque source avec ses chiffres et son dernier enregistrement ; les fournisseurs connectés ; les achats vérifiés récents sous forme de hashes ; et les racines SHA-256 nocturnes du registre. Les noms et les villes n'apparaissent jamais. Lisez la page Confiance pour comprendre pourquoi.

Vérifier un enregistrement par rapport à une racine

Le hash de chaque enregistrement est renvoyé quand vous le créez via l'API. La racine d'un jour est le SHA-256 de la liste triée des hashes des enregistrements de ce jour. Conservez vos hashes et vous pourrez recalculer la racine vous-même.

Dépannage

Le widget est installé mais n'affiche rien

Si « Verified purchases only » est activé et que le widget n'a encore aucun enregistrement vérifié, il n'a rien à afficher. La page du widget vous le signale. Désactivez ce réglage ou connectez une boutique.

Une modification du tableau de bord n'apparaît pas encore sur mon site

Patientez environ une minute, puis rechargez la page. Avec les snippets par élément, les nouvelles versions du code peuvent prendre quelques minutes.

Rien ne s'affiche sur mon site

  • Ouvrez la console du navigateur. Un 403 sur /api/w/…/config signifie que le domaine de la page ne fait pas partie des domaines autorisés du site.
  • Le widget a besoin d'au moins un enregistrement dans la fenêtre d'affichage. Ajoutez un enregistrement d'exemple pour tester.
  • Vérifiez que le statut du widget est « active » et qu'il reste des impressions à l'espace de travail ce mois-ci.
  • Ciblage par chemin : une liste d'inclusion qui ne correspond pas au chemin actuel rend le widget muet.

Le compteur en direct n'apparaît jamais

Il est masqué sous le minimum que vous avez fixé (2 par défaut). Ouvrez la page dans deux navigateurs, ou dans une fenêtre privée, et attendez le premier signal de présence. Il faut aussi activer « Enable live counter ».

Les événements du webhook arrivent mais les enregistrements ne sont pas vérifiés

Le secret de signature est absent ou incorrect. La carte de la source affiche « No signing secret set » ou le nombre d'événements cesse d'augmenter. Collez à nouveau le secret et renvoyez un événement de test.

La notification passe derrière mon bandeau de cookies

Augmentez le z-index dans la section Look du widget. La valeur par défaut est 9999.