---
title: "Product"
method: GET
path: "/v1/product"
---

# Product

`GET /v1/product`

## Request

- Base URL: `https://api.logimu.com` (the document declares no server; this is the origin it was published from)
- URL: `https://api.logimu.com/v1/product`
- Auth: none declared

THE product endpoint (unified 2026-07-23). One call: current snapshot (price, BSR, rating,
buy-box — cache-or-live via `mode` + `max_age_days`) plus observed_at, the FULL price-change
timeline (price_history, seller-stamped, back to first observation) with a 30-day convenience
view, the full in/out-of-stock timeline (stock_history, with stock_state +
stock_observed_since), the Amazon-reported bought-past-month
badge (bought_past_month int + raw text — measured, not modeled; Amazon marketplaces only),
the current all-seller snapshot, and brand stats. `country=walmart` returns
the intelligence blocks (numeric item ID). Partial live scrapes are never billed.
Walmart products also carry (2026-09-20, additive) image_url / images[], description,
category_path + breadcrumbs[], highlights[] (name/value spec pairs as shown on the PDP),
warnings[] (compliance text, e.g. Prop 65), upc, model_number, color, rating / review_count /
rating_observed_at (null when the page showed none), was_price / discount_pct, additional_offer_count,
per-seller shipping_cost (a cost, 0 = free; never a landed price), and in_stock / as_of beside the
unchanged stock_state / observed_at. gtin= resolves Walmart barcodes to item IDs.
LIVE Walmart (2026-10-18): country=walmart&mode=live reads the walmart.com product page right now (typically
8-15 s) - price, stock, rating, the featured seller and the sellers the page lists, plus the PDP content above -
laid over our stored history for the item (history_available says whether we held any). 2 credits; a partial
page (title, no price, in stock), an item walmart.com does not have (404) and a failed or busy fetch (503) are
never billed. mode=auto on Walmart works like Amazon: the stored record when observed within max_age_days
(0.5), else a live read (2); mode=cache never fetches. A failed live read on an item we hold answers the stored
record as source=cache_after_live_fail (0.5) with a note. One product page per call: the cheapest other seller
Walmart shows only on a second page is not fetched (additional_offer_count says how many there are). location
names the store walmart.com priced the page for (postal_code, city, state, store_id): each read can land on
another store, and fresh grocery is priced per store.
buybox_price_points_hot (2026-10-14): every all-offers-page observation of the last 30 days
{ts, price, seller, seller_id, fulfillment, offer_count}, newest last — sub-daily for hot-lane ASINs
(observed every few hours), the walk's and on-demand observations for the rest; null when none. tracking:
the hot lane's state for the ASIN {hot, interval_min, rate, source, last_fetched_at, next_due_at}, null when
the ASIN is not in the lane. Both on every Amazon answer, included in the record; history_only carries
buybox_price_points_hot. The cache snapshot's as_of and the fresh flag behind mode=auto follow the latest
observation we hold (not only the nightly summary), so a hot-lane fetch makes the record fresh.
buybox_state (2026-10-14, §86): what the lane's newest all-offers read saw — in_stock | no_buybox (offers, but no
featured offer) | out_of_stock (no offers) — with buybox_state_observed_at; when that read is newer than the daily
history's last point it decides stock_state / in_stock and stock_state_source names it. stock_state, in_stock and the
tri-state out_of_stock always agree (2026-10-15). buybox_condition (2026-10-15): new | used | null (no featured offer)
with buybox_condition_source (product_page | offers_page) and buybox_condition_detail (the pinned offer's condition
text, used_only_buybox, or the used storefront's name — Amazon Resale / Warehouse / Retourenkauf …, which win the buy
box like any seller and read as Amazon retail before): live = measured on the fetch; cache = the pinned offer's stored
condition at the row's observation, else the storefront name. On LIVE answers variation_status (page_is_sibling |
page_is_other | null) + page_asin say when Amazon served another ASIN's page for the one asked (cache answers carry
both as null); the stock keys describe the ASIN asked for, the content fields the page served.

PDP content (2026-08-09, Amazon marketplaces): description + description_source
(product_description = prose, feature_bullets = "About this item", aplus = brand
marketing — bullets read very differently from prose), the full image gallery
(images[], ≤20 originals), feature_bullets[], breadcrumbs[] (full category path),
the variations matrix (variations[] with child_asin + dimension_values +
availability, variation_count, parent_asin — an EMPTY variations is normal, most
ASINs have no variants; per-variant PRICE is NOT included, Amazon only sends it on
selection), featured reviews (reviews[], ≤50 — the accumulated set Amazon shows a logged-out
visitor, NOT the full review history; the count varies per fetch because Amazon
does not always render the section; date_raw is verbatim and carries the review
country + a localised month name — parse downstream, keep the country), and a
tri-state out_of_stock (true = out of stock: Amazon's dedicated out-of-stock buybox on
the page, or the newest offers read found no offer - it always agrees with stock_state;
false = in stock, null = unknown). bought_past_month null means NO BADGE — Amazon
only badges higher-velocity listings — never "we missed it". content_observed_at
null with empty arrays means content has not been captured for this ASIN yet.
The "Customers say" AI summary/aspect chips are NOT available (lazy-loaded after
our snapshot). No extra charge for any content field.

