Skip to content
Scrappa Get API key
4zida API 1 credit/request

4zida Property Search API Documentation

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

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.

4zida Property Search API Documentation 1 credit/request

Endpoint

Request preview
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
Auth header
x-api-key
Cost
1 credit/request
for = rent
Response preview
200 OK
Example JSON appears below when a response schema is available for this 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.

for string Required

sale or rent.

Example value rent
type string Optional

apartments (default), houses, offices, lots or vehicle_spots.

Example value apartments
place_ids[] 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 value ["example"]
min_price integer Optional

Lowest price in euro. For rent this is the price for one payment term, usually one month (see payment_terms).

Example value 10
max_price integer Optional

Highest price in euro. For rent this is the price for one payment term.

Example value 600
min_area integer Optional

Smallest area in square metres. For lots the unit is ares.

Example value 10
max_area integer Optional

Largest area in square metres. For lots the unit is ares.

Example value 10
min_price_per_m2 integer Optional

Lowest price per square metre in euro.

Example value 10
max_price_per_m2 integer Optional

Highest price per square metre in euro.

Example value 10
rooms[] 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 value ["example"]
categories[] 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 value ["example"]
states[] array Optional

original, new, in_progress, repaired or needs_repair. Repeatable.

Example value ["example"]
furnished[] array Optional

yes, no or semi. Repeatable.

Example value ["example"]
heating[] array Optional

central, district, electricity, gas, heatPump, underfloor, airConditioning, solid, tileStove, storageHeater, marbleRadiator, norwegianRadiators, allocators or none. Repeatable.

Example value ["example"]
payment_terms[] array Optional

Rent only: day, month, 3 months, 6 months or year. Repeatable.

Example value ["example"]
advertiser_types[] array Optional

agency, firm, investor or owner. Repeatable.

Example value ["example"]
registered string Optional

Land registry status: yes, partially, in_progress or no.

Example value example
min_floor integer Optional

Lowest floor. 0 is the ground floor.

Example value 10
max_floor integer Optional

Highest floor.

Example value 10
elevator 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.

Example value true
sort string Optional

newest, price_asc, price_desc, area_asc or area_desc. Without it the site default order applies.

Example value price_asc
page integer Optional

One-based page number. Defaults to 1.

Example value 1

Request Examples

PHP
<?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
<?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();
}
JavaScript
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));
JavaScript
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);
}
Ruby
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
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/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()
Python
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}")
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/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());
        }
    }
}
Go
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))
}
Terminal
#!/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"
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/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}");
        }
    }
}
TypeScript
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();
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/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.

422

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"
}
404

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
}
503

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
}
503

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.