Hotel availability,
for agents.

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.

roost dates

Find the night, not just the hotel.

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.

02 $92
03 $104
04 $138
05 $121
06 $88
07 $96
08 $113
09 $129
10
11 $118
12 $145
13 $133
cheapest night no availability October · 2 nights · 2 adults · 8 requests
$ 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" } }
install

Running in one line.

uv tool install git+https://github.com/rnwolfe/roost
uvx roost search 'kyoto' --nights 3 --json
uv tool install roost
pipx install roost
the rack

Six commands. Nothing that books.

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.

101

roost search

What's available in a city for your dates — rate, class, rating, deals, and a stable id.

102

roost dates

Sweep check-in dates to find when a stay is free and cheapest. Bounded, throttled, and it tells you the cost before it spends it.

103

roost rates

Per-source breakdown for one property — the brand's own rate against each OTA.

104

roost brands

The chain taxonomy, offline. Marriott to Meliá, no request made.

201

roost schema

The whole command tree, every flag, the exit-code table, and live safety state — as JSON.

202

roost agent

The usage contract, embedded in the binary. An agent that has roost has the manual.

built for an agent that's alone at 3am

It fails in ways you can branch on.

20

BLOCKED

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.

21

SCHEMA_DRIFT

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.

where the line is

Reduce volume. Never disguise it.

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.