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

Hybel Rental Search API Documentation

GET https://scrappa.co/api/hybel/search?place=Oslo&max_rent=12000&home_type=apartment&sort=rent

Scrappa's GET /api/hybel/search returns Hybel.no rental homes in one Norwegian place as structured JSON.

Rentals only

Hybel lists homes for rent. It has no sale listings, no bathroom count and no public landlord profile, so this API has none of them. Hybel ignores text search, so there is no keyword parameter.

What you get

One request returns one page of 12 homes and Hybel's own match count in total. Each home has id, url, title, type, home_type, rooms, area_m2, address, city, rent in NOK, thumbnail, badges, is_prioritized, has_video and latitude and longitude. Call the listing endpoint for deposit, included costs, facilities, the description and the whole photo gallery.

Filters are honoured

Hybel applies every filter itself, so total and the paging always describe the real result set. Unknown parameters and unknown list values are rejected with 422 instead of being ignored. applied_filters echoes what was sent. A page whose homes break a requested rent range or home type is never returned.

Place and districts

place takes a name from /api/hybel/location-autocomplete. A name Hybel does not know returns 422 (unknown_place) with suggestions. available_districts lists the district names of the place. Pass them in district, matched without regard to case. A district that does not exist returns 422 (invalid_filter) with the valid names, because Hybel would otherwise ignore it.

Pagination

Each page holds 12 homes. page is 1-based. A page past the last one returns an empty list labelled with that page and total null. It never returns another page's homes.

Coordinates

Coordinates come from Hybel's map data and are joined by listing id. If that data is not available, the homes are still returned with latitude and longitude set to null.

Sort

-updated_at (default), -created_at, rent, -rent, -space or available_from.

Hybel Rental Search API Documentation 1 credit/request

Endpoint

