Skip to content
Scrappa Get API key
Vuokraovi API 1 credit/request

Vuokraovi Rental Search API Documentation

GET https://scrappa.co/api/vuokraovi/search?location_code=FI_UUSIMAA_HELSINKI&location_type=CITY&max_rent=900&rooms=2&limit=30

Scrappa's GET /api/vuokraovi/search returns Vuokraovi rental homes in Finland as structured JSON, with location, rent, size, rooms, type filters, sort and paging.

Rentals only

Vuokraovi lists homes for rent. It has no sale listings and no bathrooms field, so this API has no sale or bathrooms parameter. Finnish sale listings are on the Etuovi and Oikotie APIs.

What you get

One request returns one page of listings, Vuokraovi's own match count in total, the real page and limit, and has_more. Each listing has id, friendly_id, url, address, district_city, latitude, longitude, year_built, published_at, next_showings, image_url, office, room_structure, rooms, floor, area, total_area, rent, availability, property_subtype and private_lessor_name. A field Vuokraovi does not state is left out. A rent or area of zero means "not stated" and is left out. Call the listing endpoint for the description, deposit, charges, images and agent.

Filters are honoured

Vuokraovi applies every filter itself, so total and the paging describe the real result set. Unknown parameters and unknown values return 422 instead of being ignored. applied_filters echoes what was sent.

Location

Take location_code, location_type and parent_region_code from search_params of /api/vuokraovi/location-autocomplete. Without a location the search covers all of Finland. A code that matches no place returns an empty list with total 0.

Sorting

sort is one of PUBLISHED_OR_UPDATED_AT (default), PUBLISHING_TIME, SEARCH_RENT, LIVING_AREA, CONSTRUCTION_FINISHED_YEAR, LOCATION (asc or desc), AVAILABILITY or NEXT_SHOWINGS (asc only). SEARCH_RENT and LIVING_AREA ascending start with listings that state no rent or area. This is Vuokraovi's own order and is not changed.

Pagination

page is 1-based and limit is 25, 30 (default) or 100. A page past the last one returns an empty list with the real total. It never returns another page's listings.

Agency listings

Set office_id to list the homes of one agency. Take the id from a listing or from the agency endpoint.

Vuokraovi Rental Search API Documentation 1 credit/request

Endpoint

