How-to · 3 steps

How to compare prices
across stores with Monid.

Give this to your agent
$set up https://monid.ai/SKILL.md, then find me the cheapest <product> and show the cost of each step

and let it take it from there.

›find me the cheapest one of these
#JobWhat came backCost
1Find the cluster40 rows across 37 stores
2Open the product15 offers, direct store links
3The real spread$14.87 to $18.99, one pack size
4The trapcheapest row is an 8-pack
5By part numbera coin cell and a lantern
6The paid twin40 rows, 36 the same
7Walmart direct554 KB of raw HTML
8Kroger direct440 KB, no price in it
9Zepto directthe url, echoed back
10Total31 calls, US and UK
one 16-pack · 37 stores · a 27.7% spread and one trapagent running$0.4188

Real run, 2026-09-25. Public listings, prices as captured.

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.

What this exact item costs everywhere

Say this to your agent
>find <product> with litescrape google shopping on monid and open the product page endpoint. read pack size off the OFFER titles rather than the search results, and put any offer whose title carries no size into a third pile rather than dropping it: one merchant's title omits the size entirely, so a strict filter can throw away the cheapest matching pack. check that pile before you name a winner. most search titles carry no size at all, and filtering there throws away the right row and keeps the wrong battery
What the agent runsdone
litescrape /google/shopping$0.00015
litescrape /google/shopping-product$0.00015
apify /damilo/google-shopping-apify$0.00525 / result
apify /burbn/google-shopping-scraper$0.0075 / result
What came backone 16-pack of batteries · 2026-09-25
One identical 16-pack, same day, same countryUS dollars
Walmart, third party$14.87
Meijer$16.49
Lowe's$16.98
ShopRite$17.99
bomgaars and CDW$18.99
the spread$4.12 between the cheapest and the dearest shelf, which is 27.7%, on one identical pack in one country on one day
what it cost$0.0003 for fifteen merchant offers with direct store links, which is $0.00002 an offer
per unit instead$0.929 a cell at the bottom against $1.187 at the top, which is the number that actually decides the purchase
the two that had no priceone big grocer's own page carried the product markup with its offers field set to null; one big hardware chain does not stock this size at all
where not to filteron the search list 12 of 20 titles carried no pack size at all, the correct top result among them, and one row that survived the filter was a different battery size entirely
$0.000315 offers, two calls

Why the cheapest row is the worst deal

Say this to your agent
>when you rank the offers for <product>, print the pack size next to every price and the price per unit. do not trust the product's own count field: it came back reading '8 pack, 16 pack' for a single product, so the list mixes two sizes
What the agent runsdone
litescrape /google/shopping-product$0.00015
litescrape /google/shopping$0.00015
apify /burbn/google-shopping-scraper$0.0075 / result
What came backone 16-pack of batteries · 2026-09-25
The cheapest offer against the one that looks dearestUS dollars per cell
the $9.19 'cheapest' · 8-pack$1.149
the $14.87 16-pack$0.929
what happenedthe top row after sorting by price is 38% cheaper on the shelf and 23.6% more expensive per battery, because it is half the pack
why nothing caught itthe record carries no pack-size field; the only signal is free text in the offer title, and the product's own count spec reads "8 pack, 16 pack"
eight spellings of one numberthe same pack size arrived as ( 16 -Pack), 8pk, Pack Of 8, 8/Pack, 16 X Aa Type, 8Ctbattery and 16 pk., and one merchant's title carried no size at all; a first-pass pattern missed three offers in fifteen
the spec sheet is not safe eitherthe same product record gives the voltage of a 1.5 V cell as 9 V, and do not reach for the part number instead: it returned a powersport battery, a coin cell and a lantern battery
$0.00read the title, not the field

The same answer for a fraction of the price

Say this to your agent
>get the google shopping results for <product> with litescrape on monid rather than an apify actor. they scrape the same page and cover the same shops, and the cheap one is a fraction of the price. do not expect a merchant link from either search route: open the product endpoint for those
What the agent runsdone
litescrape /google/shopping$0.00015
apify /damilo/google-shopping-apify$0.00525 / result
apify /burbn/google-shopping-scraper$0.0075 / result
What came backone 16-pack of batteries · 2026-09-25
Same query, same SERP, forty rows eachwhat the call billed
litescrape · 33 to 37 stores$0.00015
apify burbn · 20 rows only$0.1580
apify damilo · 33 to 34 stores$0.2100
how identical36 of the expensive endpoint's 40 rows matched the cheap one exactly on store and price
on coverage, a tietwo runs hours apart put the cheap one at 37 stores then 33, and the expensive one at 34 then 33; the counts move with the SERP, so buy the parity, not a lead
the multiple1,400x per row, $0.00000375 against $0.00525, for the same page scraped the same day, and the cheap one echoes every resolved parameter back while the actors echo nothing
neither search route links out23 of the cheap route's 40 rows carried no link at all and the rest pointed at google; the actor always has a link and it also points at google. Merchant links live on the product endpoint only
the limit that is not a limitthe pricier actor counts limit in pages, so asking for one returned forty records and billed $0.21; it does return on_sale and discount_percent as typed fields, which the cheap one does not
$0.0001540 rows, one call

Go to the store itself

