Logimu

API documentation

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

Base URL & auth

https://api.logimu.com

Send your key in the X-API-KEY header. Get one with 2,500 free credits at sign up.

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

Credits

CallCredits
Curated product search (/v1/shopping)2 per query
Curated search, detailed (/v1/shopping?detail=true) — per-product intelligence attached5 per query
Product (/v1/product) — cached, everything included
snapshot + all intelligence blocks: full price-change timeline + 30-day events, bought-past-month, every current offer with seller IDs, brand stats
1
↳  snapshot only — charged when the product has no intelligence to attach (not a selectable option)0.5
↳  + BSR rank history (bsr_history=true, back to Oct 2023)+0.5 when returned
↳  + buy-box timeline & per-seller prices (offer_history=true)+0.5 when returned
↳  live scrape instead of cache+0.5
↳  Walmart (no live scrape available)1
Warehouse filter search (/v1/search)1 per 25 results, every marketplace
Live Amazon search results (/v1/serp) — a real live fetch, seconds not ms
billed per page actually fetched (request_metadata.pages_fetched), never per page requested — max_page=5 can stop at 2 when Amazon runs out of results; blocked fetches (502) and zero-result answers are never billed
1 per page fetched
Partial scrape, not found, empty, failed, or rate-limited
you are never charged for a request that did not return what you asked for, and credits are valid 12 months
0 — never billed

Every marketplace costs the same. Cache vs live is chosen per request with mode and max_age_days (below).

GET /v1/shopping curated search

Keyword in, ranked product recommendations out — in under 100 ms. Broad queries come back grouped by product category; specific ones by Budget / Mid-range / Premium price tier. Within each group our ranking selects the strongest products using Amazon-reported sales, ratings, review counts, and seller and brand signals.

ParamNotes
qrequired — the search query. A bare ASIN (or numeric Walmart item ID) returns exactly that product (mode: "asin").
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
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.
detailoptional — true attaches the /v1/product intelligence blocks (30-day price change events, current sellers) to every product. 5 credits per query instead of 2; response takes a few seconds. bought_past_month needs no flag — it is included on every product in every response.
curl "https://api.logimu.com/v1/shopping?q=toothbrush&country=us" \\
  -H "X-API-KEY: sk_live_..."
{
  "query": "toothbrush", "country": "us", "currency": "USD",
  "total": 1549, "mode": "category",
  "groups": [ { "category": "\u2026 > Powered Toothbrushes", "count": 110,
    "products": [ { "asin": "B072YVWBXH", "product_id": "B072YVWBXH",
      "product_url": "https://www.amazon.com/dp/B072YVWBXH",
      "title": "Aquasonic \u2026", "brand": "Aquasonic",
      "price": 35.95, "rating": 4.6, "review_count": 136657, "in_stock": true,
      "bought_past_month": 7000,
      "image_url": "https://\u2026", "amazon_url": "https://www.amazon.com/dp/B072YVWBXH",
      "observed_at": "2026-07-22T16:03:48Z" } ] } ],
  "facets": { "brands": [ {"value":"Oral-B","count":102,"avg_rating":4.56,"est_monthly_sold":14109} ] },
  "credits_charged": 2, "credits_remaining": 2498
}

Demand signal. Every product carries bought_past_month — the floor of Amazon’s “N+ bought in past month” badge (e.g. 7000 for “7K+”), measured buyer behavior as Amazon reports it, null where Amazon shows no badge. Included in every response — no detail flag required.

Identifiers. Every product carries product_id and product_url. product_id is the ASIN on Amazon and the numeric item ID on Walmart; product_url points at the right storefront (amazon.<tld>/dp/… or walmart.com/ip/…). Pass product_id straight to /v1/product for that item’s full history. The older asin and amazon_url keys are still returned unchanged for compatibility, but note both are misnamed on Walmart (they carry the item ID and a walmart.com URL) — prefer the product_* pair.