Request preview
GET
https://scrappa.co/api/vuokraovi/search?location_code=FI_UUSIMAA_HELSINKI&location_type=CITY&max_rent=900&rooms=2&limit=30
Auth header
x-api-key
Cost
1 credit/request
Response preview
200 OK
{
    "success": true,
    "total": 1596,
    "returned": 1,
    "page": 1,
    "limit": 30,
    "has_more": true,
    "applied_filters": {
        "location_code": "FI_UUSIMAA_HELSINKI",
        "location_type": "CITY",
        "max_rent": 900,
        "rooms": [
            "2"
        ],
...

Parameters

Start with the required fields, then add optional filters only when your use case needs them.

Runnable path

This endpoint has no required query parameters.

29 optional filters available.

location_code string Optional

Location code from location-autocomplete, for example FI_UUSIMAA_HELSINKI. Needs location_type.

Example value FI_UUSIMAA_HELSINKI
location_type string Optional

CITY, DISTRICT, SUBDISTRICT, MUNICIPALITY, POST_CODE or STREET. Needs location_code.

Example value CITY
parent_region_code string Optional

Parent region code from location-autocomplete, for example FI_UUSIMAA.

Example value example
min_rent integer Optional

Minimum monthly rent in euros.

Example value 10
max_rent integer Optional

Maximum monthly rent in euros.

Example value 900
min_size integer Optional

Minimum living area in square metres.

Example value 10
max_size integer Optional

Maximum living area in square metres.

Example value 10
min_year integer Optional

Minimum year the building was finished.

Example value 10
max_year integer Optional

Maximum year the building was finished.

Example value 10
rooms string Optional

Room counts 1 to 5, or 6 for six and more. Comma-separated, for example 2,3.

Example value 2
property_type string Optional

apartment_house, row_house, semi_detached_house, detached_house, separate_house, balcony_access_block or wooden_house_apartment. Comma-separated.

Example value example
lessor_type string Optional

all (default), private or agency.

Example value example
published_within string Optional

any (default), 1d, 2d, 7d or 30d.

Example value example
new_building string Optional

all (default), only or exclude.

Example value example
kitchen_type string Optional

kitchen, combined_with_living_room, kitchenette or kitchen_niche. Comma-separated.

Example value example
condition string Optional

good, satisfactory, tolerable or unclassified. Comma-separated.

Example value example
living_form string Optional

non_subsidized, student_apartment, senior_house, cell_flat, need_based_apartment, assisted_living_residence, company_housing or subtenant. Comma-separated.

Example value example
rental_agreement string Optional

open_ended for permanent contracts.

Example value example
available_immediately boolean Optional

true for homes free to move in now.

Example value true
has_images boolean Optional

true for listings with images.

Example value true
has_panorama boolean Optional

true for listings with a panorama.

Example value true
has_video boolean Optional

true for listings with a video.

Example value true
has_showing_within_7_days boolean Optional

true for listings with a showing in the next 7 days.

Example value true
query string Optional

Free text, for example sauna.

Example value coffee shops
office_id integer Optional

Only listings of this agency.

Example value 1234567890
sort string Optional

PUBLISHED_OR_UPDATED_AT (default), PUBLISHING_TIME, SEARCH_RENT, LIVING_AREA, CONSTRUCTION_FINISHED_YEAR, LOCATION, AVAILABILITY or NEXT_SHOWINGS.

Example value relevance
direction string Optional

desc (default) or asc. AVAILABILITY and NEXT_SHOWINGS support asc only.

Example value example
limit integer Optional

Listings per page: 25, 30 (default) or 100.

Example value 30
page integer Optional

Result page, 1-based.

Example value 1

Request Examples

PHP
<?php

$curl = curl_init();

curl_setopt_array($curl, [
    CURLOPT_URL => "https://scrappa.co/api/vuokraovi/search?location_code=FI_UUSIMAA_HELSINKI&location_type=CITY&max_rent=900&rooms=2&limit=30",
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_ENCODING => "",
    CURLOPT_MAXREDIRS => 10,
    CURLOPT_TIMEOUT => 30,
    CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
    CURLOPT_CUSTOMREQUEST => "GET",
    CURLOPT_HTTPHEADER => [
        "x-api-key: YOUR_API_KEY_HERE"
    ],
]);

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
    echo "cURL Error #:" . $err;
} else {
    echo $response;
}
PHP
<?php

use Illuminate\Support\Facades\Http;

$response = Http::timeout(30)
    ->withHeaders(['x-api-key' => 'YOUR_API_KEY_HERE'])
    ->get('https://scrappa.co/api/vuokraovi/search?location_code=FI_UUSIMAA_HELSINKI&location_type=CITY&max_rent=900&rooms=2&limit=30');

if ($response->successful()) {
    echo $response->body();
} else {
    echo "Error: " . $response->status();
}
JavaScript
const options = {
    method: 'GET',
    headers: {
        'x-api-key': 'YOUR_API_KEY_HERE'
    }
};

fetch('https://scrappa.co/api/vuokraovi/search?location_code=FI_UUSIMAA_HELSINKI&location_type=CITY&max_rent=900&rooms=2&limit=30', options)
    .then(response => {
        if (!response.ok) {
            throw new Error(`HTTP error! status: ${response.status}`);
        }
        return response.text();
    })
    .then(data => console.log(data))
    .catch(error => console.error('Error:', error));
JavaScript
const axios = require('axios');

const options = {
    method: 'GET',
    url: 'https://scrappa.co/api/vuokraovi/search?location_code=FI_UUSIMAA_HELSINKI&location_type=CITY&max_rent=900&rooms=2&limit=30',
    headers: {
        x-api-key: 'YOUR_API_KEY_HERE',
    }
};

try {
    const response = await axios(options);
    console.log(response.data);
} catch (error) {
    console.error('Error:', error.message);
}
Ruby
require 'net/http'
require 'uri'

uri = URI.parse("https://scrappa.co/api/vuokraovi/search?location_code=FI_UUSIMAA_HELSINKI&location_type=CITY&max_rent=900&rooms=2&limit=30")
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = uri.scheme == 'https'

request = Net::HTTP::Get.new(uri.request_uri)
request['x-api-key'] = 'YOUR_API_KEY_HERE'

begin
    response = http.request(request)
    puts response.body
rescue => e
    puts "Error: #{e.message}"
end
Python
import http.client
import json

conn = http.client.HTTPSConnection("scrappa.co")

headers = {
    'x-api-key': 'YOUR_API_KEY_HERE',
}

try:
    conn.request("GET", "/api/vuokraovi/search?location_code=FI_UUSIMAA_HELSINKI&location_type=CITY&max_rent=900&rooms=2&limit=30", headers=headers)
    res = conn.getresponse()
    data = res.read()
    print(data.decode("utf-8"))
except Exception as e:
    print(f"Error: {e}")
finally:
    conn.close()
Python
import requests

headers = {
    'x-api-key': 'YOUR_API_KEY_HERE',
}

try:
    response = requests.get('https://scrappa.co/api/vuokraovi/search?location_code=FI_UUSIMAA_HELSINKI&location_type=CITY&max_rent=900&rooms=2&limit=30', headers=headers)
    response.raise_for_status()
    print(response.text)
except requests.exceptions.RequestException as e:
    print(f"Error: {e}")
Java
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import java.io.IOException;

public class ApiExample {
    public static void main(String[] args) {
        OkHttpClient client = new OkHttpClient();

        Request request = new Request.Builder()
            .url("https://scrappa.co/api/vuokraovi/search?location_code=FI_UUSIMAA_HELSINKI&location_type=CITY&max_rent=900&rooms=2&limit=30")
        .addHeader("x-api-key", "YOUR_API_KEY_HERE")
            .build();

        try (Response response = client.newCall(request).execute()) {
            if (response.isSuccessful()) {
                System.out.println(response.body().string());
            } else {
                System.out.println("Error: " + response.code());
            }
        } catch (IOException e) {
            System.out.println("Error: " + e.getMessage());
        }
    }
}
Go
package main

import (
    "fmt"
    "net/http"
    "io/ioutil"
)

func main() {
    client := &http.Client{}
    req, err := http.NewRequest("GET", "https://scrappa.co/api/vuokraovi/search?location_code=FI_UUSIMAA_HELSINKI&location_type=CITY&max_rent=900&rooms=2&limit=30", nil)
    if err != nil {
        fmt.Println("Error creating request:", err)
        return
    }
    req.Header.Set("x-api-key", "YOUR_API_KEY_HERE")

    resp, err := client.Do(req)
    if err != nil {
        fmt.Println("Error making request:", err)
        return
    }
    defer resp.Body.Close()

    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        fmt.Println("Error reading response:", err)
        return
    }

    fmt.Println(string(body))
}
Terminal
#!/bin/bash

