# Carousell Listings Extractor (`kawsar/carousell-listings-extractor`) Actor

Carousell scraper that extracts listing prices, photos and seller details by keyword or URL, so you can track deals and monitor pricing across Singapore, Malaysia, the Philippines, Hong Kong, Taiwan and Indonesia without opening a browser.

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

## Pricing

from $2.99 / 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.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#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 Listings Extractor

Carousell Listings Extractor pulls listings straight from Carousell search results, seller profiles, and individual product pages. Give it a keyword or a URL and it returns structured data you can drop into a spreadsheet: price, condition, photos, seller details, engagement counts.

It works across all six Carousell country sites: Singapore, Malaysia, the Philippines, Hong Kong, Taiwan, and Indonesia. Search by keyword and country, or hand it direct URLs. Either way you get the same record shape back.

### What it extracts

For every listing, the actor returns:

- Title, price (raw and as a number), currency, and condition
- Listing URL and a unique listing ID
- Primary photo, plus the full photo gallery when detail mode is on
- Seller username, profile URL, rating, review count, and time on Carousell
- Likes, bump status, posted time, and delivery info
- Category path, brand, and full description (detail mode)
- Deal method and general location, where the listing provides them

### Input options

**Search keywords.** Give it one or more search terms, like `laptop` or `iphone 15`, and pick a country site. The actor builds the search URL and reads the results page for you.

**Start URLs.** Paste any mix of Carousell URLs instead:

- A search results page, e.g. `https://www.carousell.sg/search/macbook`
- A seller profile, e.g. `https://www.carousell.sg/u/username/`
- A single listing, e.g. `https://www.carousell.sg/p/listing-name-123456789/`

**Sort order.** For keyword searches, choose best match, most recent, or price low-to-high / high-to-low.

**Full listing details.** Turn this on and the actor opens every listing page to add the complete description, full photo gallery, brand, category, deal method, location, and seller rating. That's one extra page load per listing, so leave it off if you just want a quick price scan.

**Max items** and **request timeout** cap how much a single run does and how long it waits on a slow page.

### Example input

```json
{
  "searchQueries": ["macbook air"],
  "country": "sg",
  "sortBy": "price_low_high",
  "includeListingDetails": true,
  "maxItems": 100
}
```

### Example output

```json
{
  "listingId": "1453575007",
  "listingUrl": "https://www.carousell.sg/p/dell-xps-13-7390-2-in-1-laptop-1453575007/",
  "listingTitle": "Dell XPS 13 7390 2-in-1 Laptop",
  "price": "S$980",
  "priceValue": 980.0,
  "currency": "SGD",
  "condition": "Lightly used",
  "listingDescription": "- Dell XPS 13 7390 2-in-1 Laptop\n- Intel Core i7-1065G7 CPU @ 1.30GHz\n- 16GB RAM",
  "brand": "Dell",
  "categoryPath": "Computers & Tech > Laptops & Notebooks",
  "imageUrl": "https://media.karousell.com/...",
  "imageUrls": ["https://media.karousell.com/...", "..."],
  "likesCount": 4,
  "postedTime": "an hour ago",
  "isBumped": true,
  "sellerUsername": "insomnia147",
  "sellerUrl": "https://www.carousell.sg/u/insomnia147/",
  "sellerRating": 5.0,
  "sellerReviewCount": 21,
  "countryCode": "sg",
  "scrapedAt": "2026-08-08T10:25:55Z"
}
```

### Who this is for

- Resellers and flippers who track prices across categories and want to spot underpriced listings early
- Market researchers comparing used-goods pricing across Singapore, Malaysia, the Philippines, Hong Kong, Taiwan, and Indonesia
- Sellers benchmarking their own listings against competitors in the same category
- Anyone building a price alert, a lead list, or a dataset from secondhand marketplace activity

### Notes

- Each run deduplicates listings by ID, so the same item won't show up twice even if it appears on more than one page.
- Failed pages are recorded with an error field instead of stopping the run, so one bad URL never costs you the rest of the batch.
- Fields that a listing doesn't provide (delivery info, seller rating on a search page, and so on) come back as `null` rather than being guessed at.

# Actor input Schema

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

Keywords to search on Carousell. Each keyword runs as its own search. If one sort order doesn't return enough listings to reach Max items, the actor automatically checks the other sort orders for the same keyword to fill the gap.

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

Which Carousell country site your keywords are searched on. Ignored for URLs in Start URLs, which keep their own country.

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

Ordering applied to keyword searches. Price sorting is useful for finding the cheapest or the highest priced items in a category.

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

Carousell URLs to extract. Accepts search result pages, seller profile pages (/u/username/) and single listing pages (/p/listing-id/).

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

Maximum number of listings to save per run.

## `requestTimeoutSecs` (type: `integer`):

How long to wait for a single page before giving up and retrying. A typical page loads in 10 to 20 seconds; 60 leaves headroom without letting one slow page stall the run.

## Actor input object example

```json
{
  "searchQueries": [
    "laptop",
    "iphone 15"
  ],
  "country": "sg",
  "sortBy": "best_match",
  "startUrls": [
    "https://www.carousell.sg/search/macbook",
    "https://www.carousell.sg/u/insomnia147/"
  ],
  "maxItems": 20,
  "requestTimeoutSecs": 60
}
```

# Actor output Schema

## `listings` (type: `string`):

Every extracted listing with prices, conditions, photos, seller profiles and engagement counts.

## `listingsInConsole` (type: `string`):

Browse the extracted listings in the Apify Console dataset view.

# 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": [
        "laptop"
    ],
    "startUrls": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("kawsar/carousell-listings-extractor").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": ["laptop"],
    "startUrls": [],
}

# Run the Actor and wait for it to finish
run = client.actor("kawsar/carousell-listings-extractor").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": [
    "laptop"
  ],
  "startUrls": []
}' |
apify call kawsar/carousell-listings-extractor --silent --output-dataset

```

## MCP server setup

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

```

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/s8lcTYyQBihyfeeYA/builds/gT4wWg1nDH97C6Ubv/openapi.json
