# Despegar Scraper | Hotels Flights Packages LatAm (`lentic_clockss/despegar-scraper`) Actor

Scrape Despegar LatAm hotels, flights, suggestions & packages. Extract prices, ratings, hotel IDs & offer URLs across AR/MX/CO and more. Export Excel/CSV/JSON. Unofficial — not affiliated with Despegar.

- **URL**: https://apify.com/lentic\_clockss/despegar-scraper.md
- **Developed by:** [kane liu](https://apify.com/lentic_clockss) (community)
- **Categories:** Travel, Lead generation, Automation
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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

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

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js/docs.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/integrations/mcp.md).

If your project is in a different language, use 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

## Despegar Scraper — Hotels, Flights & Packages (LatAm)

**Scrape Despegar hotel search, hotel detail, flight search, destination suggestions, and packages SEO pages across Latin American Despegar sites — then download structured results as Excel, CSV, or JSON.**

Use this Actor as a practical **Despegar hotels / flights data API** for LatAm price monitoring, OTA competitive research, and travel lead enrichment. Pick a country site (default `despegar.com.ar`), choose a mode, enter a destination or route, and get Dataset rows with names, prices, scores, product URLs, and trip metadata.

- Scrape **Despegar hotel search** by city / destination (with optional hotel-detail enrichment)
- Collect **flight search** offers (one-way / round-trip style routes)
- Resolve destinations via **suggestions** (GID lookup)
- Pull **packages SEO** landing signals where supported
- Cover LatAm hosts such as **Argentina, Mexico, Colombia, Chile, Brazil, Peru, Ecuador, Uruguay**
- Export to **Excel / CSV / JSON**, or connect Make, n8n, Zapier, Python, or the Apify API
- **Pay per event** — Actor start + each Dataset result; **platform usage is included** (you do not pay separate Apify compute on top)

> **Unofficial tool.** This Actor is not affiliated with, endorsed by, or sponsored by Despegar.com Corp or Despegar brand sites. It collects publicly reachable shopping / SEO surfaces and does **not** complete bookings or access private accounts.

---

### What does the Despegar Scraper do?

Despegar Scraper lets you **extract structured travel inventory from Despegar LatAm OTAs** without operating your own anti-bot browser fleet. Give it a destination (for example `Buenos Aires`), dates, and a mode, then start a run.

Under the hood, the Actor:

1. Validates your input (mode, country site, destination / route, dates, enrichment flags)
2. Enforces free-tier caps when you are on a free Apify plan
3. Calls a managed Cloud Run worker (`despegar-com`) that opens shopping pages with residential egress
4. Parses guest-visible hotel / flight / suggestion / packages signals into normalized records
5. Pushes Dataset rows ready for Excel / CSV / JSON export
6. Writes `RUN_SUMMARY` (and `ERROR_SUMMARY` on failure) to the key-value store

You run it like any other Apify Actor — schedule it, call it from the API, or plug it into automations.

---

### What Despegar data can I extract?

| Data | Suggestions | Hotels search | Hotel detail* | Flights search | Packages SEO |
| --- | :---: | :---: | :---: | :---: | :---: |
| Destination / GID / display | ✅ | ✅ | — | — | ✅ |
| Hotel name / hotelId | — | ✅ | ✅ | — | — |
| Price text / currency | — | ✅ | ✅ | ✅ | ✅ |
| Score / rating signals | — | ✅ | ✅ | — | — |
| Product / offer URL | — | ✅ | ✅ | ✅ | ✅ |
| Check-in / check-out | — | ✅ | ✅ | — | — |
| Origin / destination / trip type | — | — | — | ✅ | ✅ |
| Country site | ✅ | ✅ | ✅ | ✅ | ✅ |

\*Enable `enrichDetails` (+ `maxDetailHotels`) to visit a bounded number of hotel detail pages after search.

**Not shipped as successful scrapes (schema waivers):** `cars`, `transfers`, `activities` — selecting these returns a clear failure instead of fake empty success.

---

### Why scrape Despegar?