Results are scoped to the product category the query resolves to, so a search for graphics card returns graphics cards rather than whatever unrelated best-seller happens to share a word with the query.

Every product carries observed_at (UTC), the age of the snapshot; stale products (older than ~14 days) are pruned, so it is always recent. Coverage is Amazon best-seller (BSR) products; media (books, music, video) excluded for now. Same engine as the product search demo.

GET /v1/product product + intelligence

The single-ASIN product endpoint. One call returns the current snapshot (price, BSR, rating, reviews, buy-box seller, seller count, FBA, image, sales estimate — cache or live) and the intelligence blocks: a freshness stamp, the full price-change timeline (price_history, every buy-box price move we ever observed, seller-stamped) plus a 30-day convenience view, the Amazon-reported “bought in past month” badge (measured, not modeled — parsed integer + raw text; Amazon marketplaces only), the current all-seller snapshot, and brand stats — plus the listing content (2026-08-09): description with its source, the full image gallery, feature bullets, the complete category breadcrumb path, the variations matrix, featured reviews and a definite out-of-stock signal (all Amazon marketplaces; no extra charge). Cached responses return in under 100 ms.

ParamNotes
asin10-char ASIN, or a numeric Walmart item ID with country=walmart. Provide either asin or gtin (not both).
gtinoptional anchor — a barcode (UPC-12, EAN-13 or GTIN-14) instead of an ASIN. Punctuation and leading zeros are tolerated, so 012345678905, 12345678905 and 0012345678905 all resolve to the same product.
  • Resolved within the requested marketplace — the same barcode can be a different listing in us and uk.
  • A barcode legitimately maps to more than one ASIN (variations, re-listings, bundles). We return the best match — priced first, then most recently observed — and list every match in gtin_matches with gtin_match_count, so you can pick a different one rather than trusting ours.
  • We resolve barcodes from observed listings, so a perfectly valid barcode can still be unknown to us if that product has not been seen in that marketplace. That answer is a 404 and is never billed.
  • Billing is identical to an asin lookup once resolved.
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; not Walmart)
bsr_historyoptional — true adds per-category BSR rank history: one daily point per category, each tagged with its era.
  • Amazon US reaches Oct 2023 (~33 months). Other marketplaces start when tracking began there.
  • Before Apr 2026 the source is top-100 best-seller lists: leaf categories only, ranks censored at 100. Those segments carry legacy_censored_at_100, and a gap means "outside the top 100 or not scraped" — not a rank of zero.
  • From Apr 2026: full rank values, including the root category.
  • Legacy categories we could not map to a current name are kept and flagged unmapped_legacy rather than dropped.
  • +0.5 credits, only when history is actually returned. Amazon only — Walmart has no BSR and is never charged for it.
  • 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 and charged accordingly (no +0.5). 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; top 10 sellers by coverage) from our multi-seller offer stream. US buy-box depth reaches Dec 2024; full multi-seller depth Aug 2025+. +0.5 credits when returned. Amazon only.
full_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 cache is stale); cached responses already carry the full list from our continuous crawl. Adds roughly 15–20s to the call and is not billed extra — still one call.
  • 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.
max_age_dayscache freshness window for the snapshot (default 30)

Look a product up by barcode instead of ASIN:
curl "https://api.logimu.com/v1/product?gtin=012345678905&country=us" -H "x-api-key: $KEY"

curl "https://api.logimu.com/v1/product?asin=B07X4V2M3B&country=us&bsr_history=true&offer_history=true" \\
  -H "X-API-KEY: sk_live_..."

Sample response — a real cached answer for B07X4V2M3B (WD Elements desktop drive: 15 variations, full gallery, 12 featured reviews). Long arrays are truncated with an explicit marker; the API returns all of them. Billing fields omitted.

