Wego Scraper icon

Wego Scraper

Scrape Wego hotels by city or search URL. Get rates, providers, booking links, coordinates, scores, images and property details. Optionally fetch guest…

Start using this actor on Apify ↗Need a custom scraper?Contact us ↗

Wego Scraper at a glance

Wego Scraper is a ready-to-run Apify actor from abotapi for collecting web data. Its documented output includes hotel, stars, city, rate and currency, which you can export as JSON, CSV or Excel or read through the Apify API. It costs $2.50 per 1,000 results on the Apify Free plan and from $1.50 on paid plans, with smaller per-run or optional feature charges listed on Apify.

Runs on
Apify cloud: console, API, schedules and integrations
Data type
Web data
Pricing
$2.50 per 1,000 results (Free plan), from $1.50 on paid plans
Output
Documented below · JSON, CSV, Excel
Inputs
30 options

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.

What Wego Scraper can do

  • Three ways in. Search by city and stay dates, or paste a Wego search, city, hotel or hotel id link.
  • Rates you can compare. Quoted amounts, taxes, providers, room types and cancellation terms on every row.
  • Location and reputation. Star class, coordinates, review scores and the image URLs available with each result.
  • Optional hotel profiles. Contact details, amenities, policies and property information with fetchDetails, which is on by default.
  • Optional guest reviews. Review text, ratings, dates and public author details with fetchReviews.
  • Built for schedules. Track changes across runs with Incremental mode, pick which fields count as a change with ignoreFieldsForChanges, or resume an interrupted run without repeating earlier rows.

Choose what to collect

These inputs let you configure Wego Scraper - MENA Hotel Deals, Rates & Reviews. Open the actor on Apify to enter your values and review the current options.

Supported input fields
InputWhat it controls
modestring · requiredHow to start the scrape. 'search' runs the site's own hotel metasearch for the cities and stay window you set. 'url' processes the Wego hotels search URLs you paste: each URL's own path decides the city and dates, so the search-mode fields below do not apply there.

Choices: search, url

locationsarrayOne or more city names, for example 'Dubai', 'Makkah', 'Cairo', 'Doha', 'Abu Dhabi'. Each name is matched against the site's own place search; a name with no match is skipped with a warning, never invented. Search mode only: in URL mode the pasted URL decides its own scope.
checkInstringStay window start, YYYY-MM-DD. Defaults to about a week from today when left empty. Search mode only.
checkOutstringStay window end, YYYY-MM-DD. Must be after the check-in date; defaults to two nights after check-in when left empty. Search mode only.
roomsintegerNumber of rooms to price, 1 to 4. Rates are quoted per room for the whole stay. Search mode only.
adultsintegerAdult guests per room, 1 to 8. Search mode only.
currencystringCurrency the rates are quoted in. The USD-converted price is always included on every row, so currency only changes the display values. Search mode only.

Choices: USD, AED, SAR, EGP, KWD, QAR, BHD, OMR, JOD, TRY, INR, EUR, GBP

Show 23 more inputs
More input fields
InputWhat it controls
urlsarrayPaste Wego hotels links: a search page like https://www.wego.com/en/hotels/searches/dxb/2026-12-01/2026-12-03?guests=2 (a search page with past dates is moved to the next upcoming week, with a warning), a city page, a hotel page, or a bare hotel id link. City and hotel links use the default stay window. Sort and order query parameters in a pasted link are not applied; use the sort input. Multi-URL supported; each is walked independently.
starRatingsarrayKeep only hotels of these star classes. Empty means every class. Applied to the rows this run reads. Applies in BOTH modes.
minPriceUsdintegerOnly keep rows whose rate is at least this many US dollars for the whole stay. Applied to the rows this run reads. Applies in BOTH modes.
maxPriceUsdintegerOnly keep rows whose rate is at most this many US dollars for the whole stay. Applied to the rows this run reads. Applies in BOTH modes.
freeCancellationOnlybooleanKeep only rows whose quoted rate carries a free-cancellation window in the source's own terms. Applied to the rows this run reads. Applies in BOTH modes.
sortBystringArranges the rows this run collected, after they are read. 'As the site streamed them' keeps the source's own display order for your stay window. This is a local tidy up of one run's output, not a catalogue-wide ordering. Applies in BOTH modes.

