Shopee Cambodia Scraper - Products, Prices & Sellers avatar

Shopee Cambodia Scraper - Products, Prices & Sellers

Pricing

from $1.50 / 1,000 product results

Go to Apify Store
Shopee Cambodia Scraper - Products, Prices & Sellers

Shopee Cambodia Scraper - Products, Prices & Sellers

Scrape public Shopee Cambodia collections and campaign products without signing in. Extract prices, ratings, images, variants, seller information and other structured product details from public listings.

Pricing

from $1.50 / 1,000 product results

Rating

0.0

(0)

Developer

Abot API

Abot API

Maintained by Community

Actor stats

1

Bookmarked

2

Total users

1

Monthly active users

5 days ago

Last modified

Categories

Share

Shopee Cambodia Scraper: Collection and Campaign Products

Shopee Cambodia Scraper turns a Shopee Cambodia collection or campaign page into a clean product feed, without signing in. Paste a collection link or a campaign page, and get every listed product's current and original price, discount, rating, images, variants and seller data, plus the complete source record for anything not mapped to a named field. Export to JSON, CSV or Excel, or read the results through the API.

Why This Scraper?

  • Two ways in. Paste a collection link (/collections/ID) or a campaign page (/m/name); a campaign is resolved into the collection or collections it actually contains.
  • Full price and rating detail. Current price, original price, discount percentage, currency, rating and the rating breakdown come flattened as named fields, alongside the complete source record.
  • Multiple links in one run. Submit several collection or campaign links together; exact duplicate products found through more than one link are removed automatically.
  • Resilient to refusals. A refused request retries on a fresh connection with spaced backoff instead of failing the whole run.
  • Resume without double paying. Continue a capped or interrupted run by its run or dataset ID; products it already returned are skipped (add ?page=N when the previous run got past the first page, see Resume below).
  • Incremental mode for schedules. Recurring runs of the same collection label new and updated products and suppress unchanged ones by default.
  • Optional app export. Pipe a summary of each product into apps you already use through MCP connectors, without changing the dataset.

Use Cases

  • E-commerce analysts: track current price, original price and discount depth across Shopee Cambodia's featured and campaign collections.
  • Marketplace researchers: monitor how a curated collection's composition, ranking and stock change over time.
  • Deal and content teams: build a "today's deals" feed from a campaign page's collections.
  • Competitive intelligence: watch a competitor's promoted collection for price, rating and stock changes on a schedule.

Data You Get

Sample shape: values are illustrative placeholders, not from a live record.

FieldExample
id"kh:900000001:800000001"
itemId / shopId"800000001" / "900000001"
name"Cotton Bath Towel Set (4 Pack)"
translatedNametranslated product name, when the source supplies one
url"https://shopeekh.com/product/900000001/800000001"
price18500
originalPricenull (often empty even on discounted products, see below)
discountPercent26
currency"KHR"
rating4.7
ratingCount128
ratingDistribution[128, 1, 2, 5, 20, 100]: total first, then 1 to 5 star counts
inStocktrue
imagesproduct image URLs
videosvideo renditions, when the product has any
variantssize, color and other option groups
shopseller name, icon and location, as supplied by the source
categoryIds[100050, 100120]
brandbrand name, when the source supplies one
likes / isVerifiedSeller12 / true
collectionId / collectionName"12453606" / "Home Essentials"
market"kh"
sourceUrlthe collection or campaign link the product was found through
scrapedAt"2026-01-15T08:30:00+00:00"

productData and displayAssets carry the complete source objects for the product and its display card, so nothing the source returns is lost even when a field above isn't populated. Discounted products often come back with a discountPercent and a current price but originalPrice set to null, because the source leaves its original price slot empty and shows the pre discount price as a struck-through price instead. When you need it, read productData.item_card_display_price.strikethrough_price and divide by 100000 to get the same KHR units as price.

How to Use

  1. Paste one or more Shopee Cambodia collection or campaign links into Start URLs.
  2. Set Maximum products and Maximum pages per collection to control how much of a collection is fetched.
  3. Optionally turn on Resume from run ID for an interrupted run, or Incremental mode for a recurring one.
  4. Click Start, then download the dataset as JSON, CSV or Excel, or read it through the API.

