{
  "openapi": "3.0.1",
  "info": {
    "title": "Kijiji Property Scraper",
    "description": "Scrape Kijiji real estate across Canada: apartments, basement suites, rooms, houses and land, for rent or for sale. Price, beds, baths, sqft, utilities, move-in date and whether an owner or an agent posted it.",
    "version": "1.0",
    "x-build-id": "uKfk1pBfeg1v615Zy"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/sian.agency~kijiji-property-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-sian.agency-kijiji-property-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/sian.agency~kijiji-property-scraper/runs": {
      "post": {
        "operationId": "runs-sync-sian.agency-kijiji-property-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/sian.agency~kijiji-property-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-sian.agency-kijiji-property-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": {
          "operation": {
            "title": "🎯 What do you want to scrape?",
            "enum": [
              "search",
              "detail"
            ],
            "type": "string",
            "description": "🔍 **Listing search** sweeps a Kijiji real-estate search — pasted URL or built from the fields below — and returns 46 ads per page with price, beds, baths, size, utilities, amenities, coordinates and who posted it. 📄 **Listing detail** takes an ad address or id and returns the untruncated description, the full photo set, the view count, the poster's profile and their contact line.",
            "default": "search"
          },
          "searchUrls": {
            "title": "🌐 Kijiji search URLs",
            "type": "array",
            "description": "🌐 **PASTE A SEARCH FROM KIJIJI.** Set up the search on kijiji.ca with whatever filters you want, then copy the address bar and drop it here.\n\n🧠 **Every filter in the address is honoured** — bedrooms, price band, pet rules, utilities, unit type, accessibility — because the page is fetched exactly as pasted and Kijiji resolves it.\n\n🇫🇷 French addresses work too: `/b-immobilier/…` returns the same listings as `/b-real-estate/…`.\n\n📥 **BULK:** one address per line, or upload a .txt file.",
            "default": [],
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "keywords": {
            "title": "🔑 Keyword",
            "type": "string",
            "description": "🔑 **WORDS THAT MUST APPEAR IN THE AD.** Searches the ad title and body — 'basement', 'pet friendly', 'utilities included', 'walkout'. 💡 **TIP:** leave it empty and pick a category to sweep that whole section newest-first, which is the shape you want for a daily monitor. 🧩 Keyword, category and location combine.",
            "default": ""
          },
          "category": {
            "title": "🗂️ Property category",
            "enum": [
              "34",
              "30349001",
              "37",
              "42",
              "36",
              "39",
              "40",
              "30353001",
              "35",
              "643",
              "641",
              "44"
            ],
            "type": "string",
            "description": "🗂️ **WHICH SECTION TO SWEEP.** For rent, as Kijiji counted it on 2026-09-06: long-term rentals 48,347 · rooms & roommates 11,101 · commercial 11,357 · short-term 2,163 · storage & parking 712.\n\nFor sale: houses 96,549 · condos 33,337 · land 29,040 · commercial 10,239. All real estate together is 242,932.\n\n💡 Rooms & roommates and long-term rentals are where private landlords post; the for-sale branches are mostly agents.",
            "default": "37"
          },
          "location": {
            "title": "📍 Province or metro",
            "enum": [
              "0",
              "9004",
              "1700272",
              "1700273",
              "1700184",
              "80014",
              "1700214",
              "1700209",
              "9007",
              "80003",
              "1700173",
              "1700228",
              "9003",
              "1700199",
              "1700202",
              "9001",
              "80002",
              "1700124",
              "9006",
              "9009",
              "9002",
              "9005",
              "9008",
              "9011",
              "9010"
            ],
            "type": "string",
            "description": "📍 **WHERE TO LOOK.** Every value here was read off Kijiji's own location picker, so none of them 404. 🔎 **Need a smaller area** — a single suburb, a postal district, a neighbourhood? Open it on kijiji.ca and paste that address into 🌐 Kijiji search URLs instead; this list stops at province and metro.",
            "default": "0"
          },
          "listedBy": {
            "title": "👤 Posted by",
            "enum": [
              "any",
              "owner",
              "professional"
            ],
            "type": "string",
            "description": "👤 **THE FILTER THAT MAKES KIJIJI WORTH READING.** About 22,000 of the 48,000 long-term rentals are posted by the owner, not a property manager.\n\n🏡 **Owner** keeps ads the poster flagged as their own. 🏢 **Professional** keeps managers, brokerages and agents.\n\n⚠️ Kijiji offers this in the rental categories, houses, condos and land — not in all real estate, rooms or commercial for sale. Picking it there is refused, never silently ignored.\n\nℹ️ Every row carries `listedBy` anyway.",
            "default": "any"
          },
          "bedrooms": {
            "title": "🛏️ Bedrooms",
            "enum": [
              "any",
              "0",
              "1",
              "1.5",
              "2",
              "2.5",
              "3",
              "3.5",
              "4",
              "4.5",
              "5"
            ],
            "type": "string",
            "description": "🛏️ **EXACT BEDROOM COUNT.** Kijiji treats a den as a half, so '1 + den' is its own bucket rather than a rounded 1 or 2. ⚠️ Only rental ads carry a bedroom count — for-sale and land ads mostly leave it blank, so this narrows those sections to almost nothing.",
            "default": "any"
          },
          "minPrice": {
            "title": "💵 Minimum price (CAD)",
            "minimum": 0,
            "type": "integer",
            "description": "💵 **FLOOR PRICE IN CANADIAN DOLLARS.** Monthly rent in the rental sections, asking price in the for-sale ones. 0 means no floor. ⚠️ Ads priced 'Please Contact' carry no number at all and drop out as soon as you set either bound — about 7% of the board.",
            "default": 0
          },
          "maxPrice": {
            "title": "💰 Maximum price (CAD)",
            "minimum": 0,
            "type": "integer",
            "description": "💰 **CEILING PRICE IN CANADIAN DOLLARS.** 0 means no ceiling. Set it together with the floor to take a band — 1,500 to 2,500 a month, say.",
            "default": 0
          },
          "sortBy": {
            "title": "↕️ Order",
            "enum": [
              "dateDesc",
              "dateAsc",
              "priceAsc",
              "priceDesc"
            ],
            "type": "string",
            "description": "↕️ **WHICH ADS COME BACK FIRST.** This matters whenever 🔢 Maximum results is smaller than the section, because you keep the front of the order and drop the tail. 🆕 Newest first is what a change monitor wants. ⬆️ Cheapest first is what a deal sweep wants.",
            "default": "dateDesc"
          },
          "maxItems": {
            "title": "🔢 Maximum results",
            "minimum": 1,
            "maximum": 5000,
            "type": "integer",
            "description": "🔢 **HOW MANY ADS PER SEARCH, AND THEREFORE WHAT THE RUN COSTS.** It is a cap per search address, so three pasted addresses at 100 return up to 300 ads. Kijiji serves 46 ads per page, so the actor reads ceil(results ÷ 46) pages of each.\n\n💡 100 is a sensible look; 1,000 is a working dataset; 5,000 is the deepest one search reaches before Kijiji stops paging — split the query by city or price band to go past that.",
            "default": 100
          },
          "enrichWithDetails": {
            "title": "🔬 Open each ad for the full record",
            "type": "boolean",
            "description": "🔬 **FETCHES EVERY AD'S OWN PAGE ON TOP OF THE SEARCH.** Search rows carry Kijiji's own snippet, cut at about 200 characters; this adds the untruncated description and the full-resolution photo set. It also adds the view counter, the expiry date, the virtual-tour link and the poster's profile.\n\n💸 **It bills one 📄 Listing Detail charge per ad** on top of the search charge, and costs one extra page fetch. Turn it on when you need the text or the poster, not to browse.",
            "default": false
          },
          "listingUrls": {
            "title": "📄 Ad addresses or IDs",
            "type": "array",
            "description": "📄 **READ NAMED ADS DIRECTLY.** Paste full ad addresses (`https://www.kijiji.ca/v-apartments-condos/…/1742889268`) or bare numeric ids (`1742889268`) — both work. 🧾 Each one returns the same full record 🔬 enrichment produces, and bills one 📄 Listing Detail charge. ♻️ **Use it to re-check ads you already have:** an ad that has been taken down comes back with its status instead of an error.",
            "default": [],
            "items": {
              "type": "string"
            }
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}