From awesome-skills
Finds and enriches B2B leads from Booking.com by extracting host contact details (email, phone, company) using a waterfall: traderInfo first, Google Maps as fallback.
How this skill is triggered — by the user, by Claude, or both
Slash command
/awesome-skills:apify-booking-host-leadsThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Turn a Booking.com destination search into a clean table of accommodation hosts / property managers with their real contact details.
Turn a Booking.com destination search into a clean table of accommodation hosts / property managers with their real contact details.
When you scrape Booking.com, the host's contact email is sometimes already in the data under traderInfo (a trader-transparency disclosure). But this is region-dependent: strong in the EU (Zurich apartments: 80%) and Australia (Melbourne apartments: 82% in a 50-property test), and increasingly present in Asia (Beijing apartments: 65% as of June 2026, typically a QQ, 163, or Gmail address plus a Chinese company name). It is historically sparser in the US and UK. A naive chained Google Maps email scraper found emails for only ~10% and often matched the wrong business.
So use a waterfall: try the cheapest source first, fall through to more expensive ones only for leads still missing a contact. Never start with a Google Maps email extractor.
| Tier | Source | Gets | Fires when |
|---|---|---|---|
| 1 | Booking traderInfo | email, phone, company | always (free, already scraped) |
| 2 | Google Maps Email Extractor (by name) | email, phone, socials, website | lead still has no email |
| 3 | Google Search (by name) | a candidate website | lead still has no website |
| 4 | Website contact scraper (on the website) | email / phone / socials | lead has a website but still no email |
apify login (OAuth, if using the Apify CLI)APIFY_TOKEN environment variablenone = all), max properties, and output format (CSV / JSON / Google Sheet).voyager/booking-scraper. Build a lead row per property from traderInfo and hostInfo (see Mapping below). Mark rows where traderInfo.email is present as contactSource: booking-trader.lukaskrivka/google-maps-with-contact-details with searchStringsArray = ["<name>, <destination>", ...]. Fill email/phone/socials and capture any website it returns. Mark filled rows google-maps.apify/google-search-scraper with one query per lead ("<name> <city> official website"). Take the first non-OTA/non-social organicResults[].url as the candidate website.vdrmota/contact-info-scraper (deterministic, ~14s/site). Optional: apify/ai-web-scraper with a prompt for email/phone/contact-form URL - but in live testing it was slow and failed on multiple sites, so prefer the contact scraper. Mark filled rows website-contact (or website-ai). Cap the count to control cost.contactSource breakdown. Rows still empty keep BookingURL (contact via Booking messaging).| Output column | Source field |
|---|---|
name, type, address, city, country, rating, ratingLabel, stars, reviews, BookingURL | top-level Booking fields (address.full, address.city, address.country, rating, ratingLabel, reviews, url) |
email, phone | traderInfo.email / traderInfo.phone → fallback Google Maps emails[0] / phones[0] |
companyName, registrationNumber, traderAddress | traderInfo.companyName / .registrationNumber / .address |
hostName, managedProperties | hostInfo.name / hostInfo.managedProperties (operator-size signal) |
website, socials | Google Maps fallback only; drop OTA domains (booking.com, agoda, expedia, etc.) |
contactSource | booking-trader | google-maps | none |
Put email and phone immediately after address in the output.
Always return BookingURL (link to the property), rating, ratingLabel (e.g. "Superb", "Exceptional"), and reviews (review count) for every lead. These give each row its own quality signal, so leads can be ranked and prioritized without re-opening Booking.
| Waterfall tier | Actor ID | Maintainer | Best for |
|---|---|---|---|
| 1 - Booking + trader contacts | voyager/booking-scraper | community | Primary. traderInfo holds host email/phone/company |
| 2 - email/social/website by name | lukaskrivka/google-maps-with-contact-details | community | Emails Booking doesn't disclose; also returns a website |
| 3 - discover a website | apify/google-search-scraper | apify | Finding the host's official site when Maps has none |
| 4 - extract from the website (default) | vdrmota/contact-info-scraper | community | Deterministic email/phone/social extraction; fast and reliable |
| 4 - extract from the website (alt) | apify/ai-web-scraper | apify | LLM extraction via prompt; flexible but slow/unreliable in testing |
Prefer apify-maintained Actors where available.
Three flags on every call (--json, --user-agent, 2>/dev/null):
# 1. Scrape Booking.com
apify actors call "voyager/booking-scraper" \
-i '{"search":"Melbourne","maxItems":50,"propertyType":"Apartments","currency":"USD","language":"en-us","sortBy":"distance_from_search","rooms":1,"adults":2}' \
--json \
--user-agent apify-awesome-skills/apify-booking-host-leads \
2>/dev/null
# Tier 2 - enrich names that have no traderInfo email
apify actors call "lukaskrivka/google-maps-with-contact-details" \
-i '{"searchStringsArray":["<name>, Melbourne"],"locationQuery":"Melbourne","maxCrawledPlacesPerSearch":1,"language":"en"}' \
--json \
--user-agent apify-awesome-skills/apify-booking-host-leads \
2>/dev/null
# Tier 3 - discover a website for leads that still have none
apify actors call "apify/google-search-scraper" \
-i '{"queries":"<name> Melbourne official website","maxPagesPerQuery":1,"resultsPerPage":5,"countryCode":"us","languageCode":"en"}' \
--json \
--user-agent apify-awesome-skills/apify-booking-host-leads \
2>/dev/null
# Tier 4 - AI-extract a contact email / form URL from the website
# (confirm the prompt/instructions field name against the Actor's input schema)
apify actors call "apify/ai-web-scraper" \
-i '{"startUrls":[{"url":"<website>"}],"prompt":"Extract the contact email, phone, and contact-form URL. Return JSON keys: email, phone, contactFormUrl."}' \
--json \
--user-agent apify-awesome-skills/apify-booking-host-leads \
2>/dev/null
# Inspect input schema / fetch results
apify actors info "voyager/booking-scraper" --input --json \
--user-agent apify-awesome-skills/apify-booking-host-leads 2>/dev/null
apify datasets get-items DATASET_ID --format json \
--user-agent apify-awesome-skills/apify-booking-host-leads 2>/dev/null
The Apify MCP server (https://mcp.apify.com) and any MCP client (e.g. mcpc) are equivalent alternatives.
traderInfo. Re-check the Booking item's traderInfo field first.contactSource: booking-trader rows; treat google-maps rows as lower confidence.contactSource: none rows → those hosts disclosed no trader info and have no Google Business match. Use the BookingURL to contact via Booking, or accept the blank.traderInfo alone covers ~80%.npx claudepluginhub apify/awesome-skills --plugin apify-influencer-brand-collabsBuilds verified business email lists from Google Maps, Google SERPs, or URL lists with built-in email verification. Replaces tools like Apollo or Hunter.
Generate structured lead lists from prospect databases and web directories using Firecrawl browser. Exports CRM-ready JSON or CSV.
Scrape leads from multiple platforms (Google Maps, Instagram, TikTok, Facebook, YouTube) using Apify Actors. Select actors, configure input, and export structured lead data.