Product search

Search Amazon, Best Buy, StockX, GOAT, Target, Walmart, PetSmart and Sam's Club by keyword: the products each site shows, in one result shape, with ids ready for POST /v1/products.

Embed
Preview of the card
<a href="https://scrapelyserp.com/docs/product-search"><img src="https://scrapelyserp.com/docs/_api/public/orgs/affc5b0f-d3c2-423a-8143-9d10db5736ae/spaces/981e6275-da3f-446c-82de-889f59c83b6f/pages/a7a6fe6b-3463-4088-adcc-046e05a40052/social-card.svg?v=3e7ae33eec8b" alt="Product search" width="600" height="315"></a>

Search Amazon, Best Buy, StockX, GOAT, Target, Walmart, PetSmart and Sam's Club by keyword: the products each site shows, in one result shape, with ids ready for POST /v1/products.

At a glance

Every endpoint here answers { endpoint, url, credits, duration_ms, data } with data in one shape (SearchResults): query, page, total_results, next_page and results. Each result has position, id, title, url, brand, image, price, price_max, list_price, rating, reviews_count, in_stock and sponsored; a field the site does not show is null (price_max is only there for products sold at several prices). Send next_page back as page for more; positions continue across pages.

Endpoint

id is

Typical

GET /v1/structured/amazon/search

the ASIN

about 400,000 results per credit, 16 to 60 per page

GET /v1/structured/bestbuy/search

the SKU

about 12.5 million results per credit, 50 per page

GET /v1/structured/stockx/search

the product slug

about 15 million results per credit, 40 per page

GET /v1/structured/goat/search

the product slug

about 7.5 million results per credit, 24 per page

GET /v1/structured/target/search

the TCIN

about 1.3 million results per credit, 24 per page

GET /v1/structured/walmart/search

the item id

about 1 million results per credit, 25 per page

GET /v1/structured/petsmart/search

the product id

about 350,000 results per credit, 40 per page

GET /v1/structured/samsclub/search

the item id

about 900,000 results per credit, about 45 per page

GET /v1/structured/walgreens/search

the product id

about 1.3 million results per credit, up to 72

GET /v1/structured/cvs/search

the product id

about 450,000 results per credit, up to 40 per page

GET /v1/structured/bjs/search

the item number

about 4.5 million results per credit, up to 100 per page

GET /v1/structured/tcgplayer/search

the product id

about 1.3 million results per credit, 50 per page

GET /v1/structured/staples/search

the item id

about 25 million results per credit, up to 100 per page

GET /v1/structured/kohls/search

the product id

about 5 million results per credit, up to 120 per page

GET /v1/structured/officedepot/search

the sku

about 275,000 results per credit, 24 per page

GET /v1/structured/ikea/search

the item number

about 1.5 million results per credit, up to 100 per page

GET /v1/structured/poshmark/search

the listing id

about 2 million results per credit, up to 100 per page (48 sold)

GET /v1/structured/gamestop/search

the product id

about 10 million results per credit, up to 200 per page

GET /v1/structured/dicks/search

the sku

about 5 million results per credit, up to 144 per page

GET /v1/structured/grailed/search

the listing id

about 20 million results per credit, up to 100 per page

GET /v1/structured/macys/search

the product id

about 350,000 results per credit, 60 to 64 per page

GET /v1/structured/sephora/search

the product id with its sku

about 1.5 million results per credit, up to 200 per page

GET /v1/structured/newegg/search

the item number

about 3 million results per credit, up to 100 per page

GET /v1/structured/ulta/search

the item id (product id and sku, joined by a colon)

about 2.3 million results per credit, up to 64 per page

GET /v1/structured/whatnot/search

the listing id

about 25 million results per credit, up to 50 per page

GET /v1/structured/kroger/search

the UPC

about 400,000 results per credit, 24 per request

GET /v1/structured/homedepot/search

the item number

about 7.5 million results per credit, up to 40 per page

GET /v1/structured/wayfair/search

the sku (Wayfair has no product lookup)

about 600,000 results per credit, up to 100 per request

GET /v1/structured/reverb/search

the listing id

about 2.5 million results per credit, up to 50 per page

curl -G "https://api.scrapelyserp.com/v1/structured/bestbuy/search" \
  -H "Authorization: Bearer $SCRAPELY_API_KEY" \
  --data-urlencode "query=air fryer" \
  -d sort=price_low

sort takes one set of names on every site; each site accepts only the orders it actually supports, and any other value is a free 400 that lists the ones it does.

sort

Order

Amazon

Best Buy

StockX

GOAT

Target

Walmart

PetSmart

Sam's Club

Walgreens

CVS

BJ's

TCGplayer

Staples

Kohl's

Office Depot

IKEA

Poshmark

GameStop

Dick's Sporting Goods

