KIJIJI.COM APIKIJIJI.COM ↗
Search Kijiji listings by keyword, location, and price. Retrieve full listing details including description, images, seller info, and coordinates.
curl -X GET 'https://api.parse.bot/scraper/09326f4f-4b54-4bcc-a534-87af48ba4601/search_listings?page=1&sort=dateDesc&query=iPhone&radius=50.0&latitude=43.6548253&location=Toronto%2C+ON&longitude=-79.388447&max_price=1000&min_price=100&location_id=1700273' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace kijiji-com-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
"""Walkthrough: Kijiji SDK — search listings, filter by price, drill into details."""
from parse_apis.Kijiji_Listings_API import Kijiji, Sort, ListingNotFound
client = Kijiji()
# Search for deals under $500 in the GTA, sorted by price ascending.
for listing in client.listings.search(query="iPhone", sort=Sort.PRICE_ASC, max_price="500", limit=5):
print(listing.title, listing.price, listing.location_name)
# Drill into the cheapest result for full details (images, coordinates, seller info).
cheapest = client.listings.search(query="Nintendo Switch", sort=Sort.PRICE_ASC, limit=1).first()
if cheapest:
detail = cheapest.refresh()
print(detail.title, detail.price, detail.description[:120])
print("Seller:", detail.poster_id, "Verified:", detail.poster_verified)
# Typed error handling: catch a missing listing when refreshing a stale reference.
try:
stale = client.listings.search(query="rare vintage", sort=Sort.DATE_DESC, limit=1).first()
if stale:
refreshed = stale.refresh()
print(refreshed.title, refreshed.price)
except ListingNotFound as exc:
print(f"Listing removed: {exc.listing_id}")
print("exercised: listings.search / listing.refresh / ListingNotFound")
Search Kijiji listings by keyword within a geographic area. Results are paginated (40 per page) and can be filtered by price range and sorted by date or price. Location is specified by coordinates and radius. Each listing includes title, price, location, images, and seller attributes.
| Param | Type | Description |
|---|---|---|
| page | integer | Page number for pagination (1-based). |
| sort | string | Sort order for results. |
| queryrequired | string | Search keyword(s) to find listings. |
| radius | string | Search radius in kilometers from the center point. |
| latitude | string | Latitude of the search center point. |
| location | string | Human-readable location name used in the address parameter. |
| longitude | string | Longitude of the search center point. |
| max_price | string | Maximum price filter in dollars (e.g. '500'). |
| min_price | string | Minimum price filter in dollars (e.g. '100'). |
| category_id | string | Kijiji category ID to filter results (e.g. '760' for Cell Phones, '10' for Buy & Sell). Omit for all categories. |
| location_id | string | Kijiji internal location identifier. 1700273 is City of Toronto. |
{
"type": "object",
"fields": {
"page": "integer current page number",
"listings": "array of listing objects with id, title, price, location, image_urls, attributes",
"per_page": "integer results per page",
"total_count": "integer total matching results"
},
"sample": {
"data": {
"page": 1,
"listings": [
{
"id": "1739083107",
"url": "https://www.kijiji.ca/v-cell-phone/markham-york-region/apple-iphone-xr/1739083107",
"price": 100,
"title": "Apple iPhone XR",
"top_ad": false,
"ad_source": "ORGANIC",
"attributes": {
"condition": "usedfair",
"phonebrand": "apple",
"phonecarrier": "unlck"
},
"image_urls": [
"https://media.kijiji.ca/api/v1/ca-prod-fsbo-ads/images/cb/cb5ee7b3.jpg"
],
"price_drop": false,
"price_type": "FIXED",
"category_id": 760,
"sorting_date": "2026-06-12T17:20:04.000Z",
"location_name": "Markham / York Region",
"activation_date": "2026-06-12T17:20:04.000Z",
"location_address": "Rutherford Rd, Vaughan, ON L4K 0C1"
}
],
"per_page": 40,
"total_count": 1399
},
"status": "success"
}
}About the KIJIJI.COM API
The Kijiji API provides 2 endpoints to search and retrieve classified ad listings from Canada's largest online marketplace. The search_listings endpoint accepts keyword queries with optional latitude/longitude and radius inputs, returning paginated results of up to 40 listings per page including title, price, location, image URLs, and item attributes. The get_listing endpoint fetches complete details for any single listing by its numeric ID.
Search Listings
The search_listings endpoint takes a required query string and optional geographic parameters — latitude, longitude, and radius (in kilometers) — to scope results to a specific area. A human-readable location string can be included alongside the coordinates. Results can be filtered with max_price and sorted by date or price via the sort parameter. The response includes total_count (total matching results), per_page (fixed at 40), the current page number, and a listings array. Each listing object contains an id, title, price, location, image_urls, and an attributes object with item-specific metadata.
Listing Detail
The get_listing endpoint accepts a numeric listing_id and returns the full record for that ad. Response fields include the full url, price as a number (or null), price_type (either FIXED or CONTACT), latitude and longitude coordinates, poster_id (the seller's identifier), image_urls at higher resolution than the search results, and an attributes object with all structured details the seller provided.
Pagination and Filtering
Search results are paginated in fixed pages of 40 listings. Use the page parameter (1-based) to walk through result sets. The total_count field in the response tells you how many total listings match the query, so you can calculate how many pages to fetch. Price filtering is one-sided — only max_price is supported as a filter parameter; there is no min_price input on search_listings.
The KIJIJI.COM API is a managed, monitored endpoint for KIJIJI.COM — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when KIJIJI.COM changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official KIJIJI.COM API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Monitor price trends for used cars in a specific Canadian city by querying vehicle keywords with location coordinates
- Aggregate rental listings across multiple regions by running
search_listingswith different latitude/longitude pairs - Build a deal-alert tool that compares current listing prices against a target
max_pricethreshold - Enrich a listing index by fetching full
get_listingdetails — includingattributesand high-resolutionimage_urls— for IDs returned by search - Track seller activity by recording
poster_idvalues across multiple listing detail responses - Identify listings with no set price by filtering
get_listingresults whereprice_typeisCONTACTorpriceis null - Geocode classified ads by extracting
latitudeandlongitudefromget_listingto plot inventory on a map
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 100 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 250 req/min |
One credit = one API call regardless of which marketplace API you call. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does Kijiji have an official developer API?+
What location inputs does `search_listings` accept, and are they all required?+
latitude, longitude, radius, and location are all optional. You can run a keyword-only search by providing just the query parameter, and Kijiji will return results without geographic filtering. Supplying coordinates with a radius narrows results to a specific area around that point.Does the search endpoint support a minimum price filter?+
max_price is available as a price filter on search_listings. There is no min_price parameter. You can fork this API on Parse and revise it to add a minimum price input if your use case requires filtering out low-priced results.Is category-based filtering supported on search?+
search_listings endpoint does not expose a category filter parameter — searches are keyword and location based. The API covers title, price, attributes, and location fields in results. You can fork it on Parse and revise to add a category parameter targeting specific Kijiji verticals like real estate or automotive.What is the difference between listing data returned by `search_listings` versus `get_listing`?+
search_listings returns a summary per listing — id, title, price, location, image_urls, and attributes — suitable for scanning many results. get_listing returns the full record for one listing: the complete description, high-resolution image_urls, exact latitude/longitude coordinates, poster_id, price_type, and the full attributes object. For any field beyond the summary, fetch by listing ID.