roost search
What's available in a city for your dates — rate, class, rating, deals, and a stable id.
A read-only CLI that searches every major hotel brand, worldwide — Marriott, Hilton, Hyatt, IHG, Accor — and answers the question booking sites bury: which nights are actually free, and which one is cheapest?
No API key.No account.No booking.
Amadeus shut off its free hotel API on 17 July 2026, deactivating every existing key. Everything else — Expedia, Booking, Hotelbeds, Sabre — is behind a commercial contract. roost is what's left that anyone can just run.
One command sweeps forward across check-in dates and reports what's available and what
it costs. It's hard-capped, it self-throttles, and --dry-run tells you
exactly how many requests it will make before it makes them.
$ roost dates "kyoto" --window 14 --nights 2 --dry-run
→ plans 8 requests across 14 days — nothing fetched yet
$ roost dates "kyoto" --window 14 --nights 2 --json
"cheapest": { "date": "2026-10-06", "perNight": { "amount": 88, "currency": "USD" } } uv tool install git+https://github.com/rnwolfe/roost uvx roost search 'kyoto' --nights 3 --json uv tool install roost pipx install roost
roost is read-only by construction — there is no booking command to gate, because
there is no booking command. --allow-mutations exists only so the whole
fleet shares one shape, and it does nothing.
roost searchWhat's available in a city for your dates — rate, class, rating, deals, and a stable id.
roost datesSweep check-in dates to find when a stay is free and cheapest. Bounded, throttled, and it tells you the cost before it spends it.
roost ratesPer-source breakdown for one property — the brand's own rate against each OTA.
roost brandsThe chain taxonomy, offline. Marriott to Meliá, no request made.
roost schemaThe whole command tree, every flag, the exit-code table, and live safety state — as JSON.
roost agentThe usage contract, embedded in the binary. An agent that has roost has the manual.
You're being throttled. A circuit breaker opens and refuses the next call
until it expires — so a retry loop can't dig the hole deeper. roost doctor
tells you when it clears.
Upstream changed shape. Retrying will never help — the tool needs an upgrade. Collapsing these two into "error" is how an agent ends up hammering a service that already said no.
Every response carries a scope block declaring what was narrowed, so a
partial answer is never mistaken for the whole. Rates are metasearch lead-in prices —
not a booking guarantee.
roost reads publicly visible, logged-out results at personal scale, on a path Google's
robots.txt does not disallow — enforced as an allowlist in
the code, not as a promise in a README. It never logs in, never sends a credential, and
never books.
There is no CAPTCHA solving, no proxy rotation, no residential proxies. It won't even fall back to a browser fingerprint it didn't choose. If Google blocks it, the correct response is to stop — and stopping is what the circuit breaker does.