Real estate and classifieds in Batumi & Tbilisi with rooftop geocoding and duplicate detection.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Execute a JavaScript snippet inside an isolated QuickJS WASM sandbox with direct synchronous/async access to the Hotyata SDK (`sdk`). Use this "MCP Code Mode" tool whenever you need to run multi-step queries, compare multiple categories/districts/stages, join complexes with properties, filter or aggregate results, and return only a compact final summary in a single round-trip. Available global `sdk` methods inside your script (can be called with or without `await`): - `sdk.searchProperties(params)` -> `{ total, page, limit, properties: [...] }` - `sdk.getPropertyStats(params)` -> `{ city, deal_type, group_by, total_matching_listings, groups: [...] }` - `sdk.getProperty(idOrArrayOfIds)` -> property details object or `{ properties: [...] }` - `sdk.searchComplexes(params)` -> `{ total, page, limit, complexes: [...] }` - `sdk.getComplex(idOrArrayOfIds)` -> complex details object or `{ complexes: [...] }` - `sdk.searchItems(params)` -> `{ total, page, limit, items: [...] }` - `sdk.getItem(idOrArrayOfIds)` -> item details object or `{ items: [...] }` <examples> // Example 1: Compare renovation status & off-plan (katlavan) sale dynamics in Batumi const byRenovation = sdk.getPropertyStats({ city: "batumi", deal_type: "sale", group_by: "renovation_status" }); const byStage = sdk.getPropertyStats({ city: "batumi", deal_type: "sale", group_by: "construction_stage" }); return { byRenovation: byRenovation.groups, byStage: byStage.groups }; // Example 2: Multi-search classifieds and return top 3 cheapest per item type const queries = ["4K monitor", "router", "electric heater", "mechanical keyboard"]; return queries.map(q => { const res = sdk.searchItems({ query: q, sort: "cheapest", limit: 3 }); return { query: q, total: res.total, cheapest: res.items.map(i => ({ id: i.id, title: i.title, price_gel: i.price_gel, price_usd: i.price_usd, url: i.canonical_url })) }; }); </examples> <hints> - Write a function body ending with a `return ...;` statement. - Maximum 15 SDK calls per execution. Memory limit: 32MB, CPU timeout: 5s. </hints>
JavaScript function body to execute in the sandbox. Must return a JSON-serializable value via `return ...`.
This tool isn't marked read-only, so it may change something on the server or in an account you connected.
Pick your client. Values in capitals, like YOUR_TOKEN, are yours to fill in.
Run in a terminal
claude mcp add --transport http mcp https://hotyata.com/mcp
Execute a JavaScript snippet inside an isolated QuickJS WASM sandbox with direct synchronous/async access to the Hotyata SDK (`sdk`). Use this "MCP Code Mode" tool whenever you need to run multi-step queries, compare multiple categories/districts/stages, join complexes with properties, filter or aggregate results, and return only a compact final summary in a single round-trip. Available global `sdk` methods inside your script (can be called with or without `await`): - `sdk.searchProperties(params)` -> `{ total, page, limit, properties: [...] }` - `sdk.getPropertyStats(params)` -> `{ city, deal_type, group_by, total_matching_listings, groups: [...] }` - `sdk.getProperty(idOrArrayOfIds)` -> property details object or `{ properties: [...] }` - `sdk.searchComplexes(params)` -> `{ total, page, limit, complexes: [...] }` - `sdk.getComplex(idOrArrayOfIds)` -> complex details object or `{ complexes: [...] }` - `sdk.searchItems(params)` -> `{ total, page, limit, items: [...] }` - `sdk.getItem(idOrArrayOfIds)` -> item details object or `{ items: [...] }` <examples> // Example 1: Compare renovation status & off-plan (katlavan) sale dynamics in Batumi const byRenovation = sdk.getPropertyStats({ city: "batumi", deal_type: "sale", group_by: "renovation_status" }); const byStage = sdk.getPropertyStats({ city: "batumi", deal_type: "sale", group_by: "construction_stage" }); return { byRenovation: byRenovation.groups, byStage: byStage.groups }; // Example 2: Multi-search classifieds and return top 3 cheapest per item type const queries = ["4K monitor", "router", "electric heater", "mechanical keyboard"]; return queries.map(q => { const res = sdk.searchItems({ query: q, sort: "cheapest", limit: 3 }); return { query: q, total: res.total, cheapest: res.items.map(i => ({ id: i.id, title: i.title, price_gel: i.price_gel, price_usd: i.price_usd, url: i.canonical_url })) }; }); </examples> <hints> - Write a function body ending with a `return ...;` statement. - Maximum 15 SDK calls per execution. Memory limit: 32MB, CPU timeout: 5s. </hints>
| Argument | Type | Description |
|---|---|---|
| code* | string | JavaScript function body to execute in the sandbox. Must return a JSON-serializable value via `return ...`. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"code"
],
"properties": {
"code": {
"type": "string",
"description": "JavaScript function body to execute in the sandbox. Must return a JSON-serializable value via `return ...`."
}
}
}Get detailed profile of one or up to 15 residential complexes including developer name, delivery year, address, rooftop coordinates, and counts & sample active properties currently for sale and rent.
| Argument | Type | Description |
|---|---|---|
| complex_id | number | Single residential complex ID |
| complex_ids | array | Batch array of up to 15 complex IDs to fetch in one call |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"complex_id": {
"type": "number",
"description": "Single residential complex ID"
},
"complex_ids": {
"type": "array",
"items": {
"type": "number"
},
"maxItems": 15,
"description": "Batch array of up to 15 complex IDs to fetch in one call"
}
}
}Get details for one or up to 15 secondhand classified items including full description, photo gallery, seller username, and original Telegram message link.
| Argument | Type | Description |
|---|---|---|
| item_id | number | Single classified item ID |
| item_ids | array | Batch array of up to 15 classified item IDs to fetch in one call |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"item_id": {
"type": "number",
"description": "Single classified item ID"
},
"item_ids": {
"type": "array",
"items": {
"type": "number"
},
"maxItems": 15,
"description": "Batch array of up to 15 classified item IDs to fetch in one call"
}
}
}Get complete specifications, full description, seller contact info (phone, contacts, source_url), photo URLs, rooftop coordinates, and complex affiliation for one or up to 15 properties in a single call.
| Argument | Type | Description |
|---|---|---|
| property_id | number | Single unique property ID |
| property_ids | array | Batch array of up to 15 property IDs to fetch in one round-trip |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"property_id": {
"type": "number",
"description": "Single unique property ID"
},
"property_ids": {
"type": "array",
"items": {
"type": "number"
},
"maxItems": 15,
"description": "Batch array of up to 15 property IDs to fetch in one round-trip"
}
}
}Aggregate real estate market statistics (count, average & median price USD, average & median price per sqm USD, min/max price, average area) grouped by district, renovation_status, construction_stage, rooms, seller_type, or complex. <hints> - Ideal for market analytics: comparing prices across city districts, or comparing 'black_frame' vs 'white_frame' vs 'renovated' vs 'off_plan' (katlavan). - Supports all search_real_estate filters (city, deal_type, district, renovation_status, construction_stage, rooms, has_gas, etc.) to slice the market before grouping. </hints>
| Argument | Type | Description |
|---|---|---|
| city | string | City name: 'batumi' or 'tbilisi' |
| rooms | number | string | Filter by room count |
| has_gas | boolean | Filter by gas connection |
| district | string | Filter by specific district(s) |
| group_by | string | Dimension to group statistics by |
| deal_type | string | Deal type to analyze ('sale', 'rent_long', 'rent_daily') |
| seller_type | string | Filter by seller type |
| exclude_orbi | boolean | Exclude Orbi City listings from stats |
Report an issue with data accuracy, stale or off-market listings, incorrect coordinates, spam, or tool usability limitations. AI agents should call this when finding inaccuracies or when human users report off-market listings.
| Argument | Type | Description |
|---|---|---|
| entity_id | string | ID or URL of the property, item, or complex (if applicable) |
| entity_type* | string | What entity has the issue |
| explanation* | string | Clear explanation of what is incorrect and what the correct information should be |
| agent_client | string | Name of the AI assistant/agent (e.g. 'ChatGPT-4o', 'Claude-3.5', 'Cursor') |
| issue_category* | string | Category of the reported issue |
| source_context | string | How this issue was discovered (e.g. 'User called landlord and confirmed rented', 'Coordinates point to the sea') |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"entity_type",
"issue_category",
"explanation"
],
"properties": {
"entity_id": {
"type": "string",
"description": "ID or URL of the property, item, or complex (if applicable)"
},
"entity_type": {
"enum": [
"property",
"item",
"complex",
"mcp_tool",
"other"
],
"type": "string",
"description": "What entity has the issue"
},
"explanation": {
"type": "string",
"description": "Clear explanation of what is incorrect and what the correct information should be"
},
"agent_client": {
"type": "string",
"description": "Name of the AI assistant/agent (e.g. 'ChatGPT-4o', 'Claude-3.5', 'Cursor')"
},
"issue_category": {
"enum": [
"already_rented_or_sold",
"wrong_price",
"incorrect_location",
"duplicate_listing",
"spam_or_fraud",
"broken_media",
"schema_feedback",
"other"
],
"type": "string",
"description": "Category of the reported issue"
},
"source_context": {
"type": "string",
"description": "How this issue was discovered (e.g. 'User called landlord and confirmed rented', 'Coordinates point to the sea')"
}
}
}Search deduplicated secondhand marketplace goods (electronics, monitors, routers, keyboards, heaters, furniture, vehicles, household items) aggregated across Telegram channels in Batumi and Tbilisi. <hints> - Powered by multilingual synonym expansion + semantic vector search: English queries (e.g. '4K monitor', 'WiFi router', 'electric heater', 'mechanical keyboard') automatically match Russian, English, and Georgian ads. - Avoid overly restrictive 'category' values unless needed; keyword query alone searches across all categories with hybrid semantic ranking. - Use sort='cheapest' to find lowest-priced items. </hints>
| Argument | Type | Description |
|---|---|---|
| city | string | City name ('batumi' or 'tbilisi') |
| page | number | Page number (starting from 1) |
| sort | string | Sort order: 'relevance' (default when query is present), 'newest', 'cheapest', 'expensive' |
| limit | number | Max listings to return (max 50) |
| query | string | Search keywords, e.g. 'monitor 4K', 'router', 'electric heater', 'mechanical keyboard', 'iPhone 15' |
| fields | array | Optional array of field names to return |
| intent | string | Listing intent: 'WTS' (For Sale, default), 'WTB' (Looking to buy), 'GIFT' (Free), 'RENT', 'SERVICE' |
Search residential developments and new building projects with developer details, delivery status, coordinates, distance to sea, and gas availability.
| Argument | Type | Description |
|---|---|---|
| city | string | City name ('batumi' or 'tbilisi') |
| limit | number | Max results (up to 50) |
| query | string | Complex name or developer name (e.g. 'Alliance', 'Orbi', 'Horizons', 'Calligraphy', 'Next', 'Gumbati') |
| fields | array | Optional array of field names to return |
| has_gas | boolean | Filter complexes with gas connection |
| district | string | Filter by district name |
| delivery_year | number | Filter by expected delivery year (e.g. 2025, 2026, 2027) |
| max_distance_to_sea | number | Maximum distance to the sea in meters (e.g. 150 for first line, 500) |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"city": {
"type": "string",
"default": "batumi",
"description": "City name ('batumi' or 'tbilisi')"
},
"limit": {
"type": "number",
"default": 10,
"maximum": 50,
"description": "Max results (up to 50)"
},
"query": {
"type": "string",
"description": "Complex name or developer name (e.g. 'Alliance', 'Orbi', 'Horizons', 'Calligraphy', 'Next', 'Gumbati')"
},
"fields": {
"type": "array",
"items": {
"type": "string"
},
"description": "Optional array of field names to return"
},
"has_gas": {
"type": "boolean",
"description": "Filter complexes with gas connection"
},
"district": {
"type": "string",
"description": "Filter by district name"
},
"delivery_year": {
"type": "number",
"description": "Filter by expected delivery year (e.g. 2025, 2026, 2027)"
},
"max_distance_to_sea": {
"type": "number",
"description": "Maximum distance to the sea in meters (e.g. 150 for first line, 500)"
}
}
}Search verified real estate listings in Batumi and Tbilisi (apartments, houses, commercial). <hints> - Returns compact objects with price_usd, price_sqm_usd, area_sqm, rooms, renovation_status, construction_stage, seller_type, heating_type, gas_status, is_heritage_zone, cadastral_code, year_built, developer_name, sea_view, distance_to_sea_m, has_gas, pets_allowed, no_summer_increase, address, latitude, longitude, photos, source_url, and canonical_url. - Geo search: Use bbox='min_lng,min_lat,max_lng,max_lat' or [min_lng, min_lat, max_lng, max_lat] to search within a map rectangle. - Batumi districts: 'Old Batumi', 'Rustaveli', 'Khimshiashvili' (New Boulevard), 'Bagrationi', 'Javakhishvili', 'Agmashenebeli', 'Airport', 'Tamar', 'Makhinjauri', 'Gonio', 'Kvariati', 'Chakvi', 'Kobuleti'. - Tbilisi districts: 'Vake', 'Saburtalo', 'Vera', 'Mtatsminda', 'Chugureti' (Marjanishvili), 'Didube', 'Avlabari', 'Ortachala', 'Isani', 'Samgori', 'Gldani', 'Didi Dighomi', 'Old Tbilisi'. - Use sort='cheapest' or 'cheapest_sqm' to find the best deals without fetching multiple pages. - Use fields=['id','title','price_usd','price_sqm_usd','area_sqm','district','canonical_url'] to minimize token usage. - Filter by source channel/portal/group using sources=['facebook marketplace'], ['ss.ge', 'myhome.ge'], ['@batumiarendachat'], or Facebook group URLs ['https://www.facebook.com/groups/278563704483455/']. Unmonitored sources return an error. </hints>
| Argument | Type | Description |
|---|---|---|
| bbox | any | Bounding box rectangle: 'min_lng,min_lat,max_lng,max_lat' or [min_lng, min_lat, max_lng, max_lat] |
| city | string | City name: 'batumi' or 'tbilisi' |
| page | number | Page number (starting from 1) |
| sort | string | Sort order: 'newest', 'cheapest', 'expensive', 'cheapest_sqm', 'expensive_sqm', 'area_desc', 'area_asc' |
We read every tool's name, description and inputs the way the model will, looking for instructions hidden from you. A clean result means no warning signs, not a guarantee. Scanned Nov 6, 2026.
No readOnlyHint / destructiveHint annotations, so clients can't tell a read from a write without asking.
Fix: Add annotations to each tool, e.g. { readOnlyHint: true } for tools that only read.
| property_type |
| string |
| Property type filter |
| renovation_status | string | Filter by renovation status ('black_frame', 'white_frame', 'green_frame', 'renovated', 'needs_renovation') |
| construction_stage | string | Filter by construction stage ('off_plan', 'under_construction', 'completed') |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"city": {
"type": "string",
"default": "batumi",
"description": "City name: 'batumi' or 'tbilisi'"
},
"rooms": {
"type": [
"number",
"string"
],
"description": "Filter by room count"
},
"has_gas": {
"type": "boolean",
"description": "Filter by gas connection"
},
"district": {
"type": "string",
"description": "Filter by specific district(s)"
},
"group_by": {
"enum": [
"district",
"renovation_status",
"construction_stage",
"rooms",
"seller_type",
"complex",
"none"
],
"type": "string",
"default": "district",
"description": "Dimension to group statistics by"
},
"deal_type": {
"enum": [
"sale",
"rent_long",
"rent_daily",
"pledge"
],
"type": "string",
"default": "sale",
"description": "Deal type to analyze ('sale', 'rent_long', 'rent_daily')"
},
"seller_type": {
"enum": [
"owner",
"agent",
"developer",
"all"
],
"type": "string",
"description": "Filter by seller type"
},
"exclude_orbi": {
"type": "boolean",
"description": "Exclude Orbi City listings from stats"
},
"property_type": {
"enum": [
"apartment",
"house",
"commercial",
"land",
"residential",
"all"
],
"type": "string",
"description": "Property type filter"
},
"renovation_status": {
"type": "string",
"description": "Filter by renovation status ('black_frame', 'white_frame', 'green_frame', 'renovated', 'needs_renovation')"
},
"construction_stage": {
"type": "string",
"description": "Filter by construction stage ('off_plan', 'under_construction', 'completed')"
}
}
}| category |
| string |
| Optional category substring filter (e.g. 'electronics', 'furniture', 'appliances', 'computers', 'transport') |
| currency | string | Currency for price filter ('USD' or 'GEL') |
| max_price | number | Maximum price in selected currency |
| min_price | number | Minimum price in selected currency |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"city": {
"type": "string",
"default": "batumi",
"description": "City name ('batumi' or 'tbilisi')"
},
"page": {
"type": "number",
"default": 1,
"description": "Page number (starting from 1)"
},
"sort": {
"enum": [
"relevance",
"newest",
"cheapest",
"expensive"
],
"type": "string",
"description": "Sort order: 'relevance' (default when query is present), 'newest', 'cheapest', 'expensive'"
},
"limit": {
"type": "number",
"default": 10,
"maximum": 50,
"description": "Max listings to return (max 50)"
},
"query": {
"type": "string",
"description": "Search keywords, e.g. 'monitor 4K', 'router', 'electric heater', 'mechanical keyboard', 'iPhone 15'"
},
"fields": {
"type": "array",
"items": {
"type": "string"
},
"description": "Optional array of field names to return"
},
"intent": {
"enum": [
"WTS",
"WTB",
"GIFT",
"RENT",
"SERVICE"
],
"type": "string",
"default": "WTS",
"description": "Listing intent: 'WTS' (For Sale, default), 'WTB' (Looking to buy), 'GIFT' (Free), 'RENT', 'SERVICE'"
},
"category": {
"type": "string",
"description": "Optional category substring filter (e.g. 'electronics', 'furniture', 'appliances', 'computers', 'transport')"
},
"currency": {
"enum": [
"USD",
"GEL"
],
"type": "string",
"default": "USD",
"description": "Currency for price filter ('USD' or 'GEL')"
},
"max_price": {
"type": "number",
"description": "Maximum price in selected currency"
},
"min_price": {
"type": "number",
"description": "Minimum price in selected currency"
}
}
}| limit | number | Number of listings to return (max 50) |
| query | string | Keywords to search in title, description, street, or amenities (e.g. 'seaview', 'panoramic', 'owner', 'urgent') |
| rooms | number | string | Number of rooms (e.g. 1 for studio/1-room, 2, 3, or comma-separated '2,3') |
| fields | array | Optional array of field names to include in each property object to save context tokens |
| has_gas | boolean | Must have gas connection / gas heating |
| sources | array | Filter by one or more source channels, platforms, portals, or Facebook group URLs. Examples: ['facebook marketplace'], ['ss.ge', 'myhome.ge'], ['https://www.facebook.com/groups/278563704483455/'] |
| currency | string | Currency for price filtering ('USD' or 'GEL') |
| district | string | District name or comma-separated list of districts (e.g. 'Old Batumi,Rustaveli' or 'Saburtalo,Vake') |
| sea_view | string | Sea view filter: 'full' (panoramic), 'partial' (side), 'any' (full or partial), or 'none' |
| deal_type | string | Type of deal: 'sale', 'rent_long' (long-term monthly rent), 'rent_daily' (short-term daily rent), or 'pledge' (mortgage/lease) |
| max_floor | number | Maximum floor number |
| max_price | number | Maximum total price in selected currency |
| min_floor | number | Minimum floor number (e.g. 3) |
| min_price | number | Minimum total price in selected currency |
| complex_id | number | Filter by residential complex ID |
| has_balcony | boolean | Must have balcony |
| seller_type | string | Filter by seller type: 'owner' (direct owner, no commission), 'developer', or 'agent' |
| exclude_orbi | boolean | Exclude high-density Orbi City aparthotel listings |
| has_elevator | boolean | Must have an elevator |
| heating_type | string | Specific heating system type |
| is_furnished | boolean | Furnished status |
| max_area_sqm | number | Maximum area in square meters |
| min_area_sqm | number | Minimum area in square meters |
| pets_allowed | boolean | Pet-friendly rentals |
| max_price_sqm | number | Maximum price per square meter in selected currency |
| min_price_sqm | number | Minimum price per square meter in selected currency |
| property_type | string | Property type filter (defaults to excluding parking) |
| max_year_built | number | Maximum building construction/completion year |
| min_year_built | number | Minimum building construction/completion year (e.g. 2018) |
| is_heritage_zone | boolean | Filter properties located in Cultural Heritage Protection Zone (Old Batumi) |
| has_floor_heating | boolean | Must have underfloor heating |
| renovation_status | string | Filter by condition (comma-separated allowed): 'black_frame' (black box), 'white_frame' (white box), 'green_frame', 'renovated' (turnkey), 'needs_renovation' |
| construction_stage | string | Filter by building stage (comma-separated allowed): 'off_plan' (katlavan / foundation / 2027+), 'under_construction', 'completed' (ready building) |
| near_metro_station | string | Tbilisi metro station name filter |
| no_summer_increase | boolean | Rentals with fixed year-round price (no summer hike) |
| max_distance_to_sea | number | Maximum distance to the sea in meters (e.g. 150 for first line, 500) |
| min_distance_to_sea | number | Minimum distance to the sea in meters |
| max_distance_to_metro | number | Maximum distance to metro in meters (Tbilisi) |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"bbox": {
"anyOf": [
{
"type": "string"
},
{
"type": "array",
"items": {
"type": "number"
}
}
],
"description": "Bounding box rectangle: 'min_lng,min_lat,max_lng,max_lat' or [min_lng, min_lat, max_lng, max_lat]"
},
"city": {
"type": "string",
"default": "batumi",
"description": "City name: 'batumi' or 'tbilisi'"
},
"page": {
"type": "number",
"default": 1,
"description": "Page number (starting from 1)"
},
"sort": {
"enum": [
"newest",
"cheapest",
"expensive",
"cheapest_sqm",
"expensive_sqm",
"area_desc",
"area_asc"
],
"type": "string",
"default": "newest",
"description": "Sort order: 'newest', 'cheapest', 'expensive', 'cheapest_sqm', 'expensive_sqm', 'area_desc', 'area_asc'"
},
"limit": {
"type": "number",
"default": 10,
"maximum": 50,
"description": "Number of listings to return (max 50)"
},
"query": {
"type": "string",
"description": "Keywords to search in title, description, street, or amenities (e.g. 'seaview', 'panoramic', 'owner', 'urgent')"
},
"rooms": {
"type": [
"number",
"string"
],
"description": "Number of rooms (e.g. 1 for studio/1-room, 2, 3, or comma-separated '2,3')"
},
"fields": {
"type": "array",
"items": {
"type": "string"
},
"description": "Optional array of field names to include in each property object to save context tokens"
},
"has_gas": {
"type": "boolean",
"description": "Must have gas connection / gas heating"
},
"sources": {
"type": "array",
"items": {
"type": "string"
},
"description": "Filter by one or more source channels, platforms, portals, or Facebook group URLs. Examples: ['facebook marketplace'], ['ss.ge', 'myhome.ge'], ['https://www.facebook.com/groups/278563704483455/']"
},
"currency": {
"enum": [
"USD",
"GEL"
],
"type": "string",
"default": "USD",
"description": "Currency for price filtering ('USD' or 'GEL')"
},
"district": {
"type": "string",
"description": "District name or comma-separated list of districts (e.g. 'Old Batumi,Rustaveli' or 'Saburtalo,Vake')"
},
"sea_view": {
"enum": [
"none",
"partial",
"full",
"any"
],
"type": "string",
"description": "Sea view filter: 'full' (panoramic), 'partial' (side), 'any' (full or partial), or 'none'"
},
"deal_type": {
"enum": [
"sale",
"rent_long",
"rent_daily",
"pledge"
],
"type": "string",
"description": "Type of deal: 'sale', 'rent_long' (long-term monthly rent), 'rent_daily' (short-term daily rent), or 'pledge' (mortgage/lease)"
},
"max_floor": {
"type": "number",
"description": "Maximum floor number"
},
"max_price": {
"type": "number",
"description": "Maximum total price in selected currency"
},
"min_floor": {
"type": "number",
"description": "Minimum floor number (e.g. 3)"
},
"min_price": {
"type": "number",
"description": "Minimum total price in selected currency"
},
"complex_id": {
"type": "number",
"description": "Filter by residential complex ID"
},
"has_balcony": {
"type": "boolean",
"description": "Must have balcony"
},
"seller_type": {
"enum": [
"owner",
"agent",
"developer",
"all"
],
"type": "string",
"description": "Filter by seller type: 'owner' (direct owner, no commission), 'developer', or 'agent'"
},
"exclude_orbi": {
"type": "boolean",
"description": "Exclude high-density Orbi City aparthotel listings"
},
"has_elevator": {
"type": "boolean",
"description": "Must have an elevator"
},
"heating_type": {
"enum": [
"central",
"gas",
"karma",
"underfloor",
"electric"
],
"type": "string",
"description": "Specific heating system type"
},
"is_furnished": {
"type": "boolean",
"description": "Furnished status"
},
"max_area_sqm": {
"type": "number",
"description": "Maximum area in square meters"
},
"min_area_sqm": {
"type": "number",
"description": "Minimum area in square meters"
},
"pets_allowed": {
"type": "boolean",
"description": "Pet-friendly rentals"
},
"max_price_sqm": {
"type": "number",
"description": "Maximum price per square meter in selected currency"
},
"min_price_sqm": {
"type": "number",
"description": "Minimum price per square meter in selected currency"
},
"property_type": {
"enum": [
"apartment",
"house",
"commercial",
"land",
"residential",
"all"
],
"type": "string",
"description": "Property type filter (defaults to excluding parking)"
},
"max_year_built": {
"type": "number",
"description": "Maximum building construction/completion year"
},
"min_year_built": {
"type": "number",
"description": "Minimum building construction/completion year (e.g. 2018)"
},
"is_heritage_zone": {
"type": "boolean",
"description": "Filter properties located in Cultural Heritage Protection Zone (Old Batumi)"
},
"has_floor_heating": {
"type": "boolean",
"description": "Must have underfloor heating"
},
"renovation_status": {
"type": "string",
"description": "Filter by condition (comma-separated allowed): 'black_frame' (black box), 'white_frame' (white box), 'green_frame', 'renovated' (turnkey), 'needs_renovation'"
},
"construction_stage": {
"type": "string",
"description": "Filter by building stage (comma-separated allowed): 'off_plan' (katlavan / foundation / 2027+), 'under_construction', 'completed' (ready building)"
},
"near_metro_station": {
"type": "string",
"description": "Tbilisi metro station name filter"
},
"no_summer_increase": {
"type": "boolean",
"description": "Rentals with fixed year-round price (no summer hike)"
},
"max_distance_to_sea": {
"type": "number",
"description": "Maximum distance to the sea in meters (e.g. 150 for first line, 500)"
},
"min_distance_to_sea": {
"type": "number",
"description": "Minimum distance to the sea in meters"
},
"max_distance_to_metro": {
"type": "number",
"description": "Maximum distance to metro in meters (Tbilisi)"
}
}
}