JD.com Reviews API
Temporarily unavailable
We are restoring this capability. Until then calls usually fail or return no results; failed calls and empty results are not charged.
API health
- 24h health
- Normal
- 24h average time
- —
- Healthy / normal
- Available
- Limited
- Mostly down
Last 24 hours
Last 30 days
Read up to 10 buyer reviews of a JD.com product, with rating, follow-up review, variant bought, helpful votes, photos and the reviewer's PLUS status and purchase count. Nicknames appear as JD shows them, possibly partly masked; the batch is not a complete history and is not cleared for republishing.
JD.com Reviews reads the public reviews of one product by item_id. Each row carries the review text, any follow-up review the buyer added later, the rating, publish time, the color and size bought, the reviewer's nickname, whether they are a PLUS member and how many times they bought. Use it to hear what buyers say: reputation analysis, sorting complaints by cause, or comparing a competitor's product on the details.
review_append holds the follow-up review a buyer posts after the first one, which often speaks to durability and after-sales service better than the first impression, so analyze it separately. Nicknames come back exactly as JD shows them and may be partly masked; they cannot identify a person. Check rating_scale on the same row before comparing ratings.
Price $1.39 per 1,000 requests ($0.001389 per call). Failed calls and empty results are not charged. Synchronous. For slow jobs add "mode": "async" to the body, take the job_id and poll.
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 Reviews endpoint (jd/reviews).
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 reviews, and put the parameters inside params.
- Required parameters:
- item_id: Identifies one JD.com product for product_detail, reviews, or product_price. Pass the digit string returned by search or the canonical legacy URL https://item.jd.com/<digits>.html without a query or fragment.
- Optional parameters:
- limit: The most rows to return in this call, an integer from 1 to 10. The default applies when you leave it out, and a call can return fewer rows. Larger values return 422 before any charge. (default: 10)
- Returns a list of records. Main fields of each record: id, item_id (JD numeric product ID), text, review_append (Buyer's follow-up (appended) review tex…), rating, rating_scale, posted_at, color (This SKU's color (or finish) as shown o…), size (This SKU's size, capacity or specificat…), useful_count, images, author_name (Reviewer nickname, returned as JD shows…); 15 fields in total, full list at https://api.everyinfra.com/api/v1/social/catalog?platform=jd.
- Example request body:
{
"platform": "jd",
"action": "reviews",
"params": {
"item_id": "100012043978"
}
}
- Price: $1.39 per 1,000 requests; failed and empty results are not charged.
- For dozens or hundreds of targets, add "mode": "async" to the body: you get a job_id at once and poll GET https://api.everyinfra.com/api/v1/jobs/{job_id} for the result.
- 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 | reviews | Capability identifier, fixed value. |
item_id | body.params | Not declared | Yes | - | Identifies one JD.com product for product_detail, reviews, or product_price. Pass the digit string returned by search or the canonical legacy URL https://item.jd.com/<digits>.html without a query or fragment; arbitrary, opaque, or cross-host URLs are not accepted as equivalent item identifiers. |
limit | body.params | integer (1–10) | No | 10 | The most rows to return in this call, an integer from 1 to 10. 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": "reviews",
"params": {
"item_id": "100012043978"
}
}'[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": "reviews",
"results": [
{
"id": …,
"item_id": …,
"text": …,
"review_append": …,
"rating": …,
"rating_scale": …,
"posted_at": …,
"color": …,
"size": …,
"useful_count": …,
"images": …,
"author_name": …,
"author_avatar_url": …,
"author_is_plus": …,
"buy_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 |
|---|---|
id | The record's unique ID on the platform. Unique only within one platform; IDs can repeat across platforms. |
item_id | JD numeric product ID. From search results you can pass it straight to detail, reviews, or price calls. |
text | Body text with HTML removed, returned in full and never cut short (on a few platforms the list results themselves carry only an excerpt; the platform's field notes say so). |
review_append | Buyer's follow-up (appended) review text. |
rating | Rating. The scale varies by platform: rating_scale on the same row gives the maximum (usually 5; Booking, Douban, iQIYI and NAVER use 10). Convert with rating_scale before comparing across platforms, or the comparison can come out backwards. |
rating_scale | Maximum of rating in the same row: 5 for five-star scales, 10 for ten-point scales. Present only when the row has a rating. |
posted_at | Publish time in ISO 8601, UTC (for example 2026-08-07T12:34:56+00:00). Non-standard strings from the platform are passed through as is, so parse defensively. null means the platform does not disclose it. |
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. |
useful_count | Keeps the platform's own meaning |
images | Array of image links in the platform's display order; absent when there are no images. |
author_name | Reviewer nickname, returned as JD shows it (JD may already partially mask it). |
author_avatar_url | Reviewer avatar URL. |
author_is_plus | Whether the reviewer is a JD PLUS member. |
buy_count | How many times the reviewer bought this item, as the page shows ('purchased N times'). |
platform | Source platform identifier, the same as platform in the request (for example xiaohongshu, tiktok). |
FAQ
What is a follow-up review good for?
review_append is what a buyer added after the first review, often after using the product for a while: durability, defects, after-sales service. Analyzing it apart from the first review separates short-term from long-term satisfaction.
How much do I learn about each reviewer?
What the page shows publicly: nickname, avatar, PLUS membership and how many times they bought the product. JD may partly mask nicknames. Use this to understand the buyer mix, not to identify individuals.
Where do I get the item_id?
The easiest source is item_id in JD search results. A numeric product ID, or https://item.jd.com/<number>.html with no query string, works too; both point the call at the same product.
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: Review and Photo-posting Rules ↗
JD.com distinguishes reviews, follow-up reviews, images, replies, moderation, folded content, and masked nicknames. Public visibility can depend on review and privacy rules, so a returned set must not be described as the complete review history or as permission to redistribute reviewer content.
Checked 2026-09-11
- JD.com User Service Agreement (Effective January 20, 2026): Public Reviews and Access Boundaries ↗
The JD.com User Service Agreement says review information is public and JD.com may use it under the agreement. It also says personal information generally is not disclosed to third parties without permission and prohibits stealing personal information or infringing lawful rights. This supports access and permission boundaries only; it does not grant EveryInfra or callers rights to redistribute, train on, or commercially reuse text, images, or user information.
Checked 2026-09-11