JD.com Scraper: Products, Shops, Stock by SKU
Pricing
from $1.68 / 1,000 products
JD.com Scraper: Products, Shops, Stock by SKU
Read JD.com (Jingdong) products by SKU id or link: title, brand, model, barcode, shop, self operated or third party, stock, delivery, images, variants, category ids and sales rank. JD hides the exact price from visitors; the masked price and its range are returned. No login.
Pricing
from $1.68 / 1,000 products
Rating
0.0
(0)
Developer
The Mine Works
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Share
Part of The Mine Works E-commerce and marketplaces family: Ozon.ru Scraper, ⭐ Amazon Reviews Scraper, Amazon Product Scraper, Etsy Listings Scraper, AliExpress Scraper, Kleinanzeigen.de Scraper.
Updated 23 Oct 2026: first release. JD.com (京东, Jingdong) products by SKU id or product link: brand, model, barcode, shop and shop type, stock, delivery promise, images, colour and size variants, category ids, sales rank and specs, one flat row per SKU. Bookmark this Actor on its Store page so it is one click away next time.
Why choose this actor?
- The product record, in columns. Title, short title, brand and brand id, model, barcode, weight and dimensions, origin, listing date, the three category ids, every image at full size and the full list of colour and size variants with their own SKU ids. In our test runs
title,brand,shop_name,shop_type,image_urlandcategory_idswere filled on 16 of 16 rows. - Who sells it, and how. Shop name, shop id and shop link, and
shop_type:self_operated,third_partyorkey_account(JD's KA stores such as Moutai's). Filter a whole list to JD-run stock, or to marketplace sellers, in one column. - Stock and delivery as a shopper sees them. Stock state, the delivery promise for JD's default address, the shipping-fee note, the service badges (7-day returns, JD Logistics, price protection) and the sales ranking JD shows for the product.
- Pay per product, nothing for errors. Removed SKUs, links that are not JD products, the summary row and duplicates are never charged. No JD account, cookies or API key.
What JD does not show a signed-out visitor, said plainly. JD masks the shopper price: a visitor sees 1??9, not the number. This actor returns that text as price_masked and the range it allows as price_hint_low and price_hint_high (1009 to 1999 for 1??9). The exact price is filled only when the page prints it in full, which it usually does not. Reviews, the rating and the comment count come from JD calls that need JD's own signed app parameters, so they are not in the rows. Keyword search on JD sits behind JD's verification page; see "Keywords" below.
Try it in one minute
Paste this into the input (JSON view) and press Start. It reads five products (a Moutai liquor, two Huawei phones, an iPhone and a Huawei foldable) from their mobile product pages. It took 9 seconds in our test run:
{"skuIds": ["100012043978", "100248562389", "100038004353", "100224133297", "100156131721"],"maxItems": 20}
Put your own SKU ids, or full product links, one per line. The SKU id is the number in a JD link: item.jd.com/100012043978.html.
Apify's free plan includes $5 of credit every month, which covers about 2,500 products at this actor's price.
Copy to your AI assistant
themineworks/jd-com-scraper on Apify. Reads JD.com (京东) products by SKU id or product link and returns one flat row per SKU with title, brand, model, barcode, shop, shop_type (self_operated, third_party, key_account), stock, delivery promise, images, variants, category ids, sales rank and specs, with no login. Call ApifyClient("TOKEN").actor("themineworks/jd-com-scraper").call(run_input={"skuIds": ["100012043978"], "maxItems": 50}), then client.dataset(run["defaultDatasetId"]).list_items().items. Give skuIds (list of SKU ids or JD product links) and/or startUrls (list of JD product links). Optional: maxItems (default 50, 1 to 5000), includeVariants (default false; also reads the other colour and size SKUs of each product), searchQueries with keywordSource "web-index" (default "off"; finds a few products per keyword through a web search index). JD hides the shopper price from signed-out visitors, so price is usually null and price_masked (for example 1??9), price_hint_low and price_hint_high carry what is shown. Product rows have no _type field and carry sku_id, product_id, title, short_title, selling_point, url, mobile_url, brand, brand_id, model, barcodes, barcode, shop_id, shop_name, shop_url, shop_type, shop_type_label, is_self_operated, is_third_party, price, price_currency, price_masked, price_hint_low, price_hint_high, price_reference_amount, price_note, in_stock, stock_state, stock_state_code, delivery_promise, shipping_note, services, category_ids, category_id_path, image_url, image_count, images, variant_count, variants, color, size, specifications, weight_kg, origin, listed_at, sales_rank, sales_rank_position, sales_rank_title, is_reservation, is_presale, seven_day_return, is_cross_border, is_jd_express, sale_status, source, keyword, parent_sku_id, position, scraped_at. Each run also writes one row with _type "summary", one with _type "info" when products were delivered, and a row with _type "error" for each input that could not be read; none of these is charged. Full spec: GET https://api.apify.com/v2/acts/themineworks~jd-com-scraper/builds/default (Bearer TOKEN), which returns inputSchema and readme. Token: https://console.apify.com/account/integrations?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral
Key features
- SKU ids or links. Paste SKU ids, or
item.jd.com,item.m.jd.comornpcitem.jd.hklinks. A SKU that appears twice is delivered once. - Variants. Every product row lists its colour and size variants with their SKU ids and photos (
variants). Turn onincludeVariantsto read those SKUs as rows too, up tomaxItems. One iPhone model can be 20 or more SKUs. - Shop type.
self_operatedis JD's own flag for JD-run and JD-flagship stores,third_partyis a marketplace seller,key_accountis a JD KA store.shop_type_labelkeeps JD's own wording when it gives one. - Barcodes. The UPC or EAN JD stores for the product (
barcode,barcodes), when it has one. 13 of 16 rows in our test had one. Use it to match a JD listing to your own catalogue. - Fast and light. One page per product, about 280 KB, read over the Apify datacenter proxy. No China proxy is needed: the mobile product page answers from any region.
- Stops cleanly. Eight failed or blocked pages in a row end the run; the run stops before its time limit and keeps every row it read. The summary row says why.
How to use it
Basic: a list of SKUs
{"skuIds": ["100012043978", "https://item.jd.com/100248562389.html"],"maxItems": 100}
Every colour and size of a product
{"skuIds": ["100038004353"],"includeVariants": true,"maxItems": 60}
Each variant is its own row with its own stock and delivery promise.
Keywords (opt-in)
{"searchQueries": ["华为手机"],"keywordSource": "web-index","maxItems": 20}
JD's own search (search.jd.com, so.m.jd.com) answers every request with JD's verification page, which this actor does not solve or get around. The one keyword route that works without it is a public web search index: the keyword is searched as site:item.jd.com <keyword> and the JD product ids in the answer are then read from JD. It finds about 4 to 8 products per keyword, the order is the index's, not JD's, and the index's robots.txt disallows automated queries, which is why it is off by default. Use it to find SKU ids to start from, not as a catalogue crawl.
Track stock and delivery
Run the same SKU list daily and compare stock_state, delivery_promise and sales_rank between runs.
Input parameters
| Parameter | Type | Default | What it does |
|---|---|---|---|
skuIds | array of strings | empty | JD SKU ids or full product links, one per line. Up to 2,000. |
startUrls | array of strings | empty | JD product links copied from your browser. Same as skuIds. |
searchQueries | array of strings | empty | Keywords. Used only when keywordSource is web-index. |
keywordSource | string | off | off or web-index. See "Keywords (opt-in)". |
maxItems | integer | 50 | Most products in the run, 1 to 5,000. |
includeVariants | boolean | false | Also reads the other colour and size SKUs listed on each page. |
Give skuIds, startUrls, searchQueries or a mix.
What data do you get?
One row per SKU, with no _type field. Missing values are left out of the row rather than filled with placeholders.
| Group | Fields |
|---|---|
| Identity | sku_id, product_id, title, short_title, selling_point, url, mobile_url |
| Product | brand, brand_id, model, barcode, barcodes, color, size, specifications, weight_kg, origin, listed_at, category_ids, category_id_path |
| Shop | shop_id, shop_name, shop_url, shop_type, shop_type_label, is_self_operated, is_third_party |
| Price | price (usually null), price_currency, price_masked, price_hint_low, price_hint_high, price_reference_amount, price_note |
| Stock and delivery | in_stock, stock_state, stock_state_code, delivery_promise, shipping_note, services, seven_day_return, is_reservation, is_presale, is_cross_border, is_jd_express, sale_status |
| Media and variants | image_url, image_count, images, variant_count, variants |
| Ranking | sales_rank, sales_rank_position, sales_rank_title |
| Run context | source, keyword, parent_sku_id, position, scraped_at |
price_reference_amount is an amount JD embeds in the page for some products. On a Moutai SKU it was 1041 while the masked price was 1??9, and on a phone it was 380 against 1??9, so it is not the shop price. It is kept because some users compare it across runs.
Stable fields for automations
sku_id never changes and is the key to join runs on. shop_type takes one of self_operated, third_party, key_account. stock_state takes one of in_stock, out_of_stock, pre_order, in_transit, available_to_order, or code_N for a state this actor does not know yet; stock_state_code always has JD's raw number.
Output example
{"sku_id": "100248562389","title": "华为畅享 90 Plus 128GB星海蓝 麒麟8系芯片关怀模式鸿蒙AI防诈6620mAh巨鲸大电池柔光护眼直屏手机","brand": "华为(HUAWEI)","model": "畅享 90 Plus","barcode": "6942103189135","shop_id": "1000004259","shop_name": "华为京东自营旗舰店","shop_type": "self_operated","is_self_operated": true,"price_currency": "CNY","price_masked": "1??9","price_hint_low": 1009,"price_hint_high": 1999,"in_stock": true,"stock_state": "in_stock","delivery_promise": "11:10前付款,预计今天(10月24日)送达","category_id_path": "9987,653,655","image_url": "https://img14.360buyimg.com/n0/jfs/t1/542073/2/8519/166879/6ad61434F114043f0/00835a05a0bce48c.jpg","variant_count": 6,"variants": [{ "sku_id": "100331677410", "color": "羽沙白", "size": "128GB", "image_url": "https://img14.360buyimg.com/n0/jfs/t1/548220/25/3470/172272/6ad61433F0e0f1ae4/00835a05a00cddc4.jpg" }],"sales_rank": "10月『11.11华为超级金榜』TOP20","sales_rank_position": 4,"source": "input","position": 2,"scraped_at": "2026-10-23T18:20:24.053Z"}
Pricing
Pay per event: you pay for the products you receive, plus a flat $0.003 per run, whatever memory you choose.
| Event | When it is charged | Free plan | Bronze (Starter) | Silver (Scale) | Gold (Business) |
|---|---|---|---|---|---|
product-scraped | Once per product row stored in your dataset | $1.97 per 1,000 | $1.87 per 1,000 | $1.77 per 1,000 | $1.68 per 1,000 |
run-start | Once per run, after the first product page returned a product | $0.003 | $0.003 | $0.003 | $0.003 |
The price of one product is the price per 1,000 divided by 1,000.
Never charged:
- inputs that are not JD products (each gets an error row);
- a SKU that is removed or never existed;
- a SKU found twice in one run;
- products past your
maxItems; - the summary, info and error rows;
- a run with no valid input, or one where no product page returned a product: the start fee is charged only once a product has been read;
- anything past your "Max cost per run". The actor checks the budget before each batch of rows and stops while the total is still below your limit, so the run ends SUCCEEDED with a partial result and a status message saying so.
Run it on a schedule
- Open the actor in Apify Console, set your input and click Save as a new task.
- In the task, open Schedules, click Add schedule and pick how often (every day, every Monday at 08:00 and so on).
- Compare runs on
sku_id,stock_stateanddelivery_promiseto see what sold out or came back. - Optional: add an integration (Google Sheets, Slack, a webhook) so each run lands where your team works.
FAQ
What does this actor read?
JD.com's public mobile product page for each SKU (item.m.jd.com), as a signed-out visitor sees it. It does not log in, place orders or read anything behind a sign in.
Why is the price masked?
JD shows signed-out visitors the first and last digit of the price (1??9) and asks them to log in. This actor does not log in and does not guess. You get the mask, the lowest and highest price it allows, and price only when the page prints the number in full. If you need exact prices, tell us in the Issues tab; we will look at a route that does not need an account.
Can I search by keyword?
Not on JD's own search: it ends on JD's verification page, which this actor does not solve. The opt-in web-index source finds a few SKUs per keyword through a public web search index; see "Keywords (opt-in)". For large lists, bring SKU ids from your own sheet, a shop, a ranking or a feed.
Are reviews, ratings and sales counts included?
No. JD serves them to its own app through calls that need JD's signed parameters. The row has sales_rank (the ranking JD prints on the page, for example "纪念日白酒热卖榜第12名") when the product is ranked, and nothing for ratings.
How many products can I get?
As many SKUs as you give, up to 5,000 per run. One page is read per SKU, about 280 KB. In our test 16 SKUs took 23 seconds with no blocked page.
Why do some rows have no barcode or delivery promise?
JD lists them only for some products, and a sold-out product has no delivery promise. A field JD does not print is left out.
Do I need an account, cookies or a proxy?
No. The actor reads public pages over Apify Proxy, which is included. The page answers from any region, so no China proxy is needed.
Are the texts in Chinese?
Titles, shop names and delivery promises are as JD prints them, in Chinese. Field names, shop_type and stock_state are English.
Which formats can I download?
JSON, CSV, Excel, XML, RSS and HTML from the run's Storage tab or through the API. The dataset has three ready views: Products, Shops and stock, and Catalogue data.
Can I use it from Claude, ChatGPT or Cursor (MCP)?
Yes, through Apify's MCP server. Connector URL: https://mcp.apify.com/?tools=themineworks/jd-com-scraper
- Claude: Settings > Connectors > Add custom connector, paste the URL, sign in with Apify.
- ChatGPT: turn on developer mode, add an MCP connector with the URL, sign in with Apify.
- Cursor or VS Code: add it as an HTTP MCP server with that URL.
- Claude Code:
claude mcp add -t http jd-com-scraper "https://mcp.apify.com/?tools=themineworks/jd-com-scraper"
Is it legal to scrape JD.com?
The actor reads only pages that anyone can open without logging in. You are responsible for how you use the data, including JD's terms and data protection law. This is general information, not legal advice.
Integrations
- Google Sheets: send each run's products to a sheet with Apify's Google Sheets integration; one row per SKU fits a sheet as is.
- Make, Zapier and n8n: start a run and read its dataset with the Apify apps and nodes, for example "stock check on our SKU list every morning to Slack".
- Webhooks: have Apify call your URL when a run succeeds, then fetch the dataset.
- API and SDKs: run it from Python or JavaScript with the Apify client, or with a plain HTTP call (see "Copy to your AI assistant" above).
- MCP clients: Claude, ChatGPT, Cursor and VS Code can run it as a tool through the connector URL in the FAQ.
More from The Mine Works
E-commerce and marketplaces
- Ozon.ru Scraper
- ⭐ Amazon Reviews Scraper
- Amazon Product Scraper
- Etsy Listings Scraper
- AliExpress Scraper
- Kleinanzeigen.de Scraper
- Carsales.com.au Scraper
- eBay Product Listings Scraper
- Shopify Store Scraper
- 🛒 TikTok Shop Scraper
- Walmart Product & Price Scraper
- Vinted Scraper
Social media and video
Leads and business directories
Marketing, SEO and reviews
Real estate
Science, health and government data
Jobs and hiring
Company and business data
Food and local services
Developer and AI tools
More tools
Support
Found a SKU that returns nothing, or a field that comes back empty? Open an issue in the Issues tab with the input and the run ID, and we will look at it. For a field you need or a new source, email dmineworks@gmail.com.
Read JD.com products by SKU id or link and get one row each, with brand, model, barcode, shop and shop type, stock, delivery promise, images, variants and category ids, no login.

