# Craigslist All Products Scraper Canada (`mrdoe/craigslist-all-products-scraper-canada`) Actor

Scrape Craigslist Canada for products across 45+ for-sale categories and 40+ cities. Extract listings, prices, descriptions, images, seller locations, conditions, attributes, coordinates, and posting dates.

- **URL**: https://apify.com/mrdoe/craigslist-all-products-scraper-canada.md
- **Developed by:** [MrDoe](https://apify.com/mrdoe) (community)
- **Categories:** E-commerce, Jobs, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.77 / 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?

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

## 🍁 Craigslist All Products Scraper Canada

**Search everything for sale on Canadian Craigslist — every category, every major city, one keyword.**

Give it a search term (or none at all) and this actor searches Canadian Craigslist across every major city at once — Toronto, Vancouver, Montreal, Calgary, and 40+ more — pulling real for-sale listings: electronics, furniture, cars, tools, bikes, collectibles, and everything else people are selling. Narrow it to one category if you only need furniture or electronics, or leave it wide open to search the entire for-sale marketplace in one run.

### ✨ Why use this instead of searching city by city

- 🇨🇦 **Every major Canadian city, one run** — no need to know which city a seller is in; this searches ~46 cities at once and merges the results.
- 🛒 **Not just cars** — covers all 45 of Craigslist's own for-sale categories (electronics, furniture, tools, collectibles, sporting goods, and more), or search across every category at once.
- 🔎 **Keyword or category browsing** — search for something specific ("IKEA couch", "iPhone 14"), browse a whole category's newest listings, or both together.
- 🧩 **Full listing detail, not just search-result snippets** — every result is the actual listing page: full description, every photo, seller location, and every attribute the seller filled in (condition, brand, size, material - whatever that category exposes).
- 💾 **Skips what you've already seen** — turn on caching and a repeat run only returns listings you haven't been given yet.
- 🛡️ **Built to survive Craigslist's blocking** — proxy rotation and retries are handled for you.

### 🗺️ Categories covered

Every real Craigslist "for sale" category - not jobs, housing, or services, which aren't products and have a completely different set of fields:

antiques · appliances · arts+crafts · atv/utv/snowmobile · auto parts · aviation · baby+kid stuff · barter · beauty+health · bike parts · bicycles · boat parts · boats · books+magazines · business/commercial · cars+trucks · cds/dvds/vhs · cell phones · clothing+accessories · collectibles · computer parts · computers · electronics · farm+garden · free stuff · furniture · garage/moving sales · general for sale · heavy equipment · household items · jewelry · materials · motorcycle parts · motorcycles · musical instruments · photo+video · rvs+campers · sporting goods · tickets · tools · toys+games · trailers · video gaming · wanted · wheels+tires

Leave the category as "all for-sale categories" (the default) to search every one of these at once.

### ⚙️ Input

Nothing is required except a proxy - every field has a sensible default.

| Field | Type | Description |
|---|---|---|
| `keyword` | string | Optional. e.g. `"iphone"`, `"mountain bike"`. Leave blank to browse a category's newest listings instead of searching a term. |
| `category` | string | Which for-sale category to search. Defaults to all of them at once. |
| `cities` | array | Optional. Specific Craigslist city subdomains (e.g. `"toronto"`, `"vancouver"`) to narrow the search to. Leave empty to search every major Canadian city automatically - the default and recommended behaviour. |
| `maxItemsPerCity` | integer | Stop each city once this many listings are collected. Default `5`. With ~46 cities searched by default, even a small number adds up fast nationwide. |
| `useCache` | boolean | Default `true`. Listings already delivered in a previous run are skipped, so repeat runs only return what's new. |
| `proxyConfiguration` | object | Required. Craigslist blocks non-proxied traffic aggressively at this scale. |

### 📦 Output

One row per listing, with the full detail-page content:

```json
{
  "url": "https://www.craigslist.org/view/d/edmonton-cannondale-topstone/3ugfk1h4EZ1emTrcZwttQn",
  "postId": "7951928960",
  "title": "Cannondale Topstone 2",
  "price": 1350,
  "priceCurrency": "CAD",
  "category": "sss",
  "categoryLabel": "all for-sale categories",
  "condition": "like new",
  "attributes": {
    "bicycle_type": "road",
    "bicycle_frame_size_freeform": "Medium",
    "bicycle_frame_material": "alloy",
    "sale_manufacturer": "Cannondale",
    "sale_model": "Topstone 2"
  },
  "features": [],
  "description": "Cannondale Topstone 2. 20 speedy bike. Rigid frame, Hydraulic disk breaks front and real...",
  "images": [
    "https://images.craigslist.org/01717_6DRr4aHqKyu_0t20CI_600x450.jpg"
  ],
  "location": {
    "city": "Edmonton",
    "neighborhood": "Edmonton",
    "region": "for sale",
    "state": "AB",
    "postalCode": "T6B0M8",
    "country": "CA",
    "latitude": 53.5223,
    "longitude": -113.4247
  },
  "craigslistCity": "edmonton",
  "postedAt": "2026-08-06",
  "updatedAt": "2026-08-08"
}
```

You can download the dataset in JSON, CSV, Excel, HTML, or several other formats from the Console, or pull it via the API.

`attributes` is intentionally flexible rather than a fixed field list - a bike listing has `bicycle_frame_size`, a phone has `mobile_os`, a car has `auto_transmission`. Whatever the seller filled in for that category shows up here, under Craigslist's own field names.

### 📝 Notes

- A residential proxy is required, not optional - Craigslist blocks non-proxied traffic aggressively once you're searching dozens of cities per run.
- `condition`, `attributes`, and `features` all depend on what the individual seller filled in - Craigslist doesn't require every field, so `null` or an empty object means that particular seller didn't provide it, not a scraping error.
- A sibling actor covering the American Craigslist network the same way is also available - search the Apify Store for "Craigslist All Products Scraper US".

### 🐞 Found an issue?

If a category's page structure changed or you spotted missing/incorrect fields, please report it on the Actor's **Issues** tab so it can be looked into.

# Actor input Schema

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

Optional. e.g. "IKEA couch", "iPhone 14", "mountain bike". Leave blank to browse a category's newest listings instead of searching for a specific term.

## `category` (type: `string`):

Which for-sale category to search. Leave as "All for-sale categories" to search everything being sold at once (electronics, furniture, cars, tools, and 40+ more) - jobs, housing, and services aren't included, since those aren't products.

## `cities` (type: `array`):

Optional. Which Craigslist city subdomains to search (e.g. "toronto", "vancouver"). Leave empty to search every major Canadian city automatically - this is the default and recommended behaviour for full national coverage.

## `maxItemsPerCity` (type: `integer`):

Stop each city once this many listings are collected. Default 5. With ~46 cities searched by default, even a small per-city number adds up to a lot of listings nationwide.

## `useCache` (type: `boolean`):

When enabled, listings already delivered in a previous run are skipped, so repeat runs only return new listings.

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

Required. Craigslist blocks non-proxied traffic aggressively at this scale.

## Actor input object example

```json
{
  "keyword": "iphone",
  "category": "sss",
  "maxItemsPerCity": 5,
  "useCache": true,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `listings` (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": "iphone"
};

// Run the Actor and wait for it to finish
const run = await client.actor("mrdoe/craigslist-all-products-scraper-canada").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": "iphone" }

# Run the Actor and wait for it to finish
run = client.actor("mrdoe/craigslist-all-products-scraper-canada").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": "iphone"
}' |
apify call mrdoe/craigslist-all-products-scraper-canada --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,mrdoe/craigslist-all-products-scraper-canada"
        }
    }
}

```

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/dSI22ztQmmX49LByJ/builds/lu1WeMXhjgBQrhsWS/openapi.json