{
  "source": "cache",
  "asin": "B07X4V2M3B",
  "marketplace": "amazon-us",
  "data_source": "amazon US marketplace — observed listings",
  "title": "Western Digital 12TB Elements Desktop External Hard Drive, USB 3.0 external hard drive for plug-and-play storage - Western DigitalBWLG0120HBK-NESN",
  "brand": "Western Digital",
  "price": 529.99,
  "review_count": 127985,
  "image_url": "https://m.media-amazon.com/images/I/51U3tZNZ36L._AC_SY355_.jpg",
  "price_source": "aod",
  "price_observed_at": "2026-08-09 00:29:56",
  "currency": "USD",
  "bsr": null,
  "rating": 4.6,
  "reviews_count": 127985,
  "buybox_seller": "Nutrend Automotive Inc",
  "buybox_seller_id": "A2LH8DUZ1Q6T63",
  "seller_count": 21,
  "fba": false,
  "image": "https://m.media-amazon.com/images/I/51U3tZNZ36L._AC_SY355_.jpg",
  "description": "Western Digital elements desktop storage with USB 3.0 offers reliable, high-capacity, add-on storage, fast data transfer rates and universal connectivity with USB 3.0 and USB 2.0 devices. The sleek design features up to 12TB capacity plus Western Digital quality and reliability. Operating temperature: 5 degree Celsius to 35 degree Celsius Non-operating temperature: -20 degree Celsius to 65 degree Celsius.",
  "sales_estimate": 10,
  "upc": "718037872070",
  "parent_asin": "B0FGKVRWXQ",
  "as_of": "2026-08-09 00:29:49",
  "bsr_leaf": 4,
  "bsr_leaf_category": "External Hard Drives",
  "observed_at": "2026-08-08T22:29:56Z",
  "price_changes_30d": [],
  "stock_changes_30d": [],
  "price_history": [],
  "stock_history": [],
  "stock_state": "in_stock",
  "stock_observed_since": "2026-08-05T10:44:16Z",
  "bought_past_month": 100,
  "bought_past_month_raw": "100+ bought in past month",
  "bought_past_month_observed_at": "2026-08-08T22:29:49Z",
  "bsr_history": {
    "series": [
      {
        "category_id": 6239,
        "category_name": "External Hard Drives",
        "is_root": false,
        "first_date": "2023-10-24",
        "last_date": "2026-08-09",
        "n_points": 234,
        "points": [
          {
            "date": "2023-10-24",
            "rank": 8,
            "era": "legacy"
          },
          {
            "date": "2023-10-25",
            "rank": 13,
            "era": "legacy"
          },
          "… 232 more (truncated for this sample — the API returns all of them)"
        ],
        "legacy_censored_at_100": true,
        "legacy_category_ids": [
          7318,
          7357
        ]
      },
      {
        "category_id": 510,
        "category_name": "External Components",
        "is_root": false,
        "first_date": "2023-10-24",
        "last_date": "2024-03-12",
        "n_points": 8,
        "points": [
          {
            "date": "2023-10-24",
            "rank": 23,
            "era": "legacy"
          },
          {
            "date": "2023-11-08",
            "rank": 75,
            "era": "legacy"
          },
          "… 6 more (truncated for this sample — the API returns all of them)"
        ],
        "legacy_censored_at_100": true,
        "legacy_category_ids": [
          7143
        ]
      },
      "… 2 more (truncated for this sample — the API returns all of them)"
    ],
    "observed_from": "2023-10-24",
    "observed_to": "2026-08-09",
    "notes": "One point per day per category (best rank; current era wins overlaps). Legacy era (US, Oct 2023 - Apr 2026) comes from top-100 best-seller lists: leaf categories only, rank-censored at 100 (gaps = out of top 100 or not scraped). Current era (since 2026-04-17) carries full rank values including the root category, all Amazon marketplaces."
  },
  "offer_history": {
    "buybox_timeline": [
      {
        "seller": "platinum micro, inc.",
        "seller_id": null,
        "from": "2024-12-31",
        "to": "2024-12-31",
        "days_observed": 1
      },
      {
        "seller": "stc distributors (serial # recorded)",
        "seller_id": null,
        "from": "2025-01-02",
        "to": "2025-01-02",
        "days_observed": 1
      },
      {
        "seller": "platinum micro, inc.",
        "seller_id": null,
        "from": "2025-01-04",
        "to": "2025-01-06",
        "days_observed": 2
      },
      "… 21 more (truncated for this sample — the API returns all of them)"
    ],
    "sellers": [
      {
        "seller": "dealspro1",
        "seller_id": null,
        "first_seen": "2024-12-29",
        "last_seen": "2025-10-04",
        "days_observed": 17,
        "buybox_days": 13,
        "points": [
          {
            "date": "2024-12-29",
            "price": 246.0,
            "buybox": false
          },
          {
            "date": "2025-01-07",
            "price": 239.95,
            "buybox": true
          },
          "… 15 more (truncated for this sample — the API returns all of them)"
        ]
      },
      {
        "seller": "giz-promo",
        "seller_id": "A1H3REWH8UBGUB",
        "first_seen": "2025-01-17",
        "last_seen": "2026-08-08",
        "days_observed": 12,
        "buybox_days": 6,
        "points": [
          {
            "date": "2025-01-17",
            "price": 239.5,
            "buybox": true
          },
          {
            "date": "2025-01-29",
            "price": 237.95,
            "buybox": true
          },
          "… 10 more (truncated for this sample — the API returns all of them)"
        ]
      },
      "… 8 more (truncated for this sample — the API returns all of them)"
    ],
    "sellers_total": 40,
    "observed_from": "2023-12-16",
    "observed_to": "2026-08-08",
    "notes": "Observation stream, one point per seller per day (buy-box price wins, else lowest observed; New condition only). Buy-box timeline spans OBSERVED days — gaps between segments are unobserved, not necessarily ownership changes. US buy-box depth reaches Dec 2024; full multi-seller depth Aug 2025+; newer marketplaces from their launch. Top 10 sellers carry point series."
  },
  "current_sellers": {
    "as_of": "2026-08-08T22:29:56Z",
    "offer_count": 21,
    "buybox_seller": "Nutrend Automotive Inc",
    "sellers": [
      {
        "seller": "Nutrend Automotive Inc",
        "seller_id": "A2LH8DUZ1Q6T63",
        "price": 529.99,
        "is_buybox": true,
        "is_fba": false,
        "is_prime": false,
        "seller_positive_pct": 91.0,
        "seller_feedback_count": 21318,
        "buybox_days_30d": 5
      },
      {
        "seller": "Adorama",
        "seller_id": "A17MC6HOH9AVE6",
        "price": 529.99,
        "is_buybox": false,
        "is_fba": false,
        "is_prime": false,
        "seller_positive_pct": 90.0,
        "seller_feedback_count": 579297,
        "buybox_days_30d": 0
      },
      "… 19 more (truncated for this sample — the API returns all of them)"
    ]
  },
  "brand_stats": {
    "brand": "Western Digital",
    "products_tracked": 102,
    "avg_rating": 4.41,
    "total_ratings": 1015987,
    "in_stock_pct": 100.0,
    "distinct_buybox_sellers": 48,
    "top_buybox_sellers": [
      {
        "seller": "Amazon.com",
        "products": 19
      },
      {
        "seller": "ALL4COMPUTERS ----- SIGNATURE REQUIRED -----",
        "products": 3
      },
      {
        "seller": "Actiview CCTV",
        "products": 3
      },
      {
        "seller": "CorteseInc",
        "products": 3
      },
      {
        "seller": "GO SMART",
        "products": 3
      }
    ]
  },
  "product_url": "https://www.amazon.com/dp/B07X4V2M3B",
  "description_source": "product_description",
  "images": [
    "https://m.media-amazon.com/images/I/21A5YMvc7ZL.jpg",
    "https://m.media-amazon.com/images/I/41CLje4zOhL.jpg",
    "https://m.media-amazon.com/images/I/51X-qRLsP-L.jpg",
    "… 9 more (truncated for this sample — the API returns all of them)"
  ],
  "feature_bullets": [
    "High-capacity add-on storage.Specific uses: Personal",
    "Fast data transfers",
    "… 2 more (truncated for this sample — the API returns all of them)"
  ],
  "breadcrumbs": [
    "Electronics",
    "Computers & Accessories",
    "Data Storage",
    "External Hard Drives"
  ],
  "variations": [
    {
      "child_asin": "B09VCXWPQG",
      "dimension_index": "11",
      "dimension_values": {
        "size_name": "20TB"
      },
      "is_selected": 0,
      "is_available": 1
    },
    {
      "child_asin": "B0BTFPTSNQ",
      "dimension_index": "12",
      "dimension_values": {
        "size_name": "22TB"
      },
      "is_selected": 0,
      "is_available": 1
    },
    {
      "child_asin": "B0D7N5XRSV",
      "dimension_index": "13",
      "dimension_values": {
        "size_name": "24TB"
      },
      "is_selected": 0,
      "is_available": 1
    },
    "… 12 more (truncated for this sample — the API returns all of them)"
  ],
  "variation_count": 15,
  "content_observed_at": "2026-08-09 15:04:50",
  "reviews": [
    {
      "author": "KD9WTS",
      "rating": 5.0,
      "title": "Good drive! You'll buy it.",
      "date_raw": "Reviewed in the United States on May 30, 2020",
      "verified": true,
      "variant": "Capacity: 5TB",
      "body": "First order of business: I ordered this drive (WD Elements 5tb) and received it in about 18 hours. I checked the shipping label, and it is their proprietary del…",
      "helpful_count": 107
    },
    {
      "author": "ChangedMind",
      "rating": 5.0,
      "title": "A Tale of 2 drives (WD 20TB Elements Desktop & WD 2TB Elements Portable)",
      "date_raw": "Reviewed in the United States on December 30, 2025",
      "verified": true,
      "variant": "Capacity: 20TB",
      "body": "June 22, 2026 (UPDATES): I paid $279.99 for the 20TB drive on May 7, 2025 (on sale from $304.00). This drive is $814.99 as of today. It's been in daily use all …",
      "helpful_count": 99
    },
    "… 10 more (truncated for this sample — the API returns all of them)"
  ],
  "review_count_scraped": 12,
  "out_of_stock": false,
  "history_available": true
}

