Logimu

API documentation

Amazon (11 marketplaces: US, UK, DE, FR, IT, ES, JP, CA, MX, BR, AU) & Walmart product data — single-ASIN lookups (by ASIN or any barcode), multi-seller offers, curated product search, warehouse filtering, live offers pages, live Amazon Today’s Deals and live Amazon search-results (SERP) fetches. Served from the warehouse in milliseconds or scraped live. Interactive reference →

Three layers, one key and one credit grammar: warehouse product data (/v1/product, /v1/search, /v1/shopping, batches — price, BSR, rating, seller and buy-box history), live Amazon & Walmart (mode=live, /v1/offers, /v1/serp, /v1/bestsellers, /v1/deals, /v1/seller) and, since 2026-10-05, derived intelligence — brand dossiers, seller maps, operator footprints, category landscapes and ranked lists computed from our own observations.

On this page

Base URL & auth

https://api.logimu.com

Send your key in the X-API-KEY header, or as a standard bearer token (Authorization: Bearer sk_live_...) 2026-10-07 — both work on every endpoint, the MCP connector included; when both headers are sent, X-API-KEY wins. Get a key from $19/month (14-day money-back) at sign up.

MCP connector from Claude (claude.ai, desktop, mobile): sign in instead of a key 2026-10-15. Add https://api.logimu.com/mcp as a custom connector (Settings → Connectors → Add custom connector). With a Logimu plan, choose Sign in now under Authentication and keep Use Claude’s published identity under OAuth client, then sign in with your Logimu account and allow: every tool call is metered on your plan exactly like a call with your key (OAuth 2.1 with PKCE; the connector never sees the key; disconnect in Claude to revoke). Keep the pre-selected No sign-in for the free tools without an account. Claude cannot change this choice later: remove the connector and add it again. Clients that can send headers (Claude Code: claude mcp add --transport http logimu https://api.logimu.com/mcp --header "Authorization: Bearer sk_live_…", Cursor, VS Code) keep working with the key.

curl "https://api.logimu.com/v1/product?asin=B0BDHQSZCV" \
  -H "X-API-KEY: sk_live_..."

curl "https://api.logimu.com/v1/product?asin=B0BDHQSZCV" \
  -H "Authorization: Bearer sk_live_..."

Credits

CallCredits
Curated product search (/v1/shopping)2 per query
Curated search, detailed (/v1/shopping?detail=true) — everything the basic product answer carries, attached to every product (sellers with fulfillment & delivery, 30-day events, stock history, brand stats, dimensions, deal/badge/rating history, variation coverage, page content, up to 50 featured reviews), plus a response-wide seller_ratings array5 per query
Product (/v1/product) — from the warehouse, everything included 2026-09-27
snapshot + every intelligence and content block: full price-change timeline + 30-day events, bought-past-month (+ its history), every current offer with seller IDs, fulfilment and delivery, seller feedback, brand stats, dimensions, deal history, rating history, variation coverage, description, images, reviews. Same price as a batch row.
0.5
↳  + history 2026-10-10 — BSR rank history (bsr_history=true, back to Oct 2023) and/or the buy-box timeline, per-seller prices and the daily buy-box price (offer_history=true); every seller listed, point series for the 10 most-observed sellers, 500 points eachincluded — a full warehouse record with both histories is 0.5
↳     wider series (history_sellers up to 50, history_points up to 20,000)included
↳  live scrape instead of the warehouse (mode=live, or auto past your max age)1, history included
↳  history only 2026-10-10 (history_only=true) — the stored series alone: bsr_history, offer_history and buybox_price_history, no snapshot, content or seller table; Amazon, stored observations only — details0.05
↳  Walmart from the warehouse0.5
↳  Walmart live 2026-10-18 — the walmart.com product page read now (mode=live, or auto past your max age) — details
a partial page, an item walmart.com does not have and a failed or busy fetch are never billed
2
↳  by barcode instead of ASIN (gtin=) 2026-10-12 — any UPC / EAN / GTIN / ISBN-13, resolved from our observations, the same product on another Amazon marketplace, or Amazon’s own search — details
a barcode nothing resolves is a 404 and is never billed
included
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
↳  Walmart search results (/v1/serp?country=walmart) 2026-10-18 — walmart.com’s search page, live, up to 3 pages a call — details
per results page returned; an empty result set, a failed fetch (502) and a busy refusal (503) are never billed
2 per page
Amazon Best Sellers list (/v1/bestsellers) 2026-10-09 — a category’s current top 100 with its breadcrumb name and subcategories, fetched live (or from our cache, up to 30 min old)
per page of 50 products returned, cached or fresh — the full top 100 is 2; the root list of top-level categories is free; a category Amazon does not have, a blocked fetch and an empty list are never billed
1 per page of 50 · root list 0
Amazon Today’s Deals (/v1/deals) 2026-10-18 — a marketplace’s deals page, fetched live (or from our cache, up to 15 min old), filtered by department, deal type, discount, price, Prime Exclusive, rating or brand
per deals page fetched that returned at least one deal, cached or fresh — any page size is 1 credit, so page_size=120 is 120 deals for 1 credit; a page with no deals, an empty list, a blocked fetch and a busy marketplace are never billed
1 per page fetched (up to 120 deals)
Offers page (/v1/offers) 2026-10-12 — every offer on Amazon’s offers page, fetched live: seller, price, shipping, condition, buy box, FBA / Prime, delivery, the sellers’ feedback — no product page
per product whose offers page lists at least one offer (any condition); a product with no offer right now, an ASIN Amazon does not have, a blocked fetch and a busy marketplace are never billed
0.5
↳  as seen from a US ZIP (zip=) 2026-10-14 — the page as a shopper at that ZIP sees it, with location and deliverable (Amazon Fresh / Whole Foods delivery areas), page 1 only (details)
a ZIP Amazon rejects, no offer there, not found and a failed fetch are never billed
1
Product tracking (/v1/track, /v1/product?track=true) 2026-10-14 — pin an ASIN into our hot lane: its offers page is re-read hourly or every 2 / 4 / 12 / 24 h for as long as the plan is active, every read lands in the product’s sub-daily buy-box history, and e-mail / webhook alerts fire on the thresholds you set
0 credits; each plan carries a daily allowance of tracked snapshots (Solo 2,500 · Starter 6,000 · Growth 18,000 · Standard 40,000 · Scale 170,000 · Volume 710,000); reading the history stays 0.05 (history_only) or 0.5 (the record)
0
Seller profile (/v1/seller) 2026-10-04 — star rating, feedback per period, histogram, up to 5 recent feedback entries, tracking (since when and how often we have observed the seller) and, where the seller publishes them, business name and address — all included
mode=auto bills what was served: 0.5 from our stored observation, 1 when it went live
1 live · 0.5 stored
↳  + history — the seller’s rating change points and storefront-size points since we first observed it (history=true) 2026-10-05
once per call, only when at least one point comes back; an empty history is free
+0.5
Seller’s products (/v1/seller/products) 2026-10-04
live storefront: per page actually fetched, like /v1/serp; warehouse: the products we observed the seller offering, 25 per page, like /v1/search
1 per storefront page fetched · 1 per page of 25 observed products
Brand dossier (/v1/brand) · brand seller map (/v1/brand/network) · connected sellers (/v1/seller/network) · category landscape (/v1/category) 2026-10-05
derived from our observations; history=true on brand / seller-brands / category adds up to 24 months for +0.5 once, only when it comes back non-empty
1 per record · +0.5 with history
Who sells a brand (/v1/brand/sellers) · operator footprint (/v1/seller/brands) · ranked lists (/v1/brands/movers, /v1/brands/top, /v1/sellers/movers, /v1/sellers/top, /v1/categories/top) 2026-10-05
25 rows per page; an empty page is free; each key has a daily cap on the derived family (2,000 calls by default — ask us for more)
1 per page of 25
Category lookup (/v1/categories/search) 2026-10-050
Category taxonomy (/v1/categories — roots, or one category’s children) 2026-10-07 — any key, every plan0
Keyword suggestions (/v1/keywords) — Amazon’s own autocomplete suggestion lists for a seed, every term with its position within its list, first / last observed, and the marketplaces it was observed in, plus related observed vocabulary 2026-10-07
observed suggestion ranking since Aug 2026 — no volume figures (Amazon publishes none); for the products on page 1 of a search see /v1/keywords/rankings; a seed with no observations is a free 404
1 per seed
↳  + history — every observation of each returned list since the harvest began: terms entering, leaving or moving (history=true)
only when at least one closed observation exists; a list that never changed is free
+0.5
Keyword vocabulary across marketplaces (/v1/keywords/compare) — the seed’s primary list on 2–11 marketplaces and the position matrix 2026-10-071 per call
Keyword rankings (/v1/keywords/rankings) — page 1 of Amazon US search for a keyword as last observed (about once a week): the organic order with product facts and buy boxes, the sponsored units in the page, the Overall Pick badge, Amazon’s result count and who holds the page, dated 2026-10-18
paid plans; observed positions, no volume figures; a keyword not in the observed set (or not observed yet) is a free 404
1 per keyword
↳  + history — every stored observation of the keyword and the rank series of the products on the latest page (history=true)
only when more than the latest observation exists
+0.5
Keywords for a product (/v1/product/keywords) — reverse ASIN: every observed keyword whose latest page 1 shows the product, organically with its rank or in a sponsored unit; asins= compares up to 10 products 2026-10-18
paid plans; a product not seen on any observed page is a free 404; history=true adds the product’s rank on each keyword over time (+0.5 once when any keyword has more than one observation)
1 per 25 keywords returned, per ASIN
Partial scrape, not found, empty storefront, blocked or suppressed seller, failed, or rate-limited
you are never charged for a request that did not return what you asked for, and plan credits are a monthly allowance that renews with your billing cycle (top-up credits stay usable for 90 days)
0 — never billed

Every Amazon marketplace costs the same. Warehouse 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.

ParamNotes
qrequired — the search query. A bare ASIN (or numeric Walmart item ID) returns exactly that product (mode: "asin"). On Amazon its price, rating, review_count, seller_count, in_stock and bought_past_month are the values /v1/product returns for that ASIN at the same moment 2026-10-21.
countryus (default), uk, de, ca, au, fr, it, es, jp, mx, br — 11 Amazon marketplaces — plus walmart (Walmart US, numeric item ID)
categoryoptional — 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.
groupoptional — force category, price, or none; default auto. none 2026-10-18 returns one flat ranked list drawn from the categories that name the product (laptop lists laptops, not laptop bags; eggs lists eggs, not egg cookers). When no category names the product, the list ranks every match.
format 2026-09-30optional, books and media — only this format: kindle, paperback, hardcover, mass_market, audiobook, audio_cd, board_book, spiral, library_binding, other; comma-separate several (format=paperback,hardcover). Applied before collapse, so each row is the requested format of its book. A marketplace without format data yet returns no results with a note saying so (not billed). For used copies of a format, take the ASINs to /v1/product with include_used=true, or a batch with include: ["used"].
collapse 2026-09-30optional — true (default): one row per book. The best-matching format represents the book, and its other formats (each its own ASIN, with price) are in the row’s formats, alongside format_norm and family_asin. false: every format as its own row (the behaviour before 2026-09-30). Products without format data are never collapsed.
include_unavailable 2026-09-26optional — false (default) returns only products with a current offer: a price observed in the activity window. true also returns listings we know but that currently have no offer on the marketplace (Amazon “Currently unavailable”: price: null, in_stock: false). A bare ASIN in q always returns that product regardless of this flag; use /v1/product for its history.
qrequired — 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.
sortoptional — 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 2026-09-28optional — true attaches to every product everything the basic /v1/product answer carries: current_sellers (each seller with fulfillment, delivery_*, condition), the fulfillment block, 30-day price/stock change events, stock_history / stock_state, brand_stats, dimensions, deal_history, bought_past_month_history, rating_history, variation_coverage, page content (images, feature_bullets, breadcrumbs, variations, description) and reviews (up to 50), authors / author, every seller row carrying its seller_rating feedback record — plus a response-wide seller_ratings array. Only bsr_history and offer_history stay product-only (included in the record there, no extra credits). Up to 40 products per response get the block. 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,
      "upc": "842776104423",
      "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
}

When nothing matches every term 2026-10-09: the answer is relaxed instead of empty, and says so: match: "relaxed", dropped_terms (as typed) and a note naming them and why. Terms that match no product go first; then, in an ALL-CAPS query, 1–2 letter words without digits (distributor shorthand such as MO; 4K or 2M stay); then at most two more terms. A query that matches as typed is never relaxed, and a relaxed answer is not billed. /v1/search does the same against the whole catalogue.

Books 2026-09-30: a query that is an author’s name (“tolkien”, “stephen king”) returns only that author’s books, and the response carries author_match (the matched author names). Words that are mostly something else (“rice”, “king”) are not treated as authors. Book rows carry author, and where we hold format data, format_norm, family_asin and formats (see collapse). Both fill in as book pages are re-observed from 2026-10-01.

Sample response — detail=true 2026-09-28 — the same call with &detail=true, a real answer; one group with one product shown, its detail block complete except reviews (3 of 21 kept), images (3 of 12) and the stock/price series (6 points each) shortened for display; seller_ratings filtered to the sellers this product names. Every product in the response carries the same block (up to 40).

