Data dictionary

Data API · monthly dataset

32 fields per row — what every export and metrics response is made of.

Row grain

One row per product × platform × country × month. Monthly metrics (gmv_monthly*, sold_monthly, review_monthly) are that month's figures; stock and rating are the month-end snapshot, while price is the lowest price recorded during the month.

Money fields are in the market's local currency unless the name says _usd. A full export delivers the 32 fields below as Parquet or CSV; rank is added only to Top-N slices — estimate a pull →

Download a real sample — 100 rows, exactly as a Top-N export ships:Parquet (38 KB)CSV (63 KB)ID · Shopee · Facial Serum · 2026-05 · top-100 by GMV — all 32 fields plus rank. A full export ships the same 32 without it.
Product identity

What the row is about — stable identifiers plus display fields.

FieldTypeDescriptionNullableOrigin
product_idSTRINGThe listing's own ID on its platform, carried through unchanged from source. The primary key for joining every other field back to one specific listing.Noscraped
sku_nameSTRINGThe listing's title exactly as scraped, with no cleanup — good for a human eyeballing the row, but wording and casing vary listing to listing, so use sku_type_complete instead when matching or grouping products.Noscraped
sku_type_completeSTRINGStandardized product type, matched against a maintained reference dictionary rather than derived from the raw title — better for grouping identical products than sku_name. Shows a placeholder when no dictionary match is found.NolabelledMagpie's internal library
brandSTRINGBrand name, resolved by matching the listing's product/merchant identity against Magpie's brand reference data rather than read directly off the title. Shows the placeholder when no brand has been confirmed yet.NolabelledMagpie's internal library
imageSTRINGDirect URL to the listing's main product photo, as hosted by the platform — carried straight through from the raw scrape.Yesscraped
urlSTRINGCanonical listing URL on the platform.Noscraped
created_dateDATEDate the listing first appeared on the platform. (Shopee & Tokopedia only — not currently captured for Lazada, TikTok, or Blibli; empty for listings on those marketplaces.)Yesscraped
flag_GWPBOOLTrue when the listing is a gift-with-purchase / bundle freebie.Nolabelled
Classification

Where the row sits — market, platform, category tree, month.

FieldTypeDescriptionNullableOrigin
countrySTRINGMarket code: ID, TH, VN, SG, PH, MY. Sets the local currency of non-USD money fields.Noscraped
ecommerce_platformSTRINGMarketplace: Shopee, Lazada, Tiktok, Tokopedia, 'Tokopedia | Shop', Blibli.Noscraped
category_1STRINGTop-level category (e.g. Beauty & Personal Care).NolabelledMagpie's internal category
category_2STRINGSecond-level category (e.g. Skincare).NolabelledMagpie's internal category
category_3STRINGLeaf category (e.g. Facial Serum) — the export's atom grain.NolabelledMagpie's internal category
monthDATECalendar month representing the aggregation period. Identifies which month's daily/raw scrape records were rolled up to produce this row (e.g. sold_monthly = SUM of daily sold within the month).Nosystem
Pricing & discounts

Listed prices and realized (sold) averages. Local currency unless the field says USD.

FieldTypeDescriptionNullableOrigin
priceFLOAT64The lowest price recorded for the listing during the month, local currency — the cheapest price point observed, not a price taken specifically at month's end. Empty when the listing never displayed a price during the month (e.g. a pre-launch or 'coming soon' page); this shows up mostly on small, low-volume SKUs.Yesscraped
price_usdFLOAT64Price converted to USD using a fixed exchange rate per country, not a live daily rate — treat cross-market USD comparisons as directionally useful rather than accounting-precise. Empty whenever price is, for the same reason.Yesscraped
before_discount_priceFLOAT64Pre-discount reference price, calculated from the price and discount columns rather than scraped from the listing's strike-through label. Equals price when no discount applies.Yesderivedfrom price and discount
discountFLOAT64Listed discount as a fraction (0.70 = 70% off).Yesscraped
avg_price_soldFLOAT64Average realized selling price across the month's sales, local currency.Noderivedfrom gmv_monthly and sold_monthly
Sales & performance

The analysis metrics — what actually moved this month.

FieldTypeDescriptionNullableOrigin
sold_monthlyINT64Units sold in this month.Noscraped
gmv_monthlyFLOAT64GMV for this month, local currency (≈ units × realized price). Empty when the listing carried no price to value the units against (see price) — the same pre-launch / 'coming soon' small SKUs. An empty GMV means unknown, not zero: exclude those rows rather than summing them as 0.Yesscraped
gmv_monthly_usdFLOAT64GMV for this month in USD — the cross-market analysis metric. Empty whenever gmv_monthly is, for the same reason.Yesscraped
review_monthlyINT64Reviews received in this month.Yesscraped
ratingFLOAT64Listing's rating (0–5) at month end.Yesscraped
stockINT64Listing-level stock at month end.Yesscraped
Merchant

Who sells it and from where — official-store detection and regional cuts.

FieldTypeDescriptionNullableOrigin
merchant_idSTRINGPlatform's shop identifier.Noscraped
merchant_nameSTRINGShop display name.Noscraped
merchant_urlSTRINGShop URL on the platform.Yesscraped
merchant_badgeSTRINGPlatform badge, e.g. 'Shopee Mall', 'Star Seller' — official signal.Yesscraped
merchant_citiesSTRINGShop's city (as declared on the platform).YeslabelledMagpie's internal library
merchant_provinceSTRINGShop's province/state.YeslabelledMagpie's internal library
merchant_regionSTRINGCoarse region rollup (e.g. Jawa, Sumatera).YeslabelledMagpie's internal library
Top-N files only

Present only when you order a Top-N slice — a full export does not include this column.

FieldTypeDescriptionNullableOrigin
rankINT64Position within this category × platform × country × month, 1 = highest GMV. Computed when the Top-N slice is built, ordering by gmv_monthly_usd descending (ties broken by product_id), so rank 1..N is exactly the set you paid for. Ranks are per file — they restart at 1 for every category and month, and are not comparable across them.Noderivedfrom gmv_monthly_usd ordering

Top-N export files additionally carry a rank column (1 = highest GMV in the atom). Schema questions? The live source of truth is the API reference.