Grailed

Macy's

Sephora

Newegg

Ulta Beauty

Whatnot

Kroger

The Home Depot

Wayfair

Reverb

best_match

the site's own order (default)

yes

yes

yes

yes

yes

yes

yes

yes

yes

yes

yes

yes

yes

yes

yes

yes

yes

yes

yes

yes

yes

yes

yes

yes

yes

best_selling

best sellers first

yes

yes

yes

yes

yes

yes

yes

yes

yes

yes

trending

most traded lately first

yes

yes

price_low

cheapest first

yes

yes

yes

yes

yes

yes

yes

yes

yes

yes

yes

yes

yes

yes

yes

yes

yes

yes

yes

yes

yes

yes

yes

yes

yes

price_high

most expensive first

yes

yes

yes

yes

yes

yes

yes

yes

yes

yes

yes

yes

yes

yes

yes

yes

yes

yes

yes

yes

yes

yes

yes

rating

best rated first

yes

yes

yes

yes

yes

yes

yes

yes

yes

yes

yes

newest

newest first

yes

yes

yes

yes

yes

yes

yes

yes

yes

yes

yes

yes

yes

yes

yes

yes

yes

yes

listing_low

cheapest listing first

yes

name

by name, A to Z

yes

discount

biggest discount first

yes

yes

From search to tracking

Each id is what POST /v1/products takes for that platform, and what a watchlist tracks: search once, then watch the products you care about.

A search with no matches is a 200 with no results. A page we could not read is 502 TARGET_FAILED and costs nothing.

Amazon

price is the price the result shows (null when it shows none, as for an item with no featured offer) and list_price the struck-through list or typical price when there is one. Sponsored placements are included, in the place Amazon shows them, with sponsored: true. id and asin are both the ASIN. brand and in_stock are always null: send the ASINs to POST /v1/products for brand, stock and the buy box. Amazon picks a list or a grid layout for each query, so a page has 16 to 60 results, and shows at most 20 pages; a keyword that matches nothing, or a page past the last, is an empty list. Prices are Amazon US prices with no ZIP code set.

Parameter

Type

Default

Description

query (required)

string

—

The search terms.

page

integer

1

Results page, 1–20 (Amazon shows at most 20).

sort

best_match, best_selling, price_low, price_high, rating, newest

best_match

Result order. Each site offers only the orders it supports.

Full reference → GET /v1/structured/amazon/search

Best Buy

price is the current price (the sale price when on sale) and list_price the regular price when it differs.

Parameter

Type

Default

Description

query (required)

string

—

The search terms.

page

integer

1

Results page, 1–100.

sort

enum

best_match

Result order. Each site offers only the orders it supports.

Full reference → GET /v1/structured/bestbuy/search

StockX

price is the lowest ask and in_stock whether anything is listed. StockX shows at most 1,000 results for a search (25 pages).

Parameter

Type

Default

Description

query (required)

string

—

The search terms.

page

integer

1

Results page, 1–100.

sort

best_match, trending, best_selling, price_low, newest

best_match

Result order. Each site offers only the orders it supports.

Full reference → GET /v1/structured/stockx/search

GOAT

price is the lowest price across sizes and conditions and list_price the retail price.

Parameter

Type

Default

Description

query (required)

string

—

The search terms.

page

integer

1

Results page, 1–100.

sort

best_match, newest, price_low, price_high, trending, discount

best_match

Result order. Each site offers only the orders it supports.

Full reference → GET /v1/structured/goat/search

Target

price is the current price and list_price the regular price when it differs, both for the store that serves zip (a 5-digit US ZIP code) when you send one, else for Target's default store.

Parameter

Type

Default

Description

query (required)

string

—

The search terms.

page

integer

1

Results page, 1–100.

sort

best_match, best_selling, price_low, price_high, rating, newest

best_match

Result order. Each site offers only the orders it supports.

zip

string

—

A 5-digit US ZIP code. Results reflect that area (local prices, stock and nearby results). Unknown ZIP codes are a free 400.

Full reference → GET /v1/structured/target/search

Walmart

price is the sale price, list_price the list price when it differs, and in_stock whether it can be bought online.

Parameter

Type

Default

Description

query (required)

string

—

The search terms.

page

integer

1

Results page, 1–100.

sort

best_match, best_selling, price_low, price_high

best_match

Result order. Each site offers only the orders it supports.

Full reference → GET /v1/structured/walmart/search

PetSmart

A PetSmart product comes in sizes or flavors at different prices. When they differ, price is the lowest, price_max the highest and list_price is null; when they do not, price is the price and list_price the regular price when it differs. in_stock is whether it can be ordered online. PetSmart shows at most 100 pages for a search.

Parameter

Type

Default

Description

query (required)

string

—

The search terms.

page

integer

1