A single collection:

{
"urls": ["https://shopeekh.com/collections/12453606"],
"maxItems": 20
}

A campaign page (resolved into its collections):

{
"urls": ["https://shopeekh.com/m/Sample-Campaign-Page"],
"maxItems": 100
}

Multiple links, one starting from a later page:

{
"urls": [
"https://shopeekh.com/collections/12453606?page=2",
"https://shopeekh.com/collections/98765432"
],
"maxPages": 5
}

Recurring runs of the same collection:

{
"urls": ["https://shopeekh.com/collections/12453606"],
"incrementalMode": true,
"stateKey": "daily-deals-collection"
}

Run it from your code

Python:

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("abotapi/shopee-collection-products").call(run_input={"urls": ["https://shopeekh.com/collections/12453606"], "maxItems": 50})
for product in client.dataset(run["defaultDatasetId"]).iterate_items():
print(product["name"], product["price"], product["currency"])

JavaScript:

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('abotapi/shopee-collection-products').call({ urls: ['https://shopeekh.com/collections/12453606'], maxItems: 50 });
const { items } = await client.dataset(run.defaultDatasetId).listItems();

Or connect it to Make, Zapier, n8n, Google Sheets or webhooks from the Integrations tab.

Products are fetched in fixed size pages (60 products per page) starting at the page named in the URL (?page=1 starts at the second page). Repeated links are deduplicated automatically before fetching starts. Maximum products caps unique products across every link in the run; set it to 0 to remove that cap and rely only on Maximum pages per collection, a per collection safety limit that does not guarantee that many pages, since a collection can run out of products earlier. The actor never reads past a collection's 100th page (6,000 products), counted from the collection's first page, so a link starting at ?page=40 gets at most 60 pages whatever Maximum pages says.

If you submit several links whose collections share some of the same products, a collection can stop paging earlier than expected and silently miss products: a page made entirely of products another link already returned earlier in the same run reads as "nothing new here" and ends that collection's own walk, even if it holds more unique products further in. The run still succeeds, so nothing in the status tells you. Two concrete shapes:

  • On the first page. Link A returns products 1 to 60 on its first page. Link B's first page is those same 60 products, so B stops there, and the 40 products that only B holds on its second page are never returned.
  • Partway through. Link C's first page is fresh, but its second page is exactly 60 products link A already returned, so C stops there, and C's third page of unique products is never requested.

A campaign link that resolves into several collections behaves like several links in one run, so the same applies there. When full coverage matters, scrape overlapping collections in separate runs (one link per run) and remove duplicates afterwards using id, and check the run log's "Page N: collected X products" lines to confirm each collection reached its own last page.

Resume and recurring updates

  • Resume (resumeFromRunId) continues one interrupted or capped run: paste its run or dataset ID and the actor skips every product it already returned, paging until it reaches unseen products. Resume is opt-in and cannot be combined with Incremental mode.
  • Incremental mode (incrementalMode) is for recurring runs over the same collection. Each product is classified NEW the first time it's seen, UPDATED when its data changes (the changedFields value is a fixed marker, not a per field list), or UNCHANGED, which is suppressed and not billed unless emitUnchanged is on. stateKey names or shares the stored baseline; leave it empty to derive one from the collection URLs. There is no expired or reappeared classification: a product that stops appearing in the collection is simply not returned that run, and Incremental mode off returns output exactly as before.

Important Resume limitation: a resumed run usually fails if the previous run got past the first page. Resume starts again from the URL's page and stops a collection as soon as one page contains nothing new. If your previous run already returned every product on the collection's first page (in practice, any run that returned 60 or more products from that collection, not only an exact multiple of 60), the resumed run's first page is all already returned products, so it stops before ever requesting page two. With a single link this means the whole resumed run fails with "No products were returned. Check the collection link." and returns nothing, even though the collection has more products. With several links, that collection is silently skipped while the others continue. Resume works as expected only when the previous run stopped inside the first page (for example a run capped at the default 20 products).

