# Theme Park Wait Times (Queue-Times.com) (`nickslam/queue-times-scraper`) Actor

Live theme park wait times from Queue-Times.com for 140+ parks worldwide. Rides, park crowd summaries, optional wait deltas for scheduled monitoring.

- **URL**: https://apify.com/nickslam/queue-times-scraper.md
- **Developed by:** [Nick](https://apify.com/nickslam) (community)
- **Categories:** Travel, Automation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-usage

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

### What does Theme Park Wait Times (Queue-Times.com) do?

This Actor reads the **public Queue-Times.com Real Time API** and turns it into clean, spreadsheet-ready Apify datasets. It covers **140+ amusement parks** worldwide (Disney, Universal, Six Flags, Merlin, Europa-Park, Efteling, and many more).

You get:

- **Live ride waits** — one row per attraction with open/closed status, wait minutes, land, park metadata, and timestamps
- **Park summaries** — median/mean/max wait of open rides, headliner pressure, stale-feed counts
- **Optional wait deltas** — compare to the previous scheduled run (`waitDeltaMinutes`, `statusChanged`)

It is ideal for **alerts, travel apps, dashboards, tourism analytics, and AI agents** that need CORS-free JSON. Schedule it every 5–15 minutes to build your own wait-time history (the public API is live-only).

Powered by: [Queue-Times.com](https://queue-times.com/).

### Why use this Actor?

- **No browser scraping** — official JSON endpoints, stable park/ride IDs, ~5 minute refresh
- **Flattened output** — nested `lands → rides` becomes one dataset row per ride
- **Crowd proxies** — park-level median/mean/max waits for metro pickers and demand indexes
- **Schedule-friendly** — delta mode stores prior state in the Actor key-value store
- **Apify platform** — API access, scheduling, webhooks, integrations, monitoring

### How to use Theme Park Wait Times

1. Open the Actor in [Apify Console](https://console.apify.com/)
2. Choose a **mode** (live rides, park summaries, both, or catalog)
3. Pick parks, countries, and/or operators from the **multi-select** lists (or leave them empty for all parks)
4. Click **Start**
5. Download the dataset as JSON, CSV, Excel, or HTML — or call the Actor via API

For continuous monitoring, create a **Schedule** every 10 minutes and enable **Compute wait deltas**.

### Input

See the **Input** tab for the full form. Parks, countries, and operators are **multi-select dropdowns** — no IDs or free typing required.

| Field | Meaning |
| --- | --- |
| `mode` | Live rides, park summaries, both, or catalog only |
| `parkIds` | Multi-select parks (shown as “Park name (Country)”) |
| `countries` | Multi-select countries |
| `operators` | Multi-select operators (Disney, Universal, Merlin, …) |
| `includeClosed` | Keep closed attractions (default true) |
| `minWaitMinutes` | Keep only longer open waits |
| `openParksOnly` | Skip parks where everything is closed |
| `computeDeltas` | Fill wait/status deltas vs previous run |

Leave Parks / Countries / Operators empty to fetch **all** parks. If you select any combination, a park is included when it matches **any** selected park, country, or operator.

Example input:

```json
{
    "mode": "all",
    "parkIds": ["6", "16", "334"],
    "includeClosed": true,
    "computeDeltas": true
}
```

### Output

You can download the dataset in JSON, HTML, CSV, or Excel.

#### Ride row example

```json
{
    "type": "ride",
    "snapshotAt": "2026-08-25T21:35:39.000Z",
    "parkId": 6,
    "parkName": "Disney Magic Kingdom",
    "operator": "Walt Disney Attractions",
    "country": "United States",
    "continent": "North America",
    "timezone": "America/New_York",
    "landName": "Tomorrowland",
    "rideId": 11527,
    "rideName": "TRON Lightcycle / Run",
    "isOpen": true,
    "waitMinutes": 60,
    "waitBucket": "45+",
    "staleMinutes": 0,
    "waitDeltaMinutes": -10,
    "statusChanged": false,
    "sourceUrl": "https://queue-times.com/parks/6/queue_times.json",
    "parkPageUrl": "https://queue-times.com/parks/6",
    "attribution": "Powered by Queue-Times.com",
    "attributionUrl": "https://queue-times.com/"
}
```

#### Park summary example

```json
{
    "type": "parkSummary",
    "parkId": 6,
    "parkName": "Disney Magic Kingdom",
    "openRideCount": 30,
    "closedRideCount": 14,
    "medianWaitOpen": 10,
    "meanWaitOpen": 14.5,
    "maxWaitOpen": 60,
    "ridesWaitGe30": 6,
    "longestRideName": "TRON Lightcycle / Run",
    "longestWaitMinutes": 60,
    "isLikelyOpen": true,
    "attribution": "Powered by Queue-Times.com"
}
```

### Data fields

| Field                                             | Description                          |
| ------------------------------------------------- | ------------------------------------ |
| `waitMinutes`                                     | Posted wait in minutes               |
| `isOpen`                                          | Whether the attraction is open       |
| `staleMinutes`                                    | Minutes since `lastUpdated`          |
| `waitBucket`                                      | `0`, `1-15`, `16-30`, `31-45`, `45+` |
| `medianWaitOpen` / `meanWaitOpen` / `maxWaitOpen` | Park crowd proxy (open rides only)   |
| `waitDeltaMinutes`                                | Change vs previous run (delta mode)  |
| `attribution`                                     | Required credit string               |

**Note:** `waitMinutes: 0` with `isOpen: false` means closed, not a walk-on. Meet-and-greets and restaurants appear next to coasters. Single-rider lines are separate ride records.

### How much does it cost?

This Actor uses light HTTP requests only (no browser). A run for a handful of parks finishes in seconds on **512 MB**. Fetching all ~140 parks typically stays well under **0.05 compute units**.

On the Apify free plan you can run it regularly for personal use. For Store monetization, pay-per-result or rental can be configured in the Publication tab.

### Tips

- Stay at or below the source refresh cadence (**~5 minutes**)
- Prefer selecting a few parks over a full-catalog run when you only need specific resorts
- Use `openParksOnly: true` on global schedules to skip overnight closed parks
- Build history yourself by scheduling snapshots — calendar HTML on the website is not part of the documented Real Time API and is not scraped here
- Always show **Powered by Queue-Times.com** in user-facing products

### FAQ and disclaimer

**Is this official park data?**\
Queue-Times aggregates live waits from park systems. This Actor wraps their public Real Time API and is **not affiliated** with Disney, Universal, Six Flags, Merlin, or Queue-Times.com.

**Do I need an API key?**\
No. Queue-Times requires attribution (and suggests Patreon sponsorship if you can afford it).

**Why not scrape crowd calendars?**\
Historical calendars and detailed ride curves are website features (often Cloudflare- or login-gated). This Actor only uses documented/public JSON so it stays reliable for the Store.

**Support**\
Open an issue on the Actor's Issues tab in Apify Console, or fork and extend for alerts / MCP / tourism indexes.

Powered by [Queue-Times.com](https://queue-times.com/).

# Actor input Schema

## `mode` (type: `string`):

What to output. Live rides = one row per attraction. Park summaries = one row per park with crowd stats. All = both. Catalog = park metadata only (no live waits).

## `parkIds` (type: `array`):

Select one or more parks. Leave empty to use country/operator filters, or all parks if those are empty too.

## `countries` (type: `array`):

Optional. Include all parks in these countries (combined with Parks and Operators if also set).

## `operators` (type: `array`):

Optional. Include all parks from these operators (e.g. Walt Disney Attractions, Universal Parks & Resorts).

## `includeClosed` (type: `boolean`):

Keep rides that are currently closed. Useful for downtime monitoring.

## `minWaitMinutes` (type: `integer`):

Only keep open rides with at least this many minutes of wait. Closed rides are dropped when this is greater than 0.

## `openParksOnly` (type: `boolean`):

Skip parks where every attraction is closed (for example overnight in another timezone).

## `computeDeltas` (type: `boolean`):

Compare against the previous run and fill waitDeltaMinutes / statusChanged. Best with a schedule on the same Actor task.

## `maxConcurrency` (type: `integer`):

Parallel park requests (advanced).

## `requestDelayMs` (type: `integer`):

Extra delay after each park fetch (advanced).

## Actor input object example

```json
{
  "mode": "liveRides",
  "parkIds": [
    "6",
    "16"
  ],
  "includeClosed": true,
  "minWaitMinutes": 0,
  "openParksOnly": false,
  "computeDeltas": false,
  "maxConcurrency": 8,
  "requestDelayMs": 50
}
```

# Actor output Schema

## `dataset` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "mode": "liveRides",
    "parkIds": [
        "6",
        "16"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("nickslam/queue-times-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "mode": "liveRides",
    "parkIds": [
        "6",
        "16",
    ],
}

# Run the Actor and wait for it to finish
run = client.actor("nickslam/queue-times-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "mode": "liveRides",
  "parkIds": [
    "6",
    "16"
  ]
}' |
apify call nickslam/queue-times-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,nickslam/queue-times-scraper"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/uHrZr5C0GJ2Z8vFFv/builds/RkjZhC012fvX8LETi/openapi.json