{
  "query": "toothbrush",
  "country": "us",
  "currency": "USD",
  "mode": "category",
  "total": 1153,
  "detail": true,
  "groups": [
    {
      "category": "Health & Household > Oral Care > Toothbrushes & Accessories > Powered Toothbrushes & Accessories > Powered Toothbrushes > Ultrasonic",
      "count": 179,
      "products": [
        {
          "asin": "B0DNMLK6SC",
          "product_id": "B0DNMLK6SC",
          "product_url": "https://www.amazon.com/dp/B0DNMLK6SC",
          "title": "Bitvae ADA Accepted Electric Toothbrush, 60-Day Battery Travel Toothbrush",
          "brand": "Bitvae",
          "price": 24.99,
          "rating": 4.4,
          "review_count": 13908,
          "in_stock": true,
          "seller_count": 1,
          "is_fba": true,
          "image_url": "https://m.media-amazon.com/images/I/719Qwh9HkEL._AC_SY355_.jpg",
          "category": "Health & Household > Oral Care > Toothbrushes & Accessories > Powered Toothbrushes & Accessories > Powered Toothbrushes > Ultrasonic",
          "bought_past_month": 1000,
          "observed_at": "2026-09-16T09:55:39Z",
          "description": "ADA Approved for a Brighter Smile in Two Weeks: Bitvae D2 electric toothbrush is endorsed by the American Dental Association (ADA) Council on Scientific Affairs for its safety and efficacy in removing plaque and helping to prevent and reduce gingivitis • Daily Use-Friendly 2-in-1 Toothbrush Holder and Cover: This electric toothbrush features a versatile holder that not only keeps your toothbrush clean and hygienic but also doubles as a protective cover, shielding it from dust and water between uses • Sleek and Lightweight Travel Toothbrush: Our rechargeable toothbrush's slim design and lightweight build make packing a breeze; Your Perfect On-the-Go Companion with a 60 days battery life, stay fresh and confident every day, everywhere • 8 Replacement Heads for 2 Years of Use: Transform your smile with our cutting-edge toothbrush heads; Featuring precision-crafted firm bristles at the core for deep cleansing action, soft gumcare bristles at the edges to protect your gums • 5 Modes for Various Oral Care Needs: White, Clean, Soft, Polish, Gum Care; The 5 brushing modes are designed to meet all your oral care needs and help maintain a healthy mouth • 2-Minute Smart Timer & IPX7 Waterproof: This electric toothbrush built-in 2-minute timer control system pulses every 30 seconds to remind you to move on to the next quadrant of your mouth • Package Includes: 1 Bitvae D2 Toothbrush Handle, 8 Toothbrush Heads, 1 USB Cable (Adapter not included—please charge the toothbrush using a 5V-1A adapter), 1 Travel Case & Holder, 1 Instruction Manual\n\nSpecs — Brand Name: Bitvae · Age Range Description: Adult · Included Components: 8 Toothbrush Heads, Travel Case, Toothbrush Holder, USB Cable · Model Name: H1D2 · Target Audience: Unisex-Adults · Manufacturer: Bitvae · Other Special Features of the Product: ADA Approved, Rechargeable, Travel Size, Lightweight , Portable, Customizable, Brushing Timer, 8 Brush Heads, 5 Modes, 60-Day Battery Life, IPX7 Waterproof · Power Source: Battery Powered · Item Firmness Description: Soft · Toothbrush Head Shape: Oval · Operation Mode: Automatic · Number of settings: 5 · Mount Motion: ultrasonic · Number of Items: 1 · Unit Count: 8 Count · Item Dimensions: 7.8 x 0.79 x 0.67 inches · Item Weight: 0.21 kg · Material Features: Recyclable · Bristle Material: Nylon · Handle Material: Plastic · Color: Shadow Black · Product Dimensions: 7.8 x 0.79 x 0.67 inches; 7.37 ounces",
          "amazon_url": "https://www.amazon.com/dp/B0DNMLK6SC",
          "detail": {
            "observed_at": "2026-09-16T09:55:39Z",
            "price_changes_30d": [
              {
                "at": "2026-09-01T14:28:40Z",
                "from": 16.12,
                "to": 24.99,
                "seller": "Bitvae",
                "seller_id": "A1JHU3BZ1D3UVY"
              },
              {
                "at": "2026-09-05T03:03:40Z",
                "from": 24.99,
                "to": 19.99,
                "seller": "Bitvae",
                "seller_id": "A1JHU3BZ1D3UVY"
              },
              {
                "at": "2026-09-11T06:11:33Z",
                "from": 19.99,
                "to": 24.99,
                "seller": "Bitvae",
                "seller_id": "A1JHU3BZ1D3UVY"
              },
              {
                "at": "2026-09-14T20:15:44Z",
                "from": 24.99,
                "to": 19.99,
                "seller": "Bitvae",
                "seller_id": "A1JHU3BZ1D3UVY"
              },
              {
                "at": "2026-09-15T16:15:54Z",
                "from": 19.99,
                "to": 24.99,
                "seller": "Bitvae",
                "seller_id": "A1JHU3BZ1D3UVY"
              }
            ],
            "stock_changes_30d": [],
            "price_history": [
              {
                "at": "2026-05-20T06:09:05Z",
                "from": 16.13,
                "to": 24.99,
                "seller": "Bitvae",
                "seller_id": "A1JHU3BZ1D3UVY"
              },
              {
                "at": "2026-06-20T20:55:10Z",
                "from": 24.99,
                "to": 16.24,
                "seller": "Bitvae",
                "seller_id": "A1JHU3BZ1D3UVY"
              },
              {
                "at": "2026-06-25T11:18:16Z",
                "from": 16.24,
                "to": 19.99,
                "seller": "Bitvae",
                "seller_id": "A1JHU3BZ1D3UVY"
              },
              {
                "at": "2026-07-13T16:06:39Z",
                "from": 19.99,
                "to": 16.24,
                "seller": "Bitvae",
                "seller_id": "A1JHU3BZ1D3UVY"
              },
              {
                "at": "2026-07-29T03:49:43Z",
                "from": 16.24,
                "to": 19.99,
                "seller": "Bitvae",
                "seller_id": "A1JHU3BZ1D3UVY"
              },
              {
                "at": "2026-08-27T20:39:55Z",
                "from": 19.99,
                "to": 16.12,
                "seller": "Bitvae",
                "seller_id": "A1JHU3BZ1D3UVY"
              }
            ],
            "stock_history": [],
            "stock_state": "in_stock",
            "stock_observed_since": "2026-05-16T08:10:22Z",
            "bought_past_month": 1000,
            "bought_past_month_raw": "1K+ bought in past month",
            "bought_past_month_observed_at": "2026-09-16T09:55:35Z",
            "dimensions": {
              "weight_raw": "0.21 kg",
              "weight_value": 0.21,
              "weight_unit": "kg",
              "weight_g": 210.0,
              "weight_observed_at": "2026-09-16T09:55:35Z",
              "dimensions_raw": "7.8 x 0.79 x 0.67 inches",
              "length": 7.8,
              "width": 0.79,
              "height": 0.67,
              "unit": "in",
              "length_cm": 19.81,
              "width_cm": 2.01,
              "height_cm": 1.7,
              "dimensions_observed_at": "2026-09-16T09:55:35Z",
              "observed_at": "2026-09-16T09:55:35Z"
            },
            "rating_history": {
              "points": [
                {
                  "date": "2026-05-16",
                  "rating_count": 13697,
                  "rating": 4.4
                },
                {
                  "date": "2026-05-20",
                  "rating_count": 13702,
                  "rating": 4.4
                },
                {
                  "date": "2026-05-28",
                  "rating_count": 13705,
                  "rating": 4.4
                },
                {
                  "date": "2026-06-02",
                  "rating_count": 13722,
                  "rating": 4.4
                },
                {
                  "date": "2026-06-07",
                  "rating_count": 13745,
                  "rating": 4.4
                },
                {
                  "date": "2026-06-11",
                  "rating_count": 13764,
                  "rating": 4.4
                },
                {
                  "date": "2026-06-16",
                  "rating_count": 13763,
                  "rating": 4.4
                },
                {
                  "date": "2026-06-20",
                  "rating_count": 13770,
                  "rating": 4.4
                },
                {
                  "date": "2026-06-25",
                  "rating_count": 13776,
                  "rating": 4.4
                },
                {
                  "date": "2026-06-30",
                  "rating_count": 13786,
                  "rating": 4.4
                },
                {
                  "date": "2026-07-04",
                  "rating_count": 13796,
                  "rating": 4.4
                },
                {
                  "date": "2026-07-09",
                  "rating_count": 13803,
                  "rating": 4.4
                },
                {
                  "date": "2026-07-13",
                  "rating_count": 13814,
                  "rating": 4.4
                },
                {
                  "date": "2026-07-20",
                  "rating_count": 13820,
                  "rating": 4.4
                },
                {
                  "date": "2026-07-25",
                  "rating_count": 13834,
                  "rating": 4.4
                },
                {
                  "date": "2026-07-29",
                  "rating_count": 13835,
                  "rating": 4.4
                },
                {
                  "date": "2026-08-05",
                  "rating_count": 13830,
                  "rating": 4.4
                },
                {
                  "date": "2026-08-09",
                  "rating_count": 13833,
                  "rating": 4.4
                },
                {
                  "date": "2026-08-14",
                  "rating_count": 13846,
                  "rating": 4.4
                },
                {
                  "date": "2026-08-27",
                  "rating_count": 13865,
                  "rating": 4.4
                },
                {
                  "date": "2026-09-01",
                  "rating_count": 13870,
                  "rating": 4.4
                },
                {
                  "date": "2026-09-05",
                  "rating_count": 13875,
                  "rating": 4.4
                },
                {
                  "date": "2026-09-11",
                  "rating_count": 13891,
                  "rating": 4.4
                },
                {
                  "date": "2026-09-13",
                  "rating_count": 13905,
                  "rating": 4.4
                },
                {
                  "date": "2026-09-14",
                  "rating_count": 13905,
                  "rating": 4.4
                },
                {
                  "date": "2026-09-15",
                  "rating_count": 13907,
                  "rating": 4.4
                },
                {
                  "date": "2026-09-16",
                  "rating_count": 13908,
                  "rating": 4.4
                }
              ],
              "points_total": 27,
              "observed_from": "2026-05-16",
              "observed_to": "2026-09-16",
              "rating_count_first": 13697,
              "rating_count_last": 13908,
              "rating_last": 4.4,
              "ratings_gained_30d": 43,
              "ratings_gained_90d": 138,
              "notes": "One point per day the product page was observed (rating_count = Amazon's global ratings count, rating = the star average shown); ratings_gained_Nd = the count's growth over the trailing window of observed days. Observed since we started tracking this listing."
            },
            "bought_past_month_history": {
              "segments": [
                {
                  "from": "2026-05-16",
                  "to": "2026-05-20",
                  "days_observed": 2,
                  "bought_past_month": 2000,
                  "raw": "2K+ bought in past month"
                },
                {
                  "from": "2026-05-28",
                  "to": "2026-06-02",
                  "days_observed": 2,
                  "bought_past_month": 1000,
                  "raw": "1K+ bought in past month"
                },
                {
                  "from": "2026-06-07",
                  "to": "2026-07-13",
                  "days_observed": 9,
                  "bought_past_month": 2000,
                  "raw": "2K+ bought in past month"
                },
                {
                  "from": "2026-07-20",
                  "to": "2026-07-25",
                  "days_observed": 2,
                  "bought_past_month": 1000,
                  "raw": "1K+ bought in past month"
                },
                {
                  "from": "2026-07-29",
                  "to": "2026-09-15",
                  "days_observed": 11,
                  "bought_past_month": 2000,
                  "raw": "2K+ bought in past month"
                },
                {
                  "from": "2026-09-16",
                  "to": "2026-09-16",
                  "days_observed": 1,
                  "bought_past_month": 1000,
                  "raw": "1K+ bought in past month"
                }
              ],
              "segments_total": 6,
              "days_observed": 27,
              "observed_from": "2026-05-16",
              "observed_to": "2026-09-16",
              "max": 2000,
              "notes": "One segment per run of consecutive product-page observations with the same badge (bought_past_month = the floor of Amazon's bucket, raw = the badge text). null = the page was observed WITHOUT a badge (Amazon badges only higher-velocity listings); a day absent from every segment was not observed on the product page."
            },
            "deal_history": {
              "segments": [
                {
                  "from": "2026-05-16",
                  "to": "2026-05-16",
                  "days_observed": 1,
                  "list_price": 19.99,
                  "savings_amount": 3.86,
                  "savings_percent": 19,
                  "coupon_text": null,
                  "coupon_expires": null,
                  "coupon_amount": null,
                  "coupon_percent": null
                },
                {
                  "from": "2026-05-20",
                  "to": "2026-05-20",
                  "days_observed": 1,
                  "list_price": 24.99,
                  "savings_amount": null,
                  "savings_percent": null,
                  "coupon_text": "Save 30%   at checkout Shop items",
                  "coupon_expires": null,
                  "coupon_amount": null,
                  "coupon_percent": 30.0
                },
                {
                  "from": "2026-05-28",
                  "to": "2026-06-07",
                  "days_observed": 3,
                  "list_price": 24.99,
                  "savings_amount": null,
                  "savings_percent": 20,
                  "coupon_text": null,
                  "coupon_expires": null,
                  "coupon_amount": null,
                  "coupon_percent": null
                },
                {
                  "from": "2026-06-11",
                  "to": "2026-06-20",
                  "days_observed": 3,
                  "list_price": 24.99,
                  "savings_amount": null,
                  "savings_percent": 35,
                  "coupon_text": null,
                  "coupon_expires": null,
                  "coupon_amount": null,
                  "coupon_percent": null
                },
                {
                  "from": "2026-06-25",
                  "to": "2026-07-09",
                  "days_observed": 4,
                  "list_price": 24.99,
                  "savings_amount": null,
                  "savings_percent": 20,
                  "coupon_text": null,
                  "coupon_expires": null,
                  "coupon_amount": null,
                  "coupon_percent": null
                },
                {
                  "from": "2026-07-13",
                  "to": "2026-07-25",
                  "days_observed": 3,
                  "list_price": 24.99,
                  "savings_amount": null,
                  "savings_percent": 35,
                  "coupon_text": null,
                  "coupon_expires": null,
                  "coupon_amount": null,
                  "coupon_percent": null
                },
                {
                  "from": "2026-07-29",
                  "to": "2026-07-29",
                  "days_observed": 1,
                  "list_price": 24.99,
                  "savings_amount": null,
                  "savings_percent": 20,
                  "coupon_text": null,
                  "coupon_expires": null,
                  "coupon_amount": null,
                  "coupon_percent": null
                },
                {
                  "from": "2026-08-05",
                  "to": "2026-08-14",
                  "days_observed": 3,
                  "list_price": 24.99,
                  "savings_amount": 5.0,
                  "savings_percent": 20,
                  "coupon_text": null,
                  "coupon_expires": null,
                  "coupon_amount": null,
                  "coupon_percent": null
                },
                {
                  "from": "2026-08-27",
                  "to": "2026-08-27",
                  "days_observed": 1,
                  "list_price": 19.99,
                  "savings_amount": 3.87,
                  "savings_percent": 19,
                  "coupon_text": null,
                  "coupon_expires": null,
                  "coupon_amount": null,
                  "coupon_percent": null
                },
                {
                  "from": "2026-09-01",
                  "to": "2026-09-01",
                  "days_observed": 1,
                  "list_price": 49.95,
                  "savings_amount": 24.96,
                  "savings_percent": 50,
                  "coupon_text": "Save 20%   at checkout Terms",
                  "coupon_expires": null,
                  "coupon_amount": null,
                  "coupon_percent": 20.0
                },
                {
                  "from": "2026-09-05",
                  "to": "2026-09-05",
                  "days_observed": 1,
                  "list_price": 24.99,
                  "savings_amount": 5.0,
                  "savings_percent": 20,
                  "coupon_text": null,
                  "coupon_expires": null,
                  "coupon_amount": null,
                  "coupon_percent": null
                },
                {
                  "from": "2026-09-11",
                  "to": "2026-09-11",
                  "days_observed": 1,
                  "list_price": null,
                  "savings_amount": null,
                  "savings_percent": null,
                  "coupon_text": null,
                  "coupon_expires": null,
                  "coupon_amount": null,
                  "coupon_percent": null
                },
                {
                  "from": "2026-09-13",
                  "to": "2026-09-13",
                  "days_observed": 1,
                  "list_price": 27.99,
                  "savings_amount": 3.0,
                  "savings_percent": 11,
                  "coupon_text": null,
                  "coupon_expires": null,
                  "coupon_amount": null,
                  "coupon_percent": null
                },
                {
                  "from": "2026-09-14",
                  "to": "2026-09-14",
                  "days_observed": 1,
                  "list_price": 24.99,
                  "savings_amount": 5.0,
                  "savings_percent": 20,
                  "coupon_text": null,
                  "coupon_expires": null,
                  "coupon_amount": null,
                  "coupon_percent": null
                },
                {
                  "from": "2026-09-15",
                  "to": "2026-09-15",
                  "days_observed": 1,
                  "list_price": null,
                  "savings_amount": null,
                  "savings_percent": null,
                  "coupon_text": null,
                  "coupon_expires": null,
                  "coupon_amount": null,
                  "coupon_percent": null
                },
                {
                  "from": "2026-09-16",
                  "to": "2026-09-16",
                  "days_observed": 1,
                  "list_price": 49.95,
                  "savings_amount": 24.96,
                  "savings_percent": 50,
                  "coupon_text": null,
                  "coupon_expires": null,
                  "coupon_amount": null,
                  "coupon_percent": null
                }
              ],
              "segments_total": 16,
              "days_observed": 27,
              "observed_from": "2026-05-16",
              "observed_to": "2026-09-16",
              "days_with_list_price": 25,
              "days_with_coupon": 2,
              "list_price_suppressed_days": 0,
              "list_price_hidden_days": 0,
              "list_price_unstable_days": 0,
              "current": {
                "list_price": 49.95,
                "savings_amount": 24.96,
                "savings_percent": 50,
                "coupon_text": null,
                "coupon_expires": null,
                "coupon_amount": null,
                "coupon_percent": null,
                "as_of": "2026-09-16"
              },
              "notes": "List price (the strikethrough 'List:' / 'Was:' figure), Amazon's shown savings, and the coupon or promotion text as printed on the product page, one segment per run of consecutive observations with identical values; coupon_amount / coupon_percent are parsed from that text (null when it carries no figure). null fields = not shown on the page that day; 'current' = the latest observed segment. A list price 20x or more above that day's price is a parser artefact and is served as null (list_price_suppressed_days); a list price at or below that day's price is no discount, so it and that day's savings are served as null (list_price_hidden_days). A list price is served only when it is consistent: at least 60% of the product-page observations within 7 days either side of it carry a list price within 10% of it; otherwise the page's list-price field was flipping between unrelated values (another variation's or another widget's price) and that day's list price and savings are served as null (list_price_unstable_days). The check reads the days after an observation too, so the verdict for the latest week can change as new observations arrive."
            },
            "variation_coverage": {
              "parent_asin": "B0BHNYQ2VC",
              "is_variation_child": true,
              "variation_count": 1,
              "dimension_names": [
                "color_name"
              ],
              "children_total": 1,
              "children_tracked": 1,
              "children_tracked_pct": 100.0,
              "children_with_price_30d": 1,
              "children_available": 1,
              "children_listed": 1,
              "children_truncated": false,
              "children": [
                {
                  "child_asin": "B0DNMLK6SC",
                  "dimension_values": {
                    "color_name": "Shadow Black"
                  },
                  "is_available": true,
                  "is_this_asin": true,
                  "tracked": true,
                  "last_observed_at": "2026-09-16T09:55:39Z",
                  "price_30d": 24.99,
                  "price_30d_observed_at": "2026-09-16T09:55:39Z"
                }
              ],
              "matrix_observed_at": "2026-09-16T09:55:35Z",
              "notes": "Coverage of the variation matrix as last observed on the product page (current state, not history): children_tracked = child ASINs with at least one observation of their own on this marketplace, the rest are known only as matrix entries; price_30d = the child's latest observed price in the last 30 days (null = not observed in that window); is_available is the matrix's own flag at matrix_observed_at. An empty matrix on a listing without variants is normal."
            },
            "current_sellers": {
              "as_of": "2026-09-16T09:55:39Z",
              "offer_count": 1,
              "buybox_seller": "Bitvae",
              "conditions_included": "new_only",
              "used_offer_count": 0,
              "buybox_days_observed_30d": 26,
              "buybox_observations_total_30d": 41,
              "lowest_new": {
                "price": 24.99,
                "condition": "New",
                "condition_class": "new",
                "seller": "Bitvae",
                "seller_id": "A1JHU3BZ1D3UVY",
                "is_fba": true,
                "is_prime": false,
                "fulfillment": "FBA",
                "seller_rating": {
                  "positive_pct": 98.0,
                  "feedback_count": 5923,
                  "rating": null,
                  "observed_at": "2026-09-19T09:18:23Z"
                }
              },
              "lowest_used": null,
              "sellers": [
                {
                  "seller": "Bitvae",
                  "seller_id": "A1JHU3BZ1D3UVY",
                  "price": 24.99,
                  "is_buybox": true,
                  "is_fba": true,
                  "is_prime": false,
                  "seller_positive_pct": 98.0,
                  "seller_feedback_count": 5923,
                  "buybox_days_30d": 7,
                  "buybox_share_30d": 27,
                  "buybox_observations_30d": 11,
                  "buybox_observation_share_30d": 26.8,
                  "ships_from": "Amazon.com",
                  "shipping_cost": 0.0,
                  "condition": "New",
                  "condition_class": "new",
                  "fulfillment": "FBA",
                  "delivery": {
                    "text": "FREE delivery September 22 - 23 on orders shipped by Amazon over $35 Or fastest delivery Monday, September 21",
                    "free": true,
                    "days_min": 6,
                    "days_max": 7,
                    "fastest_days": 5,
                    "date_min": "2026-09-22",
                    "source": "nightly",
                    "observed_at": "2026-09-16T07:55:39Z"
                  },
                  "delivery_eta_days": 6,
                  "delivery_eta_fastest_days": 5,
                  "seller_rating": {
                    "positive_pct": 98.0,
                    "feedback_count": 5923,
                    "rating": null,
                    "observed_at": "2026-09-19T09:18:23Z"
                  }
                }
              ]
            },
            "brand_stats": {
              "brand": "Bitvae",
              "products_tracked": 10,
              "avg_rating": 4.41,
              "total_ratings": 102498,
              "in_stock_pct": 100.0,
              "distinct_buybox_sellers": 1,
              "top_buybox_sellers": [
                {
                  "seller": "Bitvae",
                  "products": 8
                }
              ]
            },
            "fulfillment": {
              "buybox": "FBA",
              "buybox_seller": "Bitvae",
              "buybox_seller_id": "A1JHU3BZ1D3UVY",
              "ships_from": "Amazon.com",
              "is_prime": false,
              "offers": {
                "amz": 0,
                "fba": 1,
                "fbm": 0,
                "total": 1
              },
              "amazon_sells": false,
              "amazon_holds_buybox": false,
              "buybox_delivery": {
                "text": "FREE delivery September 22 - 23 on orders shipped by Amazon over $35 Or fastest delivery Monday, September 21",
                "free": true,
                "days_min": 6,
                "days_max": 7,
                "fastest_days": 5,
                "date_min": "2026-09-22",
                "source": "nightly",
                "observed_at": "2026-09-16T07:55:39Z"
              },
              "buybox_delivery_eta_days": 6,
              "dispatch_latency": null,
              "dispatch_days_min": null,
              "dispatch_days_max": null,
              "delivery_eta_source": "offer",
              "observed_at": "2026-09-16T09:55:39Z",
              "source": "cache",
              "notes": "buybox is the buy-box winner's fulfilment: AMZ = sold by Amazon itself, FBA = a third party fulfilled by Amazon, FBM = merchant-fulfilled. Counts cover the offers listed in current_sellers. Delivery days are read from Amazon's own delivery sentence at the time of the observation, in whole days from that date; ranges give min/max, fastest_days is the paid/Prime fast option when shown. Not billed extra."
            },
            "description": "ADA Approved for a Brighter Smile in Two Weeks: Bitvae D2 electric toothbrush is endorsed by the American Dental Association (ADA) Council on Scientific Affairs for its safety and efficacy in removing plaque and helping to prevent and reduce gingivitis • Daily Use-Friendly 2-in-1 Toothbrush Holder and Cover: This electric toothbrush features a versatile holder that not only keeps your toothbrush clean and hygienic but also doubles as a protective cover, shielding it from dust and water between uses • Sleek and Lightweight Travel Toothbrush: Our rechargeable toothbrush's slim design and lightweight build make packing a breeze; Your Perfect On-the-Go Companion with a 60 days battery life, stay fresh and confident every day, everywhere • 8 Replacement Heads for 2 Years of Use: Transform your smile with our cutting-edge toothbrush heads; Featuring precision-crafted firm bristles at the core for deep cleansing action, soft gumcare bristles at the edges to protect your gums • 5 Modes for Various Oral Care Needs: White, Clean, Soft, Polish, Gum Care; The 5 brushing modes are designed to meet all your oral care needs and help maintain a healthy mouth • 2-Minute Smart Timer & IPX7 Waterproof: This electric toothbrush built-in 2-minute timer control system pulses every 30 seconds to remind you to move on to the next quadrant of your mouth • Package Includes: 1 Bitvae D2 Toothbrush Handle, 8 Toothbrush Heads, 1 USB Cable (Adapter not included—please charge the toothbrush using a 5V-1A adapter), 1 Travel Case & Holder, 1 Instruction Manual",
            "description_source": "feature_bullets",
            "images": [
              "https://m.media-amazon.com/images/I/51daP2PQo1L.jpg",
              "https://m.media-amazon.com/images/I/51h2+bu39ML.jpg",
              "https://m.media-amazon.com/images/I/512vSssS9FL.jpg"
            ],
            "feature_bullets": [
              "ADA Approved for a Brighter Smile in Two Weeks: Bitvae D2 electric toothbrush is endorsed by the American Dental Association (ADA) Council on Scientific Affairs for its safety and efficacy in removing plaque and helping to prevent and reduce gingivitis",
              "Daily Use-Friendly 2-in-1 Toothbrush Holder and Cover: This electric toothbrush features a versatile holder that not only keeps your toothbrush clean and hygienic but also doubles as a protective cover, shielding it from dust and water between uses",
              "Sleek and Lightweight Travel Toothbrush: Our rechargeable toothbrush's slim design and lightweight build make packing a breeze; Your Perfect On-the-Go Companion with a 60 days battery life, stay fresh and confident every day, everywhere",
              "8 Replacement Heads for 2 Years of Use: Transform your smile with our cutting-edge toothbrush heads; Featuring precision-crafted firm bristles at the core for deep cleansing action, soft gumcare bristles at the edges to protect your gums",
              "5 Modes for Various Oral Care Needs: White, Clean, Soft, Polish, Gum Care; The 5 brushing modes are designed to meet all your oral care needs and help maintain a healthy mouth",
              "2-Minute Smart Timer & IPX7 Waterproof: This electric toothbrush built-in 2-minute timer control system pulses every 30 seconds to remind you to move on to the next quadrant of your mouth",
              "Package Includes: 1 Bitvae D2 Toothbrush Handle, 8 Toothbrush Heads, 1 USB Cable (Adapter not included—please charge the toothbrush using a 5V-1A adapter), 1 Travel Case & Holder, 1 Instruction Manual"
            ],
            "breadcrumbs": [
              "Health & Household",
              "Oral Care",
              "Toothbrushes & Accessories",
              "Powered Toothbrushes & Accessories",
              "Powered Toothbrushes",
              "Ultrasonic"
            ],
            "variations": [
              {
                "child_asin": "B0DNMLK6SC",
                "dimension_index": "0",
                "dimension_values": {
                  "color_name": "Shadow Black"
                },
                "is_selected": 1,
                "is_available": 1
              }
            ],
            "variation_count": 1,
            "parent_asin": "B0BHNYQ2VC",
            "content_observed_at": "2026-09-16 11:55:35",
            "reviews": [
              {
                "author": null,
                "rating": 5.0,
                "title": "Clean and simple",
                "date_raw": "Reviewed in the United States on February 5, 2025",
                "verified": true,
                "is_local": true,
                "variant": null,
                "body": "I bought this toothbrush in May, 2022 and the battery just stopped working for good on February 3, 2025. I liked it so I’m back here buying another one. The first one lasted a little over two and a half years, which isn’t too bad compared to the longevity versus cost of one of the more expensive “name brand” electric toothbrushes. I do wish these could last longer just for the sake of creating less plastic waste. What I like about this toothbrush is the handle is easy to hold, simple shape, lightweight and easy to clean… It comes with a lot of replacement brush heads. The size of the brush head and bristle softness works well for me. They attach easily and stay on well without rattling. The whole thing is quite durable. I like that it charges with a USB cord (although a plug was not included). I like that it did not come with a charging base – that would only be more plastic waste and I don’t like to leave my toothbrush out on the counter anyway. The cord attaches on the bottom of the handle so the toothbrush lays on its side while charging. The use time between battery charges is pretty long. I never really paid attention to just how long – maybe a month or two? It’s got some different vibration settings but I’m not really sure why. It seems to me they all clean about the same. Here’s something a little weird: Several days before the battery croaked for good, the toothbrush came on all by itself in the middle of the night. That was a little creepy. It wouldn’t turn off until I plugged it in. Then it happened again two nights later. The following morning it wouldn’t run anymore. So maybe that’s what happens when the battery is about to be all done…?",
                "helpful_count": 4
              },
              {
                "author": null,
                "rating": 5.0,
                "title": "Would buy again",
                "date_raw": "Reviewed in the United States on September 7, 2026",
                "verified": true,
                "is_local": true,
                "variant": "Color: Shadow Black",
                "body": "Pleasantly surprised! I like to change heads more often than most, so this works great for me",
                "helpful_count": null
              },
              {
                "author": null,
                "rating": 4.0,
                "title": "Good value if it works",
                "date_raw": "Reviewed in the United States on August 13, 2026",
                "verified": true,
                "is_local": true,
                "variant": "Color: Shadow Black",
                "body": "product failed after a total of 6 months of use and no support from manufacturer. It was good when it worked. Edit: Manufacturer slow to respond - but shipped a replacement - update after testing replacement",
                "helpful_count": null
              }
            ],
            "review_count_scraped": 21,
            "out_of_stock": false,
            "in_stock": true,
            "history_available": true
          },
          "upc": null
        }
      ]
    }
  ],
  "results": "… (the response also carries results[], price_tiers[] and facets exactly as without detail)",
  "seller_ratings": [
    {
      "seller": "Bitvae",
      "seller_id": "A1JHU3BZ1D3UVY",
      "seller_positive_pct": 98.0,
      "seller_feedback_count": 5923,
      "seller_rating": null,
      "observed_at": "2026-09-19T09:18:23Z"
    }
  ],
  "credits_charged": 5.0,
  "data_source": "amazon US marketplace — observed listings"
}

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. Each Amazon product also carries upc — the barcode (UPC/EAN/GTIN) we hold for it, null when we hold none; feed it back to /v1/product?gtin= to resolve the same item. Walmart rows have no upc (Walmart uses numeric item IDs, not barcodes).

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 — warehouse 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). Warehouse responses return in under 100 ms.

ParamNotes
asin10-char ASIN, or a numeric Walmart item ID with country=walmart. Provide either asin or gtin (not both).
gtinoptional anchor — any barcode (UPC, EAN, GTIN or ISBN-13; 8, 12, 13 or 14 digits) instead of an ASIN 2026-10-12. Punctuation and leading zeros are tolerated, so 012345678905, 12345678905 and 0012345678905 all resolve to the same product. Resolved within the requested marketplace, cheapest evidence first, and the answer says how in gtin_resolution — see Barcodes. The lookup is included in the record’s price; a barcode nothing resolves is a 404 and is never billed.
countryus (default), uk, de, ca, au, fr, it, es, jp, mx, br — 11 Amazon marketplaces — plus walmart (Walmart US, numeric item ID)
modeauto (default) · cache · live — snapshot freshness (live scrape: all Amazon marketplaces, and Walmart since 2026-10-18 at 2 credits — Walmart live)
bsr_historyoptional — true adds per-category BSR rank history: one daily point per category (best rank observed that day).
  • Amazon US reaches Oct 2023 (~35 months). From Oct 2023 to Apr 2026 the ranks come from Amazon’s top-100 best-seller lists, including the top-level department lists (Home & Kitchen, Pet Supplies, Toys & Games…), so a product has root-category history for that period when it ranked in its department’s top 100; from Apr 2026 every observed rank, root and sub-category, is carried. Spring 2026 can show a gap where the two sources meet. Other marketplaces start when tracking began there. A gap in a series means the product was not observed in that category that day — never a rank of zero.
  • category_path 2026-10-02 on every series: the full path (“Home & Kitchen > Storage & Organization”). Amazon reuses names at different levels: “Kitchen & Dining” is both a top-level list and a sub-category of Home & Kitchen, with different ranks on the same day, and the path tells them apart.
  • Included in the record 2026-10-10 — no extra credits, with or without offer_history (until then history added 0.5 once per call). Amazon only — Walmart has no BSR.
  • History reads a very large archive, so it is the slowest part of this call. If it exceeds its budget we drop only the history block and still return the rest of the response, flagged history_degraded: true. The snapshot and intelligence data in that response are complete — just retry the history request later.
