# List.am Scraper | Armenia Real Estate: Sale & Rent, Any URL (`ratatoskr/listam-scraper`) Actor

Scrape list.am property listings as JSON: deal (sale/rent), price, currency, rooms, area, floor, location, seller type, verification and GPS. Paste any category or filtered search URL. No result cap, deduped by id. Optional item-page detail. Include/exclude listing ids. No login.

- **URL**: https://apify.com/ratatoskr/listam-scraper.md
- **Developed by:** [ratatoskr](https://apify.com/ratatoskr) (community)
- **Stats:** 2 total users, 1 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.70 / 1,000 listings

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## List.am Scraper | Armenia Real Estate & Classified Listings

Scrape **list.am**, Armenia's largest classifieds site, as clean structured JSON. Give it a category or **paste any filtered search URL**, and get one row per listing with the deal type, price, currency, size and location. No login, no account.

- **Sale and rent**: any list.am real-estate category (apartments, houses, commercial, land, garages).
- **Paste any search URL**: your price/room/area filters are kept exactly as on the site.
- **No result cap**: the scraper walks every page of a category or search.
- **Deduped by listing id**: overlapping searches never bill you for the same listing twice.

### What you get

One row per listing (the fast card walk):

| Field | Example |
|-------|---------|
| `id` | 22996926 (the listing's stable id) |
| `dealType` | `rent` or `sale` |
| `price` | 420000 |
| `currency` | AMD (also USD, RUB, EUR) |
| `priceFrequency` | monthly (for rentals) |
| `title` | 3 room apartment on Aram Street Lane in the center, 100 sq.m. |
| `rooms` | 3 |
| `areaSqm` | 100 |
| `floor`, `floorTotal` | 4, 5 |
| `location` | Kentron |
| `seller` | `agency` or `private` |
| `verification` | `cadastre`, `unverified`, or null |
| `url` | https://www.list.am/en/item/22996926 |
| `image` | https://img.list.am/g/586/92248586.webp |
| `source` | 56 (the category id or URL the row came from) |

With **Fetch item-page detail** on, each row also carries `description`, `attributes` (floor area, ceiling height, construction type, bathrooms, renovation, …), `amenities` (available only), `photos` and GPS `coordinates` (lat/lng).

#### Example output

One row per listing (the default card walk). Example values; listings change over time.

```json
{
  "id": "995165362",
  "url": "https://www.list.am/en/item/995165362",
  "dealType": "rent",
  "price": 350000,
  "currency": "AMD",
  "priceFrequency": "monthly",
  "title": "2 room apartment on Zavaryan Street in the center, 45 sq.m., 5/9 floor",
  "rooms": 2,
  "areaSqm": 45,
  "floor": 5,
  "floorTotal": 9,
  "location": "Kentron",
  "seller": "agency",
  "verification": "unverified",
  "image": "https://img.list.am/g/308/102578308.webp",
  "source": "56"
}
```

With **Fetch item-page detail** on, each row also carries:

```json
{
  "description": "The apartment is in excellent condition, it is a duplex option, available long term.",
  "attributes": {
    "Floor Area": "100 sq.m.",
    "Number of Rooms": "3",
    "Number of Bathrooms": "2",
    "Construction Type": "Stone",
    "Renovation": "Euro"
  },
  "amenities": ["Fridge", "Stove", "Air conditioner", "Internet"],
  "photos": ["https://img.list.am/f/586/92248586.webp"],
  "coordinates": { "lat": 40.18589, "lng": 44.506402 }
}
```

### Input

| Field | What it does |
|-------|--------------|
| `categoryIds` | Category ids to scrape, e.g. `["56"]` (Apartments for rent) or `["62"]` (For sale). Real-estate ids: 62 For Sale, 63 Long Term Rentals, 56 Apartments, 1377 Houses, 59 Commercial, 270 Land, 175 Garages. |
| `categoryUrls` | Or paste list.am category/search/filter URLs, e.g. `["https://www.list.am/en/category/56?price1=50000&price2=150000"]`. Filters in the URL are kept. Use category ids and/or URLs. |
| `includeIds` | Optional. Return only these listing ids (a whitelist); the walk stops once all are found. |
| `excludeIds` | Optional. Skip these listing ids (a blacklist), e.g. ids from a previous run. |
| `fetchDetails` | Also open each item page for description, attributes, amenities and photos. Richer, but slower and more bandwidth. Off by default. |
| `maxItemsPerCategory` | Stop after this many listings per category. Leave empty for 100; set `100000` for everything a category returns. |
| `maxPages` | Pages to read per category (about 105 listings per page). |
| `proxyCountry` | Residential IP country that clears list.am. Default AM. |

```json
{
  "categoryIds": ["56", "62"],
  "excludeIds": ["22996926"],
  "maxItemsPerCategory": 500,
  "fetchDetails": false
}
```

The category id is the number in a list.am category URL: `https://www.list.am/en/category/56`.

### Output

Each run writes rows to the dataset. Export to JSON, CSV, Excel or the API. Within a run each listing id appears once.

### Pricing

Pay per listing, around **$1 per 1,000 listings** at the free tier and less on paid plans. Listings fetched with item-page detail (`fetchDetails`) are billed at a higher per-listing rate, and a small per-run start fee applies. A run never reads more than its charge limit allows.

# Actor input Schema

## `categoryIds` (type: `array`):

list.am category ids to scrape, e.g. \["56"] (Apartments for rent) or \["62"] (For sale). Real-estate ids: 62 For Sale, 63 Long Term Rentals, 56 Apartments, 1377 Houses, 59 Commercial, 270 Land, 175 Garages. Browse list.am and read the id from the /category/<id> URL. Provide category ids and/or category URLs.

## `categoryUrls` (type: `array`):

Paste any list.am category, search or filtered URL, e.g. "https://www.list.am/en/category/56?price1=50000\&price2=150000". Filters in the URL are kept; the scraper walks every page. Use this to scrape an exact filtered search.

## `includeIds` (type: `array`):

Optional. When set, only these listing ids are returned (a whitelist); the walk stops once all are found.

## `excludeIds` (type: `array`):

Optional. Listing ids to skip (a blacklist), e.g. ids you already have from a previous run.

## `fetchDetails` (type: `boolean`):

Also open each listing's item page for description, full attributes, available amenities and photos. Richer, but much slower and more bandwidth. Leave off for the fast card-only walk (which already has price, rooms, area, floor, location).

## `maxItemsPerCategory` (type: `integer`):

Stops at this many listings per category. Leave empty for 100. Enter a large number (e.g. 100000) to take everything a category returns.

## `maxPages` (type: `integer`):

Safety cap on how many listing pages to walk per category (about 105 listings per page).

## `proxyCountry` (type: `string`):

Optional 2-letter country for the residential IP that clears list.am's Cloudflare check. Leave empty for any country (largest, most reliable pool). list.am does not geo-restrict, so any country works; the Armenian (AM) pool is thin and can be slow.

## Actor input object example

```json
{
  "categoryIds": [
    "56"
  ],
  "fetchDetails": false,
  "maxItemsPerCategory": 100,
  "maxPages": 100,
  "proxyCountry": ""
}
```

# Actor output Schema

## `listings` (type: `string`):

No description

# 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 = {
    "categoryIds": [
        "56"
    ],
    "maxItemsPerCategory": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("ratatoskr/listam-scraper").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 = {
    "categoryIds": ["56"],
    "maxItemsPerCategory": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("ratatoskr/listam-scraper").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "categoryIds": [
    "56"
  ],
  "maxItemsPerCategory": 100
}' |
apify call ratatoskr/listam-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,ratatoskr/listam-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/r5lPDDDOXuQQS6k01/builds/S4ar0CDlepcXNI6F3/openapi.json
