Quickstart

Four short steps, about two minutes. No sign-up until the last one, and it is optional. Pick a park; every snippet on this page follows it.

  1. Call one URL

    Live waits for every ride at the park, as JSON. Run it in a terminal, or press Try it.

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

    GEThttps://api.parkypass.com/v1/parks/magic-kingdom/waits

    You get rides, each with name, status and wait_minutes, and an attribution object. Every response has one.

  2. Put waits on a page

    Save this as waits.html and open it in a browser. It works as it is.

    waits.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>

    You see every ride with its wait, and a “Live data from parkypass.com” link under the list. That link is the one condition of using the API: keep it on any page that shows the data.

  3. Make it live

    Swap the script for a WebSocket and the page updates itself. Parky sends the whole board once, then only the rides that change.

    waits.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>

    The list fills in a second, then changes on its own. Posted waits usually move every few minutes, so quiet minutes are normal. Live updates has every message.

  4. Get a key

    Optional. Without a key you get 30 requests a minute; a free key gives 120 and 20,000 a day. Create one, then send it with each request:

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