API documentation
Amazon (11 marketplaces: US, UK, DE, FR, IT, ES, JP, CA, MX, BR, AU) & Walmart product data — single-ASIN lookups, multi-seller offers, curated product search, warehouse filtering, and live Amazon search-results (SERP) fetches. Served from cache in milliseconds or scraped live. Interactive reference →
Base URL & auth
https://api.logimu.com
Send your key in the X-API-KEY header. Get one with 2,500 free credits at
sign up.
curl "https://api.logimu.com/v1/product?asin=B0BDHQSZCV" \ -H "X-API-KEY: sk_live_..."
Credits
| Call | Credits |
|---|---|
| Curated product search (/v1/shopping) | 2 per query |
| Curated search, detailed (/v1/shopping?detail=true) — per-product intelligence attached | 5 per query |
| Product (/v1/product) — cached, everything included snapshot + all intelligence blocks: full price-change timeline + 30-day events, bought-past-month, every current offer with seller IDs, brand stats | 1 |
| ↳ snapshot only — charged when the product has no intelligence to attach (not a selectable option) | 0.5 |
| ↳ + BSR rank history (bsr_history=true, back to Oct 2023) | +0.5 when returned |
| ↳ + buy-box timeline & per-seller prices (offer_history=true) | +0.5 when returned |
| ↳ live scrape instead of cache | +0.5 |
| ↳ Walmart (no live scrape available) | 1 |
| Warehouse filter search (/v1/search) | 1 per 25 results, every marketplace |
| Live Amazon search results (/v1/serp) — a real live fetch, seconds not ms billed per page actually fetched (request_metadata.pages_fetched), never per page requested — max_page=5 can stop at 2 when Amazon runs out of results; blocked fetches (502) and zero-result answers are never billed | 1 per page fetched |
| Partial scrape, not found, empty, failed, or rate-limited you are never charged for a request that did not return what you asked for, and credits are valid 12 months | 0 — never billed |
Every marketplace costs the same. Cache vs live is chosen per request with
mode and max_age_days (below).
GET /v1/shopping curated search
Keyword in, ranked product recommendations out — in under 100 ms. Broad queries come back grouped by product category; specific ones by Budget / Mid-range / Premium price tier. Within each group our ranking selects the strongest products using Amazon-reported sales, ratings, review counts, and seller and brand signals.
| Param | Notes |
|---|---|
| q | required — the search query. A bare ASIN (or numeric Walmart item ID) returns exactly that product (mode: "asin"). |
| country | us (default), uk, de, ca, au, fr, it, es, jp, mx, br — 11 Amazon marketplaces — plus walmart (Walmart US, numeric item ID) |
| category | optional — keyword filter on the product-category path. Matched against the full path including all parent categories, with singular/plural folding (and German inflection on de). q=coffee maker&category=machine keeps only categories whose path mentions Machine(s); multiple words must all appear. Matching uses word-stem folding (powered ↔ power), max 200 characters. An unmatchable value returns total: 0 — never billed. Prefer broad category words: a filter that excludes every strong match can surface weaker description-level matches rather than an empty set. |
| group | optional — force category, price, or none; default auto |
| q | required — keywords, a bare ASIN, or a bare barcode (UPC/EAN/GTIN, 8–14 digits). An ASIN or barcode returns the product(s) it identifies rather than a keyword search. A barcode can map to several ASINs: gtin_matches lists every ASIN we have mapped to it and gtin_match_count counts them, while results carries the ones we hold current data for — so a 3-match barcode can legitimately return fewer than 3 products. Barcodes are not accepted for country=walmart, where a numeric query is an item ID. |
| sort | optional — relevance (default), price, rating. When grouping is active (the default), results is a concatenation of the per-group lists — each group is sorted internally, but the flat array is not globally sorted. Pass group=none for a globally sorted flat list. |
| detail | optional — true attaches the /v1/product intelligence blocks (30-day price change events, current sellers) to every product. 5 credits per query instead of 2; response takes a few seconds. bought_past_month needs no flag — it is included on every product in every response. |
curl "https://api.logimu.com/v1/shopping?q=toothbrush&country=us" \\ -H "X-API-KEY: sk_live_..."
{
"query": "toothbrush", "country": "us", "currency": "USD",
"total": 1549, "mode": "category",
"groups": [ { "category": "\u2026 > Powered Toothbrushes", "count": 110,
"products": [ { "asin": "B072YVWBXH", "product_id": "B072YVWBXH",
"product_url": "https://www.amazon.com/dp/B072YVWBXH",
"title": "Aquasonic \u2026", "brand": "Aquasonic",
"price": 35.95, "rating": 4.6, "review_count": 136657, "in_stock": true,
"bought_past_month": 7000,
"image_url": "https://\u2026", "amazon_url": "https://www.amazon.com/dp/B072YVWBXH",
"observed_at": "2026-07-22T16:03:48Z" } ] } ],
"facets": { "brands": [ {"value":"Oral-B","count":102,"avg_rating":4.56,"est_monthly_sold":14109} ] },
"credits_charged": 2, "credits_remaining": 2498
}
Demand signal. Every product carries
bought_past_month — the floor of Amazon’s “N+ bought in past
month” badge (e.g. 7000 for “7K+”), measured buyer behavior as
Amazon reports it, null where Amazon shows no badge. Included in every
response — no detail flag required.
Identifiers. Every product carries
product_id and product_url. product_id is the ASIN on
Amazon and the numeric item ID on Walmart; product_url points at the right
storefront (amazon.<tld>/dp/… or walmart.com/ip/…).
Pass product_id straight to /v1/product for that
item’s full history. The older asin and amazon_url keys are still
returned unchanged for compatibility, but note both are misnamed on Walmart (they carry the
item ID and a walmart.com URL) — prefer the product_* pair.
Results are scoped to the product category the query resolves to, so a search for graphics card returns graphics cards rather than whatever unrelated best-seller happens to share a word with the query.
Every product carries observed_at (UTC), the age of the snapshot; stale products (older than ~14 days) are pruned, so it is always recent. Coverage is Amazon best-seller (BSR) products; media (books, music, video)
excluded for now. Same engine as the
product search demo.
GET /v1/product product + intelligence
The single-ASIN product endpoint. One call returns the current snapshot (price, BSR,
rating, reviews, buy-box seller, seller count, FBA, image, sales estimate — cache or live) and
the intelligence blocks: a freshness stamp, the full price-change timeline (price_history, every buy-box price move we ever observed, seller-stamped) plus a 30-day convenience view, the Amazon-reported “bought in past month” badge (measured, not modeled — parsed integer + raw text; Amazon marketplaces only), the current
all-seller snapshot, and brand stats — plus the listing content (2026-08-09):
description with its source, the full image gallery, feature bullets, the complete category
breadcrumb path, the variations matrix, featured reviews and a definite out-of-stock signal
(all Amazon marketplaces; no extra charge). Cached responses return in under 100 ms.
| Param | Notes |
|---|---|
| asin | 10-char ASIN, or a numeric Walmart item ID with country=walmart. Provide either asin or gtin (not both). |
| gtin | optional anchor — a barcode (UPC-12, EAN-13 or GTIN-14) instead of an ASIN. Punctuation and leading zeros are tolerated, so 012345678905, 12345678905 and 0012345678905 all resolve to the same product.
|
| country | us (default), uk, de, ca, au, fr, it, es, jp, mx, br — 11 Amazon marketplaces — plus walmart (Walmart US, numeric item ID) |
| mode | auto (default) · cache · live — snapshot freshness (live scrape: all Amazon marketplaces; not Walmart) |
| bsr_history | optional — true adds per-category BSR rank history: one daily point per category, each tagged with its era.
|
| bsr_leaf / bsr_leaf_category | always present. Many products (media, books, niche items) never receive an overall best-seller rank — Amazon's own page shows only a category rank there. When bsr is null, bsr_leaf carries the product's best category rank and bsr_leaf_category names the category (e.g. 18 in “Blank Media”). Both are null when the overall rank exists. |
| offer_history | optional — true attaches the buy-box owner timeline (who held the buy box, as observed ownership segments) and per-seller price series (daily points per seller, buy-box price wins the day; top 10 sellers by coverage) from our multi-seller offer stream. US buy-box depth reaches Dec 2024; full multi-seller depth Aug 2025+. +0.5 credits when returned. Amazon only. |
| full_offers | optional — true returns the complete seller list instead of the buy box plus the first page (~10 offers). Only affects a live scrape (mode=live, or mode=auto when the cache is stale); cached responses already carry the full list from our continuous crawl. Adds roughly 15–20s to the call and is not billed extra — still one call.
|
| max_age_days | cache freshness window for the snapshot (default 30) |
Look a product up by barcode instead of ASIN:
curl "https://api.logimu.com/v1/product?gtin=012345678905&country=us" -H "x-api-key: $KEY"
curl "https://api.logimu.com/v1/product?asin=B07X4V2M3B&country=us&bsr_history=true&offer_history=true" \\ -H "X-API-KEY: sk_live_..."
Sample response — a real cached answer for B07X4V2M3B (WD Elements desktop drive: 15 variations, full gallery, 12 featured reviews). Long arrays are truncated with an explicit marker; the API returns all of them. Billing fields omitted.
{
"source": "cache",
"asin": "B07X4V2M3B",
"marketplace": "amazon-us",
"data_source": "amazon US marketplace — observed listings",
"title": "Western Digital 12TB Elements Desktop External Hard Drive, USB 3.0 external hard drive for plug-and-play storage - Western DigitalBWLG0120HBK-NESN",
"brand": "Western Digital",
"price": 529.99,
"review_count": 127985,
"image_url": "https://m.media-amazon.com/images/I/51U3tZNZ36L._AC_SY355_.jpg",
"price_source": "aod",
"price_observed_at": "2026-08-09 00:29:56",
"currency": "USD",
"bsr": null,
"rating": 4.6,
"reviews_count": 127985,
"buybox_seller": "Nutrend Automotive Inc",
"buybox_seller_id": "A2LH8DUZ1Q6T63",
"seller_count": 21,
"fba": false,
"image": "https://m.media-amazon.com/images/I/51U3tZNZ36L._AC_SY355_.jpg",
"description": "Western Digital elements desktop storage with USB 3.0 offers reliable, high-capacity, add-on storage, fast data transfer rates and universal connectivity with USB 3.0 and USB 2.0 devices. The sleek design features up to 12TB capacity plus Western Digital quality and reliability. Operating temperature: 5 degree Celsius to 35 degree Celsius Non-operating temperature: -20 degree Celsius to 65 degree Celsius.",
"sales_estimate": 10,
"upc": "718037872070",
"parent_asin": "B0FGKVRWXQ",
"as_of": "2026-08-09 00:29:49",
"bsr_leaf": 4,
"bsr_leaf_category": "External Hard Drives",
"observed_at": "2026-08-08T22:29:56Z",
"price_changes_30d": [],
"stock_changes_30d": [],
"price_history": [],
"stock_history": [],
"stock_state": "in_stock",
"stock_observed_since": "2026-08-05T10:44:16Z",
"bought_past_month": 100,
"bought_past_month_raw": "100+ bought in past month",
"bought_past_month_observed_at": "2026-08-08T22:29:49Z",
"bsr_history": {
"series": [
{
"category_id": 6239,
"category_name": "External Hard Drives",
"is_root": false,
"first_date": "2023-10-24",
"last_date": "2026-08-09",
"n_points": 234,
"points": [
{
"date": "2023-10-24",
"rank": 8,
"era": "legacy"
},
{
"date": "2023-10-25",
"rank": 13,
"era": "legacy"
},
"… 232 more (truncated for this sample — the API returns all of them)"
],
"legacy_censored_at_100": true,
"legacy_category_ids": [
7318,
7357
]
},
{
"category_id": 510,
"category_name": "External Components",
"is_root": false,
"first_date": "2023-10-24",
"last_date": "2024-03-12",
"n_points": 8,
"points": [
{
"date": "2023-10-24",
"rank": 23,
"era": "legacy"
},
{
"date": "2023-11-08",
"rank": 75,
"era": "legacy"
},
"… 6 more (truncated for this sample — the API returns all of them)"
],
"legacy_censored_at_100": true,
"legacy_category_ids": [
7143
]
},
"… 2 more (truncated for this sample — the API returns all of them)"
],
"observed_from": "2023-10-24",
"observed_to": "2026-08-09",
"notes": "One point per day per category (best rank; current era wins overlaps). Legacy era (US, Oct 2023 - Apr 2026) comes from top-100 best-seller lists: leaf categories only, rank-censored at 100 (gaps = out of top 100 or not scraped). Current era (since 2026-04-17) carries full rank values including the root category, all Amazon marketplaces."
},
"offer_history": {
"buybox_timeline": [
{
"seller": "platinum micro, inc.",
"seller_id": null,
"from": "2024-12-31",
"to": "2024-12-31",
"days_observed": 1
},
{
"seller": "stc distributors (serial # recorded)",
"seller_id": null,
"from": "2025-01-02",
"to": "2025-01-02",
"days_observed": 1
},
{
"seller": "platinum micro, inc.",
"seller_id": null,
"from": "2025-01-04",
"to": "2025-01-06",
"days_observed": 2
},
"… 21 more (truncated for this sample — the API returns all of them)"
],
"sellers": [
{
"seller": "dealspro1",
"seller_id": null,
"first_seen": "2024-12-29",
"last_seen": "2025-10-04",
"days_observed": 17,
"buybox_days": 13,
"points": [
{
"date": "2024-12-29",
"price": 246.0,
"buybox": false
},
{
"date": "2025-01-07",
"price": 239.95,
"buybox": true
},
"… 15 more (truncated for this sample — the API returns all of them)"
]
},
{
"seller": "giz-promo",
"seller_id": "A1H3REWH8UBGUB",
"first_seen": "2025-01-17",
"last_seen": "2026-08-08",
"days_observed": 12,
"buybox_days": 6,
"points": [
{
"date": "2025-01-17",
"price": 239.5,
"buybox": true
},
{
"date": "2025-01-29",
"price": 237.95,
"buybox": true
},
"… 10 more (truncated for this sample — the API returns all of them)"
]
},
"… 8 more (truncated for this sample — the API returns all of them)"
],
"sellers_total": 40,
"observed_from": "2023-12-16",
"observed_to": "2026-08-08",
"notes": "Observation stream, one point per seller per day (buy-box price wins, else lowest observed; New condition only). Buy-box timeline spans OBSERVED days — gaps between segments are unobserved, not necessarily ownership changes. US buy-box depth reaches Dec 2024; full multi-seller depth Aug 2025+; newer marketplaces from their launch. Top 10 sellers carry point series."
},
"current_sellers": {
"as_of": "2026-08-08T22:29:56Z",
"offer_count": 21,
"buybox_seller": "Nutrend Automotive Inc",
"sellers": [
{
"seller": "Nutrend Automotive Inc",
"seller_id": "A2LH8DUZ1Q6T63",
"price": 529.99,
"is_buybox": true,
"is_fba": false,
"is_prime": false,
"seller_positive_pct": 91.0,
"seller_feedback_count": 21318,
"buybox_days_30d": 5
},
{
"seller": "Adorama",
"seller_id": "A17MC6HOH9AVE6",
"price": 529.99,
"is_buybox": false,
"is_fba": false,
"is_prime": false,
"seller_positive_pct": 90.0,
"seller_feedback_count": 579297,
"buybox_days_30d": 0
},
"… 19 more (truncated for this sample — the API returns all of them)"
]
},
"brand_stats": {
"brand": "Western Digital",
"products_tracked": 102,
"avg_rating": 4.41,
"total_ratings": 1015987,
"in_stock_pct": 100.0,
"distinct_buybox_sellers": 48,
"top_buybox_sellers": [
{
"seller": "Amazon.com",
"products": 19
},
{
"seller": "ALL4COMPUTERS ----- SIGNATURE REQUIRED -----",
"products": 3
},
{
"seller": "Actiview CCTV",
"products": 3
},
{
"seller": "CorteseInc",
"products": 3
},
{
"seller": "GO SMART",
"products": 3
}
]
},
"product_url": "https://www.amazon.com/dp/B07X4V2M3B",
"description_source": "product_description",
"images": [
"https://m.media-amazon.com/images/I/21A5YMvc7ZL.jpg",
"https://m.media-amazon.com/images/I/41CLje4zOhL.jpg",
"https://m.media-amazon.com/images/I/51X-qRLsP-L.jpg",
"… 9 more (truncated for this sample — the API returns all of them)"
],
"feature_bullets": [
"High-capacity add-on storage.Specific uses: Personal",
"Fast data transfers",
"… 2 more (truncated for this sample — the API returns all of them)"
],
"breadcrumbs": [
"Electronics",
"Computers & Accessories",
"Data Storage",
"External Hard Drives"
],
"variations": [
{
"child_asin": "B09VCXWPQG",
"dimension_index": "11",
"dimension_values": {
"size_name": "20TB"
},
"is_selected": 0,
"is_available": 1
},
{
"child_asin": "B0BTFPTSNQ",
"dimension_index": "12",
"dimension_values": {
"size_name": "22TB"
},
"is_selected": 0,
"is_available": 1
},
{
"child_asin": "B0D7N5XRSV",
"dimension_index": "13",
"dimension_values": {
"size_name": "24TB"
},
"is_selected": 0,
"is_available": 1
},
"… 12 more (truncated for this sample — the API returns all of them)"
],
"variation_count": 15,
"content_observed_at": "2026-08-09 15:04:50",
"reviews": [
{
"author": "KD9WTS",
"rating": 5.0,
"title": "Good drive! You'll buy it.",
"date_raw": "Reviewed in the United States on May 30, 2020",
"verified": true,
"variant": "Capacity: 5TB",
"body": "First order of business: I ordered this drive (WD Elements 5tb) and received it in about 18 hours. I checked the shipping label, and it is their proprietary del…",
"helpful_count": 107
},
{
"author": "ChangedMind",
"rating": 5.0,
"title": "A Tale of 2 drives (WD 20TB Elements Desktop & WD 2TB Elements Portable)",
"date_raw": "Reviewed in the United States on December 30, 2025",
"verified": true,
"variant": "Capacity: 20TB",
"body": "June 22, 2026 (UPDATES): I paid $279.99 for the 20TB drive on May 7, 2025 (on sale from $304.00). This drive is $814.99 as of today. It's been in daily use all …",
"helpful_count": 99
},
"… 10 more (truncated for this sample — the API returns all of them)"
],
"review_count_scraped": 12,
"out_of_stock": false,
"history_available": true
}
Description & image. description is returned on
both cached and live responses, and image_url on live scrapes as well as cache.
Listing content fields 2026-08-09
Always present on Amazon-marketplace answers, cached or live,
at no extra charge. content_observed_at stamps when the content was captured; when it is
null and the arrays are empty, content has not been captured for this ASIN yet
(coverage fills in as the crawl cycles) — that is “not yet observed”, never “this
product has no gallery”.
| Field | Notes |
|---|---|
| description / description_source | description_source names the surface the text came from: product_description (written prose), feature_bullets (the “About this item” list, joined), or aplus (brand marketing copy). Bullets read very differently from prose — check the source before rendering or summarising the text as a “description”. |
| images | the full gallery, de-duplicated to original-resolution URLs, up to 20. image_url stays the primary image. |
| feature_bullets | the “About this item” bullets as their own list — no need to guess whether description happens to be bullets this time. |
| breadcrumbs | the complete category path (e.g. ["Electronics", "Computers & Accessories", "Data Storage", "External Hard Drives"]), not just the root and leaf. |
| variations / variation_count / parent_asin | the variation matrix: each entry carries child_asin, dimension_values (e.g. {"size_name": "20TB"}), is_selected, is_available. An empty variations is normal — most ASINs genuinely have no variants. Per-variant price is NOT included: Amazon sends it only when a variant is selected, so do not expect it here. |
| reviews / review_count_scraped | the top/featured reviews Amazon shows a logged-out visitor (≤12) — not the full review history, and not a random sample. The count varies per fetch (0–13 on the same ASIN) because Amazon does not always render the section; cached answers serve the most recently observed set. Each review: author, rating, title, date_raw, verified, is_local (true = the marketplace's own “Top reviews from <country>” section, false = “Top reviews from other countries” — on smaller marketplaces most featured reviews can be foreign), variant, body, helpful_count. date_raw is verbatim (“Reviewed in the United States on December 30, 2025”) — it carries the review country and a localised month name; parse it downstream if you need a datetime, and keep the country. The “Customers say” AI summary and aspect chips are not available (Amazon lazy-loads them after the HTML we capture). |
| out_of_stock | tri-state: true = Amazon's dedicated out-of-stock buybox was observed (on mode=live, measured on that scrape — a real answer, distinct from a failed lookup), false = in stock when last seen, null = unknown. |
About the stock fields. stock_state, stock_changes_30d and stock_history are still returned, but do not build on them. Our crawl follows best-seller rank, and a product that goes out of stock generally drops out of that walk — so we stop seeing it rather than observing it go out of stock. Measured: out-of-stock appears on 0.24% of availability-bearing observations, well below the true rate for a catalogue this size. Treat these fields as "in stock when last seen", not as a reliable availability timeline.
One exception: on mode=live, when the scrape finds the product marked unavailable, stock_state comes back a definite "out_of_stock" (with in_stock: false) — a measured answer from that scrape, not the walk-derived timeline.
Credits: a cached call with everything attached is 1 credit. Drop the intelligence blocks and it is 0.5; force a live scrape and it is +0.5; an intelligence-only answer (or Walmart) is 1. A partial live
scrape (identity but no price) sets snapshot_status: "partial" and is
never billed for the snapshot half. snapshot_status is
returned on live scrapes only — it reports the completeness of that
scrape, so cached responses omit it. Change events are transitions from
our 30-day observation stream — one observation per calendar day (the richest scrape pass of that day), so multiple same-day passes never fabricate changes; a price that moved and moved back between two observations is not seen — while price_history and stock_history extend the same transition streams back to the first time we observed the product (stock_observed_since; stock_state is the latest derived state),
each stamped with the buy-box seller at that time. buybox_days_30d = days a seller held the
buy box. All 11 Amazon marketplaces (us, uk, de, ca, au, fr, it, es, jp, mx, br), plus Walmart
(numeric item ID; Walmart returns the intelligence blocks only — the listing-content fields
are Amazon-only). Not billed if the product is untracked.
GET /v1/search
Search our warehouse of 17M+ tracked products across Amazon US/UK/DE/CA/AU + Walmart (not a live SERP scrape). Answers in under 100 ms.
| Param | Notes |
|---|---|
| q | keyword (title/description). An anchor. |
| brand | exact brand. An anchor. |
| category | a department or sub-category name (e.g. Home & Kitchen), matched in full and case-insensitively against the product’s category chain (comma-separate several). An anchor on its own — ?category=Home & Kitchen browses that category with no keyword — or a refinement of q/brand. A category-only browse returns the category’s top products by in-category best-seller rank, then applies your filters and sort; a name we don’t carry returns a 422 with the nearest matches (never a silent empty). Slower than a keyword search on the largest departments (up to ~1 s), not <100 ms. |
| seller | refinement — combine with an anchor (q, brand or category) |
| price_min/max, rating_min/max, reviews_min, bsr_min/max, fba, seller_count_min/max | filters |
| sort | bsr(default) · rating · reviews · price · sales_estimate · seller_count |
| max_per_category, limit | result caps (limit ≤ 100, default 50) |
| marketplace | amazon-us(default) · amazon-uk · amazon-de · amazon-ca · amazon-au · walmart |
{
"marketplace": "amazon-us", "limit": 2, "returned": 2, "total_matched": 118,
"products": [ { "asin": "B0CT43D46H", "product_id": "B0CT43D46H",
"product_url": "https://www.amazon.com/dp/B0CT43D46H",
"marketplace": "amazon-us", "title": "Keurig K-Express \u2026", "brand": "Keurig",
"price": 70.39, "currency": "USD", "bsr": 412, "rating": 4.5, "reviews_count": 28104,
"seller_count": 6, "buybox_seller": "Amazon.com", "fba": true, "in_stock": true,
"as_of": "2026-07-29T11:20:04Z" } ],
"credits_charged": 1, "credits_remaining": 2497
}
Provide at least one anchor — q, brand or category
(seller only refines). A category-only example:
GET /v1/search?category=Home & Kitchen&price_max=30&sort=reviews&marketplace=amazon-us.
Coverage is deep on tracked brands, not the full Amazon catalog.
Identifiers. As with
/v1/shopping, every row carries product_id
(ASIN on Amazon, numeric item ID on Walmart) and a marketplace-correct
product_url; asin is retained for compatibility and is misnamed on
Walmart.
GET /v1/serp live Amazon search
A live Amazon search-results (SERP) fetch — a real browser navigates Amazon’s search page right now and returns the parsed result grid plus everything around it. This is a third, different thing from the two warehouse search endpoints, and the three do not substitute for each other:
| Endpoint | What it searches | Latency |
|---|---|---|
| /v1/shopping | our curated index — ranked, grouped product recommendations | <100 ms |
| /v1/search | our warehouse — filterable tracked-product dataset | <100 ms |
| /v1/serp | Amazon itself, live — what Amazon’s search page shows this minute for a query | seconds (typically ~8–13 s) |
There is no cached copy of a SERP, so there is no mode
parameter here — every call is a live fetch, and sending mode is a 422 rather than a
silently ignored field. Parameter names match Rainforest’s type=search, so an existing
integration ports with a rename, not a rewrite.
| Param | Notes |
|---|---|
| q | required — the search query, exactly as a shopper would type it. Query in the marketplace’s own language. Alias: search_term. |
| country | us (default), uk, de, ca, au, fr, it, es, jp, mx, br — amazon-xx forms accepted. Amazon only: Walmart has no live SERP path. |
| page | start page, default 1 |
| max_page | auto-paginate page..max_page and concatenate, capped at 10 pages per request. position is continuous across pages (page 2 starts at 17, it does not restart at 1). Billed per page actually fetched. |
| sort_by | featured (Amazon’s default) · price_low_to_high · price_high_to_low · average_review · most_recent · bestseller_rankings |
| category_id | Amazon browse-node id (becomes &node=) |
| refinements | Amazon rh= value. Round-trips: feed back any refinements[*].value from a previous response to apply that filter. |
| exclude_sponsored | drop inline sponsored results (default false). Often a no-op — see the honesty notes below. |
| number_of_results | truncate the returned list |
curl "https://api.logimu.com/v1/serp?q=wireless+earbuds&country=us" \ -H "X-API-KEY: sk_live_..."
Sample response — a real live fetch for wireless earbuds on
us (captured 2026-08-09, 11.9 s, one page, 16 results). Long arrays are truncated with an
explicit marker; the API returns all of them. Billing fields omitted.
{
"marketplace": "us",
"request_parameters": {
"search_term": "wireless earbuds",
"url": null,
"marketplace": "us",
"page": 1,
"max_page": null,
"sort_by": null,
"category_id": null,
"refinements": null,
"exclude_sponsored": false,
"number_of_results": null
},
"request_metadata": {
"created_at": "2026-08-09T18:56:31.592111+00:00",
"processed_at": "2026-08-09T18:56:43.438693+00:00",
"total_time_taken": 11.85,
"amazon_url": "https://www.amazon.com/s?k=wireless+earbuds",
"pages_fetched": 1,
"pages": [
{
"page": 1,
"ok": true,
"results": 16,
"attempts": 1,
"fetch_ms": 10478
}
]
},
"search_results": [
{
"position": 1,
"asin": "B0H718C1NK",
"title": "Wireless Earbuds, Bluetooth 5.3 Headphones HiFi Stereo 50H Playback LED Digital Display Ear Buds with ENC Noise Canceling Headset, IPX7 Waterproof Earphones for Gym/Running/Work(White)",
"link": "https://www.amazon.com/Fhumsh-Bluetooth-Headphones-Waterproof-Work%EF%BC%88White…",
"image": "https://m.media-amazon.com/images/I/61P4QAI28CL._AC_UY218_.jpg",
"rating": 4.7,
"ratings_total": 331,
"price": {
"symbol": "$",
"value": 19.97,
"currency": "USD",
"raw": "$19.97"
},
"list_price": {
"symbol": "$",
"value": 249.99,
"currency": "USD",
"raw": "$249.99"
},
"prices": [
{
"symbol": "$",
"value": 19.97,
"currency": "USD",
"raw": "$19.97"
},
{
"symbol": "$",
"value": 249.99,
"currency": "USD",
"raw": "$249.99"
}
],
"recent_sales": "5K+ bought in past month",
"badges": [],
"is_prime": false,
"sponsored": false,
"delivery": "Join Prime to get FREE delivery Tue, Aug 11 Or Non-members get FREE delivery Fri, Aug 14 on $35 of items shipped by Amazon",
"availability": {
"raw": null
}
},
{
"position": 2,
"asin": "B0H5W39V6T",
"title": "HAOYUYAN Wireless Earbuds, Sports Bluetooth Headphones, 80Hrs Playtime Ear Buds with LED Power Display, Noise Canceling Headset, IPX7 Waterproof Earphones for Workout/Running (Black)",
"link": "https://www.amazon.com/HAOYUYAN-Bluetooth-Headphones-Canceling-Waterproof/dp/B0H…",
"image": "https://m.media-amazon.com/images/I/71cmAChhQKL._AC_UY218_.jpg",
"rating": 4.9,
"ratings_total": 292,
"price": {
"symbol": "$",
"value": 23.98,
"currency": "USD",
"raw": "$23.98"
},
"list_price": {
"symbol": "$",
"value": 299.99,
"currency": "USD",
"raw": "$299.99"
},
"prices": [
{
"symbol": "$",
"value": 23.98,
"currency": "USD",
"raw": "$23.98"
},
{
"symbol": "$",
"value": 299.99,
"currency": "USD",
"raw": "$299.99"
}
],
"recent_sales": null,
"badges": [],
"is_prime": false,
"sponsored": false,
"delivery": "Join Prime to get FREE delivery Tue, Aug 11 Or Non-members get FREE delivery Fri, Aug 14 on $35 of items shipped by Amazon",
"availability": {
"raw": null
}
},
"… 14 more (truncated for this sample — the API returns all of them)"
],
"result_count": 16,
"search_information": {
"results_text_raw": "1-16 of over 20,000 results for \"wireless earbuds\" Sort by: …",
"results_begin": 1,
"results_end": 16,
"total_results": 20000,
"search_term": "wireless earbuds",
"spelling_correction": null
},
"pagination": {
"current_page": 1,
"total_pages": 20,
"next_page_link": "https://www.amazon.com/s?k=wireless+earbuds&page=2&xpid=rx1DTeS_MGGis&…",
"has_next": true
},
"related_searches": [
{
"query": "wireless headphones",
"link": "https://www.amazon.com/s?k=wireless+headphones&ref=rsl_sug_0_0&pd_rd_w=RbQ9n&content-id=amzn1.sym.3be64970-3b95-4a6d-a45d-78077a3ff871:amzn1.sym.3be64970-3b95-4a6d-a45d-78077a3ff871&pf_rd_p=3be64970-3b95-4a6d-a45d-78077a3ff871&pf_rd_r=FCT87YJN2Q2JJ8P2S0DJ&pd_rd_wg=DZW0L&pd_rd_r=64a4bec2-cf63-49ba-8bed-9eb917ca8d14&qid=1786301794"
},
{
"query": "wired earbuds",
"link": "https://www.amazon.com/s?k=wired+earbuds&ref=rsl_sug_0_3&pd_rd_w=RbQ9n&content-id=amzn1.sym.3be64970-3b95-4a6d-a45d-78077a3ff871:amzn1.sym.3be64970-3b95-4a6d-a45d-78077a3ff871&pf_rd_p=3be64970-3b95-4a6d-a45d-78077a3ff871&pf_rd_r=FCT87YJN2Q2JJ8P2S0DJ&pd_rd_wg=DZW0L&pd_rd_r=64a4bec2-cf63-49ba-8bed-9eb917ca8d14&qid=1786301794"
},
{
"query": "airpods",
"link": "https://www.amazon.com/s?k=airpods&ref=rsl_sug_0_1&pd_rd_w=RbQ9n&content-id=amzn1.sym.3be64970-3b95-4a6d-a45d-78077a3ff871:amzn1.sym.3be64970-3b95-4a6d-a45d-78077a3ff871&pf_rd_p=3be64970-3b95-4a6d-a45d-78077a3ff871&pf_rd_r=FCT87YJN2Q2JJ8P2S0DJ&pd_rd_wg=DZW0L&pd_rd_r=64a4bec2-cf63-49ba-8bed-9eb917ca8d14&qid=1786301794"
},
"… 4 more (truncated for this sample — the API returns all of them)"
],
"refinements": {
"Popular Shopping Ideas": [
{
"name": "Noise Cancelling",
"value": null,
"link": "https://www.amazon.com/s?k=noise+cancelling+wireless+earbuds…"
},
{
"name": "Long Battery",
"value": null,
"link": "https://www.amazon.com/s?k=wireless+earbuds+long+battery+lif…"
},
{
"name": "For Iphone",
"value": null,
"link": "https://www.amazon.com/s?k=wireless+earbuds+for+iphone&ref=s…"
},
"… 6 more (truncated for this sample — the API returns all of them)"
],
"Eligible for Free Shipping": [
{
"name": "Free Shipping by Amazon Get FREE Shipping on eligible orders shipped by Amazon",
"value": "p_76:1249137011",
"link": "https://www.amazon.com/s?k=wireless+earbuds&rh=p_76%3A124913…"
}
],
"… 38 more refinement groups (truncated)": []
},
"ad_blocks": [
{
"position": 1,
"block_type": "product_carousel",
"title": "Beats wireless earbuds",
"brand_logo": "https://m.media-amazon.com/images/S/al-na-9d5791cf-3faf/9b225186-5e85-…",
"link": "https://aax-us-east-retail-direct.amazon.com/x/c/JDEonyLuvwqTF_FMQStb_…",
"products": [
"B08L6ZYW21",
"… 7 more (truncated for this sample — the API returns all of them)"
]
},
"… 1 more (truncated for this sample — the API returns all of them)"
],
"video_blocks": [
{
"position": 1,
"title": "Active Noise Cancelling Ear Buds Wireless Earbuds 80H Playtime Bluetooth Headphones with LED Display Case, Hi-Res Audio Clear Calls Earphones with Over Ear Hooks for Running Gym Workout Travel Black",
"video_link": "https://m.media-amazon.com/images/S/al-na-9d5791cf-3faf/23f44a7d-0e24-…",
"thumbnail": "https://aax-us-east-retail-direct.amazon.com/e/is/D8A8F2B64B75DAA625F6…",
"link": "https://aax-us-east-retail-direct.amazon.com/x/c/JBIrL6YvEshoz2D7-AncY…",
"sponsored": true
},
"… 1 more (truncated for this sample — the API returns all of them)"
],
"brand_stores": []
}
Honesty notes — measured, not assumed
All of these were measured on live captures (2026-08-09). Build against them rather than against assumptions carried over from other SERP APIs.
- Result count per page is Amazon’s choice, not ours — and it varies. Measured on the same day: 16 results for wireless earbuds on us/uk/de, 48 for a Japanese query on jp, 48 for yoga mat on us. Read
search_information.results_begin/results_endrather than assuming 48 per page. total_resultsis Amazon’s own estimate (“over 20,000”), not a countable number. Do not present it as precise.pagination.total_pagesis the highest page Amazon is currently offering in its pagination window, not the true last page.sponsoredwill usually befalse. On every capture measured, Amazon put its paid placements in separate sponsored-brand carousels outside the organic result grid, so the organic cards correctly report false. Inline sponsored results do occur on other queries and are detected — butexclude_sponsoredis therefore often a no-op.is_primeis layout-dependent and often absent (measured: 8 prime icons page-wide on de, 1 on us, 0 on jp).falsemeans “no Prime icon rendered on this card”, not “not Prime”. Do not filter on it.recent_salesis Amazon’s verbatim badge string in the page’s own language (5K+ bought in past month,5000+ Mal im letzten Monat gekauft,過去1か月で1000点以上購入されました). Parse it downstream if you need a number; do not assume English.spelling_correctionreports Amazon’s autocorrect; it does not suppress it. There is no documented Amazon parameter that disables autocorrect, so we report what happened instead of shipping a flag that silently does nothing.- Latency is seconds, not milliseconds — typically ~8–13 s on the warm path, occasionally up to ~90 s when the retry ladder runs. Set client timeouts to 180 s+, and do not put this behind a UI that expects a warehouse query. Expect the occasional block (a clean, unbilled
502). ad_blocks— sponsored-brand placements.block_typeisproduct_carousel(a few promoted ASINs inproducts[]) orbrand_banner(headline + logo, no ASINs).linkis an Amazon ad-redirector (amazon-adsystem.com), NOT a clean product/store URL — do not present it as one. Usually 0–2 per page.video_blocks— sponsored video units.video_linkis an mp4,thumbnailan image,linkan ad-redirector. Almost alwayssponsored: true. Usually 0–2 per page.brand_stores— Amazon Brand Store links, organic only. Only organic store headers (readable brand name + a/stores/page/<id>URL) are returned; a store link that only appears inside a sponsored unit has no readable identity and is deliberately excluded rather than returned as an all-null row. On sponsored-heavy pages this list is legitimately empty — that is correct, not a miss.- Blocked fetches are never reported as empty successes. The fetch is judged by content (did a real results page come back), not by HTTP status — Amazon serves perfect pages with status 202 and blocks with status 200, so status is meaningless here. A genuine block is a
502with a reason, unbilled. - Credits: 1 per page actually fetched (
request_metadata.pages_fetched) — never per page requested; blocked fetches and zero-result answers are never billed.
GET /v1/account free
Your balance, plan and recent usage — so a script can check what it has left before it spends. Never billed.
curl "https://api.logimu.com/v1/account" -H "x-api-key: $KEY"
| Field | Notes |
|---|---|
| credits_remaining | credits left on the key (null on unmetered internal keys) |
| plan | metered or internal |
| suspended | true when the account is suspended — calls will be refused |
| usage_30d | calls and credits over the last 30 days, plus a per-endpoint breakdown |
Batch bulk product data
Submit a list of ASINs (or numeric item IDs for country=walmart), get an
exact cache/live split and credit price before anything runs or bills,
then run it and stream results as JSONL or CSV — partials included, mid-run. Rows are served
through the same path as /v1/product. Also available as a
dashboard UI. Since 2026-08-09 the same infrastructure also runs
search batches (kind: "search") — a list of search TERMS served through
the live /v1/serp path; see the sub-section below.
Freshness — on every row, by default
Not opt-in: every result row (JSONL and default CSV columns) carries
| Field | Notes |
|---|---|
| observed_at | when the row's data was observed (UTC) |
| age_days | age of that observation in days — 0 on a live scrape |
| source | cache or live — where this row came from |
Row states
Every submitted line comes back as a result row — nothing is silently dropped from a billed batch.
| status | Meaning | Billed |
|---|---|---|
| ok | served, with product data | 0.5 (cached) / 1.0 (live) |
| stale_skipped | tracked, but older than max_age_days in cache mode | 0 — never |
| not_tracked | not in the warehouse (coverage is best-seller-scoped, not the full catalog) | 0 — never |
| failed | invalid ID, or the live scrape did not return the product | 0 — never |
Duplicate lines are served in the output but billed once. Unknown request
fields are a loud 422 before anything bills.
Modes
| mode | Behaviour |
|---|---|
| cache | warehouse only — rows older than max_age_days come back stale_skipped, disclosed and unbilled |
| live | scrape every row — Walmart has no live scrape, so country=walmart + mode=live is rejected with a 422 |
| auto | default — warehouse when fresher than max_age_days (default 30), scrape the rest |
Endpoints
| Endpoint | Notes |
|---|---|
| POST /v1/batch-estimate | price a list before running it — free, always; returns tracked / not-tracked / fresh / stale counts, an age histogram and the credit upper bound |
| POST /v1/batches | create a named, re-runnable batch — body: name, country, mode, max_age_days, asins[], optional include: ["reviews"] (adds the featured-review set to each JSONL row — off by default, no extra charge) |
| GET /v1/batches | list your batches, newest first, with each batch's last run |
| GET /v1/batches/{id} | batch detail: line stats + recent runs |
| PATCH /v1/batches/{id} | edit mode / max_age_days — applies to future runs only: every run records the mode + max age it was launched with and reports them in run detail (Walmart + mode=live stays a loud 422) |
| DELETE /v1/batches/{id} | soft delete — in-flight runs are cancelled; existing results stay downloadable until retention collects them |
| POST /v1/batches/{id}/estimate | fresh estimate for a saved batch against the current warehouse state — free; the cache/live split moves as the nightly walk refreshes rows, so re-estimate before re-running |
| POST /v1/batches/{id}/schedule | recurring runs: daily / weekly / monthly / none, plus enabled, an optional per-firing credit_ceiling and an optional webhook_url — see below |
| POST /v1/batches/{id}/runs | queue a run — stores the estimate it launched under and refuses with 402 when your balance is below it; nothing bills until rows serve. Runs are serialized per marketplace, FIFO by creation — the response carries queue_position |
| GET /v1/batches/{id}/runs/{run_id} | progress: per-state counters, credits charged so far, the stored estimate; queued runs carry queue_position |
| POST /v1/batches/{id}/runs/{run_id}/resume | resume a run that paused at the credit floor — it re-queues on its marketplace and pending rows continue; nothing already served is re-billed |
| GET /v1/batches/{id}/runs/{run_id}/result.jsonl | streaming JSONL — downloadable mid-run with every row completed so far |
| GET /v1/batches/{id}/runs/{run_id}/result.csv | streaming CSV (26 summary columns incl. the freshness fields) — downloadable mid-run |
Result formats
CSV — 26 summary columns, in order:
line_no, asin, status, source, observed_at, age_days, credits, title, brand, price,
currency, in_stock, out_of_stock, bsr, rating, review_count, bought_past_month, buybox_seller,
seller_count, lowest_offer_price, current_sellers, parent_asin, variation_count,
description_source, image_url, description. The CSV stays lean: array fields live in the
JSONL only.
JSONL — each row carries the complete /v1/product
payload: full per-seller offer list, 30-day price & stock change events, brand stats, and the
listing content blocks — image gallery (images), feature_bullets,
breadcrumbs and the variations matrix. Featured reviews are
included only when the batch was created with include: ["reviews"] (the one wide
array — ~12 × ~500 B per row); review_count_scraped is always
present so you can see reviews exist without the payload.
| Column | Notes |
|---|---|
| current_sellers | compact JSON of the full per-seller offer list, in the cell — parse it as JSON; per-seller price / fba / prime / feedback / buybox_days_30d |
| lowest_offer_price | minimum per-seller price; empty when the row has no priced offer list |
| bought_past_month | the Amazon “N+ bought in past month” badge as an integer; empty when the product shows no badge |
| description | last column — may be multi-line and quoted; empty when the source never showed one |
Caps: 10,000 rows per batch. Results are retained for 30 days
(410 after). A run that hits your credit floor pauses — rows stay
pending, partials stay downloadable, and it resumes after a top-up; it never bills into a negative
balance. A live row typically takes ~28 s (measured at the current operating point); rows run
concurrently, and the estimate returns estimated_live_duration_seconds for your list.
Search batches kind: "search"
A batch of search terms, one live Amazon SERP
fetch per term per page — same batches/runs/downloads/emails/webhooks/schedules as product batches.
Because every row is a live fetch (there is no cached SERP), search batches are
always live: there is no mode, and sending one is a 422.
Amazon marketplaces only.
| Field | Notes |
|---|---|
| kind | "search" on POST /v1/batches and POST /v1/batch-estimate |
| terms | the search queries (replaces asins). Capped at 500 terms per batch. Duplicate terms are answered on their canonical line rather than fetched twice. |
| pages | pages fetched per term, 1–3 (default 1). Positions stay continuous across pages. |
| include | optional ["blocks"] attaches ad_blocks / video_blocks / brand_stores to each JSONL row. These live at the top of page 1 only — that is where Amazon renders them, so a multi-page term still carries at most one set. No extra charge. |
Estimate = upper bound. The estimate prices
terms × pages, but you are billed per page actually fetched —
Amazon can run out of results before the requested page count, and blocked fetches, zero-result
terms and duplicate lines are never billed.
Row states: ok (results returned; billed per page
fetched) · empty (the fetch succeeded but Amazon returned no results — never billed) ·
failed (invalid term, or Amazon blocked the fetch after retries — never billed). Every
submitted term comes back as a result row; nothing is silently dropped from a billed batch.
Result formats: the CSV is one row per
(term, result position): term, page, position, asin, title, price, currency, list_price,
rating, ratings_total, recent_sales, sponsored, is_prime, link, image, status, error — terms
with no result rows appear as single status rows. The JSONL carries the complete
per-term /v1/serp payload: search_information,
pagination, related_searches, round-trip-ready refinements, and
(with include: ["blocks"]) the paid-placement blocks — none of which fit the CSV.
Capacity: search runs are serialized per marketplace like
product runs, and each run fetches at the marketplace’s live-search budget (us/uk: 2 concurrent,
others: 1) — deliberately small, because each fetch holds a real browser context for ~8–13 s.
A 500-term us batch at 1 page/term is therefore roughly an hour of wall time; the estimate returns
estimated_live_duration_seconds for your list.
curl -X POST "https://api.logimu.com/v1/batches" \
-H "X-API-KEY: sk_live_..." -H "Content-Type: application/json" \
-d '{"name":"category-sweep","kind":"search","country":"us","pages":1,
"terms":["wireless earbuds","yoga mat","usb c hub"],"include":["blocks"]}'
Schedules & webhooks
A schedule fires at most once per period (server date:
daily after midnight, weekly on Monday, monthly on the 1st). Each firing computes a
fresh estimate and refuses to run — recording a cancelled run and emailing
you — when that estimate exceeds the credit_ceiling (default: 2× the
estimate at schedule-set time) or your balance. A schedule never surprises you with a bill.
Setting webhook_url returns the signing secret
once — store it. We POST the run summary to your URL on completion and on
pause, signed X-Logimu-Signature: sha256=<hex HMAC-SHA256(secret, raw body)>,
with 3 retries on failure.
curl -X POST "https://api.logimu.com/v1/batch-estimate" \
-H "X-API-KEY: sk_live_..." -H "Content-Type: application/json" \
-d '{"asins":["B0BDHQSZCV","B072YVWBXH"],"country":"us","mode":"auto"}'
{
"country": "us", "mode": "auto", "max_age_days": 30,
"rows_submitted": 2, "rows_valid": 2, "rows_invalid": 0, "rows_duplicate": 0,
"tracked": 2, "not_tracked": 0, "fresh_within_max_age": 2, "stale": 0,
"estimated_credits_max": 1.0, "estimated_usd_max": 0.0,
"billing_note": "Upper bound: failed, not-found and not-tracked rows are never billed. Cached rows 0.5 credits, live rows 1.0.",
"age_histogram_days": { "3": 1, "11": 1 }, "estimate_valid_minutes": 60
}
# create the batch, then run it
curl -X POST "https://api.logimu.com/v1/batches" \
-H "X-API-KEY: sk_live_..." -H "Content-Type: application/json" \
-d '{"name":"my-skus","country":"us","mode":"auto","max_age_days":30,
"asins":["B0BDHQSZCV","B072YVWBXH"]}'
# => {"id": 12, ...}
curl -X POST "https://api.logimu.com/v1/batches/12/runs" -H "X-API-KEY: sk_live_..."
# => {"id": 34, "status": "queued", "estimate": { ... }}
curl "https://api.logimu.com/v1/batches/12/runs/34" -H "X-API-KEY: sk_live_..."
curl -o out.csv "https://api.logimu.com/v1/batches/12/runs/34/result.csv" -H "X-API-KEY: sk_live_..."
Rate limits, errors & honesty
- Per-key rate limit ~10 req/s (burst 20) →
429withRetry-After. Credits are the volume limit. 401missing/invalid key ·402out of credits ·404not found (unbilled; the body may carryfound_on+ ahint— e.g. the ASIN is tracked on another marketplace, or a US live scrape can be requested withmode=live) ·422bad params.- Every record carries an
as_oftimestamp — data is observed, not real-time. Sales figures are estimates.