Документация API
https://api.metrapi.ruВведение
Metrapi отдаёт объявления о продаже и аренде недвижимости, собранные из 8 источников
(Avito, ЦИАН, ДомКлик, Яндекс.Недвижимость, FarPost, Move.ru, sob.ru, Юла) — в единой
нормализованной схеме, с готовыми фильтрами и склейкой дублей одной квартиры с разных площадок.
Один запрос — данные со всех источников сразу. Актуальный список всегда отдаёт
/v1/sources.
API входит в полный доступ. Все запросы — обычный HTTP GET с
заголовком X-Api-Key, ответы — JSON. Никаких SDK не нужно, подойдёт curl,
Python requests, любой HTTP-клиент.
API отдаёт данные объявлений целиком, включая координаты (lat/lon) —
см. таблицу «Поля объявления». Аналитика рынка, интерактивная карта и наш
внутренний геокодер через API не доступны — это инструменты личного кабинета, не публичного API.
Быстрый старт
- Получите ключ — подключите полный доступ в
личном кабинете или напишите на
info@metrapi.ru. Ключ выглядит как
metrapi_xxxxxxxx. - Добавьте его в заголовок
X-Api-Keyкаждого запроса. - Шлите запросы на
https://api.metrapi.ru.
Первый запрос
# Двушки в Москве до 15 млн curl -H "X-Api-Key: ВАШ_КЛЮЧ" \ "https://api.metrapi.ru/v1/items?city=msk&deal_type=sale&rooms=2&price_max=15000000"
Ответ
{
"count": 128,
"items": [
{
"source": "avito",
"deal_type": "sale",
"realty_type": "flat",
"address": "Москва, ул. Тверская, 12",
"city": "msk",
"price": 14200000,
"rooms": 2, "area_total": 54.0,
"floor": 5, "floors_total": 9,
"metro": "Тверская",
"metro_minutes": 7, "metro_mode": "walk",
"lat": 55.7645, "lon": 37.6062,
"url": "https://www.avito.ru/...",
"published_at": "2026-06-18"
}
]
}
Хотите потыкать запросы прямо в браузере — откройте интерактивную песочницу: нажмите Authorize, вставьте ключ один раз — и он подставится во все запросы.
Авторизация
Все рабочие эндпоинты требуют заголовок X-Api-Key с вашим персональным ключом.
Без ключа сервер вернёт 401, с неверным — 403.
Ключ — секрет. Держите его на своём сервере, не вставляйте в код страницы в браузере или в мобильное приложение, откуда его легко достать.
curl -H "X-Api-Key: metrapi_xxxxxxxx" "https://api.metrapi.ru/v1/items?city=msk"
Лимиты
Частота ограничена по-разному для разных ручек — чтение наших данных не трогает источники объявлений, поэтому лимит там мягче, чем у ручек, которые идут за свежими данными к первоисточнику.
| Что | Значение |
|---|---|
| Чтение объявлений | /v1/items, /v1/item/{...} — не чаще 1 раза в 2 секунды на ключ (общий счётчик на обе ручки). |
| Запрос телефона | /v1/phone/refresh/{...} — не чаще 1 раза в 5 секунд на ключ. |
| Актуализация | /v1/item/{...}/refresh — не чаще 1 раза в 10 секунд на ключ. |
| При превышении | 429 с телом {"detail":{"reason":"too_soon","retry_after":N}} — retry_after говорит, через сколько секунд повторить. Отдельного заголовка Retry-After ответ не содержит — берите значение из тела. |
| Запросов в сутки | до 100 000 на ключ, суммарно по всем ручкам. При превышении — 429. |
| Объём за ответ | до 1000 объявлений. В пробном периоде — до 50. Больше — постранично через offset. |
| Повтор по одному объявлению | Актуализация одного и того же объявления — не чаще 1 раза в 5 минут, телефон одного объявления — не чаще 1 раза в час (в пределах этого окна отдаём уже собранное значение, к источнику повторно не идём). |
Пагинация
limit — сколько объявлений вернуть (по умолчанию 50, максимум 1000),
offset — сколько пропустить. Чтобы выгрузить всю выборку, идите страницами,
пока count не станет меньше limit:
?limit=1000&offset=0 # первая 1000 ?limit=1000&offset=1000 # следующая 1000 ?limit=1000&offset=2000 # и так далее
Склейка дублей
Одна и та же квартира часто размещена на нескольких площадках. Параметр dedupe=true
схлопывает такие записи в одну, а в поле sources[] перечисляет все площадки, где она
есть, и цену на каждой — это и есть суть агрегатора.
{
"address": "Москва, ул. Тверская, 12",
"price": 14200000,
"sources": [
{"source": "avito", "price": 14200000, "url": "https://www.avito.ru/..."},
{"source": "cian", "price": 14500000, "url": "https://www.cian.ru/..."}
],
"sources_count": 2
}
У каждого объявления есть group_id — идентификатор его группы дублей. Он приходит и без dedupe: тогда вы получаете все публикации по отдельности и группируете их у себя, ничего не теряя. group_id стабилен — не меняется при изменении цены, поэтому по нему можно связывать выгрузки, сделанные в разные дни. null означает, что группу определить нельзя (в адресе нет номера дома или неизвестна площадь) — такое объявление считается отдельным объектом.
Рядом идёт group_spread_m — расстояние в метрах между самыми удалёнными объявлениями группы. Это мера уверенности: 0 — площадки указали одну и ту же точку, несколько сотен метров — объявления связаны по адресу, а координаты у площадок расходятся.
Фильтры
Параметры запроса /v1/items. Комбинируются по логическому И. Коды зон обхода —
/v1/cities, районы и метро города —
/v1/facets.
Мультивыбор. Параметры city, realty_type,
rooms, source, district, metro,
microdistrict, locality, settlement,
seller_type, land_status, build_status,
house_type, renovation, bathroom, balcony
принимают несколько значений — просто повторите параметр:
?rooms=2&rooms=3. Значения внутри одного параметра объединяются по ИЛИ.
| Параметр | Что фильтрует | Пример |
|---|---|---|
city | зона обхода: город сбора и его окрестности (код), можно несколько. Для конкретного города — locality | city=msk&city=spb |
deal_type | тип сделки | sale — продажа, rent — аренда |
realty_type | тип объекта, можно несколько. Земельный участок — отдельный тип land: house участков не возвращает, а без параметра в выдачу попадают квартиры, дома и участки | flat — квартира, house — дом, land — земельный участок, room — комната |
rooms | число комнат, можно несколько | rooms=1&rooms=2 |
price_min / price_max | цена, ₽ | price_max=15000000 |
area_min / area_max | площадь, м² | area_min=40 |
floor_min / floor_max | этаж | floor_min=2 |
floors_min / floors_max | этажность дома | floors_max=9 |
district | район, можно несколько | district=Тверской |
metro | метро, можно несколько | metro=Тверская |
region | субъект РФ | region=Московская область |
locality | населённый пункт точным именем — конкретный город или село | locality=Химки |
source | конкретный источник | source=avito |
published_days | размещено за N дней | published_days=3 |
q | поиск по адресу/тексту | q=Тверская |
seller_type | тип продавца | private / agency / developer |
land_status | статус участка (дома и земельные участки) | land_status=ИЖС |
price_changed | только с изменением цены | price_changed=1 |
with_photo | только с фото | with_photo=1 |
date_from / date_to | дата размещения, от / до | date_from=2026-06-01 |
dedupe | склейка дублей | dedupe=true |
archived | 1 = включить снятые с публикации (по умолчанию их нет в выдаче) | archived=1 |
settlement | населённый пункт внутри города/района (село, посёлок, СНТ), можно несколько | settlement=Парголово |
microdistrict | микрорайон, можно несколько | microdistrict=Северный |
floor_brackets | этажность дома диапазонами, можно несколько | floor_brackets=1-4&floor_brackets=17-24 |
area_living_min / area_living_max | жилая площадь, м² | area_living_min=30 |
area_kitchen_min / area_kitchen_max | площадь кухни, м² | area_kitchen_min=9 |
build_year_min / build_year_max | год постройки | build_year_min=2010 |
build_status | новостройка / вторичка, можно несколько | new / secondary |
exclude_build_status | исключить тип застройки | exclude_build_status=new — только вторичка |
house_type | тип дома, можно несколько | Кирпичный / Панельный / Монолитный / Монолитно-кирпичный / Блочный / Деревянный |
renovation | ремонт, можно несколько | Косметический / Евроремонт / Дизайнерский / Требует ремонта / Без отделки |
bathroom | санузел, можно несколько | Совмещённый / Раздельный / 2 и более |
balcony | балкон, можно несколько | Балкон / Лоджия / Балкон и лоджия / Нет |
metro_max | до метро не более N минут | metro_max=15 |
metro_mode_f | способ до метро (по умолчанию пешком) | walk / transport |
rent_period | срок аренды | long — длительная. Посуточные в выдачу не попадают, см. ниже |
comm_f | аренда: комиссия | none — без комиссии, lt50 — менее 50% |
land_area_min / land_area_max | площадь участка, сотки (загородная) | land_area_min=6 |
house_wc | санузел загородного дома | В доме / На улице |
sewerage | канализация (загородная) | Центральная / Септик / Выгребная яма / Нет |
water_supply | водоснабжение (загородная) | Центральное / Скважина / Колодец / Нет |
price_history | вернуть историю цены у каждого объявления (до 20 записей) | price_history=1 |
limit / offset | пагинация | limit=1000&offset=0 |
Поля объявления
Ответ содержит только перечисленные ниже поля. Незаполненные приходят как null —
полнота зависит от площадки: часть характеристик отдают не все источники.
| Поле | Описание |
|---|---|
source / source_id | источник и его внутренний id объявления |
deal_type / realty_type | тип сделки / тип объекта |
title, description | заголовок и полный текст объявления с площадки, как есть |
address, city, region, district, metro | адрес и локация (city — код зоны обхода, не города) |
lat, lon | координаты объекта: широта, долгота |
locality, locality_type | населённый пункт и его тип (город, посёлок, село, деревня) |
settlement, microdistrict, address_alt | поселение, микрорайон и второй адрес углового дома (через « / ») |
metros | все станции метро объекта массивом: название, расстояние и способ (пешком / транспортом). Поля metro* ниже — ближайшая станция тем же значением |
price | цена, ₽ |
rooms, area_total, area_living, area_kitchen | комнаты, общая / жилая / кухонная площадь, м² |
floor, floors_total | этаж / этажность дома |
build_year, house_type, renovation, build_status | год, тип дома, ремонт, новостройка/вторичка |
jk, mortgage, sale_type, completion_date | жилой комплекс, доступность ипотеки, тип продажи (свободная / альтернатива / переуступка), срок сдачи |
balcony, bathroom, ceiling_height | балкон, санузел, высота потолков (м) |
window_view, replan, apartments | вид из окна, узаконенная перепланировка, статус «апартаменты» |
building_series, ceiling_type, elevators, entrances | серия дома, тип перекрытий, лифты, подъезды |
garbage_chute, parking, emergency_status | мусоропровод, парковка, аварийность дома |
amenities | массив удобств («Холодильник», «Кондиционер», «Интернет», …) |
cadastral_number | кадастровый номер (формат NN:NN:NNNNNN:NN), если продавец указал его в объявлении; иначе null. Структурированно источники его не отдают — встречается редко, в основном у частных объявлений |
metro_distance, metro_minutes, metro_mode | до метро: текст как в объявлении («7 мин пешком»), минуты числом, способ (walk/transport). Для расчётов берите metro_minutes, не разбирайте текст |
deposit, commission, prepayment, rent_period | условия аренды. Это строки в том виде, как их публикует площадка: "63 000 ₽", "Без залога", "50%", "Без комиссии", "за 1 месяц" — не числа |
utilities_payer, kids_allowed, pets_allowed, agent_bonus | кто платит ЖКУ, можно ли с детьми и с животными, бонус агенту |
land_status, land_area | статус участка и его площадь в сотках (у домов и земельных участков) |
land_category | категория земель участка |
electricity, gas, heating, water_supply, sewerage, internet_tv, house_wc | коммуникации загородного объекта: электричество, газ, отопление, водоснабжение, канализация, интернет и ТВ, санузел в доме |
village, village_class | коттеджный посёлок и его класс |
highway, highway_km, railway, railway_km | шоссе и железнодорожная станция с расстоянием в км |
seller_type, seller_name | частное лицо / агентство / застройщик; имя продавца |
seller_company | агентство, разместившее объявление, если оно указано на площадке |
url | ссылка на объявление на первоисточнике |
phone | телефон. Приходит, только если ключу открыты телефоны — иначе поля в ответе нет вовсе. У ЦИАН, Яндекс.Недвижимости и ДомКлика номер подменный (переадресация площадки), у остальных — прямой номер из объявления. Отсутствует — запросите /v1/phone/refresh |
phones | все известные номера объявления массивом: [{"n":"+7…","r":false}], где r — признак подменного номера. Как и phone, приходит только если ключу открыты телефоны — иначе поля в ответе нет вовсе |
phone_redirect | true — номер подменный: это переадресация площадки, а не прямой номер продавца. Признак приходит вместе с номером, гадать по источнику не нужно |
phone_checked_at | когда номер проверялся в последний раз. Приходит вместе с телефонами |
photos | массив ссылок на фото на серверах первоисточника. Живут, пока живо объявление, — если храните долго, скачивайте к себе. Часть ссылок Avito подписана параметром ?cqp=: подпись не признак живости, снятое объявление уносит фото вместе с собой |
price_prev | предыдущая цена (если менялась) |
published_at, updated_at | дата размещения / последнего обновления |
first_seen, last_seen | когда объявление впервые увидел Metrapi и когда мы в последний раз успешно его проверили. Это не дата публикации на площадке — для неё есть published_at; срок экспозиции по first_seen считать нельзя |
delisted_at | дата снятия с публикации, null у живых объявлений. По умолчанию снятые объявления в выдачу не попадают вовсе — чтобы их увидеть, добавьте archived=1 |
sources, sources_count | все площадки этого объекта и их число. Только при dedupe=true — без склейки этих полей в ответе нет |
group_id | идентификатор группы дублей: у объявлений одного и того же объекта он совпадает. Стабилен — не меняется при изменении цены. null, если группу определить нельзя (в адресе нет номера дома или неизвестна площадь). Приходит и без dedupe — тогда вы получаете все публикации и можете сгруппировать их сами |
group_spread_m | расстояние в метрах между самыми удалёнными объявлениями группы — мера уверенности связи: 0 — площадки указали одну точку, 900 — связь по адресу, а координаты расходятся. null, если координат в группе меньше двух |
price_history | история изменений цены [{"old":…,"new":…,"at":…}], от свежего к старому. В списке — по параметру price_history=1 (до 20 записей), в карточке объявления — всегда, полная глубина — /v1/item/{…}/price-history. Ведётся с 13.08.2026 и содержит только движение цены: снятия и повторной публикации в ней нет |
refreshed_at | когда объявление вручную актуализировали |
Коды ответов
| Код | Значение |
|---|---|
200 | OK |
401 | не передан X-Api-Key |
403 | неверный ключ или функция не входит в ваш доступ |
429 | превышена частота или исчерпана суточная квота. При частоте в теле придёт {"detail":{"reason":"too_soon","retry_after":N}} — подождите N секунд |
503 | временная недоступность базы — повторите позже |
Эндпоинты
Объявления, телефон и актуализация требуют X-Api-Key.
Справочники (/v1/stats, /v1/cities, /v1/facets,
/v1/land-statuses) открыты без ключа. Живые запросы — в
песочнице.
Список объявлений с фильтрами. Главный эндпоинт. Все параметры — из таблицы Фильтры.
Не чаще 1 раза в 2 секунды на ключ (общий счётчик с /v1/item/{...}).
curl -H "X-Api-Key: КЛЮЧ" \ "https://api.metrapi.ru/v1/items?city=msk&deal_type=sale&rooms=2&price_max=15000000&dedupe=true" # -> { "count": 128, "items": [ { ... } ] }
Одно объявление по источнику и его id. Поля те же, что в /v1/items. 404 — если объявление не найдено или скрыто из выдачи; в теле ответа при этом {"item": null, "detail": "not_found"}, поэтому проверка по полю item работает так же, как по коду ответа.
Не чаще 1 раза в 2 секунды на ключ (общий счётчик с /v1/items).
curl -H "X-Api-Key: КЛЮЧ" "https://api.metrapi.ru/v1/item/avito/1234567890"
История изменений цены объявления: массив {old, new, at} от свежего к старому. Параметр limit — сколько записей вернуть (по умолчанию 50, максимум 500). Не чаще 1 раза в 2 секунды на ключ (общий счётчик с /v1/items). Несуществующее объявление отдаёт пустую историю, а не ошибку.
История ведётся с 13.08.2026 и содержит только движение цены: факта снятия с публикации и повторного размещения в ней нет. Дату снятия смотрите в поле delisted_at.
curl -H "X-Api-Key: КЛЮЧ" "https://api.metrapi.ru/v1/item/avito/1234567890/price-history?limit=50" {"count": 2, "history": [ {"old": 14500000, "new": 14200000, "at": "2026-08-30T11:04:12+03:00"}, {"old": 14900000, "new": 14500000, "at": "2026-08-19T09:41:55+03:00"} ]}
Список источников и их статус. Значение code используйте в фильтре source=.
curl -H "X-Api-Key: КЛЮЧ" "https://api.metrapi.ru/v1/sources" # -> { "sources": [ {"code":"avito","name":"Avito","status":"live"}, ... ] }
Сводная статистика каталога (сколько объявлений, по источникам). Удобно для дашбордов.
curl "https://api.metrapi.ru/v1/stats"
Коды зон обхода — значения для параметра city=. Зона — это город сбора и его окрестности: city=kazan вернёт объявления и по соседним населённым пунктам Татарстана. Нужен конкретный город — фильтруйте locality.
curl "https://api.metrapi.ru/v1/cities"
Районы и метро указанного города (с числом объявлений) — для значений district= и metro=.
curl "https://api.metrapi.ru/v1/facets?city=msk&deal_type=sale"
Список статусов участка — значения для фильтра land_status=; подходят и для домов, и для земельных участков.
curl "https://api.metrapi.ru/v1/land-statuses"
Запросить актуальный телефон по одному объявлению. Не чаще 1 раза в 5 секунд на ключ; одно и то же объявление перезапрашивается у площадки не чаще раза в час — внутри этого окна отдаём уже собранный номер. Для Avito и Юлы запрос телефона недоступен — эти площадки номер не отдают.
curl -X POST -H "X-Api-Key: КЛЮЧ" \ "https://api.metrapi.ru/v1/phone/refresh/avito/1234567890"
/v1/item/.../refresh.Принудительно актуализировать объявление: сервис заново открывает страницу первоисточника и обновляет все поля (площади, характеристики дома, удобства, фото, описание, продавца, даты), кроме телефона — для него отдельный эндпоинт. Не чаще 1 раза в 10 секунд на ключ. Если это же объявление уже актуализировал (любой ключ, в том числе через личный кабинет) за последние 5 минут — источник повторно не дёргаем, отдаём тот же результат. По умолчанию конвейер не перепарсивает уже собранные объявления при их обновлении в выдаче — этот вызов нужен, когда требуется свежий снимок.
curl -X POST -H "X-Api-Key: КЛЮЧ" \ "https://api.metrapi.ru/v1/item/cian/331124536/refresh" # -> { "ok": true, "fields": ["area_living","ceiling_height","parking", ...], "photos": 40 }
Поддержка
Технические вопросы — support@metrapi.ru, подключение и оплата — info@metrapi.ru, или через систему тикетов в личном кабинете. Подробнее — на странице Контакты.