curl -X GET \
    -H "x-api-key: YOUR_API_KEY_HERE" \
    "https://scrappa.co/api/vuokraovi/search?location_code=FI_UUSIMAA_HELSINKI&location_type=CITY&max_rent=900&rooms=2&limit=30"
C#
using System;
using System.Net.Http;
using System.Threading.Tasks;

class Program
{
    static async Task Main()
    {
        using var client = new HttpClient();
        client.DefaultRequestHeaders.Add("x-api-key", "YOUR_API_KEY_HERE");

        try
        {
            var response = await client.SendAsync(new HttpRequestMessage(HttpMethod.Get, "https://scrappa.co/api/vuokraovi/search?location_code=FI_UUSIMAA_HELSINKI&location_type=CITY&max_rent=900&rooms=2&limit=30"));
            var content = await response.Content.ReadAsStringAsync();
            Console.WriteLine(content);
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Error: {ex.Message}");
        }
    }
}
TypeScript
import axios from 'axios';

async function run(): Promise<void> {
    try {
        const response = await axios({
            method: 'GET',
            url: 'https://scrappa.co/api/vuokraovi/search?location_code=FI_UUSIMAA_HELSINKI&location_type=CITY&max_rent=900&rooms=2&limit=30',
            headers: {
        'x-api-key': 'YOUR_API_KEY_HERE',
            },
        });

        console.log(response.data);
    } catch (error) {
        console.error('Error:', error);
    }
}

