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.
Run this endpoint
Endpoint
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.
string
Optional
Location code from location-autocomplete, for example FI_UUSIMAA_HELSINKI. Needs location_type.
FI_UUSIMAA_HELSINKI
string
Optional
CITY, DISTRICT, SUBDISTRICT, MUNICIPALITY, POST_CODE or STREET. Needs location_code.
CITY
string
Optional
Parent region code from location-autocomplete, for example FI_UUSIMAA.
example
integer
Optional
Minimum monthly rent in euros.
10
integer
Optional
Maximum monthly rent in euros.
900
integer
Optional
Minimum living area in square metres.
10
integer
Optional
Maximum living area in square metres.
10
integer
Optional
Minimum year the building was finished.
10
integer
Optional
Maximum year the building was finished.
10
string
Optional
Room counts 1 to 5, or 6 for six and more. Comma-separated, for example 2,3.
2
string
Optional
apartment_house, row_house, semi_detached_house, detached_house, separate_house, balcony_access_block or wooden_house_apartment. Comma-separated.
example
string
Optional
all (default), private or agency.
example
string
Optional
any (default), 1d, 2d, 7d or 30d.
example
string
Optional
all (default), only or exclude.
example
string
Optional
kitchen, combined_with_living_room, kitchenette or kitchen_niche. Comma-separated.
example
string
Optional
good, satisfactory, tolerable or unclassified. Comma-separated.
example
string
Optional
non_subsidized, student_apartment, senior_house, cell_flat, need_based_apartment, assisted_living_residence, company_housing or subtenant. Comma-separated.
example
string
Optional
open_ended for permanent contracts.
example
boolean
Optional
true for homes free to move in now.
true
boolean
Optional
true for listings with images.
true
boolean
Optional
true for listings with a panorama.
true
boolean
Optional
true for listings with a video.
true
boolean
Optional
true for listings with a showing in the next 7 days.
true
string
Optional
Free text, for example sauna.
coffee shops
integer
Optional
Only listings of this agency.
1234567890
string
Optional
PUBLISHED_OR_UPDATED_AT (default), PUBLISHING_TIME, SEARCH_RENT, LIVING_AREA, CONSTRUCTION_FINISHED_YEAR, LOCATION, AVAILABILITY or NEXT_SHOWINGS.
relevance
string
Optional
desc (default) or asc. AVAILABILITY and NEXT_SHOWINGS support asc only.
example
integer
Optional
Listings per page: 25, 30 (default) or 100.
30
integer
Optional
Result page, 1-based.
1
Request Examples
<?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
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();
}
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));
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);
}
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
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()
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}")
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());
}
}
}
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))
}
#!/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"
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}");
}
}
}
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();
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
{
"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.
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
}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."
}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.