Nekretnine APInekretnine.rs ↗
Access Serbian real estate listings from Nekretnine.rs. Search apartments by city and transaction type, retrieve prices, photos, coordinates, and agency contact details.
What is the Nekretnine API?
The Nekretnine.rs API exposes 2 endpoints for querying Serbia's largest property marketplace, covering apartment listings across cities including Belgrade, Novi Sad, and Niš. The search_listings endpoint returns paginated summaries with price, surface area, room count, and location, while get_listing_detail returns full property records including photos, floor, coordinates, and agency contact information.
curl -X GET 'https://api.parse.bot/scraper/8af79894-120f-4da7-88bc-cf16c5be7356/search_listings?city=beograd&page=1&price_min=100000&price_status=any&transaction_type=prodaja' \ -H 'X-API-Key: $PARSE_API_KEY'
Search apartment listings by city and transaction type (sale or rent). Returns paginated results with basic listing information including price, surface area, rooms, location, and a direct URL to the detail page. The site enforces a hard 80-page (2000-result) pagination limit per query. For complete catalog traversal: use price_status='priced' with price_min/price_max ranges to tile priced listings into windows that fit within 80 pages, and price_status='on_request' to separately retrieve no-price listings. The union of all priced partitions plus on_request listings equals the full catalog (verifiable via on_request_count + priced total_count = any total_count). When is_truncated is true, narrow price_min/price_max further. Price filter boundaries are inclusive (>=, <=). When price_status='on_request', results are filtered client-side from the site's page; page_result_count shows how many matched on that page (may be fewer than 25). Listings have unique integer IDs usable for deduplication across pages and partitions.
| Param | Type | Description |
|---|---|---|
| city | string | City slug used in the URL path (e.g. 'beograd', 'novi-sad', 'nis'). Slugs use lowercase Latin transliteration with hyphens. |
| page | integer | Page number for pagination. Maximum effective value is 80 (the site returns 404 for pages beyond 80). |
| price_max | integer | Maximum price in euros (inclusive). Use together with price_min to partition results into ranges that fit within the 80-page limit for full catalog traversal. Ignored when price_status='on_request'. |
| price_min | integer | Minimum price in euros (inclusive). Use together with price_max to partition results into ranges that fit within the 80-page limit for full catalog traversal. Ignored when price_status='on_request'. |
| price_status | string | Filter listings by price visibility. 'any' returns all listings. 'priced' returns only listings with a numeric euro price (server-side filter). 'on_request' returns only listings marked 'cena na upit' with no listed price (client-side filtered from each page). Use 'priced' with price_min/price_max for partitioned traversal and 'on_request' separately to cover the full catalog without gaps. |
| transaction_type | string | Transaction type filter. |
{
"type": "object",
"fields": {
"listings": "array of listing objects with id, title, price, has_price, price_formatted, surface, rooms, bathrooms, floor, city, municipality, neighborhood, address, latitude, longitude, url",
"max_pages": "total number of pages reported by the site (site reports up to 376 but only pages 1-80 are accessible)",
"total_count": "total number of matching listings for this partition (when price_status='on_request', this is the count of on-request listings; when 'priced', the count of priced listings; when 'any', the full catalog count)",
"current_page": "current page number",
"is_truncated": "true when total_count exceeds accessible_count, indicating the caller should narrow price_min/price_max filters to access all results",
"accessible_count": "number of results actually reachable via pagination (capped at max_pages * 25, with max_pages capped at 80)",
"on_request_count": "number of on-request (no-price) listings in the catalog for this city/transaction_type combination (null when price_min or price_max are applied with price_status='any')",
"page_result_count": "number of listings returned on this page after filtering (present only when price_status='on_request'; may be less than 25 since filtering is client-side)"
},
"sample": {
"data": {
"listings": [
{
"id": 1351759,
"url": "https://www.nekretnine.rs/oglasi/1351759/",
"city": "Beograd",
"floor": null,
"price": null,
"rooms": "1 - 5",
"title": "Novogradnja Stanovi i Penthausi u Beograd",
"address": "Ulica Partizanske avijacije, 4",
"surface": "41 m²",
"latitude": 44.82389832,
"bathrooms": null,
"has_price": false,
"longitude": 20.38909912,
"municipality": null,
"neighborhood": null,
"price_formatted": "cena na upit"
}
],
"max_pages": 376,
"total_count": 9382,
"current_page": 1,
"is_truncated": true,
"accessible_count": 2000,
"on_request_count": 67,
"page_result_count": null
},
"status": "success"
}
}About the Nekretnine API
Searching Listings
The search_listings endpoint accepts a city slug (e.g. beograd, novi-sad, nis), a transaction_type to filter between sale and rental listings, and a page integer for pagination. Each response includes a listings array of summaries — each with an id, title, price, surface, rooms, and location — alongside total_count, max_pages, and current_page fields. The id values in results are the input for get_listing_detail.
Retrieving Listing Detail
The get_listing_detail endpoint takes a numeric listing_id and returns a full property record. Key fields include price in euros (returned as null when the listing is price-on-request), photos as an array of full-size image URLs, address, floor, rooms, city, and an is_new flag. The url field gives the canonical listing page on Nekretnine.rs.
Coverage and Data Shape
Listings cover apartments for sale and rent across Serbian cities. The title field typically encodes property type, street address, and city. Photo arrays can contain multiple images per listing. Location coordinate data is included where available in the detail response, making the data suitable for map-based display or geospatial filtering.
The Nekretnine API is a managed, monitored endpoint for nekretnine.rs — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when nekretnine.rs changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official nekretnine.rs API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Build a cross-city price comparison tool using
priceandsurfacefields fromsearch_listings - Populate a property map by pulling coordinates from
get_listing_detailfor Belgrade or Novi Sad listings - Track new listings by monitoring the
is_newflag andtotal_countacross paginatedsearch_listingsresults - Aggregate rental vs. sale price trends by filtering on
transaction_typeover time - Display property photo galleries in a custom frontend using the
photosURL array from listing detail - Build an apartment alert system that watches
search_listingsresults for a given city and room count
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 200 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
| Team | $300/mo | 20,000 | 300 req/min |
| Company | $1,000/mo | 100,000 | 500 req/min |
Each endpoint has a fixed posted price per successful call — most fall between 1 and 10 credits — shown on this API's page before you run it. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does Nekretnine.rs have an official developer API?+
What does search_listings return per listing, and how do I page through results?+
listings array includes id, title, price, surface, rooms, and location. The response also includes total_count and max_pages so you can iterate from page 1 to max_pages using the page parameter. The id from each summary is what you pass to get_listing_detail for the full record.Are house or commercial property listings covered, or only apartments?+
What happens when a listing has a price-on-request rather than a listed price?+
price field in get_listing_detail returns null for price-on-request listings. You should handle null checks in your integration when building price-dependent logic such as sorting or range filtering.Is there a way to filter listings by price range, surface area, or number of rooms within the API?+
search_listings endpoint currently filters by city and transaction_type only. Price range, surface area, and room count filters are not exposed as parameters. You can fork this API on Parse and revise it to add those filter parameters.