myhome APImyhome.ge ↗
Search, filter, and retrieve real estate listings from myhome.ge. Get prices in USD/GEL, location IDs, property details, images, and coordinates.
What is the myhome API?
The myhome.ge API provides access to Georgian real estate data through 3 endpoints covering listing search, full property details, and the complete location catalog. The search_listings endpoint returns up to 24 listings per page with prices in both USD and GEL, area in square meters, transaction type, and property type. You can filter by city, district, urban area, room count, bedroom count, and price range using IDs from the list_locations endpoint.
curl -X GET 'https://api.parse.bot/scraper/2b407a57-edb5-4aae-b330-6b762bc259b6/search_listings?city_ids=1&deal_types=1&real_estate_types=1' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace myhome-ge-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
"""Walkthrough: myhome.ge Real Estate SDK — browse locations, search, and inspect listings."""
from parse_apis.myhome_ge_api import MyHome, SortField, SortOrder, ListingNotFound
client = MyHome()
# Discover location IDs the search accepts.
city = client.cities.list(limit=3).first()
if city is not None:
print(city.name, f"(city_id={city.city_id})")
for district in city.districts[:3]:
print(f" {district.name} (district_id={district.district_id})")
# Search apartments for sale in the discovered city, cheapest first.
if city is not None:
for hit in client.listing_summaries.search(
city_ids=str(city.city_id),
deal_types="1",
real_estate_types="1",
sort_by=SortField.PRICE,
sort_order=SortOrder.ASC,
limit=5,
):
print(hit.title, f"${hit.price_usd:,.0f}", hit.district)
# Drill down from a search hit to full listing details.
if city is not None:
summary = client.listing_summaries.search(
city_ids=str(city.city_id),
deal_types="1",
limit=1,
).first()
if summary is not None:
listing = summary.details()
print(listing.title, f"${listing.price_usd:,.0f}")
print("condition:", listing.condition, "| build year:", listing.build_year)
print("images:", len(listing.image_urls))
# Point lookup by a known listing ID, with error handling.
if summary is not None:
try:
detail = client.listings.get(listing_id=summary.listing_id)
print(detail.title, detail.rooms, "rooms", detail.area_sqm, "sqm")
except ListingNotFound:
print("listing no longer available")
print("exercised: cities.list / listing_summaries.search / details / listings.get")
Returns one page (24 listings) of myhome.ge real estate search results matching the given filters, plus the total matching count and page boundaries. Each row is one listing with raw numeric prices (USD and GEL), area in square meters, location (city, district, sub-district/urban area, street address), nearest metro station, building status, room and bedroom counts, seller type (Private, Agency, Developer) and the published/last-updated timestamp. Fields the site does not provide for a listing are null; in particular `condition` (Black frame, White frame, Green frame, Renovated, ...) is not part of the site's search results and is always null here — call get_listing for it. All filters are optional and combine with AND; multi-value filters take comma-separated IDs. Location IDs come from list_locations. Default ordering is newest first. Pagination: `page` (1-based, default 1); `has_more` is true while further pages exist, and a page past the end returns an empty `listings` array. Two upstream calls per invocation.
| Param | Type | Description |
|---|---|---|
| page | integer | 1-based page number; 24 listings per page. |
| rooms | string | Comma-separated room-count type IDs as used by the site's Rooms filter: 1-5 = that many rooms, 7 = 6, 8 = 7, 9 = 8, 10 = 9, 11 = 10+. |
| sort_by | string | Sort field. |
| bedrooms | string | Comma-separated bedroom-count IDs: 1-9 = that many bedrooms, 10 = 10+. |
| city_ids | string | Comma-separated city IDs from list_locations.cities[*].city_id (e.g. 1 for Tbilisi). Omitted = all of Georgia. |
| currency | string | Currency in which price_from/price_to are interpreted. |
| price_to | integer | Maximum total price, in the unit selected by currency. |
| urban_ids | string | Comma-separated urban-area (sub-district) IDs from list_locations.cities[*].districts[*].urbans[*].urban_id. |
| deal_types | string | Comma-separated transaction type IDs: 1 = For Sale, 2 = For Rent, 3 = Lease, 7 = Daily rent, 10 = By leased (land only). Omitted = all. |
| price_from | integer | Minimum total price, in the unit selected by currency. |
| sort_order | string | Sort direction. |
| seller_type | string | Restrict to listings posted by private owners or by developers (the site's Owner / Construction company checkboxes). Omitted = all sellers including agencies. |
| district_ids | string | Comma-separated district IDs from list_locations.cities[*].districts[*].district_id. |
| building_statuses | string | Comma-separated building status IDs: 1 = Old building, 2 = New building, 3 = Under construction (other IDs exist for plots/commercial). Omitted = all. |
| real_estate_types | string | Comma-separated property type IDs: 1 = Apartment, 2 = Private house, 3 = Country house, 4 = Plot, 5 = Commercial area, 6 = Hotel. Omitted = all. |
{
"type": "object",
"fields": {
"page": "requested page number",
"total": "total number of listings matching the filters (site count)",
"has_more": "true when a following page exists",
"listings": "array of listing objects: listing_id (string, use with get_listing), title, real_estate_type, transaction_type, price_usd, price_gel, price_per_sqm_usd, price_per_sqm_gel (raw numbers), price_negotiable, area_sqm, yard_area_sqm, city, district, sub_district, street_address, nearest_metro (null when none), building_status, condition (always null in search results), rooms, bedrooms, floor, total_floors, seller_type (Private/Agency/Developer), seller_name, published_date (site-local 'YYYY-MM-DD HH:MM:SS' last-updated timestamp), is_vip, image_url, url",
"per_page": "listings per page (24)",
"last_page": "number of the last available page"
},
"sample": {
"data": {
"page": 1,
"total": 75614,
"has_more": true,
"listings": [
{
"url": "https://www.myhome.ge/en/real-estate/5-room-apartment-for-sale-in-saburtalo-26101061",
"city": "Tbilisi",
"floor": 25,
"rooms": 5,
"title": "5 room apartment for sale in saburtalo",
"is_vip": true,
"area_sqm": 201,
"bedrooms": 4,
"district": "Vake-Saburtalo",
"condition": null,
"image_url": "https://static-statements.tnet.ge/uploads/202609/20260919/statements/3Eohg1d6aae9527219c7.webp",
"price_gel": 1407834,
"price_usd": 540000,
"listing_id": "26101061",
"seller_name": "Nika",
"seller_type": "Agency",
"sub_district": "Saburtalo",
"total_floors": 31,
"nearest_metro": "Delisi",
"yard_area_sqm": null,
"published_date": "2026-09-19 18:05:53",
"street_address": "Asatiani M. Street 10",
"building_status": "New building",
"price_negotiable": false,
"real_estate_type": "Apartment",
"transaction_type": "For Sale",
"price_per_sqm_gel": 7004,
"price_per_sqm_usd": 2687
}
],
"per_page": 24,
"last_page": 3151
},
"status": "success"
}
}About the myhome API
Searching Listings
The search_listings endpoint accepts a wide set of filters: city_ids, district_ids, and urban_ids (all sourced from list_locations), plus rooms, bedrooms, price_from, price_to, currency, sort_by, and a 1-based page parameter. Each call returns up to 24 listing objects alongside total (the full match count), last_page, and has_more. Each listing row includes a listing_id string, title, real_estate_type, transaction_type, price_usd, price_gel, and area in square meters.
Full Listing Details
get_listing takes a single listing_id (as returned by search_listings) and returns every search-result field plus additional detail: condition (e.g. Green frame, Newly Renovated, Black frame), build_year band, ceiling_height_m, latitude/longitude, image_urls (array of full-size image URLs), the seller's free-text description, and both created_date and published_date timestamps in YYYY-MM-DD HH:MM:SS format.
Location Catalog
list_locations returns the complete hierarchical location tree: cities with their city_id and name, each containing districts (with district_id) and each district's urbans (sub-districts with urban_id). These IDs map directly to the filter parameters in search_listings. Cities outside major municipalities may have no districts, and districts may have no urban subdivisions.
Coverage and Scope
All data reflects myhome.ge, Georgia's primary real estate portal, covering residential and commercial listings across the country. Listings span sales and rentals. The location catalog covers all Georgian cities indexed by the site, and the search results reflect the site's own total count for any given filter combination.
The myhome API is a managed, monitored endpoint for myhome.ge — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when myhome.ge 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 myhome.ge 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 property price tracker that monitors USD and GEL prices for Tbilisi apartments by district over time.
- Aggregate room-count and price distributions across urban areas to generate neighborhood-level market reports.
- Feed listing coordinates from
get_listinginto a map interface to visualize Georgian real estate inventory geographically. - Extract
conditionandbuild_yearfields fromget_listingto filter newly renovated properties in specific cities. - Sync myhome.ge listing data into a CRM or lead-generation pipeline using
listing_idas a stable identifier. - Use
list_locationsto populate city and district dropdowns in a property search UI without hardcoding IDs. - Compare price-per-square-meter across urban sub-districts by combining
search_listingsarea and price fields.
| 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 myhome.ge have an official developer API?+
How does pagination work in search_listings, and what is the maximum page size?+
search_listings returns exactly 24 listings (per_page: 24). The response includes total (the full match count), last_page (the highest valid page number), and has_more (a boolean). Pass the page parameter (1-based) to step through results. There is no option to increase the page size beyond 24.Does the API return contact details or phone numbers for listing sellers?+
search_listings or get_listing responses. You can fork this API on Parse and revise it to add a seller-contact endpoint if that data is accessible on the listing page.What interior condition values can appear in get_listing?+
condition field in get_listing reflects the seller-selected condition label from the site: common values include Black frame, White frame, Green frame, and Newly Renovated. The field is nullable — if the seller did not specify a condition, it returns null.Does the API cover rental listings in addition to sales?+
transaction_type field in search_listings and get_listing distinguishes sales from rentals. You can filter by transaction type when calling search_listings to target one or the other. However, short-term or daily rental listings are not guaranteed to be distinct from long-term rentals at the API level — filtering by transaction type returns whatever the site categorizes under that type. You can fork this API on Parse and revise it to add a dedicated short-term rental filter endpoint if needed.