How-to · 3 steps

How to compare travel prices
with Monid.

Give this to your agent
$set up https://monid.ai/SKILL.md, then price <hotel> for my dates and show the cost of each step

and let it take it from there.

›price this hotel for my dates
#JobWhat came backCost
1Site one40 plans, right dates
2Site two42 plans, right dates
3The trapone quoted per night
4Naive readingranks the dearer one first
5Site three56 plans, inputs honoured
6The many-seller onetonight's date, in rupiah
7Asked againsame answer, 11 not 13
8The flightsoutbound only, one adult
9The dead one500 twice, 504 twice
10Total17 runs, 6 failed free
one room · three sites · a real spread hiding behind a 2x oneagent running$0.1373

Real run, 2026-09-25. Public rates for stated dates.

Step 1

Set up Monid.

One line. It installs the CLI and asks for an API key from app.monid.ai. New accounts start with $1.00.

Say this to your agent
>set up https://monid.ai/SKILL.md
Step 2

Pick what you need. Say it in one sentence.

Click a job. Paste the sentence, fill in the brackets.

Per night or the whole stay

Say this to your agent
>before you compare any two hotel prices, work out the basis of each one by asking each site TWICE, once for one night and once for the full stay, and dividing each site's own two answers. a per-night quote returns the same number both times and a whole-stay quote doubles. do not compare the two sites to each other to find this: the price gap between them contaminates the ratio and hides it
What the agent runsdone
mrscraper /agoda/rates$0.046
mrscraper /booking/rates$0.041
mrscraper /trip/hotel$0.02
What came backone hotel, one route · 2026-09-25
Each endpoint's two nights divided by its own one nightratio · 2 means the stay, 1 means per night
booking rates2.000
trip hotel2.000
agoda rates1.000
agoda hotel1.000
what gives it awayasked for one night and then for two, a whole-stay endpoint returned 478 and then 956, exactly 2.000, while a per-night one returned 534 both times, exactly 1.000; each site is compared only against itself, so no price gap can contaminate it
why the cross-site ratio does not workan earlier version of this page told readers to divide one site's number by the other's and look for the night count. On a second city those ratios came out at 1.79 and 1.40, because the sites also differ about 10% on price and the two effects multiply; an agent following that sentence concludes the bases match and ships the error
what does not give it awayboth payloads report the currency as USD, both report a length of stay of two, and both put the money in a field with the same name
the description is wrongthe per-night endpoint's own summary calls that field the total price. It is not a total
how wrong you getit does not just inflate the gap, it inverts the ranking: on a second city one site looked 44% cheaper at face value and was actually 11.7% dearer once both were on the same basis, so the naive read recommends the wrong booking
and within one record tooon one provider the final price is the whole stay while the fare beside it is per night, in the same object, so the basis can change between two fields rather than between two sites
$0.107a second pass over the three

One identical room, every site that sells it

Say this to your agent
>price <hotel> for <dates>, two adults one room, on trip, booking and agoda through monid, passing a JSON body where the endpoint asks for one, then normalise everything to the whole stay. match the rate plans on the room's size and bed count rather than its name, because most sites reword the name, and read the refundable field as a value rather than a type: it is a string on one site and a boolean on another, so a strict match silently drops everything
What the agent runsdone
mrscraper /trip/hotel$0.02
mrscraper /agoda/rates$0.046
mrscraper /booking/rates$0.041
mrscraper /expedia/rates$0.01
What came backone hotel, one route · 2026-09-25
The same refundable room, two nights, USDUS dollars for the stay
site one$1,356.48
site two$1,436.00
site three$1,448.00
matching on the name drops most of the inventoryon a second city only 2 of about 21 rooms were named character for character across sites; the rest were reworded, so a name match throws away roughly 90% of what you paid for
and the refundable field changes type between sitesit came back as a string on one and a boolean on another, so matching on it as instructed silently drops every row rather than failing loudly
the spread is not a fixed numberthe first city came out at 6.75% of the cheapest once normalised; a second city came out at 40.65%, against 83% at face value. Quote the method, not the percentage
and on the non-refundable plan$12.00, or 1.03%, which is the same $12 the ratio test surfaced
who is missing and whya seller returned 500 twice on both cities we tried, though not the same seller each time, so expect one of the three to be down rather than expecting a particular one
and the occupancy is not always honouredone provider returned 68 of 186 plans with a maximum occupancy of one on a request for two adults, so filter on that field rather than trusting the request
$0.107three sites, normalised

