{
  "openapi": "3.0.1",
  "info": {
    "title": "FINN.no Real Estate Scraper & New-Listing Monitor - Norway",
    "description": "Turn monitoring on and every later run returns only the listings it has not returned before, so you are never charged for the same property twice. Every FINN.no listing as clean JSON: asking price, total price, monthly shared costs, area, bedrooms, ownership type, agency. Unofficial.",
    "version": "0.1",
    "x-build-id": "6A6VDa9LF3o8eDbgt"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/neverempty~finn-real-estate/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-neverempty-finn-real-estate",
        "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/neverempty~finn-real-estate/runs": {
      "post": {
        "operationId": "runs-sync-neverempty-finn-real-estate",
        "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/neverempty~finn-real-estate/run-sync": {
      "post": {
        "operationId": "run-sync-neverempty-finn-real-estate",
        "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": {
          "searchUrl": {
            "title": "FINN search URL (optional)",
            "type": "string",
            "description": "Paste a FINN property search page, for example https://www.finn.no/realestate/homes/search.html?location=0.20061 or https://www.finn.no/realestate/lettings/search.html?location=1.20061.20528, and the two fields below are ignored. Only the location parameter is kept; every other filter runs here on the rows already fetched."
          },
          "channel": {
            "title": "For sale or to rent",
            "enum": [
              "sale",
              "rent"
            ],
            "type": "string",
            "description": "sale = homes (bolig til salgs), rent = lettings (bolig til leie).",
            "default": "sale"
          },
          "location": {
            "title": "Location",
            "type": "string",
            "description": "A county name as FINN lists it (oslo, akershus, vestland, rogaland, trondelag, innlandet, agder, buskerud, vestfold, ostfold, telemark, nordland, troms, finnmark, more-og-romsdal, svalbard), or a FINN location code copied from a FINN address (0.20061 is Oslo, 1.20061.20528 is the Bjerke district). Leave empty for the whole of Norway. Any other word is refused before a request is made.",
            "default": "oslo"
          },
          "maxListings": {
            "title": "Maximum listings",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "How many listings to return. You are charged for the rows you actually receive. FINN serves at most 50 pages (up to 2,500 listings; pages may overlap and repeats are dropped) per search; narrow the location to see more.",
            "default": 20
          },
          "maxPages": {
            "title": "Maximum listing pages to open",
            "minimum": 0,
            "maximum": 50,
            "type": "integer",
            "description": "A hard stop on how many pages are requested, whatever the filters do. 0 lets the run work it out. FINN has 50 pages at most.",
            "default": 0
          },
          "useProxy": {
            "title": "Use an Apify proxy",
            "type": "boolean",
            "description": "Off by default because FINN answers Apify's own network directly. If FINN ever starts blocking, the run switches to a proxy on its own.",
            "default": false
          },
          "keywords": {
            "title": "Keywords",
            "type": "array",
            "description": "Keep only listings whose heading, type, ownership, address, area name or agency contain these words. No extra requests are made.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "keywordMatch": {
            "title": "Keyword match",
            "enum": [
              "any",
              "all"
            ],
            "type": "string",
            "description": "any: at least one keyword. all: every keyword.",
            "default": "any"
          },
          "excludeKeywords": {
            "title": "Exclude keywords",
            "type": "array",
            "description": "Drop listings containing any of these words.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "agencyNames": {
            "title": "Agencies",
            "type": "array",
            "description": "Keep only listings marketed by these agencies. Partial names work.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "minPrice": {
            "title": "Minimum price (NOK)",
            "minimum": 0,
            "type": "integer",
            "description": "For sale this is the asking price (prisantydning); to rent it is the monthly rent, the way FINN publishes them. 0 means no minimum.",
            "default": 0
          },
          "maxPrice": {
            "title": "Maximum price (NOK)",
            "minimum": 0,
            "type": "integer",
            "description": "0 means no maximum. A listing with no published price is kept.",
            "default": 0
          },
          "maxTotalPrice": {
            "title": "Maximum total price (NOK, sale only)",
            "minimum": 0,
            "type": "integer",
            "description": "FINN's totalpris = asking price plus purchase costs (the 2.5% document tax and fees) and, for a cooperative share, the buyer's share of the cooperative's debt. 0 = off. A listing without a total price is kept.",
            "default": 0
          },
          "maxSharedCost": {
            "title": "Maximum monthly shared costs (NOK)",
            "minimum": 0,
            "type": "integer",
            "description": "FINN's felleskostnader per month. 0 means no maximum.",
            "default": 0
          },
          "requirePrice": {
            "title": "Only listings with a published price",
            "type": "boolean",
            "description": "Off by default: a listing without a price is not treated as a cheap one, it is simply kept.",
            "default": false
          },
          "minBedrooms": {
            "title": "Minimum bedrooms",
            "minimum": -1,
            "maximum": 30,
            "type": "integer",
            "description": "-1 turns the filter off. FINN counts a studio as 0 bedrooms. A listing without a count is kept.",
            "default": -1
          },
          "maxBedrooms": {
            "title": "Maximum bedrooms",
            "minimum": -1,
            "maximum": 30,
            "type": "integer",
            "description": "-1 turns the filter off.",
            "default": -1
          },
          "minAreaSqm": {
            "title": "Minimum area (m²)",
            "minimum": 0,
            "type": "integer",
            "description": "FINN's internal area. A listing that publishes a range is kept if the top of the range fits. 0 means no minimum.",
            "default": 0
          },
          "maxAreaSqm": {
            "title": "Maximum area (m²)",
            "minimum": 0,
            "type": "integer",
            "description": "0 means no maximum.",
            "default": 0
          },
          "propertyTypes": {
            "title": "Property types",
            "type": "array",
            "description": "FINN's Norwegian words, partial match: Leilighet (flat), Enebolig (detached house), Rekkehus (terraced), Tomannsbolig (semi-detached), Gårdsbruk, Garasje …",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "ownershipTypes": {
            "title": "Ownership type (sale only)",
            "type": "array",
            "description": "FINN's words, partial match: Selveier (freehold), Andel (housing cooperative share), Aksje (housing stock company). A listing without one is kept.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "advertiserType": {
            "title": "Advertiser",
            "enum": [
              "any",
              "agency",
              "private"
            ],
            "type": "string",
            "description": "Agency listings, or listings from private sellers and landlords. Private advertisers are never named.",
            "default": "any"
          },
          "excludeComingForSale": {
            "title": "Exclude 'coming for sale'",
            "type": "boolean",
            "description": "Drop listings FINN flags as coming for sale (not yet on the market).",
            "default": false
          },
          "excludePromoted": {
            "title": "Exclude promoted placements",
            "type": "boolean",
            "description": "Drop listings FINN flags as paid highlight placements. Note that most agency listings carry such a flag (102 of the 150 measured).",
            "default": false
          },
          "publishedWithinDays": {
            "title": "Published within the last N days",
            "minimum": 0,
            "maximum": 3650,
            "type": "integer",
            "description": "By FINN's publish timestamp. 0 means no date filter. A listing whose date cannot be read is kept.",
            "default": 0
          },
          "monitoringMode": {
            "title": "Only return listings that are new since the last run",
            "type": "boolean",
            "description": "Turn this on and schedule the Actor: each run returns only the listings it has never returned before, reading past the ones it already knows (up to FINN's 50 pages, or maxPages) until it has maxListings new ones. Listings removed by your filters are remembered too. Listings that did not fit under the limit are not remembered, so they are still waiting for you on the next run.",
            "default": false
          },
          "resetMonitoringState": {
            "title": "Forget what was already returned",
            "type": "boolean",
            "description": "Clears the memory for this search, so the next monitoring run starts from scratch. Works with or without monitoring mode on.",
            "default": false
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}