# Expedia Hotels Scraper (`khadinakbar/expedia-hotels-scraper`) Actor

Scrape Expedia.com hotel search results by destination + dates (or a Hotel-Search URL): name, nightly price, total, star class, guest rating, review count, location, image, deal badges, and property URL. Filters for star, guest rating, and price. PPE. MCP-ready.

- **URL**: https://apify.com/khadinakbar/expedia-hotels-scraper.md
- **Developed by:** [Khadin Akbar](https://apify.com/khadinakbar) (community)
- **Categories:** Travel, MCP servers, Automation
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.00 / 1,000 hotel scrapeds

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 a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.md):

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

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.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/platform/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

## Expedia Hotels Scraper

Scrape **Expedia.com hotel search results** at scale. Give it a destination and dates (or a Hotel-Search URL) and get back clean, structured records for every hotel on the results pages — nightly price, total price, star class, guest rating, review count, location, image, deal badges, and the property URL.

Clears Expedia's anti-bot (PerimeterX + Akamai) with a stealth browser on residential proxies and reads the structured property-search data directly. **MCP-ready** for AI agents (Claude, ChatGPT, Gemini). Pay only for the hotels you keep.

### What you get

| Field | Description |
|---|---|
| `name` | Hotel name |
| `pricePerNight` | Lead nightly price (number, in `currency`) |
| `strikethroughPrice` | Was-price when a discount is shown |
| `totalPrice` | Total stay price for the date range |
| `priceLabel` | Price exactly as Expedia displays it (e.g. `$199`) |
| `currency` | Currency code label (default `USD`) |
| `starRating` | Property star class, 0–5 |
| `guestRating` | Guest review score, 0–10 |
| `guestRatingLabel` | Word score (e.g. `Wonderful`) |
| `reviewCount` | Number of guest reviews |
| `neighborhood` | Area / neighborhood when shown |
| `latitude`, `longitude` | Map coordinates when present |
| `image` | Lead photo URL |
| `freeCancellation` | True when the card advertises free cancellation / fully refundable |
| `propertyUrl` | Link to the hotel page on Expedia |
| `hotelId` | Expedia property ID |
| `position` | Result rank across the scraped pages |
| `searchQuery` | The destination you searched |
| `scrapedAt` | ISO 8601 timestamp |

### When to use it

- **Hotel price intelligence** — track nightly rates across a city and date range.
- **Travel market research** — star/guest-rating distribution, review volume, neighborhood spread.
- **Lead lists for travel tooling** — feed an itinerary builder, comparison site, or AI travel agent.
- **Revenue / competitive monitoring** — watch how a property ranks and prices versus its set.

Not what you need? For a single hotel's full detail or its reviews, use a dedicated hotel-detail / reviews actor — this one scrapes **search result pages**.

### Pricing

Pay-per-event (PPE):

| Event | Price |
|---|---|
| Actor start | $0.00005 |
| Hotel scraped | **$0.004** per hotel kept |

Hotels removed by your filters are **not** charged. A typical 50-hotel run costs about **$0.20**. Pay-per-usage (compute + proxy) is also available — pick whichever billing model suits your job size at run time.

### Input

Minimal — just a destination:

