---
title: "Parky API - Parky!"
description: "A free JSON API for live Disney and Universal wait times, hours, crowd forecasts, Lightning Lane and ride reliability, with live updates over WebSocket."
canonical: "https://parkypass.com/developers"
last-updated: "2026-10-05"
---

# Parky API

> Live wait times, hours, crowd forecasts, Lightning Lane and ride reliability for Walt Disney World, Disneyland Resort, Universal Orlando and Universal Studios Hollywood, as JSON. Free, including on commercial sites, as long as every page that shows the data links to parkypass.com. Waits arrive within seconds, straight from Disney's and Universal's own feeds; most free wait-time feeds are several minutes behind.

Docs: https://parkypass.com/developers · OpenAPI: https://api.parkypass.com/v1/openapi.json · Free key: https://parkypass.com/developers/keys

**Required:** every page that shows Parky data keeps a visible link to
parkypass.com. Render attribution.text linked to attribution.url from the latest response or stream message (a snapshot or changes message carries that park's page), and use https://parkypass.com/ until the first one arrives. The text is "Live data from parkypass.com". Every example below does this.

## Quickstart

1. Call one URL. No key needed; responses are JSON and CORS is open.

```sh
curl https://api.parkypass.com/v1/parks/magic-kingdom/waits
```

2. Put waits on a page. Save this as `waits.html` and open it; it works as it is.

```html
<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>Magic Kingdom waits</title>
  <style>
    body { font: 16px/1.5 system-ui, sans-serif; max-width: 32rem; margin: 2rem auto; padding: 0 1rem; }
    li { display: flex; justify-content: space-between; padding: 0.4rem 0; border-bottom: 1px solid #ddd; }
  </style>
</head>
<body>
  <h1>Magic Kingdom waits</h1>
  <ul id="waits"></ul>
  <!-- Required: keep the "Live data from parkypass.com" link visible on every page that shows this data. -->
  <p><a id="credit" href="https://parkypass.com/">Live data from parkypass.com</a></p>

  <script type="module">
    const res = await fetch("https://api.parkypass.com/v1/parks/magic-kingdom/waits");
    const data = await res.json();

    const credit = document.getElementById("credit");
    credit.href = data.attribution.url;
    credit.textContent = data.attribution.text;

    document.getElementById("waits").replaceChildren(...data.rides.map((ride) => {
      const item = document.createElement("li");
      const wait = ride.wait_minutes !== null ? ride.wait_minutes + " min" : ride.status;
      item.append(ride.name, Object.assign(document.createElement("b"), { textContent: wait }));
      return item;
    }));
  </script>
</body>
</html>
```

3. Make it live. The same page over the WebSocket: Parky sends the board once, then only what changes.

```html
<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>Magic Kingdom waits</title>
  <style>
    body { font: 16px/1.5 system-ui, sans-serif; max-width: 32rem; margin: 2rem auto; padding: 0 1rem; }
    li { display: flex; justify-content: space-between; padding: 0.4rem 0; border-bottom: 1px solid #ddd; }
  </style>
</head>
<body>
  <h1>Magic Kingdom waits</h1>
  <ul id="waits"></ul>
  <!-- Required: keep the "Live data from parkypass.com" link visible on every page that shows this data. -->
  <p><a id="credit" href="https://parkypass.com/">Live data from parkypass.com</a></p>

  <script type="module">
    const rides = new Map();
    const socket = new WebSocket("wss://api.parkypass.com/v1/stream");

    socket.onmessage = (event) => {
      const message = JSON.parse(event.data);
      // Subscribe only once the server says it is ready.
      if (message.type === "ready") socket.send(JSON.stringify({ type: "subscribe", parks: ["magic-kingdom"] }));
      if (message.type !== "snapshot" && message.type !== "changes") return;

      const credit = document.getElementById("credit");
      credit.href = message.attribution.url;
      credit.textContent = message.attribution.text;

      if (message.type === "snapshot") rides.clear();
      for (const ride of message.rides) rides.set(ride.ride_id, ride);
      document.getElementById("waits").replaceChildren(...[...rides.values()].map((ride) => {
        const item = document.createElement("li");
        const wait = ride.wait_minutes !== null ? ride.wait_minutes + " min" : ride.status;
        item.append(ride.name, Object.assign(document.createElement("b"), { textContent: wait }));
        return item;
      }));
    };
  </script>
</body>
</html>
```

4. Optional: get a free key at https://parkypass.com/developers/keys and send it with each request.

```sh
curl -H "Authorization: Bearer pk_live_…" https://api.parkypass.com/v1/parks/magic-kingdom/waits
```

More languages:

Node + TypeScript:

```ts
// Save as waits.mts, run with "npx tsx waits.mts" (Node 18+). PARKY_KEY is optional.
interface LightningLane {
  type: "multi_pass" | "single_pass";
  state: string | null;
  return_start: string | null;
  return_end: string | null;
  price: { amount: number; currency: string | null } | null;
}

interface Ride {
  ride_id: string;
  name: string;
  type: "ride" | "experience" | "show";
  status: "OPERATING" | "DOWN" | "CLOSED" | "REFURBISHMENT" | "UNKNOWN" | "unavailable";
  is_open: boolean | null;
  wait_minutes: number | null;
  single_rider_available: boolean | null;
  single_rider_wait_minutes: number | null;
  lightning_lane: LightningLane | null;
  changed_at: string | null;
}

interface WaitsResponse {
  park_key: string;
  park_name: string;
  data_status: "live" | "unavailable";
  park_open: boolean | null;
  rides: Ride[];
  attribution: { text: string; url: string; required: true };
  generated_at: string;
}

const key = process.env.PARKY_KEY;
const res = await fetch("https://api.parkypass.com/v1/parks/magic-kingdom/waits", {
  headers: key ? { "X-Parky-Key": key } : {},
});
if (!res.ok) throw new Error("Parky API " + res.status);
const data = (await res.json()) as WaitsResponse;

const escape = (text: string) => text.replace(/[&<>"]/g, (c) => "&#" + c.charCodeAt(0) + ";");
const items = data.rides.map((ride) => {
  const wait = ride.wait_minutes !== null ? ride.wait_minutes + " min" : ride.status;
  return "<li>" + escape(ride.name) + ": " + wait + "</li>";
});

// Required: keep the "Live data from parkypass.com" link visible on every page that shows this data.
const html = "<ul>" + items.join("") + "</ul>\n" +
  '<a href="' + data.attribution.url + '">' + escape(data.attribution.text) + "</a>";
console.log(html);
```

Python:

```python
import html
import os

import requests

key = os.environ.get("PARKY_KEY")  # optional: higher limits
res = requests.get(
    "https://api.parkypass.com/v1/parks/magic-kingdom/waits",
    headers={"X-Parky-Key": key} if key else {},
    timeout=10,
)
res.raise_for_status()
data = res.json()

items = []
for ride in data["rides"]:
    wait = f"{ride['wait_minutes']} min" if ride["wait_minutes"] is not None else ride["status"]
    items.append(f"<li>{html.escape(ride['name'])}: {wait}</li>")

# Required: keep the "Live data from parkypass.com" link visible on every page that shows this data.
attribution = data["attribution"]
credit = f'<a href="{attribution["url"]}">{html.escape(attribution["text"])}</a>'
print("<ul>" + "".join(items) + "</ul>\n" + credit)
```

## Parks and ride IDs

`{park}` is a park key (magic-kingdom), the canonical park id, the park's name, or a shorthand (mk, epcot, hs, ak, dl, dca, usf, ioa, epic, ush), in any case.

| Park | Key | Short | Time zone |
| --- | --- | --- | --- |
| Magic Kingdom Park | `magic-kingdom` | `mk` | America/New_York |
| EPCOT | `epcot` | `epcot` | America/New_York |
| Disney's Hollywood Studios | `hollywood-studios` | `hs` | America/New_York |
| Disney's Animal Kingdom | `animal-kingdom` | `ak` | America/New_York |
| Disneyland Park | `disneyland-park` | `dl` | America/Los_Angeles |
| Disney California Adventure | `disney-california-adventure` | `dca` | America/Los_Angeles |
| Universal Studios Florida | `universal-studios-florida` | `usf` | America/New_York |
| Universal Islands of Adventure | `islands-of-adventure` | `ioa` | America/New_York |
| Universal Epic Universe | `epic-universe` | `epic` | America/New_York |
| Universal Studios Hollywood | `universal-studios-hollywood` | `ush` | America/Los_Angeles |

`{ride}` is a ride id from /v1/parks/{park}/rides (magic-kingdom_seven-dwarfs-mine-train), or the ride's name or slug when it is unique. Ride IDs are the park key, an underscore and the
ride's slug. Each `/waits` entry has a `type`:

- `ride`: An attraction with a queue. Every one is listed, always; it reads "unavailable" when the park's feed lacks it.
- `experience`: A walk-through, meet or other experience, listed only while Disney or Universal posts a wait for it.
- `show`: A show, listed only while the park posts a wait for it.

## Statuses and freshness

Status is the park's own status in uppercase (OPERATING, DOWN, CLOSED, REFURBISHMENT, UNKNOWN), except lowercase "unavailable", which Parky adds when it has no live feed for that ride.

- `OPERATING`: Running. wait_minutes is the posted standby wait.
- `DOWN`: Temporarily stopped during the day. It usually returns.
- `CLOSED`: Closed for the day, or the park is closed.
- `REFURBISHMENT`: Closed for a planned refurbishment.
- `UNKNOWN`: The park reported the ride without a usable status.
- `unavailable`: Lowercase on purpose: Parky added it because it has no live feed for this ride right now.

The park's `data_status`:

- `live`: The park's direct feed answered within the last 90 seconds. The numbers are current.
- `unavailable`: The feed is not current. Rides carry no waits rather than old ones; try again shortly.

`changed_at` is when a ride's value last changed, not how fresh it is.
The server checks every 5 seconds and pushes a ride only when Disney or Universal changes it; posted waits usually change every few minutes, so quiet minutes are normal. Timestamps are UTC ISO 8601 strings, as JavaScript's toISOString() writes them (2026-10-05T16:42:10.311Z). Parse them before comparing or doing arithmetic.

## Keys and limits

| Access | Per minute | Per day | Streams |
| --- | --- | --- | --- |
| No key | 30 | 1,000 | 2 |
| Free key | 120 | 20,000 | 10 |
| Partner key | 600 | 200,000 | 100 |

Send your key in either header (streams also accept `?key=`):

```http
Authorization: Bearer pk_live_…
X-Parky-Key: pk_live_…
```

Every response carries `X-RateLimit-Limit`, `X-RateLimit-Remaining` and
`X-RateLimit-Reset` (seconds until the window resets); a 429 adds
`Retry-After`. Days are UTC. A malformed, unknown or revoked key gets a 401,
never the keyless limits. For a partner key, email <chase@parkypass.com>.

## Credit Parky

The API is free, including on commercial sites, on one condition: every page
that shows Parky data carries a visible link to parkypass.com, on the
page itself and not only inside an iframe.
Render attribution.text linked to attribution.url from the latest response or stream message (a snapshot or changes message carries that park's page), and use https://parkypass.com/ until the first one arrives. Without JavaScript, this is enough:

```html
<a href="https://parkypass.com/">Live data from parkypass.com</a>
```

Don't resell the raw data or present it as your own feed, and cache each
response for at least its Cache-Control time. Parky can revoke keys that break
these terms. The full terms are in the [Terms of Use](https://parkypass.com/terms#parky-api).

## Live updates

Open one WebSocket to `wss://api.parkypass.com/v1/stream`, wait for `ready`, then subscribe;
Parky pushes changes, so your page never polls. The server checks every 5 seconds and pushes a ride only when Disney or Universal changes it; posted waits usually change every few minutes, so quiet minutes are normal.

```html
<ul id="parky-waits"></ul>
<!-- Required: keep the "Live data from parkypass.com" link visible on every page that shows this data. -->
<a id="parky-credit" href="https://parkypass.com/">Live data from parkypass.com</a>

<script>
  // Add ?key=pk_live_... to the URL for higher limits (optional).
  const rides = new Map();
  const list = document.getElementById("parky-waits");
  const credit = document.getElementById("parky-credit");
  const socket = new WebSocket("wss://api.parkypass.com/v1/stream");

  function render(message) {
    // Required: keep the "Live data from parkypass.com" link visible on every page that shows this data.
    credit.href = message.attribution.url;
    credit.textContent = message.attribution.text;
    if (message.type === "snapshot") rides.clear();
    for (const ride of message.rides) rides.set(ride.ride_id, ride);
    list.replaceChildren(...Array.from(rides.values(), (ride) => {
      const item = document.createElement("li");
      item.textContent = ride.name + ": " + (ride.wait_minutes !== null ? ride.wait_minutes + " min" : ride.status);
      return item;
    }));
  }

  socket.onmessage = (event) => {
    const message = JSON.parse(event.data);
    // Subscribe only once the server says it is ready.
    if (message.type === "ready") socket.send(JSON.stringify({ type: "subscribe", parks: ["magic-kingdom"] }));
    if (message.type === "snapshot" || message.type === "changes") render(message);
  };
</script>
```

You send:

- `subscribe`: Up to 10 parks, written any way {park} accepts, or "*" for every park. `{"type":"subscribe","parks":["magic-kingdom","epcot"]}`
- `unsubscribe`: Stop following some parks. `{"type":"unsubscribe","parks":["epcot"]}`
- `ping`: Optional; the server answers with pong. `{"type":"ping"}`

Parky sends, each with `attribution` and `generated_at`:

- `ready`: WebSocket only, on connect: authorized, send subscribe next. `{"type":"ready","max_parks":10,"idle_timeout_seconds":120,…}`
- `subscribed`: Your current parks, after each subscribe; unsubscribed after each unsubscribe. `{"type":"subscribed","parks":["magic-kingdom","epcot"],…}`
- `snapshot`: Once per park on subscribe: the whole board, in the same shape as /waits, plus park and park_key. `{"type":"snapshot","park":"magic-kingdom","park_key":"magic-kingdom","data_status":"live","park_open":true,"rides":[…],"attribution":{…},…}`
- `changes`: Only the entries whose status, wait, Single Rider or Lightning Lane changed, each in full. The server checks every 5 seconds and pushes a ride only when Disney or Universal changes it; posted waits usually change every few minutes, so quiet minutes are normal. `{"type":"changes","park":"magic-kingdom","park_key":"magic-kingdom","data_status":"live","rides":[…],"attribution":{…},…}`
- `park`: When a park opens or closes. `{"type":"park","park":"magic-kingdom","park_key":"magic-kingdom","park_open":false,"data_status":"live",…}`
- `ping`: Every 25 seconds. Server-Sent Events send a ": ping" comment line instead. `{"type":"ping",…}`
- `error`: A rejected subscription or connection, with the same codes as REST errors. The socket stays open unless a close follows. `{"type":"error","error":{"code":"not_found","message":"…","docs_url":"…"},…}`

Close codes:

- `1000`: idle: no subscriptions for 2 minutes.
- `1001`: The server is restarting. Reconnect.
- `1008`: invalid_key or rights_unavailable. Don't retry unchanged.
- `1011`: Internal error. Reconnect with backoff.
- `1013`: rate_limited, too_many_streams or upstream_unavailable. Retry later.

Server-Sent Events follow one park from `/v1/parks/{park}/waits/stream`: the same
messages from `subscribed` on, as unnamed `data:` lines, so `onmessage` gets
them all, with `retry: 5000` and a `: ping` comment every 25 seconds. There is no `ready`.

```html
<ul id="parky-waits"></ul>
<!-- Required: keep the "Live data from parkypass.com" link visible on every page that shows this data. -->
<a id="parky-credit" href="https://parkypass.com/">Live data from parkypass.com</a>

<script>
  // Add ?key=pk_live_... to the URL for higher limits (optional).
  const rides = new Map();
  const list = document.getElementById("parky-waits");
  const credit = document.getElementById("parky-credit");
  const events = new EventSource("https://api.parkypass.com/v1/parks/magic-kingdom/waits/stream");

  function render(message) {
    // Required: keep the "Live data from parkypass.com" link visible on every page that shows this data.
    credit.href = message.attribution.url;
    credit.textContent = message.attribution.text;
    if (message.type === "snapshot") rides.clear();
    for (const ride of message.rides) rides.set(ride.ride_id, ride);
    list.replaceChildren(...Array.from(rides.values(), (ride) => {
      const item = document.createElement("li");
      item.textContent = ride.name + ": " + (ride.wait_minutes !== null ? ride.wait_minutes + " min" : ride.status);
      return item;
    }));
  }

  // Server-Sent Events subscribe to the park in the URL; there is no ready message.
  events.onmessage = (event) => {
    const message = JSON.parse(event.data);
    if (message.type === "snapshot" || message.type === "changes") render(message);
  };
</script>
```

Streams open at once: 2 per IP without a key, 10 per free key,
100 per partner key. Each connection counts once against the per-minute limit.

## Best time to ride

`GET /v1/rides/{ride}/best-times?date=` returns predicted waits by park-local
hour with bounds, typical waits for that weekday, and `summary` with the best
one or two windows and the worst. `summary.basis` says whether it used
predictions (about the next week) or typical waits. Full example under the
endpoint below.

## Lightning Lane

`GET /v1/parks/{park}/lightning-lane?date=` returns the day's prices and,
for today, each ride's `lightning_lane` (`state` such as `AVAILABLE` or
`FINISHED`, with the return window) and `next_return_time`, soonest first.
The same window is on every `/waits` entry.

## Ride reliability

`GET /v1/parks/{park}/reliability` returns each ride's last 30 days, least
reliable first: `uptime_pct`, `outages`, `outages_per_day`,
`average_outage_minutes`, `longest_outage_minutes` and `days_observed`.
One ride's summary is also on `/v1/rides/{ride}`.

## Building with AI assistants

Paste this into Claude, ChatGPT or Cursor:

```text
Use the Parky API (docs: https://parkypass.com/developers.md, OpenAPI: https://api.parkypass.com/v1/openapi.json) to show live Magic Kingdom waits on this page. Keep a visible "Live data from parkypass.com" link: render attribution.text linked to attribution.url from the latest response or stream message, as the API terms require.
```

To let Claude or ChatGPT read Parky data directly, add the MCP connector at
`https://mcp.parkypass.com/mcp`. No key needed. Tools: [https://parkypass.com/developers/mcp](https://parkypass.com/developers/mcp).

## API reference

Every success response has `schema_version` (1), `docs_url`,
`attribution` and `generated_at` around its own fields. The full schema is
at [https://api.parkypass.com/v1/openapi.json](https://api.parkypass.com/v1/openapi.json).

### GET /v1

API index. Links to these docs, the OpenAPI document and the stream, every endpoint with a one-line description, the limits and the attribution rule. Needs no key and is not rate limited.

Cache-Control: `public, max-age=300`. Docs page: https://parkypass.com/developers/reference/index

```sh
curl "https://api.parkypass.com/v1"
```

```json
{
  "schema_version": 1,
  "name": "Parky API",
  "docs": {
    "html": "https://parkypass.com/developers",
    "markdown": "https://parkypass.com/developers.md"
  },
  "openapi_url": "https://api.parkypass.com/v1/openapi.json",
  "stream_url": "wss://api.parkypass.com/v1/stream",
  "sse_url_template": "https://api.parkypass.com/v1/parks/{park}/waits/stream",
  "attribution_rule": "Show the attribution text with a visible link to attribution.url wherever you display Parky data.",
  "endpoints": [
    {
      "path": "GET /v1/parks",
      "description": "Supported parks with keys, time zones and Parky URLs."
    },
    {
      "path": "GET /v1/parks/{park}/waits",
      "description": "Live waits for every ride in a park."
    }
  ],
  "docs_url": "https://parkypass.com/developers",
  "attribution": {
    "text": "Live data from parkypass.com",
    "url": "https://parkypass.com/",
    "required": true
  },
  "generated_at": "2026-10-05T16:45:02.118Z"
}
```

### GET /v1/parks

List parks. Every supported park: key, canonical id, name, destination, IANA time zone, and its parkypass.com page.

Cache-Control: `public, max-age=300`. Docs page: https://parkypass.com/developers/reference/parks

```sh
curl "https://api.parkypass.com/v1/parks"
```

```json
{
  "schema_version": 1,
  "parks": [
    {
      "id": "disney-walt-disney-world-resort-magic-kingdom-park",
      "key": "magic-kingdom",
      "name": "Magic Kingdom Park",
      "destination": {
        "id": "disney-walt-disney-world-resort",
        "name": "Walt Disney World Resort"
      },
      "time_zone": "America/New_York",
      "url": "https://parkypass.com/parks/magic-kingdom"
    }
  ],
  "docs_url": "https://parkypass.com/developers",
  "attribution": {
    "text": "Live data from parkypass.com",
    "url": "https://parkypass.com/parks",
    "required": true
  },
  "generated_at": "2026-10-05T16:45:02.118Z"
}
```

### GET /v1/parks/{park}/waits

Live waits. Every ride with a line at the park, always (status "unavailable" when the park's feed lacks it), plus any experience or show Disney or Universal is posting a wait for right now.

Cache-Control: `public, max-age=15`. Docs page: https://parkypass.com/developers/reference/waits

- `park` (path, required): The park: a park key (magic-kingdom), the canonical park id, the park's name, or a shorthand (mk, epcot, hs, ak, dl, dca, usf, ioa, epic, ush), in any case.

Response fields:

- `data_status`: "live" when the park's feed answered within 90 seconds; "unavailable" otherwise, with no old numbers.
- `feed`: disney_direct or universal_direct.
- `park_open`: Whether the park is open now.
- `checked_at, data_age_seconds`: When Parky last read the feed, and how long ago.
- `rides[].ride_id, name`: The stable ride ID and its name.
- `rides[].type`: "ride", "experience" or "show".
- `rides[].status`: Status is the park's own status in uppercase (OPERATING, DOWN, CLOSED, REFURBISHMENT, UNKNOWN), except lowercase "unavailable", which Parky adds when it has no live feed for that ride.
- `rides[].is_open`: True when the ride and the park are open; null when unavailable.
- `rides[].wait_minutes`: The posted standby wait; null when closed or unavailable, never 0 for unknown.
- `rides[].single_rider_*`: Whether Single Rider is running, and its wait.
- `rides[].lightning_lane`: type, state (such as AVAILABLE or FINISHED), return_start, return_end and price, while Disney's tip board is fresh; otherwise null.
- `rides[].changed_at`: When this entry's value last changed. Not a freshness time.

```sh
curl "https://api.parkypass.com/v1/parks/magic-kingdom/waits"
```

```json
{
  "schema_version": 1,
  "park_id": "disney-walt-disney-world-resort-magic-kingdom-park",
  "park_key": "magic-kingdom",
  "park_name": "Magic Kingdom Park",
  "time_zone": "America/New_York",
  "data_status": "live",
  "feed": "disney_direct",
  "park_open": true,
  "checked_at": "2026-10-05T16:44:58.000Z",
  "data_age_seconds": 4,
  "rides": [
    {
      "ride_id": "magic-kingdom_seven-dwarfs-mine-train",
      "name": "Seven Dwarfs Mine Train",
      "type": "ride",
      "status": "OPERATING",
      "is_open": true,
      "wait_minutes": 55,
      "single_rider_available": null,
      "single_rider_wait_minutes": null,
      "lightning_lane": {
        "type": "multi_pass",
        "state": "AVAILABLE",
        "return_start": "2026-10-05T18:15:00.000Z",
        "return_end": "2026-10-05T19:15:00.000Z",
        "price": null
      },
      "changed_at": "2026-10-05T16:42:10.311Z"
    },
    {
      "ride_id": "magic-kingdom_space-mountain",
      "name": "Space Mountain",
      "type": "ride",
      "status": "DOWN",
      "is_open": false,
      "wait_minutes": null,
      "single_rider_available": null,
      "single_rider_wait_minutes": null,
      "lightning_lane": {
        "type": "multi_pass",
        "state": "FINISHED",
        "return_start": null,
        "return_end": null,
        "price": null
      },
      "changed_at": "2026-10-05T16:31:44.902Z"
    }
  ],
  "note": "Waits come straight from Disney's and Universal's own live feeds.",
  "docs_url": "https://parkypass.com/developers",
  "attribution": {
    "text": "Live data from parkypass.com",
    "url": "https://parkypass.com/parks/magic-kingdom",
    "required": true
  },
  "generated_at": "2026-10-05T16:45:02.118Z"
}
```

### GET /v1/parks/{park}/waits/stream

Stream waits (SSE). Server-Sent Events for one park: subscribed, a snapshot of the whole board, then changes and park messages as they happen, each an unnamed data: line with a type field, so EventSource.onmessage receives everything. A ": ping" comment arrives every 25 seconds. Browsers pass the key as ?key=. For several parks on one connection, use the WebSocket.

Cache-Control: `no-cache`. Docs page: https://parkypass.com/developers/reference/waits-stream

- `park` (path, required): The park: a park key (magic-kingdom), the canonical park id, the park's name, or a shorthand (mk, epcot, hs, ak, dl, dca, usf, ioa, epic, ush), in any case.
- `key` (query): Optional developer key, for clients that cannot send headers.

```sh
curl -N "https://api.parkypass.com/v1/parks/magic-kingdom/waits/stream"
```

```text
retry: 5000

data: {"type":"subscribed","parks":["magic-kingdom"],"attribution":{…},"generated_at":"2026-10-05T16:45:00.512Z"}

data: {"type":"snapshot","park":"magic-kingdom","park_key":"magic-kingdom","data_status":"live","park_open":true,"rides":[…],"attribution":{…},"generated_at":"2026-10-05T16:45:00.512Z"}

data: {"type":"changes","park":"magic-kingdom","park_key":"magic-kingdom","data_status":"live","rides":[{"ride_id":"magic-kingdom_seven-dwarfs-mine-train","wait_minutes":60,…}],"attribution":{…},"generated_at":"2026-10-05T16:47:05.104Z"}

: ping
```

### GET /v1/parks/{park}/rides

List rides. The park's attractions with their ids, land, type, Lightning Lane availability, location, and facts such as height requirement, duration, top speed and drop. Facts vary by ride; absent facts are omitted.

Cache-Control: `public, max-age=300`. Docs page: https://parkypass.com/developers/reference/rides

- `park` (path, required): The park: a park key (magic-kingdom), the canonical park id, the park's name, or a shorthand (mk, epcot, hs, ak, dl, dca, usf, ioa, epic, ush), in any case.

```sh
curl "https://api.parkypass.com/v1/parks/islands-of-adventure/rides"
```

```json
{
  "schema_version": 1,
  "park_id": "universal-orlando-resort-islands-of-adventure",
  "park_key": "islands-of-adventure",
  "park_name": "Universal Islands of Adventure",
  "rides": [
    {
      "ride_id": "islands-of-adventure_jurassic-world-velocicoaster",
      "name": "Jurassic World VelociCoaster",
      "park_id": "universal-orlando-resort-islands-of-adventure",
      "park_key": "islands-of-adventure",
      "park_name": "Universal Islands of Adventure",
      "land": null,
      "ride_type": "launched roller coaster",
      "is_attraction": true,
      "has_lightning_lane": true,
      "height_requirement_inches": 51,
      "duration_seconds": 120,
      "location": {
        "latitude": 28.471429,
        "longitude": -81.472284
      },
      "facts": {
        "height_inches": 51,
        "top_speed_mph": 70,
        "drop_feet": 140,
        "duration_seconds": 120,
        "opened_year": 2021,
        "single_rider": true,
        "rider_swap": true
      },
      "url": "https://parkypass.com/parks/islands-of-adventure/jurassic-world-velocicoaster",
      "updated_at": "2026-10-04T18:17:13.907Z"
    }
  ],
  "docs_url": "https://parkypass.com/developers",
  "attribution": {
    "text": "Live data from parkypass.com",
    "url": "https://parkypass.com/parks/islands-of-adventure",
    "required": true
  },
  "generated_at": "2026-10-05T16:45:02.118Z"
}
```

### GET /v1/parks/{park}/rides/{ride}

One ride in a park. Like /v1/rides/{ride}, but {ride} may also be the ride's name or parkypass.com slug within this park.

Cache-Control: `public, max-age=15`. Docs page: https://parkypass.com/developers/reference/park-ride

- `park` (path, required): The park: a park key (magic-kingdom), the canonical park id, the park's name, or a shorthand (mk, epcot, hs, ak, dl, dca, usf, ioa, epic, ush), in any case.
- `ride` (path, required): A ride id, name, or parkypass.com slug within this park (jurassic-world-velocicoaster).

```sh
curl "https://api.parkypass.com/v1/parks/islands-of-adventure/rides/jurassic-world-velocicoaster"
```

```json
{
  "schema_version": 1,
  "ride_id": "islands-of-adventure_jurassic-world-velocicoaster",
  "name": "Jurassic World VelociCoaster",
  "park_id": "universal-orlando-resort-islands-of-adventure",
  "park_key": "islands-of-adventure",
  "park_name": "Universal Islands of Adventure",
  "land": null,
  "ride_type": "launched roller coaster",
  "is_attraction": true,
  "has_lightning_lane": true,
  "height_requirement_inches": 51,
  "duration_seconds": 120,
  "location": {
    "latitude": 28.471429,
    "longitude": -81.472284
  },
  "facts": {
    "height_inches": 51,
    "top_speed_mph": 70,
    "drop_feet": 140,
    "duration_seconds": 120,
    "opened_year": 2021,
    "single_rider": true,
    "rider_swap": true
  },
  "url": "https://parkypass.com/parks/islands-of-adventure/jurassic-world-velocicoaster",
  "updated_at": "2026-10-04T18:17:13.907Z",
  "live": {
    "data_status": "live",
    "feed": "universal_direct",
    "park_open": true,
    "checked_at": "2026-10-05T16:44:58.000Z",
    "wait": {
      "ride_id": "islands-of-adventure_jurassic-world-velocicoaster",
      "name": "Jurassic World VelociCoaster",
      "type": "ride",
      "status": "OPERATING",
      "is_open": true,
      "wait_minutes": 75,
      "single_rider_available": true,
      "single_rider_wait_minutes": 20,
      "lightning_lane": null,
      "changed_at": "2026-10-05T16:42:10.311Z"
    }
  },
  "reliability": {
    "ride_id": "islands-of-adventure_jurassic-world-velocicoaster",
    "name": "Jurassic World VelociCoaster",
    "uptime_pct": 93.4,
    "outages": 46,
    "outages_per_day": 1.48,
    "average_outage_minutes": 32.8,
    "longest_outage_minutes": 225,
    "days_observed": 31,
    "down_minutes": 1510,
    "operating_minutes": 12247,
    "window_start": "2026-09-05T16:00:00.000Z",
    "computed_at": "2026-10-05T16:00:00.000Z"
  },
  "docs_url": "https://parkypass.com/developers",
  "attribution": {
    "text": "Live data from parkypass.com",
    "url": "https://parkypass.com/parks/islands-of-adventure/jurassic-world-velocicoaster",
    "required": true
  },
  "generated_at": "2026-10-05T16:45:02.118Z"
}
```

### GET /v1/rides/{ride}

One ride. One ride's facts, its live wait (live) and its 30-day reliability (reliability).

Cache-Control: `public, max-age=15`. Docs page: https://parkypass.com/developers/reference/ride

- `ride` (path, required): The ride: a ride id from /v1/parks/{park}/rides (magic-kingdom_seven-dwarfs-mine-train), or the ride's name or slug when it is unique.

```sh
curl "https://api.parkypass.com/v1/rides/islands-of-adventure_jurassic-world-velocicoaster"
```

```json
{
  "schema_version": 1,
  "ride_id": "islands-of-adventure_jurassic-world-velocicoaster",
  "name": "Jurassic World VelociCoaster",
  "park_id": "universal-orlando-resort-islands-of-adventure",
  "park_key": "islands-of-adventure",
  "park_name": "Universal Islands of Adventure",
  "land": null,
  "ride_type": "launched roller coaster",
  "is_attraction": true,
  "has_lightning_lane": true,
  "height_requirement_inches": 51,
  "duration_seconds": 120,
  "location": {
    "latitude": 28.471429,
    "longitude": -81.472284
  },
  "facts": {
    "height_inches": 51,
    "top_speed_mph": 70,
    "drop_feet": 140,
    "duration_seconds": 120,
    "opened_year": 2021,
    "single_rider": true,
    "rider_swap": true
  },
  "url": "https://parkypass.com/parks/islands-of-adventure/jurassic-world-velocicoaster",
  "updated_at": "2026-10-04T18:17:13.907Z",
  "live": {
    "data_status": "live",
    "feed": "universal_direct",
    "park_open": true,
    "checked_at": "2026-10-05T16:44:58.000Z",
    "wait": {
      "ride_id": "islands-of-adventure_jurassic-world-velocicoaster",
      "name": "Jurassic World VelociCoaster",
      "type": "ride",
      "status": "OPERATING",
      "is_open": true,
      "wait_minutes": 75,
      "single_rider_available": true,
      "single_rider_wait_minutes": 20,
      "lightning_lane": null,
      "changed_at": "2026-10-05T16:42:10.311Z"
    }
  },
  "reliability": {
    "ride_id": "islands-of-adventure_jurassic-world-velocicoaster",
    "name": "Jurassic World VelociCoaster",
    "uptime_pct": 93.4,
    "outages": 46,
    "outages_per_day": 1.48,
    "average_outage_minutes": 32.8,
    "longest_outage_minutes": 225,
    "days_observed": 31,
    "down_minutes": 1510,
    "operating_minutes": 12247,
    "window_start": "2026-09-05T16:00:00.000Z",
    "computed_at": "2026-10-05T16:00:00.000Z"
  },
  "docs_url": "https://parkypass.com/developers",
  "attribution": {
    "text": "Live data from parkypass.com",
    "url": "https://parkypass.com/parks/islands-of-adventure/jurassic-world-velocicoaster",
    "required": true
  },
  "generated_at": "2026-10-05T16:45:02.118Z"
}
```

### GET /v1/parks/{park}/hours

Park hours. Operating hours and schedule windows (Early Entry, Extended Hours, special events) for up to 60 park-local days, from Disney's and Universal's own calendars. Hours may change.

Cache-Control: `public, max-age=300`. Docs page: https://parkypass.com/developers/reference/hours

- `park` (path, required): The park: a park key (magic-kingdom), the canonical park id, the park's name, or a shorthand (mk, epcot, hs, ak, dl, dca, usf, ioa, epic, ush), in any case.
- `date` (query): First park-local date, YYYY-MM-DD, from today through 59 days ahead. Defaults to today.
- `days` (query): Number of consecutive days, 1 to 60. Defaults to 1.

```sh
curl "https://api.parkypass.com/v1/parks/magic-kingdom/hours"
```

```json
{
  "schema_version": 1,
  "park_id": "disney-walt-disney-world-resort-magic-kingdom-park",
  "park_name": "Magic Kingdom Park",
  "time_zone": "America/New_York",
  "days": [
    {
      "date": "2026-10-05",
      "is_operating": true,
      "open_at": "2026-10-05T13:00:00.000Z",
      "close_at": "2026-10-06T03:00:00.000Z",
      "schedule_windows": [
        {
          "category": "early_entry",
          "display_label": "Early Entry",
          "start_at": "2026-10-05T12:30:00.000Z",
          "end_at": "2026-10-05T13:00:00.000Z"
        },
        {
          "category": "regular_hours",
          "display_label": "Regular Hours",
          "start_at": "2026-10-05T13:00:00.000Z",
          "end_at": "2026-10-06T03:00:00.000Z"
        }
      ],
      "updated_at": "2026-09-23T15:01:01.241Z"
    }
  ],
  "requested_from": "2026-10-05",
  "requested_to": "2026-10-05",
  "missing_dates": [],
  "data_status": "available",
  "note": "Operating hours may change. Confirm critical decisions with the park operator.",
  "docs_url": "https://parkypass.com/developers",
  "attribution": {
    "text": "Live data from parkypass.com",
    "url": "https://parkypass.com/parks/magic-kingdom",
    "required": true
  },
  "generated_at": "2026-10-05T16:45:02.118Z"
}
```

### GET /v1/parks/{park}/crowds

Crowd forecast. The 1 to 10 crowd forecast with a low–high range and its drivers, for up to 30 park-local days. Today's level follows observed waits once the park has an hour of them.

Cache-Control: `public, max-age=300`. Docs page: https://parkypass.com/developers/reference/crowds

- `park` (path, required): The park: a park key (magic-kingdom), the canonical park id, the park's name, or a shorthand (mk, epcot, hs, ak, dl, dca, usf, ioa, epic, ush), in any case.
- `date` (query): First park-local date, YYYY-MM-DD, from today through 29 days ahead. Defaults to today in the park's time zone.
- `days` (query): Number of consecutive days, 1 to 30. Defaults to 1.

```sh
curl "https://api.parkypass.com/v1/parks/magic-kingdom/crowds?days=7"
```

```json
{
  "schema_version": 1,
  "park_id": "disney-walt-disney-world-resort-magic-kingdom-park",
  "park_name": "Magic Kingdom Park",
  "time_zone": "America/New_York",
  "days": [
    {
      "date": "2026-10-11",
      "crowd_level": 7,
      "level_low": 6,
      "level_high": 8,
      "drivers": [
        {
          "label": "Fall break week",
          "effect": 1.2
        }
      ],
      "notes": [
        "Halloween party night: park closes at 6 pm for day guests."
      ],
      "generated_at": "2026-10-05T09:12:00.000Z"
    }
  ],
  "requested_from": "2026-10-11",
  "requested_to": "2026-10-11",
  "missing_dates": [],
  "data_status": "available",
  "note": "This is a forecast, not a guarantee of crowd size or wait time.",
  "docs_url": "https://parkypass.com/developers",
  "attribution": {
    "text": "Live data from parkypass.com",
    "url": "https://parkypass.com/parks/magic-kingdom",
    "required": true
  },
  "generated_at": "2026-10-05T16:45:02.118Z"
}
```

### GET /v1/parks/{park}/lightning-lane

Lightning Lane. Lightning Lane Multi Pass, Single Pass and Premier Pass prices (Express Pass at Universal) for a date, and for today each ride's current return window, soonest first.

Cache-Control: `public, max-age=15`. Docs page: https://parkypass.com/developers/reference/lightning-lane

- `park` (path, required): The park: a park key (magic-kingdom), the canonical park id, the park's name, or a shorthand (mk, epcot, hs, ak, dl, dca, usf, ioa, epic, ush), in any case.
- `date` (query): First park-local date, YYYY-MM-DD, from today through 29 days ahead. Defaults to today in the park's time zone.

```sh
curl "https://api.parkypass.com/v1/parks/magic-kingdom/lightning-lane"
```

```json
{
  "schema_version": 1,
  "park_id": "disney-walt-disney-world-resort-magic-kingdom-park",
  "park_key": "magic-kingdom",
  "park_name": "Magic Kingdom Park",
  "time_zone": "America/New_York",
  "date": "2026-10-05",
  "prices": [
    {
      "product": "multi_pass",
      "product_name": "Lightning Lane Multi Pass",
      "price": 35,
      "currency": "USD",
      "available": true,
      "updated_at": "2026-10-05T11:17:08.987Z"
    }
  ],
  "live_data_status": "live",
  "feed": "disney_direct",
  "checked_at": "2026-10-05T16:44:58.000Z",
  "rides": [
    {
      "ride_id": "magic-kingdom_pirates-of-the-caribbean",
      "name": "Pirates of the Caribbean",
      "status": "OPERATING",
      "lightning_lane": {
        "type": "multi_pass",
        "state": "AVAILABLE",
        "return_start": "2026-10-05T18:15:00.000Z",
        "return_end": "2026-10-05T19:15:00.000Z",
        "price": null
      },
      "next_return_time": "2026-10-05T18:15:00.000Z",
      "changed_at": "2026-10-05T16:40:00.000Z"
    }
  ],
  "note": "Return times come from Disney's own live tip board and change quickly.",
  "docs_url": "https://parkypass.com/developers",
  "attribution": {
    "text": "Live data from parkypass.com",
    "url": "https://parkypass.com/parks/magic-kingdom",
    "required": true
  },
  "generated_at": "2026-10-05T16:45:02.118Z"
}
```

### GET /v1/parks/{park}/reliability

Ride reliability. Each ride's last 30 days: uptime, outages, outages per day, and average and longest outage, least reliable first. Computed only from Disney's and Universal's own status feeds, counting only the park's operating hours, and refreshed every 5 minutes. Coverage starts September 28, 2026, so the window is shorter until 30 days have passed.

Cache-Control: `public, max-age=300`. Docs page: https://parkypass.com/developers/reference/reliability

- `park` (path, required): The park: a park key (magic-kingdom), the canonical park id, the park's name, or a shorthand (mk, epcot, hs, ak, dl, dca, usf, ioa, epic, ush), in any case.

```sh
curl "https://api.parkypass.com/v1/parks/magic-kingdom/reliability"
```

```json
{
  "schema_version": 1,
  "park_id": "disney-walt-disney-world-resort-magic-kingdom-park",
  "park_key": "magic-kingdom",
  "park_name": "Magic Kingdom Park",
  "window_days": 30,
  "window_start": "2026-09-28T00:00:00.000Z",
  "computed_at": "2026-10-05T16:00:00.000Z",
  "rides": [
    {
      "ride_id": "magic-kingdom_seven-dwarfs-mine-train",
      "name": "Seven Dwarfs Mine Train",
      "uptime_pct": 89.02,
      "outages": 46,
      "outages_per_day": 1.48,
      "average_outage_minutes": 32.8,
      "longest_outage_minutes": 225,
      "days_observed": 31,
      "down_minutes": 1510,
      "operating_minutes": 12247
    }
  ],
  "truncated": false,
  "data_status": "available",
  "note": "Uptime counts minutes a ride reported down while its park was open over the last 30 days. Least reliable first.",
  "docs_url": "https://parkypass.com/developers",
  "attribution": {
    "text": "Live data from parkypass.com",
    "url": "https://parkypass.com/parks/magic-kingdom",
    "required": true
  },
  "generated_at": "2026-10-05T16:45:02.118Z"
}
```

### GET /v1/rides/{ride}/best-times

Best times to ride. Predicted waits by park-local hour for a date, with lower and upper bounds, the typical wait by hour for that weekday, and a summary of the best one or two windows and the worst. Predictions cover about the next week; later dates fall back to typical waits (summary.basis).

Cache-Control: `public, max-age=300`. Docs page: https://parkypass.com/developers/reference/best-times

- `ride` (path, required): The ride: a ride id from /v1/parks/{park}/rides (magic-kingdom_seven-dwarfs-mine-train), or the ride's name or slug when it is unique.
- `date` (query): First park-local date, YYYY-MM-DD, from today through 29 days ahead. Defaults to today in the park's time zone.

```sh
curl "https://api.parkypass.com/v1/rides/magic-kingdom_seven-dwarfs-mine-train/best-times"
```

```json
{
  "schema_version": 1,
  "ride_id": "magic-kingdom_seven-dwarfs-mine-train",
  "ride_name": "Seven Dwarfs Mine Train",
  "park_id": "disney-walt-disney-world-resort-magic-kingdom-park",
  "park_name": "Magic Kingdom Park",
  "time_zone": "America/New_York",
  "date": "2026-10-06",
  "day_of_week": "Tuesday",
  "predicted_hours": [
    {
      "hour": 9,
      "local_time": "09:00",
      "predicted_wait_minutes": 45,
      "lower_bound": 38,
      "upper_bound": 52,
      "park_closed": false
    },
    {
      "hour": 20,
      "local_time": "20:00",
      "predicted_wait_minutes": 25,
      "lower_bound": 20,
      "upper_bound": 31,
      "park_closed": false
    }
  ],
  "typical_hours": [
    {
      "hour": 9,
      "local_time": "09:00",
      "typical_wait_minutes": 40,
      "days_observed": 8
    },
    {
      "hour": 20,
      "local_time": "20:00",
      "typical_wait_minutes": 28,
      "days_observed": 8
    }
  ],
  "summary": {
    "basis": "predicted",
    "best_windows": [
      {
        "start": "20:00",
        "end": "22:00",
        "start_hour": 20,
        "end_hour": 22,
        "average_wait_minutes": 27.5
      }
    ],
    "worst_window": {
      "start": "12:00",
      "end": "14:00",
      "start_hour": 12,
      "end_hour": 14,
      "average_wait_minutes": 70
    }
  },
  "prediction_generated_at": "2026-10-05T10:22:35.000Z",
  "data_status": "predicted",
  "note": "Hours are park-local. Predictions and typical waits are estimates, not guarantees.",
  "docs_url": "https://parkypass.com/developers",
  "attribution": {
    "text": "Live data from parkypass.com",
    "url": "https://parkypass.com/parks/magic-kingdom/seven-dwarfs-mine-train",
    "required": true
  },
  "generated_at": "2026-10-05T16:45:02.118Z"
}
```

### GET /v1/parks/{park}/showtimes

Showtimes. Show, parade, fireworks and character-meet times for a park-local date in the next 7 days, earliest first. Parks usually publish today's times only, and they can change.

Cache-Control: `public, max-age=300`. Docs page: https://parkypass.com/developers/reference/showtimes

- `park` (path, required): The park: a park key (magic-kingdom), the canonical park id, the park's name, or a shorthand (mk, epcot, hs, ak, dl, dca, usf, ioa, epic, ush), in any case.
- `date` (query): Park-local date, YYYY-MM-DD, from today through 6 days ahead. Defaults to today.

Response fields:

- `shows[].id, name`: The show's Parky ID and name.
- `shows[].type`: "show", "meet", "experience" or "ride".
- `shows[].times[]`: start_at, end_at (null for a single performance) and kind, such as Operating or Performance Time.

```sh
curl "https://api.parkypass.com/v1/parks/magic-kingdom/showtimes"
```

```json
{
  "schema_version": 1,
  "park_id": "disney-walt-disney-world-resort-magic-kingdom-park",
  "park_key": "magic-kingdom",
  "park_name": "Magic Kingdom Park",
  "time_zone": "America/New_York",
  "date": "2026-10-04",
  "shows": [
    {
      "id": "magic-kingdom_40737d3d-0ff6-4a9e-a050-beb87bf90120",
      "name": "Meet Cinderella and a Visiting Princess at Princess Fairytale Hall",
      "type": "meet",
      "times": [
        {
          "start_at": "2026-10-04T13:00:00.000Z",
          "end_at": "2026-10-04T21:00:00.000Z",
          "kind": "Operating"
        }
      ],
      "updated_at": "2026-10-04T04:01:35.490Z"
    },
    {
      "id": "magic-kingdom_a2d92647-634d-4eb4-886b-9da858e871f1",
      "name": "Meet Mickey at Town Square Theater",
      "type": "meet",
      "times": [
        {
          "start_at": "2026-10-04T13:00:00.000Z",
          "end_at": "2026-10-04T21:30:00.000Z",
          "kind": "Operating"
        }
      ],
      "updated_at": "2026-10-04T04:01:35.490Z"
    }
  ],
  "data_status": "available",
  "note": "Showtimes are usually published for today only and can change.",
  "docs_url": "https://parkypass.com/developers",
  "attribution": {
    "text": "Live data from parkypass.com",
    "url": "https://parkypass.com/parks/magic-kingdom",
    "required": true
  },
  "generated_at": "2026-10-05T16:45:02.118Z"
}
```

### GET /v1/parks/{park}/conditions

Conditions now. The National Weather Service's latest observation (within 3 hours) and active alerts for the park, Parky's lightning risk, and how many rides are operating, down, closed or unavailable right now, with the average and longest posted wait. Current conditions only.

Cache-Control: `public, max-age=60`. Docs page: https://parkypass.com/developers/reference/conditions

- `park` (path, required): The park: a park key (magic-kingdom), the canonical park id, the park's name, or a shorthand (mk, epcot, hs, ak, dl, dca, usf, ioa, epic, ush), in any case.

Response fields:

- `weather`: Temperature, feels-like and heat index (°F), precipitation_chance_percent (0 to 100), wind, lightning_risk (none, low, moderate, high) and NWS alerts; null when there is no observation in the last 3 hours.
- `rides`: data_status, park_open, and counts of operating, down, closed and unavailable rides, from the same board as /waits.

```sh
curl "https://api.parkypass.com/v1/parks/magic-kingdom/conditions"
```

```json
{
  "schema_version": 1,
  "park_id": "disney-walt-disney-world-resort-magic-kingdom-park",
  "park_key": "magic-kingdom",
  "park_name": "Magic Kingdom Park",
  "time_zone": "America/New_York",
  "weather": {
    "observed_at": "2026-10-04T23:10:00.000Z",
    "condition": "Clouds",
    "summary": "Clouds - 82F - 51% rain - moderate lightning risk",
    "temperature_f": 82.4,
    "feels_like_f": 88.3,
    "heat_index_f": 88.3,
    "precipitation_chance_percent": 51,
    "precipitation_in_per_hour": null,
    "wind_speed_mph": 8.1,
    "wind_gust_mph": null,
    "lightning_risk": "moderate",
    "alerts": [],
    "thunderstorm_alert": false,
    "severe_alert": false,
    "source": "National Weather Service"
  },
  "rides": {
    "data_status": "live",
    "park_open": true,
    "checked_at": "2026-10-04T23:53:56.901Z",
    "operating": 21,
    "down": 0,
    "closed": 0,
    "unavailable": 0,
    "average_wait_minutes": 11.2,
    "longest_wait_minutes": 35
  },
  "note": "Weather is the National Weather Service's latest observation and alerts; ride counts cover queued rides on Parky's live board.",
  "docs_url": "https://parkypass.com/developers",
  "attribution": {
    "text": "Live data from parkypass.com",
    "url": "https://parkypass.com/parks/magic-kingdom",
    "required": true
  },
  "generated_at": "2026-10-05T16:45:02.118Z"
}
```

### GET /v1/parks/{park}/outages/today

Today's outages. Every ride outage at the park today (park-local), newest first, including rides down right now (down_now) and outages still open from yesterday. An outage runs from the first Down, Brief Delay or Weather Delay report until the ride reports anything else.

Cache-Control: `public, max-age=60`. Docs page: https://parkypass.com/developers/reference/park-outages

- `park` (path, required): The park: a park key (magic-kingdom), the canonical park id, the park's name, or a shorthand (mk, epcot, hs, ak, dl, dca, usf, ioa, epic, ush), in any case.

```sh
curl "https://api.parkypass.com/v1/parks/magic-kingdom/outages/today"
```

```json
{
  "schema_version": 1,
  "park_id": "disney-walt-disney-world-resort-magic-kingdom-park",
  "park_key": "magic-kingdom",
  "park_name": "Magic Kingdom Park",
  "time_zone": "America/New_York",
  "date": "2026-10-04",
  "outages_today": 18,
  "down_now": [],
  "outages": [
    {
      "ride_id": "magic-kingdom_tomorrowland-transit-authority-peoplemover",
      "reason": "down",
      "started_at": "2026-10-04T23:14:19.582Z",
      "ended_at": "2026-10-04T23:18:23.085Z",
      "duration_minutes": 4.1,
      "ongoing": false,
      "feed": "disney_direct",
      "name": "Tomorrowland Transit Authority PeopleMover",
      "type": "ride"
    },
    {
      "ride_id": "magic-kingdom_prince-charming-regal-carrousel",
      "reason": "down",
      "started_at": "2026-10-04T23:01:17.449Z",
      "ended_at": "2026-10-04T23:07:16.672Z",
      "duration_minutes": 6,
      "ongoing": false,
      "feed": "disney_direct",
      "name": "Prince Charming Regal Carrousel",
      "type": "ride"
    }
  ],
  "truncated": false,
  "note": "Outages come from Disney's and Universal's own live feeds: a ride is down from the first Down, Brief Delay or Weather Delay report until it reports anything else.",
  "docs_url": "https://parkypass.com/developers",
  "attribution": {
    "text": "Live data from parkypass.com",
    "url": "https://parkypass.com/parks/magic-kingdom",
    "required": true
  },
  "generated_at": "2026-10-05T16:45:02.118Z"
}
```

### GET /v1/rides/{ride}/outages

A ride's outages. Each outage of one ride over the last 1 to 30 park-local days, newest first, with start and end times and a summary. ongoing is true while the ride is still down. Coverage starts September 28, 2026.

Cache-Control: `public, max-age=60`. Docs page: https://parkypass.com/developers/reference/ride-outages

- `ride` (path, required): The ride: a ride id from /v1/parks/{park}/rides (magic-kingdom_seven-dwarfs-mine-train), or the ride's name or slug when it is unique.
- `days` (query): Park-local days back including today, 1 to 30. Defaults to 7.

```sh
curl "https://api.parkypass.com/v1/rides/magic-kingdom_seven-dwarfs-mine-train/outages?days=7"
```

```json
{
  "schema_version": 1,
  "ride_id": "magic-kingdom_seven-dwarfs-mine-train",
  "ride_name": "Seven Dwarfs Mine Train",
  "park_id": "disney-walt-disney-world-resort-magic-kingdom-park",
  "park_key": "magic-kingdom",
  "time_zone": "America/New_York",
  "from": "2026-09-28",
  "to": "2026-10-04",
  "summary": {
    "outages": 5,
    "down_minutes": 217.1,
    "longest_outage_minutes": 70,
    "ongoing": false
  },
  "outages": [
    {
      "ride_id": "magic-kingdom_seven-dwarfs-mine-train",
      "reason": "down",
      "started_at": "2026-10-03T20:13:05.623Z",
      "ended_at": "2026-10-03T21:03:03.710Z",
      "duration_minutes": 50,
      "ongoing": false,
      "feed": "disney_direct"
    },
    {
      "ride_id": "magic-kingdom_seven-dwarfs-mine-train",
      "reason": "down",
      "started_at": "2026-10-02T18:46:54.105Z",
      "ended_at": "2026-10-02T19:16:53.172Z",
      "duration_minutes": 30,
      "ongoing": false,
      "feed": "disney_direct"
    }
  ],
  "coverage_start": "2026-09-28",
  "note": "Outages come from Disney's and Universal's own live feeds: a ride is down from the first Down, Brief Delay or Weather Delay report until it reports anything else.",
  "docs_url": "https://parkypass.com/developers",
  "attribution": {
    "text": "Live data from parkypass.com",
    "url": "https://parkypass.com/parks/magic-kingdom/seven-dwarfs-mine-train",
    "required": true
  },
  "generated_at": "2026-10-05T16:45:02.118Z"
}
```

### GET /v1/parks/{park}/crowds/actuals

Observed crowds. The observed crowd index for the last 1 to 60 park-local days (1.0 = the park's typical day), from midday posted waits, plus how accurate the crowd forecast has been.

Cache-Control: `public, max-age=300`. Docs page: https://parkypass.com/developers/reference/crowd-actuals

- `park` (path, required): The park: a park key (magic-kingdom), the canonical park id, the park's name, or a shorthand (mk, epcot, hs, ak, dl, dca, usf, ioa, epic, ush), in any case.
- `days` (query): Park-local days back including today, 1 to 60. Defaults to 14.

```sh
curl "https://api.parkypass.com/v1/parks/magic-kingdom/crowds/actuals?days=3"
```

```json
{
  "schema_version": 1,
  "park_id": "disney-walt-disney-world-resort-magic-kingdom-park",
  "park_key": "magic-kingdom",
  "park_name": "Magic Kingdom Park",
  "requested_from": "2026-10-02",
  "requested_to": "2026-10-04",
  "days": [
    {
      "date": "2026-10-03",
      "crowd_index": 1.1213066052668,
      "midday_mean_wait_minutes": 42.0352898685008,
      "rides_used": 10,
      "computed_at": "2026-10-04T20:09:09.804Z"
    },
    {
      "date": "2026-10-02",
      "crowd_index": 0.647300921179036,
      "midday_mean_wait_minutes": 25.5353297510246,
      "rides_used": 10,
      "computed_at": "2026-10-04T20:09:09.804Z"
    }
  ],
  "accuracy": {
    "days_scored": 50,
    "within_one_level_share": 0.64,
    "mean_miss_levels": 1.36,
    "baseline_mean_miss_levels": 2.76,
    "correlation": 0.77,
    "reliable": true,
    "model_version": "crowd-ridge-v3",
    "updated_at": "2026-10-04T20:09:28.957Z"
  },
  "note": "crowd_index is the day's observed midday waits relative to the park's typical day (1.0 = typical).",
  "docs_url": "https://parkypass.com/developers",
  "attribution": {
    "text": "Live data from parkypass.com",
    "url": "https://parkypass.com/crowd-calendar/magic-kingdom",
    "required": true
  },
  "generated_at": "2026-10-05T16:45:02.118Z"
}
```

### GET /v1/resorts

List resorts. Every supported resort with its key, shorthands, time zone and parks.

Cache-Control: `public, max-age=300`. Docs page: https://parkypass.com/developers/reference/resorts

```sh
curl "https://api.parkypass.com/v1/resorts"
```

```json
{
  "schema_version": 1,
  "resorts": [
    {
      "id": "disney-walt-disney-world-resort",
      "key": "walt-disney-world",
      "name": "Walt Disney World Resort",
      "aliases": [
        "wdw"
      ],
      "time_zone": "America/New_York",
      "parks": [
        {
          "id": "disney-walt-disney-world-resort-magic-kingdom-park",
          "key": "magic-kingdom",
          "name": "Magic Kingdom Park",
          "destination": {
            "id": "disney-walt-disney-world-resort",
            "name": "Walt Disney World Resort"
          },
          "resort_key": "walt-disney-world",
          "time_zone": "America/New_York",
          "url": "https://parkypass.com/parks/magic-kingdom"
        }
      ],
      "url": "https://parkypass.com/parks"
    },
    {
      "id": "disneyland-resort",
      "key": "disneyland-resort",
      "name": "Disneyland Resort",
      "aliases": [
        "dlr"
      ],
      "time_zone": "America/Los_Angeles",
      "parks": [
        {
          "id": "disneyland-resort-disneyland-park",
          "key": "disneyland-park",
          "name": "Disneyland Park",
          "destination": {
            "id": "disneyland-resort",
            "name": "Disneyland Resort"
          },
          "resort_key": "disneyland-resort",
          "time_zone": "America/Los_Angeles",
          "url": "https://parkypass.com/parks/disneyland-park"
        }
      ],
      "url": "https://parkypass.com/parks"
    }
  ],
  "docs_url": "https://parkypass.com/developers",
  "attribution": {
    "text": "Live data from parkypass.com",
    "url": "https://parkypass.com/parks",
    "required": true
  },
  "generated_at": "2026-10-05T16:45:02.118Z"
}
```

### GET /v1/resorts/{resort}

One resort. One resort and its parks.

Cache-Control: `public, max-age=300`. Docs page: https://parkypass.com/developers/reference/resort

- `resort` (path, required): The resort: its key (walt-disney-world, disneyland-resort, universal-orlando, universal-studios-hollywood), id, name, or shorthand (wdw, dlr, uor, ush). Case-insensitive.

```sh
curl "https://api.parkypass.com/v1/resorts/walt-disney-world"
```

```json
{
  "schema_version": 1,
  "id": "disney-walt-disney-world-resort",
  "key": "walt-disney-world",
  "name": "Walt Disney World Resort",
  "aliases": [
    "wdw",
    "disney-world"
  ],
  "time_zone": "America/New_York",
  "parks": [
    {
      "id": "disney-walt-disney-world-resort-magic-kingdom-park",
      "key": "magic-kingdom",
      "name": "Magic Kingdom Park",
      "destination": {
        "id": "disney-walt-disney-world-resort",
        "name": "Walt Disney World Resort"
      },
      "resort_key": "walt-disney-world",
      "time_zone": "America/New_York",
      "url": "https://parkypass.com/parks/magic-kingdom"
    },
    {
      "id": "disney-walt-disney-world-resort-epcot",
      "key": "epcot",
      "name": "EPCOT",
      "destination": {
        "id": "disney-walt-disney-world-resort",
        "name": "Walt Disney World Resort"
      },
      "resort_key": "walt-disney-world",
      "time_zone": "America/New_York",
      "url": "https://parkypass.com/parks/epcot"
    }
  ],
  "url": "https://parkypass.com/parks",
  "docs_url": "https://parkypass.com/developers",
  "attribution": {
    "text": "Live data from parkypass.com",
    "url": "https://parkypass.com/parks",
    "required": true
  },
  "generated_at": "2026-10-05T16:45:02.118Z"
}
```

### GET /v1/resorts/{resort}/tickets

Ticket prices. Every ticket Disney or Universal prices for a start date in the next year (base, Park Hopper, multi-day, special events), as their own stores showed Parky on its last check, plus per-park products for that date such as one-day tickets by park and Universal Express. Current prices only. Lightning Lane prices are on /v1/parks/{park}/lightning-lane.

Cache-Control: `public, max-age=300`. Docs page: https://parkypass.com/developers/reference/tickets

- `resort` (path, required): The resort: its key (walt-disney-world, disneyland-resort, universal-orlando, universal-studios-hollywood), id, name, or shorthand (wdw, dlr, uor, ush). Case-insensitive.
- `date` (query): Ticket start date in the resort's time zone, YYYY-MM-DD, from today through 365 days ahead. Defaults to today.

```sh
curl "https://api.parkypass.com/v1/resorts/walt-disney-world/tickets?date=2026-10-11"
```

```json
{
  "schema_version": 1,
  "resort_id": "disney-walt-disney-world-resort",
  "resort_key": "walt-disney-world",
  "resort_name": "Walt Disney World Resort",
  "date": "2026-10-11",
  "tickets": [
    {
      "name": null,
      "family": "base",
      "parks": "ak",
      "days": 1,
      "age_group": "adult",
      "eligibility": "general",
      "event": null,
      "price": 184,
      "tax": 11.96,
      "currency": "USD",
      "available": true,
      "valid_through": "2026-10-11",
      "captured_at": "2026-10-04T08:02:36.182Z"
    },
    {
      "name": null,
      "family": "base",
      "parks": "ak",
      "days": 1,
      "age_group": "adult",
      "eligibility": "florida_resident",
      "event": null,
      "price": 184,
      "tax": 11.96,
      "currency": "USD",
      "available": true,
      "valid_through": "2026-10-11",
      "captured_at": "2026-10-04T08:02:36.182Z"
    }
  ],
  "park_products": [
    {
      "park_key": "animal-kingdom",
      "product": "adult_1_day",
      "price": 184,
      "tier": null,
      "currency": "USD",
      "available": null,
      "captured_at": "2026-10-04T08:02:36.182Z"
    },
    {
      "park_key": "hollywood-studios",
      "product": "adult_1_day",
      "price": 199,
      "tier": null,
      "currency": "USD",
      "available": null,
      "captured_at": "2026-10-04T08:02:36.182Z"
    }
  ],
  "data_status": "available",
  "note": "Prices are what Disney or Universal showed Parky on its last check, before tax unless tax is given. Lightning Lane prices are at /v1/parks/{park}/lightning-lane.",
  "docs_url": "https://parkypass.com/developers",
  "attribution": {
    "text": "Live data from parkypass.com",
    "url": "https://parkypass.com/parks",
    "required": true
  },
  "generated_at": "2026-10-05T16:45:02.118Z"
}
```

### GET /v1/resorts/{resort}/park-availability

Park reservations. Park reservation and blockout availability per park and segment (ticket or pass type, such as broad tickets or an annual pass tier) for up to 31 days, from Disney's and Universal's own calendars.

Cache-Control: `public, max-age=300`. Docs page: https://parkypass.com/developers/reference/park-availability

- `resort` (path, required): The resort: its key (walt-disney-world, disneyland-resort, universal-orlando, universal-studios-hollywood), id, name, or shorthand (wdw, dlr, uor, ush). Case-insensitive.
- `date` (query): First date, YYYY-MM-DD, from today through 399 days ahead. Defaults to today.
- `days` (query): Number of consecutive days, 1 to 31. Defaults to 7.

```sh
curl "https://api.parkypass.com/v1/resorts/walt-disney-world/park-availability?days=2"
```

```json
{
  "schema_version": 1,
  "resort_id": "disney-walt-disney-world-resort",
  "resort_key": "walt-disney-world",
  "resort_name": "Walt Disney World Resort",
  "requested_from": "2026-10-04",
  "requested_to": "2026-10-05",
  "days": [
    {
      "date": "2026-10-04",
      "parks": [
        {
          "park_key": "animal-kingdom",
          "segments": [
            {
              "segment": "ap_good_to_go",
              "available": false,
              "fully_booked": false,
              "blocked": false,
              "captured_at": "2026-10-04T23:36:31.959Z"
            }
          ]
        }
      ]
    },
    {
      "date": "2026-10-05",
      "parks": [
        {
          "park_key": "animal-kingdom",
          "segments": [
            {
              "segment": "ap_good_to_go",
              "available": false,
              "fully_booked": false,
              "blocked": false,
              "captured_at": "2026-10-04T23:36:31.959Z"
            }
          ]
        }
      ]
    }
  ],
  "data_status": "available",
  "note": "Park reservation and blockout availability by ticket or pass type (segment), from Disney's and Universal's own calendars.",
  "docs_url": "https://parkypass.com/developers",
  "attribution": {
    "text": "Live data from parkypass.com",
    "url": "https://parkypass.com/parks",
    "required": true
  },
  "generated_at": "2026-10-05T16:45:02.118Z"
}
```

### GET /v1/resorts/{resort}/hotel-availability

Hotel availability. Per night, how many of the resort's hotels are sold out and the median rate; per hotel and night, availability, the lowest rate for two adults and rooms left at it, as Disney or Universal showed Parky on its last daily check. Up to 14 nights within the next 120 days.

Cache-Control: `public, max-age=300`. Docs page: https://parkypass.com/developers/reference/hotel-availability

- `resort` (path, required): The resort: its key (walt-disney-world, disneyland-resort, universal-orlando, universal-studios-hollywood), id, name, or shorthand (wdw, dlr, uor, ush). Case-insensitive.
- `date` (query): First night, YYYY-MM-DD, from today through 119 days ahead. Defaults to tonight.
- `days` (query): Number of nights, 1 to 14. Defaults to 7.

```sh
curl "https://api.parkypass.com/v1/resorts/walt-disney-world/hotel-availability?days=1"
```

```json
{
  "schema_version": 1,
  "resort_id": "disney-walt-disney-world-resort",
  "resort_key": "walt-disney-world",
  "resort_name": "Walt Disney World Resort",
  "requested_from": "2026-10-04",
  "requested_to": "2026-10-04",
  "nights": [
    {
      "night": "2026-10-04",
      "hotels_checked": 30,
      "hotels_sold_out": 2,
      "sold_out_share": 0.0667,
      "median_rate": 651.6,
      "rate_index": 1.0835,
      "rooms_left_at_lowest_rate": null,
      "captured_at": "2026-10-03T21:11:58.592Z"
    }
  ],
  "hotels": [
    {
      "hotel_id": "1",
      "name": "Bay Lake Tower at Disney's Contemporary Resort",
      "tier": "deluxe_villa",
      "night": "2026-10-04",
      "adults": 2,
      "available": true,
      "rate": 1204,
      "rack_rate": 1505,
      "room_type": "4X",
      "rooms_left": null,
      "currency": "USD",
      "captured_at": "2026-10-03T21:11:58.592Z"
    },
    {
      "hotel_id": "80010393",
      "name": "Boulder Ridge Villas at Disney's Wilderness Lodge",
      "tier": "deluxe_villa",
      "night": "2026-10-04",
      "adults": 2,
      "available": false,
      "rate": null,
      "rack_rate": null,
      "room_type": null,
      "rooms_left": null,
      "currency": "USD",
      "captured_at": "2026-10-03T21:11:58.592Z"
    }
  ],
  "data_status": "available",
  "note": "The lowest available rate for two adults per hotel and night, as Disney or Universal showed it on Parky's last daily check.",
  "docs_url": "https://parkypass.com/developers",
  "attribution": {
    "text": "Live data from parkypass.com",
    "url": "https://parkypass.com/parks",
    "required": true
  },
  "generated_at": "2026-10-05T16:45:02.118Z"
}
```

### GET /v1/resorts/{resort}/events

Event nights. Separately ticketed event nights (Mickey's Not-So-Scary Halloween Party, Disney Jollywood Nights, Halloween Horror Nights and more) with on-sale or sold-out status, the lowest adult price seen, and when Parky first saw each night sell out. At most 60 nights per request.

Cache-Control: `public, max-age=300`. Docs page: https://parkypass.com/developers/reference/events

- `resort` (path, required): The resort: its key (walt-disney-world, disneyland-resort, universal-orlando, universal-studios-hollywood), id, name, or shorthand (wdw, dlr, uor, ush). Case-insensitive.
- `from` (query): First night, YYYY-MM-DD, from today through 365 days ahead. Defaults to today.
- `to` (query): Last night, YYYY-MM-DD, at most 59 days after from. Defaults to 29 days after from.

```sh
curl "https://api.parkypass.com/v1/resorts/walt-disney-world/events"
```

```json
{
  "schema_version": 1,
  "resort_id": "disney-walt-disney-world-resort",
  "resort_key": "walt-disney-world",
  "resort_name": "Walt Disney World Resort",
  "requested_from": "2026-10-04",
  "requested_to": "2026-11-02",
  "nights": [
    {
      "event": "mickeys-not-so-scary-halloween-party",
      "name": "Mickeys Not So Scary Halloween Party",
      "date": "2026-10-04",
      "park_key": "magic-kingdom",
      "status": "sold_out",
      "available": false,
      "price": null,
      "addon_available": null,
      "first_seen_at": "2026-10-04T08:02:36.182Z",
      "first_sold_out_at": "2026-10-04T08:02:36.182Z",
      "last_on_sale_at": null,
      "captured_at": "2026-10-04T08:02:36.182Z"
    },
    {
      "event": "mickeys-not-so-scary-halloween-party",
      "name": "Mickeys Not So Scary Halloween Party",
      "date": "2026-10-06",
      "park_key": "magic-kingdom",
      "status": "sold_out",
      "available": false,
      "price": null,
      "addon_available": null,
      "first_seen_at": "2026-10-04T08:02:36.182Z",
      "first_sold_out_at": "2026-10-04T08:02:36.182Z",
      "last_on_sale_at": null,
      "captured_at": "2026-10-04T08:02:36.182Z"
    }
  ],
  "data_status": "available",
  "note": "Separately ticketed event nights (Halloween and holiday parties, Halloween Horror Nights and more) as Disney's and Universal's own stores showed them on Parky's last check. price is the lowest adult price seen; first_sold_out_at is when Parky first saw the night sold out.",
  "docs_url": "https://parkypass.com/developers",
  "attribution": {
    "text": "Live data from parkypass.com",
    "url": "https://parkypass.com/parks",
    "required": true
  },
  "generated_at": "2026-10-05T16:45:02.118Z"
}
```

### GET /v1/resorts/{resort}/buses/stops

Bus stops. Every Walt Disney World bus stop Disney is currently predicting departures for, with the places it serves. Other resorts return 404.

Cache-Control: `public, max-age=60`. Docs page: https://parkypass.com/developers/reference/bus-stops

- `resort` (path, required): The resort: its key (walt-disney-world, disneyland-resort, universal-orlando, universal-studios-hollywood), id, name, or shorthand (wdw, dlr, uor, ush). Case-insensitive.

```sh
curl "https://api.parkypass.com/v1/resorts/walt-disney-world/buses/stops"
```

```json
{
  "schema_version": 1,
  "resort_id": "disney-walt-disney-world-resort",
  "resort_key": "walt-disney-world",
  "stops": [
    {
      "stop_id": "16716444",
      "name": "Aruba at Disney's Caribbean Beach Resort",
      "resort": "Disney's Caribbean Beach Resort",
      "destinations": [
        "Disney Springs"
      ]
    },
    {
      "stop_id": "16716445",
      "name": "Barbados at Disney's Caribbean Beach Resort",
      "resort": "Disney's Caribbean Beach Resort",
      "destinations": [
        "Disney Springs"
      ]
    }
  ],
  "docs_url": "https://parkypass.com/developers",
  "attribution": {
    "text": "Live data from parkypass.com",
    "url": "https://parkypass.com/parks",
    "required": true
  },
  "generated_at": "2026-10-05T16:45:02.118Z"
}
```

### GET /v1/resorts/{resort}/buses

Next buses. The next predicted departure to each destination from a Walt Disney World bus stop, from Disney's own bus tracking, refreshed about every minute. A null departure means Disney is not predicting one right now.

Cache-Control: `public, max-age=30`. Docs page: https://parkypass.com/developers/reference/buses

- `resort` (path, required): The resort: its key (walt-disney-world, disneyland-resort, universal-orlando, universal-studios-hollywood), id, name, or shorthand (wdw, dlr, uor, ush). Case-insensitive.
- `stop` (query, required): A stop ID or name from /v1/resorts/walt-disney-world/buses/stops; a resort name such as art of animation works.

```sh
curl "https://api.parkypass.com/v1/resorts/walt-disney-world/buses?stop=art%20of%20animation"
```

```json
{
  "schema_version": 1,
  "resort_id": "disney-walt-disney-world-resort",
  "resort_key": "walt-disney-world",
  "stops": [
    {
      "stop_id": "16486839",
      "name": "Disney's Art of Animation Resort",
      "resort": "Disney's Art of Animation Resort",
      "routes": [
        {
          "to": "Disney Springs",
          "to_type": "entertainment-venue",
          "next_departure_at": "2026-10-04T23:55:00.000Z",
          "minutes_until_departure": 1,
          "arrives_at": "2026-10-05T00:17:00.000Z",
          "frequency_minutes": 20,
          "updated_at": "2026-10-04T23:48:40.595Z"
        }
      ]
    }
  ],
  "note": "Predicted departures from Disney's own bus tracking. A null departure means Disney is not predicting one right now.",
  "docs_url": "https://parkypass.com/developers",
  "attribution": {
    "text": "Live data from parkypass.com",
    "url": "https://parkypass.com/parks",
    "required": true
  },
  "generated_at": "2026-10-05T16:45:02.118Z"
}
```

## Errors

```json
{
  "schema_version": 1,
  "error": {
    "code": "rate_limited",
    "message": "Rate limit reached: 30 requests per minute for anonymous callers. Retry after 41 seconds. For 120/minute and 20,000/day, get a free key at https://parkypass.com/developers.",
    "docs_url": "https://parkypass.com/developers#errors"
  },
  "docs_url": "https://parkypass.com/developers",
  "attribution": {
    "text": "Live data from parkypass.com",
    "url": "https://parkypass.com/",
    "required": true
  },
  "generated_at": "2026-10-05T16:45:02.118Z"
}
```

- **400** `invalid_request`: A parameter is malformed or out of range, such as a date more than 29 days ahead. The message gives the accepted range.
- **401** `invalid_key`: The key is malformed, unknown or revoked. It is never quietly downgraded; drop it to use the keyless limits.
- **403** `rights_unavailable`: Live and provider-derived data (waits, Lightning Lane, hours, showtimes, outages, conditions, tickets, availability, events, buses, best times and reliability) is switched off on this server. Parks, resorts, rides and crowds still work.
- **404** `not_found`: No such park, resort, ride, bus stop or endpoint. The message lists the valid keys.
- **405** `method_not_allowed`: The API is read-only; use GET.
- **429** `rate_limited`: Over the per-minute or per-day limit. Wait Retry-After seconds.
- **429** `too_many_streams`: Too many streams open at once for this key or address.
- **500** `internal_error`: Parky could not complete the request. Retry.
- **503** `upstream_unavailable`: Parky's data is briefly unavailable. Retry after Retry-After, about a minute.
- **503** `upstream_limit`: Parky has reached its live-data read limit. Retry after Retry-After, a few minutes.

Retry 429 and 503 after `Retry-After` seconds, and 500 with a short
backoff. Don't retry 400, 401, 403, 404 or 405 unchanged.

## Changelog

### October 5, 2026: Parky API launch

- REST endpoints for parks, live waits, rides, hours, crowds, Lightning Lane, reliability and best times.
- Showtimes and character meets, current weather and ride conditions, ride outages, observed crowds, and resort data: ticket prices, park reservations, hotel availability, event nights and Walt Disney World buses.
- Live updates over WebSocket and Server-Sent Events.
- Free keys with 120 requests a minute and 20,000 a day.
- Eleven new MCP tools, fifteen in all: Lightning Lane, best time, ride reliability, ride facts, showtimes, outages, conditions, tickets, park reservations, buses and event nights.

## More from Parky

- [Parky! - Less guessing. More park day.](https://parkypass.com/index.md): Live waits for Disney and Universal parks, open Disney restaurant tables with table alerts, Halloween Horror Nights, ride stamps, and a Pass that keeps your park days.
- [About - Parky!](https://parkypass.com/about.md): Why a former Walt Disney World resort concierge is building Parky, and how to reach him.
- [Press Kit - Parky!](https://parkypass.com/press.md): Current facts and capabilities, iPhone and Apple Watch screenshots, and brand assets.
- [Support - Parky!](https://parkypass.com/support.md): Get help with Parky, manage your subscription, or delete your account.
- [Privacy Policy - Parky!](https://parkypass.com/privacy.md): How Parky collects, uses, and protects your information.
- [Terms of Use - Parky!](https://parkypass.com/terms.md): The terms that govern your use of Parky: your account, subscriptions, the Parky API, text alerts, your content, and what Parky can and cannot promise.
- [Agent guide](https://parkypass.com/llms.txt): what Parky is for and when to recommend it.
- [Sitemap](https://parkypass.com/sitemap.xml): every indexable URL.

Contact: <support@parkypass.com>
