# Avito.ru Listings Scraper (`nice_dev/avito-listings-scraper`) Actor

Scrape Avito.ru classifieds by keyword, city, category or search URL: price, GPS, metro, seller type and rating, date, photos, promotions. Filter private / company sellers and dates; only new listings. Export to JSON, CSV or Excel.

- **URL**: https://apify.com/nice_dev/avito-listings-scraper.md
- **Developed by:** [Nice Dev](https://apify.com/nice_dev) (community)
- **Categories:** E-commerce, Real estate, MCP servers
- **Stats:** 4 total users, 0 monthly users, 97.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.24 / 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

### 🛒 What is Avito.ru Listings Scraper?

**Avito.ru Listings Scraper** extracts **classified listings from [Avito.ru](https://www.avito.ru)**, Russia's largest classifieds site: **title, price, address, GPS coordinates, metro stations, seller (private or company, rating, reviews), publication date and photos**, for any keyword, city, category or search URL. It works as an **Avito API alternative**: run it on a schedule, call it from your code, or plug it into Make, Zapier or n8n.

Type a **keyword** (`iphone`), pick a **city** and a **category**, click **Start**, and download the listings in JSON, CSV or Excel. No login, no Avito account, nothing to set up. Tick **Extract details** to also get the full description, every characteristic of the item, views and seller details.

### 📋 What data can you extract from Avito.ru?

One item per listing, 66 fields:

| Category                | What you get                                                                                                                                   |
| ----------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- |
| 🏷️ **Listing**          | title, link, Avito id, category, rank in the search — `iPhone 17, 256 ГБ, SIM + eSIM`                                                          |
| 💰 **Price**            | price in roubles and as written, old price and discount, "price lowered" mark, price per square metre — `70990 RUB`                            |
| 📍 **Location**         | city, street address, GPS latitude and longitude, nearby metro stations with distance and walking time                                         |
| 👤 **Seller**           | name, private seller or company / agency / developer, rating out of 5, number of reviews, profile link, logo                                   |
| 📝 **Text and photos**  | short description, photos, number of photos, video or not                                                                                      |
| ✅ **Marks**            | verified listing, reserved, new item, Avito Delivery, paid promotion and its names, call button shown                                          |
| 🕒 **Dates**            | publication date (ISO) and the date as the site writes it                                                                                      |
| 🔎 **With details**     | full description (text and HTML), all characteristics, every photo, views (total and today), status, end date, seller since, badges, shop, masked phone, model rating (the market price estimate is a separate option, see below) |

Every field, with an example, is listed in the **Output** section below.

Fields marked **(detail)** in the Output tab are filled when **Extract details** is on (off by default). Left off, the run reads only the results pages: faster and cheaper.

### ✅ Why use Avito.ru Listings Scraper?

- 👤 **Private or company sellers**: keep only private sellers, or only companies, shops, agencies and developers. Checked on every listing, even on a search URL you paste.
- 📍 **Really local results**: Avito mixes listings from other cities into a search (a few per page, a whole page for a small town with few matches); tick **Searched place only** to drop them.
- 📅 **Date filters**: `postedAfter: "7 days"` — filtered-out listings are not saved and never count in `maxItems`.
- 🔔 **Monitoring built in**: tick **Only new listings**, schedule the Actor, and each run returns (and charges) only what it has never delivered before.
- 🗺️ **GPS, address and metro from the results page**, with the seller's rating and number of reviews: no extra page needed.
- 🗂️ **Several searches in one run**: keywords × locations, with a cap per search so that one big city cannot eat the whole budget.
- 🔌 API, scheduling, integrations (Make, Zapier, n8n, Google Sheets…) and JSON/CSV/Excel export via the Apify platform.

### 🚀 How to scrape Avito.ru

1. Create a free Apify account.
2. Open **Avito.ru Listings Scraper**, type a **Search keyword** (e.g. `iphone`), a **Location** (`moskva`, `Moscow` or `Москва`) and, if you want, a **Category**.
3. Or paste your own Avito.ru URLs into **Start URLs**: any search results page (all filters set on the site are kept, pagination is automatic) or single listing pages.
4. Set **Max listings** (100 by default, 0 = no limit) — and **Max listings per search** when you run several searches — then click **Start**.
5. Download the dataset in JSON, CSV, Excel or via API.

### 💰 How much does it cost to scrape Avito.ru?

This Actor uses **pay per event** pricing: a price per listing saved, plus a small fee per run start.

| Apify plan | Listing | Listing with full details | Market price estimate | Listing dropped by a filter |
| --- | --- | --- | --- | --- |
| Free | **$0.27** | **$1.79** | **$0.089** | **$0.118** |
| Bronze | $0.26 | $1.69 | $0.088 | $0.108 |
| Silver | $0.25 | $1.59 | $0.087 | $0.098 |
| Gold | $0.24 | $1.29 | $0.086 | $0.088 |

Prices per 1,000, plus **$0.01 per run start** ($1 per 100 runs). Example on the Free plan: 1,000 listings ≈ $0.28; 1,000 listings with their full details ≈ $2.50.

With **Extract details**, each listing whose page is opened costs the **Listing with full details** price instead of the **Listing** price (it replaces it, it is not added to it). Tick **Include market price** (off by default; needs **Extract details** or a listing URL) to also get Avito's market price estimate on the listings that show one (some cars and real estate): it is billed per listing that has an estimate, on top of the listing price, and never for a listing without one. Filters the site does not offer are applied by the Actor on every listing it reads: a listing you keep costs its normal price, a listing a filter drops is not saved and costs only the filter fee shown in the Pricing tab. Platform usage (compute, Russian proxy) is included in the price.

### ⚙️ Input

```json
{
    "query": "iphone",
    "location": "moskva",
    "category": "telefony",
    "maxItems": 200
}
```

Several searches, a cap per search, private sellers only, only recent listings, only the ones not delivered before:

```json
{
    "searchQueries": ["iphone 15", "iphone 16"],
    "locations": ["moskva", "sankt-peterburg"],
    "maxItemsPerQuery": 50,
    "sellerType": "private",
    "postedAfter": "7 days",
    "onlyNew": true,
    "stateKey": "iphones-ru"
}
```

Or with your own URLs:

```json
{
    "startUrls": [
        { "url": "https://www.avito.ru/moskva/telefony?q=iphone&s=104" },
        { "url": "https://www.avito.ru/moskva/telefony/iphone_17_256_gb_sim_esim_8214878882" }
    ],
    "extractDetails": true,
    "maxItems": 500
}
```

| Field                                                                                   | Notes                                                                                                                                                                                                                                                                                   |
| --------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `query`, `searchQueries`                                                                | Free-text search, exactly as typed on the site (`iphone`, `диван`); `searchQueries` adds more keywords (one search each). Give a keyword, a category or start URLs: Avito shows no listings for a place alone, so a run with none of them is refused.                                                                                                            |
| `location`, `locations`                                                                 | City or region: the Avito slug (`moskva`, `sankt-peterburg`, `kazan`, `all` = the whole of Russia) or a known name (`Moscow`, `Москва`). Empty = the whole of Russia. Every keyword is searched in every location (max 500 searches per run).                                           |
| `category`                                                                              | One of 59 Avito categories, as in the site address after the city (`telefony`, `kvartiry/prodam`, `avtomobili`). Any other category: paste its search URL in `startUrls`. A department without a keyword (`transport`, `zhivotnye`) in the default order is read sorted by date (Avito shows a showcase page there, not listings); with a sort chosen it is read in that order.                                                                                                                |
| `startUrls`                                                                             | Search results pages (filters kept, pagination automatic) or single listing pages, up to 1,000. They replace the search fields, the sort and the price and delivery filters; seller type and searched-place filters, the Filters section, caps and monitoring still apply. A single listing page is always read in full and billed at the with-details price.               |
| `extractDetails`                                                                        | Open each listing page for the full description, all characteristics, all photos, views and seller details (default off; a listing read this way is billed at the with-details price instead of the base price, see Pricing).                                                                                                                              |
| `includeMarketPrice`                                                                    | Paid option, off by default: Avito's market price estimate (some cars and real estate), read on the listing page, so it needs `extractDetails` or a listing URL in `startUrls` (otherwise it is ignored and said so in the log). Billed per listing that has an estimate, on top of its price, see Pricing. Unticked, the market price column stays empty. |
| `maxItems`                                                                              | Stop after this many listings for the whole run (`0` = unlimited).                                                                                                                                                                                                                       |
| `maxItemsPerQuery`                                                                      | Cap for EACH search (keyword × location, or search URL). 0 = no per-search cap.                                                                                                                                                                                                         |
| `sort`                                                                                  | Order of the results: `relevance` (site default), `newest`, `cheapest`, `expensive`, `discount`. With `postedAfter` or `onlyNew`, the default order becomes newest first (a URL pasted in `startUrls` keeps its own order).                                                                                                               |
| `sellerType`, `priceMin`, `priceMax`, `withDeliveryOnly`, `localOnly`                   | Site filters: `private` sellers or `company` (companies, shops, agencies, developers); price range in roubles; Avito Delivery only; only listings located in the searched city (a region keeps all its listings).                                                                                                          |
| `postedAfter`, `postedBefore`                                                           | Publication date range: `2026-10-01`, or a period before now (`7 days`, `2 weeks`, `1 month`, `24 hours`).                                                                                                                                                                              |
| `excludeKeywords`                                                                       | Drop the listings whose title or description contains one of these words (case and accents ignored), e.g. `case`, `broken`.                                                                                                                                                             |
| `verifiedOnly`, `withPhotosOnly`, `minRating`                                           | Only listings Avito marks as verified; only listings whose search result shows at least one photo; only sellers rated at least this (0-5 stars), sellers without a rating dropped.                                                                                                      |
| `onlyNew`, `stateKey`, `resetState`                                                     | Monitoring: only the listings never delivered under this memory key; `resetState` forgets the memory.                                                                                                                                                                                  |
| Advanced                                                                                | `proxyConfiguration` (Russian IPs included in the price, keep the default), `maxConcurrency`, `maxRequestsPerMinute`, `minRequestIntervalMs`, `maxRequestRetries`, `debugLog`.                                                                                                         |

### 📦 Output

A listing read with **Extract details** on (shortened: some fields and photos left out):

```json
{
    "id": "8214878882",
    "url": "https://www.avito.ru/moskva/telefony/iphone_17_256_gb_sim_esim_8214878882",
    "title": "iPhone 17, 256 ГБ, SIM + eSIM",
    "price": 70990,
    "currency": "RUB",
    "priceText": "70 990",
    "priceWasLowered": false,
    "categoryName": "Телефоны",
    "categorySlug": "telefony",
    "city": "Москва",
    "address": "Москва, ул. Земляной Вал, 14/16",
    "latitude": 55.760894,
    "longitude": 37.656946,
    "images": [
        "https://30.img.avito.st/image/1/1.Hamq87a_p0C8VXNBnKs4rZFTs0ASShNH3FNNQeJTTUEcUA.CNckJNL5GBh9G6HeNjWdt9sR-KsnhleCl9TQOJfii2Q"
    ],
    "sellerName": "BAZA",
    "sellerType": "company",
    "sellerTypeText": "Компания",
    "sellerUrl": "https://www.avito.ru/brands/bazaplay",
    "sellerRating": 5,
    "position": 3,
    "sellerSince": "апреля 2021",
    "sellerBadges": ["Данные подтверждены", "Есть сообщество ВК"],
    "badges": ["Рыночная цена"],
    "sellerReviewsCount": 15703,
    "hasPhone": true,
    "isPromoted": false,
    "publishedAt": "2026-10-10T16:15:00.000Z",
    "publishedAtText": "10 октября в 19:15",
    "searchQuery": "iphone",
    "searchUrl": "https://www.avito.ru/moskva/telefony?q=iphone",
    "attributes": [{ "name": "Производитель", "value": "Apple", "attributeId": 110618 }],
    "viewsTotal": 20344,
    "viewsToday": 120,
    "shopName": "BAZA",
    "isCompany": true,
    "status": "active",
    "expiresAt": "2026-11-09T16:15:36.000Z",
    "breadcrumbs": ["Электроника", "Телефоны", "Apple", "Мобильные телефоны"],
    "phoneMask": "8 958 XXX-XX-XX",
    "modelRating": 4.7,
    "modelReviewsCount": 39,
    "scrapedAt": "2026-10-15T16:24:50.135Z"
}
```

You can download the dataset in various formats such as JSON, HTML, CSV or Excel.

#### All 66 fields

Texts are in Russian, as the site writes them.

| Fields                                                                                          | What you get                                                                                                                                                         |
| ----------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `id`, `url`, `title`, `position`                                                                | **Listing**: Avito id, link without tracking parameters, title, rank in its search (1 = first result of page 1; null for a pasted listing URL)                        |
| `price`, `currency`, `priceText`                                                                | **Price**: `70990`, `RUB`, `70 990` as written (null price: negotiable, free)                                                                                         |
| `priceWithoutDiscount`, `discountPercent`, `priceWasLowered`, `normalizedPrice`                 | old price and discount when shown, "price lowered" mark, price per unit as written (per m² in real estate)                                                           |
| `categoryId`, `categoryName`, `categorySlug`, `microCategoryId`                                 | `84`, `Телефоны`, `telefony`, Avito's sub-category id                                                                                                                 |
| `locationId`, `city`, `address`, `latitude`, `longitude`                                        | **Location**: Avito id of the city or region, city, street address, GPS coordinates                                                                                   |
| `metroStations`                                                                                 | `[{ "name": "Горный институт", "distance": "700 м", "walkTime": "11–15 мин." }]`, empty when none                                                                     |
| `description`, `images`, `imageCount`, `hasVideo`                                               | **Text and photos**: short preview (the full text with details), photos of the results card (largest size), number of photos, video or not                          |
| `sellerName`, `sellerType`, `sellerTypeText`, `sellerUrl`, `sellerLogo`                         | **Seller**: name, `private` / `company` / `agency` / `developer` (from the site's own word), that word in Russian, profile link, logo                               |
| `sellerRating`, `sellerReviewsCount`                                                            | `4.8` out of 5, `50` reviews                                                                                                                                          |
| `isVerified`, `isReserved`, `isNew`, `deliveryAvailable`, `hasPhone`, `isPromoted`, `promotions` | **Marks**: true / false; `promotions` = names of the paid promotions (`Продвинуто`)                                                                                  |
| `attributesText`                                                                                | short parameters line of the card (`Новый`, year, area, rooms…)                                                                                                       |
| `publishedAt`, `publishedAtText`                                                                | **Dates**: `2026-10-10T16:15:00.000Z` (date of the last publication or renewal on Avito, what the date filters read), `10 октября в 19:15` as written                  |
| `searchQuery`, `searchUrl`, `scrapedAt`                                                         | keyword and results page that found the listing (null for a pasted listing URL), extraction time                                                                     |
| `descriptionHtml`, `attributes`, `allImages`                                                    | **(detail)** full description with its formatting, all characteristics (`name`, `value`, `attributeId`), every photo                                                |
| `viewsTotal`, `viewsToday`, `status`, `expiresAt`, `breadcrumbs`                                | **(detail)** `20344` views, `120` today, `active` / `closed` / `archived`, end of display, category path                                                             |
| `sellerId`, `sellerUserKey`, `sellerSince`, `sellerBadges`, `badges`, `shopId`, `shopName`, `isCompany` | **(detail)** seller ids, member since (`апреля 2021`), seller and listing badges, shop, company or not                                                        |
| `phoneMask`, `phoneIsCallTracking`                                                              | **(detail)** masked number as shown before calling (`8 958 XXX-XX-XX`), call tracking number or not — the full number is not given                                  |
| `modelRating`, `modelReviewsCount`, `marketPrice`                                               | **(detail)** rating and reviews of the item model, Avito's market price estimate (some cars and real estate), with **Include market price**; `null` otherwise                                                        |

### 💡 Tips

#### How to get more results

Avito serves at most 30 pages of 50 listings (about 1,500) for a search in one city or region, and 100 pages (about 5,000) for the whole of Russia, even when it counts many more. The Actor reads every page Avito gives; to go past that, split the search: several cities in **More locations**, price ranges with `priceMin` / `priceMax` (one run or one search URL per range), or narrower categories. Set `maxItems` to `0` for no limit.

#### How to reduce costs

The price is per listing, so the levers are `maxItems`, `maxItemsPerQuery`, the filters (a filtered-out listing costs only the filter fee) and `onlyNew` for recurring runs (you never pay twice for the same listing). Leave `extractDetails` off when the results-page fields are enough (a listing read with its page is billed at the with-details price): GPS, address, metro, seller rating and the publication date are already there.

#### Several searches in one run

Fill `searchQueries` and / or `locations`: the Actor runs one search per keyword × location (3 keywords × 4 cities = 12 searches, up to 500 per run). The single `query` and `location` fields still work and are added to the lists. A listing found by several searches is saved — and charged — once. Set `maxItemsPerQuery` to give every search its own cap: without it the first searches can use up the whole `maxItems` budget. You can also paste several search URLs into `startUrls`: each one is a search of its own, with the same cap.

#### Monitoring: only the new listings

Tick **Only new listings** (`onlyNew`) and schedule the Actor. The first run returns everything; each later run skips the listings already delivered: they are not saved, not charged, and their page is not even opened. The memory lives in a named key-value store of your account (`avito-listings-scraper-seen`, up to 150,000 listings per key) and is only updated with listings that really reached the dataset, so a failed run never hides anything. Give each schedule its own `stateKey` (two schedules sharing a key would hide each other's listings), and tick `resetState` once to start over. Searches built from the search fields are then sorted by newest (unless you chose another order). A newest-first search stops once it meets 250 listings in a row you already have; under a cap below 250 (**Max listings** or `maxItemsPerQuery`), once 80% of that cap are listings you already have (or 80% of what your earlier runs delivered for that search, if fewer). Promoted listings are not counted. A search URL pasted in `startUrls` keeps its own order: choose «По дате» (by date) on Avito before copying it, or add `s=104` to it, to get this early stop.

#### Filter by publication date

`postedAfter` and `postedBefore` take a date (`2026-10-01`, the whole day is included, Moscow time) or a period before now (`7 days`, `2 weeks`, `1 month`; via the API also `24 hours` or a full ISO date-time). The filter reads `publishedAt`, the date of the last publication or renewal on Avito, which moves forward when the seller republishes or renews the listing; it works on a pasted listing URL too. A listing without a publication date is dropped as soon as a date bound is set. Filtered-out listings are not saved and do not count in `maxItems` (each listing dropped costs the filter fee, see Pricing); the run summary tells how many were filtered. With `postedAfter`, searches built from the search fields are sorted by newest (unless you chose another order) and stop at the first page that is entirely too old; a search URL pasted in `startUrls` does so only if it is sorted by date (choose «По дате» on Avito before copying it, or add `s=104`).

#### Private or company sellers

`sellerType: "private"` keeps the private sellers, `"company"` the companies, shops, agencies and developers. The type comes from the word Avito writes on the listing card (`Компания`, `Агентство`, `Застройщик`, `Автодилер`); a seller without such a word is a private person, except in rubrics whose cards never write that word (services: their second line is the specialty), where the type stays empty unless the search itself was limited to one type or the listing page is opened (`extractDetails`). The Actor checks it on every listing, so the filter also works on a search URL you paste; a listing whose card shows no seller at all is kept.

### 🔌 Integrations and API

Call the Actor via the Apify API, the JavaScript or Python clients, or connect it with integrations and webhooks (Make, Zapier, n8n, Google Sheets, Slack, Airtable…). The dataset can be fetched as JSON or CSV from any tool.

### 🤖 Use with AI agents (MCP)

AI agents (Claude, ChatGPT, Cursor…) can find and run this Actor through the [Apify MCP server](https://mcp.apify.com), billed to their Apify account like any run. It returns one item per Avito.ru listing. Actor id: `nice_dev/avito-listings-scraper`; MCP server with this Actor only: `https://mcp.apify.com/?tools=fetch-actor-details,nice_dev/avito-listings-scraper`.

Smallest input, for a cheap first call:

```json
{
    "query": "iphone",
    "location": "moskva",
    "maxItems": 10
}
```

Key output fields: `url`, `title`, `price`, `address`, `sellerType`, `sellerRating`, `publishedAt`, and `description` in full with `extractDetails`.

Cost: pay per event, per listing saved plus a fee per run start, see the pricing section above. Cap each call with `maxItems` and, through the API, with the run option `maxTotalChargeUsd`.

### ❓ FAQ

#### Is it legal to scrape Avito.ru?

The Actor only reads what Avito.ru shows publicly to any anonymous visitor in Russia. It logs in to nothing and needs no account or cookie from you. Results contain personal data (the names private sellers show, their ratings), which is protected by the Russian personal data law (Federal Law No. 152-FZ) and, for some users, by GDPR: do not store or use it without a legitimate reason. You are responsible for using the data in compliance with Avito.ru's Terms of Use and applicable law. This Actor is not affiliated with Avito.

#### Does it need a login or a proxy?

No login. Avito.ru opens only to Russian IP addresses: the Actor uses Russian IPs, included in the price — leave the default proxy setting (a proxy group, a country or **No proxy** chosen in the form is ignored). If you use your own proxies, they must be Russian. A request the site turns away is retried on a new proxy session, up to 10 times on top of the retries (outside the Apify platform without any proxy, after a pause of 5 seconds, doubled at each retry up to 150 seconds).

**Apify free plan:** the included proxy is for paying Apify plans only. On the free plan, add your own proxy URLs in **Proxy configuration**; without them the run stops at once with a message saying so.

#### Is the data safe to open in Excel or to show on a web page?

Titles and descriptions are the sellers' own words, copied as they are. A text can begin with `-`, `+`, `=` or `@` (a title such as `-20% today`): Excel and Google Sheets may read such a cell of a CSV file as a formula or as a number. The Actor leaves the text as it is, so that the JSON and the API give the real value: when you open a CSV, import these columns as text. On a web page, escape every field like any text written by a stranger; `descriptionHtml` is the seller's formatted text without its scripts, not a sanitized HTML: clean it before showing it.

#### Known limitations

- Avito serves at most about 1,500 listings per search in a city or region (about 5,000 for the whole of Russia): split big searches by location, price range or category (see Tips).
- Site filters that are not in the input can still be used by pasting a filtered search URL into `startUrls`.
- The full description, all characteristics, every photo, views and the seller's details come from the listing page: they are `null` (or empty) when `extractDetails` is off.
- The phone number is not given: only whether the seller shows a call button (`hasPhone`) and, with details, the masked number.
- `publishedAtText` is empty on most listings read from the results page (the site hides the relative date there); `publishedAt` is filled from the results page for every listing a search finds, and for a listing URL pasted in `startUrls` from the listing page (`null` in the rare case the page does not let the date be told). It is the date of the last publication or renewal on Avito, not always the first publication.
- `onlyNew` remembers listing ids, not their content: a listing whose price changed is not returned again.
- Two runs sharing the same `stateKey` at the same time may both return the same new listing.

**A run that reaches its timeout** stops itself about 45 seconds before it: no new page is asked, what it read is saved and, with `onlyNew`, remembered, and the run ends *Succeeded* with "Stopped before the run's timeout". Resurrect it to go on from there, or give the next run a longer timeout (Run options).

**A run the platform stops without warning** (out of memory)

- Resurrect it: it goes on from where it stood at most a minute before the stop. What it had read since is read again, and the listings already saved are skipped: none is delivered or charged twice, and `maxItems` still counts them.
- With `onlyNew`, the memory is saved after each write (at most once every 2 seconds): resurrect the stopped run and the listings it had saved meanwhile join the memory; leave it stopped for good, and the next run may return the listings of its last 2 seconds once more.

#### Something doesn't work?

The last line of the log counts the listings saved, filtered out and no longer on Avito.ru (removed while the run was reading them), and the requests that failed after every retry. Those requests and the removed listings are listed, with the reason, in the `FAILED_REQUESTS` record of the run's key-value store. A run that saved nothing and had failed requests fails, and its last message gives the cause (a location slug or a search URL that does not exist says so, instead of "run it again").

If Avito.ru changes its pages, you are told instead of paying for blank rows. A results page that counts listings but gives none the Actor can read is an error (listed in `FAILED_REQUESTS`), never a quiet "No listings found". If the first 20 listings read all lack their title, price (a hidden price such as "negotiable" or "free" does not count), publication date or — with `extractDetails` — description, the run saves nothing more, stops and fails, and its last message names the missing field: at most those first listings are charged. A listing that `postedAfter` / `postedBefore` drops because it has no date at all counts among those 20. A run of fewer listings (a scheduled `onlyNew` run that finds a few new ones, a small **Max listings**) is checked at its end, from 5 listings: its listings are already saved, and the run fails with the missing field instead of ending green.

### 🛟 Support

Open an issue in the **Issues** tab with a link to your run: the run log and the `FAILED_REQUESTS` record of the key-value store show exactly which URLs failed and why.

# Actor input Schema

## `startUrls` (type: `array`):

Avito.ru search-result URLs (all filters set on the site are kept, pagination is automatic), e.g. `https://www.avito.ru/moskva/telefony?q=iphone`, or single listing URLs (`https://www.avito.ru/moskva/telefony/iphone_12_mini_128_gb_2_sim_8378800507`). When this list is not empty, the search fields below (keywords, locations, category, sort) and the price and delivery filters are ignored: set them on the site before copying the URL. **Seller type** and **Searched place only** still apply, checked on each listing, as do the Filters section, the caps and monitoring. A listing URL is always read as a listing page, whatever 'Extract details' says: its row is complete and charged at the details price (see the Pricing tab). Max 1 000 URLs.

## `query` (type: `string`):

Free-text search, exactly as typed on the site (e.g. `iphone`). Give a keyword, a category or start URLs: Avito shows no listings for a place alone, so a run with none of them is refused.

## `searchQueries` (type: `array`):

Several keywords in one run: one search per keyword (times each location below). Added to **Search keyword**; listings found by several searches are saved once.

## `location` (type: `string`):

City or region: the Avito slug (`moskva`, `sankt-peterburg`, `kazan`, `all` = the whole of Russia) or a known name in Russian or English (`Москва`, `Moscow`). Empty = the whole of Russia. A name this Actor does not know and that is not written as a slug (lower-case letters, digits, hyphens and underscores, such as `nizhniy_novgorod`) is refused at the start, with a clear message; a slug Avito does not know fails its search at once, named in the log.

## `locations` (type: `array`):

Several locations in one run: every keyword is searched in every location (3 keywords × 4 locations = 12 searches, max 500). Added to **Location**.

## `category` (type: `string`):

Avito category, as in the site address after the city (`telefony` = `avito.ru/moskva/telefony`). Empty = all categories. A category not in this list: paste its search URL in **Start URLs**.

## `maxItems` (type: `integer`):

Maximum number of listings to save for the whole run (after deduplication and filters). 0 = no limit. Avito serves at most about 1 500 listings per search in a city or region (about 5 000 for the whole of Russia): to get more, split it (**More locations**, a price range, a category).

## `maxItemsPerQuery` (type: `integer`):

Cap for EACH search (keyword × location, or search URL), so that the first search cannot use up the whole **Max listings** budget. 0 = no per-search cap.

## `sort` (type: `string`):

Order of the results on the site. With **Posted after** or **Only new listings**, the site's default order is replaced by `Newest first` so that the Actor can stop paging early (a pasted search URL keeps its own order: sort it by date on Avito before copying it); **Only new listings** works best with `Newest first`.

## `extractDetails` (type: `boolean`):

Open each listing page for the full description (text and HTML), all the characteristics of the item, all photos, views, seller details (shop, company), publication status and end date. A listing read this way is charged as `result-with-details` instead of `result` (see the Pricing tab). Unticked (default) = the search-result fields only (title, price, address, photo, seller, date, short description), much faster and cheaper.

## `includeMarketPrice` (type: `boolean`):

Add Avito's market price estimate (some cars and real estate), read on the listing page; billed per listing that has one, on top of its price (see the Pricing tab). Needs Extract details, or a listing URL in Start URLs: otherwise it is ignored.

## `priceMin` (type: `integer`):

Lowest price, in Russian roubles.

## `priceMax` (type: `integer`):

Highest price, in Russian roubles.

## `sellerType` (type: `string`):

Private sellers only, or companies and shops only. Checked on each listing card, so the result holds even for a page the site did not filter.

## `withDeliveryOnly` (type: `boolean`):

Only listings that can be delivered through Avito Delivery.

## `localOnly` (type: `boolean`):

Avito mixes listings from other cities into a search (a few per page, a whole page for a small town with few matches). Tick to keep only the listings located in the place searched (**Location**); the others are not saved and do not count in **Max listings**. Applies to a city: a region (`moskovskaya_oblast`) keeps all its listings.

## `postedAfter` (type: `string`):

Only listings published on or after this date: `2026-09-01`, or a period before now such as `7 days`, `2 weeks`, `1 month` (API: `24 hours` and full ISO date-times work too). The date read is the publication date shown by Avito, which is moved forward when the seller republishes or renews the listing. Listings without a publication date are dropped.

## `postedBefore` (type: `string`):

Only listings published on or before this date (the whole day is included), or older than a period such as `30 days`. Same date as **Posted after**: the (re)publication date shown by Avito.

## `excludeKeywords` (type: `array`):

Drop the listings whose title or description contains one of these words (case and accents ignored), e.g. `case`, `broken`.

## `verifiedOnly` (type: `boolean`):

Only listings whose seller Avito has verified (the verified-listing mark of the search result).

## `withPhotosOnly` (type: `boolean`):

Only listings whose search result shows at least one photo. Listings without a photo are dropped.

## `minRating` (type: `number`):

Only sellers rated at least this (0-5 stars). Sellers without any rating are dropped.

## `onlyNew` (type: `boolean`):

Skip the listings that a previous run (same **Memory key**) already delivered: they are not saved and not charged, and their page is not even opened. First run = everything is new.

## `stateKey` (type: `string`):

Name of the memory used by **Only new listings**. Give each schedule / task its own key (e.g. `moscow-iphones`) so that they do not share their memory. Letters, digits, `-` and `_`.

## `resetState` (type: `boolean`):

Forget everything remembered under this **Memory key** before the run: this run returns (and charges) every listing again. Untick it afterwards.

## `proxyConfiguration` (type: `object`):

Avito.ru only opens to Russian IP addresses: keep **Apify Proxy** and the Actor uses Russian residential IPs, included in the price (the proxy group, the country and **No proxy** chosen here are ignored). Your own proxies (`proxyUrls`) must be Russian. On the Apify free plan the included proxy is not available: add your own proxy URLs, or the run stops at once with a message.

## `maxConcurrency` (type: `integer`):

Maximum number of requests processed in parallel.

## `maxRequestsPerMinute` (type: `integer`):

Most requests to the site in any 60 seconds. Counted: results pages and listing pages. Not counted: the site's access check when a new connection starts, a page asked again when the site says to wait, and redirects (they belong to the page that needs them). A budget, not an even pace: up to this many can leave at once when the minute starts (spread them with the minimum delay below). Lower it if the site answers HTTP 429 / 403 in the log.

## `minRequestIntervalMs` (type: `integer`):

Smallest gap between two requests, in milliseconds, counting the same requests as above: results pages and listing pages. Unlike the per-minute rate, this spreads the requests evenly instead of letting them go out in a burst. 0 = no gap.

## `maxRequestRetries` (type: `integer`):

Retries per request before it is marked as failed. A request the site turns away is also retried on a new Russian IP up to 10 times without using up these retries.

## `debugLog` (type: `boolean`):

Include debug messages in the run log.

## Actor input object example

```json
{
  "startUrls": [],
  "query": "iphone",
  "searchQueries": [],
  "location": "moskva",
  "locations": [],
  "category": "",
  "maxItems": 50,
  "maxItemsPerQuery": 0,
  "sort": "relevance",
  "extractDetails": false,
  "includeMarketPrice": false,
  "sellerType": "any",
  "withDeliveryOnly": false,
  "localOnly": false,
  "excludeKeywords": [],
  "verifiedOnly": false,
  "withPhotosOnly": false,
  "minRating": 0,
  "onlyNew": false,
  "stateKey": "default",
  "resetState": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "maxConcurrency": 3,
  "maxRequestsPerMinute": 36,
  "minRequestIntervalMs": 1700,
  "maxRequestRetries": 5,
  "debugLog": false
}
```

# Actor output Schema

## `results` (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 = {
    "query": "iphone",
    "location": "moskva",
    "maxItems": 50,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("nice_dev/avito-listings-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 = {
    "query": "iphone",
    "location": "moskva",
    "maxItems": 50,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("nice_dev/avito-listings-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 '{
  "query": "iphone",
  "location": "moskva",
  "maxItems": 50,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call nice_dev/avito-listings-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,nice_dev/avito-listings-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/4TGfA2hLFdM2sAxBa/builds/8luTX9wq0nXQur5hb/openapi.json
