Shopee Product Details Scraper - JSON & API
Pricing
from $4.99 / 1,000 product detail collecteds
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
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
0
Monthly active users
a day ago
Last modified
Categories
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
- Add one current product URL to Product URLs, or provide
shopIdanditemIdas strings in Product IDs. - Set Maximum concurrency to
1for your first test. - Run the Actor and open Product detail results. Individual requests may take several minutes; the collection window is 30 minutes.
- Check
status. Successful rows havestatus: "completed"; expanddatato inspect the product payload. Use Collection diagnostics to check failures and skipped products. - 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
| Data | Availability and handling |
|---|---|
| Product identity and title | Matching shop/item identity and a non-empty title are checked before the result charge. |
| Images, prices and ratings | Included when available in the collection response; fields can be absent or null. |
| Stock and other attributes | Optional; inspect the returned payload before relying on these fields. |
| Product payload | Kept under data in its original nested structure. |
| Collection status | completed, failed or skipped; check each product separately. |
collectedAt | Time 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 field | Meaning |
|---|---|
platform | Always shopee. |
inputKey | Product identity, usually shopId:itemId; invalid inputs use their input position. |
shopId, itemId | Identifiers preserved as strings. Absent for inputs that cannot be parsed. |
market, sourceUrl | Metadata derived from the original accepted URL, when available. Omitted for ID-only input. |
status | completed, failed, or skipped. Always check this field. |
collectedAt | Time the result row was prepared, in UTC. |
data | Unmodified product payload on successful rows. |
errorCode, errorType, errorMessage, retryable | Diagnostics 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:
| Field | Meaning |
|---|---|
submittedCount | Total occurrences, including invalid inputs and duplicates. |
uniqueCount | Valid unique product pairs scheduled or represented in the run. |
duplicateCount | Valid repeated product pairs removed. |
successfulCount, failedCount, skippedCount | Counts by result status; failed count includes invalid inputs. |
chargedCount | Custom successful-result billing events; 0 in non-monetized preview runs. |
datasetId | Dataset containing this run's rows. |
stoppedBy | Present 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 tier | Per 1,000 successful product details | Per 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
| Field | Required | Description |
|---|---|---|
startUrls | Either this or items | Array of objects containing a full product url. Up to 100 entries, in both the form and API. |
items | Either this or startUrls | Array of { "shopId": "...", "itemId": "..." } pairs. Both IDs must be decimal strings copied from a supported product URL. Up to 100 entries. |
maxConcurrency | No | Integer 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 jsonimport osfrom apify_client import ApifyClientclient = 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
| Diagnostic | What to do |
|---|---|
invalid_input | Use a full product URL or numeric strings for both IDs. |
not_found | Check that the product still exists and is accessible. |
risk_control | Collection was blocked. Try later; repeated runs may encounter the same restriction. |
rate_limited | Reduce concurrency and wait before a later attempt. No automatic retry is performed. |
timeout | Collection did not finish in time. No automatic retry is performed. A task may still be executing; avoid immediately resubmitting it. |
upstream_error | The service rejected or could not complete the request. It is not automatically repeated because its submission outcome may be uncertain. |
invalid_response | No valid product payload was returned. Retry later or report the Run ID. |
auth_error | Service configuration issue. Contact the developer with the Run ID; a user-supplied key is not required. |
circuit_open | Several service failures stopped remaining work. Retry affected products later. |
budget_limit | A paid event budget prevented delivery. Increase the budget before resubmitting skipped products. |
resource_limit | Requests 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.