Request preview
GET
https://scrappa.co/api/hybel/search?place=Oslo&max_rent=12000&home_type=apartment&sort=rent
Auth header
x-api-key
Cost
1 credit/request
place = Oslo
Response preview
200 OK
{
    "success": true,
    "place": {
        "name": "Oslo",
        "slug": "Oslo"
    },
    "currency": "NOK",
    "total": 210,
    "returned": 1,
    "pagination": {
        "page": 1,
        "limit": 12,
        "total_pages": 18,
        "has_next": true,
...

Parameters

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

Runnable path

1 required parameter needed before sending a request.

17 optional filters available.

place string Required

Place name from location-autocomplete, for example Oslo or Bergen.

Example value Oslo
min_rent integer Optional

Minimum monthly rent in NOK as a whole number.

Example value 10
max_rent integer Optional

Maximum monthly rent in NOK as a whole number.

Example value 12000
home_type string Optional

One or more of house, apartment, studio, shared_room, room_in_apartment. Comma-separated.

Example value apartment
rooms string Optional

One or more room counts from 1 to 10, or other. Comma-separated.

Example value example
rent_period string Optional

long_term, short_term or both. Comma-separated.

Example value example
available_from string Optional

Earliest move-in date, YYYY-MM-DD.

Example value example
available_to string Optional

Latest move-in date, YYYY-MM-DD.

Example value example
district string Optional

One or more district names of the place, comma-separated. See available_districts.

Example value example
student_housing boolean Optional

true to show student housing only.

Example value true
balcony boolean Optional

true to show homes with a balcony only.

Example value true
pets_allowed boolean Optional

true to show homes that allow pets only.

Example value true
parking boolean Optional

true to show homes with parking only.

Example value true
elevator boolean Optional

true to show homes with an elevator only.

Example value true
internet_included boolean Optional

true to show homes with internet included in the rent only.

Example value true
furnished boolean Optional

true to show furnished homes only.

Example value true
sort string Optional

-updated_at (default), -created_at, rent, -rent, -space or available_from.

Example value rent
page integer Optional

Result page, 1-based. Each page holds 12 homes.

Example value 1

Request Examples

PHP
<?php

$curl = curl_init();

curl_setopt_array($curl, [
    CURLOPT_URL => "https://scrappa.co/api/hybel/search?place=Oslo&max_rent=12000&home_type=apartment&sort=rent",
    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/hybel/search?place=Oslo&max_rent=12000&home_type=apartment&sort=rent');

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/hybel/search?place=Oslo&max_rent=12000&home_type=apartment&sort=rent', 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/hybel/search?place=Oslo&max_rent=12000&home_type=apartment&sort=rent',
    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/hybel/search?place=Oslo&max_rent=12000&home_type=apartment&sort=rent")
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/hybel/search?place=Oslo&max_rent=12000&home_type=apartment&sort=rent", 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/hybel/search?place=Oslo&max_rent=12000&home_type=apartment&sort=rent', 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/hybel/search?place=Oslo&max_rent=12000&home_type=apartment&sort=rent")
        .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/hybel/search?place=Oslo&max_rent=12000&home_type=apartment&sort=rent", 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/hybel/search?place=Oslo&max_rent=12000&home_type=apartment&sort=rent"
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/hybel/search?place=Oslo&max_rent=12000&home_type=apartment&sort=rent"));
            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/hybel/search?place=Oslo&max_rent=12000&home_type=apartment&sort=rent',
            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/hybel/search?place=Oslo&max_rent=12000&home_type=apartment&sort=rent")
        .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 place currency total returned pagination applied_filters available_districts +2 more

Common listings fields

id url title type
JSON Response
200 OK
{
    "success": true,
    "place": {
        "name": "Oslo",
        "slug": "Oslo"
    },
    "currency": "NOK",
    "total": 210,
    "returned": 1,
    "pagination": {
        "page": 1,
        "limit": 12,
        "total_pages": 18,
        "has_next": true,
        "has_previous": false
    },
    "applied_filters": {
        "place": "Oslo",
        "sort": "rent",
        "max_rent": 12000,
        "home_type": [
            "apartment"
        ]
    },
    "available_districts": [
        "Alna",
        "Bjerke",
        "Frogner"
    ],
    "listings": [
        {
            "id": 382836,
            "url": "https://hybel.no/bolig/382836/leilighet-gabels-gate-1c-oslo/",
            "title": "Leilighet, 3 roms - 77m2",
            "type": "Leilighet",
            "home_type": "apartment",
            "rooms": 3,
            "area_m2": 77,
            "address": "Gabels Gate 1C, Oslo",
            "city": "Oslo",
            "rent": 11900,
            "currency": "NOK",
            "thumbnail": "https://cdn.example.com/ad_pictures/photo.900x600.jpg",
            "badges": [
                "Prioritert"
            ],
            "is_prioritized": true,
            "has_video": false,
            "latitude": 59.911279,
            "longitude": 10.708063
        }
    ],
    "meta": {
        "endpoint_family": "search",
        "billable": true,
        "attempts": 2
    }
}

Errors

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

422

Unknown Place

The `place` value matches no place on Hybel (`unknown_place`). Hybel would otherwise send you to its home page, so the request is rejected. Up to five suggestions are returned. Non-billable.

{
    "meta": {
        "attempts": 1,
        "billable": false,
        "retryable": false,
        "endpoint_family": "search"
    },
    "error": {
        "code": "unknown_place",
        "message": "Hybel does not know that place. Use a name from /api/hybel/location-autocomplete.",
        "suggestions": [
            "Bergen"
        ]
    },
    "success": false
}
422

Unknown District

A `district` is not one of the place's districts (`invalid_filter`). Hybel would ignore it and return the whole place, so the request is rejected and the valid names are returned in `available_districts`. Non-billable.

{
    "meta": {
        "attempts": 1,
        "billable": false,
        "retryable": false,
        "endpoint_family": "search"
    },
    "error": {
        "code": "invalid_filter",
        "message": "Unknown district for Oslo: Narnia. Use a name from available_districts.",
        "available_districts": [
            "Alna",
            "Bjerke",
            "Frogner"
        ]
    },
    "success": false
}
422

Validation Error

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

{
    "errors": {
        "sort": [
            "The selected sort is invalid."
        ]
    },
    "message": "The selected sort is invalid."
}
503

Upstream Unavailable

Hybel could not be reached, refused the request, answered with a page this API could not read, or its place list is not available (`upstream_unavailable`, `upstream_blocked`, `parser_drift`, `place_catalog_unavailable`). Retryable and never billed. Clients are never rate limited.

{
    "meta": {
        "attempts": 2,
        "billable": false,
        "retryable": true,
        "endpoint_family": "search"
    },
    "error": {
        "code": "upstream_unavailable",
        "message": "Hybel 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.