Skip to main content

Public API · v1

Build with live theme park data

A free API for live queue times, opening hours and crowd predictions across 80+ parks worldwide. Get a key in seconds - the only cost is an attribution link back to us.

Live wait times Opening hours & schedules Crowd predictions 80+ parks, 3200+ rides

Quick start

  1. 1

    Create a free account

    No card, no trial - register with an email address or sign in with Google or Apple.

  2. 2

    Create an API key

    Head to API Keys in your dashboard and create your key. You can view and copy it from the dashboard any time.

  3. 3

    Call the API

    Send your key in the x-api-key header and you are live:

Your first request
bash
curl -H "x-api-key: pqt_live_..." https://api.parkqueuetimes.com/v1/parks

Authentication

Every /v1 request needs an API key. Keys are free - create one at /dashboard/api-keys with any account - one key per account. You can view and copy your key from your dashboard any time, and revoke it and create a new one whenever you need.

Send your key in the x-api-key header (preferred), or as an ?api_key= query parameter for quick tinkering. Prefer the header in production - query strings tend to end up in logs and browser history.

Header (preferred)
bash
curl -H "x-api-key: pqt_live_..." \
  https://api.parkqueuetimes.com/v1/parks/3/live
Query parameter
bash
curl "https://api.parkqueuetimes.com/v1/parks/3/live?api_key=pqt_live_..."

Rate limits

TierRequests / minuteRequests / dayKeys
Free6010,0001 per account
Higher tiersComing soon - tell us what you need

Limits are soft: briefly exceeding your per-minute allowance will not cut you off. Only sustained traffic far above the limit receives 429 Too Many Requests with a Retry-After header. Every keyed response tells you where you stand:

  • X-RateLimit-Limit - your per-minute allowance
  • X-RateLimit-Remaining - requests left in the current minute
  • X-RateLimit-Reset - Unix timestamp (seconds) when the current minute window ends

Keyed responses are never cached (Cache-Control: no-store), so you always get the freshest data straight from the source.

Endpoints

Base URL: https://api.parkqueuetimes.com. All endpoints are GET and return JSON in a stable envelope: { "success": true, "data": <payload>, "meta": { "generated", "attribution" } }.

:id is the numeric park id returned by /v1/parks.

GET/v1/parks

Every park we track, with location and timezone. Use the id from here in the other endpoints.

GET /v1/parks
json
{
  "success": true,
  "data": [
    {
      "id": 3,
      "name": "Alton Towers",
      "slug": "alton-towers",
      "country": "United Kingdom",
      "latitude": 52.993137,
      "longitude": -1.894724,
      "timezone": "Europe/London"
    }
  ],
  "meta": {
    "generated": "2026-06-11T14:32:08.000Z",
    "attribution": "Powered by ParkQueueTimes.com - https://parkqueuetimes.com"
  }
}
GET/v1/parks/:id

A single park's details plus today's opening hours (null on days the park is closed).

GET /v1/parks/:id
json
{
  "success": true,
  "data": {
    "id": 3,
    "name": "Alton Towers",
    "slug": "alton-towers",
    "country": "United Kingdom",
    "latitude": 52.993137,
    "longitude": -1.894724,
    "timezone": "Europe/London",
    "hours": {
      "date": "2026-06-11",
      "openingTime": "2026-06-11T10:00:00+01:00",
      "closingTime": "2026-06-11T17:00:00+01:00"
    }
  },
  "meta": {
    "generated": "2026-06-11T14:32:08.000Z",
    "attribution": "Powered by ParkQueueTimes.com - https://parkqueuetimes.com"
  }
}
GET/v1/parks/:id/live

Live wait times for every ride in the park. status is one of OPERATING, DOWN, CLOSED or REFURBISHMENT; waitMinutes and lastUpdated are null when a ride is not reporting a queue.