Workaround: skip the pages you already have with ?page=N, where N is the number of full 60 product pages the previous run covered for that collection. For example, if the previous run returned 100 products from https://shopeekh.com/collections/12453606, resume with https://shopeekh.com/collections/12453606?page=1. Campaign links do not accept ?page=; use the collectionId values in your previous dataset to paste the underlying /collections/ID?page=N links instead. Or simply start a fresh run.

Incremental mode with no changes also fails the run. If every product in a scheduled Incremental run is UNCHANGED and Also return unchanged products is off, the run returns zero products and ends as failed with "No products were returned," not as an empty success. Treat that failure on a scheduled Incremental run as "nothing changed," or turn on Also return unchanged products if your pipeline needs every run to succeed. The stored baseline is not updated by a run that fails this way.

Send results into your apps (MCP connectors)

Optionally pipe the scraped products into the apps you already use, via Model Context Protocol (MCP) connectors. This is an extra delivery step after the scrape: the Apify dataset is never changed.

What gets written to the connector: a condensed, human readable summary of each product, not the full JSON. Each item becomes one entry with a title and its key fields flattened to plain text. The complete record always stays in the Apify dataset.

  1. Authorize a connector once under Apify, Settings, Integrations (Notion, Linear, Airtable, or Apify).
  2. Select it in the "Pipe results into your apps" input field. (If the picker is empty, you haven't authorized a connector yet.)
  3. For Notion, also set notionParentPageUrl to the page where product pages should be created.

The connection is mediated by Apify's MCP proxy, so this actor never sees your third party credentials. Leave the field empty to skip. An export failure never invalidates the scraped dataset.

Input Parameters

ParameterTypeDefaultDescription
urlsarraysample collection linkShopee Cambodia collection or campaign links. Collection links use /collections/ID; campaign links use /m/name. Search, filtered and product detail links are rejected.
maxItemsinteger20Maximum unique products across all links. Set 0 to use only the page limit.
maxPagesinteger100Safety limit on pages fetched per collection, starting at the URL's page. Availability can end earlier; the limit does not guarantee that many pages.
resumeFromRunIdstring(none)Continue one interrupted run by skipping products it already returned. Cannot be combined with Incremental mode.
incrementalModebooleanfalseFor recurring runs of the same collection, label new and updated products and suppress unchanged ones by default.
stateKeystring(none)Stable name for the incremental baseline. Derived from the collection URLs when left empty.
emitUnchangedbooleanfalseWhen Incremental mode is on, also return products whose data is unchanged since the previous run.
proxyobjectApify ProxyStandard Apify proxy settings, or your own proxy URLs.
mcpConnectorsarray(none)Optional: send a summary of each product to apps you authorized under Integrations.
notionParentPageUrlstring(none)Notion connector only: page under which product pages are created.
maxNotifyListingsinteger50Cap on items written to each connector per run. Does not affect the dataset.

Output Example

Sample shape: values are illustrative placeholders, not from a live record.

{
"id": "kh:900000001:800000001",
"itemId": "800000001",
"shopId": "900000001",
"name": "Cotton Bath Towel Set (4 Pack)",
"translatedName": "សំណុំកន្សែងងូតទឹកកប្បាស (4 ដុំ)",
"url": "https://shopeekh.com/product/900000001/800000001",
"price": 18500,
"originalPrice": null,
"discountPercent": 26,
"currency": "KHR",
"rating": 4.7,
"ratingCount": 128,
"ratingDistribution": [128, 1, 2, 5, 20, 100],
"images": ["https://down-kh.img.susercontent.com/file/sample-image-1"],
"videos": [],
"variants": [{ "name": "Color", "options": ["White", "Blue"] }],
"shop": { "shop_name": "Sample Home Store", "shop_location": "Phnom Penh" },
"categoryIds": [100050, 100120],
"brand": null,
"inStock": true,
"likes": 12,
"isVerifiedSeller": true,
"collectionId": "12453606",
"collectionName": "Home Essentials",
"market": "kh",
"sourceUrl": "https://shopeekh.com/collections/12453606",
"scrapedAt": "2026-01-15T08:30:00+00:00",
"productData": {},
"displayAssets": {}
}

Plan Requirement

The default proxy setting works for most public collections without extra configuration, and a refused request automatically retries on a fresh connection before the run fails. For high volume or frequent scheduled runs, a paid Apify Proxy group can reduce refusals; pick one under Connection. Custom proxy URLs, or no proxy at all, are also supported.

FAQ

How much does it cost?

You pay per product returned. The Pricing tab shows the current rates. Use Maximum products to cap the cost of any run.

This actor collects only publicly available collection and campaign data, without signing in. You are responsible for how you use the results: follow Shopee's terms and the laws that apply to you, and get legal advice before any commercial redistribution. Prices and stock status are generally facts, but product photos, videos and seller branding may be subject to third party rights.

Can I get only new or updated products on a schedule?

Yes. Schedule the actor from the Schedules tab and turn on Incremental mode. Each run then labels the collection's new and updated products, and unchanged ones are suppressed, and not billed, unless you turn on Also return unchanged products. A run in which nothing changed ends as failed rather than empty; see the Incremental question below.

Why does the actor reject my URL, or only return Cambodia products?

This actor currently supports only Shopee Cambodia (shopeekh.com) collection and campaign links. Keyword search, product detail pages, review pages and filtered collection links (for example a link with a sort or price filter applied) are rejected with a clear message rather than silently ignored. Paste the plain collection or campaign link instead.

Why did my run fail instead of returning an empty dataset?

If a collection link cannot be read at all, for example every request to it is refused or the page returns no product list, the run stops with a clear message so "this collection has no products" is never confused with "nothing could be read." Retry in a few minutes, or check the link in a browser. The same "No products were returned" failure also appears when a resumed run finds nothing new on its first page, or an Incremental run finds nothing changed; both are covered below.

Why did a run return fewer products than a large collection actually holds?

Two independent limits apply: Maximum products stops the whole run once enough unique products have been returned, and Maximum pages per collection stops paging through any one collection. Raise either, or set Maximum products to 0 to remove the item cap. If you submitted several links whose collections share products, a collection can also stop early, as described under Multiple links and page caps above.

Why did my resumed run fail or return zero new products?

Usually it doesn't return zero, it fails. Resume restarts from the URL's page and stops a collection at the first page with nothing new. If your previous run returned the whole first page of the collection (any run that got 60 or more products from it), the resumed run's first page is all already returned products, so it stops before requesting page two. With one link the entire run fails with "No products were returned. Check the collection link."; with several links that collection is silently skipped. Resume with ?page=N added to the collection link, where N is the number of full 60 product pages you already have (100 products returned means ?page=1), or start a fresh run. Campaign links don't accept ?page=, so paste the underlying /collections/ID links from the collectionId field instead.

Why did my scheduled Incremental run fail with "No products were returned"?

Because nothing in the collection changed. With Incremental mode on and Also return unchanged products off, a run where every product is unchanged returns zero products, and the actor treats zero products as a failure rather than an empty success. Read that failure as "no changes since last run," or turn on Also return unchanged products if every scheduled run must succeed.

Can I use it with AI agents or MCP?

Yes. Call it from any Apify integration or MCP client, and use the connector field to push a summary of each product into Notion, Linear or Airtable.

🔗 More scrapers you might like

Pair this actor with these related scrapers from the same team:

🛒 Tokopedia Scraper
Extract product data from Tokopedia, Indonesia’s largest marketplace. Search by keyword...
🧩 Joom Scraper
Scrape Joom products by keyword or URL. Extract product names, prices, discounts...
🛒 ROSSMANN.de Scraper
Scrape ROSSMANN (rossmann.de) drugstore products: current + original strike-through price...
🛒 Cdiscount Scraper
Scrape product data from Cdiscount.com by keyword, category, or URL. Apply filters and...
🛒 Kmart Scraper
Scrape products and customer reviews from Kmart.com.au. Search by keyword or use...
🛒 Thegioididong Scraper
Scrape thegioididong.com products with full specifications, current & original price...

👉 Browse all abotapi scrapers

💬 Support

  • 🐞 Found a bug or a missing field? Open a ticket on the Issues tab. We usually reply within hours.
  • 🛠️ Need another site, extra fields or a private build? Email contact@abotapi.com.
  • ⭐ Enjoying it? A quick review on the actor page helps other users find it.