Choices: popularity, price_asc, price_desc, stars_desc, rating_desc

fetchDetailsbooleanRead each hotel's own profile for the complete record: address, phone, email, website, description, named amenities, check-in and check-out times, room and floor counts, payment options and review highlights. The feed row already carries name, star class, coordinates, review score, cheapest rate, provider, room type, board basis and free-cancellation terms. Turning this on adds the Hotel detail enrichment charge per record actually enriched this run.
fetchReviewsbooleanOptionally read the latest guest reviews for each hotel. Off by default. The existing Hotel detail enrichment event adds one unit per started block of 10 reviews returned on a committed hotel row. Works with Fetch hotel details on or off; no review charge for zero reviews, failed reads or suppressed incremental rows.
maxReviewsPerHotelintegerMaximum guest reviews to collect for each hotel when Fetch guest reviews is on. Reviews are read 10 at a time; 1-10 reviews add one enrichment unit, 11-20 add two, and so on. Set 0 to skip review reads.
maxItemsintegerThe single cap on this run: stop after collecting this many records across all cities and URLs. Set 0 for unlimited.
maxPagesintegerSafety bound on how many times to re-poll the streaming results feed per city while it fills in. Leave empty (0) to use the built-in ceiling: a hard cap of 30 polls per city always applies, so the run stops when the feed reports it is done, at Max items, or after 30 polls, whichever comes first.
resumeFromRunIdstringPaste a previous run ID or dataset ID to continue a large crawl without returning or charging for records already collected there. Use this after an interrupted or capped run. For recurring monitoring of the same search, use Incremental mode below instead.
incrementalModebooleanTurn this on for daily or weekly recurring monitoring of the same scope, for example a city rate watch. The first run returns everything matching as NEW. Later runs normally return only NEW, UPDATED and REAPPEARED records. What is compared: every output field of the hotel, including the cheapest rate (price, tax, currency, free cancellation, rooms left), so a rate move IS reported as UPDATED. What is excluded: the booking deep link and the scrape timestamp (they change on every run), plus any field you list in Ignore fields when detecting changes. Turn on Emit unchanged or Emit expired only when you also want those rows returned (and billed). State is kept separately per city, URL and filter setup; use State key to name or deliberately share a monitoring campaign. To continue one specific interrupted run instead, use Resume from a previous run above.
stateKeystringOptional. Name this monitoring campaign to keep its state stable, or to deliberately share state across differently configured runs. Leave empty to let the actor derive a key automatically from the cities, URLs and filters, so two different scopes never mix state.
emitUnchangedbooleanOff by default. Turn on to also return records that have not changed since the last run, marked UNCHANGED. This returns, and bills, extra rows you already have, so leave it off unless you specifically want a full snapshot every run.
emitExpiredbooleanOff by default. Turn on to also return records that were present in a previous run but are no longer found, marked EXPIRED. Only produced once a run has fully scanned the tracked scope: not when Max items capped it, not when Resume was used, and not when the run was refused. This returns, and bills, extra synthetic rows, so leave it off unless you need expiry tracking.
changeScopestringAll fields (default) compares the whole hotel record. Price and availability only compares just the rate fields (price, tax, currency, free cancellation, rooms left), so descriptions, photos and review counts never create an UPDATED row. Changing the scope changes the automatic state key unless you set State key.

Choices: all, priceAndStock

