# Sgcarmart Used Cars Scraper (`alwaysprimedev/sgcarmart-scraper`) Actor

Scrape every used-car listing on sgcarmart.com — price, specs, photos, dealer, COE — in structured JSON, CSV or Excel.

- **URL**: https://apify.com/alwaysprimedev/sgcarmart-scraper.md
- **Developed by:** [Always Prime](https://apify.com/alwaysprimedev) (community)
- **Categories:** Developer tools, Social media, E-commerce
- **Stats:** 1 total users, 0 monthly users, 80.6% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.00 / 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/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

## 🚗 Sgcarmart Used Cars Scraper — Singapore's #1 Car Marketplace, in one click

[![Apify](https://img.shields.io/badge/Apify-Actor-blue)](https://apify.com)
[![Python](https://img.shields.io/badge/python-3.11-3776AB)](https://www.python.org)
[![Output](https://img.shields.io/badge/output-JSON%20%E2%80%A2%20CSV%20%E2%80%A2%20Excel-green)]()

**Get every used-car listing on [sgcarmart.com](https://www.sgcarmart.com) — price, depreciation, COE, OMV, mileage, photos, dealer info — as structured JSON, CSV or Excel. No code, no captcha, no scraping experience needed.**

⚡️ Built for Singapore's used-car market: 15,000+ live listings, fresh every run.

***

### ✨ Why this scraper

- 🏎️ **Full coverage** — every car on sgcarmart, every page, every detail field
- 💰 **Pricing intelligence** — Price, Depreciation, COE, OMV, ARF, Dereg Value, Road Tax — all parsed into numbers
- 🔋 **EV-aware** — captures fuel type, electric drive range, kW/bhp power
- 📸 **Every photo URL** — primary + gallery, ready to download
- ⚡️ **Fast** — pulls ~5 listings/sec on default settings
- 📦 **Drop-in formats** — JSON, CSV, Excel — straight into Sheets, Power BI, your warehouse
- 🤖 **Run on a schedule** — daily inventory snapshots, weekly price moves
- 🛡️ **Robust** — automatic retries, TLS-fingerprint rotation, structured logs

***

### 🚀 Quick start

1. 👉 Click **Try for free** above
2. 🎯 Pick a sort order, set a max price, or paste specific car URLs (or leave everything blank for newest cars)
3. ▶️ Hit **Start** — your run begins in seconds
4. 📥 Download as JSON, CSV or Excel from the **Storage** tab

***

### 📋 Input

| Field | What it does |
| --- | --- |
| `maxItems` | Stop after N listings. `0` = scrape everything. |
| `sortBy` | `newest`, `oldest`, `priceLowToHigh`, `priceHighToLow`, `mileageLow`, `depreciationLow` |
| `minPrice` / `maxPrice` | SGD range, e.g. 30000 – 100000 |
| `vehicleType` | Body types: `5` Hatchback, `7` Sedan, `9` SUV, `8` MPV, `4` Coupe, `1` Sports |
| `make` / `model` | Brand and model codes (see sgcarmart's filter UI) |
| `scrapeDetails` | Off = URLs only (cheap diff). On = full record. |
| `since` | Skip listings registered before this date — perfect for daily refresh |
| `concurrency` | 1–25. Default 5. |
| `startUrls` | Advanced: paste listing URLs to scrape only those cars |

***

### 📦 Sample output

```json
{
  "id": 1495126,
  "url": "https://www.sgcarmart.com/used-cars/info/byd-sealion-7-electric-1495126",
  "scraped_at": "2026-05-15T09:30:00Z",
  "car_model": "BYD Sealion 7 Electric Premium",
  "make": "BYD",
  "model": "Sealion",
  "year": 2025,
  "price_sgd": 210000,
  "depreciation_sgd_per_year": 22010,
  "coe_sgd": 117003,
  "installment_sgd": 1729,
  "road_tax_sgd_per_year": 2264,
  "omv_sgd": 38500,
  "arf_sgd": 5900,
  "dereg_value_sgd": 98027,
  "reg_date": "2025-10-10",
  "original_reg_date": null,
  "manufactured": 2025,
  "mileage_km": 125,
  "transmission": "Auto",
  "engine_cap_cc": null,
  "drive_range_km": null,
  "fuel_type": "Electric",
  "power": "230.0 kW (308 bhp)",
  "curb_weight_kg": 2225,
  "owners": 1,
  "vehicle_type": "SUV",
  "status": "Available for sale",
  "coe_left": "9yrs 4mths 24days COE left",
  "category": "PARF Car, Direct Owner",
  "description": "Almost brand new condition interior and exterior.",
  "features": null,
  "accessories": null,
  "inspection_grade": null,
  "dealer_code": 1000,
  "dealer_type": "Direct Owner",
  "is_direct_owner": true,
  "primary_image_url": "https://i.i-sgcm.com/cars_used/202604/1495126_1b.jpg",
  "photo_urls": [
    "https://i.i-sgcm.com/cars_used/202604/1495126_1.jpg",
    "https://i.i-sgcm.com/cars_used/202604/1495126_1b.jpg",
    "https://i.i-sgcm.com/cars_used/202604/1495126_2b.jpg",
    "https://i.i-sgcm.com/cars_used/202604/1495126_3b.jpg"
  ]
}
```

***

### 💡 Use cases

| Who | What for |
| --- | --- |
| 🏦 **Banks & insurers** | Used-car loan & insurance pricing, residual-value models |
| 📊 **Auto analysts** | Market trends, depreciation curves, COE price impact |
| 🏎️ **Dealers** | Competitive pricing, gap analysis, sourcing leads |
| 🤖 **ML / data teams** | Train pricing models, listings classification, vision datasets |
| 💼 **PropTech for autos** | Power valuation tools, dealer dashboards, price alerts |
| 🛒 **Buyers & researchers** | Track price drops, monitor specific models, build watchlists |

***

### 🔥 Tips & tricks

- **Daily snapshot** — schedule the actor to run every morning with `sortBy: "newest"` and `since: <yesterday>`. You'll only pay for fresh listings.
- **Index-only diff** — flip `scrapeDetails: false` for ultra-cheap inventory refresh. Pull the IDs, then enrich only the new ones tomorrow.
- **Specific cars** — paste any sgcarmart URLs into `startUrls` to skip search entirely.
- **EV-only run** — set `fuel_type` filter via the site's URL parameters in `startUrls` for a clean electric-only dataset.

***

### ❓ FAQ

**How fresh is the data?**
Every run pulls live from sgcarmart in real time — no caching. Typical 100-listing run finishes in under a minute.

**Can I scrape a specific car?**
Yes — paste its URL into `startUrls`. The scraper will skip the search step entirely.

**What about new cars / accessories / car loans?**
This actor focuses on used cars. If you want new-car listings, drop us a note — happy to ship a sibling actor.

**Is the data complete?**
Every advertised field on the listing page is captured. Some fields (`engine_cap_cc`, `drive_range_km`) are intentionally `null` for vehicles where sgcarmart doesn't publish them (e.g. EVs don't have engine displacement).

**Does it include seller phone numbers?**
No. We deliberately exclude personal contact details to respect Singapore PDPA and user privacy.

**How does pricing work?**
Pay only for what you scrape — a flat per-result rate. The first run is free so you can try before you commit.

***

### 📞 Need help?

Open an issue or message us on Apify — we typically reply within a few hours.

Happy scraping! 🏎️💨

# Actor input Schema

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

Stop after this many listings have been saved. Use 0 to scrape every result that matches your filters.

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

How sgcarmart should order the search results before scraping. "Newest" matches the default behaviour on the site.

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

Only return listings priced at or above this amount in Singapore dollars. Leave blank for no lower bound.

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

Only return listings priced at or below this amount in Singapore dollars. Leave blank for no upper bound.

## `vehicleType` (type: `array`):

Restrict results to one or more body types. Common values: 5 (Hatchback), 7 (Sedan), 9 (SUV), 8 (MPV), 4 (Coupe), 1 (Sports Car).

## `make` (type: `string`):

Restrict results to one make code (e.g. "5" for Toyota). Leave blank for all makes. See sgcarmart's listing UI for the full code list.

## `model` (type: `string`):

Optional model code to combine with the make filter. Leave blank to include every model from the chosen make.

## `scrapeDetails` (type: `boolean`):

Turn off to only collect listing URLs and IDs (cheap inventory diff runs). Turn on for the full record with price, specs, photos, dealer info.

## `since` (type: `string`):

ISO date or datetime (e.g. 2026-01-01). Listings with a registration date earlier than this will be skipped. Leave blank for no time filter.

## `concurrency` (type: `integer`):

How many detail pages to fetch in parallel. Higher is faster but more aggressive; 5 is the safe default. Capped at 25.

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

Paste sgcarmart listing URLs to scrape only those specific cars and skip search. Overrides the filter fields above.

## Actor input object example

```json
{
  "maxItems": 50,
  "sortBy": "newest",
  "minPrice": 30000,
  "maxPrice": 100000,
  "vehicleType": [
    "9"
  ],
  "make": "5",
  "scrapeDetails": true,
  "since": "2026-01-01",
  "concurrency": 5,
  "startUrls": []
}
```

# Actor output Schema

## `listingsJson` (type: `string`):

Full machine-readable dataset, one listing per object.

## `listingsCsv` (type: `string`):

Spreadsheet-friendly CSV of all scraped listings.

## `listingsXlsx` (type: `string`):

Excel-ready .xlsx export of all scraped listings.

## `consoleView` (type: `string`):

Inspect, filter and export the dataset from the Apify UI.

# 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 = {
    "maxItems": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("alwaysprimedev/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 = { "maxItems": 50 }

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

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

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

```

## CLI example

```bash
echo '{
  "maxItems": 50
}' |
apify call alwaysprimedev/sgcarmart-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=alwaysprimedev/sgcarmart-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/TtWgdtA80Z07QaJE4/builds/4xqNExFeLnXNtJmDi/openapi.json
