# SS.ge Georgia Real Estate Listings (`zinin/ss-ge-tbilisi`) Actor

Pull live real-estate listings straight from SS.ge — Georgia's biggest real-estate classifieds portal — by city, with price in whichever currency (GEL or USD) the seller actually set. No login, no browser, no proxies.

- **URL**: https://apify.com/zinin/ss-ge-tbilisi.md
- **Developed by:** [Tim Zinin](https://apify.com/zinin) (community)
- **Categories:** Real estate
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## SS.ge Georgia Real Estate Listings

Pull live real-estate listings straight from SS.ge — Georgia's biggest
real-estate classifieds portal — filtered by city and deal type. Price comes
back in whichever currency (GEL or USD) the seller actually priced the
listing in — no forced conversion. No login, no API key, no browser needed on
your side.

### What you get

- Title, price with its real currency, rooms, floor area, district/street,
  a short description, preview photos and the direct listing URL for every ad
  found.
- Filter by deal type — sale, rent, or the portal's own unfiltered mix — and
  any SS.ge city (Tbilisi, Batumi, Kutaisi and more).
- Property type included per listing — apartment, private house, commercial
  space or land.
- Runs on Apify: schedule it, monitor it, call it from the API, export to
  JSON/CSV/Excel or push straight into your own pipeline.

### How to run it

1. Click **Try for free** — no card needed on the free plan.
2. Set **City ID** (defaults to `95` = Tbilisi) and, optionally, **Deal type**
   (`any`, `sale` or `rent`).
3. Hit **Start** and pull the results from the dataset (UI, API or webhook).

### Pricing

Pay-per-event: **$0.005 per run start + $0.002 per result**. No monthly seat, no minimum. 100 listings found cost about $0.21 (the one-time start fee plus 100 result rows). Rows where the source returned nothing (an unrecognized
city, a filter combination with zero matching listings, or a request that
failed) are returned for transparency but are **never** charged for.

### Input

| Field | Required | What it does |
|---|---|---|
| `city_id` | no | SS.ge numeric city ID (default `95` = Tbilisi). Known IDs: 95 Tbilisi, 96 Batumi, 97 Kutaisi, 98 Rustavi, 99 Gori, 100 Zugdidi, 101 Poti, 102 Telavi, 19 Mtskheta. An unrecognized ID returns zero listings, not an error. |
| `deal_type` | no | `any` (default, the portal's own unfiltered mix), `sale` or `rent`. |
| `max_items` | no | Total row cap for this run (default 100). |
| `max_pages` | no | How many result pages to walk, 16 listings per page (default 3). |

```json
{
    "city_id": 95,
    "deal_type": "any",
    "max_items": 5,
    "max_pages": 1
}
```

### Output

Real rows from a live Apify run (2026-07-30):

```json
{
    "city_id": 95,
    "deal_type": "sale",
    "found": true,
    "url": "https://home.ss.ge/en/real-estate/4-room-Flat-For-Sale-Saburtalo-36307831",
    "title": "4 room Flat For Sale. Saburtalo",
    "price": 450000,
    "currency": "USD",
    "property_type": "apartment",
    "rooms": 3,
    "area_sqm": 166,
    "location": "Tbilisi, Vake-Saburtalo, Saburtalo, m. asatiani st. 10",
    "lat": null,
    "lng": null,
    "posted_date": "2026-07-30T18:15:13.596342+04:00",
    "description": "An exclusive apartment for sale in the prestigious Tbilisi Gardens residential complex (Block 3).\n\n✅ Area: 165.7 m².\n\n✅ Floor: 15th\n\n✅ Layout: Spacious living room, 3 bedrooms, 2 bathrooms.\n\n✅ Highlights: Sunny side with panoramic views of Vazha-Pshavela. This is a unique opportunity, as this specific floor plan is no longer available directly from the developer.\n\n✅ Condition: Green frame.\n\n✅ Terms: Direct sale from the owner. Offered at an excellent price for this complex.\n\n✅ Full documentatio…",
    "images": [
        "https://static.ss.ge/20260730/6_9a3f65e2-511e-432e-9025-ddfdfed3432e_Thumb.jpg",
        "https://static.ss.ge/20260730/19_e4eb61dc-fa92-4840-a977-c495a7279a45_Thumb.jpg",
        "https://static.ss.ge/20260730/12_08c3c98b-12fe-43c3-9514-ce479e5dcb87_Thumb.jpg",
        "https://static.ss.ge/20260730/16_ae46ef94-355f-42a9-abdf-31ca7d6cf935_Thumb.jpg"
    ],
    "source_portal": "ss-ge",
    "scraped_at": "2026-07-30T14:28:41.605Z",
    "partial": true,
    "partial_reason": "stopped after 2 page(s), 30 item(s) collected — reached this run's own max_pages/max_items limit before the source confirmed (via confirmedEnd) that there is nothing more; there may be additional matching listings beyond what was collected"
}
```

```json
{
    "city_id": 95,
    "deal_type": "rent",
    "found": true,
    "url": "https://home.ss.ge/en/real-estate/1-room-Flat-Daily-rent-Gldani-7893960",
    "title": "1 room Flat Daily rent. Gldani",
    "price": 30,
    "currency": "GEL",
    "property_type": "apartment",
    "rooms": 1,
    "area_sqm": 30,
    "location": "Tbilisi, Gldani-Nadzaladevi, Gldani, A Microdistrict - Gldani  777",
    "lat": null,
    "lng": null,
    "posted_date": "2023-10-09T13:29:06.11419+04:00",
    "description": " Apartment for daily rent in Gldani, 2-3 minutes walk from Akhmeteli metro station (near Akhmeteli theater). In a newly built building, newly renovated, well-furnished, clean and cozy apartment, equipped with all necessary things and hygiene products. Daily price is negotiable.",
    "images": [
        "https://static.ss.ge/20241231/1_35458293-43db-4763-98cf-a29db14dfdd8_Thumb.jpg",
        "https://static.ss.ge/20241231/2_7155f85a-9105-4917-afc9-66b486362d43_Thumb.jpg",
        "https://static.ss.ge/20241231/18_fc20a5e3-7708-4452-9e7c-ef302b77a7ed_Thumb.jpg",
        "https://static.ss.ge/20241231/11_be9abd34-254a-41d6-8c59-5dd5974b39b2_Thumb.jpg"
    ],
    "source_portal": "ss-ge",
    "scraped_at": "2026-07-30T11:03:13.249Z",
    "partial": false,
    "partial_reason": null
}
```

| Field | Meaning |
|---|---|
| `found` | `true` for a real listing row, `false` for a not-found/error row. |
| `deal_type` | On a found row: the listing's OWN actual deal type (`sale` or `rent`) — not an echo of your input filter. Useful when you ran `deal_type: "any"` and need to know which is which. On a not-found/error row: echoes your input filter instead, since there is no listing to report on. |
| `price` / `currency` | The listing's price in whichever currency the seller set (GEL or USD) — not converted. |
| `property_type` | `apartment`, `house`, `commercial` or `land`. |
| `rooms` | Bedroom count; `0` for studios/land, `null` when not stated. |
| `area_sqm` | Floor (or plot) area in square meters. |
| `location` | District, neighborhood and street as shown on the listing. |
| `posted_date` | Full ISO-8601 creation timestamp as SS.ge stores it. |
| `images` | Preview photos shown on the listing card (not the full detail-page gallery). |
| `lat` / `lng` | Not available on list pages — always `null`. |
| `partial` | `true` when this run stopped (hit `max_pages`/`max_items`, or a page failed mid-walk) before the source confirmed there was nothing more to page through; `false` when the source itself confirmed the end of results. |
| `partial_reason` | Plain-English reason when `partial` is `true`; `null` otherwise. |

A not-found row looks like (real output, live run 01.08.2026):

```json
{
    "city_id": 999999,
    "deal_type": "any",
    "found": false,
    "partial": true,
    "partial_reason": "page 1 returned 0 rows with no independent confirmation that the source actually has zero matches — could be a genuine empty result, or an unrecognized/broken page shape",
    "note": "ss.ge did not confirm zero listings for this city_id/deal_type combination — page 1 returned 0 rows with no independent confirmation that the source actually has zero matches — could be a genuine empty result, or an unrecognized/broken page shape",
    "scraped_at": "2026-08-01T05:12:53.758Z"
}
```

### API

Start a run with a bearer token and explicit JSON input:

```bash
curl -sS -X POST 'https://api.apify.com/v2/acts/zinin~ss-ge-tbilisi/runs?waitForFinish=60' \
  -H "Authorization: Bearer $APIFY_TOKEN" \
  -H 'Content-Type: application/json' \
  --data '{"city_id":95,"deal_type":"any","max_items":5,"max_pages":1}'
```

Read Dataset rows using the returned `defaultDatasetId`:

```bash
curl -sS "https://api.apify.com/v2/datasets/$DEFAULT_DATASET_ID/items?clean=true&format=json" \
  -H "Authorization: Bearer $APIFY_TOKEN"
```

### MCP

For an Apify MCP client exposing the standard `call-actor` tool, send this exact payload:

```json
{
  "name": "call-actor",
  "arguments": {
    "actor": "zinin/ss-ge-tbilisi",
    "input": {
      "city_id": 95,
      "deal_type": "any",
      "max_items": 5,
      "max_pages": 1
    }
  }
}
```

### Other tools we built

### Related Actors

Adjacent relocation-and-real-estate signals for the same Tbilisi/Georgia buyer or renter.

| Actor | Use it when |
|---|---|
| [Krisha.kz Kazakhstan Real Estate Listings](https://apify.com/zinin/krisha-kz) | Compare Tbilisi against Kazakhstan's own real-estate market for the same relocation-and-investment corridor. |
| [Jobs.ge Georgia Jobs Scraper](https://apify.com/zinin/jobs-ge) | Someone apartment-hunting in Tbilisi is usually job-hunting too — Jobs.ge is Georgia's equivalent listings site for that half of relocation research. |
| [Emlakjet Istanbul Real Estate Listings](https://apify.com/zinin/emlakjet-istanbul) | Add Istanbul to the same comparison — another regional market with steady CIS/relocation inflow. |
| [Structured Data Extractor](https://apify.com/zinin/structured-extract) | Need the full description, phone number (if published) or exact coordinates? This Actor's own FAQ says list-page data doesn't carry those — run it on each row's `url`. |

### FAQ / Limitations

**Does this need an SS.ge account or API key?** No — it reads the same public
search pages a visitor sees, no login.

**Why is the price sometimes in GEL and sometimes in USD?** Georgian real
estate is priced in both currencies depending on the seller — this Actor
reports the currency the seller actually set (the round, un-converted figure),
not a forced single currency.

**What this is NOT.** This does not fetch the full photo gallery, exact
coordinates, or the seller's phone number from the listing detail page — only
what's shown on the search-results list. It does not guarantee every listing
on SS.ge is returned; pagination stops at `max_pages` / `max_items`.

Found a bug or need a custom variant (a different country's classifieds site,
extra fields)? Open an issue on the Actor page.

### Machine use

The Actor is callable through the Apify API, SDK, and Apify MCP server. The input and Dataset row are the machine-facing contract; `deal_type` on a found row is the listing's own actual value, not an echo of your filter — an agent that ran `deal_type: "any"` must read the row's `deal_type` per item to tell sale from rent, not assume the input value.

# Actor input Schema

## `city_id` (type: `integer`):

SS.ge numeric city ID. Known IDs (verified live 2026-07-30): 95 = Tbilisi, 96 = Batumi, 97 = Kutaisi, 98 = Rustavi, 99 = Gori, 100 = Zugdidi, 101 = Poti, 102 = Telavi, 19 = Mtskheta. An unrecognized ID returns zero listings (not an error) rather than falling back to another city.

## `deal_type` (type: `string`):

Filter by deal type. `any` (default) returns the portal's own unfiltered mix of sale/rent/lease/daily-rent listings for the city. `sale` and `rent` are confirmed live filters (SS.ge's own For-Sale / For-Rent pages); `rent` also covers the portal's separate "Lease" and "Daily rent" categories.

## `max_items` (type: `integer`):

Maximum number of listing rows to return in this run.

## `max_pages` (type: `integer`):

How many result pages (16 listings per page) to walk before stopping.

## Actor input object example

```json
{
  "city_id": 95,
  "deal_type": "any",
  "max_items": 5,
  "max_pages": 1
}
```

# Actor output Schema

## `results` (type: `string`):

API URL for the default dataset items produced by this run.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "city_id": 95,
    "deal_type": "any",
    "max_items": 5,
    "max_pages": 1
};

// Run the Actor and wait for it to finish
const run = await client.actor("zinin/ss-ge-tbilisi").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "city_id": 95,
    "deal_type": "any",
    "max_items": 5,
    "max_pages": 1,
}

# Run the Actor and wait for it to finish
run = client.actor("zinin/ss-ge-tbilisi").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "city_id": 95,
  "deal_type": "any",
  "max_items": 5,
  "max_pages": 1
}' |
apify call zinin/ss-ge-tbilisi --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=zinin/ss-ge-tbilisi",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/tN4vg6KywBPoDZXbZ/builds/ZTal71DZzeX5RU0Bl/openapi.json