Who else is selling the same room

Say this to your agent
>if you try the google hotels seller list through monid, treat it as optional and check what came back before you build anything on it: on a second city it named a single seller rather than a list, three calls returned three different payloads, and one response carried a checkout date a month BEFORE its own checkin. the language parameter is honoured; the currency and the dates are not
What the agent runsdone
mrscraper /google/hotel$0.01
litescrape /tripadvisor/search$0.00015
litescrape /tripadvisor/place$0.00015
mrscraper /agoda/hotel$0.01
What came backone hotel, one route · 2026-09-25
the shape is right when it answerson the first city it named thirteen booking sites with prices in a single $0.01 call, which is the shape the whole job wants
but it may not answer at allon a second city the same call named exactly one seller, three times running, so the sentence's whole payoff can simply be absent. Do not build a comparison that requires it
partly aimable, not unaimablethe language parameter IS honoured and returned the property's name in the local script; the currency and the dates are not. An earlier version of this page said it could not be aimed at all, which is too broad
and the dates it invents are not merely wrongtwo calls came back with a checkout a month before their own checkin, and one returned the literal string Invalid date, so a date check has to test the range and the type, not just whether it matches what you asked
three calls, three payloadsit is not deterministic either: the earlier run got thirteen sellers and then eleven, and the second city got three different responses in a row
what the cheap lookup doesfinds the property for a seventh of a cent, alongside two hotels in the wrong cities; the companion detail call promises ranking, contacts, amenities and prices and returns none of the four
$0.01many sellers, wrong dates

The flights for the same trip

Say this to your agent
>get the fare for <route> on <date> through monid, then tell me how many passengers and which legs it actually priced. do not assume it read your return date or your party size: check what came back rather than what you asked for
What the agent runsdone
mrscraper /google/flights$0.01
mrscraper /china-southern/flights$0.01
What came backone hotel, one route · 2026-09-25
what it priced116 outbound itineraries and no return leg, while echoing the return date and a round-trip flag straight back at you
the passenger countthere is no passenger parameter on the endpoint at all, confirmed from its JSON schema: six properties and additional properties refused, so it silently prices one adult
the currencyit ignored the country we set and ran a different national edition, pricing in a currency we had not asked for
the other one does work, and takes what this one will notthe single-airline endpoint returned nine real itineraries for two tenths of a cent on a second route, and it DOES take adult, child and infant counts and does honour the currency; an earlier version of this page wrote it off as empty
so the party-size hole is narrower than it looksthe general endpoint cannot price a family fare, but a route that airline flies can be priced for one
$0.01116 itineraries, one leg

The cheapest answer you can actually use

Say this to your agent
>price <hotel> on monid with more than one of the hotel endpoints and rank them on what came back, not on what this page found: on a second city the cheaper agoda endpoint cost half the trip one, echoed every input just as exactly, and returned 37 full rate plans. three of these endpoints require a login parameter that is documented but unexplained, so read the schema before the first call
What the agent runsdone
mrscraper /trip/hotel$0.02
litescrape /tripadvisor/place$0.00015
mrscraper /google/hotel$0.01
mrscraper /agoda/hotel$0.01
mrscraper /agoda/rates$0.046
What came backone hotel, one route · 2026-09-25
Five candidates, same hotel, same questionwhat the call billed
answers, inputs honoured, 37 plans$0.01
answers, inputs honoured$0.02
answers, but per night$0.046
bills, wrong dates$0.01
bills, no price at all$0.00015
it answers well, but it is not the only oneit returned 56 rate plans across 14 room types on the first city and 186 across 26 on a second, echoing the dates, occupancy and currency back exactly as sent
and it is not the cheapest that doesan earlier version of this page said the two cheaper hotel endpoints both bill and neither answers. On a second city one of them cost HALF this one, echoed every input just as exactly and returned 37 rate plans, while the other billed nothing at all when it failed. Both halves of that claim were wrong
dearer is not better eitherthe most expensive one is 2.3x this and its numbers will silently halve your comparison unless you normalise them
a documented field nobody explainsthree of these endpoints require a login parameter. It is documented, in the sense that it appears in the schema; what is missing is any statement of what it means, and the vendor's examples simply pass one
$0.01the cheapest that honours its inputs

