Shopee Product Details Scraper - JSON & API avatar

Shopee Product Details Scraper - JSON & API

Pricing

from $4.99 / 1,000 product detail collecteds

Go to Apify Store
Shopee Product Details Scraper - JSON & API

Shopee Product Details Scraper - JSON & API

Scrape Shopee product details from URLs or shop/item IDs. Get product titles and, when available, images, prices and ratings in JSON. Process up to 100 unique products per run or integrate via the Apify API. No Shopee login required. Pay only for successfully delivered products.

Pricing

from $4.99 / 1,000 product detail collecteds

Rating

0.0

(0)

Developer

Titan Network

Titan Network

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

a day ago

Last modified

Share

What does Shopee Product Details Scraper do?

Shopee Product Details Scraper turns product URLs or shop/item ID pairs into JSON for product research, catalog analysis, and application workflows. Run it in Apify Console or call it through the Apify API.

Get product titles and, when available, images, prices and ratings. Submit up to 100 unique products per run without providing a Shopee login, proxy configuration, or separate collection-service API key.

Duplicate inputs are removed within a run. Only successfully delivered unique product details trigger the result charge; failed, timed-out, skipped and diagnostic results do not trigger it.

Start with one product and inspect its result before submitting a batch. Product fields can vary, and individual collection requests may take several minutes.

Quick start

  1. Add one current product URL to Product URLs, or provide shopId and itemId as strings in Product IDs.
  2. Set Maximum concurrency to 1 for your first test.
  3. Run the Actor and open Product detail results. Individual requests may take several minutes; the collection window is 30 minutes.
  4. Check status. Successful rows have status: "completed"; expand data to inspect the product payload. Use Collection diagnostics to check failures and skipped products.
  5. Export JSON to preserve nested fields. Run summary shows successful, failed, skipped and duplicate counts.

The following IDs illustrate the input format. Replace both with real identifiers copied from your product URL before running:

{
"items": [
{ "shopId": "12345678", "itemId": "9876543210" }
],
"maxConcurrency": 1
}

Product data and exports

Each unique processed product produces one Dataset row with a stable envelope. Successful rows have status: "completed"; the collected payload is stored under data without renaming its product fields.

Product fields at a glance

DataAvailability and handling
Product identity and titleMatching shop/item identity and a non-empty title are checked before the result charge.
Images, prices and ratingsIncluded when available in the collection response; fields can be absent or null.
Stock and other attributesOptional; inspect the returned payload before relying on these fields.
Product payloadKept under data in its original nested structure.
Collection statuscompleted, failed or skipped; check each product separately.
collectedAtTime the result row was prepared, not the time the source updated its prices or stock.

Before charging, the Actor checks for a matching shop and item ID, a non-empty product title, and no reported inner collection error. Empty payloads, task acknowledgements, mismatched products, and inner error responses become free invalid_response diagnostics. Optional price, stock, and other attributes can be absent.

This is an anonymized excerpt from a verified cloud response. IDs and title are replaced, and only selected fields are shown. It is not a guarantee that every response has these fields:

{
"platform": "shopee",
"inputKey": "12345678:9876543210",
"shopId": "12345678",
"itemId": "9876543210",
"status": "completed",
"collectedAt": "2026-10-15T09:01:46.329Z",
"data": {
"data": {
"item": {
"shop_id": 12345678,
"item_id": 9876543210,
"title": "Anonymized cotton shorts",
"price": 150400000,
"price_min": 150400000,
"price_max": 150400000,
"stock": null,
"item_rating": {
"rating_star": 4.9772727272727275
}
}
},
"error": null,
"error_msg": null
}
}

Verified responses included product identity, title, price, image, and rating/review structures. Their nesting, availability, currency, and units depend on the response. Inspect data before building downstream mappings; do not assume every product contains the same attributes or apply a fixed price conversion.

The excerpt above reflects observed output structure. Product prices, availability, and ratings change over time; the raw numeric price is preserved without conversion.

Output fieldMeaning
platformAlways shopee.
inputKeyProduct identity, usually shopId:itemId; invalid inputs use their input position.
shopId, itemIdIdentifiers preserved as strings. Absent for inputs that cannot be parsed.
market, sourceUrlMetadata derived from the original accepted URL, when available. Omitted for ID-only input.
statuscompleted, failed, or skipped. Always check this field.
collectedAtTime the result row was prepared, in UTC.
dataUnmodified product payload on successful rows.
errorCode, errorType, errorMessage, retryableDiagnostics on failed or skipped rows.