Description & image. description is returned on both cached and live responses, and image_url on live scrapes as well as cache.

Listing content fields 2026-08-09

Always present on Amazon-marketplace answers, cached or live, at no extra charge. content_observed_at stamps when the content was captured; when it is null and the arrays are empty, content has not been captured for this ASIN yet (coverage fills in as the crawl cycles) — that is “not yet observed”, never “this product has no gallery”.

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 (≤12) — not the full review history, and not a random sample. The count varies per fetch (0–13 on the same ASIN) because Amazon does not always render the section; cached answers serve the most recently observed set. Each review: author, rating, title, date_raw, verified, is_local (true = the marketplace's own “Top reviews from <country>” section, false = “Top reviews from other countries” — on smaller marketplaces most featured reviews can be foreign), variant, body, helpful_count. date_raw is verbatim (“Reviewed in the United States on December 30, 2025”) — it carries the review country and a localised month name; parse it downstream if you need a datetime, and keep the country. The “Customers say” AI summary and aspect chips are not available (Amazon lazy-loads them after the HTML we capture).
out_of_stocktri-state: true = Amazon's dedicated out-of-stock buybox was observed (on mode=live, measured on that scrape — a real answer, distinct from a failed lookup), false = in stock when last seen, null = unknown.

About the stock fields. stock_state, stock_changes_30d and stock_history are still returned, but do not build on them. Our crawl follows best-seller rank, and a product that goes out of stock generally drops out of that walk — so we stop seeing it rather than observing it go out of stock. Measured: out-of-stock appears on 0.24% of availability-bearing observations, well below the true rate for a catalogue this size. Treat these fields as "in stock when last seen", not as a reliable availability timeline. One exception: on mode=live, when the scrape finds the product marked unavailable, stock_state comes back a definite "out_of_stock" (with in_stock: false) — a measured answer from that scrape, not the walk-derived timeline.

Credits: a cached call with everything attached is 1 credit. Drop the intelligence blocks and it is 0.5; force a live scrape and it is +0.5; an intelligence-only answer (or Walmart) is 1. A partial live scrape (identity but no price) sets snapshot_status: "partial" and is never billed for the snapshot half. snapshot_status is returned on live scrapes only — it reports the completeness of that scrape, so cached responses omit it. Change events are transitions from our 30-day observation stream — one observation per calendar day (the richest scrape pass of that day), so multiple same-day passes never fabricate changes; a price that moved and moved back between two observations is not seen — while price_history and stock_history extend the same transition streams back to the first time we observed the product (stock_observed_since; stock_state is the latest derived state), each stamped with the buy-box seller at that time. buybox_days_30d = days a seller held the buy box. All 11 Amazon marketplaces (us, uk, de, ca, au, fr, it, es, jp, mx, br), plus Walmart (numeric item ID; Walmart returns the intelligence blocks only — the listing-content fields are Amazon-only). Not billed if the product is untracked.

GET /v1/serp live Amazon search

A live Amazon search-results (SERP) fetch — a real browser navigates Amazon’s search page right now and returns the parsed result grid plus everything around it. This is a third, different thing from the two warehouse search endpoints, and the three do not substitute for each other:

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 cached copy of a SERP, so there is no mode parameter here — every call is a live fetch, and sending mode is a 422 rather than a silently ignored field. Parameter names match Rainforest’s type=search, so an existing integration ports with a rename, not a rewrite.

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, bramazon-xx forms accepted. Amazon only: Walmart has no live SERP path.
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.
  • Credits: 1 per page actually fetched (request_metadata.pages_fetched) — never per page requested; blocked fetches and zero-result answers are never billed.

GET /v1/account free

Your balance, plan and recent usage — so a script can check what it has left before it spends. Never billed.

curl "https://api.logimu.com/v1/account" -H "x-api-key: $KEY"
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

Batch bulk product data

Submit a list of ASINs (or numeric item IDs for country=walmart), get an exact cache/live split and credit price before anything runs or bills, then run it and stream results as JSONL or CSV — partials included, mid-run. Rows are served through the same path as /v1/product. Also available as a dashboard UI. Since 2026-08-09 the same infrastructure also runs search batches (kind: "search") — a list of search TERMS served through the live /v1/serp path; see the sub-section below.

Freshness — on every row, by default

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

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 (cached) / 1.0 (live)
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

Duplicate lines are served in the output but billed once. Unknown request fields are a loud 422 before anything bills.

Modes

modeBehaviour
cachewarehouse only — rows older than max_age_days come back stale_skipped, disclosed and unbilled
livescrape every row — Walmart has no live scrape, so country=walmart + mode=live is rejected with a 422
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[], optional include: ["reviews"] (adds the featured-review set to each JSONL row — off by default, no extra charge)
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 — applies to future runs only: every run records the mode + max age it was launched with and reports them in run detail (Walmart + mode=live stays a loud 422)
DELETE /v1/batches/{id}soft delete — in-flight runs are cancelled; existing results stay downloadable until retention collects them
POST /v1/batches/{id}/estimatefresh estimate for a saved batch against the current warehouse state — free; the cache/live split moves as the nightly walk refreshes rows, so re-estimate before re-running
POST /v1/batches/{id}/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 (26 summary columns incl. the freshness fields) — downloadable mid-run

Result formats

CSV — 26 summary columns, in order: line_no, asin, status, source, observed_at, age_days, credits, title, brand, price, currency, in_stock, out_of_stock, bsr, rating, review_count, bought_past_month, buybox_seller, seller_count, lowest_offer_price, current_sellers, parent_asin, variation_count, description_source, image_url, description. The CSV stays lean: array fields live in the JSONL only. JSONL — each row carries the complete /v1/product payload: full per-seller offer list, 30-day price & stock change events, brand stats, and the listing content blocks — image gallery (images), feature_bullets, breadcrumbs and the variations matrix. Featured reviews are included only when the batch was created with include: ["reviews"] (the one wide array — ~12 × ~500 B per row); review_count_scraped is always present so you can see reviews exist without the payload.

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
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: 10,000 rows per batch. Results are retained for 30 days (410 after). A run that hits your credit floor pauses — rows stay pending, partials stay downloadable, and it resumes after a top-up; it never bills into a negative balance. A live row typically takes ~28 s (measured at the current operating point); rows run concurrently, and the estimate returns estimated_live_duration_seconds for your list.

Search batches kind: "search"

A batch of search terms, one live Amazon SERP fetch per term per page — same batches/runs/downloads/emails/webhooks/schedules as product batches. Because every row is a live fetch (there is no cached SERP), search batches are always live: there is no mode, and sending one is a 422. Amazon marketplaces only.

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.

curl -X POST "https://api.logimu.com/v1/batches" \
  -H "X-API-KEY: sk_live_..." -H "Content-Type: application/json" \
  -d '{"name":"category-sweep","kind":"search","country":"us","pages":1,
       "terms":["wireless earbuds","yoga mat","usb c hub"],"include":["blocks"]}'

