{
  "openapi": "3.0.1",
  "info": {
    "title": "Imot.bg Scraper - Bulgaria Property Listings & Prices",
    "description": "Scrape Imot.bg listings across Bulgaria: asking price, area, floor, construction year, photos, agency contacts and price cuts. Sale and rental, in Bulgarian.",
    "version": "1.0",
    "x-build-id": "bCUhxD8zT6PiD1grN"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/sian.agency~imot-property-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-sian.agency-imot-property-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/acts/sian.agency~imot-property-scraper/runs": {
      "post": {
        "operationId": "runs-sync-sian.agency-imot-property-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor and returns information about the initiated run in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/runsResponseSchema"
                }
              }
            }
          }
        }
      }
    },
    "/acts/sian.agency~imot-property-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-sian.agency-imot-property-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "inputSchema": {
        "type": "object",
        "properties": {
          "operation": {
            "title": "🎯 What do you want to scrape?",
            "enum": [
              "search",
              "detail"
            ],
            "type": "string",
            "description": "Pick one per run. Property Search walks Imot.bg's own listing pages for any Bulgarian city or region and returns 40 listings per page; Property Detail takes Imot.bg listing URLs and returns the full advert text, every photo, the feature list and the agency's contact details.",
            "default": "search"
          },
          "locations": {
            "title": "📍 Cities and regions",
            "uniqueItems": true,
            "type": "array",
            "description": "Which parts of Bulgaria to read. A city entry covers the city and its neighbourhoods; the matching region entry covers the towns and villages around it, and the two do not overlap — pick both if you want the whole area. Every value is Imot.bg's own area, so the list is exactly what the site indexes. Searching a single district such as Lozenets or Banishora is done by pasting that district's Imot.bg address into Search URLs instead.",
            "items": {
              "type": "string",
              "enum": [
                "grad-sofiya",
                "oblast-sofiya",
                "grad-plovdiv",
                "oblast-plovdiv",
                "grad-varna",
                "oblast-varna",
                "grad-burgas",
                "oblast-burgas",
                "grad-ruse",
                "oblast-ruse",
                "grad-stara-zagora",
                "oblast-stara-zagora",
                "grad-pleven",
                "oblast-pleven",
                "grad-veliko-tarnovo",
                "oblast-veliko-tarnovo",
                "grad-blagoevgrad",
                "oblast-blagoevgrad",
                "grad-dobrich",
                "oblast-dobrich",
                "grad-gabrovo",
                "oblast-gabrovo",
                "grad-haskovo",
                "oblast-haskovo",
                "grad-kardzhali",
                "oblast-kardzhali",
                "grad-kyustendil",
                "oblast-kyustendil",
                "grad-lovech",
                "oblast-lovech",
                "grad-montana",
                "oblast-montana",
                "grad-pazardzhik",
                "oblast-pazardzhik",
                "grad-pernik",
                "oblast-pernik",
                "grad-razgrad",
                "oblast-razgrad",
                "grad-shumen",
                "oblast-shumen",
                "grad-silistra",
                "oblast-silistra",
                "grad-sliven",
                "oblast-sliven",
                "grad-smolyan",
                "oblast-smolyan",
                "grad-targovishte",
                "oblast-targovishte",
                "grad-vidin",
                "oblast-vidin",
                "grad-vratsa",
                "oblast-vratsa",
                "grad-yambol",
                "oblast-yambol",
                "gartsiya"
              ],
              "enumTitles": [
                "🏙️ Sofia (city) — град София",
                "🗺️ Sofia region — област София",
                "🏙️ Plovdiv (city) — град Пловдив",
                "🗺️ Plovdiv region — област Пловдив",
                "🏙️ Varna (city) — град Варна",
                "🗺️ Varna region — област Варна",
                "🏙️ Burgas (city) — град Бургас",
                "🗺️ Burgas region — област Бургас",
                "🏙️ Ruse (city) — град Русе",
                "🗺️ Ruse region — област Русе",
                "🏙️ Stara Zagora (city) — град Стара Загора",
                "🗺️ Stara Zagora region — област Стара Загора",
                "🏙️ Pleven (city) — град Плевен",
                "🗺️ Pleven region — област Плевен",
                "🏙️ Veliko Tarnovo (city) — град Велико Търново",
                "🗺️ Veliko Tarnovo region — област Велико Търново",
                "🏙️ Blagoevgrad (city) — град Благоевград",
                "🗺️ Blagoevgrad region — област Благоевград",
                "🏙️ Dobrich (city) — град Добрич",
                "🗺️ Dobrich region — област Добрич",
                "🏙️ Gabrovo (city) — град Габрово",
                "🗺️ Gabrovo region — област Габрово",
                "🏙️ Haskovo (city) — град Хасково",
                "🗺️ Haskovo region — област Хасково",
                "🏙️ Kardzhali (city) — град Кърджали",
                "🗺️ Kardzhali region — област Кърджали",
                "🏙️ Kyustendil (city) — град Кюстендил",
                "🗺️ Kyustendil region — област Кюстендил",
                "🏙️ Lovech (city) — град Ловеч",
                "🗺️ Lovech region — област Ловеч",
                "🏙️ Montana (city) — град Монтана",
                "🗺️ Montana region — област Монтана",
                "🏙️ Pazardzhik (city) — град Пазарджик",
                "🗺️ Pazardzhik region — област Пазарджик",
                "🏙️ Pernik (city) — град Перник",
                "🗺️ Pernik region — област Перник",
                "🏙️ Razgrad (city) — град Разград",
                "🗺️ Razgrad region — област Разград",
                "🏙️ Shumen (city) — град Шумен",
                "🗺️ Shumen region — област Шумен",
                "🏙️ Silistra (city) — град Силистра",
                "🗺️ Silistra region — област Силистра",
                "🏙️ Sliven (city) — град Сливен",
                "🗺️ Sliven region — област Сливен",
                "🏙️ Smolyan (city) — град Смолян",
                "🗺️ Smolyan region — област Смолян",
                "🏙️ Targovishte (city) — град Търговище",
                "🗺️ Targovishte region — област Търговище",
                "🏙️ Vidin (city) — град Видин",
                "🗺️ Vidin region — област Видин",
                "🏙️ Vratsa (city) — град Враца",
                "🗺️ Vratsa region — област Враца",
                "🏙️ Yambol (city) — град Ямбол",
                "🗺️ Yambol region — област Ямбол",
                "🇬🇷 Greece — Гърция"
              ]
            },
            "default": [
              "grad-sofiya"
            ]
          },
          "dealType": {
            "title": "🤝 For sale or for rent",
            "enum": [
              "prodazhbi",
              "naemi"
            ],
            "type": "string",
            "description": "Sale adverts carry an asking price; rental adverts carry a monthly rent in the same field. Imot.bg keeps the two in separate sections, so a run reads one or the other.",
            "default": "prodazhbi"
          },
          "propertyTypes": {
            "title": "🏠 Property types",
            "uniqueItems": true,
            "type": "array",
            "description": "Which kinds of property to read. Leave the list empty to take every type in one sweep, which is what a market study usually wants. Picking types is also how a big city is covered past Imot.bg's 1,000-listing ceiling: each type is searched separately, so Sofia flats and Sofia houses each get their own 1,000. A few types belong to one section only — plots and farmland are sale adverts, rooms and pitches are rentals — and an empty section simply returns nothing.",
            "items": {
              "type": "string",
              "enum": [
                "ednostaen",
                "dvustaen",
                "tristaen",
                "chetiristaen",
                "mnogostaen",
                "mezonet",
                "atelie-tavan",
                "staya",
                "kashta",
                "etazh-ot-kashta",
                "vila",
                "partsel",
                "zemedelska-zemya",
                "garazh-parkomyasto",
                "ofis",
                "magazin",
                "sklad",
                "promishleno-pomeshtenie",
                "biznes-imot",
                "zavedenie",
                "hotel",
                "myasto"
              ],
              "enumTitles": [
                "🚪 Studio flats — Едностайни",
                "🛏️ One-bedroom flats — Двустайни",
                "🛏️ Two-bedroom flats — Тристайни",
                "🛏️ Three-bedroom flats — Четиристайни",
                "🏢 Larger flats — Многостайни",
                "🪜 Maisonettes — Мезонети",
                "🎨 Studios and attics — Ателиета, тавани",
                "🚪 Rooms — Стаи",
                "🏡 Houses — Къщи",
                "🏘️ Floors of houses — Етажи от къщи",
                "🌄 Villas — Вили",
                "🌳 Building plots — Парцели",
                "🌾 Farmland — Земеделски земи",
                "🚗 Garages and parking — Гаражи, паркоместа",
                "🏢 Offices — Офиси",
                "🏪 Shops — Магазини",
                "📦 Warehouses — Складове",
                "🏭 Industrial premises — Промишлени помещения",
                "💼 Business properties — Бизнес имоти",
                "🍽️ Restaurants and bars — Заведения",
                "🏨 Hotels — Хотели",
                "📍 Pitches — Места"
              ]
            },
            "default": []
          },
          "maxResults": {
            "title": "🔢 Max listings",
            "minimum": 1,
            "maximum": 20000,
            "type": "integer",
            "description": "Stop after this many listings across the whole run, not per city. One page carries 40 listings, so a run ends on the first page that crosses your limit.",
            "default": 100
          },
          "includeDetails": {
            "title": "📄 Add full details",
            "type": "boolean",
            "description": "Open each listing's own page to add the untruncated advert text, the complete photo set instead of the four thumbnails on the card, the feature list, the publication or last-edit date, the view count and the agency's office phones, address, website and years on Imot.bg. Costs one extra request per listing and bills the Property Detail event on top of the listing row.",
            "default": false
          },
          "minPrice": {
            "title": "💵 Min price (€)",
            "minimum": 0,
            "type": "integer",
            "description": "Skip listings priced below this. 0 means no lower bound. Imot.bg quotes in euros, and for a rental this is the monthly rent. Listings that say 'price on request' carry no number and are kept whatever you set here.",
            "default": 0
          },
          "maxPrice": {
            "title": "💰 Max price (€)",
            "minimum": 0,
            "type": "integer",
            "description": "Skip listings priced above this. 0 means no upper bound. Pairing it with a minimum is the usual way to carve a big city into bands that each stay under Imot.bg's 1,000-listing ceiling.",
            "default": 0
          },
          "minArea": {
            "title": "📐 Min area (m²)",
            "minimum": 0,
            "type": "integer",
            "description": "Skip listings smaller than this. 0 means no minimum. For a house this is the built area; the garden is reported separately as the plot size.",
            "default": 0
          },
          "maxArea": {
            "title": "📏 Max area (m²)",
            "minimum": 0,
            "type": "integer",
            "description": "Skip listings larger than this. 0 means no maximum.",
            "default": 0
          },
          "onlyPriceReduced": {
            "title": "📉 Only price cuts",
            "type": "boolean",
            "description": "Keep only listings Imot.bg is currently flagging as reduced. The site marks the direction of the last price move on the card itself, so this is its own judgement, not a guess from comparing two of your runs.",
            "default": false
          },
          "onlyNewListings": {
            "title": "🆕 Only new adverts",
            "type": "boolean",
            "description": "Keep only adverts carrying Imot.bg's own 'НОВА ОБЯВА' badge. Useful on a schedule when you already hold yesterday's listing IDs and only want what appeared since.",
            "default": false
          },
          "onlyPrivateSellers": {
            "title": "👤 Only owner adverts",
            "type": "boolean",
            "description": "Keep only listings published by the owner rather than an estate agency. These are the ones with no agency card and a direct phone number on the advert.",
            "default": false
          },
          "searchUrls": {
            "title": "🌐 Search URLs",
            "type": "array",
            "description": "Paste Imot.bg search addresses instead of filling the form. Build the search on imot.bg, copy the address bar, and the section, area, district and property type in it are read straight off the URL — including district-level pages such as https://www.imot.bg/obiavi/prodazhbi/grad-sofiya/lozenets that the form above does not reach. A page number in the address is ignored; the run starts at page one and pages forward on its own.",
            "default": [],
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "listingUrls": {
            "title": "🏠 Listing URLs",
            "type": "array",
            "description": "Used by the Property Detail operation: Imot.bg advert addresses to expand, e.g. https://www.imot.bg/obiava-1a178660257911771-prodava-ednostaen-apartament-grad-sofiya-banishora. A bare advert number such as 1a178660257911771 works too.",
            "default": [],
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          }
        }
      },
      "runsResponseSchema": {
        "type": "object",
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "actId": {
                "type": "string"
              },
              "userId": {
                "type": "string"
              },
              "startedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "finishedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "status": {
                "type": "string",
                "example": "READY"
              },
              "meta": {
                "type": "object",
                "properties": {
                  "origin": {
                    "type": "string",
                    "example": "API"
                  },
                  "userAgent": {
                    "type": "string"
                  }
                }
              },
              "stats": {
                "type": "object",
                "properties": {
                  "inputBodyLen": {
                    "type": "integer",
                    "example": 2000
                  },
                  "rebootCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "restartCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "resurrectCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "computeUnits": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "options": {
                "type": "object",
                "properties": {
                  "build": {
                    "type": "string",
                    "example": "latest"
                  },
                  "timeoutSecs": {
                    "type": "integer",
                    "example": 300
                  },
                  "memoryMbytes": {
                    "type": "integer",
                    "example": 1024
                  },
                  "diskMbytes": {
                    "type": "integer",
                    "example": 2048
                  }
                }
              },
              "buildId": {
                "type": "string"
              },
              "defaultKeyValueStoreId": {
                "type": "string"
              },
              "defaultDatasetId": {
                "type": "string"
              },
              "defaultRequestQueueId": {
                "type": "string"
              },
              "buildNumber": {
                "type": "string",
                "example": "1.0.0"
              },
              "containerUrl": {
                "type": "string"
              },
              "usage": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "integer",
                    "example": 1
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "usageTotalUsd": {
                "type": "number",
                "example": 0.00005
              },
              "usageUsd": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "number",
                    "example": 0.00005
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}