Results page, 1–100.

sort

best_match, best_selling, price_low, price_high, newest, rating

best_match

Result order. Each site offers only the orders it supports.

Full reference → GET /v1/structured/petsmart/search

Sam's Club

price is the current price and list_price the regular price when it differs. Brand is often null here (null means the page did not show one). Sponsored placements are left out. Sam's Club often refuses a request: the call then answers 502 TARGET_FAILED, not charged, so retry it. A keyword that lands on a category page instead of results is a failure too, never an empty list.

Parameter

Type

Default

Description

query (required)

string

—

The search terms.

page

integer

1

Results page, 1–100.

sort

best_match, price_low, price_high

best_match

Result order. Each site offers only the orders it supports.

Full reference → GET /v1/structured/samsclub/search

Walgreens

One page only, in Walgreens's own order, with up to 72 results; there is no page or sort (a page other than 1 is refused). total_results counts every match, not just the ones returned. price is the current price and list_price the regular price when it is on sale. rating comes in half stars (4.0, 4.5), not exact; null with no reviews. in_stock is false when Walgreens says the item is out of stock or not sold online, true when it offers it for ordering, and null when it does not say. Results are those Walgreens shows for its default location, so which products appear, and their order, can differ between calls. A keyword Walgreens answers with a service page rather than products (such as prescription) is a failure (502 TARGET_FAILED, not charged), never an empty list. Prescription items are not returned.

Parameter

Type

Default

Description

query (required)

string

—

The search terms.

Full reference → GET /v1/structured/walgreens/search

CVS

40 results per page, in CVS's order with no store chosen (so it can differ from what a shopper sees near a store) or lowest price first (sort=price_low; best_match is the default). price is the lowest price of the product and price_max the highest when its variants cost different amounts; list_price is the regular price when the product is on sale at a single price. in_stock is always null: CVS search does not report availability. Sponsored placements and prescription items are left out. CVS often refuses a request: the call then answers 502 TARGET_FAILED, not charged, so retry it. A keyword with no matches is an empty list only when CVS says so; any other unclear answer is a failure, never an empty list.

Parameter

Type

Default

Description

query (required)

string

—

The search terms.

page

integer

1

Results page, 1–100.

sort

best_match, price_low

best_match

Result order. Each site offers only the orders it supports.

Full reference → GET /v1/structured/cvs/search

BJ's

100 results per page, in BJ's own order, by rating (best rated first) or by newest; there is no price order, because BJ's price sort does not follow its price range. price and list_price are always null: BJ's data gives a price range, not the price at a given club, and the current club price is not available. price_range (min and max) is that range, which is not a price: items whose price shows only after sign-in may carry values that do not reflect what a member pays (see BJ's). brand is null when BJ's names none, rating is null with no reviews, and in_stock is always null. A keyword that matches nothing still returns BJ's nearest items rather than an empty list; an answer that is not clearly a list of products or a count of zero is a failure (502 TARGET_FAILED, not charged), never an empty list. Prescription items are not returned.

Parameter

Type

Default

Description

query (required)

string

—

The search terms.

page

integer

1

Results page, 1–100.

sort

best_match, rating, newest

best_match

Result order. Each site offers only the orders it supports.

Full reference → GET /v1/structured/bjs/search

TCGplayer

50 results per page, in TCGplayer's own order unless sort says otherwise. price_low and price_high order by the market price; listing_low orders by the cheapest listing (any condition, so it can be a damaged copy); best_selling is TCGplayer's own sales ranking, which the answer does not let us check; newest is by release date and name A to Z. product_line narrows to one game by its lower-case name (pokemon, yugioh, star-wars-unlimited); a name that matches nothing is an empty list. price is TCGplayer's market price, one figure per product (see TCGplayer), and null when it has none; in_stock is true when at least one listing exists. brand, list_price, rating and reviews_count are always null. An empty list means TCGplayer says there are no matches; any other unclear answer is a failure (502 TARGET_FAILED, not charged), never an empty list.

Parameter

Type

Default

Description

query (required)

string

—

The search terms.

page

integer

1

Results page, 1–100.

sort

enum

best_match

Result order. Each site offers only the orders it supports.

product_line

string

—

Only this game or product line, by its lower-case name (pokemon, yugioh, magic, star-wars-unlimited). A name that matches nothing is an empty list.

Full reference → GET /v1/structured/tcgplayer/search

Staples

100 results per page, in Staples' own order or by price (price_low, price_high), up to page 100 (10,000 results); total_results can be larger than that. price is Staples' price for one unit (see Staples); it is null for a set of options (an id starting SS). brand is null when none is given. list_price, rating, reviews_count and in_stock are always null: search does not carry them, so ask POST /v1/products for the ids you want. A keyword that matches nothing still returns Staples' nearest item (one result; for a nonsense word we saw a single set of options with a made-up title) rather than an empty list; an empty list means Staples says there are no matches. Any other unclear answer is a failure (502 TARGET_FAILED, not charged), never an empty list.