compactUpdatesbooleanOff by default. Turn on to return UPDATED and EXPIRED rows as short rows: ids, current price, priceChanges with old and new values, and per-rate changes. NEW rows stay complete. Compact rows carry no reviews, so they add no review charge.
expireAfterMissedScansintegerWith Emit expired on, a hotel is marked EXPIRED only after it was missing from this many consecutive complete scans. Default 1 expires at once. EXPIRED means the hotel dropped out of the results, which can be a listing change or a real removal; use the price and availability fields to judge availability.
ignoreFieldsForChangesarrayField names that never make a row UPDATED and never appear in changedFields (the fields stay in the output). Use a top-level name such as reviewCount, or a dotted path such as images.url to ignore one key inside every element of a nested list. Applies to incremental mode only.
mcpConnectorsarrayOptionally send results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize one under Apify, Settings, API & Integrations, then select it here. Notion gets a page per record; other connectors get a best-effort write or digest. Each connector receives a condensed summary per record, not the full record; the complete record always stays in the dataset. Leave empty to skip; this never changes the dataset output. Supported: Notion (https://mcp.notion.com/mcp), Linear (https://mcp.linear.app/sse), Airtable (https://mcp.airtable.com/mcp), Apify (https://mcp.apify.com).
notionParentPageUrlstringURL or id of the Notion page under which record pages are created. Required to enable the Notion export; ignored by other connectors.
maxNotifyListingsintegerCap on records written to each connector per run. Does not affect the dataset.

Fields in the output

The documented dataset includes the fields below. Availability can depend on the source page and selected mode.

nameHotel (text)
starStars (number)
cityNameCity (text)
priceAmountRate (number)
priceCurrencyCurrency (text)
priceUsdRate (USD) (number)
providerCodeProvider (text)
roomTypeRoom type (text)
boardBasisBoard (text)
freeCancellationFree cancellation (boolean)
reviewScoreReview score (number)
reviewCountReviews (number)
Show 56 more fields
districtNameDistrict (text)
addressAddress (text)
phonePhone (text)
latitudeLat (number)
longitudeLng (number)
imageUrlImage (image)
imageUrlsImage URLs (list)
imagesCountImages reported (number)
urlHotel page (link)
bookingUrlBooking link (link)
changeTypeChange (text)
firstSeenAtFirst seen (datetime)
lastSeenAtLast seen (datetime)
totalAmountTotal in quote currency (number)
totalAmountUsdTotal (USD) (number)
taxAmountTax in quote currency (number)
totalTaxAmountTotal tax in quote currency (number)
totalTaxAmountUsdTotal tax in USD (number)
taxAmountUsdTax (USD) (number)
taxInclusiveTax included (boolean)
remainingRoomsCountRooms left (number)
freeCancellationUntilFree until (text)
providerHotelIdProvider hotel ID (text)
usualPriceUsual price (number)
roomIdsRoom IDs (array)
similarHotelIdsSimilar hotels (array)
aiReviewsAI review themes (array)
rateSocialProofRate social proof (object)
hotelSocialProofHotel social proof (object)
nameI18nName translations (object)
propertyTypeNameProperty type (text)
brandNameBrand (text)
chainNameChain (text)
formerNameFormer name (text)
postalCodePostal code (text)
emailEmail (text)
websiteWebsite (link)
descriptionDescription (text)
amenitiesAmenities (list)
amenityCategoriesAmenity categories (list)
checkInTimeCheck-in (text)
checkInEndTimeCheck-in ends (text)
checkOutTimeCheck-out (text)
roomsCountRooms (number)
floorsCountFloors (number)
builtYearBuilt (text)
paymentMethodsPayments (list)
paymentMethodDetailsPayment details (list)
reviewSummaryReview summary (text)
reviewBreakdownReview breakdown (list)
latestProviderReviewsRecent provider reviews (list)
aiReviewDetailsAI review highlights (list)
reviewsFetchedReviews fetched (number)
reviewsGuest reviews (list)
changedFieldsChanged fields (array)
priceChangesPrice changes (old / new) (object)

Example output

An example from this actor’s documentation. Values are illustrative; this is not a fresh live result.

{
  "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,
  "longitude": 55,
  "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"
}

Ways to use this data

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

Before you run

Start with a small input and check the resulting records against your expected fields. Source content and actor options can change; the current Apify listing is the reference for availability and pricing.

Questions about this actor

What data does Wego Scraper return?

The documented output for Wego Scraper includes hotel, stars, city, rate, currency, rate (usd), provider and room type. Availability of each field depends on the source page and the selected mode.

How much does Wego Scraper cost?

It costs $2.50 per 1,000 results on the Apify Free plan and from $1.50 on paid plans, with smaller per-run or optional feature charges listed on Apify. The Apify listing shows the current rate for every plan.

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.

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.

Ready to collect with Wego Scraper?

Run it on Apify with your own input and export the results as JSON, CSV or Excel.