# SGCarMart Scraper - Singapore Used Car Listings (`goat255/sgcarmart-scraper`) Actor

Scrape used-car listings from SGCarMart. Get one clean row per car: price, depreciation, registration date, mileage, owners, COE left and value, OMV, ARF, dereg value, road tax, powertrain, dealer and photo. No login.

- **URL**: https://apify.com/goat255/sgcarmart-scraper.md
- **Developed by:** [Goutam Soni](https://apify.com/goat255) (community)
- **Categories:** Automation, Lead generation, Business
- **Stats:** 2 total users, 1 monthly users, 78.9% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.00 / 1,000 car listing scrapeds

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/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

## SGCarMart Scraper

Get used-car listings from SGCarMart at scale, no login or API key. Search by keyword or paste your own filtered listing URLs, and every car comes back as one clean row: price, depreciation, registration date, mileage, owners, COE left and value, OMV, ARF, dereg value, road tax, powertrain, dealer and photo.

### What it does

- **Search by keyword** - a make, model or body type such as `Toyota`, `Honda Vezel` or `SUV`.
- **Paste your own filtered URLs** - apply any filters on the site (make, price range, COE, vehicle type and more), copy the URL, and every result page is walked for you.
- **Full valuation figures** - each car is enriched with COE value, OMV, ARF, dereg value and road tax, the numbers that decide whether a listing is priced well.
- **Clean, flat rows** - one row per car with typed price and mileage, ready for a spreadsheet or a pipeline. Results are deduplicated across every keyword and URL.

Common uses: used-car price research, dealer inventory tracking, depreciation and COE analysis, and building a Singapore used-car dataset.

### Input

| Field | Type | Description |
|---|---|---|
| `keyword` | string | Free-text search, for example `Toyota` or `SUV`. |
| `searchUrls` | array | SGCarMart used-car listing or search URLs copied from the site after applying your filters. |
| `maxListings` | integer | Total listings to collect across all keywords and URLs. Default 40. |
| `includeDetails` | boolean | Visit each car's page to add COE value, OMV, ARF, dereg value, road tax, power and features. Default true. |
| `detailConcurrency` | integer | How many detail pages to fetch at once. Default 5. |
| `proxyConfiguration` | object | Residential Singapore proxy, enabled by default and recommended. |

Provide a `keyword`, one or more `searchUrls`, or both.

#### Example input

```json
{
  "keyword": "Toyota",
  "maxListings": 60,
  "includeDetails": true
}
```

Or with your own filtered URL:

```json
{
  "searchUrls": [
    "https://www.sgcarmart.com/used-cars/listing?q=Honda%20Vezel"
  ],
  "maxListings": 100,
  "includeDetails": true
}
```

### Output

Each item is one car listing.

```json
{
  "listingId": 1000001,
  "title": "Toyota Corolla Altis 1.6A",
  "make": "Toyota",
  "model": "Corolla Altis",
  "price": 78800,
  "currency": "SGD",
  "depreciationPerYear": 11200,
  "monthlyInstalment": 820,
  "registrationDate": "15-Mar-2021",
  "manufacturedYear": 2020,
  "mileageKm": 46000,
  "owners": "1 Owner",
  "ownerCount": 1,
  "coeLeft": "5y 7m",
  "coeValue": 42000,
  "deregValue": 51000,
  "omv": 19800,
  "arf": 19800,
  "roadTaxPerYear": 742,
  "vehicleScheme": null,
  "engineCapacityCc": 1598,
  "power": "97.0 kW (130 bhp)",
  "curbWeightKg": 1310,
  "fuelType": "Petrol",
  "transmission": "Auto",
  "driveRange": null,
  "bodyType": "Mid-Sized Sedan",
  "inspectionGrade": null,
  "listingTag": "Premium Ad",
  "dealerName": "Example Motors Pte Ltd",
  "dealerCode": 1234,
  "description": "One careful owner, full service history, accident free.",
  "features": "1.6L dual VVT-i engine, CVT transmission, ABS, dual airbags.",
  "accessories": "Reverse camera, keyless entry, multi-function steering wheel.",
  "categories": ["PARF Car", "Premium Ad Car"],
  "imageUrl": "https://example.com/car.jpg",
  "url": "https://www.sgcarmart.com/used-cars/info/toyota-corolla-altis-16a-1000001/",
  "postedOn": "10-Aug-2026",
  "updatedOn": "12-Aug-2026",
  "sourceUrl": "https://www.sgcarmart.com/used-cars/listing?q=Toyota",
  "scrapedAt": "2026-08-16T09:00:00.000Z"
}
```

A field a listing does not carry is returned as `null`, so the shape is always the same. The valuation fields (`coeValue`, `omv`, `arf`, `deregValue`, `roadTaxPerYear`, `power`, `features`) are filled when `includeDetails` is on.

### Notes

- No login and no API key. Set a keyword or paste a URL and run.
- Turn off `includeDetails` for a faster, lighter run when you only need the listing basics.
- Residential Singapore addresses are used by default, which is what these pages expect.
- `maxListings` is a total budget across every keyword and URL; a search that runs out of cars returns everything available and stops.

### Privacy

To improve our actors we collect anonymized usage telemetry (run stats and input patterns). No personal account data is collected.

**Found this useful?** [Leave a quick review](https://apify.com/goat255/sgcarmart-scraper/reviews). It takes a few seconds and it genuinely helps other people find the actor.

# Actor input Schema

## `keyword` (type: `string`):

Free-text search, such as a make, model or body type (for example "Toyota", "Honda Vezel" or "SUV"). Leave empty if you are pasting your own listing URLs below.

## `searchUrls` (type: `array`):

One or more SGCarMart used-car listing or search URLs, copied straight from the site after you apply the filters you want (make, price range, COE, vehicle type and so on). Each URL is walked page by page. Results are combined and deduplicated.

## `maxListings` (type: `integer`):

Total number of listings to collect across every keyword and URL. A search that runs out of cars returns everything available and stops, rather than padding to the cap.

## `includeDetails` (type: `boolean`):

Visit each car's own page to add the figures a listing card does not carry: COE value, OMV, ARF, dereg value, road tax, power, curb weight, features and accessories. Turn off for a faster, lighter run.

## `detailConcurrency` (type: `integer`):

How many detail pages to fetch at once when full detail figures are enabled. Higher is faster but heavier. Most runs are fine at the default.

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

Residential proxy is required for this source and is enabled by default with Singapore addresses. Leaving it on is recommended.

## Actor input object example

```json
{
  "keyword": "Toyota",
  "searchUrls": [],
  "maxListings": 25,
  "includeDetails": true,
  "detailConcurrency": 5,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "SG"
  }
}
```

# Actor output Schema

## `records` (type: `string`):

No description

# 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 = {
    "keyword": "Toyota",
    "searchUrls": [],
    "maxListings": 25,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "SG"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("goat255/sgcarmart-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 = {
    "keyword": "Toyota",
    "searchUrls": [],
    "maxListings": 25,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "SG",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("goat255/sgcarmart-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 '{
  "keyword": "Toyota",
  "searchUrls": [],
  "maxListings": 25,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "SG"
  }
}' |
apify call goat255/sgcarmart-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,goat255/sgcarmart-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/sdiw2rfoASwoRlmBH/builds/fOu7yyVkZTIEfWdOH/openapi.json
