Mercari API: Search listings
Searches Mercari US listings for items for sale or sold, with condition, price and sorting filters, and adds seller, size and shipping details from each item page. Sold prices are displayed listing prices.
Unofficial. Not affiliated with or endorsed by Mercari.
Inputs
Values from the run on Oct 31, 2026, shown under Output.
- Sort optional
sort Results order, such as newest.
price_low_to_high
One of
best_match,newest,price_low_to_high,price_high_to_low. Defaultbest_match.- Query, required
query Words to search for, such as Nintendo Switch OLED.
Coach purse
- Condition optional
condition Item condition, such as good.
good
One of
any,new,like_new,good,fair,poor. Defaultany.- Max Price optional
max_price Highest item price in USD, such as 200.
200
Number 0 or more.
- Min Price optional
min_price Lowest item price in USD, such as 50.
20
Number 0 or more.
- Sold Only optional
sold_only Show only sold listings, such as true.
true
True or false. Default
false.- Max Results optional
max_results Maximum listings to return, such as 30 (up to 120).
6
Whole number from 1 to 120. Default
30.
Input as JSON
{ "sort": "price_low_to_high", "query": "Coach purse", "condition": "good", "max_price": 200, "min_price": 20, "sold_only": true, "max_results": 6}Output
{ "listings": [ { "size": null, "sold": true, "brand": "Coach", "price": 20, "title": "Coach multi colored purse", "item_id": "m87446295908", "currency": "USD", "condition": "Good", "image_link": "https://u-mercari-images.mercdn.net/photos/m87446295908_1.jpg?1740096780" , "seller_name": "Lupita's Chancla", "listing_link": "https://www.mercari.com/us/item/m87446295908/" , "free_shipping": false, "seller_rating": 5 }, { "size": null, "sold": true, "brand": "Coach", "price": 20, "title": "Coach Leather purse", "item_id": "m85070668676", "currency": "USD", "condition": "Good", "image_link": "https://u-mercari-images.mercdn.net/photos/m85070668676_1.jpg?1740096939" , "seller_name": "Lupita's Chancla", "listing_link": "https://www.mercari.com/us/item/m85070668676/" , "free_shipping": false, "seller_rating": 5 }, { "size": null, "sold": true, "brand": "Coach", "price": 20, "title": "Coach grey purse", "item_id": "m29393594445", "currency": "USD", "condition": "Good", "image_link": "https://u-mercari-images.mercdn.net/photos/m29393594445_1.jpg?1740096082" , "seller_name": "Lupita's Chancla", "listing_link": "https://www.mercari.com/us/item/m29393594445/" , "free_shipping": false, "seller_rating": 5 } ]}Code
curl https://api.fous.com/v1/runs \ -H "Authorization: Bearer $FOUS_API_KEY" \ -H "Content-Type: application/json" \ -d '{"method":"mercari.com/search_listings","input":{"sort":"price_low_to_high","query":"Coach purse","condition":"good","max_price":200,"min_price":20,"sold_only":true,"max_results":6}}' # Save as fous.py, then run: python3 fous.pyimport json, os, timefrom urllib.error import HTTPErrorfrom urllib.request import Request, urlopenAPI = "https://api.fous.com/v1/runs" KEY = os.environ["FOUS_API_KEY"]HEADERS = { "Authorization": f"Bearer {KEY}", "Content-Type": "application/json" ,}def call(url, body=None): data = json.dumps(body).encode() if body else None request = Request(url, data, HEADERS) try: with urlopen(request, timeout=120) as r: return r.status, json.load(r) except HTTPError as error: message = json.load(error)["error"]["message"] raise RuntimeError(message) from errorstatus, run = call(API, { "method": "mercari.com/search_listings" , "input": { "sort": "price_low_to_high", "query": "Coach purse", "condition": "good", "max_price": 200, "min_price": 20, "sold_only": True, "max_results": 6 }})# 202: still going after 30 s. Ask again until it ends.while status == 202: time.sleep(2) status, run = call(f"{API}/{run['id']}")print(json.dumps(run["data"], indent=2))// Save as fous.mjs, then run: node fous.mjsconst api = "https://api.fous.com/v1/runs" ;const headers = { Authorization: `Bearer ${process.env.FOUS_API_KEY}`, "Content-Type": "application/json" ,};let response = await fetch(api, { method: "POST", headers, body: JSON.stringify({ "method": "mercari.com/search_listings" , "input": { "sort": "price_low_to_high", "query": "Coach purse", "condition": "good", "max_price": 200, "min_price": 20, "sold_only": true, "max_results": 6 } }), signal: AbortSignal.timeout(120_000),});let run = await response.json();// 202: still going after 30 s. Ask again until it ends.while (response.status === 202) { await new Promise((done) => setTimeout(done, 2_000)); response = await fetch(`${api}/${run.id}`, { headers }); run = await response.json();}if (!response.ok) throw new Error(run.error.message);console.log(run.data);# Connect your agent to Fous once, over MCP (Streamable HTTP):# https://api.fous.com/mcp# Set FOUS_API_KEY first: create a key at https://app.fous.com/keys.# Claude Codeclaude mcp add \ --scope user \ --transport http fous https://api.fous.com/mcp \ --header "Authorization: Bearer ${FOUS_API_KEY:?Set FOUS_API_KEY to your Fous API key}"# Codexcodex mcp add fous \ --url https://api.fous.com/mcp \ --bearer-token-env-var FOUS_API_KEY# Cursor, VS Code, Windsurf, Cline and morenpx -y add-mcp https://api.fous.com/mcp -g -n fous \ --header "Authorization: Bearer ${FOUS_API_KEY:?Set FOUS_API_KEY to your Fous API key}"# Then ask your agent:# "Use Fous to run mercari.com/search_listings# with {"sort":"price_low_to_high","query":"Coach purse","condition":"good","max_price":200,"min_price":20,"sold_only":true,"max_results":6}"Over HTTP, the answer’s data holds the output. A run still going after 30 seconds answers 202 with its id: ask GET /v1/runs/{id} until it ends.
Schema
Input schema
{ "type": "object", "required": [ "query" ], "properties": { "sort": { "enum": [ "best_match", "newest", "price_low_to_high", "price_high_to_low" ], "type": "string", "default": "best_match", "description": "Results order, such as newest." }, "query": { "type": "string", "minLength": 1, "description": "Words to search for, such as Nintendo Switch OLED." }, "condition": { "enum": [ "any", "new", "like_new", "good", "fair", "poor" ], "type": "string", "default": "any", "description": "Item condition, such as good." }, "max_price": { "type": "number", "minimum": 0, "description": "Highest item price in USD, such as 200." }, "min_price": { "type": "number", "minimum": 0, "description": "Lowest item price in USD, such as 50." }, "sold_only": { "type": "boolean", "default": false, "description": "Show only sold listings, such as true." }, "max_results": { "type": "integer", "default": 30, "maximum": 120, "minimum": 1, "description": "Maximum listings to return, such as 30 (up to 120)." } }}Output schema
{ "type": "object", "required": [ "listings" ], "properties": { "listings": { "type": "array", "items": { "type": "object", "required": [ "title", "price", "currency", "condition", "brand", "size", "sold", "seller_name", "seller_rating", "free_shipping", "image_link", "listing_link", "item_id" ], "properties": { "size": { "type": [ "string", "null" ] }, "sold": { "type": "boolean" }, "brand": { "type": [ "string", "null" ] }, "price": { "type": "number", "description": "USD price." }, "title": { "type": "string" }, "item_id": { "type": "string" }, "currency": { "type": "string" }, "condition": { "type": [ "string", "null" ] }, "image_link": { "type": [ "string", "null" ] }, "seller_name": { "type": [ "string", "null" ] }, "listing_link": { "type": "string" }, "free_shipping": { "type": [ "boolean", "null" ] }, "seller_rating": { "type": [ "number", "null" ], "description": "Average rating out of five." } } } } }}- Price
- 1 credit per completed run (1¢ with pay as you go); failed runs are free.
- Method
mercari.com/search_listings- Returns
- title, price, condition, brand, size, sold, seller name and rating, free shipping, image, link, item id
Use it from your agent
Give your agent this line. It reads SKILL.md, gets a Fous API key and connects the Fous MCP server. Its run then takes the method mercari.com/search_listings with the inputs above.
Ask your agent
- Find sold Mercari listings for Lululemon Align leggings so I can see what they actually went for
- What are the cheapest like-new AirPods Pro 2 for sale right now under $150? Sort lowest price first.
- Show me the newest listings for vintage Pyrex bowls between $20 and $80, include seller ratings and whether shipping is free
- On mercari.com, pull up to 60 sold Pokemon Charizard cards in good condition, highest price first
- I'm looking for a used Canon AE-1 film camera, any condition, max $250. List title, price, seller and link.
See more
Finds OfferUp items for sale near a US city or ZIP code, with prices, condition, seller names, distance and links. Distances use approximate listing locations.
offerup.com/search_listingsSearches Macy's products in the site's order with optional USD price bounds, sale-only results and sorting. Prices for products with a range use the lowest shown price.
macys.com/search_productsSearches AliExpress listings by product words, shipping destination, price range and sort order. Unpriced promotional cards are omitted; free shipping is marked only when the listing explicitly says so.
aliexpress.com/search_productsSearches public Vinted listings in one country with brand, size, condition, price and sorting filters. Returns up to 96 available items with seller usernames when the public profile is available.
vinted.com/search_listingsSearches Rakuten Ichiba products by keyword, price range, free shipping and sort order. Returns up to 45 regular listings in the order shown; sponsored placements are excluded. Prices are listed starting prices when an item has variants.
rakuten.co.jp/search_productsSearch Nordstrom products by words, price, sale status and sort order. Prices are the lowest listed price. Available sizes may be empty when a product page is unavailable.
nordstrom.com/search_productsSearches Best Buy US products with an optional price range, sort order and page. Prices and availability come from public listings and may vary by location.
bestbuy.com/search_productsSearches CarMax used cars by make and model with optional ZIP, distance, year, price and mileage filters, keeping CarMax's order. Pages expose only the first 48 cars; distance is CarMax's distance from the selected local store, and larger limits or narrow distance filters may return fewer matches.
carmax.com/search_cars