The figures of your back-office, read by a spreadsheet, a BI tool or your own dashboard: members, bookings, fill, money, trials. Read only, one row per box.
wl_ and is shown only once. Wodloop keeps only a fingerprint of it.
You can revoke a key at any time from the same tab. The list shows when each key was last used.
Send the key in the Authorization header. The answer is JSON, one row per box, each with its 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", …}]}
Call it from a server, a spreadsheet or a BI tool, never from a web page's code: anyone who opens the page could read the key there. A browser does not let a page on another site read the answers.
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"])
Google Sheets cannot send a header. Add format=csv and put the key in the address with api_key.
=IMPORTDATA("https://www.wodloop.com/api/v1/stats/daily?format=csv&api_key=wl_…")
Anyone who can open the sheet can read the key in the formula. Share the sheet as you would share the key, and revoke the key if the sheet leaves your hands.
/places |
The boxes the key reads, with their time zone. |
|---|---|
/stats/summary |
Members and monthly revenue now. Over the period: bookings, attendees, fill, money in, Stripe fees and net. |
/stats/revenue |
Per month: card, direct debit and desk payments, refunds, fees and net. |
/stats/daily |
Per day: classes, seats, seats booked, waiting list and fill. |
/stats/activities |
Per activity: bookings, classes, seats and fill. |
/stats/slots |
Bookings by day of the week and by hour. |
/stats/members |
Members now, and how many come often, sometimes or never. |
/stats/unpaid |
What members owe today, and the share of memberships paid late. |
/stats/trials |
Trial classes, who came, who signed up, and drop-ins. |
/classes |
Each class on the schedule: time, activity, seats, bookings, waiting list and coaches. |
from, to: the first and last days, as 2026-10-01, in the box's time zone. Both days count. By default the last 30 days, and 366 at most.
place_id: one box (12) or several (12,14). By default every box the key reads.
format=csv: a header row, then one line per row, for a spreadsheet.
cursor: the classes come 500 at a time. Ask again with the next_cursor the page gave (the x-next-cursor header in CSV).
Amounts are in cents, with their currency. A rate is a whole percent, empty when there is nothing to divide by.
Two figures are counted as their screen counts them. collected_cents in /stats/summary takes the refunds off; the months of /stats/revenue do not. The tiers of /stats/members count everyone who booked, with a membership, a pack or a single class, so they can add up to more than the members.
A key can make 60 calls a minute. Beyond that the API answers 429 with a Retry-After header, in seconds.
An error comes back as JSON with a code and a message in English that names the parameter at fault:
{"error": {"code": "invalid_parameter", "message": "from must be on or before to."}}
401 unauthorized |
The key is missing, wrong or revoked. |
|---|---|
403 place_not_allowed |
The key does not read one of the boxes in place_id. |
403 no_facility |
None of the key's boxes is open anymore. |
404 not_found |
No such address, or no such box for this key. |
422 invalid_parameter |
A parameter is wrong. The message says which. |
429 rate_limited |
More than 60 calls in a minute. |
Every endpoint and every column is described in the OpenAPI document, which tools such as Postman can import: /api/v1/openapi.json. Within version 1, Wodloop only adds columns and endpoints: what your dashboard reads today keeps working.
A question about the API: support@wodloop.com.