Sign inTry it

Search Kijiji classifieds in Canada.

Searches Kijiji, Canada's largest classifieds site, like its search page: title, price in CAD (or free / please contact / swap), area, when it was posted, short description, a photo and the link, for a query in all of Canada, a province or a big metro area, with a price range and sort. Top ads (paid) are dropped by default.

No reports yetRead-only, no login
Site
Kijiji, Canada
Version
v1
Runs, last 7 days
No reports yet
sha256
183546ead511…

Run it with your agent

after installing Wield

Ask in plain words. Your agent finds this recipe and calls it:

“Search Kijiji classifieds in Canada.”

Read-only: it changes nothing on the site. No login needed.

{
  "tool": "run",
  "arguments": {
    "recipe_id": "kijiji.ca/search-listings",
    "params": {
      "location": "ontario",
      "max_price": 300,
      "query": "road bike",
      "sort": "newest"
    }
  }
}

Requests

sent from your browser, in order
  1. 1GET/b-canada/{{f.kw | urlencode}}/{{f.pg}}k0l{{f.loc}}?price&sortThe server-rendered search page /b-canada/<keywords>/[page-N/]k0l<location id> (Next.js with an Apollo cache in __NEXT_DATA__). The location id decides the area; the slug before it is not checked. The one-item foreach maps the location, price range (price=min__max) and sort.repeats, max 1

Parameters

from your agent
include_top_adsbooleanKeep Top Ads (paid placements), marked = false
locationenumAll of Canada, a province, or a metro area (toronto = Greater Toronto Area, ottawa = Ottawa / Gatineau, london-on = London, Ontario) "canada" | "ontario" | "quebec" | "british-columbia" | "alberta" | "manitoba" | "saskatchewan" | "nova-scotia" | "new-brunswick" | "newfoundland" | "prince-edward-island" | "toronto" | "montreal" | "vancouver" | "calgary" | "edmonton" | "ottawa" | "quebec-city" | "hamilton" | "victoria" | "kitchener" | "london-on" = "canada"
max_priceintegerCAD
min_priceintegerCAD
pageinteger40 listings per page = 1
querystringrequiredWhat to look for, e.g. 'road bike', 'standing desk', 'iphone 13'
sortenum "relevance" | "newest" | "oldest" | "price_low" | "price_high" = "relevance"

Returns

to your agent
listingsobject[]description, id, image, listed, location, posted, price_cad, price_drop, price_type, title, top_ad, url, verified_seller
locationstring
pageinteger
querystring
totalinteger

Where it can send

  • www.kijiji.ca

Anything else is blocked by the extension.

Reads from your session

Nothing. Your browser attaches the site's cookies by itself.

Used only in requests to the addresses on the left. Never sent to wield.run or your agent.

Checks

a run passes when
  • length(output.listings) > `20`
  • output.total > `100`
  • length(output.listings[?top_ad]) == `0`
  • length(output.listings[?price_cad > `300`]) == `0`
  • length(output.listings[?starts_with(url, 'https://www.kijiji.ca/v-')]) == length(output.listings)
  • output.listings[*].listed == reverse(sort(output.listings[*].listed))

Raw recipe

Served as canonical JSON from /api/v1/recipes/kijiji.ca/search-listings, so its sha256 matches the ETag and the index.

