API
The Trampoline Park Data API
An Investor API key opens every venue, market, compare and report endpoint; the pulse and health endpoints need no key.
Overview
- Base URL
https://api.trampolineparkdata.com- Format
- JSON (UTF-8); CSV for report downloads
- Versions
- In the path (
/v1);/healthand/public/pulseare unversioned - Dates
- Chicago local
YYYY-MM-DD; instants in UTC ISO 8601 - Period
grain(day, the default, ormonth),fromandto(inclusive dates, not before 2026-11-01;todefaults to yesterday). At most 92 days or 24 months.- Money
- Integer USD cents (
6500= $65.00) - Unknown
null, never0- Examples
- Illustrative values, long arrays trimmed
- Estimates
low(P10),mid(P50 for revenue, the mean otherwise),high(P90),ci: 0.8, an A–Dgrade,drivers
Figures follow the methodology.
Authentication
export PARKCHECK_API_KEY="pk_live_…"
curl -H "Authorization: Bearer $PARKCHECK_API_KEY" "https://api.trampolineparkdata.com/v1/venues"- Investor owners and admins create keys under Account → API keys, up to 5 per account. A key looks like
pk_live_<8-character prefix>_<32-character secret>, is shown once and is stored only as a SHA-256 hash; revoking it is immediate. - Keys reach
/v1/*only. A missing, unknown or revoked key is401 invalid_api_key; an account no longer on Investor gets403 plan_required. With anAuthorizationheader, cookies are ignored. - The public endpoints need no key and allow any origin (CORS, without credentials). They carry counts, never a venue’s figures.
Endpoints
| Endpoint | Returns | Access |
|---|---|---|
GET /public/pulse | Live counts across every market | Public, no key |
GET /health | Service status | Public, no key |
GET /v1/venues | Every venue with its figures | Investor API key |
GET /v1/venues/{id} | One venue in full | Investor API key |
GET /v1/venues/{id}/timeline | Contraction timeline of one date | Investor API key |
GET /v1/compare | 2–6 venues side by side | Investor API key |
GET /v1/market | Market and borough totals | Investor API key |
POST /v1/reports | A new CSV report | Investor API key |
GET /v1/reports | Your account’s reports | Investor API key |
GET /v1/reports/{id}/download | The CSV file | Investor API key |
Public endpoints · no key
GET /public/pulse
Live counts across every public market, yesterday’s utilization and one anonymous heat point per venue (heat: null without supply).
curl "https://api.trampolineparkdata.com/public/pulse"{
"venues": 268,
"slotsTracked": 1840,
"pollsPerDay": 5904,
"yesterday": {
"date": "2026-11-01",
"utilization": 0.6412,
"soldUnits": 1312
},
"points": [
{
"lat": 40.7411,
"lng": -73.9897,
"heat": 0.7
},
{
"lat": 40.6782,
"lng": -73.9442,
"heat": null
}
]
}GET /health
200 with the version while the service and database are up; 503 with status: "error" otherwise.
curl "https://api.trampolineparkdata.com/health"{
"status": "ok",
"version": "0.1.0"
}Investor API · Bearer key
GET /v1/venues
Every public venue with its figures for the period and spark, its daily utilization.
Parameters
grain, from, toquery The period (see Overview).
curl -H "Authorization: Bearer $PARKCHECK_API_KEY" "https://api.trampolineparkdata.com/v1/venues?from=2026-10-26&to=2026-11-01"{
"period": {
"grain": "day",
"from": "2026-10-26",
"to": "2026-11-01"
},
"access": {
"plan": "investor",
"resolution": "exact",
"window": null,
"locked": []
},
"venues": [
{
"venue": {
"id": "example-park",
"name": "Example Trampoline Park",
"brand": "Example",
"neighborhood": "Uptown",
"borough": "Dallas",
"lat": 32.7987,
"lng": -96.8018,
"unitLabel": "admission",
"unitsLabel": "admissions",
"platform": "roller-haveablast",
"studied": [
"90-minute jump session"
],
"listPrice": {
"minor": 2999,
"per": "admission",
"source": "pricing-page"
}
},
"figures": {
"venueId": "example-park",
"period": {
"grain": "day",
"from": "2026-11-01",
"to": "2026-11-01",
"label": "2026-11-01"
},
"status": "complete",
"slots": {
"offered": 30,
"completed": 30,
"stale": 0,
"open": 0
},
"supply": {
"units": 600,
"unitHours": 1200
},
"sold": {
"low": 402,
"mid": 418,
"high": 431,
"ci": 0.8,
"grade": "A",
"drivers": [
{
"factor": "stale-final-states",
"share": 1
}
]
},
"utilization": {
"low": 0.67,
"mid": 0.697,
"high": 0.718,
"ci": 0.8,
"grade": "A",
"drivers": [
{
"factor": "stale-final-states",
"share": 1
}
]
},
"coverage": 0.98,
"leftCensoredUnits": 12,
"revenue": {
"low": 2540000,
"mid": 2790000,
"high": 3080000,
"ci": 0.8,
"grade": "B",
"drivers": [
{
"factor": "mix-price",
"share": 0.58
},
{
"factor": "sold-share",
"share": 0.42
}
]
},
"revenueReason": null,
"revPAUH": {
"low": 181000,
"mid": 199000,
"high": 220000,
"ci": 0.8,
"grade": "B",
"drivers": [
{
"factor": "mix-price",
"share": 0.58
},
{
"factor": "sold-share",
"share": 0.42
}
]
},
"guests": null,
"price": {
"minMinor": 5500,
"medianMinor": 6500,
"maxMinor": 9500
},
"modelVersions": {
"utilization": "utilization/v1",
"revenue": "revenue/v3"
},
"model": {
"utilization": "v2",
"revenue": "v3"
}
},
"spark": [
0.66,
0.71,
0.697
]
}
]
}GET /v1/venues/{id}
Profile, figures, a series row per day or month, the start-time heatmap (with sold and capacity) and the next-day forecast.
Parameters
idpath, required Venue id from/v1/venues.grain, from, toquery The period (see Overview).
curl -H "Authorization: Bearer $PARKCHECK_API_KEY" "https://api.trampolineparkdata.com/v1/venues/example-park?from=2026-11-01&to=2026-11-01"{
"period": {
"grain": "day",
"from": "2026-11-01",
"to": "2026-11-01"
},
"access": {
"plan": "investor",
"resolution": "exact",
"window": null,
"locked": []
},
"venue": {
"id": "example-park",
"name": "Example Trampoline Park",
"brand": "Example",
"neighborhood": "Uptown",
"borough": "Dallas",
"lat": 32.7987,
"lng": -96.8018,
"unitLabel": "admission",
"unitsLabel": "admissions",
"platform": "roller-haveablast",
"studied": [
"90-minute jump session"
],
"listPrice": {
"minor": 2999,
"per": "admission",
"source": "pricing-page"
},
"description": "Indoor trampoline park: open jump courts, dodgeball, foam pits and a ninja course, sold by timed session",
"address": {
"line1": "1 Example Street",
"city": "Dallas",
"region": "TX",
"postalCode": "75201"
},
"website": "https://example.com",
"bookingUrl": "https://example.com/book",
"services": [
{
"id": "jump-90",
"name": "90-minute jump session",
"category": "other",
"prices": [
{
"amountMinor": 2999,
"currency": "USD",
"per": "person",
"durationMinutes": 90,
"source": "pricing-page",
"observedAt": "2026-11-01"
}
],
"studied": true,
"source": "pricing-page"
}
],
"scope": {
"unit": "admission",
"window": "timed jump session",
"notes": [
"Timed jump sessions only"
],
"excluded": [
{
"what": "Birthday parties and group events",
"why": "Sold as private packages, not by jump session"
}
]
},
"pools": [
{
"id": "jump",
"label": "Jump session entry",
"kind": "entry-window"
}
],
"streams": [
{
"id": "near",
"cadenceMinutes": 5,
"dayOffsets": [
0,
2
]
}
]
},
"figures": {
"venueId": "example-park",
"period": {
"grain": "day",
"from": "2026-11-01",
"to": "2026-11-01",
"label": "2026-11-01"
},
"status": "complete",
"slots": {
"offered": 30,
"completed": 30,
"stale": 0,
"open": 0
},
"supply": {
"units": 600,
"unitHours": 1200
},
"sold": {
"low": 402,
"mid": 418,
"high": 431,
"ci": 0.8,
"grade": "A",
"drivers": [
{
"factor": "stale-final-states",
"share": 1
}
]
},
"utilization": {
"low": 0.67,
"mid": 0.697,
"high": 0.718,
"ci": 0.8,
"grade": "A",
"drivers": [
{
"factor": "stale-final-states",
"share": 1
}
]
},
"coverage": 0.98,
"leftCensoredUnits": 12,
"revenue": {
"low": 2540000,
"mid": 2790000,
"high": 3080000,
"ci": 0.8,
"grade": "B",
"drivers": [
{
"factor": "mix-price",
"share": 0.58
},
{
"factor": "sold-share",
"share": 0.42
}
]
},
"revenueReason": null,
"revPAUH": {
"low": 181000,
"mid": 199000,
"high": 220000,
"ci": 0.8,
"grade": "B",
"drivers": [
{
"factor": "mix-price",
"share": 0.58
},
{
"factor": "sold-share",
"share": 0.42
}
]
},
"guests": null,
"price": {
"minMinor": 5500,
"medianMinor": 6500,
"maxMinor": 9500
},
"modelVersions": {
"utilization": "utilization/v1",
"revenue": "revenue/v3"
},
"model": {
"utilization": "v2",
"revenue": "v3"
}
},
"series": [
{
"venueId": "example-park",
"period": {
"grain": "day",
"from": "2026-11-01",
"to": "2026-11-01",
"label": "2026-11-01"
},
"status": "complete",
"slots": {
"offered": 30,
"completed": 30,
"stale": 0,
"open": 0
},
"supply": {
"units": 600,
"unitHours": 1200
},
"sold": {
"low": 402,
"mid": 418,
"high": 431,
"ci": 0.8,
"grade": "A",
"drivers": [
{
"factor": "stale-final-states",
"share": 1
}
]
},
"utilization": {
"low": 0.67,
"mid": 0.697,
"high": 0.718,
"ci": 0.8,
"grade": "A",
"drivers": [
{
"factor": "stale-final-states",
"share": 1
}
]
},
"coverage": 0.98,
"leftCensoredUnits": 12,
"revenue": {
"low": 2540000,
"mid": 2790000,
"high": 3080000,
"ci": 0.8,
"grade": "B",
"drivers": [
{
"factor": "mix-price",
"share": 0.58
},
{
"factor": "sold-share",
"share": 0.42
}
]
},
"revenueReason": null,
"revPAUH": {
"low": 181000,
"mid": 199000,
"high": 220000,
"ci": 0.8,
"grade": "B",
"drivers": [
{
"factor": "mix-price",
"share": 0.58
},
{
"factor": "sold-share",
"share": 0.42
}
]
},
"guests": null,
"price": {
"minMinor": 5500,
"medianMinor": 6500,
"maxMinor": 9500
},
"modelVersions": {
"utilization": "utilization/v1",
"revenue": "revenue/v3"
},
"model": {
"utilization": "v2",
"revenue": "v3"
}
}
],
"heatmap": {
"rows": [
"2026-11-01"
],
"cols": [
"18:00",
"18:30"
],
"cells": [
[
0.93,
null
]
],
"offered": [
[
true,
true
]
],
"sold": [
[
28,
null
]
],
"capacity": [
[
30,
null
]
]
},
"forecast": {
"venueId": "example-park",
"date": "2026-11-02",
"asOf": "2026-11-01T22:00:00.000Z",
"status": "provisional",
"method": "additive-pickup-v1",
"bookedSoFar": {
"units": 212,
"share": 0.35
},
"sold": {
"low": 371,
"mid": 405,
"high": 438,
"ci": 0.8,
"grade": "B",
"drivers": []
},
"revenue": {
"low": 2330000,
"mid": 2640000,
"high": 2990000,
"ci": 0.8,
"grade": "B",
"drivers": []
},
"utilization": {
"low": 0.62,
"mid": 0.675,
"high": 0.73,
"ci": 0.8,
"grade": "B",
"drivers": []
},
"reason": null
}
}GET /v1/venues/{id}/timeline
How each slot of one service date sold down, poll by poll, and the booking pace curve. leftCensored counts units already gone at the first observation.
Parameters
idpath, required Venue id.datequery Service dateYYYY-MM-DD; defaults to yesterday on Pro, today on Investor (Chicago). On Pro, today or later is403 plan_required(intraday).
curl -H "Authorization: Bearer $PARKCHECK_API_KEY" "https://api.trampolineparkdata.com/v1/venues/example-park/timeline?date=2026-11-01"{
"date": "2026-11-01",
"slots": [
{
"time": "18:00",
"poolId": "jump",
"capacity": 30,
"leftCensored": 6,
"points": [
{
"at": "2026-10-30T22:00:00.000Z",
"unavailable": 6
},
{
"at": "2026-11-01T22:55:00.000Z",
"unavailable": 28
}
],
"finalStatus": "completed"
}
],
"curve": [
{
"leadHours": 48,
"share": 0.21
},
{
"leadHours": 0,
"share": 0.83
}
],
"access": {
"plan": "investor",
"resolution": "exact",
"window": null,
"locked": []
}
}GET /v1/compare
Figures and series of 2–6 venues on one period and scale. An unknown id is 404 venue_not_found.
Parameters
idsquery, required Comma-separated venue ids, 2 to 6.grain, from, toquery The period (see Overview).
curl -H "Authorization: Bearer $PARKCHECK_API_KEY" "https://api.trampolineparkdata.com/v1/compare?ids=example-park,another-venue&from=2026-11-01&to=2026-11-01"{
"period": {
"grain": "day",
"from": "2026-11-01",
"to": "2026-11-01"
},
"access": {
"plan": "investor",
"resolution": "exact",
"window": null,
"locked": []
},
"venues": [
{
"venue": {
"id": "example-park",
"name": "Example Trampoline Park",
"brand": "Example",
"neighborhood": "Uptown",
"borough": "Dallas",
"lat": 32.7987,
"lng": -96.8018,
"unitLabel": "admission",
"unitsLabel": "admissions",
"platform": "roller-haveablast",
"studied": [
"90-minute jump session"
],
"listPrice": {
"minor": 2999,
"per": "admission",
"source": "pricing-page"
}
},
"figures": {
"venueId": "example-park",
"period": {
"grain": "day",
"from": "2026-11-01",
"to": "2026-11-01",
"label": "2026-11-01"
},
"status": "complete",
"slots": {
"offered": 30,
"completed": 30,
"stale": 0,
"open": 0
},
"supply": {
"units": 600,
"unitHours": 1200
},
"sold": {
"low": 402,
"mid": 418,
"high": 431,
"ci": 0.8,
"grade": "A",
"drivers": [
{
"factor": "stale-final-states",
"share": 1
}
]
},
"utilization": {
"low": 0.67,
"mid": 0.697,
"high": 0.718,
"ci": 0.8,
"grade": "A",
"drivers": [
{
"factor": "stale-final-states",
"share": 1
}
]
},
"coverage": 0.98,
"leftCensoredUnits": 12,
"revenue": {
"low": 2540000,
"mid": 2790000,
"high": 3080000,
"ci": 0.8,
"grade": "B",
"drivers": [
{
"factor": "mix-price",
"share": 0.58
},
{
"factor": "sold-share",
"share": 0.42
}
]
},
"revenueReason": null,
"revPAUH": {
"low": 181000,
"mid": 199000,
"high": 220000,
"ci": 0.8,
"grade": "B",
"drivers": [
{
"factor": "mix-price",
"share": 0.58
},
{
"factor": "sold-share",
"share": 0.42
}
]
},
"guests": null,
"price": {
"minMinor": 5500,
"medianMinor": 6500,
"maxMinor": 9500
},
"modelVersions": {
"utilization": "utilization/v1",
"revenue": "revenue/v3"
},
"model": {
"utilization": "v2",
"revenue": "v3"
}
},
"series": [
{
"venueId": "example-park",
"period": {
"grain": "day",
"from": "2026-11-01",
"to": "2026-11-01",
"label": "2026-11-01"
},
"status": "complete",
"slots": {
"offered": 30,
"completed": 30,
"stale": 0,
"open": 0
},
"supply": {
"units": 600,
"unitHours": 1200
},
"sold": {
"low": 402,
"mid": 418,
"high": 431,
"ci": 0.8,
"grade": "A",
"drivers": [
{
"factor": "stale-final-states",
"share": 1
}
]
},
"utilization": {
"low": 0.67,
"mid": 0.697,
"high": 0.718,
"ci": 0.8,
"grade": "A",
"drivers": [
{
"factor": "stale-final-states",
"share": 1
}
]
},
"coverage": 0.98,
"leftCensoredUnits": 12,
"revenue": {
"low": 2540000,
"mid": 2790000,
"high": 3080000,
"ci": 0.8,
"grade": "B",
"drivers": [
{
"factor": "mix-price",
"share": 0.58
},
{
"factor": "sold-share",
"share": 0.42
}
]
},
"revenueReason": null,
"revPAUH": {
"low": 181000,
"mid": 199000,
"high": 220000,
"ci": 0.8,
"grade": "B",
"drivers": [
{
"factor": "mix-price",
"share": 0.58
},
{
"factor": "sold-share",
"share": 0.42
}
]
},
"guests": null,
"price": {
"minMinor": 5500,
"medianMinor": 6500,
"maxMinor": 9500
},
"modelVersions": {
"utilization": "utilization/v1",
"revenue": "revenue/v3"
},
"model": {
"utilization": "v2",
"revenue": "v3"
}
}
]
}
]
}GET /v1/market
Market and borough revenue (the sum of venue estimates), unit-hour-weighted utilization and coverage. An estimate with nothing behind it is null, never zero.
Parameters
grain, from, toquery The period (see Overview).
curl -H "Authorization: Bearer $PARKCHECK_API_KEY" "https://api.trampolineparkdata.com/v1/market?from=2026-10-26&to=2026-11-01"{
"period": {
"grain": "day",
"from": "2026-10-26",
"to": "2026-11-01"
},
"access": {
"plan": "investor",
"resolution": "exact",
"window": null,
"locked": []
},
"figures": {
"revenue": {
"low": 41200000,
"mid": 48900000,
"high": 58100000,
"ci": 0.8,
"grade": "B",
"drivers": []
},
"utilization": {
"low": 0.61,
"mid": 0.64,
"high": 0.67,
"ci": 0.8,
"grade": "A",
"drivers": []
},
"coverage": {
"venues": 13,
"observed": 19
}
},
"byBorough": [
{
"borough": "Manhattan",
"revenue": {
"low": 25800000,
"mid": 31400000,
"high": 38000000,
"ci": 0.8,
"grade": "B",
"drivers": []
},
"utilization": {
"low": 0.63,
"mid": 0.66,
"high": 0.69,
"ci": 0.8,
"grade": "A",
"drivers": []
},
"coverage": {
"venues": 11,
"observed": 11
}
}
]
}POST /v1/reports
Builds a CSV: venue, compare (2–12 venues) or market, by default the 30 days to yesterday. Up to 20 a day per user; the same request on the same day returns the existing report (200, reused: true), for 15 minutes only if it reaches today. Kept 7 days.
Parameters
kindbody, requiredvenue,compareormarket.venueIdsbody One forvenue, 2–12 forcompare, none formarket.grain, from, tobody The period, never clamped: adayrange over 92 days is400 period_too_long.
curl -X POST -H "Authorization: Bearer $PARKCHECK_API_KEY" -H "Content-Type: application/json" \
-d '{"kind":"market","grain":"day","from":"2026-10-24","to":"2026-11-01"}' \
"https://api.trampolineparkdata.com/v1/reports"{
"report": {
"id": "rpt_8d1f0c",
"kind": "market",
"label": "Market",
"grain": "day",
"from": "2026-10-24",
"to": "2026-11-01",
"venueIds": [],
"status": "ready",
"bytes": 18342,
"createdAt": "2026-11-02T14:03:11.000Z",
"expiresAt": "2026-11-09T14:03:11.000Z"
}
}GET /v1/reports
Your accounts’ reports, newest first (up to 100), and today’s quota.
curl -H "Authorization: Bearer $PARKCHECK_API_KEY" "https://api.trampolineparkdata.com/v1/reports"{
"reports": [
{
"id": "rpt_8d1f0c",
"kind": "market",
"label": "Market",
"grain": "day",
"from": "2026-10-24",
"to": "2026-11-01",
"venueIds": [],
"status": "ready",
"bytes": 18342,
"createdAt": "2026-11-02T14:03:11.000Z",
"expiresAt": "2026-11-09T14:03:11.000Z"
}
],
"quota": {
"used": 1,
"limit": 20
}
}GET /v1/reports/{id}/download
The report as text/csv (UTF-8 with BOM, CRLF), named parkcheck-<kind>-<from>-<to>.csv. Money in USD with cents; unknown values empty, never 0. Expired: 410 report_expired.
Parameters
idpath, required Report id from/v1/reports.
curl -H "Authorization: Bearer $PARKCHECK_API_KEY" -OJ "https://api.trampolineparkdata.com/v1/reports/rpt_8d1f0c/download"venue_id,name,period_from,period_to,status,supply_units,sold_low,sold_mid,sold_high,utilization_low,utilization_mid,utilization_high,revenue_low,revenue_mid,revenue_high,revpauh_mid,price_min,price_median,price_max,coverage,gradeRate limits
| Caller | Counted | Per day | Per minute |
|---|---|---|---|
| Anonymous, public routes | per IP (an IPv6 /48 counts as one) | 1,000 | 60 |
| Free, signed in | per user | 300 | — |
| Pro, signed in | per user | 3,000 | — |
| Investor, signed in | per user | 10,000 | — |
| Investor API key | per account a day, per key a minute | 10,000 | 60 |
| Investor CSV reports | new reports per user | 20 | — |
Days are Chicago days. /v1 responses carry RateLimit-Limit, RateLimit-Remaining and RateLimit-Reset (seconds) for the daily quota. Over a limit: 429 with Retry-After (seconds).
Plans and access
Every /v1 data response carries access: the plan, the resolution (exact or band), the readable date window (null = all) and the locked features. A route outside the plan is 403 plan_required, with feature and requiredPlan.
| Route | Free | Pro | Investor |
|---|---|---|---|
GET /v1/venues, /v1/venues/{id}, /v1/market | Full shapes, one day (2026-11-01) | Full shapes, every day since 2026-11-01 | Same as Pro |
GET /v1/venues/{id}/timeline | plan_required | ✓ | ✓ |
GET /v1/compare | plan_required | ✓ (2–6 venues) | ✓ (2–6 venues) |
POST /v1/reports, GET /v1/reports, download | plan_required | plan_required | ✓ (20 a day, up to 12 venues) |
API keys on /v1/* | — | — | ✓ (5 keys) |
Free (signed in, no key): The same shapes as Pro, for one day only: whatever period is asked, the response covers 2026-11-01 (access.window), with history, forecast and intraday locked, so there is no forecast, no run rate and no other day.
{
"access": {
"plan": "free",
"resolution": "exact",
"window": {
"from": "2026-11-01",
"to": "2026-11-01"
},
"locked": [
"history",
"forecast",
"intraday"
]
}
}Errors
One envelope, with a matching HTTP status. Branch on error.code; message is for people.
{
"error": {
"code": "plan_required",
"message": "Compare needs the Pro plan",
"feature": "compare",
"requiredPlan": "pro"
}
}| Status | Codes |
|---|---|
| 400 | invalid_request, invalid_json, invalid_period, period_too_long, too_many_venues |
| 401 | invalid_api_key, unauthenticated |
| 403 | plan_required (with feature and requiredPlan), forbidden, no_account |
| 404 | not_found, venue_not_found, report_not_found, market_not_found |
| 410 | report_expired |
| 415 | unsupported_media_type: a POST or DELETE without Content-Type: application/json |
| 429 | quota_exceeded, rate_limited, report_quota_exceeded |
| 503 | busy (retry shortly) |
Licence
The example day on the home page and in its Markdown twin is CC BY 4.0: reuse it, commercially too, crediting “Trampoline Park Data (trampolineparkdata.com)”. The public endpoints carry no venue figures.
App, /v1 and CSV data are for the subscribing account’s internal use; redistribution needs a separate agreement (talk to us).
Get an API key
Investor, an annual agreement (contact us). Write to [email protected] with your company and the data you need.
OpenAPI 3.1 description · llms.txt · Pricing · Methodology · Talk to us about Investor