API

Les chiffres de votre box dans votre propre tableau de bord.

Votre tableur, un outil de BI ou votre tableau de bord lit les chiffres de votre back-office : adhérents, réservations, remplissage, encaissements, essais. L'API ne modifie rien et donne une ligne par box.

Créer une clé

  1. Dans le back-office, ouvrez Paramètres, puis l'onglet API. Seul le gérant de la box le voit.
  2. Donnez à la clé le nom de l'outil qui va l'utiliser, puis choisissez les box qu'elle lit.
  3. Copiez la clé quand elle s'affiche. Elle commence par wl_ et ne s'affiche qu'une fois : Wodloop n'en garde qu'une empreinte.

Vous pouvez révoquer une clé à tout moment depuis le même onglet. La liste indique quand chaque clé a servi pour la dernière fois.

Appeler l'API

Envoyez la clé dans l'en-tête Authorization. L'API répond en JSON, avec une ligne par box et son place_id.

curl -H "Authorization: Bearer wl_…" \
  "https://www.wodloop.com/api/v1/stats/summary?from=2026-10-01&to=2026-10-31"
{"data": [{"place_id": 12, "from": "2026-10-01", "to": "2026-10-31",
           "active_members": 148, "bookings": 1630, "fill_rate": 71,
           "collected_cents": 1281600, "currency": "EUR", …}]}

Appelez l'API depuis un serveur, un tableur ou un outil de BI. Ne mettez pas la clé dans le code d'une page web : chaque visiteur de la page pourrait la lire. Le navigateur bloque aussi les réponses demandées par une page d'un autre site.

import os, requests

r = requests.get(
    "https://www.wodloop.com/api/v1/stats/daily",
    headers={"Authorization": f"Bearer {os.environ['WODLOOP_API_KEY']}"},
    params={"from": "2026-10-01", "to": "2026-10-31"},
)
for day in r.json()["data"]:
    print(day["date"], day["booked"], day["capacity"])

Dans Google Sheets

Google Sheets ne sait pas envoyer d'en-tête. Ajoutez format=csv à l'adresse, et la clé avec api_key.

=IMPORTDATA("https://www.wodloop.com/api/v1/stats/daily?format=csv&api_key=wl_…")

Toute personne qui ouvre la feuille peut lire la clé dans la formule. Partagez la feuille comme vous partageriez la clé, et révoquez la clé si la feuille circule hors de votre équipe.

Ce que vous pouvez demander

/places Les box que la clé lit, avec leur fuseau horaire.
/stats/summary Les adhérents et le revenu mensuel d'aujourd'hui. Sur la période : réservations, participants, remplissage, encaissements, frais Stripe et net.
/stats/revenue Par mois : paiements par carte, par prélèvement et au comptoir, remboursements, frais et net.
/stats/daily Par jour : cours, places, places réservées, liste d'attente et remplissage.
/stats/activities Par activité : réservations, cours, places et remplissage.
/stats/slots Les réservations par jour de la semaine et par heure.
/stats/members Les adhérents d'aujourd'hui, et combien viennent souvent, parfois ou jamais.
/stats/unpaid Ce que les adhérents doivent aujourd'hui, et la part des abonnements payés en retard.
/stats/trials Les cours d'essai, qui est venu, qui s'est abonné, et les drop-in.
/classes Chaque cours du planning : horaire, activité, places, réservations, liste d'attente et coachs.

Paramètres

  • from, to: le premier et le dernier jour, au format 2026-10-01, à l'heure de la box. Les deux jours comptent. Par défaut, les 30 derniers jours, et 366 jours au plus.
  • place_id: une box (12) ou plusieurs (12,14). Par défaut, toutes les box que la clé lit.
  • format=csv: une ligne d'en-têtes, puis une ligne par résultat, pour un tableur.
  • cursor: les cours arrivent par 500. Pour la suite, refaites l'appel avec le next_cursor de la page (l'en-tête x-next-cursor en CSV).

Les montants sont en centimes, avec leur devise. Un taux est un pourcentage entier, vide quand il n'y a rien à diviser.

Deux chiffres sont comptés comme leur écran les compte. collected_cents dans /stats/summary déduit les remboursements ; les mois de /stats/revenue, non. Les fréquences de /stats/members comptent toute personne qui a réservé, avec un abonnement, un carnet ou un cours à l'unité : leur total peut dépasser le nombre d'adhérents.

Limites et erreurs

Une clé peut faire 60 appels par minute. Au-delà, l'API répond 429 avec un en-tête Retry-After, en secondes.

En cas d'erreur, l'API répond en JSON avec un code et un message en anglais, qui nomme le paramètre en cause :

{"error": {"code": "invalid_parameter", "message": "from must be on or before to."}}
401 unauthorized La clé manque, est fausse ou a été révoquée.
403 place_not_allowed La clé ne lit pas l'une des box de place_id.
403 no_facility Toutes les box de la clé ont fermé.
404 not_found Cette adresse n'existe pas, ou la clé ne lit pas cette box.
422 invalid_parameter Un paramètre est faux. Le message dit lequel.
429 rate_limited Plus de 60 appels en une minute.

Référence

Le document OpenAPI décrit chaque adresse et chaque colonne. Postman et les outils du même genre l'importent : /api/v1/openapi.json. Pendant toute la version 1, Wodloop ne fait qu'ajouter des colonnes et des adresses. Ce que votre tableau de bord lit aujourd'hui continuera de marcher.

Une question sur l'API : support@wodloop.com.