imot APIimot.bg ↗
Search Bulgarian property listings for sale and rent, retrieve full listing details, and access district-level average prices and historical market stats from imot.bg.
What is the imot API?
The imot.bg API exposes 7 endpoints covering Bulgaria's largest real estate portal: search listings for sale or rent, fetch full property details via get_listing_details, query weekly average price snapshots by district going back to 1995, and pull historical market statistics for individual districts and property types. Each search endpoint returns paginated summaries with IDs, prices, and titles; detail endpoints add photos, floor, construction type, and contact phone.
curl -X GET 'https://api.parse.bot/scraper/fcccf2c5-b878-42f1-a63a-1d246dfba689/search_listings_for_sale?page=1¤cy=EUR&location=%D0%B3%D1%80%D0%B0%D0%B4+%D0%A1%D0%BE%D1%84%D0%B8%D1%8F&max_area=200&min_area=40&max_price=200000&min_price=50000&sort_order=2&property_types=1-%D0%A1%D0%A2%D0%90%D0%95%D0%9D' \ -H 'X-API-Key: $PARSE_API_KEY'
Search for property listings for sale on imot.bg. Supports filtering by location, price range, area, property type, and pagination. Returns a paginated list of matching listings sorted by newest first by default. Each listing includes an id usable with get_listing_details for full property information.
| Param | Type | Description |
|---|---|---|
| page | integer | Page number for pagination. |
| currency | string | Currency for prices. |
| location | string | Location filter in Bulgarian (e.g. 'град София', 'Пловдив'). |
| max_area | integer | Maximum area in square meters. |
| min_area | integer | Minimum area in square meters. |
| max_price | integer | Maximum price in the specified currency. |
| min_price | integer | Minimum price in the specified currency. |
| sort_order | integer | Sort order for results. 2 = newest first. |
| property_types | string | Comma-separated property type names in Bulgarian. Accepted values: 1-СТАЕН, 2-СТАЕН, 3-СТАЕН, 4-СТАЕН, МНОГОСТАЕН, МЕЗОНЕТ, АТЕЛИЕ/ТАВАН, ОФИС, МАГАЗИН, ЗАВЕДЕНИЕ, СКЛАД, ХОТЕЛ, ПРОМ.ПОМЕЩЕНИЕ, ЕТАЖ ОТ КЪЩА, КЪЩА, ВИЛА, ПАРЦЕЛ, ГАРАЖ/ПАРКОМЯСТО, ЗЕМЕДЕЛСКА ЗЕМЯ, БИЗНЕС ИМОТ. |
{
"type": "object",
"fields": {
"page": "current page number as string",
"count": "integer total number of listings on this page",
"listings": "array of listing summary objects with id, title, url, price, info"
},
"sample": {
"data": {
"page": "1",
"count": 41,
"listings": [
{
"id": "1a177764345916850",
"url": "https://www.imot.bg/obiava-1a177764345916850-prodava-ednostaen-apartament-grad-sofiya-vrabnitsa-2",
"info": "42 кв.м, 1-ви ет. от 9, ТЕЦ",
"price": "107 000 €209 273.81 лв.",
"title": "Продава 1-СТАЕНград София, Връбница 2"
}
]
},
"status": "success"
}
}About the imot API
Listing Search and Detail
search_listings_for_sale and search_listings_for_rent accept location strings in Bulgarian (e.g. 'град София'), price bounds (min_price, max_price), area bounds (min_area, max_area), currency, and page number. Each returns a listings array of summary objects carrying id, title, url, price, and info, plus a count of items on that page. Pass any id or url from those results to get_listing_details to receive the full record: parameters (area, floor, construction type), description, photos array, price_per_sqm, VAT status via price_info, and a phone contact string.
Average Prices and Market History
get_average_prices returns one row per district for a chosen Bulgarian city, transaction type (sale, rent, or land), and weekly snapshot date. The columns field describes each value column as a {category, measure} pair; available_dates lists every snapshot the source offers for the requested year, newest first — the site holds weekly data going back to 1995. get_market_history narrows to a single district × property-type combination and returns chronological points (each with date in D.M.YYYY and date_iso) across all metrics the source tracks, such as 'Цена на имота', 'Цена на кв.м.', and 'Брой оферти'. The period parameter maps to the site's chart windows: 1 = 1 month through 5 = all time.
Bulk History and Vocabulary Endpoints
get_market_history_bulk batches up to 40 district × property-type combinations per call for a single city and market segment. Pagination is handled via offset and next_offset; the summary field reports counts for successful, skipped, and failed combinations. get_search_form_options requires no inputs and returns the authoritative filter vocabularies: towns, years, property_types, districts (keyed by city), history_periods, history_metrics, history_property_types, and statistics_types. Use this endpoint to build dynamic filter UIs or validate inputs before calling any other endpoint.
The imot API is a managed, monitored endpoint for imot.bg — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when imot.bg 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 imot.bg 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?+
- Aggregate weekly district-level price-per-sqm trends for Sofia going back to 1995 using get_average_prices with varying year and date inputs.
- Build a rental price comparison tool for Plovdiv by querying search_listings_for_rent filtered by area bounds and retrieving full details for each result.
- Monitor new-to-market sale listings in a specific Bulgarian city by polling search_listings_for_sale with sort_order=2 and tracking IDs across runs.
- Generate per-district price history charts by combining get_market_history_bulk results for all districts of a city with a 5-year period.
- Validate search form inputs programmatically by calling get_search_form_options to retrieve exact Bulgarian property type labels and district names before running queries.
- Extract contact phones and photo URLs for property leads by chaining search results into get_listing_details calls.
| 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 imot.bg offer an official developer API?+
What does get_average_prices return, and how far back does the data go?+
columns array labels each value column with a category and measure. The available_dates field lists every snapshot date the source offers for the requested year. The source publishes weekly snapshots going back to 1995, accessible by combining the year and date parameters.Can I filter sale listings by property type, such as apartments only?+
property_types parameter accepting comma-separated Bulgarian labels (e.g. '2-СТАЕН,3-СТАЕН'). search_listings_for_sale accepts location, price, and area filters but does not currently surface a property_type filter parameter in the same way. The accepted vocabulary for both is returned by get_search_form_options under property_types. You can fork this API on Parse and revise it to add a property_type filter to the sale search endpoint.Does the API cover listings outside Bulgaria or from other Bulgarian portals?+
Is there a limit on how many district combinations get_market_history_bulk can process per call?+
limit parameter is clamped to a maximum of 40 combinations per call. If more combinations exist, has_more will be true and you use next_offset (returned in the response) as the offset for the next call to page through the full set. The summary object reports how many combinations were successful, skipped, or failed within each call.