Parameter

Type

Default

Description

query (required)

string

—

The search terms.

page

integer

1

Results page, 1–100.

sort

best_match, price_low, price_high

best_match

Result order. Each site offers only the orders it supports.

Full reference → GET /v1/structured/staples/search

Kohl's

120 results per page, in Kohl's own order unless sort says otherwise: newest is its New Arrivals, price_low and price_high order by price (descending is close, not exact: a product priced as a range sits by its other end), and rating is its Highest Rated order, which favours products with many good reviews over a high average. category lists one Kohl's category instead of (or together with) a keyword: send the CN= part of a Kohl's catalog link, such as Gender:Mens+Category:Bottoms+Department:Clothing; query is then optional and narrows within it. A request with neither is refused, and so is a category Kohl's does not recognize (502 TARGET_FAILED, not charged). price is the regular price, or the sale price when marked down, and never the 20% coupon price Kohl's pages lead with. A product with options at different prices has price null and a price_range; list_price is the regular price of a product on sale at one price. Sponsored placements are left out. brand and in_stock are always null (see Kohl's). A keyword that matches nothing still returns Kohl's closest items (33 for a nonsense word we tried) rather than an empty list; an empty list means Kohl's says there are no matches. A page past the last, and any other unclear answer, is a failure (502 TARGET_FAILED, not charged), never an empty list.

Parameter

Type

Default

Description

query

string

—

The search terms. Required unless category is given.

category

string

—

A Kohl's category value (the CN= part of a catalog link), e.g. Gender:Mens+Category:Bottoms+Department:Clothing. Lists that category; query then narrows it.

page

integer

1

Results page, 1–100.

sort

best_match, newest, price_low, price_high, rating

best_match

Result order. Each site offers only the orders it supports.

Full reference → GET /v1/structured/kohls/search

Office Depot

24 results per page, in Office Depot's own order unless sort says otherwise: price_low and price_high order by price, and rating is its Customer Rating order, which favours products with many good reviews over a high average. Its New Arrival order could not be told apart from the default and is not offered. price is the price for one unit (see Office Depot). list_price and in_stock are always null: Office Depot's search results show a wrong list price and a wrong stock status, so ask POST /v1/products for the skus you want. Sponsored placements are left out, and a product Office Depot lists twice is returned once. A keyword that matches nothing does not return an empty list: Office Depot answers with 200 of its products, 24 a page, and total_results is exactly 200; nothing else in the answer marks it. A genuine search reports its true total (84 or 487, say), so a total_results of 200 whose titles share none of your words means no match. An empty list means Office Depot says there are no matches; any other unclear answer is a failure (502 TARGET_FAILED, not charged), never an empty list.

Parameter

Type

Default

Description

query (required)

string

—

The search terms.

page

integer

1

Results page, 1–100.

sort

best_match, price_low, price_high, rating

best_match

Result order. Each site offers only the orders it supports.

Full reference → GET /v1/structured/officedepot/search

IKEA

100 results per page, in IKEA's own order unless sort says otherwise: price_low and price_high order by price, newest is its newest first, and rating is its best rated first. category lists one IKEA category instead of (or together with) a keyword: send its category key, such as fu003 (sofas & sectionals); query is then optional and narrows within it. A request with neither is refused, and so is a category key IKEA does not recognize (502 TARGET_FAILED, not charged). price is IKEA's public price; the IKEA Family member price is given by POST /v1/products, not here. list_price is the earlier or regular price of a marked-down product. brand and in_stock are always null (see IKEA). A keyword that matches nothing returns an empty list (total_results 0). A page past the last, and any other unclear answer, is a failure (502 TARGET_FAILED, not charged), never an empty list.

Parameter

Type

Default

Description

query

string

—

The search terms (at most 150 characters). Required unless category is given.

category

string

—

An IKEA category key, e.g. fu003 (sofas & sectionals). Lists that category; query then narrows it.

page

integer

1

Results page, 1–100.

sort

best_match, price_low, price_high, newest, rating

best_match

Result order. Each site offers only the orders it supports.

Full reference → GET /v1/structured/ikea/search

Poshmark