Product detail results includes data. Collection diagnostics omits the product payload and helps identify failed products. JSON exports preserve nested data; CSV and Excel are most useful after selecting the nested fields you need. Duplicate inputs do not produce additional rows.

Run summary

The default Key-Value Store's OUTPUT record contains:

FieldMeaning
submittedCountTotal occurrences, including invalid inputs and duplicates.
uniqueCountValid unique product pairs scheduled or represented in the run.
duplicateCountValid repeated product pairs removed.
successfulCount, failedCount, skippedCountCounts by result status; failed count includes invalid inputs.
chargedCountCustom successful-result billing events; 0 in non-monetized preview runs.
datasetIdDataset containing this run's rows.
stoppedByPresent when stopped for auth_error, circuit_open (legacy recovery), resource_limit, or budget_limit.

One successful product can make a mixed batch finish successfully. Inspect counts and rows rather than relying only on run status. Zero successful products normally means a failed run; reaching a paid event budget is a graceful stop and can finish with zero successes.

Pricing

Pay-per-event prices are in USD and depend on your Apify subscription tier. Check the Pricing tab for the current rates.

Apify tierPer 1,000 successful product detailsPer successful product detail
FREE$6.99$0.00699
BRONZE$5.99$0.00599
SILVER$5.49$0.00549
GOLD$4.99$0.00499
PLATINUM / DIAMOND$4.99$0.00499

The only billing event is product-detail-collected, once per successfully delivered unique product detail. Failed, duplicate, timed-out, skipped, and undelivered products do not trigger it. There is no startup fee or additional Dataset-row fee; diagnostic rows do not trigger a paid event.

Standard Actor-run platform usage is included in the result price. Separate services you use outside the run, such as subsequent storage or exports, follow your Apify plan. Check the Pricing tab and set a run spending limit before submitting a batch. The FREE row refers to Apify's Free subscription tier; it is not a promise of free product results or a custom trial quota.

For example, 100 successfully delivered unique product details cost $0.699 on FREE, $0.599 on BRONZE, $0.549 on SILVER, or $0.499 on GOLD / PLATINUM / DIAMOND, at the rates above. The batch limit is 100 unique products per run.

Input settings

FieldRequiredDescription
startUrlsEither this or itemsArray of objects containing a full product url. Up to 100 entries, in both the form and API.
itemsEither this or startUrlsArray of { "shopId": "...", "itemId": "..." } pairs. Both IDs must be decimal strings copied from a supported product URL. Up to 100 entries.
maxConcurrencyNoInteger from 1 to 2; defaults to 2. Start with 1 when checking availability.

You can combine URLs and ID pairs. Across both fields, a run can contain at most 100 unique shopId:itemId pairs. Matching pairs are duplicates even if their URLs have different parameters. The first occurrence supplies the output's URL and market when present. Results may arrive in a different order from the input.

IDs are normalized as decimal strings without leading zeroes, so 01:002 and 1:2 refer to one product and trigger at most one result charge within the run. Large string IDs retain their full precision.

For ID-only input:

{
"items": [
{ "shopId": "12345678", "itemId": "9876543210" }
],
"maxConcurrency": 1
}

ID-only results omit market and sourceUrl. Completely empty input fails before collection begins, with a status message asking for startUrls or items. Incorrect input containers fail validation; malformed array entries become diagnostic rows while valid products continue. Non-empty input containing only invalid targets produces diagnostic rows and a failed run.

Product URL format

Use a full product detail URL accepted by the Actor's input validation. Product paths can use /product/{shopId}/{itemId} or end in -i.{shopId}.{itemId}. Both HTTP and HTTPS are accepted; credentials and nonstandard ports are not. The original accepted URL is preserved as sourceUrl; query parameters are not needed to identify a product.

Use the example in the input form as a format reference, and replace it with your product. Short share links, redirect resolution, search pages, shop listings, keyword discovery and review pagination are outside this Actor's scope. Unsupported inputs produce free invalid-input diagnostics.

