Domain skill
airbnb
Markdown synced from browser-harness domain skills.
- Host
- airbnb
- Files
- 1
Agent prompt
Use this skill
Copy this prompt into your coding agent to make it enable browser-harness domain skills and read this exact domain folder before automating.
Set up https://github.com/browser-use/browser-harness for me if it is not already installed. If setup is needed, read `install.md` first to install and connect it to my real browser. Then read `SKILL.md` for normal usage and always read `helpers.py` because that is where the browser-harness functions are. Enable domain skills if they are not already enabled by setting `BH_DOMAIN_SKILLS=1` for browser-harness. Use the `airbnb` domain skill from `agent-workspace/domain-skills/airbnb/`. Read every markdown file for this domain before inventing an approach: - agent-workspace/domain-skills/airbnb/monthly-search.md Use those domain-skill notes to complete my task for `airbnb` in my real browser. When you open a setup, verification, or task tab, activate it so I can see the active browser tab.
Skill contents
What the agent will read
monthly (28+ night) stay search via URL params
monthly-search.md
- Search URL (no login needed):
- Add pricemax and pricefilternumnights only when the user requests a price limit. Set pricefilternumnights to the number of nights between checkin and checkout.
- With a 28+ night range, cards show a monthly figure ("$5,860 → $5,679 monthly") that
- already includes fees; pricemax is applied to that monthly total, not per night.
- ne/sw + searchbymap=true pins the search to the box; the results header reads
Show full markdown
Search URL (no login needed):
https://www.airbnb.com/s/San-Francisco--CA--United-States/homes?refinement_paths%5B%5D=%2Fhomes&checkin=2026-10-11&checkout=2026-11-11&adults=2&min_bedrooms=2&room_types%5B%5D=Entire%20home%2Fapt&ne_lat=37.812&ne_lng=-122.405&sw_lat=37.778&sw_lng=-122.460&search_by_map=true&zoom=14&search_type=filter_change
- Add
price_maxandprice_filter_num_nightsonly when the user requests a price limit. Setprice_filter_num_nightsto the number of nights betweencheckinandcheckout. - With a 28+ night range, cards show a monthly figure ("$5,860 → $5,679 monthly") that
already includes fees;
price_maxis applied to that monthly total, not per night. ne_*/sw_*+search_by_map=truepins the search to the box; the results header reads "N homes within map area".- Cards:
a[href*="/rooms/"]; the card text carries "Guest favorite", "Superhost", "New place to stay" (the newly-listed badge), beds/baths, and the struck/discounted price. - When the exact dates return few homes, Airbnb appends flexible-date suggestions; their cards start with a date range ("Oct 17 to Dec 16") — treat those as not available for the requested dates.
Pagination
The observed page contained 18 cards. The "Next" button click failed intermittently.
Use the cursor parameter with the original search_url, which contains filters but no pagination parameters.
Open the filtered search first. This example builds page two from its current URL. Set page_number to 3, 4, and subsequent pages as needed. Check for repeated listing IDs after each page:
import base64, json
from urllib.parse import urlencode, urlsplit, urlunsplit, parse_qsl
current = urlsplit(page_info()["url"])
if current.hostname != "www.airbnb.com" or "/homes" not in current.path:
raise RuntimeError("Open the filtered Airbnb search before requesting another page")
query = [(key, value) for key, value in parse_qsl(current.query) if key not in ("cursor", "items_offset")]
if not query:
raise RuntimeError("The current search has no filters; restore the intended dates and filters first")
search_url = urlunsplit((current.scheme, current.netloc, current.path, urlencode(query), ""))
page_number = 2
offset = (page_number - 1) * 18
cur = base64.b64encode(json.dumps({"section_offset": 0, "items_offset": offset, "version": 1}).encode()).decode()
page_url = search_url + "&" + urlencode({"cursor": cur, "items_offset": offset})
Listing page
https://www.airbnb.com/rooms/<id>?check_in=..&check_out=..&adults=2 — document.body.innerText
gives: "Entire rental unit in …", "N guests · N bedrooms · N beds · N baths", the location
blurb ("In Nob Hill, near Huntington Park", "Right in Chinatown, steps from…"), rating +
review count, Superhost/years hosting, "This home is in the bottom 10% of eligible listings"
warning (worth surfacing), cancellation text, and check-in window. Airbnb's own neighborhood
label on the card ("Condo in Nob Hill") can differ from the page blurb ("Right in Chinatown");
trust the page.