bsr_leaf / bsr_leaf_categoryalways 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_historyoptional — 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) from our multi-seller offer stream. US buy-box depth reaches Dec 2024; full multi-seller depth Aug 2025+. Included in the record — no extra credits 2026-10-10. Amazon only. Sellers are identified by seller_id (the merchant id); the name is that id's usual display name. On a day with more than one observed holder the timeline shows the last observation and multi_holder_days counts such days; the per-seller points keep buybox: true for every observed holder. Since 2026-09-27 every point also carries the offer’s shipping (a cost, 0 = free), fba and prime as observed that day (null on legacy-era days before 2026-04-17), and each series row fba_days, fba_last, shipping_last; seller feedback stays in current_sellers / seller_ratings.
Every observed seller is listed (sellers_total = the length of sellers), each with first_seen, last_seen, days_observed, buybox_days and points_total; the sellers_with_series most-observed sellers carry points (default 10 sellers × 500 points — see history_sellers / history_points), the rest carry points: [] with points_returned: 0.
sellers_per_day 2026-10-08: one entry per observed day (the most recent history_points days; sellers_per_day_total = all of them) — sellers = distinct sellers observed that day (every seller, not only the ones carrying series), buybox_holders = distinct buy-box holders observed that day, and list: full (a full offer list), buybox_only (a legacy feed that recorded only the buy-box offer — such a day says nothing about how many sellers competed) or carried_forward (the 2026-04-01 migration carry-forward). Count competing sellers on full days only; full_list_from = the first one.
buybox_price_history 2026-10-09 comes with it: the lowest buy-box price of every observed day, Amazon US back to Nov 2023 — see the field.
history_sellers 2026-09-16optional, with offer_history — how many of the most-observed sellers carry a point series. Default 10, max 50. Every observed seller is listed regardless.
history_points 2026-09-16optional, with offer_history — points per series: the most recent N observed days (default 500, max 20,000; one point per observed day, so the observation depth is the real bound — points_total tells you how many days a seller has). Billing: included 2026-10-10 — wider series cost nothing extra (until then every started 1,000 points beyond the default 10 × 500 cost 0.5). The block still discloses points_returned, points_included, points_extra and extra_credits (now 0).
history_only 2026-10-10optional — true returns only the stored history series for 0.05 credit: bsr_history, offer_history (shaped by history_sellers / history_points) and buybox_price_history, plus asin, marketplace, currency, data_source and history_only: true. No snapshot, content, current_sellers, brand stats or seller ratings — when you need today’s listing, call without it. The cheap lane for price and rank tracking at volume.
  • Amazon marketplaces only, served from stored observations: mode=cache and auto both read the warehouse, mode=live is a 422 (a live scrape is a current snapshot, not history), and Walmart is a 422. max_age_days does not apply — the series are what we hold, whatever the age of the last observation.
  • Nothing stored for the ASIN is a 404, never billed, with found_on when another marketplace holds it.
  • Works with gtin=, in batches (include: ["history_only"]) and on the MCP product tool, at the same price.
track 2026-10-14optional — true answers and tracks: after this answer the ASIN is pinned into our hot lane, which re-reads its offers page every interval for as long as your plan is active (or a ttl_days you set) and adds every read to buybox_price_points_hot — the same as POST /v1/track. No extra credits: the record is billed as usual and the tracking draws on the plan’s daily tracked-snapshot allowance. The answer is served even when the tracking is refused; the track block says what happened (status active / refused, granted_interval, allowance). Amazon only.
intervalwith track=true: 1h, 2h, 4h (default), 12h or 24h.
full_offersoptional — 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 warehouse copy is stale); warehouse 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.
  • Use it for unauthorized-seller, MAP and hijacker work: sellers deeper than the top 10 are exactly the ones those use cases are looking for.
  • Leave it off for repricing and sourcing, where the buy box and top offers are enough and latency matters.
  • Roughly 1 in 125 ASINs carries more than 10 offers, so on most products the two modes return the same list.
  • Without it, offer_count from a live scrape is a floor, not a total.
include_usedoptional — true adds the used, refurbished, open-box and collectible offers to current_sellers.sellers (default false keeps the new-condition list, so existing integrations see no change). Every seller row always carries condition (the marketplace's own label, e.g. Used - Like New, Gebraucht - Wie neu) and condition_class (new, used_like_new, used_very_good, used_good, used_acceptable, used, refurbished, open_box, collectible, unknown); current_sellers always carries conditions_included, used_offer_count, lowest_new and lowest_used (the cheapest offer of each population — the list itself is buy-box first, then price, so do not read the first row as the cheapest) whether or not you opt in. With offer_history=true and include_used=true the per-seller price series are keyed per seller and condition class. Cached, live and historical data alike; not billed extra.
max_age_dayswarehouse freshness window for the snapshot (default 30)

Barcodes (GTIN / UPC / EAN) 2026-10-12

Pass gtin= instead of asin= and we find the product, cheapest evidence first:

Stepgtin_resolution.sourceHow
1observedthe barcode printed on a listing we observe on this marketplace
2isbna book’s ISBN-13 (978…) becomes its ISBN-10, which is the print edition’s ASIN (gtin_note says so)
3other_marketplacethe same ASIN carries the barcode on another Amazon marketplace, and we observe that ASIN here too
4amazon_searchmode=auto (the default) or mode=live: one Amazon search for the barcode on this marketplace. Only organic results count — sponsored placements and ad blocks are never candidates, and never more results than Amazon’s own “N results” count. Among the first three, the one whose listing we have seen carrying this barcode wins; otherwise the first. The first time takes ~10–20 s; the answer is kept 60 days (a search that found nothing, 7 days), so the next lookup is instant. mode=cache never searches.

gtin_resolution = {"source", "confidence", "resolved_at", "barcode_verified"}. barcode_verified answers “is this barcode printed on that listing?” — true: we observed it there (steps 1 and 3), it is the book’s own ISBN (step 2), or the search result’s listing carries it in our observations or on its product page when we scrape it live; false: the listing shows other barcodes and not this one; null: Amazon’s search placed it and the listing shows no barcode we could compare. confidence: observed, isbn10, other_marketplace and verified are checked facts; single_result (Amazon’s page held one organic result) and search_top (the first of several) are unverified search answers; barcode_differs means the listing carries other barcodes — check it before you rely on it. A live answer (mode=live, or auto when it scrapes) also returns upc as printed on the product page. A barcode can legitimately map to more than one ASIN (variations, re-listings, bundles): the best match is returned, priced first then most recently observed, and gtin_matches / gtin_match_count list every match we hold. The same barcode can be a different listing on another marketplace. Walmart barcodes resolve against the UPC of walmart.com listings we observed (step 1 only). /v1/offers takes gtin= the same way, /v1/shopping resolves a bare barcode with steps 1–3 plus earlier search answers, and product batches take a gtins list (below).

curl "https://api.logimu.com/v1/product?gtin=000113684531&country=us" -H "X-API-KEY: sk_live_..."

# the answer is the full product record (here a Verizon Fios G3100 router, B082BLM2KH), plus
"gtin": "000113684531",
"gtin_matches": ["B082BLM2KH"],
"gtin_match_count": 1,
"gtin_resolution": {"source": "amazon_search", "confidence": "single_result", "resolved_at": "2026-10-12T15:07:58Z"}
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 warehouse 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",
  "buybox_observed_at": "2026-08-08T22:29:56Z",
  "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",
        "category_path": "Computers & Accessories > Data Storage > 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
          },
          {
            "date": "2023-10-25",
            "rank": 13
          },
          "… 232 more (truncated for this sample — the API returns all of them)"
        ]
      },
      {
        "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
          },
          {
            "date": "2023-11-08",
            "rank": 75
          },
          "… 6 more (truncated for this sample — the API returns all of them)"
        ]
      },
      "… 2 more (truncated for this sample — the API returns all of them)"
    ],
    "observed_from": "2023-10-24",
    "observed_to": "2026-08-09"
  },
  "offer_history": {
    "multi_holder_days": 23,
    "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,
        "seller_positive_pct": 96.0,
        "seller_feedback_count": 1842,
        "rating_observed_at": "2026-09-17T04:12:09Z",
        "points_total": 17,
        "points_returned": 17,
        "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)"
        ]
      },
      "… 38 more — every observed seller is listed; beyond the 10 most-observed, points is [] and points_returned 0 (points_total still says how many days that seller has)"
    ],
    "sellers_total": 40,
    "sellers_with_series": 10,
    "history_sellers": 10,
    "history_points": 500,
    "points_returned": 1843,
    "points_included": 1843,
    "points_extra": 0,
    "extra_credits": 0.0,
    "sellers_per_day": [
      { "date": "2025-03-27", "sellers": 1, "buybox_holders": 1, "list": "buybox_only" },
      "… 498 more (truncated for this sample — the most recent history_points observed days, oldest first)",
      { "date": "2026-08-08", "sellers": 21, "buybox_holders": 2, "list": "full" }
    ],
    "sellers_per_day_total": 612,
    "full_list_from": "2025-08-11",
    "observed_from": "2023-12-16",
    "observed_to": "2026-08-08"
  },
  "current_sellers": {
    "as_of": "2026-08-08T22:29:56Z",
    "offer_count": 21,
    "buybox_seller": "Nutrend Automotive Inc",
    "conditions_included": "new_only",
    "used_offer_count": 2,
    "buybox_days_observed_30d": 26,
    "buybox_observations_total_30d": 64,
    "lowest_new": { "price": 529.99, "condition": "New", "condition_class": "new", "seller": "Nutrend Automotive Inc", "seller_id": "A2LH8DUZ1Q6T63", "is_fba": false, "is_prime": false },
    "lowest_used": { "price": 449.00, "condition": "Used - Like New", "condition_class": "used_like_new", "seller": "Example Resale Ltd", "seller_id": "A1EXAMPLE0SELLR", "is_fba": true, "is_prime": true },
    "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,
        "buybox_share_30d": 19,
        "buybox_observations_30d": 9,
        "buybox_observation_share_30d": 14.1,
        "condition": "New",
        "condition_class": "new"
      },
      {
        "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,
        "buybox_share_30d": 0,
        "buybox_observations_30d": 0,
        "buybox_observation_share_30d": 0.0,
        "condition": "New",
        "condition_class": "new"
      },
      "… 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": null,
      "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": null,
      "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 warehouse and live responses, and image_url on live scrapes as well as the warehouse.

Listing content fields 2026-08-09

Always present on Amazon-marketplace answers, warehouse or live, at no extra charge. Walmart answers carry their own content set since 2026-09-20 — image_url, images[], description, category_path + breadcrumbs[], highlights[] (the PDP spec table as name/value pairs), warnings[], upc — listed in the Walmart row of the response table above. 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”.