Up to 100 listings per page, 48 with status=sold, in Poshmark's own order unless sort says otherwise (newest is just listed). Poshmark pages with a cursor, not a page number: send next_cursor back as cursor (asked with the same status); page is refused, next_page is always null and position counts within the page. About 5,000 listings are reachable for one query, however large total_results is (it stops at 10,000), so narrow with condition=new_with_tags, min_price and max_price (dollars) to see more. status=sold lists sold listings and costs about 5 times as much per listing; it takes sort and condition but not the price filters. price is the seller's listing price, never including fees or shipping; list_price is the original price the seller gave and null when none (never 0). in_stock is true for an available listing and false for a sold one, and poshmark.sizes has the quantity per size. poshmark.condition is new_with_tags or Poshmark's own code (uln, ug, uf, not_nwt), and null when the seller set none, which is common on used listings. rating and reviews_count are always null: Poshmark listings have none, and no sold date is reported. A keyword that matches nothing still returns loose matches (99 for a nonsense word we tried) rather than an empty list; an empty list means Poshmark's own total is 0. Any other unclear answer is a failure (502 TARGET_FAILED, not charged), never an empty list.

Parameter

Type

Default

Description

query (required)

string

—

The search terms.

cursor

string

—

The next_cursor of the previous page, asked with the same status. Poshmark pages by cursor, so there is no page.

sort

best_match, newest, price_low, price_high

best_match

Result order. Each site offers only the orders it supports.

status

available, sold

available

Listings for sale, or sold ones. Sold costs about 5 times as much per listing and returns 48 per page.

condition

new_with_tags

—

Only listings new with tags.

min_price

string

—

Lowest listing price, in dollars (a number). Not with status=sold.

max_price

string

—

Highest listing price, in dollars (a number). Not with status=sold.

Full reference → GET /v1/structured/poshmark/search

GameStop

200 results per page, in GameStop's own order unless sort says otherwise: popular is its most ordered in the last week, newest its newest releases, and price_low and price_high order by price. New, pre-owned, digital and refurbished copies are separate products; a row shows one of them, and the products endpoint lists the others as gamestop.siblings. price is the current price of the row's id; a pre-owned price can be higher than the new one. There is no list price, rating or stock: those are null. A keyword that matches no word returns an empty list, not GameStop's fuzzy near-matches.

Parameter

Type

Default

Description

query (required)

string

—

The search terms.

page

integer

1

Results page, 1–100.

sort

best_match, popular, price_low, price_high, newest

best_match

Result order. Each site offers only the orders it supports.

Full reference → GET /v1/structured/gamestop/search

Dick's Sporting Goods

144 results per page, in Dick's own order unless sort says otherwise: price_low and price_high follow the highest price Dick's has on file for a product, which can be a later non-sale price, so current prices are close to ordered, not exact. brand narrows to one brand, spelled as Dick's does (Nike; nike matches nothing, an empty list). Each result is a style shown in one colour; its id is the sku of that colour and one size, and it goes straight into POST /v1/products for that sku's price and stock. price is the price in force now, and list_price is the regular price when marked down. rating and reviews_count are Dick's own and null for an unrated product. in_stock and image are always null. A keyword that matches nothing still returns Dick's closest items (2 for a nonsense word we tried) rather than an empty list. A page past the last, and any other unclear answer, is a failure (502 TARGET_FAILED, not charged), never an empty list.

Parameter

Type

Default

Description

query (required)

string

—

The search terms.

page

integer

1

Results page, 1–100.

sort

best_match, price_low, price_high

best_match

Result order. Each site offers only the orders it supports.

brand

string

—

Only this brand, spelled as Dick's does, capital letters included (Nike, Under Armour; nike matches nothing). A name that matches nothing is an empty list.

Full reference → GET /v1/structured/dicks/search

Grailed

