{
  "openapi": "3.0.1",
  "info": {
    "title": "FINN.no Scraper — Property, Jobs, Cars & Torget",
    "description": "Scrape FINN.no, Norway's largest marketplace: property (sale, rent, plots), job ads, cars and Torget classifieds in one actor. Price, m2, energy label, coordinates, agent phones — or employer, deadline, contacts — or VIN, mileage, full car specs. No proxy needed.",
    "version": "0.0",
    "x-build-id": "TPlbpApfLVTl1DwgU"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/memo23~finn-no-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-memo23-finn-no-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/memo23~finn-no-scraper/runs": {
      "post": {
        "operationId": "runs-sync-memo23-finn-no-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/memo23~finn-no-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-memo23-finn-no-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": {
          "startUrls": {
            "title": "FINN URLs (search or ad)",
            "type": "array",
            "description": "FINN.no search-result or ad URLs, auto-classified across all four verticals. Property search: `https://www.finn.no/realestate/homes/search.html?location=0.20061`. Property ad: `https://www.finn.no/realestate/homes/ad.html?finnkode=473282564`. Job search: `https://www.finn.no/job/search?q=utvikler`. Job ad: `https://www.finn.no/job/ad/472810559`. Car search: `https://www.finn.no/mobility/search/car?variant=0.817`. Car ad: `https://www.finn.no/mobility/item/441416549`. Torget search: `https://www.finn.no/recommerce/forsale/search?q=sykkel`. Torget ad: `https://www.finn.no/recommerce/forsale/item/473315083`. Note: job URLs containing a `location=` parameter return 0 rows because FINN renders those results in the browser — use `jobLocationContains` instead. Example: [\"https://www.finn.no/realestate/homes/search.html?location=0.20061\"]. Default: empty.",
            "items": {
              "type": "string"
            }
          },
          "vertical": {
            "title": "Filter builder targets",
            "enum": [
              "realestate",
              "job",
              "car",
              "torget"
            ],
            "type": "string",
            "description": "Which vertical the filter fields below build a search for. `realestate` uses the property filters; `job` uses the job filters. Ignored when you only paste URLs. Example: \"realestate\". Default: \"realestate\".",
            "default": "realestate"
          },
          "section": {
            "title": "Property section",
            "enum": [
              "homes",
              "lettings",
              "newbuildings",
              "leisure-sale",
              "plots"
            ],
            "type": "string",
            "description": "Which FINN property market to search. `homes` = homes for sale, `lettings` = rentals, `newbuildings` = new-builds, `leisure-sale` = holiday homes, `plots` = land. Example: \"homes\". Default: \"homes\".",
            "default": "homes"
          },
          "locations": {
            "title": "Locations",
            "type": "array",
            "description": "Norwegian counties by name (`Oslo`, `Vestland`, `Trøndelag`, `Akershus`, `Rogaland`, `Innlandet`, `Agder`, `Buskerud`, `Vestfold`, `Østfold`, `Telemark`, `Troms`, `Nordland`, `Finnmark`, `Møre og Romsdal`, `Svalbard`) or raw FINN location codes such as `0.20061` (Oslo) and `1.22042.20166` (Arendal municipality). Copy a municipality code from any finn.no search URL. Example: [\"Oslo\"]. Default: empty.",
            "items": {
              "type": "string"
            }
          },
          "searchQuery": {
            "title": "Keyword",
            "type": "string",
            "description": "Free-text keyword matched against property ads, e.g. `penthouse`, `enebolig`, `sjøutsikt`. Leave empty to match everything in the selected locations. Example: \"penthouse\". Default: empty."
          },
          "priceFrom": {
            "title": "Min price (NOK)",
            "minimum": 0,
            "type": "integer",
            "description": "Lowest total price in NOK. For lettings this is monthly rent. Example: 3000000. Default: no minimum."
          },
          "priceTo": {
            "title": "Max price (NOK)",
            "minimum": 0,
            "type": "integer",
            "description": "Highest total price in NOK. For lettings this is monthly rent. Example: 8000000. Default: no maximum."
          },
          "areaFrom": {
            "title": "Min area (m²)",
            "minimum": 0,
            "type": "integer",
            "description": "Smallest usable internal area in square metres. Example: 60. Default: no minimum."
          },
          "areaTo": {
            "title": "Max area (m²)",
            "minimum": 0,
            "type": "integer",
            "description": "Largest usable internal area in square metres. Example: 200. Default: no maximum."
          },
          "minBedrooms": {
            "title": "Min bedrooms",
            "minimum": 0,
            "maximum": 20,
            "type": "integer",
            "description": "Minimum number of bedrooms. Example: 3. Default: no minimum."
          },
          "propertyTypes": {
            "title": "Property types",
            "type": "array",
            "description": "FINN property-type codes: `1` Enebolig (detached), `2` Tomannsbolig (semi-detached), `3` Leilighet (apartment), `4` Rekkehus (terraced), `6` Garasje/Parkering, `9` Produksjon/Industri, `11` Gårdsbruk/Småbruk (farm), `18` Andre, `20` Bygård/Flermannsbolig. Repeatable — several codes widen the search. Example: [\"3\"]. Default: all types.",
            "items": {
              "type": "string"
            }
          },
          "ownershipTypes": {
            "title": "Ownership types",
            "type": "array",
            "description": "FINN ownership codes: `1` Obligasjon, `2` Aksje, `3` Selveier (freehold), `4` Andel (co-op), `255` Annet. Repeatable. Example: [\"3\"]. Default: all ownership types.",
            "items": {
              "type": "string"
            }
          },
          "energyLabels": {
            "title": "Energy labels",
            "type": "array",
            "description": "Energy-class codes, where `1` = A through `7` = G. Repeatable. Example: [\"1\", \"2\"]. Default: any energy class.",
            "items": {
              "type": "string"
            }
          },
          "privateSellerOnly": {
            "title": "Private sellers only",
            "type": "boolean",
            "description": "When true, returns only ads posted privately rather than through an estate agency. Example: false. Default: false.",
            "default": false
          },
          "publishedToday": {
            "title": "Published today only",
            "type": "boolean",
            "description": "When true, returns only ads first published today — useful for scheduled daily runs. Example: false. Default: false.",
            "default": false
          },
          "jobQuery": {
            "title": "Job keyword",
            "type": "string",
            "description": "Free-text keyword matched against job ads, e.g. `utvikler`, `sykepleier`, `prosjektleder`. Example: \"utvikler\". Default: empty."
          },
          "jobOccupations": {
            "title": "Occupation codes",
            "type": "array",
            "description": "FINN occupation (Stillingsfunksjon) codes such as `0.38` (Mekanikk og installasjon) or `0.46` (Produksjon). Copy them from an `occupation=` parameter in any finn.no job search URL. Repeatable. Example: [\"0.38\"]. Default: all occupations.",
            "items": {
              "type": "string"
            }
          },
          "jobIndustries": {
            "title": "Industry codes",
            "type": "array",
            "description": "FINN industry (Bransje) codes such as `70` (Industri og produksjon) or `35` (Kraft og energi). Copy them from an `industry=` parameter in any finn.no job search URL. Repeatable. Example: [\"70\"]. Default: all industries.",
            "items": {
              "type": "string"
            }
          },
          "jobLocationContains": {
            "title": "Job location contains",
            "type": "string",
            "description": "Case-insensitive text that a job's location must contain, applied after parsing, e.g. `Oslo` or `Bergen`. This exists because FINN renders location-filtered job searches in the browser, so a `location=` URL parameter returns nothing to a scraper. Rows that don't match are dropped and never billed. Example: \"Oslo\". Default: no location filter."
          },
          "carQuery": {
            "title": "Car keyword",
            "type": "string",
            "description": "Free-text keyword matched against vehicle ads, e.g. `tiguan`, `tesla model 3`, `varebil`. Example: \"tiguan\". Default: empty."
          },
          "carPriceFrom": {
            "title": "Min price (NOK)",
            "minimum": 0,
            "type": "integer",
            "description": "Lowest asking price in NOK. Example: 50000. Default: no minimum."
          },
          "carPriceTo": {
            "title": "Max price (NOK)",
            "minimum": 0,
            "type": "integer",
            "description": "Highest asking price in NOK. Example: 200000. Default: no maximum."
          },
          "carYearFrom": {
            "title": "Min model year",
            "minimum": 1900,
            "maximum": 2100,
            "type": "integer",
            "description": "Earliest model year. Example: 2015. Default: no minimum."
          },
          "carYearTo": {
            "title": "Max model year",
            "minimum": 1900,
            "maximum": 2100,
            "type": "integer",
            "description": "Latest model year. Example: 2022. Default: no maximum."
          },
          "carMileageTo": {
            "title": "Max mileage (km)",
            "minimum": 0,
            "type": "integer",
            "description": "Highest odometer reading in kilometres. Example: 150000. Default: no maximum."
          },
          "splitByPrice": {
            "title": "Split car searches by price",
            "type": "boolean",
            "description": "Slice a car search into `price_from`/`price_to` bands so no band hits FINN's 50-page wall, then collect each band in full. Bands are measured against FINN's own result count before the crawl and halved automatically while any is still too big, so the ladder never needs maintaining as the market grows. Ignored when your URL already pins a price range — that is your slice, not the market. Example: true. Default: true.",
            "default": true
          },
          "priceBands": {
            "title": "Price band edges (NOK)",
            "type": "array",
            "description": "Optional starting edges for the split, ascending; each becomes a band boundary. Any band still over the ceiling is halved automatically, so a rough ladder is enough. Leave empty to let the actor work the edges out on its own. Example: [150000, 300000, 500000]. Default: empty.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "scrapePhone": {
            "title": "Get seller phone numbers (cars)",
            "type": "boolean",
            "description": "Fetch the number behind each car ad's “Se telefonnummer” button and return it as `phone`. Needs no login and costs one extra request per ad. Charged only when FINN actually returns a number — around 2% of ads publish none, and those cost nothing. Requires the ad page, so it turns on detail fetching for cars. Example: true. Default: false.",
            "default": false
          },
          "failOnIncomplete": {
            "title": "Fail the run when the dataset is short",
            "type": "boolean",
            "description": "End the run as FAILED when the shortfall against FINN's reported count exceeds the threshold below. Runs stopped by your own row limits are exempt — those are partial by request. Delivering more rows than reported never fails: ads get published while a run is in flight, and rows are deduplicated by ad id. Example: true. Default: true.",
            "default": true
          },
          "completenessTolerancePercent": {
            "title": "Tolerance (% of reported)",
            "minimum": 0,
            "maximum": 100,
            "type": "integer",
            "description": "Relative half of the threshold. The count moves while a run is in flight — ads are posted and withdrawn by the minute — so a strict match would fail nearly every run. Example: 1. Default: 1.",
            "default": 1
          },
          "completenessToleranceAbsolute": {
            "title": "Tolerance (ads)",
            "minimum": 0,
            "type": "integer",
            "description": "Absolute floor of the threshold; the larger of the two wins. On a 2,000-ad band 1% is only 20 ads, well inside a day's churn — this floor is what keeps small bands from failing on noise. Example: 25. Default: 25.",
            "default": 25
          },
          "torgetQuery": {
            "title": "Torget keyword",
            "type": "string",
            "description": "Free-text keyword matched against classified ads, e.g. `sykkel`, `iphone`, `sofa`. Example: \"sykkel\". Default: empty."
          },
          "torgetPriceFrom": {
            "title": "Min price (NOK)",
            "minimum": 0,
            "type": "integer",
            "description": "Lowest asking price in NOK. Example: 500. Default: no minimum."
          },
          "torgetPriceTo": {
            "title": "Max price (NOK)",
            "minimum": 0,
            "type": "integer",
            "description": "Highest asking price in NOK. Example: 5000. Default: no maximum."
          },
          "scrapeDetails": {
            "title": "Scrape detail pages",
            "type": "boolean",
            "description": "Fetch each listing's own page for the full payload — property: description, energy label, construction year, floor, shared cost, collective debt, tax value, facilities, all photos, viewing times and agent phone numbers; jobs: full ad text, employment type, deadline, sector, industry, keywords, contact people and the apply URL; cars: the full spec table (registration number, VIN, owners, CO₂, towing capacity, next EU inspection) plus description and all photos; Torget: description, brand, condition and category. Roughly doubles the requests. Ad URLs you paste are always fully detailed. Example: true. Default: false.",
            "default": false
          },
          "maxItems": {
            "title": "Max results (whole run)",
            "minimum": 1,
            "type": "integer",
            "description": "Hard cap on rows across the entire run; each row is one paid result. Free-tier accounts are additionally capped at 100. Example: 200. Default: 1000.",
            "default": 1000
          },
          "maxItemsPerSearch": {
            "title": "Max results per search",
            "minimum": 1,
            "type": "integer",
            "description": "Cap on rows from any one search. When a car search is split into price bands this still counts the whole search, not each band — so raise it (along with Max results) before a full-market run, or the sweep stops early. Example: 1000. Default: 1000.",
            "default": 1000
          },
          "maxConcurrency": {
            "title": "Max parallel requests",
            "minimum": 1,
            "maximum": 20,
            "type": "integer",
            "description": "How many HTTP requests run at once. Raise for speed, lower to be gentler on the site. Example: 6. Default: 6.",
            "default": 6
          },
          "maxRequestRetries": {
            "title": "Max request retries",
            "minimum": 0,
            "type": "integer",
            "description": "Per-request retry budget for transient 403/429/5xx and network errors, with exponential backoff. Example: 8. Default: 8.",
            "default": 8
          },
          "proxy": {
            "title": "Proxy configuration (optional)",
            "type": "object",
            "description": "Leave empty. FINN.no serves datacenter IPs without any bot challenge, so the actor runs direct by default and costs you no proxy traffic. Set this only if you specifically need requests to exit through your own proxy. Example: {\"useApifyProxy\": true}. Default: no proxy."
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}