Check it yourself
curl -s https://wield.run/api/v1/recipes/kijiji.ca/search-listings | shasum -a 256
# 183546ead511477882b790f5a916c765d9fc9dd3b53ed3d0f6990c88865f64dc
kijiji.ca/search-listings.json, v1
{
  "description": "Searches Kijiji, Canada's largest classifieds site, like its search page: title, price in CAD (or free / please contact / swap), area, when it was posted, short description, a photo and the link, for a query in all of Canada, a province or a big metro area, with a price range and sort. Top ads (paid) are dropped by default.",
  "effect": "read",
  "id": "kijiji.ca/search-listings",
  "keywords": [
    "kijiji",
    "classifieds",
    "for sale",
    "used",
    "second hand",
    "buy",
    "sell",
    "free stuff",
    "bike",
    "furniture",
    "canada",
    "toronto",
    "montreal",
    "vancouver",
    "calgary",
    "petites annonces",
    "à vendre",
    "marketplace"
  ],
  "output": {
    "schema": {
      "properties": {
        "listings": {
          "items": {
            "properties": {
              "description": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "id": {
                "type": "string"
              },
              "image": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "listed": {
                "description": "The date Kijiji sorts by (moves up when the ad is reposted), ISO 8601 UTC",
                "type": [
                  "string",
                  "null"
                ]
              },
              "location": {
                "description": "Area as Kijiji shows it, e.g. 'City of Toronto'",
                "type": [
                  "string",
                  "null"
                ]
              },
              "posted": {
                "description": "ISO 8601, UTC",
                "type": [
                  "string",
                  "null"
                ]
              },
              "price_cad": {
                "type": [
                  "number",
                  "null"
                ]
              },
              "price_drop": {
                "type": "boolean"
              },
              "price_type": {
                "description": "FIXED, FREE, CONTACT (please contact), SWAP_TRADE, …",
                "type": [
                  "string",
                  "null"
                ]
              },
              "title": {
                "type": "string"
              },
              "top_ad": {
                "description": "Paid Top Ad",
                "type": "boolean"
              },
              "url": {
                "type": "string"
              },
              "verified_seller": {
                "type": "boolean"
              }
            },
            "type": "object"
          },
          "type": "array"
        },
        "location": {
          "type": "string"
        },
        "page": {
          "type": "integer"
        },
        "query": {
          "type": "string"
        },
        "total": {
          "type": [
            "integer",
            "null"
          ]
        }
      },
      "required": [
        "query",
        "listings"
      ],
      "type": "object"
    },
    "value": "let $top = params.include_top_ads == `true`, $s = steps.search[0] in {query: params.query, location: params.location || 'canada', total: $s.total || `0`, page: params.page || `1`, listings: map(&(let $l = @ in {id: $l.id, title: $l.title, description: $l.description, price_cad: $l.amount != `null` && $l.amount / `100` || `null`, price_type: $l.price_type, location: $l.location, posted: $l.posted, listed: $l.listed, price_drop: $l.price_drop, verified_seller: $l.verified, top_ad: $l.top_ad, image: $l.image, url: $l.url}), $s.listings || `[]`)[?$top || !top_ad]}"
  },
  "params": {
    "additionalProperties": false,
    "properties": {
      "include_top_ads": {
        "default": false,
        "description": "Keep Top Ads (paid placements), marked",
        "type": "boolean"
      },
      "location": {
        "default": "canada",
        "description": "All of Canada, a province, or a metro area (toronto = Greater Toronto Area, ottawa = Ottawa / Gatineau, london-on = London, Ontario)",
        "enum": [
          "canada",
          "ontario",
          "quebec",
          "british-columbia",
          "alberta",
          "manitoba",
          "saskatchewan",
          "nova-scotia",
          "new-brunswick",
          "newfoundland",
          "prince-edward-island",
          "toronto",
          "montreal",
          "vancouver",
          "calgary",
          "edmonton",
          "ottawa",
          "quebec-city",
          "hamilton",
          "victoria",
          "kitchener",
          "london-on"
        ],
        "type": "string"
      },
      "max_price": {
        "description": "CAD",
        "minimum": 0,
        "type": "integer"
      },
      "min_price": {
        "description": "CAD",
        "minimum": 0,
        "type": "integer"
      },
      "page": {
        "default": 1,
        "description": "40 listings per page",
        "maximum": 20,
        "minimum": 1,
        "type": "integer"
      },
      "query": {
        "description": "What to look for, e.g. 'road bike', 'standing desk', 'iphone 13'",
        "maxLength": 80,
        "minLength": 2,
        "type": "string"
      },
      "sort": {
        "default": "relevance",
        "enum": [
          "relevance",
          "newest",
          "oldest",
          "price_low",
          "price_high"
        ],
        "type": "string"
      }
    },
    "required": [
      "query"
    ],
    "type": "object"
  },
  "provenance": {
    "method": "browser-inspect",
    "notes": "kijiji.ca search pages are server-rendered (Next.js) with an Apollo cache in __NEXT_DATA__ props.pageProps.__APOLLO_STATE__: ROOT_QUERY['searchResultsPageByUrl:<path>'] holds pagination.totalCount and refs to topListings (paid, adSource TOP_AD) and mainListings (40, ORGANIC); the StandardListing entities appear in the cache in display order (top ads first). Prices are in cents with a type (FIXED, FREE, CONTACT, SWAP_TRADE). Location ids come from the page's own location filter tree (provinces 9001–9011, metro areas such as Toronto (GTA) 1700272, Greater Montréal 80002, Greater Vancouver 80003); the slug before k0l<id> is not checked (no redirect). price=<min>__<max>, sort=dateDesc/dateAsc/priceAsc/priceDesc and /page-N/ as the site's links use them. Posters' street addresses and coordinates are left out. robots.txt has no rules for Claude-User or anthropic agents and allows /b- search pages. Answers servers.",
    "recorded_at": "2026-11-07T22:28:00+01:00",
    "recorded_by": "C4"
  },
  "requires_login": false,
  "schema": "https://wield.run/schema/recipe/v1.json",
  "site": {
    "country": "CA",
    "id": "kijiji.ca",
    "language": "en",
    "name": "Kijiji",
    "origin": "https://www.kijiji.ca",
    "origins": [
      "https://www.kijiji.ca"
    ]
  },
  "steps": [
    {
      "description": "The server-rendered search page /b-canada/<keywords>/[page-N/]k0l<location id> (Next.js with an Apollo cache in __NEXT_DATA__). The location id decides the area; the slug before it is not checked. The one-item foreach maps the location, price range (price=min__max) and sort.",
      "expect": {
        "content_type": "html",
        "status": [
          200
        ]
      },
      "extract": {
        "embedded_json": {
          "selector": "script#__NEXT_DATA__",
          "vars": {
            "listings": "values(props.pageProps.__APOLLO_STATE__)[?__typename && ends_with(__typename, 'Listing')].{id: id, title: title, description: description || `null`, amount: price.amount, price_type: price.type || `null`, location: location.name || `null`, posted: activationDate || `null`, listed: sortingDate || activationDate || `null`, image: imageUrls[0] || `null`, url: url, top_ad: adSource != 'ORGANIC' || flags.topAd == `true`, price_drop: flags.priceDrop == `true`, verified: posterInfo.verified == `true`}",
            "total": "values(props.pageProps.__APOLLO_STATE__.ROOT_QUERY)[?pagination] | [0].pagination.totalCount"
          }
        }
      },
      "foreach": {
        "as": "f",
        "in": "[{kw: replace(lower(trim(params.query)), ' ', '-'), loc: (let $l = params.location || 'canada' in items(`{\"canada\":\"0\",\"ontario\":\"9004\",\"quebec\":\"9001\",\"british-columbia\":\"9007\",\"alberta\":\"9003\",\"manitoba\":\"9006\",\"saskatchewan\":\"9009\",\"nova-scotia\":\"9002\",\"new-brunswick\":\"9005\",\"newfoundland\":\"9008\",\"prince-edward-island\":\"9011\",\"toronto\":\"1700272\",\"montreal\":\"80002\",\"vancouver\":\"80003\",\"calgary\":\"1700199\",\"edmonton\":\"1700202\",\"ottawa\":\"1700184\",\"quebec-city\":\"1700124\",\"hamilton\":\"80014\",\"victoria\":\"1700173\",\"kitchener\":\"1700209\",\"london-on\":\"1700214\"}`)[?[0] == $l] | [0][1]), pg: (params.page || `1`) > `1` && join('', ['page-', to_string(params.page), '/']) || '', price: (params.min_price || params.max_price) && join('__', [params.min_price && to_string(params.min_price) || '', params.max_price && to_string(params.max_price) || '']) || `null`, sort: (params.sort == 'newest' && 'dateDesc') || (params.sort == 'oldest' && 'dateAsc') || (params.sort == 'price_low' && 'priceAsc') || (params.sort == 'price_high' && 'priceDesc') || `null`}]",
        "max": 1
      },
      "id": "search",
      "parse": "html",
      "request": {
        "headers": {
          "Accept": "text/html"
        },
        "method": "GET",
        "query": {
          "price": "{{f.price}}",
          "sort": "{{f.sort}}"
        },
        "url": "/b-canada/{{f.kw | urlencode}}/{{f.pg}}k0l{{f.loc}}"
      }
    }
  ],
  "task": "Search Kijiji classifieds in Canada",
  "tos": {
    "notes": "robots.txt has no AI-agent rules (no Claude-User, ClaudeBot or anthropic-ai group, no Content-Signal), checked 2026-11-07. Terms not reviewed yet for automated access. One person's search: 1 request for one results page. Messages to sellers stay on kijiji.ca.",
    "reviewed": false
  },
  "verify": {
    "checks": [
      "length(output.listings) > `20`",
      "output.total > `100`",
      "length(output.listings[?top_ad]) == `0`",
      "length(output.listings[?price_cad > `300`]) == `0`",
      "length(output.listings[?starts_with(url, 'https://www.kijiji.ca/v-')]) == length(output.listings)",
      "output.listings[*].listed == reverse(sort(output.listings[*].listed))"
    ],
    "example_params": {
      "location": "ontario",
      "max_price": 300,
      "query": "road bike",
      "sort": "newest"
    },
    "max_ms": 6000
  },
  "version": 1
}