Search 4zida listings for sale or rent in Serbia: apartments, houses, offices and shops, lots and garages. Filter by place, price, area, rooms, floor, state, furnishing, heating, advertiser and features, sort and page through the results. Each item carries the price in euro, area, rooms, floor, state, address, place ids and names, photos, dates, the advertiser and the agency link. A page holds 20 listings, total_pages is computed from total, and the page you ask for is the page you get. Every returned item satisfies the filters you set. A page past the last page returns an empty list. Use /autocomplete first to find place ids: an unknown place id silently returns other places. There is no bathroom filter because 4zida has none. Bathrooms are in /listing. An unknown value for a filter is a 422 error.
Run this endpoint
Endpoint
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.
21 optional filters available.
string
Required
sale or rent.
rent
string
Optional
apartments (default), houses, offices, lots or vehicle_spots.
apartments
array
Optional
Place ids from /autocomplete or /place-children, repeatable up to 10 times. Example: 2 for Beograd. Without a place the search covers all of Serbia.
["example"]
integer
Optional
Lowest price in euro. For rent this is the price for one payment term, usually one month (see payment_terms).
10
integer
Optional
Highest price in euro. For rent this is the price for one payment term.
600
integer
Optional
Smallest area in square metres. For lots the unit is ares.
10
integer
Optional
Largest area in square metres. For lots the unit is ares.
10
integer
Optional
Lowest price per square metre in euro.
10
integer
Optional
Highest price per square metre in euro.
10
array
Optional
Room structure, repeatable. Apartments: studio, one_room, one_and_half_room, two_room, two_and_half_room, three_room, three_and_half_room, four_room, four_and_half_plus. Houses: one_floor to six_floors. Offices: shop, office, practice, studio, warehouse, hall, catering, kiosk, plant, sports, yard, tourist, building. Lots: building_land, farmland, industrial_land. Vehicle spots: garage, parking.
["example"]
array
Optional
Sub type, repeatable. Apartments: flat, house_flat, studio, salon, penthaus, garden_apartment, duplex. Houses: vacation-house, montage-house, row-house, detached-house, semi-detached-house, village-house, homestead, household.
["example"]
array
Optional
original, new, in_progress, repaired or needs_repair. Repeatable.
["example"]
array
Optional
yes, no or semi. Repeatable.
["example"]
array
Optional
central, district, electricity, gas, heatPump, underfloor, airConditioning, solid, tileStove, storageHeater, marbleRadiator, norwegianRadiators, allocators or none. Repeatable.
["example"]
array
Optional
Rent only: day, month, 3 months, 6 months or year. Repeatable.
["example"]
array
Optional
agency, firm, investor or owner. Repeatable.
["example"]
string
Optional
Land registry status: yes, partially, in_progress or no.
example
integer
Optional
Lowest floor. 0 is the ground floor.
10
integer
Optional
Highest floor.
10
boolean
Optional
Feature flags, each true or left out: elevator, terrace, yard, garage, parking_space, attic, basement, air_conditioning, pets_allowed, smoking_allowed, inhabitable_now, cctv, alarm_secured, asphalt_access, sewerage, power_line, phone_line, wheelchair_access, virtual_sightseeing, video_or_3d_tour, urgent, with_images, new_build. 4zida cannot filter for the absence of a feature, so false is a 422. Some flags exist only for some types: an unsupported flag is a 422.
true
string
Optional
newest, price_asc, price_desc, area_asc or area_desc. Without it the site default order applies.
price_asc
integer
Optional
One-based page number. Defaults to 1.
1
Request Examples
<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://scrappa.co/api/4zida/v1/search?for=rent&type=apartments&place_ids%5B0%5D=2&rooms%5B0%5D=two_room&max_price=600&sort=price_asc",
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/4zida/v1/search?for=rent&type=apartments&place_ids%5B0%5D=2&rooms%5B0%5D=two_room&max_price=600&sort=price_asc');
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/4zida/v1/search?for=rent&type=apartments&place_ids%5B0%5D=2&rooms%5B0%5D=two_room&max_price=600&sort=price_asc', 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/4zida/v1/search?for=rent&type=apartments&place_ids%5B0%5D=2&rooms%5B0%5D=two_room&max_price=600&sort=price_asc',
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/4zida/v1/search?for=rent&type=apartments&place_ids%5B0%5D=2&rooms%5B0%5D=two_room&max_price=600&sort=price_asc")
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/4zida/v1/search?for=rent&type=apartments&place_ids%5B0%5D=2&rooms%5B0%5D=two_room&max_price=600&sort=price_asc", 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/4zida/v1/search?for=rent&type=apartments&place_ids%5B0%5D=2&rooms%5B0%5D=two_room&max_price=600&sort=price_asc', 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/4zida/v1/search?for=rent&type=apartments&place_ids%5B0%5D=2&rooms%5B0%5D=two_room&max_price=600&sort=price_asc")
.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/4zida/v1/search?for=rent&type=apartments&place_ids%5B0%5D=2&rooms%5B0%5D=two_room&max_price=600&sort=price_asc", 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/4zida/v1/search?for=rent&type=apartments&place_ids%5B0%5D=2&rooms%5B0%5D=two_room&max_price=600&sort=price_asc"
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/4zida/v1/search?for=rent&type=apartments&place_ids%5B0%5D=2&rooms%5B0%5D=two_room&max_price=600&sort=price_asc"));
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/4zida/v1/search?for=rent&type=apartments&place_ids%5B0%5D=2&rooms%5B0%5D=two_room&max_price=600&sort=price_asc',
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/4zida/v1/search?for=rent&type=apartments&place_ids%5B0%5D=2&rooms%5B0%5D=two_room&max_price=600&sort=price_asc")
.header("x-api-key", "YOUR_API_KEY_HERE")
.send()
.await?;
println!("{}", response.text().await?);
Ok(())
}
Errors
Handle these documented responses before retrying or showing customer-facing failures.
Validation Error
A public parameter is missing, unknown or invalid, or 4zida cannot resolve a filter value. The response is not billable.
{
"errors": {
"for": [
"The for field is required."
]
},
"message": "The request validation failed"
}Resource Not Found
The requested 4zida resource does not exist. The response is not billable.
{
"meta": {
"billable": false,
"retryable": false,
"endpoint_family": "search"
},
"error": {
"code": "NOT_FOUND",
"message": "The requested 4zida resource was not found."
},
"success": false
}Unexpected Upstream Response
4zida answered with a body that is not the documented shape. The response is not billable.
{
"meta": {
"billable": false,
"retryable": true,
"endpoint_family": "search"
},
"error": {
"code": "PARSER_DRIFT",
"message": "The 4zida API is temporarily unavailable. Please retry."
},
"success": false
}Upstream Unavailable
4zida was temporarily unavailable or blocked the request. The response is not billable and the request never answers 429.
{
"meta": {
"billable": false,
"retryable": true,
"endpoint_family": "search"
},
"error": {
"code": "UPSTREAM_UNAVAILABLE",
"message": "The 4zida API 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.