# Kijiji Scraper (`solidcode/kijiji-scraper`) Actor

\[💰 $0.9 / 1K] Extract Canadian classified listings from Kijiji — cars, real estate, jobs, electronics, services, and more. Paste search URLs or just type keywords and a location.

- **URL**: https://apify.com/solidcode/kijiji-scraper.md
- **Developed by:** [SolidCode](https://apify.com/solidcode) (community)
- **Categories:** Automation, Real estate, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.90 / 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 a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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

## Kijiji Scraper

Pull Canadian classified listings from Kijiji.ca at scale — titles, CAD prices, city + address + latitude/longitude, seller names and masked phone numbers, image URLs, category-specific attributes, and posting dates for cars, real estate, electronics, jobs, services, pets, and every other Kijiji category. Built for Canadian retailers, automotive dealers, real estate agents, lead-generation agencies, and market researchers who need fresh Kijiji data without paging through the site one screen at a time.

### Why This Scraper?

- **All 13 Canadian provinces and territories** — search by city, postal code, or province, or set `location: "Canada"` to sweep the whole country in one run.
- **Keyword search AND direct URL passthrough** — type a phrase like `"iPhone 15 Pro"`, or paste any Kijiji search, category, or pre-filtered URL exactly as it appears in your browser. URL filters (category, location, attributes) are honoured byte-for-byte.
- **25+ structured fields per listing** — listing ID, title, CAD price, price type (fixed / negotiable / contact / free / swap / wanted), seller ID, address, latitude, longitude, neighbourhood intersection, all image URLs, category ID, and a flat `attributes` array of category-specific label/value pairs.
- **Optional deep-fetch mode** — toggle `fetchFullDetails: true` to enrich every row with view count, full HTML description, masked seller phone, seller website, dealer flag, listing status, and end date pulled from each ad's detail page.
- **Smart Canadian location resolver** — recognizes major cities ("Toronto", "Montreal, QC", "Calgary"), provinces ("Ontario", "BC"), postal codes ("M5V 2T6"), and free-text inputs. No need to look up Kijiji's internal location IDs.
- **Five-way price filtering in CAD** — minimum price, maximum price, sort by newest / price low-to-high / price high-to-low, plus dropdown filters for ad type (Offering / Wanted) and seller type (Private / Business).
- **Automatic deduplication across paginated Top Ads** — Kijiji repeats promoted listings on every page; the actor dedupes on listing ID so your dataset never carries the same ad twice.
- **Actionable zero-result feedback** — when a query returns nothing, the run status echoes back the exact keywords, location, and filter combination that produced no hits so you know precisely what to broaden.
- **Flat $0.90 per 1,000 results** — pay only for listings returned, no compute charges.

### Use Cases

**Price Monitoring & Competitive Intelligence**
- Track competitor pricing across regional Kijiji markets
- Build CAD price histories on used-car models by trim and year
- Detect new listings within a price band the day they post

**Lead Generation**
- Build outreach lists with seller names, masked phone numbers, and websites
- Source private sellers vs. registered dealers with the Seller Type filter
- Capture every for-sale listing in a target city for sales pipelines

**Inventory & Market Research**
- Map automotive inventory by province for dealer network planning
- Track real-estate listing density and asking-rent shifts across Canadian cities
- Surface in-demand product categories by counting active listings

**Trend Analysis**
- Quantify Wanted-ad volume vs. Offering-ad volume to gauge demand
- Track average asking price by city and category over time
- Identify seasonal patterns in classified categories (bikes, snowmobiles, RVs)

**Data Enrichment**
- Enrich CRM records with current Kijiji listings tied to a seller name
- Pull image URLs to populate downstream catalog systems
- Feed marketplace dashboards with structured Canadian classifieds data

### Getting Started

#### Simple Keyword Search

One topic, default location (all of Canada), 100 listings:

```json
{
    "searchQueries": ["bikes"]
}
````

#### Filtered Search with Location and Price Range

Newest Toyota Camry listings in the GTA between $5,000 and $15,000:

```json
{
    "searchQueries": ["Toyota Camry"],
    "location": "Toronto, ON",
    "minPrice": 5000,
    "maxPrice": 15000,
    "sortBy": "dateDesc",
    "maxResults": 200
}
```

#### URL Passthrough with Full Detail Enrichment

Paste a pre-filtered Kijiji URL (filters already encoded in the URL) and turn on detail mode to pull view counts, full descriptions, and seller contact info:

```json
{
    "searchUrls": [
        "https://www.kijiji.ca/b-real-estate/city-of-toronto/c34l1700273?ad=offering"
    ],
    "fetchFullDetails": true,
    "maxResults": 500
}
```

#### Multi-Source Batch Run

Mix keyword searches and URLs in a single run — results are combined and deduplicated:

```json
{
    "searchQueries": ["iPhone 15 Pro", "MacBook Air M2"],
    "searchUrls": [
        "https://www.kijiji.ca/b-cars-vehicles/calgary/c27l1700199"
    ],
    "location": "Canada",
    "sellerType": "private",
    "maxResults": 1000
}
```

### Input Reference

#### What to Scrape

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `searchUrls` | string\[] | `["https://www.kijiji.ca/b-cars-vehicles/canada/c27l0"]` | One or more Kijiji search, category, or browse URLs. Paste exactly as copied from kijiji.ca — URL filters are honoured. |
| `searchQueries` | string\[] | `[]` | Plain-text search terms (e.g. "iPhone 15 Pro"). Each query is combined with the Location field below. |
| `location` | string | `"Canada"` | City ("Toronto, ON"), province ("Alberta"), or postal code ("M5V 2T6"). Use "Canada" to search nationwide. Only applies to keyword searches. |

#### Filters

Filters apply only to keyword searches — URLs carry their own filters from the URL itself.

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `sortBy` | select | `Newest First` | Sort order: Newest First, Price: Low to High, or Price: High to Low. |
| `minPrice` | integer | none | Minimum price in CAD. Leave empty for no minimum. |
| `maxPrice` | integer | none | Maximum price in CAD. Leave empty for no maximum. |
| `adType` | select | `Any` | Ad type filter: Any, Offering (people selling), or Wanted (people buying). |
| `sellerType` | select | `Any` | Seller filter: Any, Private (individual), or Business (registered dealer). Applies to listings that expose this attribute (most common on cars and electronics). |

#### Output Options

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `maxResults` | integer | `100` | Maximum total listings to collect across all URLs and queries. Set to `0` for no limit. Start with 50–100 to test. |
| `fetchFullDetails` | boolean | `false` | When on, visits each listing's detail page to add view count, full HTML description, masked seller phone, seller website, dealer flag, status, and end date. Roughly doubles run cost. |

### Output

Every row represents one Kijiji listing. Here's a typical result with full details enabled:

```json
{
    "listingId": "1741234567",
    "url": "https://www.kijiji.ca/v-cars-trucks/city-of-toronto/2019-toyota-camry-le/1741234567",
    "title": "2019 Toyota Camry LE — Low Km, Certified",
    "description": "<p>Beautifully maintained 2019 Toyota Camry LE with only 48,000 km...</p>",
    "price": 22500.00,
    "priceType": "negotiable",
    "currency": "CAD",
    "categoryId": "174",
    "categoryName": "Cars & Trucks",
    "adType": "offering",
    "status": "active",
    "postedAt": "2026-05-12T14:32:11Z",
    "sortingDate": "2026-05-12T14:32:11Z",
    "endDate": "2026-07-11T14:32:11Z",
    "location": "Toronto (GTA)",
    "locationId": "1700273",
    "address": "Yonge & Eglinton, Toronto, ON",
    "latitude": 43.7064,
    "longitude": -79.3982,
    "neighbourhood": "Yonge & Eglinton",
    "sellerId": "u12345678",
    "sellerName": "Maple Leaf Auto Sales",
    "sellerType": "business",
    "sellerPhone": "416-555-xxxx",
    "sellerWebsite": "https://mapleleafautosales.ca",
    "sellerRating": 4.7,
    "sellerVerified": true,
    "imageCount": 12,
    "imageUrls": ["https://i.kijiji.ca/abc.jpg", "https://i.kijiji.ca/def.jpg"],
    "views": 287,
    "adSource": "ORGANIC",
    "attributes": [
        { "label": "carmake", "value": "toyota" },
        { "label": "carmodel", "value": "camry" },
        { "label": "carbodytype", "value": "sedan" },
        { "label": "numberofdoors", "value": "4" }
    ],
    "flags": {
        "topAd": false,
        "highlight": false,
        "priceDrop": true,
        "isFromDealer": true,
        "showcase": false
    }
}
```

#### Core Fields

| Field | Type | Description |
|-------|------|-------------|
| `listingId` | string | Unique Kijiji listing ID |
| `title` | string | Listing title |
| `description` | string | Listing description (truncated on search results; full HTML when `fetchFullDetails: true`) |
| `url` | string | Direct Kijiji listing URL |
| `categoryId` | string | Kijiji category ID |
| `categoryName` | string | Human-readable category name (populated with `fetchFullDetails`) |
| `adType` | string | `offering` (someone selling) or `wanted` (someone buying) |
| `postedAt` | string | ISO-8601 timestamp the ad was posted |
| `sortingDate` | string | ISO-8601 timestamp Kijiji uses for sort ranking |

#### Pricing

| Field | Type | Description |
|-------|------|-------------|
| `price` | number | Listing price in CAD (null when seller asks for contact-for-price) |
| `priceType` | string | `fixed`, `negotiable`, `contact`, `free`, `swap`, or `wanted` |
| `currency` | string | Always `CAD` |

#### Location

| Field | Type | Description |
|-------|------|-------------|
| `location` | string | City or region name as shown on Kijiji |
| `locationId` | string | Kijiji internal location ID |
| `address` | string | Street address when the seller chose to share their location (populated reliably with `fetchFullDetails`; often null on search results alone) |
| `latitude` | number | Listing latitude |
| `longitude` | number | Listing longitude |
| `neighbourhood` | string | Nearest cross-streets (e.g. "Yonge & Bloor") |

#### Seller

| Field | Type | Description |
|-------|------|-------------|
| `sellerId` | string | Kijiji poster ID |
| `sellerName` | string | Seller display name (populated with `fetchFullDetails`) |
| `sellerType` | string | `private` or `business` when exposed by the listing |
| `sellerRating` | number | Seller's Kijiji rating when available |
| `sellerVerified` | boolean | Whether Kijiji marks this seller as verified |
| `sellerPhone` | string | Masked phone number, last 4 digits as `xxxx` (populated with `fetchFullDetails`) |
| `sellerWebsite` | string | Seller's website URL (populated with `fetchFullDetails`) |

#### Images, Attributes & Flags

| Field | Type | Description |
|-------|------|-------------|
| `imageUrls` | string\[] | All listing image URLs (https-normalized) |
| `imageCount` | number | Count of listing images |
| `attributes` | object\[] | Category-specific attributes as flat `{label, value}` pairs (e.g. carmake, carmodel, bedrooms, condition) |
| `flags` | object | Listing flags: `topAd`, `highlight`, `priceDrop`, `isFromDealer`, `showcase` |
| `adSource` | string | `ORGANIC`, `TOP_AD`, etc. |
| `virtualTourUrl` | string | Virtual tour URL when present (real estate) |
| `youtubeVideoId` | string | Embedded YouTube ID when the listing has a video |

#### Detail-Mode Fields

Populated only when `fetchFullDetails: true`.

| Field | Type | Description |
|-------|------|-------------|
| `views` | number | Total view count on the listing detail page |
| `status` | string | Listing status (`active`, `expired`, `removed`, etc.) |
| `endDate` | string | ISO-8601 timestamp the listing is scheduled to expire |

### Tips for Best Results

- **Paste pre-filtered URLs whenever possible.** Apply your filters (category, location, attribute) directly on kijiji.ca, copy the URL, and drop it into `searchUrls` — every URL parameter is respected exactly as the site interprets it.
- **Start small to test, then scale up.** A `maxResults: 50` first run takes under a minute and confirms the data matches your needs before you spend on a 10,000-listing pull.
- **Use `fetchFullDetails: true` only for high-value lists.** Detail mode adds one extra request per listing and roughly doubles run cost. Skip it for broad inventory sweeps; enable it for lead lists where you need seller phone, website, and view counts.
- **Combine keyword queries and URLs in one run.** Mix `searchQueries` with `searchUrls` to consolidate multiple monitoring sources into a single dataset and dedupe budget.
- **The Seller Type filter is best-effort.** Kijiji exposes private vs. business on cars, electronics, and a few other categories; listings without this attribute pass through unfiltered so you don't end up with an empty dataset. Toggle `fetchFullDetails: true` for stricter seller-type enforcement.
- **For Wanted-ad research, use `adType: "wanted"` on keyword searches.** URL-based runs respect whatever `?ad=` parameter the URL already carries — verify it's in the URL before relying on it.
- **Use city names over postal codes when you can.** The location resolver knows every major Canadian city by name and maps postal-code prefixes to their nearest big city — names are more predictable.
- **The first few rows of any sorted run are promoted Top Ads.** Kijiji's sort filters apply only to organic results — the top of a `Price: Low to High` response will still show Top Ads at their original price. Filter by `adSource: "ORGANIC"` (or skip `TOP_AD` rows) if you want strictly sorted results.

### Pricing

**$0.90 per 1,000 results** — flat, competitive pricing for Canadian classifieds at scale. No compute charges — you only pay per result returned.

| Results | Estimated Cost |
|---------|----------------|
| 100 | $0.09 |
| 1,000 | $0.90 |
| 10,000 | $9.00 |
| 100,000 | $90.00 |

A "result" is any listing row in the output dataset. Platform fees (compute, storage) are additional and depend on your Apify plan.

### Integrations

Export data in JSON, CSV, Excel, XML, or RSS. Connect to 1,500+ apps via:

- **Zapier** / **Make** / **n8n** — Workflow automation
- **Google Sheets** — Direct spreadsheet export
- **Slack** / **Email** — Notifications on new results
- **Webhooks** — Trigger custom APIs on run completion
- **Apify API** — Full programmatic access

### Legal & Ethical Use

This actor is designed for legitimate market research, competitive intelligence, lead generation, and inventory analysis on publicly accessible Kijiji listings. Users are responsible for complying with applicable Canadian laws (including PIPEDA), Kijiji's Terms of Service, and CASL for any subsequent outreach. Do not use extracted contact information for spam, harassment, or any unlawful purpose.

# Actor input Schema

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

Paste one or more Kijiji search, category, or listing URLs. For example: https://www.kijiji.ca/b-cars-vehicles/canada/c27l0 or any URL you copied from kijiji.ca after applying your own filters. URLs carry their own filters and location.

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

Plain-text search terms — for example 'iPhone 15 Pro' or 'Toyota Camry'. Combined with the Location field below. Leave empty if you only want URL-based scraping.

## `location` (type: `string`):

City, province, or postal code to search in (e.g. 'Toronto, ON', 'Calgary, AB', or 'M5V 2T6'). Use 'Canada' to search all provinces. Only applies to keyword searches above — URLs carry their own location.

## `maxResults` (type: `integer`):

Maximum total number of listings to collect across all URLs and queries. Set to 0 for no limit (capped at 100,000 listings per run as a runaway-loop guard). Each single search or URL paginates up to 100 pages (~4,600 listings) — for larger pulls, split by city or category URL. Tip: start with 50-100 to test, then increase.

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

Choose the order in which listings are collected. Only applies to keyword searches — URLs carry their own sort.

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

Only include listings priced at or above this amount in Canadian dollars. Leave empty for no minimum.

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

Only include listings priced at or below this amount in Canadian dollars. Leave empty for no maximum.

## `adType` (type: `string`):

Show ads where someone is offering an item or wanting to buy one.

## `sellerType` (type: `string`):

Filter by who is posting the ad — private individuals or registered businesses. Applied to listings that expose this attribute (most common on cars and electronics); ads without a seller-type attribute pass through unfiltered.

## `fetchFullDetails` (type: `boolean`):

When enabled, the scraper visits each listing's detail page to capture extra fields (view count, full HTML description, seller phone, website, business/dealer flag). This makes the scrape roughly twice as slow and twice as costly in compute. Leave off for fast, lightweight runs.

## Actor input object example

```json
{
  "searchUrls": [
    "https://www.kijiji.ca/b-cars-vehicles/canada/c27l0"
  ],
  "searchQueries": [],
  "location": "Canada",
  "maxResults": 100,
  "sortBy": "dateDesc",
  "adType": "any",
  "sellerType": "any",
  "fetchFullDetails": false
}
```

# Actor output Schema

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

Table of scraped listings with key fields.

## `details` (type: `string`):

All fields including seller info, location coordinates, attributes, and image URLs.

# 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 = {
    "searchUrls": [
        "https://www.kijiji.ca/b-cars-vehicles/canada/c27l0"
    ],
    "searchQueries": [],
    "location": "Canada",
    "maxResults": 100,
    "sortBy": "dateDesc",
    "adType": "any",
    "sellerType": "any",
    "fetchFullDetails": false
};

// Run the Actor and wait for it to finish
const run = await client.actor("solidcode/kijiji-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 = {
    "searchUrls": ["https://www.kijiji.ca/b-cars-vehicles/canada/c27l0"],
    "searchQueries": [],
    "location": "Canada",
    "maxResults": 100,
    "sortBy": "dateDesc",
    "adType": "any",
    "sellerType": "any",
    "fetchFullDetails": False,
}

# Run the Actor and wait for it to finish
run = client.actor("solidcode/kijiji-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 '{
  "searchUrls": [
    "https://www.kijiji.ca/b-cars-vehicles/canada/c27l0"
  ],
  "searchQueries": [],
  "location": "Canada",
  "maxResults": 100,
  "sortBy": "dateDesc",
  "adType": "any",
  "sellerType": "any",
  "fetchFullDetails": false
}' |
apify call solidcode/kijiji-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Kijiji Scraper",
        "description": "[💰 $0.9 / 1K] Extract Canadian classified listings from Kijiji — cars, real estate, jobs, electronics, services, and more. Paste search URLs or just type keywords and a location.",
        "version": "1.0",
        "x-build-id": "hcwC9iZAcQkTYvn9i"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/solidcode~kijiji-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-solidcode-kijiji-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/solidcode~kijiji-scraper/runs": {
            "post": {
                "operationId": "runs-sync-solidcode-kijiji-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/solidcode~kijiji-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-solidcode-kijiji-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "searchUrls": {
                        "title": "Search or Category URLs",
                        "type": "array",
                        "description": "Paste one or more Kijiji search, category, or listing URLs. For example: https://www.kijiji.ca/b-cars-vehicles/canada/c27l0 or any URL you copied from kijiji.ca after applying your own filters. URLs carry their own filters and location.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "searchQueries": {
                        "title": "Search Queries",
                        "type": "array",
                        "description": "Plain-text search terms — for example 'iPhone 15 Pro' or 'Toyota Camry'. Combined with the Location field below. Leave empty if you only want URL-based scraping.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "location": {
                        "title": "Location",
                        "type": "string",
                        "description": "City, province, or postal code to search in (e.g. 'Toronto, ON', 'Calgary, AB', or 'M5V 2T6'). Use 'Canada' to search all provinces. Only applies to keyword searches above — URLs carry their own location.",
                        "default": "Canada"
                    },
                    "maxResults": {
                        "title": "Max Results",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Maximum total number of listings to collect across all URLs and queries. Set to 0 for no limit (capped at 100,000 listings per run as a runaway-loop guard). Each single search or URL paginates up to 100 pages (~4,600 listings) — for larger pulls, split by city or category URL. Tip: start with 50-100 to test, then increase.",
                        "default": 100
                    },
                    "sortBy": {
                        "title": "Sort Results By",
                        "enum": [
                            "dateDesc",
                            "priceAsc",
                            "priceDesc"
                        ],
                        "type": "string",
                        "description": "Choose the order in which listings are collected. Only applies to keyword searches — URLs carry their own sort.",
                        "default": "dateDesc"
                    },
                    "minPrice": {
                        "title": "Minimum Price (CAD)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Only include listings priced at or above this amount in Canadian dollars. Leave empty for no minimum."
                    },
                    "maxPrice": {
                        "title": "Maximum Price (CAD)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Only include listings priced at or below this amount in Canadian dollars. Leave empty for no maximum."
                    },
                    "adType": {
                        "title": "Ad Type",
                        "enum": [
                            "any",
                            "offering",
                            "wanted"
                        ],
                        "type": "string",
                        "description": "Show ads where someone is offering an item or wanting to buy one.",
                        "default": "any"
                    },
                    "sellerType": {
                        "title": "Seller Type",
                        "enum": [
                            "any",
                            "private",
                            "business"
                        ],
                        "type": "string",
                        "description": "Filter by who is posting the ad — private individuals or registered businesses. Applied to listings that expose this attribute (most common on cars and electronics); ads without a seller-type attribute pass through unfiltered.",
                        "default": "any"
                    },
                    "fetchFullDetails": {
                        "title": "Fetch Full Listing Details",
                        "type": "boolean",
                        "description": "When enabled, the scraper visits each listing's detail page to capture extra fields (view count, full HTML description, seller phone, website, business/dealer flag). This makes the scrape roughly twice as slow and twice as costly in compute. Leave off for fast, lightweight runs.",
                        "default": false
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