Shopee product details API

Install the official JavaScript client with npm install apify-client, set APIFY_TOKEN in your environment, and run:

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('titan_network/shopee-product-details-scraper').call({
items: [
{ shopId: '12345678', itemId: '9876543210' },
],
maxConcurrency: 1,
});
// listItems returns a page. Iterate when handling larger datasets.
const page = await client.dataset(run.defaultDatasetId).listItems();
for (const row of page.items) {
if (row.status === 'completed') console.log(row.data);
else console.warn(row.inputKey, row.errorType, row.errorMessage);
}
const summary = await client.keyValueStore(run.defaultKeyValueStoreId).getRecord('OUTPUT');
console.log(summary?.value);

Replace the illustrative IDs with your product identifiers and use an account with access to the Actor. Prefer starting a run and fetching its Dataset over a single HTTP request waiting for an entire batch. Failed runs may still contain useful diagnostics in their Dataset.

Python example

Install the official client with pip install apify-client, set APIFY_TOKEN, and replace the illustrative IDs before running:

import json
import os
from apify_client import ApifyClient
client = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor("titan_network/shopee-product-details-scraper").call(
run_input={
"items": [{"shopId": "12345678", "itemId": "9876543210"}],
"maxConcurrency": 1,
}
)
completed = []
for row in client.dataset(run["defaultDatasetId"]).iterate_items():
if row.get("status") == "completed":
completed.append(row)
else:
print(row.get("inputKey"), row.get("errorType"), row.get("errorMessage"))
with open("shopee-products.json", "w", encoding="utf-8") as output_file:
json.dump(completed, output_file, ensure_ascii=False, indent=2)

Both examples start a run and then retrieve Dataset rows. Your Apify token is required for API access; no separate collection-service key or Shopee login is required.

Use cases

  • Product research: inspect details for a known list of products without copying product pages manually.
  • Catalog enrichment: use shop and item identifiers to attach available product details to an existing catalog.
  • Application workflows: run this Shopee product scraper through the Apify API and process completed JSON results in your own application.

FAQ and support

Do I need a Shopee account or a proxy?

No. Enter URLs or ID pairs; collection configuration is managed by the Actor developer. Calling the Actor through the Apify API requires your Apify token.

Can I collect a shop, search results, or all reviews?

This release retrieves individual product details. It does not discover links or paginate reviews, even if a returned payload contains some review information.

Will repeating an input return cached data for free?

A new run creates new collection requests and can incur new result charges. Duplicate removal and Dataset-based recovery apply within the same run. They are not a cross-run cache or an exactly-once guarantee across services.

If recovery detects an invalid stored completed result, an older non-canonical ID format, or an oversized legacy Dataset, the Actor stops and asks you to contact the developer with the Run ID. It does not automatically collect and charge those products again.

How do I report a problem?

Use the Actor's Issues tab. Include the Run ID and errorCode/errorType. Do not post API tokens or private credentials. Keep sensitive inputs out of public issues.

Does every product include prices, stock and ratings?

No. Optional fields depend on the collection response and may be absent or null. Inspect data before building downstream mappings. Raw numeric prices are preserved without conversion; verify units before treating them as currency amounts.

Am I charged for failed products?

Failed, timed-out, duplicate, skipped and undelivered products do not trigger the product-detail-collected event. Only successfully delivered unique product details trigger this result charge.

Can I use the Actor through an API?

Yes. Use the Apify API or an official client to start a run and retrieve its Dataset. See the JavaScript and Python examples above, and process rows with status: "completed".

If this Actor has helped your work, a review is appreciated.

Errors and troubleshooting

DiagnosticWhat to do
invalid_inputUse a full product URL or numeric strings for both IDs.
not_foundCheck that the product still exists and is accessible.
risk_controlCollection was blocked. Try later; repeated runs may encounter the same restriction.
rate_limitedReduce concurrency and wait before a later attempt. No automatic retry is performed.
timeoutCollection did not finish in time. No automatic retry is performed. A task may still be executing; avoid immediately resubmitting it.
upstream_errorThe service rejected or could not complete the request. It is not automatically repeated because its submission outcome may be uncertain.
invalid_responseNo valid product payload was returned. Retry later or report the Run ID.
auth_errorService configuration issue. Contact the developer with the Run ID; a user-supplied key is not required.
circuit_openSeveral service failures stopped remaining work. Retry affected products later.
budget_limitA paid event budget prevented delivery. Increase the budget before resubmitting skipped products.
resource_limitRequests stopped for a failure, request-count, time, or recovery limit. Read the first protection diagnostic. Wait and investigate repeated failures before starting another run. Contact the developer with the Run ID if collection remains unavailable.

