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.
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.
46 optional filters available.
integer
Optional
Property category: 1 flats, 2 houses, 3 land, 4 commercial, or 5 other.
1
integer
Optional
Transaction category: 1 sale, 2 rent, 3 auction, or 4 share deal.
1
integer
Optional
Property subcategory identifier, a positive integer.
10
integer
Optional
Country identifier; 112 is Czechia. Must be a positive integer.
112
integer
Optional
Region identifier; 10 is Praha. Must be a positive integer.
1234567890
string
Optional
Locality level: region, district, ward, municipality, or quarter. Supply together with entity_id.
example
integer
Optional
Positive locality identifier. Supply together with entity_type; Brno is 5740.
1234567890
integer
Optional
Minimum advertised price in CZK.
10
integer
Optional
Maximum advertised price in CZK; cannot be lower than price_min.
10
integer
Optional
Maximum age of the advertisement in days.
10
integer
Optional
Positive agency identifier to limit results to that agency.
1234567890
integer
Optional
Minimum estate area in square metres.
10
integer
Optional
Maximum estate area in square metres.
10
integer
Optional
Minimum usable area in square metres.
10
integer
Optional
Maximum usable area in square metres.
10
integer
Optional
Minimum floor number.
10
integer
Optional
Maximum floor number.
10
integer
Optional
Room-count identifier; zero is accepted for listings without a room count.
10
integer
Optional
Energy-efficiency rating identifier.
10
integer
Optional
Building type identifier from 1 to 7.
10
integer
Optional
Building condition identifier from 1 to 6.
10
integer
Optional
Ownership identifier from 1 to 3.
10
integer
Optional
Furnishing identifier from 1 to 3.
10
boolean
Optional
Filter for listings with a balcony.
true
boolean
Optional
Filter for listings with a terrace.
true
boolean
Optional
Filter for listings with parking spaces.
true
boolean
Optional
Filter for listings with an elevator.
true
boolean
Optional
Filter for listings with a loggia.
true
boolean
Optional
Filter for listings with a cellar.
true
boolean
Optional
Filter for listings with a garage.
true
boolean
Optional
Filter for listings with easy access.
true
boolean
Optional
Filter for listings with a garden.
true
string
Optional
Free-text search in the listing description; description_search is an equivalent alias.
coffee shops
string
Optional
Equivalent alias for query; searches listing descriptions.
example
string
Optional
Latest ready date in YYYY-MM-DD format.
example
boolean
Optional
Filter for listings with a video.
true
boolean
Optional
Filter for listings with a Matterport tour.
true
boolean
Optional
Filter for listings with a floor plan.
true
integer
Optional
Proximity category identifier from 1 to 13.
10
number
Optional
Southern latitude bound. Supply all four bounding-box coordinates together.
10
number
Optional
Northern latitude bound. Supply all four bounding-box coordinates together.
10
number
Optional
Western longitude bound. Supply all four bounding-box coordinates together.
10
number
Optional
Eastern longitude bound. Supply all four bounding-box coordinates together.
10
string
Optional
Sort by price_asc or price_desc; these are the only supported sort values.
price_asc
integer
Optional
Results per page, from 1 to 2000; defaults to 20.
20
integer
Optional
Number of results to skip. Keep offset + limit at or below 10000.
0
Request Examples
<?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
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();
}
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));
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);
}
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
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()
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}")
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());
}
}
}
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))
}
#!/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"
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}");
}
}
}
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();
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
{
"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.
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
}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.