Schedules & webhooks

A schedule fires at most once per period (server date: daily after midnight, weekly on Monday, monthly on the 1st). Each firing computes a fresh estimate and refuses to run — recording a cancelled run and emailing you — when that estimate exceeds the credit_ceiling (default: 2× the estimate at schedule-set time) or your balance. A schedule never surprises you with a bill.

Setting webhook_url returns the signing secret once — store it. We POST the run summary to your URL on completion and on pause, signed X-Logimu-Signature: sha256=<hex HMAC-SHA256(secret, raw body)>, with 3 retries on failure.

curl -X POST "https://api.logimu.com/v1/batch-estimate" \
  -H "X-API-KEY: sk_live_..." -H "Content-Type: application/json" \
  -d '{"asins":["B0BDHQSZCV","B072YVWBXH"],"country":"us","mode":"auto"}'
{
  "country": "us", "mode": "auto", "max_age_days": 30,
  "rows_submitted": 2, "rows_valid": 2, "rows_invalid": 0, "rows_duplicate": 0,
  "tracked": 2, "not_tracked": 0, "fresh_within_max_age": 2, "stale": 0,
  "estimated_credits_max": 1.0, "estimated_usd_max": 0.0,
  "billing_note": "Upper bound: failed, not-found and not-tracked rows are never billed. Cached rows 0.5 credits, live rows 1.0.",
  "age_histogram_days": { "3": 1, "11": 1 }, "estimate_valid_minutes": 60
}
# create the batch, then run it
curl -X POST "https://api.logimu.com/v1/batches" \
  -H "X-API-KEY: sk_live_..." -H "Content-Type: application/json" \
  -d '{"name":"my-skus","country":"us","mode":"auto","max_age_days":30,
       "asins":["B0BDHQSZCV","B072YVWBXH"]}'
# => {"id": 12, ...}
curl -X POST "https://api.logimu.com/v1/batches/12/runs" -H "X-API-KEY: sk_live_..."
# => {"id": 34, "status": "queued", "estimate": { ... }}
curl "https://api.logimu.com/v1/batches/12/runs/34" -H "X-API-KEY: sk_live_..."
curl -o out.csv "https://api.logimu.com/v1/batches/12/runs/34/result.csv" -H "X-API-KEY: sk_live_..."

Rate limits, errors & honesty

  • Per-key rate limit ~10 req/s (burst 20) → 429 with Retry-After. Credits are the volume limit.
  • 401 missing/invalid key · 402 out of credits · 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.