2026-09-27 (additive, Amazon marketplaces, no extra charge): `dimensions` (item weight + package
dimensions as printed plus parsed value/unit and metric weight_g / *_cm), `deal_history` (list price,
savings and coupon/promotion text as segments of consecutive observations, with parsed
coupon_amount / coupon_percent and a `current` view), `bought_past_month_history` (the badge as
segments; null = page observed without a badge), `rating_history` (one point per observed day:
rating_count + rating, with ratings_gained_30d / 90d), and `variation_coverage` (the variation
matrix as last observed with, per child, whether we track it and its latest 30-day price — current
state, not history). With offer_history=true every point also carries the offer's `shipping`
(cost), `fba` and `prime` for that day, and each series row `fba_days` / `fba_last` /
`shipping_last` (null on legacy-era days before 2026-04-17). Explicit null on Walmart.
Also since 2026-09-27: `sales_estimate` is null whenever the bought-past-month badge is present (the
badge is the measured figure; the estimate is served only for unbadged listings), and `reviews[]` lists
the marketplace's own reviews (is_local true) before the other-countries set.

## Query parameters

- `asin` string, nullable: Amazon ASIN (or numeric item ID for country=walmart). Provide either asin or gtin.
- `gtin` string, nullable: GTIN / UPC / EAN / ISBN-13 barcode (8, 12, 13 or 14 digits; punctuation and leading zeros are tolerated). Resolved to an ASIN in the requested marketplace, cheapest evidence first: the barcode on a listing we observe there, a print book's ISBN-10, the same product's barcode on another Amazon marketplace, and - with mode=auto (the default) or mode=live - Amazon's own search for the barcode (organic results only, never sponsored; the one whose listing carries the barcode wins; adds ~10-20 s the first time, then cached 60 days). gtin_resolution says which step answered, how confident it is, and whether the barcode is printed on that listing (barcode_verified true / false / null). A barcode can legitimately map to several ASINs - the best match is returned and every match is listed in gtin_matches. The lookup is included in the product's price; a barcode nothing resolves is a 404 and never billed. country=walmart resolves against the UPC of observed walmart.com listings and returns numeric item IDs.
- `country` string: Marketplace: us, uk, de, ca, au, fr, it, es, jp, mx, br, walmart.
- `mode` string
- `max_age_days` integer
- `bsr_history` boolean: Attach the full per-category BSR rank history (both eras, era-tagged daily points, legacy top-100 segments flagged censored). Included in the record - no extra credits. Amazon marketplaces only.
- `offer_history` boolean: Attach the buy-box owner timeline + per-seller price series (daily points from our multi-seller offer stream; US buy-box depth to Dec 2024). Every observed seller is listed; point series for the 10 most-observed sellers, 500 points each, by default - widen with history_sellers / history_points. Also attaches buybox_price_history: the lowest buy-box price of every observed day, Amazon US from Nov 2023 (the legacy daily snapshot), every point labelled with its source. Included in the record - no extra credits. Amazon marketplaces only.
- `history_only` boolean: Return ONLY the stored history series - bsr_history, offer_history and buybox_price_history - with no snapshot, content, current_sellers or brand stats, for 0.05 credit (Amazon marketplaces, served from stored observations: mode=live is refused). The cheap lane for price / rank tracking at volume; history_sellers / history_points still shape the offer series. Not billed when nothing is stored for the ASIN.
- `full_offers` boolean: Return the COMPLETE seller list instead of the buy box + first page (~10 offers). Only affects a live scrape (mode=live, or mode=auto when the cache is stale). Adds roughly 15-20s. NOT billed extra - still one call. Use it for unauthorized-seller, MAP and hijacker work, where sellers deeper than the top 10 are the whole point; leave it off for repricing and sourcing, where the buy box plus top offers is enough.
- `history_sellers` integer: With offer_history: how many of the most-observed sellers carry a point series (default 10, max 50). Every observed seller is always listed as a summary row (name, seller_id, first/last seen, days_observed, buybox_days, points_total).
- `history_points` integer: 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). Wider series are included too - no extra credits (the points beyond the default 10 sellers x 500 are still disclosed as offer_history.points_extra, with extra_credits 0).
- `marketplace` string, nullable: Alias for country, accepting /v1/search-style values (amazon-de, amazon-us, … or bare de/us/walmart).
- `include_used` boolean: Include used, refurbished, open-box and collectible offers in current_sellers (and, with offer_history, one series per seller+condition_class). Default false keeps the new-condition list unchanged. Every seller row always carries `condition` (the marketplace's own label) and `condition_class` (new, used_like_new, used_very_good, used_good, used_acceptable, used, refurbished, open_box, collectible, unknown); current_sellers always carries used_offer_count, lowest_new (the cheapest new offer - the list is buy-box first, not price-sorted) and lowest_used (the cheapest second-hand offer of the snapshot) whether or not you opt in. Applies to cached, live and historical data alike. Not billed extra.
- `track` boolean: Answer AND track (2026-10-14): after this answer the ASIN is pinned into our hot lane, which re-reads its all-offers page every `interval` for 30 days and adds every read to buybox_price_points_hot - the same as POST /v1/track. 0 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.
- `interval` string, nullable: With track=true: 1h, 2h, 4h (default), 12h or 24h.

## Headers

- `x-api-key` string, nullable
- `authorization` string, nullable

## Response `200`

Successful Response

- unknown

## Other responses

- `422`: Validation Error

---

[API](https://skmtc.dev/logimu/apis/logimu-api.md) · [All operations](https://skmtc.dev/logimu/apis/logimu-api/llms.txt) · [OpenAPI document](https://skmtc.dev/logimu/apis/logimu-api/revisions/3d3f90ad2335?raw)