What this aisle cannot price

Say this to your agent
>tell me what you could not check for this trip before i rely on it: car hire, the return leg, a fare for more than one passenger, and live prices for a whole city on my dates
What the agent runsdone
mrscraper /expedia/search$0.01
litescrape /tripadvisor/search$0.00015
mrscraper /google/flights$0.01
What came backone hotel, one route · 2026-09-25
no car hire at allthere is not one endpoint for it, and a search for one confidently returns used cars, dealer listings, lease deals and home rentals; five results, every one wrong
the city search EXISTS and is broken, which is not the same thingan earlier version of this page said there is no city search on your dates. There is: a destination-and-dates search endpoint, priced at about two and a half cents and flagged degraded in the catalog with a p50 above two minutes. It timed out on both cities we tried and billed nothing, so plan a fallback, but do not tell a reader the capability is absent
and the timeout looks like absence from the CLIthat 504 came back as an HTML error page, which aborts the client with a parse error and writes no output file at all; that is exactly how a working-but-degraded endpoint gets written down as a missing one
no return fare, no party size on the general oneboth are absent from the general flight endpoint's schema, so a two-person return trip cannot be priced there; the single-airline endpoint does take a party size, on the routes it flies
the id problemone building has six different ids across six sites and no endpoint in the aisle returns any of them; every one had to come off the open web
$0.00know the holes first
Step 3

Take the cheapest route with Monid.

Find the property for a seventh of a cent. Then normalise the basis before you compare anything, because two sites will hand you the same field meaning different things.

Find the property · $0.00015
Search places$0.00015the property, cheaply
Who sells it$0.01sellers, not prices
A price you can compare · cheapest first
Trip rates$0.02
Booking rates$0.041
Agoda rates$0.046
Normalise the basis
Per night or stay$0.00
Match the rate plan$0.00room, refund, breakfast
Back to you
rowpriced bycost
1Trip rates$0.0202
2Trip rates$0.0202
3not listed$0.0001
4Booking rates$0.0611
5Trip rates$0.0202
5 of 5 rows$0.1217
Say this to your agent
>price these hotels for my dates, cheapest source first, and put every quote on the whole-stay basis before you rank them: <paste hotels>
“ask each site twice”one night against two, on the same site, is the only test that separates a per-night quote from a stay total
“match on size, not name”only two of about twenty-one rooms were named identically across sites; the rest were reworded
“check a degraded endpoint twice”a timeout that returns an HTML page aborts the client and writes no file, which reads exactly like a missing endpoint
“check the dates came back”one endpoint returned tonight's date in another currency however the url was written
“hold the dates constant”a comparison across different dates is not a comparison, and nothing will warn you

One key. 1,700+ tools.

Seventeen hotel endpoints, but eight of them scrape reviews rather than prices.

Trip.com rates, every input honouredmrscraper · $0.02 / call
Booking rates, stay totalsmrscraper · $0.041 / call
Agoda rates, per nightmrscraper · $0.046 / call
Google Hotels, many sellersmrscraper · $0.01 / call
Google Flights, one waymrscraper · $0.01 / call
Find the propertylitescrape · $0.00015 / call
Eight review scrapersmrscraper · from $0.01

+ 1,700 more across 55 providers

Browse the catalog →