{
  "openapi": "3.0.1",
  "info": {
    "title": "Etuovi Scraper — Finland Property Listings & Prices",
    "description": "Scrape Etuovi.com, Finland's largest property portal: homes, holiday homes, plots, farms and garages for sale by municipality or district. Price, debt-free price, m², rooms, floor, year built, coordinates, agency, photos; optional charges, housing company and description. No login.",
    "version": "0.1",
    "x-build-id": "FnO16th8qBXmm0f3F"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/yugenox~etuovi-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-yugenox-etuovi-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/yugenox~etuovi-scraper/runs": {
      "post": {
        "operationId": "runs-sync-yugenox-etuovi-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/yugenox~etuovi-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-yugenox-etuovi-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": {
          "locations": {
            "title": "📍 Locations",
            "type": "array",
            "description": "Municipalities, or a municipality and district separated by a comma, e.g. \"Helsinki\", \"Tampere\", \"Espoo, Tapiola\", \"Helsinki, Kallio\". Each location is searched separately. Leave empty (and pick a property type) to search all of Finland. A place Etuovi doesn't recognise is skipped, not charged.",
            "items": {
              "type": "string"
            }
          },
          "propertyType": {
            "title": "🏠 Property type",
            "enum": [
              "homes",
              "holiday",
              "plots",
              "farms",
              "garages"
            ],
            "type": "string",
            "description": "What kind of property to search for."
          },
          "maxItems": {
            "title": "Max listings",
            "minimum": 0,
            "maximum": 100000,
            "type": "integer",
            "description": "Maximum number of listings for the whole run, shared fairly between your searches. 0 = everything.",
            "default": 100
          },
          "includeDetails": {
            "title": "Include listing details",
            "type": "boolean",
            "description": "Also open every listing page for the debt-free and selling price, debt share, monthly charges, housing company, plot ownership, energy class, condition, heating, bedrooms, full description, all photos and the agency's contact details. Slower (one extra page per listing) and charged per listing.",
            "default": false
          },
          "startUrls": {
            "title": "🔗 Etuovi links",
            "type": "array",
            "description": "Optional: Etuovi search pages (e.g. https://www.etuovi.com/myytavat-asunnot/tampere/kaksio, ?sivu=N is kept) or listing pages (https://www.etuovi.com/kohde/80536234). /tulokset result links can't be used (Etuovi's robots.txt disallows them) — use the fields instead.",
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "buildingTypes": {
            "title": "Building types (homes)",
            "type": "array",
            "description": "Only these building types. Empty = all.",
            "items": {
              "type": "string",
              "enum": [
                "apartment-block",
                "row-house",
                "detached-house",
                "semi-detached-house",
                "separate-house",
                "balcony-access-block",
                "wooden-house-apartment"
              ],
              "enumTitles": [
                "Apartment block (kerrostalo)",
                "Row house (rivitalo)",
                "Detached house (omakotitalo)",
                "Semi-detached house (paritalo)",
                "Separate house (erillistalo)",
                "Balcony-access block (luhtitalo)",
                "Wooden house apartment (puutalo-osake)"
              ]
            }
          },
          "rooms": {
            "title": "Rooms (homes)",
            "type": "array",
            "description": "Only homes with these room counts. Empty = all.",
            "items": {
              "type": "string",
              "enum": [
                "1",
                "2",
                "3",
                "4",
                "5",
                "5+"
              ],
              "enumTitles": [
                "1 room (yksiö)",
                "2 rooms (kaksio)",
                "3 rooms",
                "4 rooms",
                "5 rooms",
                "More than 5"
              ]
            }
          },
          "subtypes": {
            "title": "Sub-type",
            "type": "array",
            "description": "Etuovi's own sub-pages, one search each (needs a location). Homes: uudiskohteet (new builds), omistusasunnot, osaomistusasunnot, asumisoikeusasunnot. Holiday homes: mokki-tai-huvila, lomahuoneisto, viikko-osake. Plots: omakotitontti, vapaa-ajan-tontti, muu. Farms: maatila, metsatila, peltotila, eramaa-alue, maaraala. Garages: autotalli, autohallipaikka, autokatos, autopaikka, venepaikka, varastotila, muut.",
            "items": {
              "type": "string"
            }
          },
          "priceMin": {
            "title": "Min price (€)",
            "minimum": 0,
            "type": "integer",
            "description": "Only listings at or above this asking price."
          },
          "priceMax": {
            "title": "Max price (€)",
            "minimum": 0,
            "type": "integer",
            "description": "Only listings at or below this asking price."
          },
          "areaMin": {
            "title": "Min area (m²)",
            "minimum": 0,
            "type": "integer",
            "description": "Living area (plot area for plots)."
          },
          "areaMax": {
            "title": "Max area (m²)",
            "minimum": 0,
            "type": "integer",
            "description": "Living area (plot area for plots)."
          },
          "yearBuiltMin": {
            "title": "Built in or after",
            "minimum": 1500,
            "maximum": 2100,
            "type": "integer",
            "description": "e.g. 2000"
          },
          "yearBuiltMax": {
            "title": "Built in or before",
            "minimum": 1500,
            "maximum": 2100,
            "type": "integer",
            "description": "e.g. 1990"
          },
          "newBuildingsOnly": {
            "title": "New buildings only",
            "type": "boolean",
            "description": "Only new-build homes (uudiskohteet).",
            "default": false
          },
          "sellerType": {
            "title": "Seller",
            "enum": [
              "all",
              "agency",
              "private"
            ],
            "type": "string",
            "description": "Agencies, private sellers or both. Private sellers' names and contact details are never collected.",
            "default": "all"
          },
          "publishedWithinDays": {
            "title": "Published within (days)",
            "minimum": 0,
            "maximum": 3650,
            "type": "integer",
            "description": "Only listings published in the last N days. Results are newest first, so the run stops as soon as it reaches older listings — ideal for daily monitoring. Empty = any time."
          },
          "maxPagesPerSearch": {
            "title": "Max result pages per search",
            "minimum": 0,
            "maximum": 5000,
            "type": "integer",
            "description": "Each result page holds 30 listings. With filters on, a search stops after this many pages (default 50 = 1,500 listings checked); without filters it reads as many as Max listings needs. 0 = default."
          },
          "proxyConfiguration": {
            "title": "Proxy",
            "type": "object",
            "description": "Apify Proxy (datacenter) is the default and comes with every Apify plan. If Etuovi refuses datacenter IPs for a while, the run switches to residential proxies when your account has them.",
            "default": {
              "useApifyProxy": true
            }
          }
        }
      },
      "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
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "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
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}