A diagnostic row includes the original input and a sanitized error message. Malformed URL entries or non-scalar IDs use placeholders rather than copying an arbitrary object. For example:

{
"platform": "shopee",
"inputKey": "12345678:9876543210",
"shopId": "12345678",
"itemId": "9876543210",
"originalInput": "12345678:9876543210",
"status": "failed",
"collectedAt": "2026-10-15T00:00:00.000Z",
"errorCode": "404",
"errorType": "not_found",
"errorMessage": "The product was not found.",
"retryable": false
}

retryable describes whether a failure may be transient; it does not enable automatic retries. This release never automatically repeats a collection request. A new run may succeed after conditions change.

Collection protection

  • At most 100 unique products and 100 collection requests per run, with 2 requests in flight at most. These limits cannot be increased through input fields.
  • Stop starting new requests after 3 consecutive collection failures or 10 total collection failures. All collection errors count, including timeouts and invalid product responses. Locally rejected input does not consume this failure allowance.
  • The collection window is 30 minutes, retained on restart. Each request can take at most 310 seconds. A new request starts only when that full timeout still fits in the window, so scheduling can stop around minute 24:50. The default platform timeout is 31 minutes to allow result cleanup; a shorter user timeout may interrupt earlier.
  • Already submitted requests are allowed to settle. With concurrency 2, at most one other request can remain in flight when the failure threshold is reached. This can increase observed failures to 4 consecutive or 11 total; no new request is admitted after the threshold is observed.
  • A durable per-run submission journal is written before each request. Restarting this run does not automatically submit the same product again. Uncertain prior submissions, malformed protection state, or a journal write failure stop further submissions. Partial older runs without a journal also stop adding new work.
  • Protection-skipped rows are not billed. Successful valid results already collected may still be delivered and billed. This Actor cannot cancel tasks already submitted to the collection service.

These are per-run protections. They do not implement a shared quota or failure cooldown across newly created runs. Avoid repeatedly creating runs for the same failures.

Responsible use

Collect and use only data you are authorized to access. Respect applicable laws, privacy and intellectual-property rights, marketplace terms, and rate limits. You are responsible for how you use and retain results.

Not affiliated with or endorsed by Shopee.

中文说明

提交商品详情链接,或字符串格式的 shopId / itemId,每次最多处理 100 个去重商品。无需提供 Shopee 登录信息、代理或额外服务密钥。首次建议用一个商品、并发 1 测试。

使用输入表单接受的完整商品链接或 ID 对;具体参数见上方 Input settings。不符合格式的输入会输出免费错误诊断。

每 1,000 条成功交付的详情:FREE $6.99、BRONZE $5.99、SILVER $5.49、GOLD / PLATINUM / DIAMOND $4.99,币种均为美元。FREE 指 Apify 订阅档位,不代表免费采集额度。

输出入口 Product detail results 提供含 data 的完整结果,Collection diagnostics 用于查错,Run summary 提供计数。成功为 completed,失败为 failed,跳过为 skipped;批次成功不代表每个商品成功。建议导出 JSON 保留嵌套字段,商品价格单位和字段结构以实际返回为准。

采集可能需要几分钟,遇到超时可稍后单独重跑。仅对成功交付触发 product-detail-collected 事件,失败诊断、重复和未交付结果不触发该事件;不收启动费和额外 Dataset 行费。标准 Actor 运行资源包含在结果价中,运行之外的存储、导出等服务以 Apify 方案为准。

收费前会核对商品 ID、非空标题和内层错误状态;空结果、任务受理回执及商品不匹配不会作为成功详情收费。价格、库存等可选字段可以缺失。恢复旧运行时若发现无效成功记录,会停止并提示联系开发者,避免自动重复采集计费。

More from Titan Network

Explore all Titan Network Actors.