GET /v1/parks/:id/live
json
{
  "success": true,
  "data": {
    "parkId": 3,
    "rides": [
      {
        "id": 65,
        "name": "The Smiler",
        "status": "OPERATING",
        "waitMinutes": 45,
        "lastUpdated": "2026-06-11T14:31:42.000Z"
      },
      {
        "id": 66,
        "name": "Nemesis Reborn",
        "status": "OPERATING",
        "waitMinutes": 30,
        "lastUpdated": "2026-06-11T14:31:42.000Z"
      },
      {
        "id": 67,
        "name": "Wicker Man",
        "status": "DOWN",
        "waitMinutes": null,
        "lastUpdated": "2026-06-11T14:18:09.000Z"
      }
    ]
  },
  "meta": {
    "generated": "2026-06-11T14:32:08.000Z",
    "attribution": "Powered by ParkQueueTimes.com - https://parkqueuetimes.com"
  }
}
GET/v1/parks/:id/schedule

The park's upcoming operating calendar - one entry per scheduled day.

GET /v1/parks/:id/schedule
json
{
  "success": true,
  "data": {
    "schedule": [
      {
        "date": "2026-06-11",
        "openingTime": "2026-06-11T10:00:00+01:00",
        "closingTime": "2026-06-11T17:00:00+01:00",
        "type": "OPERATING"
      },
      {
        "date": "2026-06-12",
        "openingTime": "2026-06-12T10:00:00+01:00",
        "closingTime": "2026-06-12T18:00:00+01:00",
        "type": "OPERATING"
      }
    ]
  },
  "meta": {
    "generated": "2026-06-11T14:32:08.000Z",
    "attribution": "Powered by ParkQueueTimes.com - https://parkqueuetimes.com"
  }
}
GET/v1/parks/:id/calendar

Predicted crowd levels per day from our Almanac forecasting model. crowdPercent is 0-100 (higher = busier), or null where no forecast exists.

GET /v1/parks/:id/calendar
json
{
  "success": true,
  "data": {
    "days": [
      { "date": "2026-06-12", "crowdPercent": 34 },
      { "date": "2026-06-13", "crowdPercent": 72 },
      { "date": "2026-06-14", "crowdPercent": null }
    ]
  },
  "meta": {
    "generated": "2026-06-11T14:32:08.000Z",
    "attribution": "Powered by ParkQueueTimes.com - https://parkqueuetimes.com"
  }
}

Errors

StatusMeaning
401Missing or invalid API key. Check the x-api-key header - and if you need a key, they are free at parkqueuetimes.com/developers.
404Unknown park id. List valid ids with /v1/parks.
429Rate limit exceeded by a sustained margin. Back off for the number of seconds in the Retry-After header.
503Park data is still loading or temporarily unavailable. Retry after a short delay.

Every error uses the same envelope, so one handler covers them all:

401 Unauthorized
json
{
  "success": false,
  "error": "Invalid or revoked API key. Get a free key at https://parkqueuetimes.com/developers"
}

Attribution required

The only cost is a credit

Free use requires displaying "Powered by ParkQueueTimes.com" linking to https://parkqueuetimes.com somewhere prominent in your app or service.

To make this easy, every successful response includes a ready-made credit string in meta.attribution - display it near the data and you are done. Apps and sites using our data without attribution may have their keys revoked.

Frequently asked questions

Is the API free?

Yes. Free keys include 60 requests per minute and 10,000 per day - plenty for most apps, bots, and dashboards. The only requirement is the attribution link.

How fresh is the data?

Live wait times update as soon as each park publishes a change to its official feed - there is no fixed refresh cycle. Keyed /v1 responses are never cached, so you always see the latest reading we hold.

Can I use it commercially?

Yes - commercial use is welcome on the free tier, as long as the "Powered by ParkQueueTimes.com" attribution is displayed prominently in your app or service.

Is historical data available?

Not through the API yet. Historical wait times and analytics endpoints are planned as a paid tier - get in touch if you would like early access.

How many parks are covered?

Around 80 parks and 3200+ rides across the UK, Europe, and North America, with more added regularly. Browse the full list.

Where do I report issues or request features?

Email [email protected] - we read everything, and developer feedback shapes what we build next.

Ready to build?

Your first key takes less than a minute.

v2.0.0