FieldNotes
description / description_sourcedescription_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”.
imagesthe full gallery, de-duplicated to original-resolution URLs, up to 20. image_url stays the primary image.
feature_bulletsthe “About this item” bullets as their own list — no need to guess whether description happens to be bullets this time.
breadcrumbsthe complete category path (e.g. ["Electronics", "Computers & Accessories", "Data Storage", "External Hard Drives"]), not just the root and leaf.
variations / variation_count / parent_asinthe 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_scrapedthe top/featured reviews Amazon shows a logged-out visitor, accumulated across our observations — up to 50 per product 2026-09-28 (was 12), most recently featured first — not the full review history, and not a random sample. A single page render shows 8–13; the warehouse keeps every featured review it has seen for the ASIN, so older featured reviews stay available after Amazon rotates them out. On a live answer the page’s own reviews come first and the accumulated set fills up to the cap. Each review: author (always null 2026-10-03 — reviewer names are not stored or served; the key stays so existing parsers keep working), 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).
seller_count 2026-10-05the number of sellers we observed on the listing at its latest observation — the same observation as current_sellers, so with a seller list in the answer it always equals that list’s length (an observed empty list is 0); on a /v1/shopping row without detail it is the count from our nightly fulfilment table for that product. It is not Amazon’s own “N new offers” headline: that page number used to feed this key on search rows and was missing on most products and wrong on many (a stuck value on ~5 %), so it is no longer served anywhere. The list is what our pass read on the offers page (a live /v1/product with full_offers=true walks every page). null = no observation yet; on a /v1/shopping row also when that table’s latest observation of the listing is more than 30 days old 2026-10-18, so an old count is never served as today’s.
fulfillment 2026-09-17the listing's fulfilment status, Amazon marketplaces only, not billed extra. buybox = AMZ (sold by Amazon itself), FBA (a third party fulfilled by Amazon), FBM (merchant-fulfilled) or null (no buy box observed); buybox_seller, buybox_seller_id, ships_from, is_prime; offers = {amz, fba, fbm, total} counts over the offers in current_sellers; amazon_sells (Amazon has an offer on the listing) and amazon_holds_buybox; buybox_delivery (see below); dispatch_latency (Amazon's “Usually ships within 2 to 3 days”, only shown when the item does not ship immediately); observed_at, source. Amazon is identified by its storefront label, never by a merchant id.
current_sellers.sellers[].fulfillment / delivery / ships_from / shipping_costper seller: fulfillment (AMZ / FBA / FBM), ships_from, shipping_cost (the offer's shipping charge, 0 for free), and delivery = {text, free, days_min, days_max, fastest_days} — text is Amazon's own delivery sentence as rendered in the marketplace language at scrape time; days_min/days_max are whole days from the observation date to the promised delivery date (a range like “19 - 21 September” gives both, a single date gives the same value twice); fastest_days is the Prime / paid fast option when the sentence offers one; free is whether the standard option is free. Parsed for en, de, fr, it, es, pt and ja; when the sentence cannot be read the days are null and the text is kept. Delivery promises are relative to the scrape moment, so they describe the seller's speed at that observation, not today's promise.
current_sellers.sellers[].delivery.source / date_min / observed_at 2026-09-18where the delivery days come from: nightly = parsed by the nightly pipeline from that seller's last observed delivery sentence (the default, non-Prime promise as days_min/days_max, the Prime/fast option as fastest_days, the promise as a date in date_min, stamped observed_at); parsed = parsed at request time from the sentence in this response (live scrapes, sellers the nightly has not seen yet). Same parser either way.
current_sellers.sellers[].delivery_eta_days / delivery_eta_fastest_days 2026-09-18per offer, flat: whole days from the observation to that seller's default (non-Prime) promised delivery date, and the Prime/fast option when Amazon showed one (null = no date in the sentence, e.g. "cannot be shipped to your address"). The same numbers as delivery.days_min / delivery.fastest_days; fulfillment.buybox_delivery_eta_days is the buy-box winner's. Nightly-parsed, no request-time cost beyond one indexed lookup.
buybox_price_history 2026-10-09the daily buy-box price, as deep as we hold it — returned with offer_history=true (and with history_only=true), included in the record. points: one per observed day, {date, price, source}, oldest first; price = the lowest buy-box price we observed that day, new condition (every marketplace’s own word for new counts). source: offers = our offer observations (every Amazon marketplace, from 2026-04-17), daily_snapshot = the legacy daily product snapshot (Amazon US, Nov 2023 – Apr 2026) — which reaches further back than offer_history’s Dec 2024. Also days_observed, observed_from, observed_to, days_by_source and points_withheld (days priced more than 20× above or below the series’ median, withheld as parsing artifacts). Every observed day is returned (no series cap). A gap between two dates is a stretch we did not observe the listing, not a price that held. On a day with several buy-box holders this series takes the lowest price; offer_history shows who held the box and at what price. null on Walmart and when we hold no buy-box price for the ASIN.
buybox_price_points_hot 2026-10-14every all-offers-page observation of the last 30 days, newest last — on every Amazon answer (full record and history_only=true), included in the record. points: {ts, price, seller, seller_id, fulfillment, offer_count} = the buy box as it stood at that moment. Sub-daily where price_history (one observation per day) and buybox_price_history (the lowest price per day) are daily: ASINs in our hot lane (see tracking) are observed every few hours, the rest carry the continuous crawl’s and on-demand observations. Also points_total, points_returned (the most recent 2,000), days, observed_from/observed_to, points_withheld (observations priced more than 20× below the rest, withheld as parsing artifacts). With offer_history=true the same points also appear as buybox_price_history.points_hot. null on Walmart and when we hold no priced all-offers observation in the window.
tracking 2026-10-14the hot lane’s state for this ASIN when we refresh it at an interval: {hot: true, interval_min, rate, source, last_fetched_at, next_due_at}; null when the ASIN is not in the lane. The lane watches popular and customer-polled ASINs every few hours (US first); observed_at and current_sellers.as_of then move with every fetch, and mode=auto serves the stored record while it is fresh.
offer_history.sellers[].points[].delivery_eta_days / sellers[].delivery_eta_days_last 2026-09-18historical delivery ETA per offer-day: on every series point, whole days from that day's observation to the seller's default (non-Prime) promised delivery, parsed nightly from the delivery sentence Amazon showed that day; delivery_eta_days_last is the seller's most recent value. null before the history's fill window (currently from 2026-08-19) or where the sentence carried no date. Not billed beyond the history charge.
fulfillment.dispatch_days_min / dispatch_days_max / delivery_eta_source 2026-09-18dispatch_latency ("Usually ships within 2 to 3 days") parsed to whole days — Amazon shows that line only on slow-dispatch listings (about 2% of US pages), so null means the listing ships promptly, not missing data. delivery_eta_source says whether the buy-box delivery promise came from the product page (page) or from the buy-box offer's own delivery sentence (offer); the page ETA is shown on roughly a quarter to a half of pages and never on DE/MX/BR, so the offer sentence is the usual source.
authors[] / author / authors_observed_at 2026-09-29who made the product, from the page byline — authors is a list of {name, role, role_norm, author_id} (role = the page’s own word, role_norm one of author / narrator / illustrator / editor / translator / foreword / publisher / other; author_id = Amazon’s author-page id when the page linked one), author = the author-role names joined. Books, audiobooks, music and similar listings; [] / null elsewhere and on Walmart. Products parsed before 2026-09-29 carry a single byline without a role — served as one author entry, never with an invented role. Filling in over the coming days as pages are re-observed.
format / format_norm / formats[] / family_asin / formats_observed_at 2026-09-30the book or media format, and every other format of the same book — format as the page shows it (“Paperback”, “Taschenbuch”, “Kindle版”), format_norm one of kindle / paperback / hardcover / mass_market / audiobook / audio_cd / board_book / spiral / library_binding / other. formats lists every format of the book, each its own ASIN: {type, format_norm, label, asin, price, subscription_price, is_current, price_text}. price is the purchase price and is null when the page only showed a membership price (Kindle Unlimited, Audible), which is in subscription_price. is_current marks this ASIN. family_asin identifies the book across its formats. Formats are separate products, so they are not in variations. Any ASIN in formats can be passed to this endpoint. null / [] for non-media listings, for pages not re-observed since formats were captured (filling in from 2026-10-01), and on Walmart. Same keys on /v1/shopping?detail=true, batch rows and MCP.
current_sellers.sellers[].seller_rating / lowest_new.seller_rating / offer_history.sellers[].seller_rating 2026-09-28the seller’s feedback record on the seller row itself — {positive_pct, feedback_count, rating, observed_at}, the latest we hold for that seller (same source as the response-wide seller_ratings array below, matched by seller id, then by name), null when we hold none. Additive: the per-offer seller_positive_pct / seller_feedback_count printed on the offer at observation time stay. Same rows on /v1/shopping?detail=true, batches and MCP.
seller_ratings 2026-09-18seller feedback for every seller this answer names — the current offers, the cheapest new/used sellers, the buy-box holder and, with offer_history, every historical seller: one entry per seller with seller, seller_id, seller_positive_pct (Amazon's positive-feedback %), seller_feedback_count, seller_rating (stars, when shown) and observed_at (the observation the values come from). Sourced from a nightly seller-feedback table built from every offer we observe, so a seller's values are its latest seen on that marketplace, not just on this listing. Amazon's own offers carry no feedback. offer_history.sellers[] rows also carry seller_positive_pct, seller_feedback_count and rating_observed_at directly. Amazon marketplaces only (empty on Walmart). Not billed.
Walmart: image_url, images[], description, category_path, breadcrumbs[], highlights[], warnings[], upc, model_number, color, rating, review_count, rating_observed_at, was_price, discount_pct, additional_offer_count, in_stock, as_of; sellers[].shipping_cost 2026-09-20country=walmart — the listing content we hold for every Walmart item, added additively (no existing key changed): main image (and a one-element images[]), description, breadcrumb path (string + list), highlights[] = the PDP spec table as {name, value} pairs, warnings[] = compliance text (Prop 65) in the same shape, barcode (upc, ~61% of items — gtin= now resolves Walmart barcodes to item IDs), rating/review_count from the most recent snapshot that carried one (null when the page showed none, ~41% of items), strikethrough was_price with discount_pct (both null unless the was-price is above the price), and in_stock/as_of beside stock_state/observed_at so one client shape covers Amazon and Walmart. Each seller row carries shipping_cost — a shipping cost (0 = free, null = not shown), never a landed price. product_url stays walmart.com/ip/<id>.
observed_at / price_observed_at / price_source 2026-09-22what the stamps mean by source: on cache and cache_after_live_fail answers they are the warehouse's — observed_at is the last time we observed the listing's offers, price_observed_at the last time the served price was seen, price_source the surface it came from (pdp, aod, warehouse). On a live answer (full or partial scrape) all three are the scrape you just paid for: observed_at = the scrape time (UTC), price_observed_at = the same instant, price_source = live. as_of and content_observed_at already carried the scrape time; before 2026-09-22 a live answer wrongly kept the warehouse's days-old observed_at.
buybox_seller / buybox_seller_id / buybox_observed_at 2026-10-08 price 2026-10-09the top-level buy-box holder, name and id from one observation: when the answer carries an offer list, both come from its buy-box offer row and buybox_observed_at is that list’s time (current_sellers.as_of); Amazon’s own offer row carries no id, so its id is taken from the product page only when that page named the same seller, else null. Without an offer list both come from the latest product-page row (time: as_of) and buybox_observed_at is absent. Before 2026-10-08 the name followed the offer list while the id could come from a newer product-page row naming a different holder. Since 2026-10-09 the top-level price follows the same observation on cached answers: when that buy-box offer row is new-condition and priced, price is its price, price_source is aod and price_observed_at is that list’s time (UTC); otherwise the price stays the latest product snapshot’s. Before, a cached answer could pair the holder with another observation’s price (one holder’s name with the previous day’s holder’s price). A live answer is one scrape and was already consistent.
dimensions 2026-09-27item weight and package dimensions, Amazon marketplaces, not billed: weight_raw / dimensions_raw exactly as the product page prints them (“2.12 ounces”, “7.88"L x 3.97"W x 1"H”, “28.6L x 43W x 7.7H centimetres”), plus the parsed weight_value + weight_unit (g, kg, oz, lb, mg) and weight_g, and length / width / height + unit (in, cm, mm, m) with length_cm / width_cm / height_cm. Untagged triples are taken in print order (Amazon prints L × W × H); a two-value string leaves height null; an unreadable string keeps the raw text with null numbers. observed_at = the page observation the values come from. null when no observation of the listing carried either field. 2026-10-02 Letter tags are used only when every axis letter is an English L / W / H / D; any local letter (German B, French l / P, Brazilian C / L / A, “Th”) falls back to print order, so “48,5L x 27,5B x 58,5H” reads 48.5 × 27.5 × 58.5. missing_axes names the measures a shorter string leaves out (“3.24"W x 10.68"H” → ["length"]). Weight units are read in the page language (Pfund, livres, libras, onzas, onças, ポンド, “hundredths pound”…). weight_flag: "implausible" marks a weight Amazon printed that cannot be right: under 5 g at less than half the density of air for the listed dimensions, a milligram dose on anything over 10 cm³, or under 0.1 g with no dimensions. Then weight_value / weight_unit / weight_g are null and weight_raw keeps Amazon’s text.
deal_history 2026-09-27list price, savings and coupon history: segments[], one per run of consecutive product-page observations with identical values — from, to, days_observed, list_price (the strikethrough “List:” / “Was:” figure), savings_amount, savings_percent, coupon_text (the coupon or promotion line as printed — coupons and multi-buy promotions alike), coupon_expires, the parsed coupon_amount / coupon_percent, and promotion_types 2026-10-02 (coupon, multi_buy, other). The coupon figures come only from an explicit coupon or voucher clause (“Coupon: 15% off coupon applied”, “Voucher: …”, “Cupón: …”); a multi-buy offer such as “Save 5% on any 2 qualifying items”, a sign-in code or a registry discount is not a coupon and leaves them null. null fields mean not shown on the page that day; a day inside no segment was not observed on the product page. Also current (the latest segment’s values with as_of), days_with_list_price, days_with_coupon (days with a coupon clause), days_with_promotion (days with any promotion text), observed_from / observed_to. A list price at or below that day’s price is not a discount and is served as null together with that day’s savings (counted in list_price_hidden_days, 2026-09-30). A list price that is not consistent is not served 2026-10-08: at least 60% of the product-page observations within 7 days either side must carry a list price within 10% of it; otherwise the page’s list-price field was flipping between unrelated values (another variation’s or another widget’s price) and that day’s list price and savings are null (counted in list_price_unstable_days). The check reads the days after an observation too, so the latest week’s verdict can change as observations arrive. Observed since we started tracking the listing (Apr 2026 onward). Not billed.
subscribe_save 2026-10-02Subscribe & Save, from the latest product-page observation that showed it: eligible, discount_percent (the Subscribe & Save price against the one-time price; 0 is a real value: offered without a discount) and observed_at. Captured from 2026-09-30, so null means the page has not been observed since, never “not offered”. Amazon only (null on Walmart). Not billed.
bought_past_month_history 2026-09-27the “N+ bought in past month” badge over time: segments[] of consecutive product-page observations with the same badge — from, to, days_observed, bought_past_month (the floor of Amazon’s bucket: 1K+ → 1000), raw. bought_past_month: null = the page was observed without a badge (Amazon badges only higher-velocity listings) — a real observation, not a gap. Plus max, days_observed, observed_from / observed_to. Measured aggregate buyer behaviour, never an estimate. Not billed.
rating_history 2026-09-27rating-count history: points[], one per day the product page was observed — date, rating_count (Amazon’s global ratings count), rating (the star average shown) — with rating_count_first / rating_count_last, rating_last, ratings_gained_30d / ratings_gained_90d (growth over the trailing window of observed days; null with fewer than two observations in it), points_total, observed_from / observed_to. Review velocity without modelling. Not billed.
variation_coverage 2026-09-27how much of the variation matrix we cover — current state, not history. parent_asin, is_variation_child, variation_count, dimension_names[] (e.g. color_name, size_name), children_total, children_tracked (child ASINs with at least one observation of their own on this marketplace — the rest are known only as matrix entries), children_tracked_pct, children_with_price_30d, children_available (the matrix’s own availability flags), and children[] (≤200, children_truncated says if more exist): child_asin, dimension_values, is_available, is_this_asin, tracked, last_observed_at, price_30d + price_30d_observed_at (the child’s latest observed price in the last 30 days; null = not observed in that window). matrix_observed_at = when the matrix was last seen on the page. An empty matrix on a listing without variants is normal. Any child ASIN can be passed to this endpoint for its own dossier. Not billed.
sales_estimate 2026-09-27coverage: the modelled estimate exists for Amazon US listings (BSR-curve model calibrated on badge data); on the other marketplaces the only monthly-sales figure is Amazon’s own badge in bought_past_month, where Amazon shows one (US ~19 % of listings, DE ~14 %, BR ~10 %, MX ~7 % of observed rows). The modelled monthly unit estimate is served only for listings without Amazon’s “N+ bought in past month” badge; when the badge is present sales_estimate is null and the measured figure is in bought_past_month (with bought_past_month_raw, bought_past_month_observed_at and the bought_past_month_history segments). A model must not contradict a measurement on the same record.
reviews[] order 2026-09-27the marketplace’s own featured reviews (is_local: true, Amazon’s “Top reviews from <country>”) come first, the “other countries” set after them; inside each group the most recently featured first. Same set, same fields.
buybox_state
buybox_state_observed_at
stock_state_source 2026-10-14
what the lane’s newest all-offers read saw: in_stock (a featured offer), no_buybox (offers, but no featured offer), out_of_stock (no offers), with its stamp. When that read is newer than the daily history’s last point it decides stock_state / in_stock and stock_state_source names it (e.g. all-offers read 2026-10-15T03:46:34Z (out_of_stock)); otherwise the keys are absent and the history’s state stands. The three stock keys always agree. Same states as tracking.
out_of_stocktri-state: true = out of stock — Amazon's dedicated out-of-stock buybox on the page, or the newest all-offers read found no offer (on mode=live, measured on that scrape — a real answer, distinct from a failed lookup); since 2026-10-15 it always agrees with stock_state and in_stock, false = in stock when last seen, null = unknown.
variation_status
page_asin 2026-10-15
mode=live only: Amazon sometimes answers a variation child’s URL with another ASIN’s page — variation_status says so (page_is_sibling = a sibling of the same parent, page_is_other = an unrelated ASIN, null = the page was this ASIN’s) and page_asin names whose page it was. The answer’s stock keys describe the ASIN you asked for (its own offers page), not the page served; the content fields are the served page’s. Cache answers carry both keys as null.
buybox_condition
buybox_condition_source
buybox_condition_detail 2026-10-15
new | used | null (no featured offer): whether the buy box is a second-hand offer — Amazon’s own used storefronts (Amazon Resale, Amazon Warehouse, Retourenkauf, Segunda mano, …) win the buy box like any seller and were previously indistinguishable from Amazon retail (fulfillment: AMZ). source = product_page or offers_page, detail = the pinned offer’s condition text, used_only_buybox, or the storefront name. Live answers: measured on that fetch. Cache answers: the pinned offer’s stored condition at the row’s observation (offers-page reads), else the storefront name; null when the stored row says nothing either way.

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 2026-10-10: a warehouse call with everything attached is 0.5 credit — the same as a batch row — and that includes the history: bsr_history, offer_history with buybox_price_history, and wider series. A live scrape is 1, history included; an intelligence-only answer or Walmart is 0.5; history_only=true (the series alone) is 0.05. Until 2026-10-10 history added 0.5 once per call. 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 warehouse 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 = the observed days in the last 30 on which a seller held the buy box; because it scales with how often we visited the listing, read it against current_sellers.buybox_days_observed_30d (the days in that window with any buy-box winner observed) or use the ready-made buybox_share_30d (0–100, the seller's share of those days; null when the window holds no buy-box observation). The buy box rotates within a day, so several sellers can share a day and day shares can sum past 100; buybox_observation_share_30d 2026-10-08 counts each buy-box observation once instead (0–100, one decimal: the seller's part of current_sellers.buybox_observations_total_30d; buybox_observations_30d is the count) — the shares of all holders sum to 100. All 11 Amazon marketplaces (us, uk, de, ca, au, fr, it, es, jp, mx, br), plus Walmart (numeric item ID, or gtin= with the item's UPC; since 2026-09-20 Walmart answers also carry the listing content we hold — image_url, description, breadcrumbs[], highlights[], upc, rating/review_count, per-seller shipping_cost — see the Walmart row above; a live walmart.com read since 2026-10-18, below). Not billed if the product is untracked.

Live Walmart 2026-10-18

country=walmart&mode=live reads the walmart.com product page right now (typically 10–25 s; set client timeouts to 120 s) and lays it over the history we hold for the item. Price, stock, rating, the featured seller and the sellers the page lists, title, brand, image, description, breadcrumbs, highlights, warnings, UPC, model number and colour come from walmart.com now; price_history, stock_history and the 30-day change events stay the stored ones (empty when we never held the item, see history_available). The answer carries source: "live", price_source: "walmart_live" and live_fetched_at. location names the store walmart.com priced the page for (postal_code, city, state, store_id): each read can land on a different store, and fresh grocery is priced per store, so the same item can differ between two reads. 2 credits.

  • mode=auto works as on Amazon: the stored record when we observed the item within max_age_days (default 30) at 0.5, otherwise a live read at 2. mode=cache never fetches.
  • Never billed: a partial page (a title but no price while shown in stock, snapshot_status: "partial"), an item walmart.com does not have (404, remembered for 24 h), a failed fetch and a busy refusal (503 with retry_after_seconds).
  • A live read that fails on an item we hold answers our stored record instead, with source: "cache_after_live_fail" and a note, billed as a warehouse row (0.5). When every live slot is busy, mode=auto does the same and mode=live answers 503.
  • One product page per call: additional_offer_count says how many more sellers walmart.com has; their separate sellers page is not fetched.
  • Capacity: at most 5 live Walmart reads run at once across all customers (batches take at most 3 of them, one account at most 3), so a burst can see a 503; retry after the seconds it names.
  • Batches: country=walmart with mode=live or auto, 2 credits per live row, up to 5,000 rows a batch (modes).

Offer conditions 2026-09-14

We store the condition of every offer we observe, in the marketplace's own words, and the API now returns it. By default current_sellers.sellers is the new-condition list (unchanged behaviour); pass include_used=true to get used, refurbished, open-box and collectible offers in the same list, each with its condition label and canonical condition_class. Even without opting in, used_offer_count, lowest_new and lowest_used tell you how many second-hand offers exist and the cheapest offer of each kind. price_history remains the buy-box (new) series; a used-price history is available per seller via offer_history=true&include_used=true (series keyed per seller and condition class). condition_class: "unknown" means the marketplace showed a heading our classifier does not recognise; those rows stay in the new-condition list.

GET /v1/serp live Amazon & Walmart 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:

EndpointWhat it searchesLatency
/v1/shoppingour curated index — ranked, grouped product recommendations<100 ms
/v1/searchour warehouse — filterable tracked-product dataset<100 ms
/v1/serpAmazon itself, live — what Amazon’s search page shows this minute for a queryseconds (typically ~8–13 s)

There is no warehouse 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.

ParamNotes
qrequired — the search query, exactly as a shopper would type it. Query in the marketplace’s own language. Alias: search_term.
countryus (default), uk, de, ca, au, fr, it, es, jp, mx, br — amazon-xx forms accepted — or walmart (walmart.com, live, 2 credits per page: Walmart search) 2026-10-18.
pagestart page, default 1
max_pageauto-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_byfeatured (Amazon’s default) · price_low_to_high · price_high_to_low · average_review · most_recent · bestseller_rankings
category_idAmazon browse-node id (becomes &node=)
refinementsAmazon rh= value. Round-trips: feed back any refinements[*].value from a previous response to apply that filter.
exclude_sponsoreddrop inline sponsored results (default false). Often a no-op — see the honesty notes below.
number_of_resultstruncate 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_end rather than assuming 48 per page.
  • total_results is Amazon’s own estimate (“over 20,000”), not a countable number. Do not present it as precise.
  • pagination.total_pages is the highest page Amazon is currently offering in its pagination window, not the true last page.
  • sponsored will usually be false. 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 — but exclude_sponsored is therefore often a no-op.
  • is_prime is layout-dependent and often absent (measured: 8 prime icons page-wide on de, 1 on us, 0 on jp). false means “no Prime icon rendered on this card”, not “not Prime”. Do not filter on it.
  • recent_sales is 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_correction reports 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_type is product_carousel (a few promoted ASINs in products[]) or brand_banner (headline + logo, no ASINs). link is 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_link is an mp4, thumbnail an image, link an ad-redirector. Almost always sponsored: 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 502 with a reason, unbilled.
  • list_price is only served when it is above price (2026-09-30). A list price at or below the price is not a discount: it is returned as null and its figure is removed from prices.
  • Credits: 1 per page actually fetched (request_metadata.pages_fetched) — never per page requested; blocked fetches and zero-result answers are never billed.

Walmart search 2026-10-18

country=walmart searches walmart.com right now (typically 4–12 s a page; set client timeouts to 180 s) and answers in the Amazon shape wherever a key means the same thing.

ParamOn Walmart
qrequired, up to 200 characters
page / max_pageat most 3 pages per call (max_page − page + 1 ≤ 3, more is a 422); position continues across pages
sort_byfeatured (Walmart’s best match) · price_low_to_high · price_high_to_low · average_review · most_recent (new arrivals) · bestseller_rankings (best sellers)
exclude_sponsored, number_of_resultsas on Amazon
category_id, refinementsAmazon-only: a 422 on Walmart, never billed
  • Same keys as Amazon: position, asin (the Walmart item ID, which /v1/product takes with country=walmart), title, link, image, rating, ratings_total, price / list_price / prices (the same {symbol, value, currency, raw} objects; list_price only when above the price), badges, recent_sales, sponsored, delivery, availability.raw.
  • Walmart adds item_id, page, unit_price (as walmart.com prints it), seller {name, id}, additional_offer_count, availability.in_stock, flags (Best seller, Rollback and the like), category_path, unit_type and organic_rank (the rank among non-sponsored results); search_information carries total_results and any corrected_query.
  • Not on Walmart: is_prime, refinements, ad_blocks, video_blocks, brand_stores. Only the results grid comes back: Walmart’s recommendation carousels are skipped, and sponsored products sit inline in the grid with sponsored: true.
  • Prices and delivery promises are the ones walmart.com shows for the store it mapped the request to, named in location (postal_code, city, state, store_id). A store or ZIP cannot be chosen, and fresh grocery prices differ between stores.
  • Credits: 2 per results page returned. An empty result set, a failed fetch (502) and a busy refusal (503 with Retry-After) are never billed. At most 5 live Walmart reads run at once across all customers.
  • As a batch: kind: "search" with country: "walmart" (search batches).

GET /v1/bestsellers live Amazon Best Sellers 2026-10-09

Amazon’s Best Sellers list for one category, fetched live — up to 100 products in Amazon’s rank order, the category’s full breadcrumb name, and its subcategories with their URLs, so you can walk the tree. Give it a marketplace’s root best-sellers URL (or just country) and it returns the top-level categories instead. Root → category → subcategory, always by the URLs a previous answer returned.

ParamNotes
urlany Amazon Best Sellers URL: a category (/gp/bestsellers/kitchen/289814, /Best-Sellers-…/zgbs/…, with or without the /ref=… tail, the query string or a /-/en/ prefix) or a marketplace’s root (/gp/bestsellers/). The marketplace comes from the host: amazon.com, .co.uk, .de, .ca, .com.au, .fr, .it, .es, .co.jp, .com.mx, .com.br. URL-encode it (curl -G --data-urlencode).
countryoptional. Alone (no url): that marketplace’s root list of top-level categories. With url: must match the URL’s marketplace, otherwise 422. us, uk, de, ca, au, fr, it, es, jp, mx, br (amazon-xx accepted). Amazon only.
pages1 = ranks 1–50 · 2 = ranks 1–100 (default). Page 2 is fetched only when page 1 is full; Amazon shows no more than 100.
curl -G "https://api.logimu.com/v1/bestsellers" \
  --data-urlencode "url=https://www.amazon.com/gp/bestsellers/kitchen/289814" \
  -H "X-API-KEY: sk_live_..."

# the root list of top-level categories (free)
curl "https://api.logimu.com/v1/bestsellers?country=de" -H "X-API-KEY: sk_live_..."

Sample response — a real live fetch of Cookware on us (captured 2026-10-09, 21.9 s, two pages, 100 products, 16 subcategories). Long arrays are truncated with an explicit marker; the API returns all of them. Billing fields omitted.

{
  "ok": true,
  "marketplace": "us",
  "page_type": "category",
  "request_parameters": {
    "url": "https://www.amazon.com/gp/bestsellers/kitchen/289814",
    "marketplace": "us",
    "pages": 2
  },
  "request_metadata": {
    "created_at": "2026-10-09T06:14:05.152987+00:00",
    "processed_at": "2026-10-09T06:14:27.073931+00:00",
    "total_time_taken": 21.92,
    "amazon_url": "https://www.amazon.com/gp/bestsellers/kitchen/289814",
    "pages": [
      {
        "page": 1,
        "ok": true,
        "attempts": 1,
        "fetch_ms": 11056
      },
      {
        "page": 2,
        "ok": true,
        "attempts": 1,
        "fetch_ms": 9271
      }
    ]
  },
  "current_category": {
    "name": "Cookware",
    "full_name": "Home & Kitchen › Kitchen & Dining › Cookware",
    "path": [
      {
        "name": "Home & Kitchen",
        "url": "https://www.amazon.com/Best-Sellers-Home-Kitchen/zgbs/home-garden",
        "node_id": null,
        "slug": "home-garden"
      },
      {
        "name": "Kitchen & Dining",
        "url": "https://www.amazon.com/Best-Sellers-Home-Kitchen-Kitchen-Dining/zgbs/home-garden/284507",
        "node_id": "284507",
        "slug": "home-garden"
      },
      {
        "name": "Cookware",
        "url": "https://www.amazon.com/Best-Sellers-Kitchen-Cookware/zgbs/home-garden/289814",
        "node_id": "289814",
        "slug": "home-garden"
      }
    ],
    "node_id": "289814",
    "url": "https://www.amazon.com/Best-Sellers-Kitchen-Cookware/zgbs/home-garden/289814",
    "title": "Kitchen Cookware"
  },
  "subcategories": [
    {
      "name": "Au Gratin Pans",
      "url": "https://www.amazon.com/Best-Sellers-Home-Kitchen-Au-Gratin-Pans/zgbs/home-garden/3737261",
      "node_id": "3737261",
      "slug": "home-garden"
    },
    {
      "name": "Bakers & Casseroles",
      "url": "https://www.amazon.com/Best-Sellers-Home-Kitchen-Bakers-Casseroles/zgbs/home-garden/289671",
      "node_id": "289671",
      "slug": "home-garden"
    },
    "… 14 more (truncated for this sample)"
  ],
  "bestsellers": [
    {
      "rank": 1,
      "asin": "B0F7M3LVN8",
      "title": "CAROTE 21pcs Pots and Pans Set Non Stick, Detachable Handle Cookware, Black | Induction Compatible, Dishwasher & Oven Safe, Kitchen Organization, for Camping/RV/Traveling, Cooking Set, House Warming Gift",
      "link": "https://www.amazon.com/dp/B0F7M3LVN8",
      "image": "https://images-na.ssl-images-amazon.com/images/I/81QDn2BzpXL._AC_UL300_SR300,200_.jpg",
      "rating": 4.5,
      "ratings_total": 3732,
      "price": {
        "symbol": "$",
        "value": 59.99,
        "currency": "USD",
        "raw": "$59.99"
      },
      "position": 1
    },
    {
      "rank": 2,
      "asin": "B0732NXYNS",
      "title": "CAROTE Nonstick Frying Pan, 8 Inch Classic Granite Skillet | Kitchen Healthy Non Toxic Stone Cookware,All-Stovetop Compatible, Cool Handle, Easy to Clean, PFOA Free",
      "link": "https://www.amazon.com/dp/B0732NXYNS",
      "image": "https://images-na.ssl-images-amazon.com/images/I/71FheZz5ZVL._AC_UL300_SR300,200_.jpg",
      "rating": 4.6,
      "ratings_total": 36169,
      "price": {
        "symbol": "$",
        "value": 14.99,
        "currency": "USD",
        "raw": "$14.99"
      },
      "position": 2
    },
    "… 98 more (truncated for this sample — the API returns all of them)"
  ],
  "pagination": {
    "pages_requested": 2,
    "pages_fetched": 2,
    "total_results": 100,
    "partial": false,
    "page_errors": {}
  },
  "observed_at": "2026-10-09T06:14:27.073931+00:00",
  "cached": false,
  "cache_age_seconds": 0
}

The root list (country=us, or the root URL; captured 2026-10-09, 15.8 s, 40 categories) — page_type: "root" and categories[] instead of products:

{
  "ok": true,
  "marketplace": "us",
  "page_type": "root",
  "request_parameters": {
    "url": "https://www.amazon.com/gp/bestsellers/",
    "marketplace": "us",
    "pages": 2
  },
  "request_metadata": {
    "created_at": "2026-10-09T06:13:49.164598+00:00",
    "processed_at": "2026-10-09T06:14:04.925670+00:00",
    "total_time_taken": 15.76,
    "amazon_url": "https://www.amazon.com/gp/bestsellers",
    "pages": [
      {
        "page": 1,
        "ok": true,
        "attempts": 1,
        "fetch_ms": 14980
      }
    ]
  },
  "current_category": {
    "name": "Any Department",
    "full_name": null,
    "path": [],
    "node_id": null,
    "url": "https://www.amazon.com/gp/bestsellers"
  },
  "categories": [
    {
      "name": "Amazon Devices & Accessories",
      "url": "https://www.amazon.com/Best-Sellers-Amazon-Devices-Accessories/zgbs/amazon-devices",
      "node_id": null,
      "slug": "amazon-devices"
    },
    {
      "name": "Amazon Renewed",
      "url": "https://www.amazon.com/Best-Sellers-Amazon-Renewed/zgbs/amazon-renewed",
      "node_id": null,
      "slug": "amazon-renewed"
    },
    {
      "name": "Appliances",
      "url": "https://www.amazon.com/Best-Sellers-Appliances/zgbs/appliances",
      "node_id": null,
      "slug": "appliances"
    },
    "… 37 more (truncated for this sample)"
  ],
  "observed_at": "2026-10-09T06:14:04.925670+00:00",
  "cached": false,
  "cache_age_seconds": 0
}
FieldMeaning
page_typecategory (products + subcategories) or root (the top-level categories)
current_categoryname, full_name = the breadcrumb path (ancestors › current) in the page’s language, path[] (each ancestor’s name, url, node_id, slug), node_id, url, title (the page heading, when the page has one)
subcategories[] · categories[]the current category’s direct children (empty on a leaf) · the root’s top-level categories — name, url (pass it back as url), node_id, slug
bestsellers[]rank, position, asin, title, link, image, rating, ratings_total, price (symbol, value, currency, raw) — pass any asin to /v1/product for its history
paginationpages_requested, pages_fetched, total_results, partial (page 2 failed after page 1 succeeded), page_errors
observed_at · cached · cache_age_secondswhen the list was fetched from Amazon; whether this answer came from our cache and how old it is (category answers are kept 30 min, the root list 24 h; Amazon refreshes these lists hourly)
StatusMeaningBilled
200the list (or the root categories); pagination.partial: true when page 2 failed after page 1per page of 50 returned · root 0
404category_not_found — Amazon answered “not found” on every attempt (a failed fetch is never turned into a not-found)no
422bad input, rejected before any fetch: no url and no country, not an Amazon host, not a best-sellers path, country ≠ the URL’s marketplace, pages not 1 or 2, an unknown parameterno
502Amazon blocked or did not serve the page after retries — a collection failure, retryno
503every live-fetch slot for the marketplace is busy (shared with /v1/serp: us/uk 2 concurrent, others 1) — retry after Retry-Afterno

Honesty notes

  • Names are in the page’s language. German pages are local (Küche, Haushalt & Wohnen › Abfall & Recycling); on fr, it, es, jp, mx and br we request Amazon’s English page, so names come back in English; us, uk, ca and au are English.
  • Ranks are Amazon’s at fetch time, and Amazon refreshes the lists hourly. Read observed_at and cached: an answer can be up to 30 min old for a category, 24 h for the root list.
  • price is null when the card shows none (the product is unavailable); a price range is reported as its low end, with raw keeping Amazon’s text. title or rating can be null for the few entries the grid did not render — their rank and ASIN are still listed.
  • node_id is null where Amazon’s URL carries only a slug (most top-level departments). Navigate by url, which always works.
  • Media departments (Books, Kindle Store, Movies & TV, …) are listed exactly as Amazon lists them.
  • An empty category (Amazon lists no products) is a 200 with bestsellers: [] and its subcategories, and is not billed.
  • This is Amazon’s list now, not a history. For a product’s rank over time use bsr_history=true on /v1/product.
  • Latency is seconds: ~15–35 s for a fresh top 100 (the two pages are fetched one after the other), ~15 s for a root list, milliseconds from our cache. Set client timeouts to 180 s+.
  • Credits: 1 per page of 50 products returned (the full top 100 = 2), whether the list came fresh or from our cache — it is the same list. The root list is free; a not-found category, a blocked fetch and an empty list are never billed; a partial answer bills the page it returned. On the MCP connector the same rules apply to the bestsellers tool (API key required).

GET /v1/deals live Amazon Today’s Deals 2026-10-18

Amazon’s Today’s Deals page for one marketplace, fetched live — every deal with its deal price and Amazon’s reference price, percent off, deal type and state, how much of a lightning deal is claimed and when it ends, and coupons, filtered the way Amazon’s own page filters it: department, deal collection (lightning deals, coupons, trending, started / ending today, or any collection the page lists), percent off, price, Prime Exclusive, rating and brand. Every answer also lists the page’s departments, collections and facets, so the next call can filter by them, and filter_check says whether Amazon applied each filter you asked for.

ParamNotes
countryus, uk, de, ca, au, fr, it, es, jp, mx, br (amazon-xx accepted). Required unless url is given; with url it must match the URL’s marketplace, otherwise 422. Amazon only (walmart is a 422).
urloptional — an Amazon deals URL: /deals, /events/deals or /gp/goldbox, optionally behind a /-/xx/ language prefix. The host decides the marketplace, and the query string is kept (a discounts-widget filter copied from the browser works). URL-encode it (curl -G --data-urlencode).
category_ida deals department id from categories[] of any answer (comma list accepted; Amazon applies one department at a time).
deal_typesone of lightning_deal, trending, coupons, started_today, ending_today — the collections every marketplace carries (Rainforest’s names). Not together with collection.
collectionany other collection id from collections[] of an answer (e.g. deals-collection-deals-under-20 on de). Collections differ per marketplace and over time. Not together with deal_types.
min_discount · max_discountpercent off, 0–100. discount = Rainforest’s form: 10_percent_off, 25_percent_off, 50_percent_off or 70_percent_off (= min_discount; not together with it).
min_price · max_pricethe deal price in the marketplace currency. Amazon applies whole units and silently ignores a fractional bound, so a fraction is rounded outward (min_price=25.5 asks Amazon for 25 and up).
prime_exclusivetrue = Prime Exclusive deals only.
minimum_rating1–4 (or 4_and_up): products rated at least that many stars.
branda brand id from facets.brands of an answer, e.g. 811979|dreame.
page · page_size · pagespage 1–400 (default 1) · page_size 30, 60 (default), 90 or 120 — Amazon serves deals pages in steps of 30 and ignores any other size, so any other value is a 422; every page is 1 credit whatever its size, so 120 gives the most deals per credit · pages 1–5 (default 1): consecutive pages from page merged into one answer, stopping early on a short page; 1 credit per page that returned deals.
# lightning deals on amazon.de
curl "https://api.logimu.com/v1/deals?country=de&deal_types=lightning_deal" -H "X-API-KEY: sk_live_..."

# Electronics on amazon.com.au at 50% off or more, 120 deals (1 credit)
curl "https://api.logimu.com/v1/deals?country=au&category_id=4851799051&min_discount=50&page_size=120" \
  -H "X-API-KEY: sk_live_..."

Sample response — a real live read of the au deals page (captured 2026-10-18, 12.9 s, the first 30 deals). Long arrays are truncated with an explicit marker; the API returns all of them. Billing fields omitted.

{
  "ok": true,
  "marketplace": "au",
  "request_parameters": {
    "marketplace": "au",
    "page": 1,
    "page_size": 30,
    "pages": 1
  },
  "request_metadata": {
    "created_at": "2026-10-18T14:19:11.115202+00:00",
    "processed_at": "2026-10-18T14:19:24.029012+00:00",
    "total_time_taken": 12.91,
    "amazon_url": "https://www.amazon.com.au/deals?promotionsSearchStartIndex=0&promotionsSearchPageSize=30",
    "pages": [
      {
        "page": 1,
        "ok": true,
        "attempts": 1,
        "fetch_ms": 12630
      }
    ]
  },
  "deals": [
    {
      "position": 1,
      "asin": "B0GQW7YVG4",
      "title": "Apple 2026 11-inch iPad Air (Wi-Fi + Cellular, 128GB) - Purple (M4)",
      "link": "https://www.amazon.com.au/Apple-11-inch-Wi-Fi-Cellular-128GB/dp/B0GQW7YVG4",
      "image": "https://m.media-amazon.com/images/I/71qYe0WIQlL.jpg",
      "deal_id": "a8f3176b",
      "deal_link": "https://www.amazon.com.au/deal/a8f3176b",
      "deal_type": "BEST_DEAL",
      "is_lightning_deal": false,
      "deal_state": "AVAILABLE",
      "percent_claimed": null,
      "ends_at": null,
      "deal_price": {
        "value": 1237.0,
        "currency": "AUD",
        "symbol": "$",
        "label": "Deal Price:"
      },
      "list_price": {
        "value": 1499.0,
        "currency": "AUD",
        "symbol": "$",
        "label": "RRP:"
      },
      "percent_off": 17,
      "savings": {
        "value": 262.0,
        "currency": "AUD",
        "symbol": "$"
      },
      "deal_badge": "17% off · Limited time deal",
      "is_prime_price": false,
      "coupon": null,
      "brand": "Apple",
      "brand_id": "110955",
      "department_ids": [
        "4851683051",
        "4851684051"
      ],
      "product_group": "premium_ce_brands_display_on_website",
      "product_type": "TABLET_COMPUTER",
      "variations": 25
    },
    {
      "position": 2,
      "asin": "B0FJG66CD1",
      "title": "dreame L40 Ultra CE New Model Robot Vacuum DuoScrub &Liftable 13,000Pa Suction, Mop & Self Cleaning, Auto-Empty,TriCut Brush,Flexible App Control,3DAdapt",
      "link": "https://www.amazon.com.au/DuoScrub-Liftable-Cleaning-Auto-Empty-Flexible/dp/B0FJG66CD1",
      "image": "https://m.media-amazon.com/images/I/41Rd9T-ROUL.jpg",
      "deal_id": "f13d187a",
      "deal_link": "https://www.amazon.com.au/deal/f13d187a",
      "deal_type": "BEST_DEAL",
      "is_lightning_deal": false,
      "deal_state": "AVAILABLE",
      "percent_claimed": null,
      "ends_at": null,
      "deal_price": {
        "value": 474.99,
        "currency": "AUD",
        "symbol": "$",
        "label": "Deal Price:"
      },
      "list_price": {
        "value": 2199.0,
        "currency": "AUD",
        "symbol": "$",
        "label": "RRP:"
      },
      "percent_off": 78,
      "savings": {
        "value": 1724.01,
        "currency": "AUD",
        "symbol": "$"
      },
      "deal_badge": "78% off · Limited time deal",
      "is_prime_price": false,
      "coupon": null,
      "brand": "dreame",
      "brand_id": "811979",
      "department_ids": [
        "4851975051",
        "4851976051"
      ],
      "product_group": "kitchen_display_on_website",
      "product_type": "ROBOTIC_VACUUM_CLEANER",
      "variations": 2
    },
    "… 28 more (truncated for this sample — the API returns all of them)"
  ],
  "categories": [
    {
      "category_id": "4974332051",
      "name": "Amazon Devices & Accessories",
      "selected": false
    },
    {
      "category_id": "3969342051",
      "name": "Audible Books & Originals",
      "selected": false
    },
    {
      "category_id": "4851454051",
      "name": "Automotive",
      "selected": false
    },
    "… more departments (truncated for this sample)"
  ],
  "collections": [
    {
      "id": "discounts-collection-for-you",
      "name": "For you",
      "type": "filter",
      "url": null
    },
    {
      "id": "trending-bubble",
      "name": "Trending",
      "type": "filter",
      "url": null
    },
    {
      "id": "deals-collection-coupons",
      "name": "Coupons",
      "type": "filter",
      "url": null
    },
    "… more collections (truncated)"
  ],
  "facets": {
    "brands": [
      {
        "id": "110955|Apple",
        "name": "Apple",
        "selected": false
      },
      {
        "id": "811979|dreame",
        "name": "dreame",
        "selected": false
      },
      "… more brands (truncated)"
    ],
    "reviewRating": [
      {
        "id": "4",
        "name": "4 stars & up",
        "selected": false
      }
    ],
    "price": {
      "min": 0,
      "max": 5900
    },
    "percentOff": {
      "min": 0,
      "max": 100
    },
    "accessType": [
      {
        "id": "1",
        "name": "Prime Exclusive",
        "selected": false
      }
    ]
  },
  "selected_filters": [],
  "filter_check": {},
  "pagination": {
    "page": 1,
    "page_size": 30,
    "pages_requested": 1,
    "pages_fetched": 1,
    "start_index": 0,
    "returned": 30,
    "has_more": true,
    "partial": false,
    "page_errors": {}
  },
  "amazon": {
    "marketplace_id": "A39IBJ37TRP1C6",
    "locale": "en_AU",
    "currency": "AUD"
  },
  "observed_at": "2026-10-18T14:19:24.029012+00:00",
  "cached": false,
  "cache_age_seconds": 0
}

One entry of deals[] from a de answer for lightning deals (deal_types=lightning_deal; captured 2026-10-18, 8.5 s, 30 deals) — percent_claimed, the countdown in ends_at and a coupon; labels in the page’s language:

{
  "position": 24,
  "asin": "B07JNHK2KL",
  "title": "Arotelicht 4er 3W LED Treppenlicht 230V Warmweiß 3000K IP65 Quadratisch Treppenleuchte Wandeinbauleuchte Wandleuchte Stufenlicht Wand Einbauleuchte Mauer Beleuchtung außen Lampe Alu, Grau Flurleuchte",
  "link": "https://www.amazon.de/Arotelicht-Wandeinbauleuchte-Wandeinbaustrahler-Treppenlicht-Wandleuchte/dp/B07JNHK2KL",
  "image": "https://m.media-amazon.com/images/I/51+LXNaXpkL.jpg",
  "deal_id": "900f09b4",
  "deal_link": "https://www.amazon.de/deal/900f09b4",
  "deal_type": "LIGHTNING_DEAL",
  "is_lightning_deal": true,
  "deal_state": "AVAILABLE",
  "percent_claimed": 0.0,
  "ends_at": "2026-10-18T18:00:00.000Z",
  "deal_price": {
    "value": 32.29,
    "currency": "EUR",
    "symbol": "€",
    "label": "Angebotspreis:"
  },
  "list_price": {
    "value": 37.99,
    "currency": "EUR",
    "symbol": "€",
    "label": "Statt"
  },
  "percent_off": 15,
  "savings": {
    "value": 5.7,
    "currency": "EUR",
    "symbol": "€"
  },
  "deal_badge": "15 % Rabatt · Endet in",
  "is_prime_price": false,
  "coupon": {
    "text": "mit Rabattgutschein",
    "amount": null,
    "currency": null,
    "promotion_id": "A6DA5CYLC2ZL6",
    "link": "https://www.amazon.de/promo/A6DA5CYLC2ZL6"
  },
  "brand": "Arotelicht",
  "brand_id": "567438",
  "department_ids": [
    "213083031",
    "213084031"
  ],
  "product_group": "lighting_display_on_website",
  "product_type": "LIGHT_FIXTURE",
  "variations": 7
}
FieldMeaning
deals[]position, asin, title, link, image, deal_id + deal_link (Amazon’s deal page), deal_type and deal_state (Amazon’s own codes, e.g. BEST_DEAL / LIGHTNING_DEAL, AVAILABLE), is_lightning_deal, percent_claimed, ends_at (UTC, the countdown’s end), deal_price and list_price (value, currency, symbol, label = Amazon’s own words: Deal Price, RRP, Was, Typical price, UVP, Statt …), percent_off, savings, deal_badge, is_prime_price, coupon (text, amount, currency, promotion_id, link) or null, brand, brand_id, department_ids, product_group, product_type, variations — pass any asin to /v1/product for its history or to /v1/offers for every seller
categories[]the page’s departments: category_id (pass it back as category_id), name, selected
collections[]the page’s deal collections: id (pass it back as collection), name, type, url
facetsbrands[] (id for brand, name, selected), reviewRating[], price and percentOff ranges (min, max; not every marketplace shows a percent-off range), accessType[] (Prime Exclusive, where offered)
selected_filters · filter_checkthe refinements Amazon reports as applied (facet, id, name) · per filter you asked for: applied, not_applied or unverified — departments, Prime Exclusive, rating and brand from Amazon’s own selected refinements, the discount and price ranges from the returned deals, lightning deals from the deal types
paginationpage, page_size, pages_requested, pages_fetched, start_index, returned, has_more (the last page came back full), partial (a later page failed after the first), page_errors
amazonmarketplace_id, locale and currency of the page read
request_parameters · request_metadatathe request as run (a deal_types alias is echoed as its collection, discount as min_discount) · created_at, processed_at, total_time_taken, amazon_url (the page read), pages[] (page, ok, attempts, fetch_ms)
observed_at · cached · cache_age_secondswhen the deals were read from Amazon; whether this answer came from our cache and how old it is (kept 15 min: lightning deals move fast)
StatusMeaningBilled
200the deals — deals may be [] (no deal matches the filters right now, e.g. no lightning deals running at night); pagination.partial: true when a later page failed after the first1 per page that returned deals · empty 0
422bad input, rejected before any fetch: neither country nor url, walmart, not an Amazon host or not a deals path, country ≠ the URL’s marketplace, collection with deal_types, discount with min_discount, a minimum above its maximum, page_size not 30 / 60 / 90 / 120, page or pages out of range, an unknown parameter — or, after the fetch, a filter Amazon did not apply (filter_check not_applied, e.g. a category_id that is not one of the marketplace’s deals departments): the detail names the filter, and the unfiltered page Amazon served instead is not returnedno
502Amazon blocked or did not serve the deals page after retries (or served another slice than asked) — a collection failure, never “no deals”; retryno
503every live-fetch slot for the marketplace is busy (shared with /v1/serp and /v1/bestsellers: us/uk 2 concurrent, others 1) — retry after Retry-Afterno

There is no 404: a deals page always exists.

Honesty notes

  • An empty list is a real answer. deals: [] means Amazon’s page shows no deal for those filters right now (lightning deals come and go by the hour); a fetch that fails is a 502, never an empty list.
  • A filter Amazon did not apply is refused, not served. When filter_check marks a filter not_applied (a category_id or brand the page does not offer, a price or discount range the deals fall outside), Amazon served its unfiltered page instead, so you get a 422 naming the filter (a tool error on MCP, a failed batch row) and are never billed. unverified answers are served: Amazon ignores some filters without saying so (an unknown collection id returns the default list, and the page does not echo the collection except lightning deals, which the deal types confirm), so read filter_check before you rely on one.
  • No total count. Amazon publishes none on the page; pagination.has_more says whether the last page came back full. Walk on with page.
  • No start time (the page does not carry one); ends_at only where Amazon shows a countdown (lightning deals and “Ends in” deals). percent_claimed is null where Amazon shows no claimed bar.
  • list_price is Amazon’s reference price with Amazon’s label (RRP, Was, Typical price, UVP, Statt …) and null when the page shows none or one at or below the deal price; percent_off is Amazon’s badge, computed only when there is none. A product without deal details (a Prime price, a coupon item) has the deal fields null.
  • coupon.text is Amazon’s sentence and amount the money in it as shown — a final price or a saving depending on the sentence; we do not interpret it.
  • One department at a time. category_id takes a list, but Amazon’s department filter is single-select and applies one.
  • Collections differ per marketplace and over time (event pages, e.g. a Prime Day page on jp); the five deal_types are the stable ones.
  • Page language follows our on-demand policy: de, mx and br pages are local (labels such as Angebotspreis / UVP), fr, it, es and jp are requested in English. Prices are always numbers.
  • pages merges consecutive pages and drops a product that Amazon repeats on the next page, so returned can be one short of the page size times pages.
  • Latency is seconds: ~10–30 s a page, up to ~2 min for pages=5 (pages are read one after the other); milliseconds from our cache. Set client timeouts to 300 s.
  • Credits: 1 per deals page fetched that returned at least one deal, whatever its size — 30, 60, 90 or 120 deals are all 1 credit, so page_size=120 gives the most deals per credit; pages=3 that all return deals is 3. Fresh or from our 15-minute cache, it bills the same — it is the same page. A page with no deals, an empty list, a blocked fetch, a busy marketplace and bad input are never billed; a partial answer bills the pages it returned. On the MCP connector the same rules apply to the deals tool (API key required), and batches of kind deals run one department per line (below).

GET /v1/offers live offers page 2026-10-12

Every offer on a product’s Amazon offers page, fetched live — the “All offers” view, every page of it: seller, seller id, price, shipping cost, condition, buy box, FBA / Prime, ships-from, the delivery promise and the seller’s feedback, plus the buy box and the page’s own header (title, image, rating, review count). No product page is fetched, which makes it the quick way to ask who sells this right now, and at what price, for half a credit. For brand, BSR, listing content or history use /v1/product.

ParamNotes
asin10-char ASIN (a print book’s ISBN-10). Provide either asin or gtin.
gtina barcode instead (UPC / EAN / GTIN / ISBN-13), resolved exactly as on /v1/product, Amazon’s own search included; gtin_resolution says how. A barcode nothing resolves is a 404, never billed.
countryus (default), uk, de, ca, au, fr, it, es, jp, mx, br (amazon-xx accepted; marketplace is an alias). Amazon only.
include_usedoptional — true lists the used, refurbished, open-box and collectible offers in current_sellers.sellers too. Either way current_sellers carries used_offer_count, lowest_new and lowest_used, and every row its condition and condition_class (Offer conditions).
zip 2026-10-14optional — a US 5-digit ZIP: the offers page as Amazon shows it to a shopper at that ZIP, for the question “can this be delivered to my recipient, at what price, from which seller?” (Amazon Fresh and Whole Foods items deliver only to some ZIPs). The answer adds location (zip, accepted, city, state, label — Amazon’s own confirmed “Deliver to”), deliverable (true / false / null when it could not be read: offered to this ZIP right now — an out-of-area ZIP shows Amazon’s ordinary unavailable box, the same words as a stock-out), availability, buybox_state and offers_scope: "page_1" (page 1 of the offers only). A one-off session at that ZIP, never a shared one; nothing is stored, and the usage log keeps the first three digits only. country=us only (422 otherwise). 1 credit when the answer carries an offer; a not-deliverable / no-offers answer, a ZIP Amazon rejects (422 zip_rejected), a 404 and a failed fetch are never billed. ZIP+4 is cut to 5 digits.
curl "https://api.logimu.com/v1/offers?asin=B07YYJRXQR&country=de" -H "X-API-KEY: sk_live_..."

# by barcode
curl "https://api.logimu.com/v1/offers?gtin=000113684531&country=us" -H "X-API-KEY: sk_live_..."

Sample response — a real live fetch of B07YYJRXQR on de with include_used=true (captured 2026-10-12, 15.3 s, 4 offer pages, 35 offers: 31 new and 4 used). Long arrays are truncated with an explicit marker; the API returns all of them. Billing fields omitted.

{
  "source": "live",
  "asin": "B07YYJRXQR",
  "marketplace": "amazon-de",
  "data_source": "amazon DE marketplace — live offers page",
  "observed_at": "2026-10-12T15:04:56Z",
  "title": "SANDISK 128 GB Ultra Dual Drive GO, USB-C & USB-A, up to 400 MB/s Read | USB flash drive, double-sided plug-in ports for USB-C smartphones, tablets & Mac, automatic data backup",
  "image_url": "https://m.media-amazon.com/images/I/31lWWaMJiKS.jpg",
  "rating": 4.6,
  "reviews_count": 41165,
  "currency": "EUR",
  "price": 20.94,
  "buybox_seller": "ACTECOM",
  "buybox_seller_id": "A2R44V09DB41S8",
  "seller_count": 35,
  "no_sellers": false,
  "pages_fetched": 4,
  "current_sellers": {
    "as_of": "2026-10-12T15:04:56Z",
    "offer_count": 35,
    "conditions_included": "all",
    "used_offer_count": 4,
    "buybox_days_observed_30d": 22,
    "buybox_observations_total_30d": 167,
    "lowest_new": {
      "price": 20.94,
      "condition": "New",
      "condition_class": "new",
      "seller": "ACTECOM",
      "seller_id": "A2R44V09DB41S8",
      "is_fba": true,
      "is_prime": true,
      "fulfillment": "FBA",
      "seller_rating": {
        "positive_pct": 99.0,
        "feedback_count": 116,
        "rating": null,
        "observed_at": "2026-10-10T11:56:00Z"
      }
    },
    "lowest_used": {
      "price": 14.9,
      "condition": "Used - Like New",
      "condition_class": "used_like_new",
      "seller": "BestArtikel GmbH",
      "seller_id": "A3QX82XXUD599A",
      "is_fba": false,
      "is_prime": false,
      "fulfillment": "FBM",
      "seller_rating": {
        "positive_pct": 79.0,
        "feedback_count": 9330,
        "rating": null,
        "observed_at": "2026-10-10T12:28:14Z"
      }
    },
    "buybox_seller": "ACTECOM",
    "sellers": [
      {
        "seller": "ACTECOM",
        "seller_id": "A2R44V09DB41S8",
        "price": 20.94,
        "is_buybox": true,
        "is_fba": true,
        "is_prime": true,
        "seller_positive_pct": 100.0,
        "seller_feedback_count": 117,
        "buybox_days_30d": 0,
        "buybox_share_30d": 0,
        "buybox_observations_30d": 0,
        "buybox_observation_share_30d": 0.0,
        "condition": "New",
        "condition_class": "new",
        "ships_from": "Amazon",
        "shipping_cost": 0.0,
        "fulfillment": "FBA",
        "delivery": {
          "text": "FREE delivery Friday, 16 October on eligible first order. Order within 55 mins",
          "free": true,
          "days_min": 4,
          "days_max": 4,
          "fastest_days": null,
          "date_min": null,
          "source": "parsed",
          "observed_at": null
        },
        "delivery_eta_days": 4,
        "delivery_eta_fastest_days": null,
        "seller_rating": {
          "positive_pct": 99.0,
          "feedback_count": 116,
          "rating": null,
          "observed_at": "2026-10-10T11:56:00Z"
        }
      },
      {
        "seller": "BestArtikel GmbH",
        "seller_id": "A3QX82XXUD599A",
        "price": 14.9,
        "is_buybox": false,
        "is_fba": false,
        "is_prime": false,
        "seller_positive_pct": 78.0,
        "seller_feedback_count": 9332,
        "buybox_days_30d": 0,
        "buybox_share_30d": 0,
        "buybox_observations_30d": 0,
        "buybox_observation_share_30d": 0.0,
        "condition": "Used - Like New",
        "condition_class": "used_like_new",
        "ships_from": null,
        "shipping_cost": 0.0,
        "fulfillment": "FBM",
        "delivery": {
          "text": "FREE delivery Saturday, 17 October on eligible first order. Details",
          "free": true,
          "days_min": 5,
          "days_max": 5,
          "fastest_days": null,
          "date_min": null,
          "source": "parsed",
          "observed_at": null
        },
        "delivery_eta_days": 5,
        "delivery_eta_fastest_days": null,
        "seller_rating": {
          "positive_pct": 79.0,
          "feedback_count": 9330,
          "rating": null,
          "observed_at": "2026-10-10T12:28:14Z"
        }
      },
      "… 33 more (truncated for this sample)"
    ]
  },
  "fulfillment": {
    "buybox": "FBA",
    "buybox_seller": "ACTECOM",
    "buybox_seller_id": "A2R44V09DB41S8",
    "ships_from": "Amazon",
    "is_prime": true,
    "offers": {
      "amz": 2,
      "fba": 6,
      "fbm": 27,
      "total": 35
    },
    "amazon_sells": true,
    "amazon_holds_buybox": false,
    "buybox_delivery": {
      "text": "FREE delivery Friday, 16 October on eligible first order. Order within 55 mins",
      "free": true,
      "days_min": 4,
      "days_max": 4,
      "fastest_days": null,
      "date_min": null,
      "source": "parsed",
      "observed_at": null
    },
    "buybox_delivery_eta_days": 4,
    "dispatch_latency": null,
    "dispatch_days_min": null,
    "dispatch_days_max": null,
    "delivery_eta_source": null,
    "observed_at": "2026-10-12T15:04:56Z",
    "source": "live",
    "notes": "buybox is the buy-box winner's fulfilment: AMZ = sold by Amazon itself, FBA = a third party fulfilled by Amazon, FBM = merchant-fulfilled. Counts cover the offers listed in current_sellers. Delivery days are read from Amazon's own delivery sentence at the time of the observation, in whole days from that date; ranges give min/max, fastest_days is the paid/Prime fast option when shown. Not billed extra."
  },
  "seller_ratings": [
    {
      "seller": "1Deins Computer GmbH",
      "seller_id": "A3NOUUHLVV3QXQ",
      "seller_positive_pct": 95.0,
      "seller_feedback_count": 93648,
      "seller_rating": null,
      "observed_at": "2026-10-10T14:04:16Z"
    },
    "… 29 more (truncated for this sample)"
  ]
}
FieldMeaning
price · buybox_seller · buybox_seller_idthe buy box: its price and seller; null when no offer holds it
seller_count · pages_fetchedoffers on the page, every condition · offer pages walked (up to 10)
no_sellerstrue = Amazon lists no offer for the product right now. An answer, not a failure: we serve it only after a second, independent fetch agrees, and never bill it.
buybox_condition
buybox_condition_source
buybox_condition_detail 2026-10-15
new | used | null (no featured offer): the pinned offer’s condition as measured on this fetch (source is offers_page here; with zip= the same), detail = its condition text or the used storefront’s name (Amazon Resale, Amazon Warehouse, …). Same keys on /v1/product.
title · image_url · rating · reviews_countthe offers page’s own header — always the requested ASIN’s, also for a variation Amazon no longer shows a product page for
current_sellersthe same block /v1/product returns: as_of, offer_count, conditions_included, used_offer_count, lowest_new, lowest_used, buybox_seller and sellers[] — buy box first, then price ascending — each with seller, seller_id, price, shipping_cost, condition, condition_class, is_buybox, is_fba, is_prime, ships_from, delivery_text and the derived fulfillment / delivery_*, the seller’s feedback (seller_positive_pct, seller_feedback_count, seller_rating) and, from our observations, the 30-day buy-box figures (buybox_days_30d, buybox_share_30d, buybox_observations_30d, buybox_observation_share_30d)
fulfillmentthe fulfilment block: who fulfils the buy box (AMZ / FBA / FBM), offer counts per kind, delivery days
seller_ratingsthe feedback record of every seller the answer names
observed_atwhen the page was fetched (UTC)
gtin · gtin_matches · gtin_match_count · gtin_resolutionwith gtin= only, as on /v1/product
StatusMeaningBilled
200the offers page; no_sellers: true when Amazon lists no offer right now0.5 with at least one offer · 0 without
404asin_not_found — Amazon answered “not found” for the ASIN (Amazon’s answer, not a collection failure); or a barcode nothing resolvesno
422bad input, rejected before any fetch: no anchor or both, not an ASIN, Walmart, an unknown marketplace or parameterno
502Amazon blocked or did not serve the offers page after retries — a collection failure, retryno
503every live offers slot for the marketplace is busy, or (with gtin=) the barcode search could not run — retry after Retry-Afterno

Notes

  • Latency is seconds: typically 4–12 s — about 4 s for one page, and we walk every page of a long list. Set client timeouts to 120 s+. Concurrent calls for the same product share one fetch.
  • The offers page, not the product page. It lists every offer Amazon shows there, second-hand included; the buy box is the pinned offer at the top. The 30-day buy-box figures come from our own observations of the product (0 / null for a seller we have not observed holding it).
  • The fetch is stored. Each answer also lands in our warehouse, so the product’s /v1/product seller list and history pick it up after the nightly refresh.
  • Batches: a list of ASINs runs as kind: "offers" (Every endpoint as a batch); the CSV has one row per (ASIN, offer). On the MCP connector the offers tool runs the same call, by ASIN or barcode, with the same billing (an API key is required; the no-signup lane does not run live fetches). 2026-10-12

Tracking: POST / GET / DELETE /v1/track hot lane 2026-10-14

Track a product: pin an ASIN into our hot lane so its offers page is re-read every hour, or every 2, 4, 12 or 24 hours, for as long as your plan is active (or a ttl_days you set). Every read becomes a point in the product’s buybox_price_points_hot (price, buy-box seller, fulfillment, offer count), so GET /v1/product — its 0.05-credit history_only lane, or a product batch with source: "tracked" — carries sub-daily buy box, price and offer-count history for it. Popular products are refreshed this often anyway (the lane’s own selection, several hundred thousand ASINs a day); a tracking guarantees it for the product you name. Add notify_if with alert_email and / or webhook_url and we tell you when a price, the buy-box seller, the offer count or the availability crosses a threshold you set (alerts).

0 credits. What a plan sells is a daily allowance of tracked snapshots: an hourly tracking is 24 snapshots a day, a 4-hour one 6, a 24-hour one 1. When the allowance is spent the call answers 402 tracking_allowance_full with the upgrade link; when only a longer interval still fits, that interval is granted and the answer says so (granted_interval). Posting the same ASIN again renews it and sets the new interval (same id). A lapsed subscription keeps its trackings for 7 days, then they pause (and resume by themselves when the subscription returns). The lane picks a new tracking up within ~10 minutes (pending: true until then); one fetch serves every account tracking the same ASIN. Amazon marketplaces only.

PlanTracked snapshots / day≈ products every 4 h≈ products once a day
Solo2,5004162,500
Starter6,0001,0006,000
Growth18,0003,00018,000
Standard40,0006,66640,000
Scale170,00028,333170,000
Volume710,000118,333710,000

POST /v1/track

Body (JSON)Notes
asinthe product’s 10-character ASIN
countryus (default), uk, de, ca, au, fr, it, es, jp, mx, br (amazon-xx accepted). No Walmart.
interval1h, 2h, 4h (default), 12h, 24h — how often the lane re-reads the offers page; shorter draws more of the daily allowance (1h = 24 a day)
ttl_daysoptional, 1–365 — stop after this many days. Omit it and the tracking runs for as long as your plan is active (a lapsed plan keeps it 7 days, then it pauses and resumes with the plan)
alert_emailoptional 2026-10-14 — true (the account’s own address) or an address: one e-mail per notify_if event, at most 50 a day per tracking, from noreply@logimu.com. false detaches. Works with or without webhook_url
curl -X POST "https://api.logimu.com/v1/track" -H "X-API-KEY: sk_live_..." -H "Content-Type: application/json" \
  -d '{"asin": "B07YYJRXQR", "country": "us", "interval": "1h"}'

# answer and track in one call
curl "https://api.logimu.com/v1/product?asin=B07YYJRXQR&country=us&track=true&interval=4h" -H "X-API-KEY: sk_live_..."

# the list, and stopping one
curl "https://api.logimu.com/v1/track?country=us" -H "X-API-KEY: sk_live_..."
curl -X DELETE "https://api.logimu.com/v1/track/123" -H "X-API-KEY: sk_live_..."

# the daily series pull over everything you track: a product batch with source tracked (0.05 a row)
curl -X POST "https://api.logimu.com/v1/batches" -H "X-API-KEY: sk_live_..." -H "Content-Type: application/json" \
  -d '{"name": "tracked daily", "country": "us", "mode": "cache", "source": "tracked", "include": ["history_only"]}'

Example response of POST /v1/track (illustrative shape; stamps are UTC). in_lane, last_snapshot_at, next_due_at and lane_snapshots are the lane’s own state for the ASIN, read from its table (mirrored every 10 minutes); they are shared by every account tracking it.

{
  "credits_charged": 0.0,
  "credits_remaining": 24871.5,
  "created": true,
  "id": 123,
  "asin": "B07YYJRXQR",
  "country": "us",
  "marketplace": "amazon-us",
  "status": "active",
  "interval": "1h",
  "interval_min": 60,
  "requested_interval": "1h",
  "granted_interval": "1h",
  "snapshots_per_day": 24.0,
  "created_at": "2026-10-14T13:02:11Z",
  "expires_at": null,
  "runs": "while the plan is active",
  "stopped_at": null,
  "via": "rest",
  "alert_email": null,
  "webhook": null,
  "in_lane": false,
  "lane_interval_min": null,
  "last_snapshot_at": null,
  "next_due_at": null,
  "lane_snapshots": null,
  "pending": true,
  "note": "Enters the hot lane at the loader's next pull (within ~10 minutes); the first snapshot follows within the interval.",
  "allowance": {
    "plan": "solo",
    "plan_state": "active",
    "snapshots_per_day": 2500,
    "used_snapshots_per_day": 24.0,
    "remaining_snapshots_per_day": 2476.0,
    "subscription_until": "2026-11-02T09:15:40Z"
  }
}
StatusMeaning
activetracked; pending: true until the lane has picked it up, then in_lane: true with last_snapshot_at / next_due_at
pausedthe subscription lapsed more than 7 days ago; resumes by itself when it returns (within 30 days the row is kept as is)
expiredthe ttl_days you set ran out; post again to renew (a tracking without ttl_days never expires)
stoppedDELETE /v1/track/{id}; listed for 30 days, allowance released at once
ErrorMeaning
402 tracking_allowance_fullthe plan’s daily snapshots are in use and even a 24-hour interval does not fit; the body carries allowance_snapshots_per_day, used_snapshots_per_day, requested_snapshots_per_day and upgrade_url. Never billed.
402 tracking_plan_requiredthe key has no subscription plan (tracking is a plan feature; credits alone do not carry an allowance)
402 tracking_plan_lapsedthe subscription lapsed more than 7 days ago
422a Walmart country, an interval other than the five, a malformed ASIN, ttl_days outside 1–365 or a malformed alert_email. Never billed.
404DELETE of an id that is not this key’s
503 tracking_capacitythe marketplace’s lane is sold out at every interval (its daily snapshot capacity is shared by every tracking on it); retry_after_seconds, cap_snapshots_per_day, in_use_snapshots_per_day. Capacity is added when this happens. Never billed.
503 tracking_busyanother tracking import was being admitted and this one waited 30 s for its turn (rare); nothing was created, retry in a few seconds (retry_after_seconds). Never billed.

Alerts: webhooks and e-mail 2026-10-14

Add notify_if to POST /v1/track with webhook_url (a signed POST to your URL) and / or alert_email (an e-mail per event) and we tell you when a threshold fires on a new observation of the product (the lane’s next read, so within the tracking’s interval). Thresholds, any subset:

notify_if keyFires when
price_belowthe buy-box price drops below the value (and was not below it on the previous observation)
price_abovethe buy-box price rises above the value (edge-triggered the same way)
price_change_pctthe buy-box price moved by at least this percent since the previous observation, either way
buybox_seller_changetrue: a different seller holds the buy box than on the previous observation
offer_count_belowthe number of offers drops below the value
offer_count_abovethe number of offers rises above the value
availability_changetrue: the product’s stock state changed since the previous read — between in_stock, no_buybox and out_of_stock. The event carries availability (the new code) and previous_availability (the old), price (the buy-box price, or null), offer_count and, on a no_buybox read, first_offer_price.
out_of_stocktrue: shorthand for a change to out_of_stock (the same payload)
back_in_stocktrue: shorthand for a change to in_stock from either other state
curl -X POST "https://api.logimu.com/v1/track" -H "X-API-KEY: sk_live_..." -H "Content-Type: application/json" \
  -d '{"asin": "B07YYJRXQR", "country": "us", "interval": "2h",
       "webhook_url": "https://hooks.example.com/logimu",
       "notify_if": {"price_below": 22.5, "buybox_seller_change": true, "offer_count_above": 15}}'

The answer carries webhook_secret once. Every delivery is a JSON POST with X-Logimu-Signature: sha256=HMAC-SHA256(secret, raw_body) and X-Logimu-Event (the event name); the body carries event, tracking_id, asin, marketplace_id, observed_at and the values behind the event (price / previous_price, the sellers, the counts, the availability text). A non-2xx answer or a timeout (10 s) is retried after 1, 5 and 30 minutes, then marked failed. GET /v1/track/{id}/events lists a tracking’s events with their delivery state; GET /v1/track shows the attached webhook (URL and thresholds, never the secret). Re-posting the tracking with webhook_url: "" (or alert_email: false) detaches it; omitting the fields keeps it. E-mail alerts carry the event, the values and links to the product and its history; at most 50 a day per tracking (the rest are recorded as capped in the event log). Thresholds are evaluated on the all-offers observations the hot lane writes (every 2 minutes), so an hourly tracking is told within about an hour of a change, not in real time.

When the buy box is missing: the three stock states 2026-10-14

Every tracked read is recorded, never skipped, and has one of three states, which buybox_price_points_hot shows per point (state) and the alerts use:

StateMeaningWhat the point carries
in_stocka featured (buy-box) offer existsprice = the buy-box price, the seller, fulfillment, offer_count
no_buyboxoffers exist, but Amazon shows no featured offer (the buy box is suppressed)price: null, first_offer_price = the cheapest new offer, offer_count; no seller
out_of_stockno offers at all — confirmed by a second read from another location before it is recordedprice: null, offer_count: null

A read that would turn an in-stock product into no_buybox is also confirmed by a second read first (buy-box presence varies with the reader’s location). Price alerts compare buy-box prices only: an in_stock read against the last in_stock read, so a return from a stock-out at a new price fires price_change, and a no_buybox read’s first-offer price never fires one. buybox_seller_change fires only between two in_stock reads — losing the buy box is an availability_change to no_buybox, not a seller change. offer_count_below cannot see a stock-out (it has no count): use the state alerts for it. Every event carries its state; the e-mail says it in words. On GET /v1/product, stock_state / in_stock follow the newest read when it is newer than the daily history’s last point, and buybox_state always says what the lane saw last.

Bulk: lists, stop and sync 2026-10-14

POST /v1/track takes a list: items (objects with asin and any per-item override) or asins (ASIN strings), up to 1,000 per call; the top-level country, interval, ttl_days, notify_if, webhook_url and alert_email are the defaults for every item. The answer is HTTP 200 whenever the body parsed: results[] in input order, each {asin, country, status, id, granted_interval, error} with status created, renewed, refused (tracking_allowance_full, tracking_capacity, tracking_plan_required) or invalid, plus summary and allowance. The allowance is consumed in input order; when it runs out the rest come back refused — the call is never all-or-nothing. One transaction, one request against the rate limit.

curl -X POST "https://api.logimu.com/v1/track" -H "X-API-KEY: sk_live_..." -H "Content-Type: application/json" \
  -d '{"country": "us", "interval": "4h", "notify_if": {"availability_change": true}, "alert_email": true,
       "asins": ["B07YYJRXQR", "B0DS6WTXGP", "B0F3HH834M"]}'
CallWhat it does
POST /v1/track/stop{"ids": [...]} or {"country": "us", "asins": [...]} (up to 1,000): per-item stopped / already_stopped / not_found; the allowance released at once
DELETE /v1/track?country=us&asin=B0…stop one tracking by ASIN instead of id (404 when the key does not track it)
POST /v1/track/sync{"country": "us", "asins": [...], "interval": "4h", ...}: makes the key’s active set on that marketplace equal to the list — creates what is missing (with the fields given), stops active trackings not listed, leaves the rest untouched (their interval and alerts stay). Returns created, stopped, unchanged, refused, invalid with the lists; "dry_run": true shows the same without writing. An empty list is a 422 (use /v1/track/stop to stop everything). The daily call for a list that changes every day: about 10 minutes of single POSTs become one request.

On the MCP connector the same functions are the track_product (also action: "stop", action: "sync", and asins / ids lists) and list_tracked tools (paid plans); the batch tool runs a product batch with source: "tracked" and the account tool shows the allowance. Keepa’s API prices tracking in tokens (a marketplace-tracking update is 9 tokens per locale) and deactivates trackings 7 days after a downgrade; we size each plan’s allowance at no less than twice the marketplace-tracking updates its price would buy there, and keep the reads priced as they are.

GET /v1/seller 2026-10-04

Paid plans. The seller endpoints and the derived-intelligence endpoints below are available to accounts with a subscription or purchased credits; a key without one receives 403 paid_plan_required (never billed) and its credits keep working on /v1/product, /v1/shopping, /v1/search and /v1/serp. On the MCP connector the matching tools (seller, brand, category, market_lists, keywords) are listed only to those keys.

A seller’s profile by seller id — the A… code in /sp?seller=…, or the seller_id on any offer /v1/product returns. Rating, lifetime and 12-month counts, positive %, the feedback summary per period, the rating histogram, up to 5 recent feedback entries and, where the seller publishes one on Amazon, the business block — plus tracking (since when and how often we have observed the seller) and, with history=true, the seller’s rating and storefront-size change points. All 11 Amazon marketplaces; no Walmart (no seller pages there). Our seller tracker re-reads every stored seller about every 14 days, so mode=cache normally returns the full profile without a live fetch. 2026-10-05

ParameterMeaning
seller_idrequired — A + 8–24 letters/digits.
countryus (default), uk, de, ca, au, fr, it, es, jp, mx, br.
modecache: our stored observation — in order: the seller page we fetched in the last 24 h; the seller page as our tracker last read it (the full profile: star rating, per-period feedback, histogram, recent feedback, business block; request_metadata.fetched: false); or, for a seller the tracker has not stored yet, the warehouse record (positive % and feedback count as last seen on a product page, no star rating or business block — the answer carries a note). live: fetch the seller page now (5–20 s, up to ~30 s on a reroute); the fetch also refreshes the stored profile. auto (default): the stored observation when it is younger than max_age_days, else live. A seller the tracker has confirmed as not found is answered 404 without a fetch in cache mode, and in auto while that verdict is fresh.
max_age_daysauto only, default 14 2026-10-05 (the tracker’s refresh cadence; was 7). 0 forces a live fetch.
history 2026-10-05optional — true adds history: ratings[] change points (each observed_at, positive_percent, positive_percent_period, rating, ratings_total, ratings_12m and periods.{30d,90d,12m,lifetime}.{rating,count}) and storefront_size[] (observed_at, total_results), both oldest first, UTC, plus points_returned, truncated and a note. Change points, not daily samples: a point is written only when a value moved, each value holds until the next point, and the last one holds until tracking.last_observed. The series starts when we first observed the seller (tracking.observed_first_seen, 2026-10-04 at the earliest), never when the seller started — expect one or two points per seller for now, more as values move. Storefront size is recorded when a storefront page is fetched (/v1/seller/products mode=live). +0.5 credit once per call when at least one point comes back; an empty history is free. Also available on mode=live answers (the store is refreshed daily, so the newest live point may appear the next day).
history_points 2026-10-05with history — the latest N change points per series (default 500, max 5,000); truncated: true when more exist.

Response

KeyMeaning
sourcelive or cache — what was actually served; mode=auto bills accordingly.
sellerseller_id, name, is_amazon, logo, storefront_url, profile_url, rating (12-month average; lifetime when the 12-month count is 0), ratings_total, ratings_total_12m, positive_percent, positive_percent_period (twelve_months | lifetime — the page’s own headline says which), header_ratings_count, icon_rating. Amazon’s own retail seller answers instantly with is_amazon: true.
feedback_summarythirty_days / ninety_days / twelve_months / lifetime → {rating, count}. Amazon no longer publishes positive / neutral / negative splits per period — it shows an average star rating and a count per period, plus one positive-% headline and one histogram for the headline’s period. We do not derive splits from the histogram (its rounding disagrees with the headline).
rating_histogram{period, percent_by_stars: {"5": 78, "4": 7, …}} or null.
recent_feedbackup to 5, newest first, each only {date, rating, struck}. Feedback text and the buyer’s name are never collected or returned.
businesswhere Amazon shows a trader block: business_name, business_type, trade_register_number, vat_number, tax_id, share_capital, phone, email, business_address[], customer_service_address[], representative, display_name, is_business_seller, other[] (labels we have no key for). null on au and ca (no trader block on those pages) and in warehouse-only cache answers.
observed_atwhen the served record was fetched (live) or last observed (stored profile / warehouse record), UTC.
tracking 2026-10-05present whenever the seller is in our seller store (not billed): observed_first_seen — when we first stored the seller (not when it started selling), last_observed, last_rating_change — when the latest rating change point was written, observations — how many times we have read its page. UTC.
history 2026-10-05with history=true — see the parameter above. ratings[], storefront_size[], points_returned, truncated, note.
request_metadatafetched: true with the fetch timings on a live answer; fetched: false with processed_at (= observed_at) when the stored profile was served.

Verdicts (never billed)

  • 404 seller_not_found — Amazon’s own 404 for the id on that marketplace, confirmed by more than one attempt; or, in cache mode, a seller we have never observed. A confirmed 404 is remembered for a week.
  • 404 seller_unavailable — a seller we do not serve (opt-out). Same answer in every mode.
  • 502 — Amazon blocked or did not serve the page after retries. A collection failure, not a fact about the seller; retry. On amazon.de an unknown id answers with Amazon’s throttle status, so it stays a 502 there, never a 404.
  • 503 — the marketplace’s live slots are busy (seller pages share the live-search budget: us/uk 2 concurrent, others 1); Retry-After is set.

Rainforest seller_profile mapping

RainforestLogimu
seller_profile.name / rating / ratings_totalseller.name / seller.rating / seller.ratings_total
seller_profile.positive_percent (per period)seller.positive_percent + positive_percent_period (Amazon shows one headline now)
feedback_summary.*.{positive,neutral,negative}feedback_summary.*.{rating, count} — the splits no longer exist on Amazon’s page
seller_feedback (1 credit per 5)recent_feedback (5, included; date / rating / struck only)
business_name, business_address, …business.* (included)

Keepa /seller mapping 2026-10-05

Keepa seller objectLogimu
sellerId / sellerNameseller.seller_id / seller.name
trackedSince / lastUpdate / lastRatingUpdatetracking.observed_first_seen / tracking.last_observed / tracking.last_rating_change (ISO-8601 UTC, not Keepa minutes)
currentRating / currentRatingCountseller.positive_percent (+ positive_percent_period) / seller.ratings_total; the star average is seller.rating
csv[0] rating-% history, csv[1] rating-count historyhistory.ratings[] (positive_percent, ratings_total — plus star rating and the four per-period averages and counts on every point)
ratingsLast30Days; positive/neutral/negative per 30 d / 90 d / 365 d / lifetimefeedback_summary.thirty_days.count; feedback_summary.*.{rating, count} — Amazon shows an average and a count per period now, splits only via the histogram for the headline period
recentFeedback[].{date, rating (0–50), isStriked}recent_feedback[].{date, rating (1–5 stars), struck}
businessName, address, tradeNumber, vatID, phoneNumber, email, representativebusiness.{business_name, business_address[], trade_register_number, vat_number, phone, email, representative} — current values, not versioned (as Keepa)
totalStorefrontAsins (history)history.storefront_size[].total_results
hasFBA, shipsFromChina, buy-box share, competitors, top brands / categoriesnot on this endpoint — the observed-products lane (/v1/seller/products mode=cache) carries per-ASIN buy-box days, observed price range and FBA observed; derived seller statistics: not yet
per-period positive / neutral / negative splits for the non-headline periodsnot yet — Amazon shows them behind a dropdown we do not read; the headline period’s histogram is included

GET /v1/seller/products 2026-10-04

What a seller sells. Two different things behind one endpoint, chosen with mode:

ParameterMeaning
seller_id, countryas above.
modecache (default): the products we have observed this seller offering since Dec 2024 — seller_products[] of asin, buybox_days, days_seen, min_price / max_price / buybox_avg_price, first_seen / last_seen, fba_observed; 25 per page, buy-box days first, has_more for paging. live: the seller’s storefront on Amazon right now — exactly the /v1/serp object (search_results, pagination, refinements…), seconds not ms.
pagecache: 1–40 (25 products each). live: Amazon’s page, 1–10.
max_page, sort_by, refinements, qlive only, as on /v1/serp; q searches inside the storefront.

An empty live storefront (result_count: 0 with Amazon’s own no-results page) is a valid answer and is not billed — and it does not confirm the seller exists: on amazon.com an unknown seller’s storefront is a genuine empty page. /v1/seller answers that question. Rainforest’s seller_products ≡ mode=live; the observed-products lane has no Rainforest equivalent.

Derived intelligence 2026-10-05

What our observations add up to. Every product and offer we observe is also an observation about a brand, a seller and a category. These endpoints serve those aggregates: who sells a brand and how much of it, how contested or Amazon-dominated it is, which brands a seller carries, which brands are connected because the same sellers win the buy box on both, how a category is structured — and ranked lists to discover all of that. Everything is computed from observed buy-box data since Dec 2024, refreshed daily; nothing is an estimate, and every response says so in data_source. The family also carries the one observed signal that is not about listings: /v1/keywords, Amazon’s own autocomplete suggestion lists as we observe them 2026-10-07. Paid plans only — see the note under /v1/seller.

  • Observed, not asserted. observed_first_seen is when we first recorded the brand or seller — our data horizon, never a founding date. Buy-box days scale with how often we observed a listing; compare shares and per-ASIN ratios across brands, not raw day counts.
  • Seller identity. A merchant id is returned when we hold a real one; otherwise the seller is named as Amazon prints it. Sellers who have opted out never appear in any row.
  • Amazon marketplaces only (country=us|uk|de|ca|au|fr|it|es|jp|mx|br); Walmart has no derived rows yet.
  • Pricing: 1 credit per record, 1 per page of 25 rows, 0 for lookups and for anything not found; history=true adds +0.5 once. Each key has a daily cap on this family (2,000 calls by default — 429 derived_daily_cap past it, never billed).

GET /v1/brand 2026-10-05

The brand dossier. ?brand=Nike&country=us (brand as Amazon prints it, case-insensitive).

KeyMeaning
observedobserved_first_seen, months_observed, oldest_month — how long we have been watching this brand (the data horizon, not the brand’s age).
catalogasins_3m (ASINs with a buy-box observation in the last 3 months), avg_price, avg_rating, bought_past_month_30d (sum of Amazon’s badges), revenue_30d (badge-based signal), velocity_90d_units_per_day, catalog_churn_30d_pct, oos_frequency_30d_pct, asin_count_trend_1m/4m_pct.
sellersunique_sellers_3m, buybox_days_3m, control_score (share of buy-box days won by FBA offers, 0–100), winner_diversity (how spread the buy box is across sellers), amazon_retail_share_pct (Amazon’s own share of buy-box days), fba_penetration_pct, seller_hhi_top3 (concentration), seller_churn_30d_pct and its delta vs the category, pct_asins_gated_to_3p, is_amazon_private_label, seller_pressure_trend (short/long momentum grades, −100…+100, from sellers-per-ASIN recent vs prior).
categorythe brand’s dominant root category with benchmarks: p25/p50/p75 of control_score, unique_sellers, buybox_days, avg_price across the brands in that root, plus this_brand — so you can place the brand against its peers.
top_sellersup to 10 sellers by observed buy-box days (16-month window), each with seller_id (when real), asins_touched, first_seen/last_seen, avg_price, fba_observed and the seller’s feedback record. The full list: /v1/brand/sellers.
history +0.5history=true: history.monthly[] up to 24 calendar months — ASINs, unique sellers, buy-box days, FBA buy-box days, price, rating, review total, winner diversity, sellers_per_100_asins; oldest first.

GET /v1/brand/sellers

?brand=&country=&page= — every seller observed winning the buy box on the brand’s listings in the rolling 16-month window, most buy-box days first, 25 per page (has_more), each row with the seller’s feedback record. 1 credit per page returned. The window dates are on the response.

Verdicts (never billed)

  • 404 brand_not_found — we have not observed the brand on that marketplace.
  • 503 derived_data_unavailable — the tables are being refreshed on the server; retry later.
  • 429 derived_daily_cap — the key’s daily cap on derived calls (resets 00:00 UTC).

GET /v1/brand/network 2026-10-05

The brand’s seller map. ?brand=Nike&country=us&limit=20 returns the brands connected to Nike because the same third-party sellers were observed winning the buy box on both — edges[] with shared_sellers (how many sellers both brands share, 16 months) and each side’s buy-box days, strongest first, up to 50; and nodes[] for the brand and every neighbour with sellers_3m, asins_3m, control_score, winner_diversity, amazon_retail_share_pct, pressure_score, cluster_id, trend, category and, on us/uk, layout {x, y, centrality} from our precomputed graph. One hop per call — walk the graph by calling it on a neighbour. 1 credit. This is the object the network map on www.logimu.com is drawn from.

GET /v1/seller/network

?seller_id=… or ?name=… — the sellers that win the buy box on the same brands as this one (connected_sellers[] with shared_brands, buy-box days and feedback record), strongest first, up to 50. 1 credit.

GET /v1/seller/brands 2026-10-05

The operator footprint. ?seller_id=A2ENTBEZKGXKVW&country=us or ?name=hearthshire. operator carries the header — brands_touched, asins_touched, buybox_days (16 months), fba_share_pct, bought_past_month_30d, revenue_30d (badge-based signal), avg_rating, observed_first_seen/last_seen, top_brands — and brands[] lists every brand the seller was observed winning the buy box on, most buy-box days first, 25 per page. history=true (+0.5) adds up to 24 months of brands / ASINs / buy-box days. 1 credit per page. Pairs with /v1/seller (the seller’s own profile page) and /v1/seller/products (what it lists today). Seller names are canonicalised (lower-case) in this family.

GET /v1/category 2026-10-05

The category landscape. ?category_id=7926&country=us — category_id is the warehouse’s own id for the category (the one every /v1/search result and product category chain carries), not an Amazon browse-node id; pass node_id= instead to look a category up by its Amazon browse-node id 2026-10-07. Find ids with GET /v1/categories (the taxonomy, free) or GET /v1/categories/search?q=toothbrush&country=us (by name, free). Keys: size (asins, asins_30d, brands, unique_sellers_30d, closeout_candidates), pricing, competition (amazon_retail_share_pct, fba_penetration_pct, amazon_private_label_pct, seller_hhi_top5, avg_heat = competitive intensity 0–100, avg_winner_diversity, Amazon’s 90-day brand additions and gatings), demand (velocity_tier, bought_past_month_30d, revenue_30d), catalog_churn_30d, benchmarks (root-level p25/p50/p75), subcategories[] (children, by size) and, for root categories, top_brands[] (by observed buy-box days). history=true (+0.5): months of products / brands / sellers. 1 credit.

GET /v1/keywords 2026-10-07

What buyers type, as Amazon itself suggests it. ?seed=electric%20toothbrush&country=us — the suggestion lists Amazon’s search box shows for the seed, as our harvest observed them. We crawl Amazon’s own autocomplete continuously on all eleven marketplaces (since Aug 2026, each marketplace against its own country host and in its own language) and keep every list we see: up to 10 terms per prefix × department, with the term’s position in that list and the day each observation started and ended. This endpoint returns, for the seed, the lists of the longest crawled prefix the seed extends that has current observations (the seed itself when we crawl it exactly), otherwise the shortest crawled prefix that extends the seed — up to 6 lists, “all departments” (aps) first — plus related observed vocabulary that starts with the seed.

KeyMeaning
lists[]one entry per suggestion list: prefix (the text Amazon was asked for), department (aps = all departments, or an Amazon department alias such as electronics) and terms[] — the current list, in order: keyword, position (1–10 within this list), first_observed / last_observed (the term anywhere in this marketplace’s suggestions), in_list_since (the day the term took this position in this list) and observed_in (the marketplaces whose suggestions carry the same term).
list_counthow many lists came back (0–6).
related_terms[]up to related_limit (default 25, max 50) further observed suggestions that start with the seed and are not already in a list, ordered by times_observed — how many harvest passes and prefixes the term surfaced under — with first_observed, last_observed, observed_in. A breadth heuristic, not a demand number.
history +0.5history=true: history.lists[].observations[] — every observation of each returned list since the harvest began (observed_since), oldest first: keyword, position, valid_from, valid_to (null = still in the list at that position). A term with several rows moved position; a row with valid_to left the list or moved. history_points caps the rows (default 500, max 5,000); points_returned and closed_points say what came back. Billed +0.5 only when closed_points > 0 — a list that never changed costs nothing extra.
data_source / notewhat the figures are — observed suggestion lists, positions comparable only within one list — on every response. Quote them when you re-publish the numbers.

What this is not. Amazon publishes no search volume for its suggestions and none is implied here: a position is a place in one list, never a count, and a term’s position in one list says nothing about its position in another (the lists are different questions). For the products Amazon shows on page 1 for a term, as we observed it, see /v1/keywords/rankings (Amazon US, about weekly); for products matching a term in our catalogue, /v1/shopping?q=. Each marketplace has its own vocabulary in its own language (country=de returns German suggestions); observed_in is a text match across marketplaces, useful for brand names and model numbers. Amazon marketplaces only; Walmart has no suggestion corpus.

GET /v1/keywords/compare

?seed=&countries=us,uk,de (2–11 marketplaces) — the seed’s primary list (aps, longest-prefix rule as above) on each requested marketplace under lists.{cc}, and matrix[]: every term seen in any of those lists with its positions per marketplace (null where the term is not in that marketplace’s list), observed_in (every marketplace whose suggestions carry the term at all) and in_requested. Positions compare across the matrix only as “in the list / not in the list” and as order within one marketplace’s column. 1 credit; nothing observed on any requested marketplace is a free 404.

Verdicts (never billed)

  • 404 keywords_not_found — no suggestion observation matches the seed on that marketplace (the harvest is continuous; coverage grows).
  • 422 — seed under 3 characters, an unknown marketplace, Walmart, or fewer than two distinct marketplaces on compare.
  • 503 derived_data_unavailable — the corpus is being refreshed on the server; retry later.
  • 429 derived_daily_cap — the key’s daily cap on the derived family (2,000 calls by default, resets 00:00 UTC).
curl "https://api.logimu.com/v1/keywords?seed=electric%20toothbrush&country=us" -H "X-API-KEY: $KEY"
curl "https://api.logimu.com/v1/keywords?seed=yoga%20mat&country=de&history=true" -H "X-API-KEY: $KEY"
curl "https://api.logimu.com/v1/keywords/compare?seed=air%20fryer&countries=us,uk,de,fr" -H "X-API-KEY: $KEY"
{
  "marketplace": "us", "source": "warehouse", "seed": "electric toothbrush",
  "lists": [
    {"prefix": "electric toothbrush", "department": "aps",
     "terms": [
       {"keyword": "electric toothbrush", "position": 1, "first_observed": "2026-08-07", "last_observed": "2026-10-06",
        "in_list_since": "2026-08-07", "observed_in": ["us", "uk", "ca", "au"]},
       {"keyword": "electric toothbrush heads", "position": 2, ...}
     ]},
    {"prefix": "electric toothbrush", "department": "beauty", "terms": [...]}
  ],
  "list_count": 2,
  "related_terms": [{"keyword": "electric toothbrush for kids", "times_observed": 412, "first_observed": "2026-08-09",
                     "last_observed": "2026-10-06", "observed_in": ["us", "ca"]}, ...],
  "data_source": "Terms observed in Amazon's own autocomplete suggestions, harvested continuously per marketplace since Aug 2026 - ...",
  "note": "position = the term's place (1-10) within the suggestion list shown for that prefix; positions are comparable only within one list ...",
  "latency_ms": 41
}

GET /v1/keywords/rankings · GET /v1/product/keywords 2026-10-18

Which products show on page 1 for a search, and which searches a product shows up for. We fetch page 1 of amazon.com search for a set of head search terms — taken from Amazon’s own autocomplete suggestions, all departments, one fixed US delivery ZIP — about once a week each, and keep what the page showed: the organic order, the sponsored units in the page, the keyword’s Overall Pick badge (Amazon’s Choice for that keyword) and Amazon’s result count. Amazon US only. The set fills in week by week; every reverse-ASIN answer carries coverage (terms observed so far, terms in the set, since when).

GET /v1/keywords/rankings

?keyword=chest%20rigs%20tactical — the keyword’s latest observed page 1 (case and spacing are folded). 1 credit; history=true +0.5 when more than the latest observation exists.

KeyMeaning
organic[]the non-sponsored results in page order: organic_rank (1–n), asin, badges (overall_pick, best_seller), the product facts we hold (title, brand, price, rating, review_count, image_url) and the product’s latest observed buy box: buybox_seller, buybox_seller_id, fulfillment (AMZ = sold by Amazon, FBA, FBM), other_sellers_count, buybox_observed_date — as of the product’s own observation, not the search page’s.
sponsored[]the sponsored units present in the page HTML: unit (sponsored_products, sponsored_brands, sponsored_brands_video, sponsored_other), slot (the unit’s place on the page), position_in_unit, asin and its facts.
sponsored_slots_unresolvedsponsored slots the page HTML holds without the product (Sponsored Products that Amazon loads later by JavaScript): counted, product unknown.
page_summarywho holds the page: brands[] and buybox_sellers[] by organic slots (top 10), amazon_buybox_slots, fba_slots, fbm_slots, buybox_known, products_with_facts, overall_pick_asin and sponsored_brands_units[] by brand. Slots on one observed page — never sales or traffic.
change_since_previouswhen an earlier observation exists: previous_observed_date, entered[] and left[] (organic ASINs that came onto or dropped off page 1).
results_totalAmazon’s own “N results” for the search on that page.
observed_date / observed_at / scopewhen the page was observed (UTC) and what it was: page 1, all departments, the delivery ZIP.
head_term / observationswhether the term is a top-level autocomplete term, and how many weekly observations of it we hold.
history +0.5history=true: observations[] (each stored page oldest first: date, result count, organic order, Overall Pick, sponsored ASINs) and rank_series[] (each product on the latest page with its organic rank in every observation, null when it was not on page 1). history_points keeps the newest N (default 26, max 104).

GET /v1/product/keywords

?asin=B0CCVRQV7C — reverse ASIN: every keyword in the observed set whose latest page 1 shows the product, organically (with its rank) or in a sponsored unit, organic first and best rank first. placement = all (default), organic or sponsored; limit 1–200 (default 50) and offset page through it. 1 credit per started 25 keywords returned; history=true adds each keyword’s rank_history (+0.5 once when any keyword has more than one observation).

?asins=B0CCVRQV7C,B0FCS6D7Q5,B0BBR3GWW4 — compare up to 10 products, yours first: every keyword where any of them appears, sorted by how many share the page. Each row adds competitors[] (asin, organic_rank, sponsored), asins_on_page and gap (a competitor is on page 1 organically, the first product is not); gaps=true keeps only those rows. The page price applies once per ASIN compared.

KeyMeaning
totalsfor the first product: keywords, organic, organic_top_10, sponsored, overall_pick — counted over every keyword, before paging. matched = rows after the filters, before paging.
keywords[]keyword, organic_rank (null when only sponsored, or with asins when only a competitor is there), sponsored[] (unit, slot, position_in_unit), badges, results_total, observed_date, head_term, observations, and with history rank_history[].
products[]the requested products with the facts and latest buy box we hold.
totals_by_asin / gaps_totalwith asins: the totals for each product, and how many keywords are gaps for the first one.
coverageterms_observed, terms_in_set, observed_since, scope: how much of the set this answer could draw on. Head search terms and page 1 only, so a product shows fewer keywords than a full search index would.

What this is. Observed positions with their date and scope — “#4 organic on page 1 of amazon.com search (all departments) on 2026-10-16”. One search is a sample: the same query fetched minutes apart differs by a few products, so read a single week as a sighting and the weekly series as the signal. Sponsored means sponsored units present in the page HTML; it says nothing about spend, bids or impressions. Not volume figures (Amazon publishes none for search terms and none is implied), not a live ranking (for a live search page use /v1/serp), not personalised.

Verdicts (never billed)

  • 404 keyword_not_found — the keyword is not in the observed set yet, or not observed yet: /v1/serp?q= fetches the search live (1 credit per page); terms Amazon suggests are in /v1/keywords.
  • 404 asin_not_found — the product (or none of the products passed) was not seen on page 1 of any keyword observed so far: a coverage fact.
  • 422 — a marketplace other than us, an invalid ASIN, more than 10 ASINs, both asin and asins, gaps without competitors, an invalid placement, or an unknown parameter.
  • 503 derived_data_unavailable — the map is being refreshed on the server; retry later.
  • 429 derived_daily_cap — the key’s daily cap on the derived family (2,000 calls by default, resets 00:00 UTC).
curl "https://api.logimu.com/v1/keywords/rankings?keyword=chest%20rigs%20tactical" -H "X-API-KEY: $KEY"
curl "https://api.logimu.com/v1/keywords/rankings?keyword=chest%20rigs%20tactical&history=true" -H "X-API-KEY: $KEY"
curl "https://api.logimu.com/v1/product/keywords?asin=B0CCVRQV7C&placement=organic" -H "X-API-KEY: $KEY"
curl "https://api.logimu.com/v1/product/keywords?asins=B0CCVRQV7C,B0FCS6D7Q5,B0BBR3GWW4&gaps=true" -H "X-API-KEY: $KEY"
{
  "keyword": "chest rigs tactical", "marketplace": "amazon-us",
  "observed_date": "2026-10-16", "scope": "page 1 of amazon.com search, all departments, delivery ZIP 60601",
  "results_total": 2000, "organic_count": 48, "head_term": false, "observations": 1,
  "organic": [
    {"organic_rank": 1, "asin": "B09B5P353R", "badges": [], "title": "ACE TAC S.O.P. Tactical Chest Rig with 5.56/7.62 ...",
     "brand": "ACETAC", "price": 95.95, "rating": 4.6, "review_count": 1069,
     "buybox_seller": "ace tac", "buybox_seller_id": "AJE0GCLQJGECI", "fulfillment": "FBM", "other_sellers_count": 0,
     "buybox_observed_date": "2026-10-16"},
    ...
  ],
  "sponsored": [{"asin": "B0BBR3GWW4", "unit": "sponsored_brands", "slot": 0, "position_in_unit": 1, "brand": "WYNEX"}, ...],
  "sponsored_slots_unresolved": 1,
  "page_summary": {"organic_slots": 48, "products_with_facts": 37, "buybox_known": 37,
                   "brands": [{"brand": "Condor", "organic_slots": 5}, {"brand": "ACETAC", "organic_slots": 3}, ...],
                   "buybox_sellers": [{"seller": "ace tac", "seller_id": "AJE0GCLQJGECI", "organic_slots": 3}, ...],
                   "amazon_buybox_slots": 0, "fba_slots": 22, "fbm_slots": 15, "overall_pick_asin": "B0BBR3GWW4",
                   "sponsored_brands_units": [{"brand": "WYNEX", "units": 3}, ...]},
  "data_source": "Page 1 of Amazon US search results ...", "credits_charged": 1.0
}

A compared row from /v1/product/keywords?asins=B0CCVRQV7C,B0FCS6D7Q5,B0DQNVYMRG,B0BBR3GWW4:

{"keyword": "airsoft chest rig", "organic_rank": 23, "badges": [], "results_total": 1000, "observed_date": "2026-10-16",
 "competitors": [{"asin": "B0FCS6D7Q5", "organic_rank": 39, "sponsored": false},
                 {"asin": "B0DQNVYMRG", "organic_rank": 27, "sponsored": false},
                 {"asin": "B0BBR3GWW4", "organic_rank": 2, "sponsored": false}],
 "asins_on_page": 4, "gap": false}

Ranked lists 2026-10-05

Discovery endpoints — 25 rows per page, 1 credit per page returned, has_more for the next page, every row linking to the dossier above.

EndpointReturns
GET /v1/brands/movers?country=&window=30|90&direction=up|down&page=brands whose count of distinct buy-box sellers rose (or fell) most vs the prior window — sellers_recent, sellers_prior, delta, pct_change, category_root_id.
GET /v1/brands/top?country=&sort=buybox_days|sellers|control_score|asins|revenue|amazon_share&category_id=&page=brands ranked by what we observed; category_id (a root) narrows to brands filed under that root.
GET /v1/sellers/movers?country=&window=&direction=&page=sellers whose observed buy-box footprint grew (or shrank) most.
GET /v1/sellers/top?country=&sort=brands|buybox_days|asins|revenue&page=third-party sellers by cross-brand footprint (16 months) — the operators.
GET /v1/categories/top?country=&sort=asins|brands|heat|revenue|price|sellers&root_only=true&parent_id=&page=categories ranked; parent_id lists one category’s children instead of the roots.
GET /v1/categories/search?q=&country=&limit=category ids by name or path — free. Since 2026-10-07 the English alias of a non-English root matches too (q=Automotive finds amazon.de’s Auto & Motorrad; served as name_en), and every row carries amazon_node_id.

GET /v1/categories — the taxonomy 2026-10-07 · free, any key

The category names /v1/search’s category filter accepts on a marketplace and the ids /v1/category takes, walked one level at a time: ?country=de returns the marketplace’s root categories (20–71), ?country=de&parent_id=<category_id> that category’s children. Every active category, with category_id (ours), amazon_node_id (null for the few roots we file under a best-seller-list slug, served as amazon_list_slug), name (the marketplace’s own language), name_en (the English alias where we hold one — most roots on amazon.de), path, depth, is_root, children, and the observed asins / brands counts (null for a category we have not observed yet). Not billed, every plan (it is what a customer at zero credits needs to use the search filter), rate-limited like every call, cached ten minutes. Unknown parent_id → 404 category_not_found.

curl "https://api.logimu.com/v1/categories?country=de" -H "X-API-KEY: $KEY"
curl "https://api.logimu.com/v1/categories?country=de&parent_id=12345" -H "X-API-KEY: $KEY"

Where this sits next to Keepa and SmartScout

TheirsHere
Keepa category object: sellerCount, brandCount, soldByAmazonPercent, isFBAPercent, avgBuyBox, topBrands (3)/v1/category: the same counts and shares plus seller concentration (HHI), heat, churn, demand signals, root benchmarks, sub-categories and the top-10 brands
Keepa seller object: sellerBrandStatistics[] (product counts), competitors[] (top 5), buy-box ownership rates — “based on Keepa’s often incomplete and outdated product offers data” (Keepa’s wording)/v1/seller/brands (brands with observed BUY-BOX DAYS, not product counts) + /v1/seller/network (up to 50 connected sellers by shared brands)
Keepa: no brand endpoint, no brand-to-brand network, no trend grades/v1/brand, /v1/brand/network, seller_pressure_trend, /v1/brands/movers
Keepa: no keyword data; Helium 10 / Jungle Scout: estimated search volumes/v1/keywords: Amazon’s own suggestion lists as observed, positions within each list, since Aug 2026 — no estimates, no volumes claimed
SmartScout API: brand market share / history, seller coverage per brand, brand coverage per seller (estimates)the same questions answered from observed buy-box days, plus the explicit shared-seller network and the ranked movers
Rainforest / ScraperAPI, Oxylabs, Pangolin, Unwranglelive page scrapes only — nothing derived

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"
FieldNotes
credits_remainingcredits left on the key (null on unmetered internal keys)
planmetered or internal
suspendedtrue when the account is suspended — calls will be refused
usage_30dcalls and credits over the last 30 days, plus a per-endpoint breakdown
tracking 2026-10-14the plan’s product-tracking allowance: plan, plan_state (active / grace / paused / none), snapshots_per_day, used_snapshots_per_day, remaining_snapshots_per_day, subscription_until

On the MCP connector this is the account tool (any key).

Batch bulk product data

Submit a list of ASINs (or numeric item IDs for country=walmart), get an exact warehouse/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 and, since 2026-10-14, as the MCP connector’s batch tool (action: estimate, create, run, status, results, list, schedule, delete — the same handlers and request fields as below). 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 — and since 2026-10-07 seller, brand, category and keyword batches (kind: "seller" | "brand" | "category" | "keywords", paid plans) — lists of seller ids, brand names, category ids or seed terms served through /v1/seller, /v1/brand, /v1/category and /v1/keywords; see the sub-sections below. Since 2026-10-12 every other endpoint runs as a batch too (shopping and warehouse search, Best Sellers, seller products, the brand and seller maps, keyword comparison, the category tree and the ranked lists): see Every endpoint as a batch.

From the dashboard — no code needed 2026-09-16

Everything below is also a form. Sign in and open Batches:

StepWhat happens
New batchpick what you are batching — a group (Products, Search, Sellers, Brands, Categories, Keywords, Ranked lists), then the endpoint inside it, with that endpoint's options every endpoint, 2026-10-12 — name it, pick the marketplace, then paste the list (one per line, or any CSV — for ids we take the first column that looks like one; headers, extra columns, BOM and duplicates are fine) or drop a CSV file. Bad lines are shown before anything is priced. Seller / brand / category / keyword batches are part of the paid plans, like the endpoints they run.
Submita free estimate: the warehouse / stale / not-tracked split of your list, the credit upper bound and its dollar value. Nothing runs or bills yet.
Mode & max agecache / auto / live and the freshness slider re-price instantly from the age histogram. live scrapes every row on demand (1 credit per served row, ~28 s each, several in parallel; runs are serialized per marketplace, and the estimate shows the expected duration and how many rows would be scraped); auto scrapes only the rows older than your max age. On Walmart 2026-10-18 a live row is one walmart.com product page at 2 credits, 3 rows at a time, up to 5,000 rows a batch; Walmart live runs queue apart from Amazon runs, so neither holds the other back.
Attach historyproducts: tick Buy-box & per-seller price history and/or BSR rank history — included in the row price 2026-10-10. With the price history you can set how many sellers carry a series (default 10, max 50) and how many points each (default 500, max 20,000), also included. Or tick History only: just the stored series per row at 0.05 credit, whatever the age of the last observation, never a live scrape. Amazon marketplaces only; the blocks land in the JSONL rows, the CSV stays lean.
Create batch & runthe batch is saved and queued; the run page shows live progress (per-state counters, credits so far) and the Download CSV / JSONL buttons work mid-run with every row completed so far. You get an email when the run completes or pauses, with the download links.
Batch pageRun now re-runs the same list against a fresh estimate; the Schedule card sets daily / weekly / monthly firings with a per-firing credit ceiling (default 2× the estimate at save time) and an optional signed webhook; Delete cancels in-flight runs and keeps existing downloads until retention. Every run records the mode and max age it launched with.

Same rules as the API: nothing bills until a row is actually served, failed / not-found / not-tracked rows are never billed, a run that reaches your credit floor pauses (rows stay pending, partials stay downloadable) and resumes after a top-up, and results are kept for 30 days. The form and the endpoints below share one pipeline, so a batch created in the dashboard can be listed, re-run, scheduled or downloaded through the API and vice versa.

Freshness — on every row, by default

Not opt-in: every result row (JSONL and default CSV columns) carries

FieldNotes
observed_atwhen the row's data was observed (UTC)
age_daysage of that observation in days — 0 on a live scrape
sourcecache 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.

statusMeaningBilled
okserved, with product data0.5 (warehouse) / 1.0 (live; Walmart 2.0), history included · 0.05 with include: ["history_only"]
stale_skippedtracked, but older than max_age_days in cache mode0 — never
not_trackednot in the warehouse (coverage is best-seller-scoped, not the full catalog)0 — never
failedinvalid ID, or the live scrape did not return the product0 — never

Search batches and the endpoint batches add empty (the call answered with no results, never billed). Duplicate lines are served in the output but billed once. Unknown request fields are a loud 422 before anything bills. History blocks attached with include (offer_history, bsr_history, wider series) are included in the row price 2026-10-10 — the estimate keeps history_credits_max and history_surcharge_ceiling_credits, now 0. include: ["history_only"] returns only the stored series per row at 0.05: every tracked product serves whatever the age of its last observation, the batch runs as cache (a live mode is a 422), and a product with no stored series comes back not_tracked, unbilled. It cannot be combined with reviews or used; the series are in the JSONL file, the CSV carries the row status.

Modes

modeBehaviour
cachewarehouse only — rows older than max_age_days come back stale_skipped, disclosed and unbilled
livescrape every row — on Walmart 2026-10-18 one walmart.com product page per row at 2 credits (live Walmart), up to 5,000 rows a batch
autodefault — warehouse when fresher than max_age_days (default 30), scrape the rest

Endpoints

EndpointNotes
POST /v1/batch-estimateprice a list before running it — free, always; returns tracked / not-tracked / fresh / stale counts, an age histogram and the credit upper bound
POST /v1/batchescreate a named, re-runnable batch — body: name, country, mode, max_age_days, asins[] or gtins[] 2026-10-12 (barcodes: each resolves like gtin= — our observations and the other marketplaces when the batch is created, Amazon’s own search row by row in mode auto / live; every row carries gtin and gtin_resolution, the CSV adds gtin, gtin_source, gtin_confidence after asin, and two barcodes of one product are served once and billed once) (or kind + terms[] / urls[] / seller_ids[] / brands[] / category_ids[] / seeds[], or pages for the ranked lists, with the endpoint's own options in params: see Every endpoint as a batch and the sub-sections below), optional include: "reviews" (the featured-review set on each JSONL row — free), "offer_history" and/or "bsr_history" 2026-09-16 (the same history blocks as /v1/product on each JSONL row — Amazon only, included in the row price 2026-10-10 — no extra credits); with offer_history also history_sellers (default 10, max 50) and history_points (default 500, max 20,000) — same meaning as on the product endpoint, wider series included; "history_only" returns the series alone at 0.05 a row
GET /v1/batcheslist 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 (product and seller batches; seller_products: mode cache or live only; kinds without a mode answer 422) — applies to future runs only: every run records the mode + max age it was launched with and reports them in run detail
DELETE /v1/batches/{id}soft delete — in-flight runs are cancelled; existing results stay downloadable until retention collects them
POST /v1/batches/{id}/estimatefresh estimate for a saved batch against the current warehouse state — free; the warehouse/live split moves as the nightly walk refreshes rows, so re-estimate before re-running
POST /v1/batches/{id}/schedulerecurring runs: daily / weekly / monthly / none, plus enabled, an optional per-firing credit_ceiling and an optional webhook_url — see below
POST /v1/batches/{id}/runsqueue 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}/resumeresume 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.jsonlstreaming JSONL — downloadable mid-run with every row completed so far
GET /v1/batches/{id}/runs/{run_id}/result.csvstreaming CSV (product batches: the 33 summary columns below, incl. the freshness fields; every other kind: one row per key, or per item of its list, as its section says) — downloadable mid-run

Result formats

CSV — 33 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, buybox_fulfillment, amz_offers, fba_offers, fbm_offers, buybox_delivery_days, buybox_delivery_days_max, dispatch_latency, parent_asin, variation_count, description_source, image_url, description (the seven fulfilment columns are flat reads of the fulfillment block). 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. Used / refurbished / open-box / collectible offers ride along in current_sellers (and in the per-seller history when attached) when the batch was created with include: ["used"] 2026-09-28 — same rows as /v1/product?include_used=true, free. Featured reviews are included only when the batch was created with include: ["reviews"] (the one wide array — up to 50 × ~500 B per row); review_count_scraped is always present so you can see reviews exist without the payload. offer_history and bsr_history ride the JSONL row too when the batch attached them — the same blocks as the product endpoint, every seller listed, series up to the batch's history_sellers × history_points; the CSV never carries them.

ColumnNotes
current_sellerscompact JSON of the full per-seller offer list, in the cell — parse it as JSON; per-seller price / fba / prime / feedback / buybox_days_30d / buybox_share_30d / buybox_observations_30d / buybox_observation_share_30d / condition / condition_class / seller_rating. New-condition list by default; a batch created with include: ["used"] 2026-09-28 carries the used / refurbished / open-box / collectible rows as well (conditions_included: "all"), and lowest_offer_price stays the lowest new offer
lowest_offer_priceminimum per-seller price; empty when the row has no priced offer list
bought_past_monththe Amazon “N+ bought in past month” badge as an integer; empty when the product shows no badge
descriptionlast column — may be multi-line and quoted; empty when the source never showed one

Caps: 20,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.

Seller, brand, category and keyword batches kind: "seller" | "brand" | "category" | "keywords" · 2026-10-07

One key per line — a seller id, a brand name, a category id or a seed term — each served through the same service as the matching endpoint and billed exactly as that endpoint bills; the same batches / runs / downloads / emails / webhooks / schedules as product batches. Paid plans: a key without a subscription or purchased credits gets 403 paid_plan_required (never billed), like /v1/seller, /v1/brand, /v1/category and /v1/keywords themselves. Amazon marketplaces only.

FieldNotes
kind"seller", "brand", "category" or "keywords" on POST /v1/batches and POST /v1/batch-estimate
seller_idsseller batches: Amazon seller ids (A + 8–24 letters/digits — the seller_id on any offer in /v1/product). Capped at 5,000 per batch.
brandsbrand batches: names as Amazon prints them (case-insensitive, duplicates folded). Capped at 2,000 per batch.
category_idscategory batches: the warehouse’s category ids (list them with /v1/categories or /v1/categories/search, both free — not Amazon browse-node ids). Capped at 2,000 per batch.
seedskeyword batches: seed terms or prefixes, 3–120 characters each (case-insensitive, duplicates folded), served like /v1/keywords. Capped at 2,000 per batch.
modeseller batches only: cache (the stored profile; a seller we have never observed comes back not_tracked), live (fetch every seller page now) or auto (default — stored when younger than max_age_days, else live). Brand, category and keyword batches are always served from the warehouse — sending a mode there is a 422.
includeoptional ["history"] attaches the endpoint’s history block to each JSONL row — the seller’s rating / storefront-size change points, the brand’s or category’s monthly series, the keyword lists’ observation record — at +0.5 per row when it comes back (non-empty; for keywords: at least one closed observation), the endpoint rule.
KindRow servesBilledNot billed
sellerthe /v1/seller profile — rating, counts per period, histogram, recent feedback (no names), business block, tracking0.5 stored profile / 1.0 live fetch (auto bills what was served) +0.5 historyunknown or suppressed seller (not_tracked), a fetch Amazon blocked after retries (failed)
brandthe /v1/brand dossier — catalog, sellers and buy-box control, Amazon-retail share, FBA, concentration, churn, trend grades, benchmarks, top sellers1.0 per brand found +0.5 historyunknown brand (not_tracked)
categorythe /v1/category landscape — size, pricing, competition, demand, churn, benchmarks, sub-categories, top brands1.0 per category found +0.5 historyunknown id (not_tracked)
keywordsthe /v1/keywords answer — Amazon’s observed suggestion lists for the seed (positions within each list, first / last observed, marketplaces observed in) and related observed vocabulary1.0 per seed with observations +0.5 historya seed with no observations on that marketplace (not_tracked)

Daily cap. Brand, category and keyword rows bill under the endpoint they mirror, so they count against the key’s daily derived-intelligence cap (2,000 calls per UTC day by default) together with REST and MCP calls. The estimate reports derived_daily_cap {cap, used_today, remaining}; a run that reaches the cap pauses (rows stay pending, partials stay downloadable, you get an email) and POST .../runs/{run_id}/resume continues it after 00:00 UTC. Seller rows are not capped.

Estimate = upper bound. Seller batches price 0.5 per row in cache mode and 1.0 in auto / live (auto bills 0.5 wherever the stored profile is fresh enough); brand, category and keyword batches price 1.0 per row; +0.5 per row with include: ["history"]. Not-found rows never bill. Seller runs fetch at the marketplace’s live-search budget (us/uk 2 concurrent, others 1 — seller pages share it with /v1/serp); the estimate returns estimated_live_duration_seconds for live / auto seller batches.

Row states: ok (served and billed as above) · not_tracked (unknown key — never billed; reported as n_not_found on the run) · failed (invalid key, or the live seller fetch did not return the page after retries — never billed). Duplicate lines are answered on their canonical line.

Result formats: the JSONL row carries the complete record under "seller", "brand", "category" or "keywords" (plus line_no, term = the key, status, source, credits, error) — everything the matching endpoint returns, the history block included when requested. The CSV is a flat summary per line: seller — line_no, seller_id, status, source, observed_at, credits, name, is_amazon, rating, ratings_total, ratings_total_12m, positive_percent, positive_percent_period, storefront_url, business_name, observed_first_seen, error; brand — line_no, brand, status, source, as_of, credits, asins_3m, unique_sellers_3m, buybox_days_3m, amazon_retail_share_pct, fba_penetration_pct, control_score, seller_hhi_top3, seller_churn_30d_pct, trend_short, trend_long, avg_price, avg_rating, bought_past_month_30d, revenue_30d, catalog_churn_30d_pct, category_root_id, category_name, velocity_tier, observed_first_seen, months_observed, top_seller, error; category — line_no, category_id, status, source, as_of, credits, path, root_id, root_name, is_root, depth, asins, asins_30d, brands, unique_sellers_30d, avg_price, avg_rating, amazon_retail_share_pct, fba_penetration_pct, amazon_private_label_pct, seller_hhi_top5, avg_heat, velocity_tier, bought_past_month_30d, revenue_30d, catalog_churn_30d_pct, subcategories, top_brand, error; keywords — line_no, seed, status, source, credits, list_count, top_prefix, top_department, top_terms (the primary list’s terms in order, |-separated), related_count, history_closed_points, error.

curl -X POST "https://api.logimu.com/v1/batches" \
  -H "X-API-KEY: sk_live_..." -H "Content-Type: application/json" \
  -d '{"name":"brand-sweep","kind":"brand","country":"us",
       "brands":["Anker","Logitech","YETI"],"include":["history"]}'

curl -X POST "https://api.logimu.com/v1/batches" \
  -H "X-API-KEY: sk_live_..." -H "Content-Type: application/json" \
  -d '{"name":"operators","kind":"seller","country":"us","mode":"auto","max_age_days":14,
       "seller_ids":["A2L77EE7U53NWQ","A3P5ROKL5A1OLE"]}'