Despegar is one of the largest online travel platforms in Latin America. Teams scrape Despegar to:

- Monitor **hotel prices and availability** by city and stay dates
- Compare **flight offer signals** for popular LatAm routes
- Enrich catalogs with **destination GIDs** from suggestions
- Track **packages SEO** landing content for market research
- Feed BI dashboards, pricing tools, or AI agents with structured LatAm OTA rows

Compared with Despegar Actors that only collect **hotel reviews** or a single-country hotel SERP, this Actor covers **hotels + flights + suggestions + packages SEO** across multiple LatAm country sites in one input surface.

---

### How to scrape Despegar (no code required)

1. Create a free [Apify](https://apify.com/) account
2. Open [Despegar Scraper](https://apify.com/lentic_clockss/despegar-scraper)
3. Choose a **mode**: `hotelsSearch` (default), `hotelDetail`, `flightsSearch`, `suggestions`, or `packagesSeo`
4. Choose a **country site** (default `despegar.com.ar`)
5. Enter a **query** / destination (hotels) or **origin + destination** (flights)
6. *(Optional)* Set `checkin` / `checkout`, `enrichDetails`, or `destinationGid`
7. Click **Start** and download the Dataset as JSON, CSV, Excel, or JSONL

Start with `maxResults: 5–10` to verify the query, then scale up.

---

### How much does it cost to scrape Despegar?

This Actor uses **pay-per-event** pricing. You are charged for:

| Event | Price |
| --- | --- |
| Actor Start (`apify-actor-start`) | **$0.005** per start |
| Result (`apify-default-dataset-item`) | **$3.00 / 1,000** results (**$0.003** each) |

**Platform usage costs are included** — you do **not** pay separate Apify compute/proxy usage for this Actor on top of the event prices above.

#### Example cost estimates

| Results collected | Approx. event cost* |
| --- | ---: |
| 100 | ~$0.31 |
| 1,000 | ~$3.01 |
| 10,000 | ~$30.01 |

\*Assumes one Actor start at default memory billing for start events, plus `$0.003` per Dataset item. Exact start billing can scale with allocated memory (one start event per GB, minimum one).

Free Apify trial credit can cover a small test run — try `maxResults: 5` first.

#### Free-tier caps (Actor developer limits)

| Cap | Value |
| --- | --- |
| Free Apify-plan runs of this Actor | **10** total |
| Free results / run | **200** |
| Paying Apify users | Unlimited runs (schema max still applies) |

These limits are enforced in Actor code (set by the Actor developer, not Apify). When the run cap is hit, the Actor finishes successfully with `RUN_SUMMARY.status = FREE_TIER_LIMIT` and a clear status message.

---

### Input

Open the **Input** tab for the full form. Common fields:

| Field | Description |
| --- | --- |
| `mode` | `suggestions`, `hotelsSearch`, `hotelDetail`, `flightsSearch`, `packagesSeo` (plus unsupported waivers) |
| `countrySite` | LatAm host such as `despegar.com.ar` (default), `.mx`, `.co`, `.cl`, `.br`, `.pe`, `.ec`, `.uy` |
| `query` | City / place text for suggestions or hotel search |
| `destinationGid` | Optional Despegar GID (e.g. `CIT_982`) to skip suggestions lookup |
| `hotelId` | Required for `hotelDetail` |
| `checkin` / `checkout` | Stay dates (`YYYY-MM-DD`) |
| `origin` / `destination` | Flight / packages route fields |
| `tripType` | `roundtrip` or `oneway` for flights |
| `maxResults` | Cap on emitted Dataset rows |
| `enrichDetails` | Enrich hotel search hits with detail pages |
| `maxDetailHotels` | Bounded detail enrichment count |
| `workerBaseUrl` | Advanced allowlisted worker override (optional) |

#### Input example

```json
{
  "mode": "hotelsSearch",
  "countrySite": "despegar.com.ar",
  "query": "Buenos Aires",
  "checkin": "2026-08-20",
  "checkout": "2026-08-24",
  "maxResults": 20,
  "enrichDetails": false
}
````

***

### Output

Each Dataset item includes mode / site metadata plus fields such as:

| Field | Description |
| --- | --- |
| `mode` / `countrySite` | Collection mode and Despegar host |
| `name` / `title` / `display` | Hotel, offer, or suggestion label |
| `hotelId` / `gid` | Despegar identifiers when present |
| `priceText` / `currency` / `score` | Pricing and rating signals |
| `productUrl` | Public product / offer URL |
| `origin` / `destination` | Route fields for flights / packages |
| `checkin` / `checkout` | Stay dates |
| `capturedAt` | Capture timestamp |

Field presence depends on mode and what the public page exposes for that run.

***

### Coverage matrix

| Dimension | Coverage |
| --- | --- |
| Country sites | `despegar.com.ar` (default) + MX / CO / CL / BR / PE / EC / UY hosts in schema |
| Modes shipped | `suggestions` · `hotelsSearch` · `hotelDetail` · `flightsSearch` · `packagesSeo` |
| Waivers | `cars` / `transfers` / `activities` — clear error only (no fake success) |

**Notes:** SEO paths like `/hoteles/hl|h-` are marketing landings and are **not** the same as priced shopping SERP/PDP. Prefer shopping modes (`hotelsSearch` / `hotelDetail`) for offer-like prices.

***

### Architecture and proxy ownership

```text
Apify Actor (input, Dataset, free tier, Standby, PPE)
        │ HTTPS + WORKER_AUTH
        ▼
Cloud Run worker despegar-com (Patchright session, parse, OpenAPI)
        ▼
Despegar LatAm public shopping / SEO pages
```

`WORKER_PROVIDES_PROXY=1` is enabled by default. The Actor does not mint or transmit `proxyUrl`; proxy/egress is configured on the worker (including egress-control). Set `WORKER_BASE_URL` and secret `WORKER_AUTH` in Actor settings.

Default run memory: **1024 MB** (min 512).

***

### Run artifacts

| Key | Purpose |
| --- | --- |
| `INPUT_ECHO` | Normalized non-secret input and resolved worker source |
| `RUN_SUMMARY` | Worker, proxy source, free-tier, and record metrics |
| `ERROR_SUMMARY` | Structured failure before valid records are emitted |

***

### Integrations & API

- Schedule recurring Despegar hotel / flight pulls from Apify Console
- Call the Actor from Python, Node.js, or `curl` via the [Apify API](https://docs.apify.com/api/v2)
- Connect to Make, n8n, Zapier, Google Sheets, or your BI stack

#### API example

```bash
curl -X POST "https://api.apify.com/v2/acts/lentic_clockss~despegar-scraper/runs?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "mode": "hotelsSearch",
    "countrySite": "despegar.com.ar",
    "query": "Buenos Aires",
    "maxResults": 20
  }'
```

***

### FAQ

#### Is login required?

No. The Actor targets publicly reachable shopping / SEO surfaces via the managed worker.

#### Can it book hotels or flights?

No. Booking, payment, and account flows are intentionally excluded.

#### Why is my SEO hotel URL different from search results?

Despegar SEO hotel landings (`/hoteles/hl|h-`) are not the same stack as priced accommodations shopping results. Use `hotelsSearch` / `hotelDetail` for offer-oriented extraction.

#### Do cars, transfers, or activities work?

Not yet. Those modes are schema placeholders and fail with an explicit unsupported-mode error.

#### Do I pay Apify platform usage separately?

No for this Actor’s configured PPE plan — **User pays platform usage costs = No**. You pay the event prices above; platform usage is covered by the Actor developer.

***

### Legal & responsible use

Use this Actor only for lawful purposes and in line with Despegar terms and applicable laws. You are responsible for how you store and use the data. Prefer low-volume smoke inputs first (`maxResults: 2–5`).

***

### Support

Questions or feature requests: open an issue on the Actor page in Apify Console or contact the developer through Apify.

# Actor input Schema

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

Shipped modes collect data. cars/transfers/activities are schema waivers only and will fail with a clear error.

## `countrySite` (type: `string`):

LatAm Despegar host. Default AR. Other TLDs shopping parity not fully verified.

## `query` (type: `string`):

City or place text for suggestions / hotelsSearch (resolved via /suggestions).

## `destinationGid` (type: `string`):

Optional Despegar GID (e.g. CIT\_982). Skips suggestions lookup when set.

## `hotelId` (type: `string`):

Required for hotelDetail.

## `checkin` (type: `string`):

YYYY-MM-DD. Defaults to ~21 days ahead.

## `checkout` (type: `string`):

YYYY-MM-DD. Defaults to ~28 days ahead.

## `adults` (type: `integer`):

Number of adults for hotel/flight distribution.

## `children` (type: `integer`):

Number of children.

## `rooms` (type: `integer`):

Number of rooms.

## `origin` (type: `string`):

IATA (flights) or city slug (packagesSeo).

## `destination` (type: `string`):

IATA (flights) or city slug (packagesSeo).

## `departureDate` (type: `string`):

Flight departure date YYYY-MM-DD.

## `returnDate` (type: `string`):

Flight return date YYYY-MM-DD.

## `tripType` (type: `string`):

roundtrip or oneway for flightsSearch.

## `currency` (type: `string`):

Optional override (e.g. ARS).

## `maxResults` (type: `integer`):

Maximum dataset rows to collect.

## `maxPages` (type: `integer`):

Hotel SERP pages to walk (21 cards/page).

## `enrichDetails` (type: `boolean`):

When true, enrich top hotelSearch rows with detail pages.

## `enrichLimit` (type: `integer`):

How many hotels to enrich when enrichDetails is true.

## `maxReviews` (type: `integer`):

Max review items to attach on hotelDetail.

## `workerBaseUrl` (type: `string`):

Optional override for Cloud Run worker origin.

## Actor input object example

```json
{
  "mode": "hotelsSearch",
  "countrySite": "despegar.com.ar",
  "query": "Buenos Aires",
  "adults": 2,
  "children": 0,
  "rooms": 1,
  "tripType": "roundtrip",
  "maxResults": 21,
  "maxPages": 1,
  "enrichDetails": false,
  "enrichLimit": 3,
  "maxReviews": 0
}
```

# Actor output Schema

## `results` (type: `string`):

Normalized Despegar hotel / flight / suggestion rows from the default dataset.

## `runSummary` (type: `string`):

Structured summary record stored in the default key-value store.

## `inputEcho` (type: `string`):

Normalized input saved at run start.

## `errorSummary` (type: `string`):

Present when a failed run stores structured terminal error information.

# 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 = {
    "query": "Buenos Aires"
};

// Run the Actor and wait for it to finish
const run = await client.actor("lentic_clockss/despegar-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 = { "query": "Buenos Aires" }

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

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

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

```

## CLI example

```bash
echo '{
  "query": "Buenos Aires"
}' |
apify call lentic_clockss/despegar-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=lentic_clockss/despegar-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Despegar Scraper | Hotels Flights Packages LatAm",
        "description": "Scrape Despegar LatAm hotels, flights, suggestions & packages. Extract prices, ratings, hotel IDs & offer URLs across AR/MX/CO and more. Export Excel/CSV/JSON. Unofficial — not affiliated with Despegar.",
        "version": "0.1",
        "x-build-id": "3zmasSADM4s5oxlKs"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/lentic_clockss~despegar-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-lentic_clockss-despegar-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/lentic_clockss~despegar-scraper/runs": {
            "post": {
                "operationId": "runs-sync-lentic_clockss-despegar-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/lentic_clockss~despegar-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-lentic_clockss-despegar-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "mode": {
                        "title": "Mode",
                        "enum": [
                            "suggestions",
                            "hotelsSearch",
                            "hotelDetail",
                            "flightsSearch",
                            "packagesSeo",
                            "cars",
                            "transfers",
                            "activities"
                        ],
                        "type": "string",
                        "description": "Shipped modes collect data. cars/transfers/activities are schema waivers only and will fail with a clear error.",
                        "default": "hotelsSearch"
                    },
                    "countrySite": {
                        "title": "Country site",
                        "enum": [
                            "despegar.com.ar",
                            "despegar.com.mx",
                            "despegar.com.co",
                            "despegar.com.cl",
                            "despegar.com.br",
                            "despegar.com.pe",
                            "despegar.com.ec",
                            "despegar.com.uy"
                        ],
                        "type": "string",
                        "description": "LatAm Despegar host. Default AR. Other TLDs shopping parity not fully verified.",
                        "default": "despegar.com.ar"
                    },
                    "query": {
                        "title": "Query / destination text",
                        "type": "string",
                        "description": "City or place text for suggestions / hotelsSearch (resolved via /suggestions)."
                    },
                    "destinationGid": {
                        "title": "Destination GID",
                        "type": "string",
                        "description": "Optional Despegar GID (e.g. CIT_982). Skips suggestions lookup when set."
                    },
                    "hotelId": {
                        "title": "Hotel ID",
                        "type": "string",
                        "description": "Required for hotelDetail."
                    },
                    "checkin": {
                        "title": "Check-in",
                        "type": "string",
                        "description": "YYYY-MM-DD. Defaults to ~21 days ahead."
                    },
                    "checkout": {
                        "title": "Check-out",
                        "type": "string",
                        "description": "YYYY-MM-DD. Defaults to ~28 days ahead."
                    },
                    "adults": {
                        "title": "Adults",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Number of adults for hotel/flight distribution.",
                        "default": 2
                    },
                    "children": {
                        "title": "Children",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Number of children.",
                        "default": 0
                    },
                    "rooms": {
                        "title": "Rooms",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Number of rooms.",
                        "default": 1
                    },
                    "origin": {
                        "title": "Origin",
                        "type": "string",
                        "description": "IATA (flights) or city slug (packagesSeo)."
                    },
                    "destination": {
                        "title": "Destination",
                        "type": "string",
                        "description": "IATA (flights) or city slug (packagesSeo)."
                    },
                    "departureDate": {
                        "title": "Departure date",
                        "type": "string",
                        "description": "Flight departure date YYYY-MM-DD."
                    },
                    "returnDate": {
                        "title": "Return date",
                        "type": "string",
                        "description": "Flight return date YYYY-MM-DD."
                    },
                    "tripType": {
                        "title": "Trip type",
                        "enum": [
                            "roundtrip",
                            "oneway"
                        ],
                        "type": "string",
                        "description": "roundtrip or oneway for flightsSearch.",
                        "default": "roundtrip"
                    },
                    "currency": {
                        "title": "Currency",
                        "type": "string",
                        "description": "Optional override (e.g. ARS)."
                    },
                    "maxResults": {
                        "title": "Max results",
                        "minimum": 1,
                        "maximum": 200,
                        "type": "integer",
                        "description": "Maximum dataset rows to collect.",
                        "default": 21
                    },
                    "maxPages": {
                        "title": "Max hotel pages",
                        "minimum": 1,
                        "maximum": 20,
                        "type": "integer",
                        "description": "Hotel SERP pages to walk (21 cards/page).",
                        "default": 1
                    },
                    "enrichDetails": {
                        "title": "Enrich hotel details",
                        "type": "boolean",
                        "description": "When true, enrich top hotelSearch rows with detail pages.",
                        "default": false
                    },
                    "enrichLimit": {
                        "title": "Enrich limit",
                        "minimum": 0,
                        "maximum": 20,
                        "type": "integer",
                        "description": "How many hotels to enrich when enrichDetails is true.",
                        "default": 3
                    },
                    "maxReviews": {
                        "title": "Max reviews (detail)",
                        "minimum": 0,
                        "maximum": 50,
                        "type": "integer",
                        "description": "Max review items to attach on hotelDetail.",
                        "default": 0
                    },
                    "workerBaseUrl": {
                        "title": "Worker base URL override",
                        "type": "string",
                        "description": "Optional override for Cloud Run worker origin."
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