```json
{
  "destination": "New York, New York",
  "checkIn": "2026-07-15",
  "checkOut": "2026-07-17",
  "adults": 2,
  "maxResults": 50
}
````

Or scrape a search URL directly:

```json
{
  "startUrls": [
    "https://www.expedia.com/Hotel-Search?destination=Tokyo&startDate=2026-07-15&endDate=2026-07-17"
  ],
  "maxResults": 100
}
```

#### Input fields

| Field | Type | Default | Notes |
|---|---|---|---|
| `destination` | string | — | Place to search (city, region, landmark). |
| `checkIn` / `checkOut` | string `YYYY-MM-DD` | +14 / +16 days | Stay window. Auto-defaulted when omitted. |
| `adults` | integer | 2 | 1–14. Affects price. |
| `rooms` | integer | 1 | 1–8. |
| `startUrls` | array | — | Expedia Hotel-Search URLs (alternative to `destination`). |
| `maxResults` | integer | 50 | Cap across all pages. |
| `sortBy` | enum | `recommended` | `priceLowToHigh`, `starRating`, `guestRating`, `distance`. |
| `minStarRating` | integer | — | 0–5 filter. |
| `minGuestRating` | integer | — | 0–10 filter. |
| `minPrice` / `maxPrice` | integer | — | Nightly-price filters. |
| `freeCancellationOnly` | boolean | false | Keep only free-cancellation cards. |
| `currency` | string | `USD` | Output label. |
| `proxyConfiguration` | object | residential→datacenter | See proxies below. |

### Proxies & reliability

Expedia is protected by **Akamai Bot Manager**, which gates on IP reputation. **Residential proxies are required** — datacenter IPs are blocked. The actor automatically prefers **Apify Residential** and falls back to Apify datacenter (US) when residential is unavailable on your plan.

If a run is blocked, the actor **honest-fails**: it returns a single diagnostic record with a clear status message and **charges $0** — it never silently reports an empty success. Re-run, or run with residential proxies, to get data.

### Output example

```json
{
  "recordType": "hotel",
  "hotelId": "12345",
  "name": "The Manhattan Grand",
  "pricePerNight": 219,
  "totalPrice": 438,
  "currency": "USD",
  "starRating": 4,
  "guestRating": 8.6,
  "guestRatingLabel": "Wonderful",
  "reviewCount": 1842,
  "neighborhood": "Midtown",
  "freeCancellation": true,
  "propertyUrl": "https://www.expedia.com/h12345.Hotel-Information",
  "image": "https://...jpg",
  "position": 3,
  "searchQuery": "New York, New York",
  "scrapedAt": "2026-06-21T00:00:00.000Z"
}
```

### Use with AI agents (MCP)

This actor is exposed through the Apify MCP server as `apify--expedia-hotels-scraper`. Agents call it with a `destination` + dates and receive structured hotel records — ideal for travel-planning and price-comparison assistants. Output is flat and token-efficient; nulls are explicit.

### FAQ

**How does it get past Expedia's anti-bot?** A stealth browser clears Expedia's PerimeterX/Akamai challenge, then the actor captures the property-search GraphQL response for clean, structured data.

**Why do I need residential proxies?** Expedia's anti-bot blocks datacenter IPs. Residential (or mobile) IPs pass.

**How many hotels per search?** Expedia returns roughly 50 per result page; the actor paginates up to your `maxResults`.

**Can I scrape a single hotel's reviews?** Not with this actor — it scrapes search result pages. Use a dedicated reviews actor for that.

**Is pagination charged twice?** No. Hotels are de-duplicated by ID across pages; you're charged once per unique hotel kept.

**What if a destination has no hotels?** You get an empty dataset with a clear status message — and $0 in hotel charges.

### Legal

This actor collects **publicly available** data from Expedia.com search result pages. Use it in compliance with Expedia's Terms of Use and all applicable laws (including data-protection regulations such as GDPR/CCPA). Do not use scraped data to infringe intellectual-property rights or for any unlawful purpose. You are responsible for how you use the output. This actor is not affiliated with, endorsed by, or sponsored by Expedia, Inc. or the Expedia Group.

# Actor input Schema

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

Place to search hotels in, as you would type it on Expedia (e.g. 'New York, New York', 'Paris, France', 'Maldives'). City, region, neighborhood, or landmark all work. Leave empty if you instead provide 'startUrls'. This is NOT an Expedia URL — paste full Hotel-Search URLs into 'startUrls'.

## `checkIn` (type: `string`):

Check-in date in YYYY-MM-DD format (e.g. '2026-07-15'). Defaults to 14 days from today when omitted. Must be today or later. Ignored when you supply Hotel-Search 'startUrls' that already contain dates.

## `checkOut` (type: `string`):

Check-out date in YYYY-MM-DD format (e.g. '2026-07-17'). Defaults to 16 days from today (a 2-night stay) when omitted. Must be after 'checkIn'. Ignored when you supply Hotel-Search 'startUrls' that already contain dates.

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

Number of adult guests for pricing (e.g. 2). Defaults to 2. Range 1-14. This affects the per-night price Expedia returns.

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

Number of rooms to price (e.g. 1). Defaults to 1. Range 1-8. Most hotel-search use cases want 1.

## `startUrls` (type: `array`):

Full Expedia Hotel-Search result URLs to scrape directly, e.g. 'https://www.expedia.com/Hotel-Search?destination=Tokyo\&startDate=2026-07-15\&endDate=2026-07-17'. Use this instead of 'destination' when you have already built a filtered search on Expedia. Single hotel-information (detail) pages are NOT supported — this actor scrapes search result pages only.

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

Maximum number of hotels to return across all result pages (e.g. 50). Defaults to 50. The actor auto-paginates until it reaches this cap. Each returned hotel is one billed event.

## `sortBy` (type: `string`):

Result ordering Expedia applies before scraping (e.g. 'recommended'). Defaults to 'recommended'. Use 'priceLowToHigh' for budget research, 'guestRating' for quality. Ignored when 'startUrls' already encode a sort.

## `minStarRating` (type: `integer`):

Drop hotels below this property star class, 0-5 (e.g. 4 keeps only 4 and 5-star). Leave empty for no star filter. Hotels with an unknown star class are dropped when this is set. Filtered-out hotels are NOT billed.

## `minGuestRating` (type: `integer`):

Drop hotels whose guest rating is below this value on Expedia's 0-10 scale (e.g. 8 keeps 'Very good' and above). Leave empty for no guest-rating filter. Hotels with no rating yet are dropped when this is set. Filtered-out hotels are NOT billed.

## `minPrice` (type: `integer`):

Drop hotels priced below this nightly amount in the selected currency (e.g. 50). Leave empty for no minimum. Compared against the lead per-night price Expedia shows. Filtered-out hotels are NOT billed.

## `maxPrice` (type: `integer`):

Drop hotels priced above this nightly amount in the selected currency (e.g. 300). Leave empty for no maximum. Compared against the lead per-night price Expedia shows. Filtered-out hotels are NOT billed.

## `freeCancellationOnly` (type: `boolean`):

When true, keep only hotels whose card advertises free cancellation or a fully refundable rate. Defaults to false (keep all). This reads the card's badges/messages, not a guaranteed booking term. Filtered-out hotels are NOT billed.

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

ISO currency code label applied to the output records (e.g. 'USD'). Defaults to 'USD'. Expedia.com prices are typically shown in USD; this field labels the output, it does not re-quote prices. Use the matching code if you scrape a localized Expedia Hotel-Search URL.

## `proxyConfiguration` (type: `object`):

Proxy settings. RESIDENTIAL proxies are strongly recommended — Expedia's Akamai Bot Manager blocks datacenter IPs. The actor automatically prefers Apify residential when your account has it and falls back to Apify datacenter US when it does not, so the default works on any plan (datacenter runs are likely to be blocked and will honest-fail with $0 charged). Override only for a specific proxy requirement.

## Actor input object example

```json
{
  "destination": "Paris, France",
  "checkIn": "2026-07-15",
  "checkOut": "2026-07-17",
  "adults": 2,
  "rooms": 1,
  "startUrls": [
    "https://www.expedia.com/Hotel-Search?destination=Tokyo&startDate=2026-07-15&endDate=2026-07-17"
  ],
  "maxResults": 50,
  "sortBy": "recommended",
  "freeCancellationOnly": false,
  "currency": "USD",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

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

All hotel listing records found across the Hotel-Search result pages. Download as JSON, CSV, Excel, HTML, or RSS.

# 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 = {
    "destination": "New York, New York",
    "adults": 2,
    "rooms": 1,
    "maxResults": 50,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("khadinakbar/expedia-hotels-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 = {
    "destination": "New York, New York",
    "adults": 2,
    "rooms": 1,
    "maxResults": 50,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("khadinakbar/expedia-hotels-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 '{
  "destination": "New York, New York",
  "adults": 2,
  "rooms": 1,
  "maxResults": 50,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call khadinakbar/expedia-hotels-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Expedia Hotels Scraper",
        "description": "Scrape Expedia.com hotel search results by destination + dates (or a Hotel-Search URL): name, nightly price, total, star class, guest rating, review count, location, image, deal badges, and property URL. Filters for star, guest rating, and price. PPE. MCP-ready.",
        "version": "1.0",
        "x-build-id": "VLULhoVGx4bO442us"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/khadinakbar~expedia-hotels-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-khadinakbar-expedia-hotels-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/khadinakbar~expedia-hotels-scraper/runs": {
            "post": {
                "operationId": "runs-sync-khadinakbar-expedia-hotels-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/khadinakbar~expedia-hotels-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-khadinakbar-expedia-hotels-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": {
                    "destination": {
                        "title": "Destination",
                        "type": "string",
                        "description": "Place to search hotels in, as you would type it on Expedia (e.g. 'New York, New York', 'Paris, France', 'Maldives'). City, region, neighborhood, or landmark all work. Leave empty if you instead provide 'startUrls'. This is NOT an Expedia URL — paste full Hotel-Search URLs into 'startUrls'."
                    },
                    "checkIn": {
                        "title": "Check-in date",
                        "type": "string",
                        "description": "Check-in date in YYYY-MM-DD format (e.g. '2026-07-15'). Defaults to 14 days from today when omitted. Must be today or later. Ignored when you supply Hotel-Search 'startUrls' that already contain dates."
                    },
                    "checkOut": {
                        "title": "Check-out date",
                        "type": "string",
                        "description": "Check-out date in YYYY-MM-DD format (e.g. '2026-07-17'). Defaults to 16 days from today (a 2-night stay) when omitted. Must be after 'checkIn'. Ignored when you supply Hotel-Search 'startUrls' that already contain dates."
                    },
                    "adults": {
                        "title": "Adults",
                        "minimum": 1,
                        "maximum": 14,
                        "type": "integer",
                        "description": "Number of adult guests for pricing (e.g. 2). Defaults to 2. Range 1-14. This affects the per-night price Expedia returns.",
                        "default": 2
                    },
                    "rooms": {
                        "title": "Rooms",
                        "minimum": 1,
                        "maximum": 8,
                        "type": "integer",
                        "description": "Number of rooms to price (e.g. 1). Defaults to 1. Range 1-8. Most hotel-search use cases want 1.",
                        "default": 1
                    },
                    "startUrls": {
                        "title": "Expedia Hotel-Search URLs (optional)",
                        "type": "array",
                        "description": "Full Expedia Hotel-Search result URLs to scrape directly, e.g. 'https://www.expedia.com/Hotel-Search?destination=Tokyo&startDate=2026-07-15&endDate=2026-07-17'. Use this instead of 'destination' when you have already built a filtered search on Expedia. Single hotel-information (detail) pages are NOT supported — this actor scrapes search result pages only.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "maxResults": {
                        "title": "Max hotels",
                        "minimum": 1,
                        "maximum": 1000,
                        "type": "integer",
                        "description": "Maximum number of hotels to return across all result pages (e.g. 50). Defaults to 50. The actor auto-paginates until it reaches this cap. Each returned hotel is one billed event.",
                        "default": 50
                    },
                    "sortBy": {
                        "title": "Sort order",
                        "enum": [
                            "recommended",
                            "priceLowToHigh",
                            "starRating",
                            "guestRating",
                            "distance"
                        ],
                        "type": "string",
                        "description": "Result ordering Expedia applies before scraping (e.g. 'recommended'). Defaults to 'recommended'. Use 'priceLowToHigh' for budget research, 'guestRating' for quality. Ignored when 'startUrls' already encode a sort.",
                        "default": "recommended"
                    },
                    "minStarRating": {
                        "title": "Minimum star rating",
                        "minimum": 0,
                        "maximum": 5,
                        "type": "integer",
                        "description": "Drop hotels below this property star class, 0-5 (e.g. 4 keeps only 4 and 5-star). Leave empty for no star filter. Hotels with an unknown star class are dropped when this is set. Filtered-out hotels are NOT billed."
                    },
                    "minGuestRating": {
                        "title": "Minimum guest rating",
                        "minimum": 0,
                        "maximum": 10,
                        "type": "integer",
                        "description": "Drop hotels whose guest rating is below this value on Expedia's 0-10 scale (e.g. 8 keeps 'Very good' and above). Leave empty for no guest-rating filter. Hotels with no rating yet are dropped when this is set. Filtered-out hotels are NOT billed."
                    },
                    "minPrice": {
                        "title": "Minimum price per night",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Drop hotels priced below this nightly amount in the selected currency (e.g. 50). Leave empty for no minimum. Compared against the lead per-night price Expedia shows. Filtered-out hotels are NOT billed."
                    },
                    "maxPrice": {
                        "title": "Maximum price per night",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Drop hotels priced above this nightly amount in the selected currency (e.g. 300). Leave empty for no maximum. Compared against the lead per-night price Expedia shows. Filtered-out hotels are NOT billed."
                    },
                    "freeCancellationOnly": {
                        "title": "Free cancellation only",
                        "type": "boolean",
                        "description": "When true, keep only hotels whose card advertises free cancellation or a fully refundable rate. Defaults to false (keep all). This reads the card's badges/messages, not a guaranteed booking term. Filtered-out hotels are NOT billed.",
                        "default": false
                    },
                    "currency": {
                        "title": "Currency",
                        "type": "string",
                        "description": "ISO currency code label applied to the output records (e.g. 'USD'). Defaults to 'USD'. Expedia.com prices are typically shown in USD; this field labels the output, it does not re-quote prices. Use the matching code if you scrape a localized Expedia Hotel-Search URL.",
                        "default": "USD"
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Proxy settings. RESIDENTIAL proxies are strongly recommended — Expedia's Akamai Bot Manager blocks datacenter IPs. The actor automatically prefers Apify residential when your account has it and falls back to Apify datacenter US when it does not, so the default works on any plan (datacenter runs are likely to be blocked and will honest-fail with $0 charged). Override only for a specific proxy requirement.",
                        "default": {
                            "useApifyProxy": true
                        }
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