curl -X POST "https://api.logimu.com/v1/batches" \
  -H "X-API-KEY: sk_live_..." -H "Content-Type: application/json" \
  -d '{"name":"category-map","kind":"category","country":"us",
       "category_ids":[7926,37904]}'

curl -X POST "https://api.logimu.com/v1/batches" \
  -H "X-API-KEY: sk_live_..." -H "Content-Type: application/json" \
  -d '{"name":"seed-vocabulary","kind":"keywords","country":"de",
       "seeds":["elektrische zahnbürste","yogamatte","luftfritteuse"],"include":["history"]}'

Every endpoint as a batch 17 more kinds · 2026-10-12

Every /v1 endpoint runs as a batch, with the same batches, estimates, runs, downloads, emails, webhooks and schedules as product batches, and the same billing as the endpoint itself. The list goes in the field below, one key per line; the endpoint's own query parameters go in params and apply to every row. They are validated like the endpoint's, so an unknown name is a 422 before anything prices. The ranked lists take no list: pages (1–40) is how many pages of 25 rows to take, one result row per page, which makes a scheduled batch a daily or weekly snapshot. Kinds marked paid need a subscription or purchased credits, like their endpoints (403 paid_plan_required, never billed). Kinds marked cap count against the daily derived-intelligence cap; a run that reaches it pauses and resumes after 00:00 UTC. In the dashboard: pick the group, then the endpoint, and the form shows the same options.