Say this to your agent
>scrape <store>'s own page for <product> with mrscraper on monid. send a zipCode only if the store rejects the call without one, because the largest store 500s every time you include it. expect raw HTML rather than parsed fields, and read the price out of the embedded state rather than the json-ld
What the agent runsdone
mrscraper /walmart/product$0.01
mrscraper /meijer/product$0.01
mrscraper /kroger/product$0.01
mrscraper /homedepot/product$0.01
mrscraper /amazon/product · not run$0.05
What came backone 16-pack of batteries · 2026-09-25
Four store pages, $0.01 eachwhat came back
Walmart · 554 KB$14.87, in stock
Meijer · 256 KB$16.49, in stock
Home Depot · 1.1 MB$21.87, wrong size
Kroger · 440 KBoffers: null
what you actually getraw page HTML with none of the documented parsed fields, on all three endpoints that worked; the pricing notes say so and the run bills either way
the zip codetwo endpoints require it at runtime while leaving it out of their published required list, one 400s without it while documenting it as optional, and the one that documents it 500s every time you send it, three attempts out of three
the hit ratetwo usable prices for $0.04, which is $0.02 a price, against $0.00002 an offer through the shopping route
the parsed alternativea generic detail scraper in the same aisle billed $0.016 against this endpoint's $0.01 and returned a parsed pack size and price, which this one does not; cheaper per unit in the catalog, dearer per call in practice
$0.04four stores, two usable prices

Cheapest in a whole category

Say this to your agent
>search <category> with litescrape google shopping on monid with sort_by set to '1' for price ascending, and do not believe the ranking: single cells sort above every multipack. the count refinement will not save you either, so compute the price per unit yourself and rank on that
What the agent runsdone
litescrape /google/shopping$0.00015
apify /axesso_data/amazon-search-scraper · not run$0.00015 / result
mrscraper /autozone/category · not run$0.012
mrscraper /lazada/category$0.01
What came backone 16-pack of batteries · 2026-09-25
what sorting gives youthe top four rows were a single cell at $0.44, a 60-pack listed at $0.46, another single at $0.49, and an industrial cell at $0.63; only one of those is a pack price
the fix that is not onethe count facet is five ranges with no bucket for a specific pack size, the 8-to-24 bucket leaked single cells and a 60-pack, it disappears entirely on a branded query, and its own suggested links drop your sort order
the enum nobody can guesssort_by is a string, and '1' means price ascending; nothing about the value says so
the field that poisons a tableold_price is often a unit price rather than an old price, $1.06/ct next to a $16.98 price, in the same field with no marker; a discount computed from those reports a 1,500% rise
$0.0001530 rows plus 11 facets

The same product in another country

Say this to your agent
>get the offers for <product> with litescrape on monid again, this time with gl, hl and google_domain set for <country>. do not use the country's own store endpoint: use the shopping route with a locale
What the agent runsdone
litescrape /google/shopping-product$0.00015
mrscraper /lazada/product$0.01
mrscraper /zepto/product$0.009
mrscraper /shein/product$0.03
mrscraper /1688/category$0.029
What came backone 16-pack of batteries · 2026-09-25
it is real, not cosmeticthe same product id with a UK locale returned five offers in pounds from UK merchants, none of them the US sellers; that is a different market, not a currency conversion
what the country endpoints didtwo answered a JSON request with HTML and crashed the client, one validator demands a hostname the retailer does not use, and one 404'd; all of them billed $0.0000
the one that billeda 200 whose entire body was the url we sent it, charged $0.009, with the extra parameter we passed silently dropped from the echo
what thins out abroadfifteen offers became five, the related products disappeared, a reviews field the summary promises was absent in both countries, and the offers arrive in the shopping engine's order rather than by price
the caveat on the cheap pricethe pack-size trap crossed the border with us: the cheapest UK offer is an 8-pack, so check the size on both sides before you call it a saving
$0.00015a different market, not a conversion
Step 3

Take the cheapest route with Monid.

Two calls at $0.00015 return fifteen stores. Go to a shop's own page only for something the cluster will not tell you.

Find the cluster · $0.00015
Shopping SERP$0.0001540 rows, 37 stores
Product page$0.00015direct merchant links
A price you can use · cheapest first
The cluster$0.00015
Apify damilo$0.0053
The store$0.01
Nordstrom$0.093
Check the pack size
Read the title$0.00
Stock at a zip$0.01only if you need the shelf
Back to you
rowpriced bycost
1The cluster$0.00045
2The cluster$0.00045
3not listed$0.0003
4The store$0.01575
5The cluster$0.00045
5 of 5 rows$0.0174
Say this to your agent
>price these products across every store that carries them, cheapest source first, and show the price per unit: <paste product names>
“print the pack size”the cheapest row was half the pack and 23.6% more per unit
“plain english, not the SKU”the manufacturer's part number returned a coin cell and a lantern battery
“rank on price per unit”the count refinement has no bucket for a pack size and leaks single cells into the range you pick
“ignore old_price”it frequently holds a unit price, so a discount computed from it read as a 1,500% rise

One key. 1,700+ tools.

The ecommerce aisle is 39 endpoints. Twelve of them are TikTok Shop.

Every store, one calllitescrape · $0.00015 / call
Open the product itselflitescrape · $0.00015 / call
The same SERP, typedapify · $0.00525 / result
On-sale and discount flagsapify · $0.0075 / result
Walmart, Kroger, Meijermrscraper · $0.01 / call
Home Depot and CVSmrscraper · $0.01 / call
Amazon by ASINmrscraper · $0.05 / call
Lazada, 1688, Sheinmrscraper · $0.01 to $0.03
Amazon search and reviewsapify · from $0.00015
TikTok Shop listingstikhub · $0.0015 / call

+ 1,700 more across 55 providers

Browse the catalog →