void run();
RUST
use reqwest::Client;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let client = Client::new();

    let response = client
        .get("https://scrappa.co/api/vuokraovi/search?location_code=FI_UUSIMAA_HELSINKI&location_type=CITY&max_rent=900&rooms=2&limit=30")
        .header("x-api-key", "YOUR_API_KEY_HERE")
        .send()
        .await?;

    println!("{}", response.text().await?);

    Ok(())
}

Response Schema

Example response fields are illustrative; inspect the JSON before integrating.

Example response fields

Scan these fields before integrating.

success total returned page limit has_more applied_filters listings +1 more

Common listings fields

id friendly_id url address
JSON Response
200 OK
{
    "success": true,
    "total": 1596,
    "returned": 1,
    "page": 1,
    "limit": 30,
    "has_more": true,
    "applied_filters": {
        "location_code": "FI_UUSIMAA_HELSINKI",
        "location_type": "CITY",
        "max_rent": 900,
        "rooms": [
            "2"
        ],
        "sort": "PUBLISHED_OR_UPDATED_AT",
        "direction": "desc"
    },
    "listings": [
        {
            "id": 2751570,
            "friendly_id": "hh4763",
            "url": "https://www.vuokraovi.com/kohde/hh4763",
            "address": "Runeberginkatu 69 G",
            "district_city": "T\u00f6\u00f6l\u00f6 Helsinki",
            "latitude": 60.18124,
            "longitude": 24.92659,
            "year_built": 1912,
            "published_at": "2026-10-25T20:39:05.293Z",
            "published_or_updated_at": "2026-10-25T20:39:05.293Z",
            "image_url": "https://d3ls91xgksobn.cloudfront.net/1280x854,fit,q80,f=webp/etuovimedia/images/rental/import/570/2751570/0e76b9541118d347871c0e0e51d244c4/2c6153de77b1ae8981ee96a6e1781baa/ORIGINAL.jpeg",
            "office": {
                "id": 257,
                "name": "Ylinkerros Oy",
                "office_number": 10804
            },
            "is_company_announcement": false,
            "new_building": false,
            "property_subtype": "APARTMENT_HOUSE",
            "right_of_occupancy": false,
            "room_structure": "3h, k, kph, wc, parveke",
            "room_count": "THREE_ROOMS",
            "rooms": 3,
            "floor": 5,
            "floor_count": 5,
            "area": 71.2,
            "total_area": 71.2,
            "rent": 1950,
            "currency": "EUR",
            "availability": {
                "type": "VACANCY",
                "date": "2026-12-01"
            }
        }
    ],
    "meta": {
        "endpoint_family": "search",
        "billable": true,
        "attempts": 1
    }
}

Errors

Handle these documented responses before retrying or showing customer-facing failures.

422

Filters Rejected

Vuokraovi refused the filter combination (`upstream_rejected`). Non-billable.

{
    "meta": {
        "attempts": 1,
        "billable": false,
        "retryable": false,
        "endpoint_family": "search"
    },
    "error": {
        "code": "upstream_rejected",
        "message": "Vuokraovi could not accept the requested filters."
    },
    "success": false
}
422

Validation Error

A query parameter is missing, unknown or unusable. Unknown parameters and unknown values are rejected, never ignored. Non-billable.

{
    "errors": {
        "lessor_type": [
            "The selected lessor type is invalid."
        ]
    },
    "message": "The selected lessor type is invalid."
}
503

Upstream Unavailable

Vuokraovi could not be reached after retries, answered with an error or changed its format (`upstream_unavailable`, `upstream_blocked`, `parser_drift`). Retryable and never billed. Clients are never rate limited.

{
    "meta": {
        "attempts": 3,
        "billable": false,
        "retryable": true,
        "endpoint_family": "search"
    },
    "error": {
        "code": "upstream_unavailable",
        "message": "Vuokraovi is temporarily unavailable. Please retry."
    },
    "success": false
}

Generate Code with AI

Copy a ready-made prompt with all the endpoint details, parameters, and example responses. Paste it into ChatGPT, Claude, or any AI assistant to instantly generate working code.

Try It Live

Test this endpoint in our interactive playground with real data.