JD.com All SKUs with prices API
API health
- 24h health
- Normal
- 24h average time
- —
- Healthy / normal
- Available
- Limited
- Mostly down
Last 24 hours
Last 30 days
List every SKU of a JD.com product from any one of its SKUs in item_id, one row per color, size or capacity, with price, stock state and purchase limit. The first row is the SKU you sent, and price is what a signed-out buyer sees before checkout coupons.
Price $1.39 per 1,000 requests ($0.001389 per call). Failed calls and empty results are not charged. Each row you ask for counts as one call: limit sets the charge up front, and the rows that do not come back are refunded. Synchronous only: everything it returns (every target of a batch, or every SKU of a product) is read within this call, and "mode": "async" returns a 422 before any charge.
AI prompt
Paste this into your AI assistant. It already holds this endpoint's parameters, response fields and an example request, so the assistant can ask what you need and then write the scraper.
Please help me write a data collection script with the EveryInfra JD.com All SKUs with prices endpoint (jd/skus).
Endpoint contract:
- Request: POST https://api.everyinfra.com/api/v1/social with the header Authorization: Bearer <API key>. Read the key from the EVERYINFRA_API_KEY environment variable and never hard-code it.
- In the request body, set platform to jd and action to skus, and put the parameters inside params.
- Required parameters:
- item_id: Identifies one JD.com product for skus through any one of its SKUs. Pass the digit string, a JD product link (https://item.jd.com/<digits>.html, https://item.m.jd.com/product/<digits>.html, or a wqitem.jd.com page opened…
- Optional parameters:
- limit: The most rows to return in this call, an integer from 1 to 100. The default applies when you leave it out, and a call can return fewer rows. Larger values return 422 before any charge. (default: 100)
- Returns a list of records. Main fields of each record: item_id (JD numeric product ID), url, product_id (JD product group ID shared by every SKU…), is_requested (Whether this row is the SKU named in th…), title, properties (This SKU's sale attributes as attribute…), color (This SKU's color (or finish) as shown o…), size (This SKU's size, capacity or specificat…), price, currency, on_sale (Whether this SKU is listed for sale (sk…), in_stock (Whether this SKU can be ordered for imm…); 28 fields in total, full list at https://api.everyinfra.com/api/v1/social/catalog?platform=jd.
- Example request body:
{
"platform": "jd",
"action": "skus",
"params": {
"item_id": "https://item.m.jd.com/product/10232789210191.html"
}
}
- Price: $1.39 per 1,000 requests; failed and empty results are not charged.
- This endpoint runs synchronously only; do not add "mode": "async" to the body.
- On 422, fix the request using the suggested parameter names and allowed values in the error; on 429 or 503, wait for Retry-After and try again.
Before writing code, ask me which targets I need, how many, which fields, and what output format I want; then confirm the plan and the rough cost with me.Request parameters
| Name | In | Type | Required | Default | Description |
|---|---|---|---|---|---|
Authorization | header | string | Yes | - | Bearer followed by your API key. Create it in the console; never put it in a URL or a code repository. |
platform | body | string | Yes | jd | Platform identifier, fixed value. |
action | body | string | Yes | skus | Capability identifier, fixed value. |
item_id | body.params | Not declared | Yes | - | Identifies one JD.com product for skus through any one of its SKUs. Pass the digit string, a JD product link (https://item.jd.com/<digits>.html, https://item.m.jd.com/product/<digits>.html, or a wqitem.jd.com page opened inside WeChat), or share text that contains exactly one such link; tracking parameters in the link do not matter. Short links such as 3.cn or u.jd.com are not accepted: open them in a browser first and copy the product page link. |
limit | body.params | integer (1–100) | No | 100 | The most rows to return in this call, an integer from 1 to 100. The default applies when you leave it out, and a call can return fewer rows. Larger values return 422 before any charge. |
Code samples
curl -X POST 'https://api.everyinfra.com/api/v1/social' \
-H "Authorization: Bearer $EVERYINFRA_API_KEY" \
-H 'Content-Type: application/json' \
--data-raw '{
"platform": "jd",
"action": "skus",
"params": {
"item_id": "https://item.m.jd.com/product/10232789210191.html"
}
}'[OpenAPI definition (JSON)]Samples read the key from the EVERYINFRA_API_KEY environment variable; copied code never contains your key.
Response example
There is no real sample for these example parameters yet: this shows the response shape and fields from the contract, with … as placeholders. It is not the result of a real call.
{
"id": "req_…",
"platform": "jd",
"action": "skus",
"results": [
{
"item_id": …,
"url": …,
"product_id": …,
"is_requested": …,
"title": …,
"properties": …,
"color": …,
"size": …,
"price": …,
"currency": …,
"on_sale": …,
"in_stock": …,
"stock_state": …,
"stock": …,
"purchase_limit": …,
"delivery_promise": …,
"is_presale": …,
"is_government_subsidy": …,
"is_billion_subsidy": …,
"is_flash_sale": …,
"promo_tags": …,
"upc": …,
"brand": …,
"image_url": …,
"shop_id": …,
"shop_name": …,
"is_jd_self": …,
"variant_count": …,
"platform": …
}
],
"count": …,
"billing": {
"charged": …,
"charged_usd": …,
"balance_after_usd": …,
…
},
"quota": { … }
}Response fields
Business data is in results. The table lists the fields a record can contain; values the platform does not show are never made up.
| Field | Meaning |
|---|---|
item_id | JD numeric product ID. From search results you can pass it straight to detail, reviews, or price calls. |
url | Link to the record on the platform. |
product_id | JD product group ID shared by every SKU of the product (skus). It is not a SKU: do not pass it as item_id to detail, reviews or price calls. |
is_requested | Whether this row is the SKU named in the request (skus); the product's other SKUs are false. |
title | Title. null when the platform has no titles (for example text-only posts). |
properties | This SKU's sale attributes as attribute name → value, in JD's own wording, which is usually Chinese (for example the color and the storage capacity of that SKU) (skus). |
color | This SKU's color (or finish) as shown on the JD page. |
size | This SKU's size, capacity or specification value as shown on the JD page. |
price | Price as a number without a currency symbol; see currency. |
currency | Currency code of the price (for example CNY, USD). If price is present but currency is null, do not assume a currency. |
on_sale | Whether this SKU is listed for sale (skus). Listed is not the same as in stock: read in_stock and stock_state for that. |
in_stock | Whether this SKU can be ordered for immediate delivery (skus). Pre-order and reservation SKUs are false; see stock_state. |
stock_state | Public JD stock status code. |
stock | Stock quantity JD shows publicly; null means the page did not give one, not zero. |
purchase_limit | Maximum quantity per buyer; null means the page states no limit (skus). |
delivery_promise | Delivery or shipping promise as JD words it, such as an expected ship-by date (skus); given for JD's default region when signed out and may differ by region. |
is_presale | Whether the product is on presale (skus). |
is_government_subsidy | Whether JD marks this SKU with a national government subsidy (skus); the mark alone does not say whether price already deducts the subsidy. null means the mark was not obtained this time. |
is_billion_subsidy | Whether JD marks this SKU as part of its Billion Subsidy program (skus); null means the mark was not obtained this time. |
is_flash_sale | Whether this SKU is in a flash sale (skus); null means the mark was not obtained this time. |
promo_tags | Promotion labels JD shows for this SKU, in JD's wording (skus); null when there are none or they were not obtained. |
upc | Product barcode (UPC/EAN). null when the page does not provide one. |
brand | Product brand. |
image_url | Image URL: in search, product_detail, shop and skus it is the product's main (cover) image; in description_images it is the description image of that row (the full-size https image on JD's image host). |
shop_id | JD numeric shop ID. |
shop_name | Public shop name. |
is_jd_self | Whether this is a JD self-operated (JD.com retail) product. |
variant_count | Number of variants (SKUs). null when there are none or it is not provided. Every skus row carries the same value: when it is larger than the number of rows returned, limit cut the list short or some SKUs were not retrieved this time. |
platform | Source platform identifier, the same as platform in the request (for example xiaohongshu, tiktok). |
Errors and billing
- 401
- Missing or invalid key. Authentication runs before parameter checks, so unauthenticated requests never see the parameter schema.
- 422
- Wrong parameter name or value. The error lists the parameters and allowed values this capability accepts and the closest match; it happens before any charge.
- 402
- Insufficient balance. Top up first.
- 429
- The account's per-minute request limit was reached (all of its API keys count together; a key's own lower limit applies first). Wait for Retry-After and try again; a rate package in the console raises the limit.
- 503
- Could not complete right now. Any charge for the call goes back to your balance automatically, and the billing receipt in the response states the actual outcome, including when it is not yet known. Do not resend blindly.
- 200 empty
- The request completed without data and is not charged (billing.reason = empty_result_refunded).
Official references
Used only to check objects and terms. They do not imply authorization or endorsement of EveryInfra by the platform.
- JD.com: Displayed-price Labels and Conditional Purchase Prices ↗
JD.com distinguishes a real-time displayed label from final item prices and member, new-user, regional, or targeted benefits, while noting that some comparison information can be delayed or incomplete. Treat a returned price as the visible request-time snapshot, not a personal transaction price, settlement amount, or guarantee of absolute accuracy.
Checked 2026-09-11