# Carousell Scraper — SG MY HK PH Listings & Prices (`crawloop/carousell-scraper`) Actor

Carousell scraper for Singapore, Malaysia, Hong Kong, Philippines, Taiwan and Indonesia. Extract listing prices, conditions, images, meetup locations, deal methods and seller ratings. Carousell API alternative — JSON via Python, Node.js, MCP.

- **URL**: https://apify.com/crawloop/carousell-scraper.md
- **Developed by:** [Andrej Kiva](https://apify.com/crawloop) (community)
- **Categories:** E-commerce, Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.19 / 1,000 listings

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Carousell Scraper — Singapore, Malaysia, Hong Kong & Philippines Listings

> **Disclaimer:** Unofficial tool developed independently. Not affiliated with, sponsored by, or endorsed by Carousell Group Pte. Ltd. Carousell and related trademarks belong to their respective owners. Data is read from publicly accessible listing surfaces. Provided for informational and research use; you must comply with Carousell terms and applicable law.

**Carousell scraper** for Southeast Asia’s largest C2C marketplace — scrape Carousell listings into JSON/CSV via Apify. Pull keyword browse, category pages, seller profiles, or listing URLs across **Singapore, Malaysia, Hong Kong, Philippines, Taiwan, and Indonesia**. Each row can include title, numeric price + currency, condition, images, description, meetup location, deal methods, likes, and seller rating / reviews / tenure. Fast HTTP path (no heavy browser) with **residential proxy** for Cloudflare. Use it as a **Carousell API alternative** from **Python**, **Node.js**, cURL, or **MCP** / AI assistants.

**Best for:** Carousell Singapore / Malaysia price tracking, sourcing, seller monitoring, and regional secondhand research.

> **Crawloop classifieds suite** — marketplace scrapers for SEA / EU / US.

| Carousell Scraper ◄── you are here | [Leboncoin Scraper](https://apify.com/crawloop/leboncoin-scraper) | [Kleinanzeigen Scraper](https://apify.com/crawloop/kleinanzeigen-scraper) | [Marktplaats Scraper](https://apify.com/crawloop/marktplaats-scraper) | [Facebook Marketplace Scraper](https://apify.com/crawloop/facebook-marketplace-scraper) |
| :--- | :--- | :--- | :--- | :--- |
| SEA C2C listings + sellers | France classifieds | Germany classifieds | Netherlands marketplace | Facebook Marketplace |

### When to use this Actor

- **Carousell search scraping** — Keywords (peer-to-peer browse) plus `/search/` fallback
- **Category inventory** — Most reliable mode: Computers & Tech, luxury, fashion, furniture, cars, or any public category URL / slug
- **Listing detail enrichment** — Full description, image gallery, meetup address, deal method, category path, seller stats
- **Seller monitoring** — All public ads for a username (`/u/…`)
- **Regional coverage** — One Actor for SG / MY / HK / PH / TW / ID (AU / NZ / CA storefronts still selectable)

### When not to use this Actor

- **Private chat, offers, or phone numbers** — Only public listing and profile fields
- **Authenticated CarouBiz dashboards** — No login
- **Shopee / Lazada retail search** — Different platforms; this Actor is Carousell C2C only

### Key features

- **Keywords + URLs + sellers** — Mix search terms, category slugs, listing URLs, and usernames in one run
- **Stable HTML parse** — Listing cards via `data-testid="listing-card-{id}"` (not hashed CSS class names)
- **Deep pagination** — HTML pages cap around 40–48 cards with no `?page=`; price-band partitioning finds more unique IDs
- **Optional detail pass** — `fetchDetails` adds meetup, deal methods, attributes, seller rating / reviews / years on Carousell
- **Cloudflare-ready HTTP** — Chrome TLS impersonation; **residential proxy in the target country required**
- **MCP / AI ready** — Call from Claude, Cursor, and other tools via Apify MCP

### Input Parameters

| Parameter | Type | Default | Description |
| :--- | :--- | :--- | :--- |
| `country` | String | `SG` | `SG`, `MY`, `HK`, `PH`, `TW`, `ID`, `AU`, `NZ`, `CA` |
| `searchQueries` | Array | — | Keywords (peer-to-peer `/q/` browse) |
| `startUrls` | Array | — | Category, search, listing, or seller URLs |
| `categoryUrls` | Array | — | Full category URL or slug (`computers-tech-213`) |
| `sellerUsernames` | Array | — | Public usernames without `@` |
| `sortBy` | String | `recent` | `recent`, `popular`, `price_asc`, `price_desc` |
| `minPrice` / `maxPrice` | Integer | — | Price range in local currency |
| `condition` | String | `any` | `brand_new`, `like_new`, `lightly_used`, `well_used`, `heavily_used` |
| `fetchDetails` | Boolean | `false` | Visit each listing page for full fields |
| `deepPagination` | Boolean | `true` | Split by price band after a full first page |
| `maxItems` | Integer | `100` | Maximum dataset rows |
| `requestDelayMs` | Integer | `400` | Delay between HTTP requests |
| `proxyConfiguration` | Object | Residential | Apify Proxy — **residential in the selected country required** |

#### Input example

```json
{
  "country": "SG",
  "searchQueries": ["iphone 15"],
  "maxItems": 50,
  "fetchDetails": true,
  "sortBy": "recent",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["RESIDENTIAL"],
    "apifyProxyCountry": "SG"
  }
}
```

Category crawl:

```json
{
  "country": "SG",
  "categoryUrls": ["computers-tech-213"],
  "maxItems": 100,
  "deepPagination": true
}
```

Direct listing / seller URLs (example strings for copy-paste into Start URLs):

```json
{
  "startUrls": [
    { "url": "https://www.carousell.sg/categories/luxury-20/" },
    { "url": "https://www.carousell.sg/p/example-listing-1234567890/" },
    { "url": "https://www.carousell.sg/u/example_seller/" }
  ],
  "fetchDetails": true,
  "maxItems": 25
}
```

### Output Format

Each dataset row = one Carousell listing.

| Field | Type | Description |
| :--- | :--- | :--- |
| `id` | String | Numeric listing ID |
| `url` | String | Canonical `/p/{slug}-{id}/` URL |
| `title` | String | Headline |
| `description` | String | Body (full with `fetchDetails`) |
| `price` | Number | Numeric price |
| `priceFormatted` | String | Display price (`S$80`) |
| `currency` | String | ISO code (`SGD`, `MYR`, `HKD`, `PHP`, `TWD`, `IDR`) |
| `condition` | String | Brand new / Like new / Lightly used / Well used / Heavily used |
| `category` / `subcategory` / `categoryPath` | String / Array | Taxonomy breadcrumbs |
| `attributes` | Object | Type, brand, model, storage, CO2 saved, … |
| `country` / `countryName` | String | Marketplace |
| `location` / `meetupLocation` | String | Area and meetup address |
| `dealMethods` | Array | `Meet-up`, mailing / delivery |
| `isNegotiable` / `isFixedPrice` | Boolean | Offer vs fixed price |
| `isSold` / `isBumped` / `isCertified` / `buyerProtection` | Boolean | Status and badges |
| `likesCount` | Integer | Likes when visible |
| `postedAtRelative` / `listedAt` | String | Relative time + estimated ISO |
| `images` / `imageUrl` | Array / String | Product photos |
| `seller.username` / `url` / `avatarUrl` | String | Public profile |
| `seller.rating` / `reviewCount` / `tenureYears` | Number | Reputation (detail pass) |
| `sourceUrl` / `searchQuery` / `scrapedAt` | String | Provenance |

#### Output example

```json
{
  "id": "1456947036",
  "url": "https://www.carousell.sg/p/corsair-vengeance-lpx-16gb-3200mhz-ddr4-1456947036/",
  "title": "Corsair Vengeance LPX 16GB 3200Mhz DDR4",
  "description": "2 sets of Corsair Vengeance LPX 2x8GB (16GB) 3200Mhz. Self collection only.",
  "price": 80,
  "priceFormatted": "S$80",
  "currency": "SGD",
  "condition": "Well used",
  "category": "Computers & Tech",
  "subcategory": "Computer Parts",
  "categoryPath": ["Computers & Tech", "Parts & Accessories", "Computer Parts"],
  "attributes": { "type": "Memory RAM", "brand": "Corsair", "co2SavedKg": 22.9 },
  "country": "SG",
  "countryName": "Singapore",
  "location": "Blk 528a Pasir Ris Street 51",
  "meetupLocation": "Blk 528a Pasir Ris Street 51",
  "dealMethods": ["Meet-up"],
  "isNegotiable": false,
  "isFixedPrice": true,
  "isSold": false,
  "isBumped": false,
  "isCertified": false,
  "buyerProtection": false,
  "likesCount": 3,
  "postedAtRelative": "2 hours ago",
  "images": ["https://media.karousell.com/media/photos/products/2026/8/21/example.jpg"],
  "seller": {
    "username": "spideypiastri",
    "url": "https://www.carousell.sg/u/spideypiastri/",
    "rating": 5.0,
    "reviewCount": 30,
    "tenureYears": 8
  },
  "searchQuery": "",
  "scrapedAt": "2026-08-21T21:50:00Z"
}
```

### Use cases

- **Secondhand price intelligence** — Track iPhone / luxury / laptop comps across SG and MY
- **Sourcing & arbitrage** — Sort by lowest price, filter condition, watch meetup vs delivery
- **Seller research** — Rating, review count, and tenure for active listings
- **Category supply** — How many Well used vs Brand new units sit in a vertical
- **Lead lists** — Public seller usernames and profile URLs for outreach (no private contacts)

### Integration examples

#### Node.js

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('crawloop/carousell-scraper').call({
  country: 'SG',
  searchQueries: ['iphone 15'],
  maxItems: 50,
  fetchDetails: true,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

#### Python

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_API_TOKEN>")
run = client.actor("crawloop/carousell-scraper").call(run_input={
    "country": "SG",
    "searchQueries": ["iphone 15"],
    "maxItems": 50,
    "fetchDetails": True,
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["title"], item["price"], item["url"])
```

#### cURL

```bash
curl -X POST "https://api.apify.com/v2/acts/crawloop~carousell-scraper/runs?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"country":"SG","searchQueries":["iphone 15"],"maxItems":20}'
```

### MCP and AI assistants

Use this Actor from AI tools via [Apify MCP](https://docs.apify.com/platform/integrations/mcp). Connect your Apify account, then call this Actor by its Store ID `crawloop/carousell-scraper`.

Example prompts:

- "Run Carousell Scraper for iphone 15 in Singapore, fetch details, and return the 20 cheapest rows as JSON"
- "Scrape Carousell Malaysia listings in computers-tech and summarize median price by condition"
- "Chain Carousell Scraper then [Leboncoin Scraper](https://apify.com/crawloop/leboncoin-scraper) to compare secondhand laptop prices SG vs FR"

### Suite next step

After Carousell listings, run [Leboncoin Scraper](https://apify.com/crawloop/leboncoin-scraper) or [Kleinanzeigen Scraper](https://apify.com/crawloop/kleinanzeigen-scraper) for European classifieds comps, or [Facebook Marketplace Scraper](https://apify.com/crawloop/facebook-marketplace-scraper) for another C2C channel.

### FAQ

**Which countries work?** Live storefronts: Singapore, Malaysia, Hong Kong, Philippines, Taiwan, Indonesia. Australia, New Zealand, and Canada paused new sign-ups in 2023; the domains are still selectable if pages resolve.

**Is this a Carousell Malaysia / Hong Kong / Taiwan scraper?** Yes — set `country` to `MY`, `HK`, `TW`, `PH`, or `ID`. Category slugs differ by region.

**Keyword browse vs `/search/?query=`?** `/{keyword}/q/` targets peer-to-peer listings. Carousell’s `/search/?query=` surface often skews toward Certified products for phones. **Category URLs** are the most stable SSR path; keywords try `/q/` then `/search/`.

**Why residential proxy?** Cloudflare challenges datacenter IPs (`403` / “Just a moment…”). Pin Apify residential to the same country as `country`.

**Does it paginate?** The first HTML page has no `?page=`. With `deepPagination` the Actor partitions by price band (and subdivides saturated bands) so you get more than the first ~48 cards.

**Personal data?** Only public listing/profile fields a logged-out visitor can see. No inbox, phone, or email harvesting.

### Related Actors

- [Leboncoin Scraper](https://apify.com/crawloop/leboncoin-scraper)
- [Kleinanzeigen Scraper](https://apify.com/crawloop/kleinanzeigen-scraper)
- [Marktplaats Scraper](https://apify.com/crawloop/marktplaats-scraper)
- [Facebook Marketplace Scraper](https://apify.com/crawloop/facebook-marketplace-scraper)
- [eBay Active Listings Scraper](https://apify.com/crawloop/ebay-active-listings-scraper)

# Actor input Schema

## `country` (type: `string`):

Carousell regional marketplace. Residential proxy is pinned to this country.

## `searchQueries` (type: `array`):

Keywords to search as peer-to-peer listings (/{keyword}/q/). One crawl per term. Example: iphone 15, vintage leica.

## `startUrls` (type: `array`):

Paste Carousell URLs: keyword browse (/desk-lamp/q/), search, category (/categories/computers-tech-213/), listing (/p/…), or seller (/u/username/). Filters already on the URL are kept.

## `categoryUrls` (type: `array`):

Full category URL or bare slug (e.g. computers-tech-213, luxury-20, womens-fashion-4). Slugs are region-specific.

## `sellerUsernames` (type: `array`):

Public Carousell usernames (without @) — scrape that seller's listings.

## `sortBy` (type: `string`):

Result order. Recent is best for monitors; lowest price for sourcing.

## `minPrice` (type: `integer`):

Minimum price in the region's local currency.

## `maxPrice` (type: `integer`):

Maximum price in the region's local currency.

## `condition` (type: `string`):

Optional condition filter applied on browse URLs.

## `fetchDetails` (type: `boolean`):

Open each listing page for full description, all photos, meetup location, deal methods, category path, and seller rating / reviews / tenure. Slower, richer rows.

## `deepPagination` (type: `boolean`):

Carousell HTML pages cap around 40–48 cards with no page parameter. When enabled, the scraper splits inventory by price band to find more unique listings.

## `maxItems` (type: `integer`):

Maximum listings to save.

## `requestDelayMs` (type: `integer`):

Politeness delay between HTTP requests.

## `proxyConfiguration` (type: `object`):

Residential proxy in the selected country is required to pass Cloudflare. Datacenter IPs usually return 0 results.

## Actor input object example

```json
{
  "country": "SG",
  "searchQueries": [
    "iphone 15"
  ],
  "startUrls": [],
  "sortBy": "recent",
  "condition": "any",
  "fetchDetails": false,
  "deepPagination": true,
  "maxItems": 100,
  "requestDelayMs": 400,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `results` (type: `string`):

Default dataset items — one Carousell listing per row.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "searchQueries": [
        "iphone 15"
    ],
    "startUrls": [],
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("crawloop/carousell-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "searchQueries": ["iphone 15"],
    "startUrls": [],
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("crawloop/carousell-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "searchQueries": [
    "iphone 15"
  ],
  "startUrls": [],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call crawloop/carousell-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,crawloop/carousell-scraper"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/u22Eeg6WJ0aQF6Aal/builds/Z4D1TascCwtlDeun0/openapi.json
