{
  "openapi": "3.0.1",
  "info": {
    "title": "Etuovi Scraper - Finland Property Listings & Prices",
    "description": "Scrape Etuovi.com listings across Finland: asking price, €/m², rooms, area, build year, photos, agency and agent contacts. Homes, new builds, holiday homes, plots and land.",
    "version": "1.0",
    "x-build-id": "AiLh5m7L61ZhIQz6K"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/sian.agency~etuovi-property-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-sian.agency-etuovi-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~etuovi-property-scraper/runs": {
      "post": {
        "operationId": "runs-sync-sian.agency-etuovi-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~etuovi-property-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-sian.agency-etuovi-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": "Pick one per run. Property Search walks Etuovi.com's own listing pages for any of Finland's 335 municipalities — homes for sale, new builds, holiday homes, plots or land — and returns 30 listings per page. Property Detail takes Etuovi listing links and returns the full description, both prices (asking and debt-free), €/m², full location hierarchy and the agent's direct contact details.",
            "default": "search"
          },
          "section": {
            "title": "🏘️ Section",
            "enum": [
              "asunnot",
              "loma-asunnot",
              "tontit",
              "maa-ja-metsatilat"
            ],
            "type": "string",
            "description": "Which of Etuovi.com's sale sections to read. Homes for sale is the default and the only section the Property types field narrows. New builds are a type of the homes section — pick 'uudiskohteet' under Property types rather than here. Holiday homes, plots and land each have their own section. Sale only: Etuovi.com carries no rentals (its rental search is Vuokraovi.com, a different portal).",
            "default": "asunnot"
          },
          "locations": {
            "title": "📍 Municipalities",
            "type": "array",
            "description": "Where to search, one municipality per line. All 335 Finnish municipalities Etuovi.com indexes resolve by name, with or without Finnish diacritics (Helsinki, Tampere, Äänekoski and aanekoski both work). Leave empty to read all of Finland. For a finer area than a municipality, or to control the search exactly, paste an Etuovi search address into Search URLs instead.",
            "default": [
              "Helsinki"
            ],
            "items": {
              "type": "string"
            }
          },
          "propertyTypes": {
            "title": "🏠 Property types",
            "uniqueItems": true,
            "type": "array",
            "description": "Which kinds of home to keep, homes section only. Leave empty to take every type. The values are Etuovi.com's own type pages, so the list is exactly what the site offers — studios, two-room homes, apartment blocks, detached, semi-detached and row houses, terrace-access blocks, wooden house shares, ownership types and new builds.",
            "items": {
              "type": "string",
              "enum": [
                "yksio",
                "kaksio",
                "kerrostalo",
                "omakotitalo",
                "erillistalo",
                "paritalo",
                "rivitalo",
                "luhtitalo",
                "puutalo-osake",
                "omistusasunnot",
                "osaomistusasunnot",
                "asumisoikeusasunnot",
                "uudiskohteet"
              ],
              "enumTitles": [
                "🛏️ Yksio — studios",
                "🏠 Kaksio — two-room homes",
                "🏢 Kerrostalo — apartment blocks",
                "🏡 Omakotitalo — detached houses",
                "🏠 Erillistalo — separate houses",
                "🏘️ Paritalo — semi-detached",
                "🏘️ Rivitalo — row houses",
                "🏗️ Luhtitalo — terrace-access blocks",
                "🌲 Puutalo-osake — wooden house shares",
                "🔑 Omistusasunnot — owner-occupied",
                "🤝 Osaomistusasunnot — partial ownership",
                "🗝️ Asumisoikeusasunnot — right of occupancy",
                "🏗️ Uudiskohteet — new builds"
              ]
            },
            "default": []
          },
          "maxResults": {
            "title": "🔢 Max results",
            "minimum": 1,
            "maximum": 100000,
            "type": "integer",
            "description": "Stop after this many results across the whole run, not per municipality. One page carries 30 results, so a run ends on the first page that crosses your limit. Etuovi.com has no result ceiling — a national homes search is 61,000+ listings over ~2,050 pages — so set a limit you actually need.",
            "default": 100
          },
          "includeDetails": {
            "title": "📑 Include full details",
            "type": "boolean",
            "description": "Also fetch each listing's detail page and merge in the full description, asking and debt-free prices, €/m², debt share, region-to-postcode hierarchy, residence details and the agent's direct contacts. Each enriched row costs one detail charge on top of the listing row, because it is one extra page fetched for you.",
            "default": false
          },
          "searchUrls": {
            "title": "🌐 Etuovi search URLs",
            "type": "array",
            "description": "Paste Etuovi search addresses instead of filling the form, e.g. https://www.etuovi.com/myytavat-asunnot/tampere or https://www.etuovi.com/myytavat-tontit/helsinki. The address is fetched exactly as etuovi.com serves it, so its section, municipality and type slugs apply. A page number in the address is ignored; the run starts at page one and pages forward on its own.",
            "default": [],
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "listingUrls": {
            "title": "🔗 Listing URLs (for Property Detail)",
            "type": "array",
            "description": "Etuovi listing addresses for the Property Detail operation, e.g. https://www.etuovi.com/kohde/2277218. One address per line, up to the run's limits. The detail page carries the full description, both prices, €/m², residence details and the agent's phone and office.",
            "default": [],
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}