Up to 100 listings per page, in Grailed's own order unless sort says otherwise: best_match is its popularity order, newest just listed, price_low and price_high by asking price (by sold price with status=sold). status is available (the default) or sold; sold lists the listings that sold, most recently sold first. Only the first 1,000 listings of a query can be reached (page 1 to 10), however large total_results is: narrow with department, condition, min_price and max_price (whole dollars, on the asking price), size and designer to see more. price is the asking price, also on a sold listing, where the sold price can be lower (an accepted offer): read grailed.soldPrice and grailed.soldAt there. list_price is the first price in the listing's price-drop history, null when the price never dropped. rating and reviews_count are always null: listings have none (the seller's rating is grailed.sellerRating). in_stock is true for an available listing and false for a sold one. A keyword that matches nothing returns an empty list (total_results 0). Each id is what POST /v1/products takes for Grailed.

Parameter

Type

Default

Description

query (required)

string

—

The search terms.

page

integer

1

Results page, 1–10 (100 listings each: the first 1,000 of a query).

sort

best_match, newest, price_low, price_high

best_match

Result order: best_match is Grailed's own order, newest just listed (most recently sold with status=sold), price_low and price_high by asking price (by sold price with status=sold).

status

available, sold

available

Listings for sale, or sold ones (with their sold price and date).

department

menswear, womenswear

—

Only this department.

condition

new, gently_used, used, worn

—

Only listings in this condition.

min_price

string

—

Lowest asking price, in whole dollars.

max_price

string

—

Highest asking price, in whole dollars.

size

string

—

Only this size, as Grailed writes it (l, 10, 36, 7.5); capital letters do not matter.

designer

string

—

Only listings by this designer (Nike); capital letters do not matter. Collaborations match each of their designers. A name that matches nothing is an empty list.

Full reference → GET /v1/structured/grailed/search

Macy's

60 to 64 results per page, in Macy's own order unless sort says otherwise: best_selling, newest and rating (its Customers' Top Rated) are Macy's own orders, and price_low and price_high order by price. category lists one Macy's category instead of a keyword: send its category id, the number after id= in a Macy's category link (20635 is men's dress shirts); a link containing id= is accepted. Send query or category, not both. A category Macy's does not recognize is a failure (502 TARGET_FAILED, not charged), and so is a page past the last. price is the regular price, or the sale price when marked down, and never a coupon price. A product with options at different prices has price null and a price_range; list_price is the regular price of a product on sale at one price. in_stock is Macy's own flag on the product, and null for a collection of products (a master listing that groups many) because the listing gives none; brand is Macy's. Some keywords (tv, mattress) send you to a category listing instead: you get that listing. A keyword that matches nothing does not return an empty list: Macy's relaxes the query and answers about 60 of its products on page 1 (a nonsense word we tried gave 97 in total), and nothing in the answer marks it. A total_results that is small with titles that share none of your words means no match. An empty list means Macy's says there are no matches; any other unclear answer is a failure (502 TARGET_FAILED, not charged), never an empty list.

Parameter

Type

Default

Description

query

string

—

The search terms. Required unless category is given; not with category.

category

string

—

A Macy's category id (the number after id= in a category link), e.g. 20635. Lists that category; not with query.

page

integer

1

Results page, 1–100.

sort

best_match, best_selling, newest, price_low, price_high, rating

best_match

Result order. Each site offers only the orders it supports.

Full reference → GET /v1/structured/macys/search

Sephora

200 results per page, in Sephora's own order unless sort says otherwise: price_low and price_high follow the lowest price shown for a product, top_rated and best_selling are Sephora's own orders and newest puts new arrivals first. Each result is a product shown in one sku (shade or size); its id is the product id with that sku and goes straight into POST /v1/products. A product with several sizes or shades has one card with a price range: price is the lowest price shown, price_max the highest when no sku is on sale, and null when one is (the card does not say which sizes are). list_price is set only when the card shows exactly one regular and one sale price. For the real price of a sku, look it up. rating and reviews_count are Sephora's own (null when unrated). in_stock is always null. A keyword that matches nothing at all returns an empty list, but a nonsense word usually returns Sephora's closest products (we saw 66 and 100), so check the titles; a product id or sku as the keyword finds nothing.

Parameter

Type

Default

Description

query (required)

string

—

The search terms.

page

integer

1

Results page, 1–100.

sort

best_match, price_low, price_high, top_rated, best_selling, newest

best_match

Result order. price_low and price_high follow the lowest price shown for a product.

Full reference → GET /v1/structured/sephora/search

Newegg

Newegg has no keyword search here: query is refused (a free 400). The results Newegg shows beside a keyword are mostly paid placements, which are not offered, and no typeahead is offered either. What is offered is a category listing: send category (one of the keys in the table above) and page through it. 100 products per page, up to page 75 (7,500 products); a larger category is listed in Newegg's own order, by sales, and sort is not offered. Only those categories are available: the rest of Newegg's departments (home, gaming, appliances and so on) are not. total_results is the category's own total. About 4 in 100 of a category's products never appear when paging it, so a listing is close to, not exactly, the whole category. price is the price charged for that item number, after Newegg's instant rebate (the rebate itself is on POST /v1/products); list_price is Newegg's price before it, when higher. It is usually Newegg's own offer: cheaper marketplace sellers may exist for the same product (see the offers tier). Marketplace sellers' offers are mixed in with Newegg's own. rating and reviews_count are Newegg's own, shared by the offers of one product, and null when unrated; in_stock is Newegg's online stock flag, and a delisted product has no price. Each id goes straight into POST /v1/products. A page past the last, an empty answer and any other unclear answer is a failure (502 TARGET_FAILED, not charged), never an empty list.

Parameter

Type

Default

Description

category (required)

enum

—

The category to list. Keyword search is not offered, and query is refused.

page

integer

1

Results page, 1–75 (100 per page).

Full reference → GET /v1/structured/newegg/search

Ulta Beauty

