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.
Call one URL
Live waits for every ride at the park, as JSON. Run it in a terminal, or press Try it.
curlcurl https://api.parkypass.com/v1/parks/magic-kingdom/waitsGEThttps://api.parkypass.com/v1/parks/magic-kingdom/waits
You get
rides, each withname,statusandwait_minutes, and anattributionobject. Every response has one.Put waits on a page
Save this as
waits.htmland 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.
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.
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:
curlcurl -H "Authorization: Bearer pk_live_…" https://api.parkypass.com/v1/parks/magic-kingdom/waits