# Oyo Hotel Listings Extractor (`kawsar/oyo-hotel-listings-extractor`) Actor

OYO hotel scraper that extracts hotel listings, live room prices, guest ratings, amenities, and location data from any city by search URL or city ID, so travel and revenue teams can gather OYO data without copying it by hand.

- **URL**: https://apify.com/kawsar/oyo-hotel-listings-extractor.md
- **Developed by:** [Kawsar](https://apify.com/kawsar) (community)
- **Categories:**
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.99 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#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.

- **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

## OYO Hotel Listings Extractor: Scrape OYO Hotels, Prices, and Ratings

OYO Hotel Listings Extractor is an OYO hotel scraper that pulls complete hotel listings straight from OYO search results. Give it an OYO search URL or a city ID with your travel dates, and it returns every hotel in that city with live room prices, guest ratings, amenities, photos, and exact map coordinates. There is no manual copying and no browser clicking, just clean structured hotel data you can export and use right away.

The actor talks to the same search API the OYO website uses, pages through all the results for you, and returns one tidy record per hotel that drops straight into a spreadsheet, a dashboard, or a database.

### Why use this actor

Checking OYO prices by hand is slow, and the numbers change with your dates. This actor does the boring part for you. Point it at a city, set your check-in and check-out, and you get the full list of properties with the price you would actually pay, the crossed-out original price, and the guest rating next to each one. Run it once for a snapshot, or schedule it to watch how prices move over days and weeks.

- Search a whole city in one run, not one hotel at a time
- Prices reflect your exact dates, so you see real bookable rates
- Both the current price and the original slashed price are captured
- Output is ready for Excel, Google Sheets, Power BI, or your own code
- Runs on a schedule and connects to Make, Zapier, and 5000+ other tools

### Use cases

- **Hotel price monitoring**: track OYO room prices and discounts across a city so you can spot rate changes over time and act on them.
- **Competitor rate research**: see how nearby OYO properties are priced and rated before you set your own room rates.
- **Travel and market analysis**: build a dataset of budget hotels by city, category, and guest rating for reports or dashboards.
- **Supplier and lead lists**: collect OYO hotel names, addresses, phone-free contact points, and map links in one export.
- **Data enrichment**: add live ratings, amenities, and coordinates to an existing list of hotels you already track.
- **Academic and market studies**: gather structured budget-hotel data across regions for pricing or hospitality research.

### How to use OYO Hotel Listings Extractor

1. Open [oyorooms.com](https://www.oyorooms.com) and search for the city you want.
2. Copy the search URL from your browser address bar.
3. Paste it into the **OYO search URLs** field of this actor.
4. Set your **check-in** and **check-out** dates (or leave them empty to use tomorrow and the day after).
5. Set **Maximum hotels** to control how many listings you collect.
6. Click **Start** and download your results as JSON, CSV, or Excel when the run finishes.

You do not have to use a URL. If you already know the OYO **city ID** (the `filters[city_id]` value in any search URL), you can type it into the **City ID** field instead and skip the copy-paste.

### Input

You can provide an OYO search URL, or a city ID with dates. If both are given, the URLs take priority.

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `startUrls` | array | empty | OYO search result page URLs. The actor reads the city and stay dates from each URL. Add several to scrape multiple cities in one run. |
| `cityId` | string | empty | OYO internal city ID, used when no URL is given. Found as `filters[city_id]` in a search URL (for example, `12` is Chennai). |
| `checkIn` | string | tomorrow | Check-in date in DD/MM/YYYY format. A date read from a URL takes priority. |
| `checkOut` | string | day after check-in | Check-out date in DD/MM/YYYY format. A date read from a URL takes priority. |
| `roomsConfig` | string | `1,0,0` | Rooms and guests as adults,children,rooms. For example, `2,1,1` means two adults, one child, one room. |
| `locale` | string | `en` | Response language for hotel content. Supports English, Hindi, Indonesian, Malay, and Arabic. |
| `maxItems` | integer | 100 | Maximum hotels to extract per run. Hard cap is 1000. |
| `requestTimeoutSecs` | integer | 30 | Per-request timeout in seconds. |
| `proxyConfiguration` | object | Datacenter (Anywhere) | Proxy type and location for requests. Supports Datacenter, Residential, Special, and custom proxies. Optional. |

#### Example input

```json
{
    "startUrls": [
        "https://www.oyorooms.com/search/?location=Chennai%2C+Tamil+Nadu%2C+India&filters%5Bcity_id%5D=12&country=india"
    ],
    "checkIn": "05/09/2026",
    "checkOut": "06/09/2026",
    "roomsConfig": "1,0,0",
    "maxItems": 100,
    "proxyConfiguration": { "useApifyProxy": true }
}
```

### What data does this actor extract?

The actor stores one record per hotel in the dataset. A sample record looks like this:

```json
{
    "hotelId": "381241",
    "oyoId": "CHN2698",
    "name": "Hotel O Red Hill Chennai",
    "hotelNameWithoutCategory": "Red Hill Chennai",
    "category": "POP",
    "hotelType": "Hotel",
    "status": "Live",
    "address": "Plot No 911, Redhills, Chennai",
    "street": "Plot No 911, Vishwa 5th Cross Street",
    "city": "Chennai",
    "countryName": "India",
    "geoLocation": "Redhills",
    "latitude": 13.1910171,
    "longitude": 80.1601531,
    "mapLink": "https://google.co.in/maps?q=13.1910171,80.1601531",
    "suggestedPrice": 2892,
    "slasherPrice": 4131,
    "extraBedPrice": 468,
    "currencyCode": "INR",
    "currencySymbol": "₹",
    "ratingValue": 4.4,
    "ratingCount": 118,
    "ratingLevel": "verygood",
    "amenities": ["Free Wifi", "AC", "TV", "Power backup", "Geyser"],
    "bestImage": "https://images.oyoroomscdn.com/uploads/hotel_image/381241/rxnyfwlioduj.jpg",
    "images": ["https://images.oyoroomscdn.com/uploads/hotel_image/381241/rxnyfwlioduj.jpg"],
    "hotelUrl": "https://www.oyorooms.com/CHN2698/",
    "sourceCityId": "12",
    "checkIn": "05/09/2026",
    "checkOut": "06/09/2026",
    "scrapedAt": "2026-09-05T10:00:00+00:00"
}
```

| Field | Type | Description |
|-------|------|-------------|
| `hotelId` | string | OYO internal numeric hotel ID. |
| `oyoId` | string | Public OYO hotel code, for example CHN2698. |
| `name` | string | Full hotel name including the OYO category label. |
| `hotelNameWithoutCategory` | string | Hotel name without the category prefix. |
| `category` | string | OYO product category such as POP, Townhouse, or Collection O. |
| `hotelType` | string | Property type, for example Hotel or Home. |
| `status` | string | Listing availability status returned by OYO. |
| `address` | string | Full street address of the hotel. |
| `street` | string | Street portion of the address. |
| `city` | string | City where the hotel is located. |
| `countryName` | string | Country where the hotel is located. |
| `geoLocation` | string | Neighborhood or area label. |
| `latitude` | number | Latitude coordinate. |
| `longitude` | number | Longitude coordinate. |
| `mapLink` | string | Google Maps link to the location. |
| `suggestedPrice` | number | Current nightly price for the default occupancy. |
| `slasherPrice` | number | Original crossed-out price before discount. |
| `extraBedPrice` | number | Price of an extra bed for the stay. |
| `currencyCode` | string | ISO currency code, for example INR. |
| `currencySymbol` | string | Currency symbol used in the listing. |
| `ratingValue` | number | Average guest rating. |
| `ratingCount` | integer | Number of guest ratings. |
| `ratingLevel` | string | Rating label such as verygood or excellent. |
| `amenities` | array | Amenity names available at the hotel. |
| `bestImage` | string | URL of the primary hotel image. |
| `images` | array | All hotel image URLs. |
| `hotelUrl` | string | Direct link to the hotel page on oyorooms.com. |
| `sourceCityId` | string | City ID used for the search that returned this hotel. |
| `checkIn` | string | Check-in date used for pricing and availability. |
| `checkOut` | string | Check-out date used for pricing and availability. |
| `scrapedAt` | string | UTC timestamp when the record was extracted. |

### How it works

1. It reads the city and dates from each search URL you provide, or from the city ID and dates you enter.
2. It calls OYO's public search API for that city and stay period.
3. It pages through the results in batches until it reaches the total count or your `maxItems` limit.
4. It cleans each raw hotel object into a flat, consistent record with prices, ratings, amenities, and coordinates.
5. It saves every record to the dataset, ready to download or push to your own systems.

### Tips for best results

- **Set real dates.** Prices depend on check-in and check-out, so use the dates you actually care about.
- **Scrape several cities at once.** Add multiple search URLs to `startUrls` and the actor processes each one in order.
- **Keep runs small while testing.** Start with a low `maxItems` value to preview the data before a full run.
- **Switch proxies if blocked.** The default datacenter proxy works for most runs; move to residential proxies if you see failures.
- **Schedule it.** Use Apify Schedules to run daily and build a price history over time.

### Output formats and exporting

Results are stored in an Apify dataset. You can download them as JSON, CSV, Excel, HTML, or XML from the run's **Storage** tab, or fetch them programmatically through the [Apify API](https://docs.apify.com/api/v2). The overview table view shows the key columns (OYO ID, name, city, category, price, rating, and URL) at a glance.

### Integrations

Connect OYO Hotel Listings Extractor with other apps and services using [Apify integrations](https://apify.com/integrations). You can integrate with Make, Zapier, Slack, Airbyte, GitHub, Google Sheets, Google Drive, and many more. You can also use [webhooks](https://docs.apify.com/integrations/webhooks) to trigger actions whenever results are available, for example sending fresh prices to a spreadsheet after each scheduled run.

### FAQ

**Where do I find the city ID?**
Search any city on oyorooms.com, then look at the address bar. The number after `filters[city_id]` is the city ID. You can also paste the whole search URL into `startUrls` and skip the lookup entirely.

**Can I scrape more than one city in a single run?**
Yes. Add several OYO search URLs to `startUrls` and the actor processes each until it reaches `maxItems`.

**Does it return live prices?**
Yes. Prices depend on your check-in and check-out dates, so set them to the dates you want. Both the current price and the original slashed price are included.

**How many hotels can it return per run?**
Up to 1000 per run. Use `maxItems` to keep runs small and fast when you only need a sample.

**Do I need a proxy?**
Not always. The default datacenter proxy works for most runs. Switch to residential proxies if you start seeing blocks.

**In what currency are prices returned?**
Prices come back in the local currency of the searched city, with both the ISO code (for example INR) and the symbol included in every record.

**Is this actor allowed to scrape OYO?**
The actor collects publicly available listing data. You are responsible for using the data in line with OYO's terms and any laws that apply to you.

### Legal and responsible use

This actor extracts publicly accessible information from OYO search results. It does not collect personal data, and it does not bypass logins or paywalls. Please review OYO's terms of service and use the collected data responsibly and in compliance with applicable laws.

Start extracting OYO hotel listings, prices, and ratings today, and turn OYO search pages into a clean dataset you can actually work with.

# Actor input Schema

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

One or more OYO search result page URLs. The actor reads the city and stay dates directly from each URL. Copy the URL from your browser after searching a city on oyorooms.com. Leave empty to use the City ID field below instead.

## `cityId` (type: `string`):

OYO internal city ID to search when no URL is provided. Find it in an OYO search URL as the value of filters\[city\_id] (for example 12 is Chennai). Ignored when OYO search URLs are supplied above.

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

Check-in date in DD/MM/YYYY format. Defaults to tomorrow when left empty. A date read from a search URL takes priority.

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

Check-out date in DD/MM/YYYY format. Defaults to the day after check-in when left empty. A date read from a search URL takes priority.

## `roomsConfig` (type: `string`):

Room and guest configuration as adults,children,rooms. For example 1,0,0 means one adult, no children, one room.

## `locale` (type: `string`):

Response language for hotel content.

## `maxItems` (type: `integer`):

Maximum number of hotels to extract per run across all searches. Keeps runs fast and predictable.

## `requestTimeoutSecs` (type: `integer`):

Maximum time to wait for each API request before giving up.

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

Select proxies to use for requests. Helps avoid IP blocking and rate limits. Datacenter proxies are fastest; Residential proxies are harder to detect.

## Actor input object example

```json
{
  "startUrls": [
    "https://www.oyorooms.com/search/?location=Chennai%2C+Tamil+Nadu%2C+India&filters%5Bcity_id%5D=12&country=india"
  ],
  "cityId": "12",
  "checkIn": "05/09/2026",
  "checkOut": "06/09/2026",
  "roomsConfig": "1,0,0",
  "locale": "en",
  "maxItems": 100,
  "requestTimeoutSecs": 30,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `properties` (type: `string`):

OYO hotel listings extracted from the search results, including prices, ratings, amenities, and location data.

# 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 = {
    "startUrls": [
        "https://www.oyorooms.com/search/?location=Chennai%2C+Tamil+Nadu%2C+India&filters%5Bcity_id%5D=12&country=india"
    ],
    "roomsConfig": "1,0,0",
    "maxItems": 100,
    "requestTimeoutSecs": 30,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("kawsar/oyo-hotel-listings-extractor").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 = {
    "startUrls": ["https://www.oyorooms.com/search/?location=Chennai%2C+Tamil+Nadu%2C+India&filters%5Bcity_id%5D=12&country=india"],
    "roomsConfig": "1,0,0",
    "maxItems": 100,
    "requestTimeoutSecs": 30,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("kawsar/oyo-hotel-listings-extractor").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 '{
  "startUrls": [
    "https://www.oyorooms.com/search/?location=Chennai%2C+Tamil+Nadu%2C+India&filters%5Bcity_id%5D=12&country=india"
  ],
  "roomsConfig": "1,0,0",
  "maxItems": 100,
  "requestTimeoutSecs": 30,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call kawsar/oyo-hotel-listings-extractor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,kawsar/oyo-hotel-listings-extractor"
        }
    }
}

```

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/7PmPB76V9f4NBPOCE/builds/1Cicc57g6tv4UbPSM/openapi.json
