Wego Scraper - MENA Hotel Deals, Rates & Reviews
Pricing
from $1.50 / 1,000 hotel records
Wego Scraper - MENA Hotel Deals, Rates & Reviews
Scrape Wego hotels by city or search URL. Get rates, providers, booking links, coordinates, scores, images and property details. Optionally fetch guest review text, ratings, dates and public author details.
Pricing
from $1.50 / 1,000 hotel records
Rating
0.0
(0)
Developer
Abot API
Maintained by CommunityActor stats
1
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Share
Wego Hotel Scraper
Find Wego hotel rates by city and stay dates, or paste hotel search links. Each dataset row contains a hotel, its cheapest available rate for that stay, and links to the hotel and booking offer. Optional profile and guest review fields add more detail when you need them.
Why This Scraper?
- Search multiple cities or use Wego hotel search links with your chosen dates and guests.
- Compare quoted amounts, taxes, providers, room types and cancellation terms.
- Get location, star class, review scores and the image URLs available with each result.
- Add hotel contact details, amenities, policies and property information with
fetchDetails. - Add guest review text, ratings, dates and public author details with
fetchReviews. - Track changes across scheduled runs or resume an interrupted run without repeating earlier rows.
Use Cases
- Travel deal sites and content teams: pull the cheapest currently quoted rate for popular MENA cities to publish rate roundups and deal alerts.
- Rate shoppers and revenue managers: watch a specific hotel's quoted rate across a stay window with Incremental mode, and get notified only when the price actually moves.
- OTAs and metasearch aggregators: mirror Wego's own provider, room type and cancellation terms for a city into your own comparison tool or dataset.
- Corporate and group travel planners: shortlist hotels by star class, price band and free cancellation, then add contact details, amenities and policies with
fetchDetails. - Market researchers: build a dataset of prices, star classes and review scores across MENA cities for hospitality market analysis.
- Review and reputation tools: collect guest review text, ratings and public author details per hotel with
fetchReviews.
Data You Get
| Field | Example |
|---|---|
hotelId | 000001 |
name | Sample City Hotel |
url | Wego hotel page link |
star | 4 |
cityName | Dubai |
latitude | 25.0000 |
longitude | 55.0000 |
imageUrl | Primary hotel image URL |
imageUrls | Every image URL available with the result |
imagesCount | 50, the reported image count, which may exceed available URLs |
reviewScore | 85 out of 100 |
reviewCount | 100 |
reviewBreakdown | Scores and counts by guest group |
priceAmount | 180 in the quoted currency |
priceCurrency | USD |
totalAmountUsd | 180 |
taxAmountUsd | 20 |
providerCode | example-provider |
roomType | Standard room |
freeCancellation | true |
address | Available with fetchDetails |
amenities | Available with fetchDetails |
reviews | Guest reviews when fetchReviews is on |
reviewsFetched | Number of guest reviews returned for this hotel |
How to Use
Search a city
{"mode": "search","locations": ["Dubai"],"checkIn": "2026-10-01","checkOut": "2026-10-03","maxItems": 20}
Compare several cities with filters
{"mode": "search","locations": ["Dubai", "Doha"],"checkIn": "2026-10-01","checkOut": "2026-10-03","starRatings": ["4", "5"],"maxPriceUsd": 300,"maxItems": 30}
Fetch hotel profiles and guest reviews
{"mode": "search","locations": ["Dubai"],"checkIn": "2026-10-01","checkOut": "2026-10-03","fetchDetails": true,"fetchReviews": true,"maxReviewsPerHotel": 20,"maxItems": 5}
Use hotel search links
{"mode": "url","urls": ["https://www.wego.com/en/hotels/searches/dxb/2026-10-01/2026-10-03?guests=2"],"maxItems": 20}
Hotel detail page links are not accepted as input. Results and prices depend on availability for the selected stay. imageUrls contains URLs supplied with the result; imagesCount is a separate reported count.
Each hotel is tracked by its own id within a run, not by the stay dates or guest count in the link that found it. If you paste two search links for the same city with different dates or guest counts, the second link's row for a hotel the first link already found in that run is dropped as a duplicate, even though its rate is for a different stay. For example, one link for Dubai in October and a second link for Dubai in November in the same run will only return the October rate for any hotel both links find. Run separate actor runs when you need rates for the same city across more than one stay window.
Run it from your code
Python:
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("abotapi/wego-com-scraper").call(run_input={"mode": "search","locations": ["Dubai"],"checkIn": "2026-10-01","checkOut": "2026-10-03"})for hotel in client.dataset(run["defaultDatasetId"]).iterate_items():print(hotel["name"], hotel["priceAmount"], hotel["priceCurrency"])
JavaScript:
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });const run = await client.actor('abotapi/wego-com-scraper').call({mode: 'search',locations: ['Dubai'],checkIn: '2026-10-01',checkOut: '2026-10-03'});const { items } = await client.dataset(run.defaultDatasetId).listItems();
Or connect it to Make, Zapier, n8n, Google Sheets or webhooks from the Integrations tab.
Input Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
mode | string | search | Search by city or use url for hotel search links. |
locations | array | Dubai | City names in search mode. |
checkIn | string | about a week from today | Stay start in search mode. |
checkOut | string | two nights after check-in | Stay end in search mode. |
rooms | integer | 1 | Rooms in search mode. |
adults | integer | 2 | Adults in search mode. |
currency | string | USD | Currency for quoted rates. |
urls | array | example search link | Wego hotel search links in URL mode. |
starRatings | array | none | Keep selected star classes. |
minPriceUsd | integer | none | Minimum quoted price in USD. |
maxPriceUsd | integer | none | Maximum quoted price in USD. |
freeCancellationOnly | boolean | false | Keep offers with free cancellation. |
sortBy | string | popularity | Order returned hotels. |
fetchDetails | boolean | true | Add the hotel profile. One enrichment event per committed profile. |
fetchReviews | boolean | false | Add guest review records. |
maxReviewsPerHotel | integer | 20 | Review cap per hotel; 0 skips review reads. |
maxItems | integer | 20 | Maximum hotel rows; 0 means unlimited. |
maxPages | integer | 0 | Maximum feed polls per city; 0 means no user-set poll limit (an internal ceiling per city still applies). |
resumeFromRunId | string | none | Continue from an earlier run or dataset. |
incrementalMode | boolean | false | Return changes for a recurring search. |
stateKey | string | none | Optional name for the recurring search state. |
emitUnchanged | boolean | false | Also return unchanged hotels. |
emitExpired | boolean | false | Also return hotels absent after a complete scan. |
mcpConnectors | array | empty | Optional connector IDs for an export. |
notionParentPageUrl | string | none | Parent page for a Notion export. |
maxNotifyListings | integer | 50 | Maximum rows sent through connectors. |
proxy | object | Apify default | Connection configuration. |
The hotel record is charged once per dataset row. A successful profile read adds one Hotel detail enrichment event. When guest reviews are enabled, each started block of 10 fetched reviews adds one more enrichment event on a hotel row that is returned: 1-10 reviews add one event, 11-20 add two. Empty or failed review reads and unchanged rows suppressed by incremental mode add no review event.
For recurring monitoring, keep the same city, stay dates and filters. The first incremental run returns NEW hotels; later runs return changes. emitUnchanged and emitExpired can add billed rows. Resume continues a specific previous run and skips rows it already collected.
Each run applies maxItems in the site's own display order for that stay window before sorting hotels into NEW, UPDATED, UNCHANGED or EXPIRED. On a city with more hotels than its share of maxItems, a hotel ranked below that cutoff is not scanned at all that run, so a genuine change on that specific hotel is not detected until it rises within the cutoff on a later run. Raise maxItems (or set it to 0) for a scope you monitor with incremental mode, especially a large city, so every tracked hotel is scanned each run.
With emitExpired on, every city or link in one input shares a single EXPIRED check. If a later run cannot look up one of those cities or links (the lookup is refused or finds no match that time) while the others scan completely, the hotels tracked for that city are marked EXPIRED even though they were not checked. For example, a Dubai and Doha watch whose Doha lookup fails once reports every tracked Doha hotel as EXPIRED. When you rely on EXPIRED rows, schedule one city or search link per task: a single-city run whose lookup fails skips EXPIRED detection instead.
Send results into your apps (MCP connectors)
Optionally select authorized connectors with mcpConnectors. Set notionParentPageUrl for Notion and use maxNotifyListings to cap exported rows. The complete records remain in the dataset.
Output Example
Sample shape: values are illustrative placeholders, not from a live hotel.
{"recordId": "000001","hotelId": 1,"rowType": "hotel","name": "Sample City Hotel","url": "https://www.wego.com/en/hotels/searches/dxb/2026-10-01/2026-10-03/1","star": 4,"cityCode": "DXB","cityName": "Dubai","latitude": 25.0,"longitude": 55.0,"imageUrl": "https://zen.wego.com/hotelz/000/00000000/0000000000.jpeg","imageUrls": ["https://zen.wego.com/hotelz/000/00000000/0000000000.jpeg"],"imagesCount": 10,"reviewScore": 85,"reviewCount": 100,"priceAmount": 180,"priceCurrency": "USD","priceUsd": 180,"providerCode": "example-provider","roomType": "Standard room","freeCancellation": true,"address": "Sample street, Dubai","amenities": ["Wi-Fi", "Parking"],"reviewsFetched": 1,"reviews": [{"reviewId": "review-0001", "rating": 8, "comments": [{"type": "pros", "comment": "Comfortable room"}], "postedAt": "2026-01-01", "authorName": "Guest Name"}],"changeType": "NEW","changedFields": [],"firstSeenAt": "2026-01-01T00:00:00Z","lastSeenAt": "2026-01-01T00:00:00Z"}
The sample shows optional profile and guest review fields together. Search-only runs omit profile fields, and reviews are included only when enabled.
Plan Requirement
An Apify account is needed to run the actor. Choose review and detail options based on the data you need; the input shows the charges associated with each option.
FAQ
How much does it cost?
You pay for the Actor start event, one Hotel record event per dataset row, and one Hotel detail enrichment event for a successful profile read or a started block of 10 committed guest reviews. The Pricing tab shows the current rates. Use Max items to cap the cost of any run.
Is it legal to scrape Wego?
This actor collects only publicly available hotel search data. You are responsible for how you use it: follow Wego's terms and the laws that apply to you, and get legal advice if you plan commercial redistribution. Hotel rates and availability change constantly and are not guaranteed once collected.
Can I get only new or changed hotel rates on a schedule?
Yes. Schedule the actor from the Schedules tab and turn on Incremental mode. Later runs of the same city, stay dates and filters then return only NEW, UPDATED and REAPPEARED hotels, and unchanged ones are not billed unless Emit unchanged is on.
What is the difference between Resume and Incremental mode?
Resume continues one specific interrupted run: paste its run or dataset ID and this run skips every record that run already collected. Incremental mode is for running the same search again and again (for example daily) and returning only what changed since the last run. Once a scope already has saved incremental state, adding Resume on top is refused; use Resume alone to finish an interrupted run, then let incremental mode continue from its own saved state next time.
Why did my run fail instead of returning an empty dataset?
If every request to the source was refused, the run stops with a clear message so "no hotels for this search" is never confused with "nothing could be read". Run it again in a few minutes, or change the Proxy configuration. If some cities or URLs served while others were refused, the run succeeds and the run log names each refused city or URL; when nothing was returned at all, the status message also names the refused count.
Can I paste multiple search links for the same city with different dates?
You can, but each hotel is tracked by its own id for the run, not by the dates or guest count in the link that found it. If two pasted links cover the same city with different stay dates or guest counts, the second link's row for a hotel the first link already found in that run is dropped as a duplicate, even though its rate is for a different stay. Run separate actor runs when you need rates for the same city across more than one stay window.
Why didn't Incremental mode report a change I know happened?
Each run applies Max items in the site's own display order before classifying hotels, so on a city or search larger than its share of Max items, a hotel ranked below that cutoff is not scanned that run at all. A genuine price or detail change on that specific hotel is only detected once it rises within the cutoff on a later run. Raise Max items, or set it to 0, for any scope you monitor with Incremental mode.
Why were all hotels in one city marked EXPIRED at once?
With Emit expired on, all cities or links in one input share one EXPIRED check. If a run could not look up one of them (a refused or empty lookup) while the others scanned completely, that city's tracked hotels are reported as EXPIRED even though they were not checked. Schedule one city or search link per task when you rely on EXPIRED rows; a single-city run whose lookup fails skips EXPIRED detection instead.
Can I use it with AI agents or MCP?
Yes. Call it from any Apify integration or MCP client, and use the connector field to push hotel rows into Notion, Linear or Airtable.
π Want more travel data?
Pair this actor with these related scrapers from the same team:
| π¨ Trip.com Hotels, Rooms & Reviews Scraper Pull structured hotel listings from trip.com with prices, room types, amenities... | π¨ Expedia Hotels Scraper From $1/1K. Scrape Expedia.com hotel listings and reviews for any destination. Extract... |
| π¨ Rakuten Travel Scraper Scrape Rakuten Travel, Japan's largest domestic hotel-booking site, by prefecture... | π¨ Traveloka Hotel Scraper Scrape Traveloka hotels across Singapore, Malaysia, Indonesia, Thailand, Vietnam and the... |
| π¨ Yanolja Scraper Scrape Yanolja (NOL), Korea's largest accommodations marketplace, by region or URL. Every... | π¨ Klook Scraper Scrape Klook activities, tours, attractions and travel experiences from search pages or... |
π Browse all abotapi scrapers
π¬ Support
- π Found a bug or a missing field? Open a ticket on the Issues tab. We usually reply within hours.
- π οΈ Need another site, extra fields or a private build? Email contact@abotapi.com.
- β Enjoying it? A quick review on the actor page helps other users find it.