64 results per page, in Ulta's own order unless sort says otherwise: best_selling, newest and rating are its Best Sellers, New Arrivals and Top Rated orders, and price_low and price_high order by price (a product priced as a range sits by one of its ends). rating is a pure rating order: it lists products with five stars and few reviews first, so it is not a quality ranking. Sponsored placements are left out. Each result is a product shown in one shade or size, and its id is the product id and that sku joined by a colon: it goes straight into POST /v1/products for that sku's price and stock. price is the current price; a product whose shades or sizes cost different amounts has no price and a price_range instead, and list_price is the regular price of a product marked down at one price. rating and reviews_count are Ulta's own and null for an unrated product. in_stock is always null: search carries no stock. Ulta's search takes keywords only: there is no category browse here. A phrase that matches nothing at all is an empty list, but a nonsense phrase can still return a few unrelated products (4 for one we tried). A page past the last is an empty list with the total. An answer that is not clearly a list of products or a count of none is a failure (502 TARGET_FAILED, not charged, retry it), not an empty list.

Parameter

Type

Default

Description

query (required)

string

—

The search terms.

page

integer

1

Results page, 1–100.

sort

best_match, best_selling, price_low, price_high, newest, rating

best_match

Result order. Each site offers only the orders it supports.

Full reference → GET /v1/structured/ulta/search

Whatnot

Up to 50 listings per page, in Whatnot's own order unless sort says otherwise (newest is newly listed). Whatnot pages with a cursor, not a page number: send next_cursor back as cursor; page is refused, next_page is always null and position counts within the page. A page can hold fewer than 50 listings with more to come: stop when next_cursor is null. total_results stops at 10,000. format=buy_it_now or format=auction keeps one kind of listing. price is the price Whatnot lists, in dollars, never including shipping or tax; for an auction it is the listing price, not a bid (whatnot.currentBid is the highest bid, null before the first one). Sellers put placeholder prices on listings that are really announcements ("bookmark for my next show"): a price of 900,000 dollars or more is returned as null with whatnot.placeholderPrice: true, so sort=price_high begins with many null prices. Prices just under that line can still be a seller's joke price. rating and reviews_count are always null: a listing has none. whatnot.seller carries the SELLER's rating out of 5 and review count, which describe the seller across all their sales and not this item. in_stock is true for an active listing with a quantity of 1 or more, and null otherwise (search lists only listings for sale). Pictures are left out (image is null) unless you pass images=true, which makes a page about nine times as costly. A keyword that matches nothing is an empty list (total_results 0). Any answer that is not clearly a list of listings or a total of zero, including a page past the end, is a failure (502 TARGET_FAILED, not charged, retry it), never an empty list.

Parameter

Type

Default

Description

query (required)

string

—

The search terms.

cursor

string

—

The next_cursor of the previous page. Whatnot pages by cursor, so there is no page.

sort

best_match, price_low, price_high, newest

best_match

Result order. newest is newly listed. price_high begins with listings whose placeholder price is returned as null.

format

buy_it_now, auction

—

Only buy-it-now listings, or only auction listings.

images

boolean

false

Return the first picture as image. Makes a page about nine times as costly. Cost: about 9x.

Full reference → GET /v1/structured/whatnot/search

Kroger

24 results per request, best match first, with no paging and no sort (page and sort are refused). total_results is Kroger's own count for the query, up to 1,000: when it is above 24, add brand (the exact name as a result's brand writes it, capital letters matter) to see another slice. Prices and stock are those of one store, the one Kroger picks for the request (the nearest to where the request is served from), reported once as kroger.store (locationId, banner, city, state); zip steers the request to an area but not to an exact store, so always read kroger.store. banner searches a sister banner (ralphs, fredmeyer…). price is the regular price of one unit, also when a multi-buy applies (kroger.multiBuy: 10 for $10.00 has price 1.00); a sale is kroger.promo, with conditional: true and the condition when it needs a purchase (buy 3 or more). list_price is always null. rating and reviews_count are Kroger's own and null when a product has none. in_stock is Kroger's pickup flag at the store; kroger.stockLevel and kroger.available are the store's own. A product sold out with no regular price has a null price. Sponsored results are left out, so a page can hold fewer than 24. A keyword that matches nothing is an empty list (total_results 0). Each id is what POST /v1/products takes for Kroger. A product lookup costs more per product than search does, so for the prices of many products, search is the cheaper way.

Parameter

Type

Default

Description

query (required)

string

—

The search terms.

brand

string

—

Only products of this brand, written exactly as Kroger's brand of a result (Horizon Organic; capital letters matter). A name that matches no product is an empty list.

banner

enum

kroger

Which Kroger-family store brand to search: kroger (the default) or one of its sister banners. Each has its own stores, so the same query can differ.

zip

string

—

A 5-digit US ZIP code. Steers the request to that area, so the store priced is one near there, not necessarily the nearest to the ZIP: kroger.store says which. Unknown ZIP codes are a free 400.

Full reference → GET /v1/structured/kroger/search

The Home Depot

