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

Sreality Property Search API

GET https://scrappa.co/api/sreality/search?property_type=1&deal_type=1&country_id=112&sort=price_asc&limit=20&offset=0

Search Scrappa’s read-only Sreality listings API for Czech property ads.

Results and filters

The response includes listing records and pagination details. Search can be narrowed by property and deal type, verified locality identifiers, price and area ranges, rooms, floors, availability, building attributes, amenities, points of interest, free-text description, and a complete geographic bounding box. query and description_search are equivalent free-text inputs. Image URLs are returned as absolute HTTPS URLs.

Sorting and pagination

sort accepts only price_asc and price_desc. Use limit and offset; offset + limit must stay within the 10,000-result window. The default page size is 20. Price per square metre is returned when available, but it is not a server-side filter or sort.

Coverage

The endpoint returns public sale, rental, auction, and share-deal listings. Account features, contact-form actions, unsupported filters, and non-public inventory are not covered.

Sreality Property Search API 1 credit/request

Endpoint

Request preview
GET
https://scrappa.co/api/sreality/search?property_type=1&deal_type=1&country_id=112&sort=price_asc&limit=20&offset=0
Auth header
x-api-key
Cost
1 credit/request
Response preview
200 OK
{
    "success": true,
    "data": {
        "results": [
            {
                "hash_id": "4c8d2f6a2f1b4c619a5f",
                "advert_name": "Prodej bytu 2+kk, 58 m\u00b2, Praha 10 - Vr\u0161ovice",
                "price_czk": 6890000,
                "price_czk_m2": 118793,
                "usable_area": 58,
                "advert_images": [
                    "https://img1.sreality.cz/..."
                ],
                "locality": {
...

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.

46 optional filters available.

property_type integer Optional

Property category: 1 flats, 2 houses, 3 land, 4 commercial, or 5 other.

Example value 1
deal_type integer Optional

Transaction category: 1 sale, 2 rent, 3 auction, or 4 share deal.

Example value 1
category_sub integer Optional

Property subcategory identifier, a positive integer.

Example value 10
country_id integer Optional

Country identifier; 112 is Czechia. Must be a positive integer.

Example value 112
region_id integer Optional

Region identifier; 10 is Praha. Must be a positive integer.

Example value 1234567890
entity_type string Optional

Locality level: region, district, ward, municipality, or quarter. Supply together with entity_id.

Example value example
entity_id integer Optional

Positive locality identifier. Supply together with entity_type; Brno is 5740.

Example value 1234567890
price_min integer Optional

Minimum advertised price in CZK.

Example value 10
price_max integer Optional

Maximum advertised price in CZK; cannot be lower than price_min.

Example value 10
advert_age_days_max integer Optional

Maximum age of the advertisement in days.

Example value 10
agency_id integer Optional

Positive agency identifier to limit results to that agency.

Example value 1234567890
estate_area_min integer Optional

Minimum estate area in square metres.

Example value 10
estate_area_max integer Optional

Maximum estate area in square metres.

Example value 10
usable_area_min integer Optional

Minimum usable area in square metres.

Example value 10
usable_area_max integer Optional

Maximum usable area in square metres.

Example value 10
floor_min integer Optional

Minimum floor number.

Example value 10
floor_max integer Optional

Maximum floor number.

Example value 10
rooms integer Optional

Room-count identifier; zero is accepted for listings without a room count.

Example value 10
energy_rating integer Optional

Energy-efficiency rating identifier.

Example value 10
building_type integer Optional

Building type identifier from 1 to 7.

Example value 10
building_condition integer Optional

Building condition identifier from 1 to 6.

Example value 10
ownership integer Optional

Ownership identifier from 1 to 3.

Example value 10
furnished integer Optional

Furnishing identifier from 1 to 3.

Example value 10
balcony boolean Optional

Filter for listings with a balcony.

Example value true
terrace boolean Optional

Filter for listings with a terrace.

Example value true
parking_lots boolean Optional

Filter for listings with parking spaces.

Example value true
elevator boolean Optional

Filter for listings with an elevator.

Example value true
loggia boolean Optional

Filter for listings with a loggia.

Example value true
cellar boolean Optional

Filter for listings with a cellar.

Example value true
garage boolean Optional

Filter for listings with a garage.

Example value true
easy_access boolean Optional

Filter for listings with easy access.

Example value true
garden boolean Optional

Filter for listings with a garden.

Example value true
query string Optional

Free-text search in the listing description; description_search is an equivalent alias.

Example value coffee shops
available_to string Optional

Latest ready date in YYYY-MM-DD format.

Example value example
has_video boolean Optional

Filter for listings with a video.

Example value true
has_matterport boolean Optional

Filter for listings with a Matterport tour.

Example value true
has_floor_plan boolean Optional

Filter for listings with a floor plan.

Example value true
pois integer Optional

Proximity category identifier from 1 to 13.

Example value 10
lat_min number Optional

Southern latitude bound. Supply all four bounding-box coordinates together.

Example value 10
lat_max number Optional

Northern latitude bound. Supply all four bounding-box coordinates together.

Example value 10
lon_min number Optional

Western longitude bound. Supply all four bounding-box coordinates together.

Example value 10
lon_max number Optional

Eastern longitude bound. Supply all four bounding-box coordinates together.

Example value 10
sort string Optional

Sort by price_asc or price_desc; these are the only supported sort values.

Example value price_asc
limit integer Optional

Results per page, from 1 to 2000; defaults to 20.

Example value 20
offset integer Optional

Number of results to skip. Keep offset + limit at or below 10000.

Example value 0

Request Examples

PHP
<?php

$curl = curl_init();

curl_setopt_array($curl, [
    CURLOPT_URL => "https://scrappa.co/api/sreality/search?property_type=1&deal_type=1&country_id=112&sort=price_asc&limit=20&offset=0",
    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/sreality/search?property_type=1&deal_type=1&country_id=112&sort=price_asc&limit=20&offset=0');

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/sreality/search?property_type=1&deal_type=1&country_id=112&sort=price_asc&limit=20&offset=0', 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/sreality/search?property_type=1&deal_type=1&country_id=112&sort=price_asc&limit=20&offset=0',
    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/sreality/search?property_type=1&deal_type=1&country_id=112&sort=price_asc&limit=20&offset=0")
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/sreality/search?property_type=1&deal_type=1&country_id=112&sort=price_asc&limit=20&offset=0", 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/sreality/search?property_type=1&deal_type=1&country_id=112&sort=price_asc&limit=20&offset=0', 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/sreality/search?property_type=1&deal_type=1&country_id=112&sort=price_asc&limit=20&offset=0")
        .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/sreality/search?property_type=1&deal_type=1&country_id=112&sort=price_asc&limit=20&offset=0", 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/sreality/search?property_type=1&deal_type=1&country_id=112&sort=price_asc&limit=20&offset=0"
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/sreality/search?property_type=1&deal_type=1&country_id=112&sort=price_asc&limit=20&offset=0"));
            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/sreality/search?property_type=1&deal_type=1&country_id=112&sort=price_asc&limit=20&offset=0',
            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/sreality/search?property_type=1&deal_type=1&country_id=112&sort=price_asc&limit=20&offset=0")
        .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 data meta
JSON Response
200 OK
{
    "success": true,
    "data": {
        "results": [
            {
                "hash_id": "4c8d2f6a2f1b4c619a5f",
                "advert_name": "Prodej bytu 2+kk, 58 m\u00b2, Praha 10 - Vr\u0161ovice",
                "price_czk": 6890000,
                "price_czk_m2": 118793,
                "usable_area": 58,
                "advert_images": [
                    "https://img1.sreality.cz/..."
                ],
                "locality": {
                    "city": "Praha",
                    "district": "Praha 10",
                    "region": "Praha",
                    "gps_lat": 50.0714,
                    "gps_lon": 14.4657,
                    "zip": "101 00"
                }
            }
        ],
        "pagination": {
            "limit": 20,
            "offset": 0,
            "total": 22642
        }
    },
    "meta": {
        "endpoint_family": "search",
        "billable": true,
        "retryable": false
    }
}

Errors

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

422

Validation Error

A parameter or filter combination is invalid. The response is not billable.

{
    "meta": {
        "billable": false,
        "retryable": false,
        "endpoint_family": "search"
    },
    "error": {
        "code": "validation_failed",
        "message": "The requested search filters are invalid."
    },
    "success": false
}
503

Search Temporarily Unavailable

Search data could not be returned. The response is not billable.

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

Sreality API FAQ

Which sort values are supported?

Only price_asc and price_desc are supported.

Can I filter by price per square metre?

No. Price per square metre may appear in listing data, but it is not a supported search filter or sort.

Are failed searches billed?

No. Validation errors and temporary failures are non-billable; a successful empty result is a valid answer.

Try It Live

Test this endpoint in our interactive playground with real data.