kindList fieldEach row runsparamsBilled per row
shoppingterms/v1/shopping (11 Amazon marketplaces and Walmart; a barcode or a bare ASIN returns that product)limit, sort, min_price, max_price, brand, category, in_stock, include_unavailable, accessories, group, per_group, intent, format, collapse, detail2 with results, 5 with detail; no results or no exact match: 0
warehouse_searchterms/v1/search with the line as q (and Walmart)limit, sort, brand, seller, category, price_min, price_max, rating_min, rating_max, reviews_min, bsr_min, bsr_max, fba, fbm, fulfillment, seller_count_min, seller_count_max, max_per_category1 per 25 products returned; nothing matched, or matched only after dropping terms: 0
bestsellersurls/v1/bestsellers, live (us/uk 2 at a time, other marketplaces 1)pages (1 or 2, default 2)1 per page of 50 returned; a root list is free; not found, blocked or empty: 0
offersasins/v1/offers, live (a few at a time per marketplace)include_used0.5 per product with at least one offer; no offer right now, not found or blocked: 0
dealscategory_ids/v1/deals for each deals department id (all = the whole deals page), live (us/uk 2 at a time, other marketplaces 1)deal_types, collection, discount, min_discount, max_discount, min_price, max_price, prime_exclusive, minimum_rating, brand, page, page_size (30, 60, 90 or 120; default 60), pages (1–5)1 per page that returned deals (any page size); an empty list or a blocked fetch: 0
seller_productsseller_ids/v1/seller/products; mode cache (default) or livepage; live only: max_page, sort_by, refinements, q1 per page returned (paid)
seller_brandsseller_ids/v1/seller/brandspage; include ["history"]1 per page of 25 brands, +0.5 with history (paid, cap)
seller_networkseller_ids/v1/seller/networklimit1 (paid, cap)
brand_sellersbrands/v1/brand/sellerspage1 per page of 25 sellers (paid, cap)
brand_networkbrands/v1/brand/networklimit1 (paid, cap)
keywords_compareseeds/v1/keywords/comparecountries (2–11, default us,uk,de)1 (paid, cap)
keyword_rankingsterms/v1/keywords/rankings (Amazon US)include ["history"]1, +0.5 history (paid, cap)
product_keywordsasins/v1/product/keywords (Amazon US, one ASIN a row)placement, limit; include ["history"]1 per 25 keywords returned (paid, cap)
categoriescategory_ids/v1/categories: the children of each parent id (root = the top level)nonefree
category_searchterms/v1/categories/searchlimitfree (paid, cap)
brands_topnone (pages)/v1/brands/top, one row per pagesort, category_id1 per page of 25 (paid, cap)
brands_moversnone (pages)/v1/brands/moverswindow (30 or 90), direction (up or down)1 per page of 25 (paid, cap)
sellers_topnone (pages)/v1/sellers/topsort1 per page of 25 (paid, cap)
sellers_moversnone (pages)/v1/sellers/moverswindow, direction1 per page of 25 (paid, cap)
categories_topnone (pages)/v1/categories/topsort, root_only, parent_id1 per page of 25 (paid, cap)
curl -X POST https://api.logimu.com/v1/batches -H "X-API-Key: $KEY" -H "Content-Type: application/json" -d '{
  "kind": "shopping", "name": "Supplier list", "country": "us",
  "terms": ["wireless earbuds", "012345678905", "B07YYJRXQR"], "params": {"limit": 10}}'