Up to 40 products per page, in Home Depot's own order unless sort says otherwise: price_low and price_high order by price, and rating is its best rated first. Prices and stock are those of one store: send store (a store number such as 7222) or postal_code (a Canadian postal code, which picks the store nearest to it), and read homedepot.store for the store that was priced; with neither, the default store is used (Fort Saskatchewan, AB). A store number that does not exist, or a postal code with no store near it, is a free 404, never an empty list. price is the price in Canadian dollars at that store; list_price is the earlier price of a marked-down product and null otherwise. rating and reviews_count are Home Depot's own, and null for a product with no reviews (never 0). in_stock is true when the product is in stock in the store or online, false when it is out of stock in both, and null when Home Depot gives neither; the unit counts for the store and for online are in homedepot.stockAtStore and homedepot.stockOnline. A keyword Home Depot cannot match is not an empty list: it answers with one loosely matching product (total_results 1), so check the title. total_results is 0 only when Home Depot says so (then the list is empty). A page past the last, and any other unclear answer, is a failure (502 TARGET_FAILED, not charged), never an empty list. Each id is what POST /v1/products takes for Home Depot.

Parameter

Type

Default

Description

query (required)

string

—

The search terms.

page

integer

1

Results page, 1–250 (40 products each).

sort

relevance, price_low, price_high, rating

relevance

Result order: relevance is Home Depot's own, price_low and price_high by price at the store, rating its best rated first.

store

string

—

A Home Depot store number (7222). Prices and stock are those of this store. Default: store 7222 (Fort Saskatchewan, AB). An unknown store is a free 404.

postal_code

string

—

A Canadian postal code (M5V 2T6): the nearest store is used. Not together with store. A postal code with no store near it is a free 404.

Full reference → GET /v1/structured/homedepot/search

Wayfair

Up to 100 results per request (size, 48 by default), Wayfair's own order unless sort says otherwise: price_low and price_high by price, top_rated by review rating; sale=true keeps marked-down products. Results are always returned: a keyword that matches nothing gets Wayfair's popular products, so an empty list never means "no match" and total_results is always null (Wayfair's own total changes from request to request). Only the first 1,920 results of a query can be reached (page × size at most 1,920). Sponsored products are included, flagged sponsored, and can move between pages. price is the price on the card, list_price the struck-through price (null when there is none). rating and reviews_count are Wayfair's own and null for a product with no reviews. in_stock is true or false only when Wayfair says so, otherwise null: wayfair.stock_status is in_stock, low_stock (in stock, but low) or out_of_stock, and wayfair.stock_message is the card's text ("Low Stock", "13 Left in Stock"). Prices are for one fixed delivery area. There is no POST /v1/products for Wayfair: the id is the sku, and no sku lookup is available.

Parameter

Type

Default

Description

query (required)

string

—

The search terms.

page

integer

1

Results page; page × size must be at most 1920.

size

integer

48

Results per page, 1–100. A page costs in proportion to its size.

sort

best_match, price_low, price_high, top_rated

best_match

Result order: best_match is Wayfair's own order, price_low and price_high by price, top_rated by review rating.

sale

boolean

false

Only products that are marked down.

Full reference → GET /v1/structured/wayfair/search

Reverb

Up to 50 listings per page, in Reverb's own order unless sort says otherwise: best_match is its relevance order, newest just published, price_low and price_high by listed price. status is available (the default) or sold. Only the first 2,500 listings of a query can be reached (page 1 to 50), however large total_results is: narrow with condition, min_price and max_price (whole dollars) and category (a category slug such as electric-guitars; with a category the query is optional). price is the listed price, also on a sold listing, where it is the last price the listing carried: Reverb gives no sold price and no sold date. list_price is the price before a price drop, null when the price never dropped. rating and reviews_count are always null: listings have none, and the shop's rating is only on a product lookup. in_stock is true for an available listing and false for a sold one. A keyword that matches nothing returns an empty list (total_results 0). Each id is what POST /v1/products takes for Reverb.

Parameter

Type

Default

Description

query

string

—

The search terms. Required unless category is given.

category

string

—

A Reverb category slug (electric-guitars, effects-and-pedals). Lists that category; query then narrows it.

page

integer

1

Results page, 1–50 (50 listings each: the first 2,500 of a query).

sort

best_match, newest, price_low, price_high

best_match

Result order: best_match is Reverb's relevance order, newest just published, price_low and price_high by listed price.

status

available, sold

available

Listings for sale, or sold ones (their last listed price; Reverb gives no sold price or date).

condition

mint, excellent, very-good, good, fair

—

Only listings in this condition.

min_price

string

—

Lowest listed price, in whole dollars.

max_price

string

—

Highest listed price, in whole dollars.

Full reference → GET /v1/structured/reverb/search

Updated