# Kijiji Deal Finder — Underpriced Listings & Price Analysis (`thomasthinks/kijiji-deal-finder`) Actor

Find underpriced listings on Kijiji Canada. Price-vs-median deal detection for resellers and bargain hunters.

- **URL**: https://apify.com/thomasthinks/kijiji-deal-finder.md
- **Developed by:** [Thomas Jankowski](https://apify.com/thomasthinks) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 1,000 deal founds

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?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Kijiji Deal Finder — Underpriced Listings & Price Analysis

**Stop overpaying on Kijiji.** This actor scans Kijiji Canada, analyzes every
listing's price against the market median, and surfaces the underpriced gems —
ranked by deal quality, with the biggest discounts first.

### Why this instead of a plain scraper?

The Apify Store has Kijiji scrapers. They dump raw listings and leave the
thinking to you. This one does the thinking:

- **Deal detection** — flags listings ≥25% below the category median (adjustable)
- **Deal scoring (0–100)** — ranks by discount depth, photo presence, description
  quality, and motivated-seller signals ("moving", "must go", "OBO")
- **Price intelligence** — median, quartiles, min/max across all results, so you
  know what "fair" looks like before you message a seller
- **Pay per deal, not per listing** — the pay-per-event model charges only when
  a genuine deal is found

### Perfect for

- **Resellers & flippers** — spot arbitrage opportunities daily
- **Car buyers** — find underpriced vehicles before others do
- **Bargain hunters** — never miss a "moving sale" priced to go
- **Market researchers** — price distributions across any Kijiji category

### How it works

1. Enter a search (e.g. `lego star wars`, `honda civic`, `iphone 14`)
2. The actor scans up to 10 pages of Kijiji results (~36 listings each)
3. Every listing gets a price-vs-median score and deal reasons
4. Deals sort to the top; full stats land in the `summary` output

### Input

| Field | What it does |
|---|---|
| **searchQuery** (required) | e.g. `ps5`, `vintage lamp`, `mazda 3` |
| **locationId** | Kijiji location ID — `1700273` = Toronto (default). Find yours in any Kijiji search URL after `k0c10l`. |
| **category** | buy-sell, cars-vehicles, real-estate, jobs, services, … |
| **dealThresholdPct** | How far below median counts as a deal (default 25%) |
| **maxPages** | Search pages to scan, ~36 listings each (default 3, max 10) |
| **minPrice / maxPrice** | Optional CAD filters — useful to separate parts from whole items |

### Output

Each listing: `title`, `price`, `currency` (CAD), `url`, `listingId`,
`imageUrl`, `description`, `priceVsMedianPct`, `dealScore` (0–100),
`isDeal`, `dealReasons` (e.g. `["89% below median", "motivated seller"]`).

The `summary` store adds: total listings, deals found, full price stats,
and a `topDeals` shortlist with direct links.

### Tips for best deals

- **Narrow your search** — "honda civic 2018" beats "honda civic" (cleaner median)
- **Use price filters** — set `minPrice` to skip accessories when hunting cars
- **Lower the threshold** — 15% catches more candidates; 40% finds only steals
- **Run daily** — the best deals sell within hours

### Reliability

Kijiji serves clean structured data with no bot blocking — runs are fast
(typically under 30 seconds) and don't need proxies.

# Actor input Schema

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

Kijiji category to search.

## `dealThresholdPct` (type: `integer`):

Flag listings priced this % (or more) below the median as deals.

## `includeStats` (type: `boolean`):

Save a summary with price stats and top deals.

## `locationId` (type: `string`):

Kijiji location ID (1700273 = Toronto). Find yours in any Kijiji search URL: k0c10lYOUR_ID.

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

Max listings to analyze.

## `maxPages` (type: `integer`):

How many search pages to scan (~36 listings each). More pages = better price stats.

## `maxPrice` (type: `number`):

Optional maximum price filter (CAD).

## `minPrice` (type: `number`):

Optional minimum price filter (CAD).

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

Proxy settings. Kijiji does not block datacenter IPs.

## `searchQuery` (type: `string`):

What to search for on Kijiji (e.g. 'lego star wars', 'honda civic').

## Actor input object example

```json
{
  "category": "buy-sell",
  "dealThresholdPct": 25,
  "includeStats": true,
  "locationId": "1700273",
  "maxItems": 100,
  "maxPages": 3,
  "searchQuery": "lego star wars"
}
```

# Actor output Schema

## `dataset` (type: `string`):

Every listing scanned, with price-vs-median, deal score (0-100), and deal reasons. Best deals sort first.

## `summary` (type: `string`):

Run-level summary: query, listing count, deals found, price statistics (min/max/mean/median/p25/p75), and top 10 deals.

# 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 = {
    "searchQuery": "lego star wars"
};

// Run the Actor and wait for it to finish
const run = await client.actor("thomasthinks/kijiji-deal-finder").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 = { "searchQuery": "lego star wars" }

# Run the Actor and wait for it to finish
run = client.actor("thomasthinks/kijiji-deal-finder").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 '{
  "searchQuery": "lego star wars"
}' |
apify call thomasthinks/kijiji-deal-finder --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,thomasthinks/kijiji-deal-finder"
        }
    }
}
```

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/TbHMBCUb9UPMN9nw9/builds/EEdq5yJlMfuXljpbU/openapi.json