curl -X POST https://api.logimu.com/v1/batches -H "X-API-Key: $KEY" -H "Content-Type: application/json" -d '{
  "kind": "brands_top", "name": "Top brands by revenue", "country": "uk", "pages": 4, "params": {"sort": "revenue"}}'

Estimate = upper bound: rows × the endpoint's largest answer (for example 2 per shopping query, 5 with detail), with estimated_live_rows and estimated_live_duration_seconds for the live kinds. Row states: ok (served and billed as the endpoint bills) · empty (the call answered with no results, never billed) · not_tracked (unknown key, never billed) · failed (invalid line, or a live fetch that did not return after retries, never billed); empty and not_tracked are reported together as n_not_found on the run. Result formats: the JSONL row carries the complete endpoint answer under the kind's name ("shopping", "bestsellers" ...) next to line_no, term (the key), status, source and credits; the CSV has one row per (key, item of the endpoint's list), for example one row per (query, product) or (URL, ranked product), and a line with no items is a single status row, so every submitted line is in the file. Caps per batch: shopping and warehouse_search 20,000 lines, bestsellers and deals 500, offers 10,000, the seller kinds 5,000, the others 2,000.

A batch of search terms, one live 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 warehouse copy of a SERP), search batches are always live: there is no mode, and sending one is a 422. All 11 Amazon marketplaces and, since 2026-10-18, Walmart (country: "walmart": walmart.com search, 2 credits per page returned, 3 terms at a time; include: ["blocks"] is Amazon-only).

FieldNotes
kind"search" on POST /v1/batches and POST /v1/batch-estimate
termsthe search queries (replaces asins). Capped at 500 terms per batch. Duplicate terms are answered on their canonical line rather than fetched twice.
pagespages fetched per term, 1–3 (default 1). Positions stay continuous across pages.
includeoptional ["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. Walmart search runs fetch 3 terms at a time on the live Walmart lane, which queues apart from the Amazon runs.

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,
  "history_blocks": [], "history_credits_max": 0.0, "history_surcharge_ceiling_credits": 0.0,
  "billing_note": "Upper bound: failed, not-found and not-tracked rows are never billed. Warehouse 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) → 429 with Retry-After. Credits are the volume limit.
  • 401 missing/invalid key · 402 out of credits · 403 paid_plan_required (seller + derived endpoints on a key without a paid plan; unbilled) · 404 not found (unbilled; the body may carry found_on + a hint — e.g. the ASIN is tracked on another marketplace, or a US live scrape can be requested with mode=live) · 422 bad params.
  • Every record carries an as_of timestamp — data is observed, not real-time. Sales figures are estimates.