# Carousell Products Scraper (`devcake/carousell-scraper`) Actor

Carousell scraper for product listings via keyword search or search by image across 6 APAC marketplaces (SG, MY, PH, HK, TW, ID). Extract prices, seller data and full listing details with visual search.

- **URL**: https://apify.com/devcake/carousell-scraper.md
- **Developed by:** [devcake](https://apify.com/devcake) (community)
- **Categories:** E-commerce
- **Features:** Limited permissions
- **Stats:** 66 total users, 16 monthly users, 98.9% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.50 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## 🛒 Carousell Product Scraper

Scrape Carousell listings by keyword or by image — including **visual search** and **search by
image** — across Asia-Pacific: Singapore, Philippines, Hong Kong, Taiwan, Malaysia and Indonesia.

### 📦 What It Does

Enter a search term, pick a marketplace, and get clean, structured product data — prices,
photos, condition, description, seller information and more. Turn on **Fetch Full Details** to
also get every photo, product videos, the exact location, category, posting date and the seller
dossier (followers, sold count, response rate and reviews).

You can also search with an image instead of a keyword: the built-in **visual search** lets you
**search by image** on Carousell from an image URL or base64 photo and returns visually similar
listings with the same structured fields.

### 👥 Who It's For

- **Resellers and Dropshippers** — source products and build inventory catalogs
- **Sourcing Teams** — search by image to find the same item, lookalikes or cheaper alternatives
- **E-commerce Businesses** — analyze competition, track pricing and monitor availability
- **Market Researchers** — collect marketplace data for trend and consumer insights
- **Business Analysts** — build datasets for pricing intelligence and opportunity assessment

### 💰 Data You Get

Fields marked ✦ are added when **Fetch Full Details** is enabled.
Fields marked ◆ are added when you **scrape a seller by their profile URL**.

| Field | Description | |
|-------|-------------|---|
| id | Unique listing identifier | |
| title | Product title | |
| price | Numeric price | |
| priceText | Price as shown (e.g. `S$1,450`) | |
| currency | Currency code (SGD, PHP, HKD, TWD, MYR, IDR) | |
| condition | Item condition (Brand new, Like new, Lightly used, Well used, Heavily used) | |
| description | Product description | |
| thumbnail | Main product photo | |
| photos | All product photos | ✦ |
| videos | Product video URLs | ✦ |
| sellerId / sellerName / sellerPhoto | Seller identity | |
| sellerFollowers | Seller follower count | ✦ |
| sellerReviews | Total number of reviews | ✦ |
| sellerReviewPositive / Neutral / Negative | Review breakdown | ✦ |
| sellerRating | Seller rating (e.g. 4.97) | ◆ |
| sellerVerifiedOrders | Seller's completed (verified) orders | ◆ |
| sellerVerified | Whether the seller is verified | ✦ |
| sellerJoined | When the seller joined | ✦ |
| location | Seller location / address | ✦ |
| category | Product category | ✦ |
| postedAt | When the listing was posted | ✦ |
| lastModified | When the listing was last changed | ✦ |
| commentsCount | Number of comments | ✦ |
| offerCount | Number of offers received | ✦ |
| isPopular | Whether the listing is flagged as popular | ✦ |
| vertical | Listing vertical (category group) | ✦ |
| isDeliveryAvailable / isMeetup / isPickup | Whether shipping / meet-up is available | ✦ |
| status | Listing status (L = live, R = reserved, S = sold) | |
| likesCount | Number of likes | |
| rank | Position in the search results | |
| marketplace | Marketplace name | |
| countryCode | Country code | |
| url | Direct link to the listing | |
| searchQuery | The query that produced this row | |
| scrapedAt | When the data was collected | |

> Note: follower count, review counts and join date come from the listing API (Fetch Full Details).
> Seller rating and verified orders come from the seller's public profile, which is fetched
> **only when you scrape a seller by profile URL** (one page per seller, cached for 7 days).
> Carousell does not publish a seller's exact "sold count" or "response rate" publicly.

### 🏷️ Use Cases

- **Find products to resell** — search any category and get full product details to evaluate deals.
- **Visual search** — start from a product photo to find the same item, similar products or cheaper alternatives across Carousell.
- **Monitor pricing** — build datasets over time and spot price changes and bargains.
- **Research sellers** — check verification, follower counts and review counts before buying.
- **Analyze markets** — compare availability and pricing across the region.

### 🚀 Quick Start

1. **Enter a search term** — e.g. `iphone 15`, or paste a photo URL / base64 image for visual search
2. **Choose the marketplace** — Singapore, Philippines, Hong Kong, Taiwan, Malaysia or Indonesia
3. **Set how many results** — 20 or more per query or image
4. **Run** — download clean JSON or CSV from the dataset

### ⚙️ Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| domain | select | No | Marketplace to scrape (default Singapore) |
| queries | array | No | Search terms, or Carousell links — product, search or **seller profile**. Links are detected automatically |
| imageUrls | array | No | Public JPG/PNG URLs for visual search. Each image returns visually similar listings |
| imageBase64 | string | No | Base64-encoded JPG/PNG (data URI prefix optional) for search by image when the photo is not hosted |
| maxItems | integer | No | Max listings per query or image (default 20, minimum 20) |
| detail | boolean | No | Fetch full details for each listing, including the seller dossier (default off) — see ✦ fields above |
| sort | select | No | Newest (default), Oldest, Price: low to high, Price: high to low |
| minPrice / maxPrice | integer | No | Only listings within this price range |
| conditions | multi-select | No | Only listings in the selected condition(s) |
| deliveryOnly | boolean | No | Only listings that can be shipped |
| meetupOnly | boolean | No | Only listings that support meet-up |
| latitude / longitude / radiusKm | number | No | Only listings within a radius of a point |

### ✨ Features

- **6 Asia-Pacific marketplaces** — pick the marketplace and the rest is automatic.
- **Server-side sort & filters** — sort, price, condition, delivery/meet-up and location filters are applied by Carousell itself, so they cover the whole result set.
- **Visual search & search by image** — search by image URL or base64 photo to get visually similar listings, with full details included automatically. Up to about 200 matches per image.
- **Seller scraping** — pass a seller's profile URL as a query to get that seller's listings, including their rating and verified orders.
- **Full details on demand** — optionally enrich every listing with photos, videos, address, category and dates.
- **Seller info** — follower count, review breakdown, verification and join date with Fetch Full Details.
- **No duplicates** — a listing is returned only once per run.
- **Presentation-ready output** — image, price, condition, marketplace and clickable links in the dataset view.

### 🏪 Marketplace Regions

| Region | Marketplace | Currency |
|--------|-------------|----------|
| Singapore | carousell.sg | S$ |
| Philippines | carousell.ph | PHP |
| Hong Kong | carousell.com.hk | HK$ |
| Taiwan | tw.carousell.com | NT$ |
| Malaysia | carousell.com.my | RM |
| Indonesia | id.carousell.com | Rp |

### 📊 Examples

#### 1. Basic search

Input:

```json
{
  "domain": "sg",
  "queries": ["iphone 15"],
  "maxItems": 20
}
```

Output (one item):

```json
{
  "id": "1450222721",
  "title": "iPhone 15 Pro Max 256GB Natural Titanium",
  "price": 1450,
  "priceText": "S$1,450",
  "currency": "SGD",
  "condition": "Like new",
  "conditionCode": 4,
  "description": "Lightly used, comes with box and cable.",
  "thumbnail": "https://media.karousell.com/media/photos/...",
  "photos": ["https://media.karousell.com/media/photos/..."],
  "sellerId": "987654",
  "sellerName": "techseller_sg",
  "sellerPhoto": "https://media.karousell.com/media/photos/profiles/...",
  "status": "L",
  "likesCount": 12,
  "latitude": 1.3496,
  "longitude": 103.945,
  "marketplace": "Singapore",
  "countryCode": "SG",
  "rank": 1,
  "url": "https://www.carousell.sg/p/iphone-15-pro-max-1450222721/",
  "searchQuery": "iphone 15",
  "scrapedAt": "2026-10-15T09:27:13Z"
}
```

#### 2. Full details

Add `"detail": true` to enrich each listing.

Input:

```json
{
  "domain": "sg",
  "queries": ["iphone 15"],
  "maxItems": 20,
  "detail": true,
  "sort": "price_asc",
  "maxPrice": 2000,
  "conditions": ["Like new", "Well used"]
}
```

Output (one item — extra fields only):

```json
{
  "id": "1450222721",
  "title": "iPhone 15 Pro Max 256GB Natural Titanium",
  "price": 1450,
  "currency": "SGD",
  "category": "Mobile Phones",
  "postedAt": "2026-10-05T09:19:29Z",
  "location": "Tampines - Blk 201 Tampines Street 21, 520201",
  "photos": [
    "https://media.karousell.com/media/photos/..._1.jpg",
    "https://media.karousell.com/media/photos/..._2.jpg",
    "https://media.karousell.com/media/photos/..._3.jpg"
  ],
  "videos": [],
  "sellerName": "techseller_sg",
  "sellerVerified": true,
  "sellerJoined": "2019-04-11T00:00:00Z",
  "sellerFollowers": 14002,
  "sellerSoldCount": 318,
  "sellerProductsCount": 96,
  "sellerResponseRate": 95,
  "sellerRating": 4.9,
  "sellerReviews": 6121,
  "sellerReviewPositive": 5980,
  "sellerReviewNeutral": 101,
  "sellerReviewNegative": 40,
  "isDeliveryAvailable": true,
  "isMeetup": true,
  "isPickup": true,
  "status": "L",
  "url": "https://www.carousell.sg/p/iphone-15-pro-max-1450222721/"
}
```

### 🔍 Visual Search & Search by Image

Search Carousell with an image instead of a keyword. The built-in **visual search** lets you
**search by image** and returns visually similar listings - useful for finding the same item,
lookalike products or cheaper alternatives. Paste a public product photo URL into **Image URLs**,
or paste the photo itself into **Image (base64)**. Each result comes with full listing details
(title, price, photos, seller), so no extra setup is needed. Add several URLs to search for
several images in one run.

What you can do with visual search:

- Search by image from a single product photo
- Find the same product, similar items or lower-priced alternatives
- Search by image without hosting the file anywhere (base64 / data URI)
- Run visual search in all six marketplaces

Input (search by image URL):

```json
{
  "domain": "sg",
  "imageUrls": ["https://example.com/my-product-photo.jpg"],
  "maxItems": 60
}
```

If the photo is not hosted anywhere, paste it into **Image (base64)** instead - raw base64 or a
`data:image/jpeg;base64,...` URI both work:

```json
{
  "domain": "sg",
  "imageBase64": "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQ...",
  "maxItems": 60
}
```

Notes:

- Works in all six marketplaces (Singapore, Malaysia, Philippines, Hong Kong, Taiwan, Indonesia).
- URL images must be publicly reachable JPG or PNG. Base64 accepts JPG or PNG, with or without
  the data URI prefix; whitespace and line breaks are ignored.
- Each image returns up to about 200 matches, 30 at a time.
- Results use the same fields as keyword searches: condition, category, photos, seller, likes,
  status and dates. Coordinates are included when the listing publishes them.
- Text filters and sorting apply to keyword searches only; visual search matches on the photo alone.
- You can combine `queries`, `imageUrls` and `imageBase64` in the same run.

### 👤 Scrape a Seller

Paste a seller's profile URL into **Search Queries** — it's detected automatically and you get
all of that seller's listings, together with their public profile: **rating**, total reviews,
verification and verified orders.

Input:

```json
{
  "domain": "sg",
  "queries": ["carousell.sg/u/summervzt/"],
  "maxItems": 100
}
```

You can mix sellers with normal searches in the same run:

```json
{
  "domain": "sg",
  "queries": ["iphone 15", "carousell.sg/u/summervzt/"]
}
```

### ❓ FAQ

**Can I search Carousell by image with this scraper?**
Yes. Provide a photo through **Image URLs** or **Image (base64)** and the actor runs a visual
search on Carousell, returning visually similar listings with prices, photos and seller details.

**Do I need to upload my photo anywhere?**
No. Paste the photo as base64 into **Image (base64)** and it is used directly. If the photo is
already online, use its public URL in **Image URLs** instead.

**Does visual search work in every country?**
It works in all six Carousell marketplaces: Singapore, Malaysia, Philippines, Hong Kong, Taiwan
and Indonesia.

**What image formats are supported?**
JPG and PNG (BMP also works). Base64 input can include the `data:image/...;base64,` prefix, and
line breaks are ignored.

**How many similar listings can I get from one photo?**
Up to about 200 visual matches per image, returned 30 at a time.

**Can I combine keyword search and search by image?**
Yes. Add values to **Search Queries** and to **Image URLs** / **Image (base64)** in the same run.

### 📤 Export Formats

Download the dataset as JSON, CSV, Excel or HTML from the run's dataset page.

# Actor input Schema

## `domain` (type: `string`):

Select the Carousell marketplace region. The proxy country is matched automatically.

## `queries` (type: `array`):

Search terms, or Carousell links — product, search, or seller profile (e.g. carousell.sg/u/summervzt/ to scrape a seller's listings). Links are detected automatically; maxItems applies per query.

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

Maximum number of listings to extract per query. Minimum is 20.

## `detail` (type: `boolean`):

Fetch each listing's full data (all photos, videos, address, category, dates, comments/offers) plus the seller's dossier (rating, reviews, verification, verified orders). Adds one small request per listing and one page request per seller.

## `imageUrls` (type: `array`):

Public image URLs (JPG or PNG) to search by. Each image returns visually similar listings, up to about 200 per image. Text filters and sorting do not apply to image search. Results include full listing details automatically.

## `imageBase64` (type: `string`):

Paste a base64-encoded JPG or PNG, with or without the data:image/...;base64, prefix. Use this when the photo is not hosted anywhere. One image per run; use Image URLs for several.

## `sort` (type: `string`):

How the marketplace orders the results.

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

Only listings at or above this price.

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

Only listings at or below this price.

## `conditions` (type: `array`):

Only listings in the selected condition(s).

## `deliveryOnly` (type: `boolean`):

Only listings that can be shipped.

## `meetupOnly` (type: `boolean`):

Only listings that support meet-up.

## `latitude` (type: `number`):

Center latitude of the area filter. Set together with Longitude.

## `longitude` (type: `number`):

Center longitude of the area filter.

## `radiusKm` (type: `number`):

Radius in km around the location. Used only when latitude and longitude are set.

## Actor input object example

```json
{
  "domain": "sg",
  "queries": [
    "iphone 15"
  ],
  "maxItems": 20,
  "detail": false,
  "sort": "newest",
  "deliveryOnly": false,
  "meetupOnly": false,
  "radiusKm": 10
}
```

# Actor output Schema

## `dataset` (type: `string`):

Complete scraped data with every field.

## `overview` (type: `string`):

Titles, prices, conditions and links for quick browsing.

## `summary` (type: `string`):

Counts, duration and request statistics for this run.

# 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 = {
    "queries": [
        "iphone 15"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("devcake/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 = { "queries": ["iphone 15"] }

# Run the Actor and wait for it to finish
run = client.actor("devcake/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 '{
  "queries": [
    "iphone 15"
  ]
}' |
apify call devcake/carousell-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,devcake/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/8dy2qBryiMHlokmhj/builds/6K6YBlEr3w0ZOUttE/openapi.json
