Structured, cleaned and labelled ecommerce data across Shopee, Lazada, TikTok Shop, Tokopedia and Amazon — ready for reporting, warehouses, applications, and grounding the AI workflows your teams already run. Need a current pull instead? Fetch it fresh, on demand.
New accounts start with free credits to explore the data and test an integration.
Not an engineer? Hand it to your AI agent6 marketplaces6 marketsmonthly from 2025-01latest 2026-07
Marketplace signals
grounded marketplace context
Better AI context
A consistent shape for every record.
product_titlepricecurrencyKnow what belongs to whom.
brandmerchantcategoryKeep the source and observation in view.
source_urlobserved_atTrailing 12 months, panel-wide. The context layer starts with the market record beneath it.
Not a roadmap — working recipes, each mapped to the API it calls and whether it can run on a schedule. Collection, cleaning, brand-labelling and deduplication are already done. You, or your agent, write the analysis.
| The tool | API | Runs |
|---|---|---|
| Category share tracker Every brand ranked by GMV, month over month, with share movement and a price index against the category average. | Data API | Runs unattended |
| Competitor price monitor Current price on every Shopee listing you care about, every night, flagged wherever someone undercuts you. | Scraping API | Runs unattended |
| Price-band map Realised price per unit for every brand, bucketed into deciles, to find the band holding demand with few competitors. | Data API | Runs unattended |
| Channel-control audit Search your brand and its misspellings, aggregate by shop, and compare against your authorised distributor list. | Scraping API | Approval-gated |
| New-launch watch Newest listings in your category, weekly, diffed against last week. A listing that takes volume immediately has budget behind it. | Scraping API | Approval-gated |
| Variant demand profiler Which size, shade or pack actually sells — demand concentrated in two of nine variants is a range that needs pruning. | Scraping API | Approval-gated |
| Review miner Reviews grouped by star rating: the low band is a defect list, the high band is positioning. Run it on a competitor's product. | Scraping API | Runs unattended |
| Keyword rank tracker Where your listings rank on Tokopedia for each keyword, week by week, and who climbed past you. | Scraping API | Runs unattended |
Approval-gated jobs are reviewed by hand and process Mon–Fri 08:00–17:00 Asia/Jakarta (WIB), so never build an unattended schedule on them. Everything marked “runs unattended” can run on a cron.
Depth, freshness and available fields vary by marketplace. Select one to see how it's covered.
Shopee sales data, already scraped and cleaned.
Indonesia, Thailand, Vietnam +3 more
Shopee coverage can extend beyond Southeast Asia in select cases — for example Brazil or Taiwan — where depth, freshness and available fields differ from the core markets above. Need a marketplace or market that isn't listed? Talk to us.
The Data API and Scraping API share one credit wallet and one login — pick per query, not per contract.
Maintained, cleaned marketplace data — ready for analysis, reporting, applications and AI workflows.
Fresh, on-demand collection when the question needs the market as it is right now.
Forty seconds on what Magpie does. The full walkthrough covers the three ways in: an AI chat in your browser, an AI that works on your computer, or your own code.
Magpie in 40 seconds. Plays muted; use the controls for sound.
Watch the 4-minute walkthrough on YouTubePlenty of people buying this data run a category, not a data team. You do not need to learn either API — you need an answer. Paste the prompt into Claude, ChatGPT or Cursor — if you don't have a key yet, it walks you through getting one — and it will work out whether the question is a panel question or a live one, price it, and come back with the numbers.
You're helping me use the Magpie ecommerce data APIs (https://data.magpieiq.com). Start by reading https://data.magpieiq.com/skill/SKILL.md and follow its house rules.
I may be new to Magpie. If you are not connected yet, don't ask me for an API key and never print one: walk me through the one-line setup in that file instead (the Magpie connector in Claude or ChatGPT, `npx @magpieiq/cli init` for coding agents, or `magpie login` in a terminal). Discovery, estimates and a few sample answers work before I sign in.
If you can't make HTTP requests from where you're running, say so and suggest the connector or a coding agent such as Claude Code or Cursor, instead of guessing results.
Always estimate first (estimates are free) and ask me before any call that costs credits.
Also call the catalogue first to see what exists, and when you estimate, show me the row count and the dollar price.
What I want: the top 20 skincare brands by GMV on Shopee Indonesia for the last 6 months, with each brand's market share and average price. Then scrape the top 3 SKUs and tell me what they cost on their pages today.New accounts start with free credits. The catalogue and cost estimates work straight away.
One plain-text file with both APIs, the house rules, the response-parsing details and all eleven recipes, so an agent stops guessing endpoint paths and field names.
Dry-run estimates are free and exact, so tell your assistant to price every pull and ask before spending. The wallet is prepaid — it cannot overspend a balance you have not topped up.
curl -o SKILL.md https://data.magpieiq.com/skill/SKILL.mdEach one states the question it answers, the API it uses and where it will bite you. Copying a recipe includes a short preamble that points your agent at the skill and tells it to estimate before spending, so a single pasted recipe stands on its own. Code versions — S3 exports, Airflow, warehouse loads — are in the pipeline recipes.
Call GET /v1/exports/catalog and confirm my category and market are available and for which months. Then POST /v1/exports with "estimate": true and a body like {"country": "ID", "category_3": ["Shampoo"], "platforms": ["Shopee"], "date_from": "2026-01", "date_to": "2026-06", "top": 100, "format": "csv", "estimate": true}. Show me rows, credits and dollars, and wait for my approval before submitting without estimate. Then poll GET /v1/exports/{export_id} until the files are ready and download them.
From the data give me: the ten largest brands by GMV and their share in the most recent month; how each share has moved since the first month; realised price per unit for each against the category average, as an index with the average at 100; and any brand whose share moved more than a third either way. Flag any month whose row count is sharply out of line with its neighbours — that is a collection artefact, not a market move, so say so rather than reporting it as a trend.The gap between a full category export and a top-N slice can be large. The estimate is free and exact.
Using the catalogue and a free estimate first, export the most recent full month of my category at "top": 500. Compute realised price per unit per brand as GMV divided by units. Bucket brands into price deciles against the category average and report, per decile, how many brands sit there and what share of category GMV they hold together.
Look for a band holding meaningful demand but few competing brands. If there is no such gap, say so explicitly rather than manufacturing one.Using the catalogue and a free estimate first, export the most recent month of my category at "top": 100. Report the combined share of the top ten brands, the number of brands needed to reach half of category GMV, and the realised price index of the top three against the category average.
Then classify the category: concentrated and premium (leaders hold high share at high price), concentrated and cheap (leaders hold share by undercutting), or fragmented (no brand holds meaningful share). Give the reasoning, not just the label — each implies a different entry cost.I will give you a list of products, each with our offer price and the Shopee URL of the matching listing. For each row, extract shop_id and item_id from the URL, which ends in -i.{shop_id}.{item_id}. POST to /v1/shopee/get_pc/submit with {"region": "id", "item_id": "...", "shop_id": "..."} to get a task_id, then poll GET /v1/shopee/get_pc/retrieve/{task_id} until it returns a result. Read the current price and divide it by 100000.
Give me a table of every product where the Shopee price is at or below ours, showing our price, the Shopee price and the gap. Also report is_lowest_price_at_shopee for each row — read it from each entry in item.models, because the item-level field comes back null.
Only use get_pc: it runs without manual approval.At scale, get_pc_bulk takes a CSV, and get_pc_bulk/schedules runs it nightly on a cron.
Submit POST /v1/shopee/search-items/submit with Shopee search URLs sorted by sales (?page=0&sortBy=sales), several keywords covering my category, up to 50 URLs. Poll the job, download each frame and parse it using the Shopee parsing rules in the skill. Deduplicate by itemid before summing anything.
Compute GMV per listing as units × price, aggregate by shop, and report the twenty largest shops with their share of the total observed, listing count, average realised price and location. Separate official brand stores from resellers where the shop name makes that clear. Tell me how many submitted URLs returned data and how many failed.search-items is approval-gated. If the job returns awaiting_approval, hand me the job_id and stop polling.
Run a Shopee search-items job using my brand name and its common misspellings as keywords, sorted by sales. Parse per the skill's Shopee rules, deduplicate by itemid and aggregate by shop.
I will give you my list of authorised distributors and our price floor. Produce two tables: every shop selling the brand that is not on the list, with observed GMV, listing count and location, sorted by size; and any authorised shop whose realised price sits more than twenty per cent below the floor.
Do not accuse anyone of counterfeiting. Report only what the listing data shows — who is selling, at what price, from where.Submit POST /v1/shopee/merchant-items/submit with {"urls": ["https://shopee.co.id/shop/<shop_id>"], "max_pages": 5}, up to 50 shop URLs per request, then poll GET /v1/shopee/merchant-items/retrieve/{job_id} until complete. On this endpoint the numeric sold field is 0, so read monthly_sold_count_text, which is exact. The payload repeats items across the shop's category tabs, so deduplicate by itemid first or the total roughly doubles.
Give me the listing count, total observed monthly GMV, the twenty listings carrying most of it, and the price distribution.
Do not compare this shop's total against a market total built from keyword search. The shop is fully enumerated and the market is not, so any share computed that way is a ceiling, not an estimate. If I ask for a share, say that.Run a Shopee search-items job for my category keywords sorted by newest (?page=0&sortBy=ctime). Save the itemid list. Run it again weekly and compare against the previous week's list.
Each week, report the listings that are new since the last run, grouped by shop, with price and any units already recorded. Highlight any new listing that took meaningful volume immediately — that usually means a launch with paid support behind it.Submit POST /v1/shopee/variant_sold_v1/submit with {"items": [{"item_id": "...", "shop_id": "...", "country": "id"}]} for the products I give you — one country per request. Poll until complete.
Report sold count per variant, ranked, with each variant's share of the product total. Tell me whether demand concentrates in one or two variants or spreads evenly, because that decides whether the range needs pruning.Billed per item, and only when the job is approved — a rejection or timeout costs nothing.
For the Lazada product I give you, take the numeric item ID from the product URL (…-i5133872551.html gives 5133872551) — the review endpoints reject product page URLs. Submit POST /v1/lazada/product-reviews with {"requests": [{"url": "https://my.lazada.co.id/pdp/review/getReviewList?itemId=<item_id>"}]} and poll GET /v1/lazada/retrieve/{task_id}. Each call returns five reviews; add &pageNo=2, &pageNo=3 for more. Agree a page budget with me before reading more than a few pages, because every page is billed.
Group the reviews by star rating. Summarise the recurring complaints in the one and two star reviews and the recurring praise in the five star ones, quote a few representative lines verbatim, and say how many reviews you read out of reviewTotal.Submit POST /v1/tokopedia/search/bulk/submit with {"items": [{"list_type": "search", "keyword": "<keyword>", "product_limit": 60}]} for each of my keywords (up to 50 per request). Poll GET /v1/tokopedia/search/bulk/retrieve/{job_id}, and download each item's download_url promptly and save it — the links expire.
A listing's rank is its position in the products array, counting from 1. Skip any product whose ads.id is filled — that slot is sponsored, not organic. Match my listings by id or shop.id and record rank per keyword per run, then show me who climbed past us since the last run.Results come back in the scraper's fixed order, which is close to but not exactly the default shopper view.
Bearer auth, one key across both APIs. The estimate returns the exact row count and price and charges nothing, so nobody commits budget to a number they have not seen.
curl -X POST "https://api.magpieiq.com/data/v1/exports" \
-H "Authorization: Bearer $MAGPIE_API_KEY" \
-H "Content-Type: application/json" \
-d '{"country":"ID",
"category_3":["Facial Serum"],
"date_from":"2026-01","date_to":"2026-05",
"estimate":true}'# same body without "estimate": true — returns an export_id.
# Poll GET /v1/exports/{export_id}, then download the signed
# links: one file per category and month.
curl -X POST "https://api.magpieiq.com/data/v1/exports" \
-H "Authorization: Bearer $MAGPIE_API_KEY" \
-H "Content-Type: application/json" \
-d '{"country":"ID",
"category_3":["Facial Serum"],
"date_from":"2026-01","date_to":"2026-05",
"format":"parquet"}'Take gzipped CSV for a spreadsheet or Parquet for a warehouse — same rows; BigQuery, Snowflake, Databricks and DuckDB read Parquet directly. Every parameter is in the Data API docs, and the live per-endpoint prices are on the rate card
Buy a credit pack and pay per data row, billed only on success. Bigger deposits drop the price per credit; team plans add seats, history and SKU-level access.