Введение
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 на ключ, суммарно по всем ручкам. Сутки считаются по UTC — квота обнуляется в 03:00 по Москве. В квоту засчитывается каждый запрос с ключом, включая ответы 429 и ошибки, — повторять запрос сразу после 429 не стоит. При превышении — 429 с текстом daily limit exceeded. |
| Объём за ответ | до 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 # и так далее
Курсор вместо номера страницы. На глубине в десятки тысяч объявлений offset
дорожает с глубиной, а при притоке новых объявлений страницы сдвигаются — одно и то же объявление
может прийти дважды или пропасть между страницами. Надёжнее идти курсором: в каждом ответе
есть next_cursor — передайте его в следующий запрос как cursor, с теми же фильтрами.
offset и сортировка при курсоре не нужны: порядок — по дате появления, новые сверху.
next_cursor: null — выборка закончилась. С dedupe=true курсор тоже работает и листает
группы: каждая группа приходит ровно один раз, а объявления, появившиеся после первой страницы, в этот проход
не попадают — их забирайте следующим проходом или лентой /v1/feed. Курсор обычной выдачи и курсор
dedupe=true не взаимозаменяемы: чужой или мусорный курсор — ответ 400 bad_cursor.
?limit=1000 # первая 1000, в ответе next_cursor ?limit=1000&cursor=<next_cursor> # следующая 1000 ?limit=1000&cursor=... # пока next_cursor не станет null
Чтобы держать у себя копию базы, выгрузите её так один раз, а дальше забирайте только изменения через ленту изменений — без повторной выгрузки и без потерь.
Лента изменений
/v1/feed отдаёт новые объявления и смены цены по порядку, в котором
они случились. Каждый ответ содержит next_cursor — передайте его в следующем запросе параметром
cursor, и вы получите всё, что произошло после. Ничего не теряется и не приходит дважды.
- Первый запрос без
cursorвозвращает пустую страницу иnext_cursor— текущую точку. Нужны изменения с конкретного момента — передайтеsince(дата и время в ISO 8601). - Фильтры — те же, что у
/v1/items: можно получать изменения только по своему региону или типу. Если по фильтрам в очередной порции ничего не нашлось,next_cursorвсё равно сдвигается — просто запросите дальше. - У каждого объявления в ленте есть
event(new— новое для Metrapi,price— изменилась цена),event_atиevent_seq. Объявление приходит один раз за страницу, в текущем состоянии. newприходит и для объявления, давно размещённого на площадке, но попавшего к нам недавно (например, после обновления): у негоfirst_seenв прошлом. Для постоянной выгрузки берите ленту — сортировка/v1/itemsпо дате такие объявления среди свежих не покажет.- Снятые с публикации — отдельной лентой
/v1/feed/delisted(delisted— снято,relisted— вернулось). Храните у себя и её курсор. - Лента хранит изменения за 90 дней. Курсор старше — ответ
410: загрузите базу заново через/v1/items. - Лимит частоты — общий с
/v1/items(1 запрос в 2 секунды на ключ).
?cursor=100001234®ion=Самарская+область # -> { "count": 87, "items": [...], "next_cursor": 100004517 }
Формат XML
Ответы /v1/items, /v1/item/{…}, /v1/feed и /v1/feed/delisted
можно получить в XML — например, для загрузки в 1С или Битрикс: добавьте format=xml.
Имена полей те же, что в JSON; списки — повторяющиеся элементы <item>; ключ, который
нельзя записать именем тега, — <entry key="…">. Пустой список и null
в XML выглядят одинаково — пустым элементом. Ошибки при format=xml тоже приходят в XML.
curl -H "X-Api-Key: КЛЮЧ" "https://api.metrapi.ru/v1/items?city=msk&limit=100&format=xml" <response><count>100</count><items><item><source>cian</source>…</item>…</items></response>
Склейка дублей
Одна и та же квартира часто размещена на нескольких площадках. Параметр dedupe=true
схлопывает такие записи в одну, а в поле sources[] перечисляет все площадки, где она
есть, и цену на каждой — это и есть суть агрегатора. При dedupe=true параметры limit и offset считаются в группах (объектах), а не в отдельных объявлениях; группы идут от самого свежего объявления к старым, и страницами можно пройти всю выборку. Листать надёжнее курсором (next_cursor): с offset новые объявления сдвигают страницы. Запись группы, разнесённой по разным точкам, может прийти двумя строками, поэтому записей на странице бывает чуть больше limit — конец выборки определяйте по next_cursor: null.
{
"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 участков не возвращает. Без параметра в выдачу попадают квартиры, дома и участки; коммерческая приходит только по явному запросу realty_type=commercial; гаражи — только по явному запросу realty_type=garage | flat — квартира, house — дом, land — земельный участок, commercial — коммерческая, garage — гараж, бокс, машиноместо |
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 |
floor_not_first | 1 = без первого этажа (со второго и выше) | floor_not_first=1 |
floor_not_last | 1 = без последнего этажа дома. Объявления, где площадка не указала этаж или этажность дома, в выдачу не попадают | floor_not_last=1 |
apart_f | no — без апартаментов, only — только апартаменты. Признак ставит площадка (ЦИАН, ДомКлик, Яндекс, Авито, Move, Юла, sob.ru) | apart_f=no |
sale_type | тип продажи, можно несколько: free — свободная продажа, alt — альтернатива, none — площадка тип не указала. Тип отмечают ЦИАН, ДомКлик, Яндекс, Авито и sob.ru; у Move, Юлы и FarPost его нет — их объявления попадают только в none. Редкие типы (переуступка, первичная продажа вторички) в выдачу с фильтром не попадают. Незнакомый код — 400 bad_sale_type | sale_type=free&sale_type=alt |
lat / lon / radius_km | круг на карте: центр и радиус от 0.1 до 10 км, все три вместе. Область — для поиска рядом (район, два соседних); целый город ищите через region / locality. В выдачу попадают объявления с координатами внутри круга; без координат — не попадают. Неполный круг или радиус вне диапазона — 400 bad_radius | lat=55.7558&lon=37.6173&radius_km=2 |
poly | область-многоугольник: точки «широта,долгота» через ;, от 3 до 50 точек, не больше 30 км по диагонали рамки (от самой южной и западной точки до самой северной и восточной). Неверный контур — 400 bad_poly; вместе с кругом — 400 bad_area | poly=55.75,37.60;55.76,37.62;55.74,37.63 |
district | район, можно несколько | district=Тверской |
metro | станция метро или МЦД, можно несколько — метро и МЦД вместе. По названию станции находятся и её другие написания у площадок (metro=Москва-Сити найдёт и объявления со старым именем «Международная») | metro=Тверская |
metro_kind | metro — станции из metro только по линиям метро, без МЦД. Нужно для названий, которые есть и у метро, и у МЦД (Курская, Текстильщики): без параметра найдутся оба. Пусто или all — вместе, как раньше | metro=Курская&metro_kind=metro |
mcd | остановка МЦД, можно несколько — только МЦД. Вместе с metro — объявления у ЛЮБОЙ из выбранных станций. Метро это или МЦД, определяем по цвету линии у станции объявления; станция общего названия без цвета линии в «только метро» и «только МЦД» не попадает | mcd=Курская |
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 |
last_seen_after | только объявления, которые площадка подтвердила не раньше этого момента (поле last_seen): показала в выдаче или карточка ответила, что объявление живо. Отсекает давно не подтверждённые объявления — они могут быть уже сняты. Формат ISO 8601; дата без времени — с начала суток, без часового пояса — UTC. Работает в /v1/items и /v1/feed; неверное значение — 400 bad_last_seen_after | last_seen_after=2026-10-15T00:00:00Z |
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% |
commercial_type | коммерческая: назначение, можно несколько | office, retail, free_purpose, warehouse, manufacturing, catering, hotel, auto_repair, building, land |
building_class | коммерческая: класс здания, можно несколько | A+, A, B+, B, C+, C |
commercial_building_type | коммерческая: тип здания, можно несколько | commercial_building_type=Бизнес-центр |
entrance_type | коммерческая: вход | Отдельный, Общий |
tax_form | коммерческая: форма налога | НДС, УСН |
lease_type | коммерческая (аренда): договор | Прямая аренда, Субаренда, Переуступка |
sqm_price_min, sqm_price_max | коммерческая: цена за м² | у аренды — за год, у продажи — за метр. Только вместе с realty_type=commercial, иначе 400 |
garage_kind | гаражи: вид, можно несколько | Гараж, Бокс, Машиноместо |
garage_material | гаражи: материал, можно несколько | Металлический, Кирпичный, Железобетонный, Капитальный |
garage_status | гаражи: статус, можно несколько | Собственность, Кооператив, Доверенность |
security | гаражи: охрана, можно несколько | Да |
parking | гаражи: тип машиноместа, можно несколько | Подземная, Многоуровневая, Закрытая, Открытая, Наземная |
land_area_min / land_area_max | площадь участка, сотки (загородная) | land_area_min=6 |
house_wc | санузел загородного дома | В доме / На улице |
sewerage | канализация (загородная) | Центральная / Септик / Выгребная яма / Нет |
water_supply | водоснабжение (загородная) | Центральное / Скважина / Колодец / Нет |
gas | газ (загородная) | В доме / По границе участка / Есть / Нет |
electricity | электричество (загородная) | Есть / Нет |
heating | отопление (загородная) | Газовое / Электрическое / Печь или камин / Твердотопливное / Есть / Нет |
price_history | вернуть историю цены у каждого объявления (до 20 записей) | price_history=1 |
limit / offset | пагинация | limit=1000&offset=0 |
cursor | продолжить с последнего — значение next_cursor из прошлого ответа; offset и сортировка при этом не нужны; работает и с dedupe=true | cursor=eyJ... |
format | формат ответа: json (по умолчанию) или xml — см. Формат XML | format=xml |
Поля объявления
Ответ содержит только перечисленные ниже поля. Незаполненные приходят как null —
полнота зависит от площадки: часть характеристик отдают не все источники.
| Поле | Описание |
|---|---|
source / source_id | источник и его внутренний id объявления |
deal_type / realty_type | тип сделки / тип объекта |
title, description | Заголовок собираем мы из структурных полей — «2-комн. квартира, 54 м²», «Офис, 120 м²», «Участок, 10 га», — а не берём с площадки: их заголовки содержат адрес, цену и рекламу. Текст объявления как есть — в description |
address, city, region, district, metro | адрес и локация (city — код зоны обхода, не города) |
lat, lon | координаты объекта: широта, долгота |
locality, locality_type | населённый пункт и его тип (город, посёлок, село, деревня) |
settlement, microdistrict, address_alt | поселение, микрорайон и второй адрес углового дома (через « / ») |
metros | все станции метро и МЦД объекта массивом: название, расстояние, способ (пешком / транспортом), цвет линии и kind — metro, mcd или null (не определить). Поля metro* ниже — ближайшая станция тем же значением |
price | цена, ₽, за объект целиком: у продажи — стоимость, у аренды — плата в месяц. Исключение — объявления, где площадка указала единицу или период цены (сейчас это Авито: коммерческая недвижимость и гаражи): тогда price — ровно та сумма, что в объявлении, а единица и период лежат в price_unit и price_period (см. ниже) |
price_per_sqm | цена за м², ₽: price, делённая на area_total. У продажи — за м², у аренды — за м² в месяц, у аренды коммерческой — за м² в год (так же, как фильтр sqm_price). Нет цены или площади — null. Цена в месяц за объект (price_period = в месяц, price_unit пусто) делится как обычная. Если заполнена единица price_unit или период в год, тоже null: такую цену мы не пересчитываем — ставку за м² от самой площадки смотрите в src_price_sqm |
price_per_sqm_period | за какой срок price_per_sqm: null у продажи, month у аренды, year у аренды коммерческой |
price_per_sotka | у земельного участка (realty_type=land) — цена за сотку, ₽: price, делённая на land_area. У остальных — null |
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 | статус участка и его площадь всегда в сотках (у домов, участков и коммерческой земли). ⚠️ В заголовке крупные участки подписаны гектарами («10 га» вместо «1000 сот.») — это только подпись, само поле остаётся в сотках, и фильтры land_area_min/land_area_max тоже в сотках |
commercial_types | коммерческая: назначение объекта, список (office, retail, warehouse…). Один объект может быть сразу нескольких назначений — например ПСН с торговой функцией |
garage_kind, garage_material, garage_status, security | гаражи: вид, материал, статус, охрана. Кладовые — коммерческая недвижимость: realty_type=commercial, назначение warehouse, в заголовке «Кладовая» |
price_unit, price_period | цена как в объявлении, если площадка указала единицу или период. Сейчас их заполняет Авито у коммерческой недвижимости (с 16.10.2026) и у гаражей; у остальных объявлений оба поля пусты. Единица — за м², за м³ (пусто — за объект), период — в месяц, в год (пусто — не указан). Например, у аренды Авито price_unit пусто и price_period = в месяц — price за объект в месяц; за м² + в год — price это ставка за м² в год. Ничего не пересчитывается. Цена в месяц без единицы — обычная цена объекта в месяц: она проходит фильтры price_min/price_max, sqm_price_min/sqm_price_max и сортировку по цене, price_per_sqm у неё считается. Объявления с единицей (за м², за м³) или периодом в год в эти фильтры и в сортировку по цене не попадают, price_per_sqm и price_per_sotka у них пусты; без ценового фильтра и ценовой сортировки они в выдаче есть |
area_text, src_price_sqm, src_price_sqm_period | площадь текстом, если площадка дала не число («> 30 м²»); ставка за м², ₽, которую посчитала сама площадка, и её период (в месяц или в год у аренды, пусто у продажи). Сейчас приходит у Авито: коммерческая недвижимость (с 16.10.2026, почти у всех объявлений) и гаражи; у остальных площадок — null, там цену за м² даёт наше поле price_per_sqm |
building_class, commercial_building_type, business_center | коммерческая: класс здания (A+…C), тип здания и название бизнес-центра |
entrance_type, tax_form, lease_type, commercial_layout | коммерческая: вход, форма налога, тип договора аренды и планировка |
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_name в ответе нет вовсе; seller_type приходит всегда |
seller_company | агентство, разместившее объявление, если оно указано на площадке. Как и seller_name, не приходит ключу без контактов продавца. Отключить контакты продавца для ключа можно через поддержку |
url | ссылка на объявление на первоисточнике |
phone | телефон. Приходит, только если ключу открыты телефоны — иначе поля в ответе нет вовсе. У ЦИАН, Яндекс.Недвижимости и ДомКлика номер подменный (переадресация площадки), у остальных — прямой номер из объявления. Отсутствует — запросите /v1/phone/refresh |
phones | все известные номера объявления массивом: [{"n":"+7…","r":false}], где r — признак подменного номера. Как и phone, приходит только если ключу открыты телефоны — иначе поля в ответе нет вовсе |
phone_redirect | true — номер подменный: это переадресация площадки, а не прямой номер продавца. Признак приходит вместе с номером, гадать по источнику не нужно |
phone_ads_count | сколько сейчас живых объявлений с этим номером в нашей базе — помогает отличить собственника от агента. null у подменного номера (переадресация площадки общая на тысячи объявлений). Приходит только вместе с телефонами |
phone_checked_at | когда номер проверялся в последний раз. Приходит вместе с телефонами |
photos | массив ссылок на фото на серверах первоисточника. Живут, пока живо объявление, — если храните долго, скачивайте к себе. Часть ссылок Avito подписана параметром ?cqp=: подпись не признак живости, снятое объявление уносит фото вместе с собой |
price_prev | предыдущая цена (если менялась) |
published_at, updated_at | дата размещения / последнего обновления |
first_seen, last_seen | когда объявление впервые увидел Metrapi и когда площадка в последний раз его подтвердила — показала в выдаче или карточка ответила, что объявление живо. Чем старше last_seen, тем выше шанс, что объявление уже снято; отсечь такие — параметр last_seen_after. Это не дата публикации на площадке — для неё есть published_at; срок экспозиции по first_seen считать нельзя. Если объявление размещено на площадке давно и попало к нам позже (например, после обновления), 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 |
400 | недопустимое сочетание параметров, причина — в detail.reason (например sqm_price_commercial_only: фильтр цены за м² без realty_type=commercial) |
401 | не передан X-Api-Key |
403 | неверный ключ или функция не входит в ваш доступ |
404 | объявление не найдено или скрыто из выдачи (/v1/item/{source}/{source_id}); в теле {"item": null, "detail": "not_found"} |
410 | курсор ленты изменений старше 90 дней (detail.reason = "cursor_expired") — загрузите базу заново через /v1/items |
422 | параметр не прошёл проверку: число вне допустимого диапазона (например limit больше 1000), текст вместо числа, format не json/xml. В detail указано, какой параметр и почему |
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"} ]}
Лента изменений: новые объявления и смены цены по курсору (подробно — в разделе Лента изменений).
Параметры: cursor или since, limit (по умолчанию 100, максимум 1000),
format и все фильтры /v1/items. Не чаще 1 раза в 2 секунды на ключ (общий счётчик с /v1/items).
curl -H "X-Api-Key: КЛЮЧ" "https://api.metrapi.ru/v1/feed?cursor=100001234&deal_type=sale" {"count": 2, "next_cursor": 100001290, "items": [ {"source": "cian", "source_id": "334112708", …, "event": "new", "event_at": "2026-09-24T11:02:41+03:00", "event_seq": 100001251}, {"source": "avito", "source_id": "8479440597", …, "event": "price", "event_at": "2026-09-24T11:03:09+03:00", "event_seq": 100001290} ]}
Снятия с публикации (delisted) и возвраты (relisted) по курсору: seq,
event, at, source, source_id, group_id.
Параметры: cursor или since, limit (по умолчанию 500, максимум 1000), format.
curl -H "X-Api-Key: КЛЮЧ" "https://api.metrapi.ru/v1/feed/delisted?cursor=100001234"
Список источников и их статус. Значение 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=. Параметры: city (код зоны), deal_type, locality — районы и метро конкретного населённого пункта. У станции поле kinds — какими она бывает (metro, mcd или обе), остановки МЦД отдельно списком mcd.
curl "https://api.metrapi.ru/v1/facets?city=msk&deal_type=sale"
Список статусов участка — значения для фильтра land_status=; подходят и для домов, и для земельных участков.
curl "https://api.metrapi.ru/v1/land-statuses"
Журнал изменений API — те же записи, что в разделе «Журнал изменений», в JSON. Ключ не нужен. Параметры: since — только записи новее указанного момента (ISO 8601: дата или дата и время; без часового пояса — московское), limit — сколько записей вернуть. Записи — от свежей к старой; breaking: true — изменение может повлиять на уже работающую интеграцию. Неверный since — ответ 400 с причиной bad_since.
curl "https://api.metrapi.ru/v1/changelog?since=2026-10-01" # {"updated_at": "2026-10-14T12:15:00+03:00", "entries": [ # {"at": "2026-10-14T12:15:00+03:00", "breaking": false, # "changes": [{"kind": "added", "kind_label": "Новое", "breaking": false, "text": "…"}]}, …]}
at последней прочитанной записи и передавайте его в since при следующей проверке.Запросить актуальный телефон по одному объявлению. Не чаще 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 }
Журнал изменений
Что менялось в API и документации, от свежего к старому. Время — московское. Пометка проверьте интеграцию — изменение может повлиять на уже работающую интеграцию. Те же записи в JSON — /v1/changelog. Журнал ведётся с 02.09.2026.
- Изменено проверьте интеграцию Область поиска уменьшена: радиус круга (
radius_km) — до 10 км вместо 30, контур (poly) — не больше 30 км по диагонали вместо 100. Область нужна для поиска рядом — район, два соседних; целый город ищите черезregion/locality. Больше —400bad_radius/bad_poly.
- Новое Поиск по области в
/v1/itemsи/v1/feed(и в XML): круг —lat,lonиradius_km(от 0.1 до 30 км), контур —poly(точки «широта,долгота» через;, от 3 до 50, не больше 100 км по диагонали). В выдачу попадают объявления с координатами внутри области. Ошибки —400с причинойbad_radius,bad_polyилиbad_area(контур и круг вместе).
- Новое Фильтр
sale_typeв/v1/itemsи/v1/feed(и в XML):free— свободная продажа,alt— альтернатива,none— площадка тип не указала; можно несколько. Тип отмечают ЦИАН, ДомКлик, Яндекс, Авито и sob.ru. Незнакомый код —400с причинойbad_sale_type.
- Исправлено проверьте интеграцию Цена «за м²» у коммерческой недвижимости Авито: у части объявлений (около 1,6 тыс.) в
priceлежал итог за весь объект, посчитанный Авито, хотяprice_unit=за м². Теперь вprice— ставка за м², как она указана в объявлении, в согласии сprice_unitиprice_period. - Новое Этаж (
floor) и тип аренды (lease_type:Прямая аренда,Субаренда,Переуступка) у коммерческой недвижимости Авито — из карточки объявления. Цокольный и подвальный этаж —-1, как у остальных площадок. У аренды — залог (deposit: «290 000 ₽» или «Без залога») и комиссия (commission), если Авито их указывает. - Изменено Цена объявлений Авито обновляется при ежедневной проверке актуальности: изменение цены приходит в
price,price_prevи историю цены, а не только при открытии карточки.
- Изменено проверьте интеграцию Цена «в месяц» за объект (
price_period=в месяц,price_unitпусто) теперь считается обычной ценой: такие объявления проходят фильтрыprice_min/price_max,sqm_price_min/sqm_price_maxи сортировку по цене, аprice_per_sqmу них заполнен. Раньше они в эти фильтры не попадали — это касалось почти всей аренды коммерческой недвижимости и гаражей Авито. Объявления с единицейза м²,за м³или периодомв годпо-прежнему в ценовые фильтры не попадают.
- Документация Цена «как в объявлении» описана для коммерческой недвижимости Авито, а не только для гаражей. С 16.10.2026 у коммерческой Авито заполнены
price_unit(за м²; пусто — за объект) иprice_period(в месяц,в год), а ставка за м², посчитанная самой площадкой, приходит вsrc_price_sqmиsrc_price_sqm_period. У таких объявленийprice_per_sqmпуст, и они не попадают в фильтрыprice_min/price_max,sqm_price_min/sqm_price_maxи в сортировку по цене. Поведение API не менялось — прежний текст называл исключение только у гаражей.
- Новое Параметр
last_seen_afterв/v1/itemsи/v1/feed(и в XML): только объявления, которые площадка подтвердила не раньше указанного момента — по полюlast_seen. Отсекает давно не подтверждённые объявления, которые могли быть уже сняты. Формат ISO 8601, например2026-10-15T00:00:00Zили2026-10-15; без часового пояса — UTC. Неверное значение —400с причинойbad_last_seen_after. - Документация Уточнено описание поля
last_seen: это момент, когда площадка в последний раз подтвердила объявление — показала его в выдаче или карточка ответила, что оно живо.
- Убрано проверьте интеграцию Поле
storage_kindубрано из ответов/v1/items,/v1/item,/v1/feedи XML. Его не заполняла ни одна площадка — оно всегда былоnull. Кладовые, как и прежде, — коммерческая недвижимость с назначениемwarehouseи заголовком «Кладовая».
- Документация Кладовые — коммерческая недвижимость:
realty_type=commercial, назначениеwarehouse, в заголовке «Кладовая». Прежний текст доки обещал их среди гаражей с полемstorage_kind— это было неверно.storage_kindпока не заполняется ни одной площадкой (всегдаnull).
- Новое Гаражи, боксы и машиноместа:
realty_type=garage, продажа и аренда. Без явногоrealty_typeв выдачу не попадают. Фильтрыgarage_kind,garage_material,garage_status,security,parking(в/v1/itemsи/v1/feed). Поляgarage_kind,garage_material,garage_status,security,storage_kind,price_unit,price_period,area_text,src_price_sqm,src_price_sqm_period. - Новое У гаражей цена приходит как в объявлении:
price_unit(за м²,за м³; пусто — за объект) иprice_period(в месяц,в год; пусто — не указан). Мы ничего не пересчитываем. Такие лоты не попадают в фильтрыprice_min/price_maxи в сортировку по цене.
- Новое Ключ может работать без контактов продавца: тогда в ответах
/v1/items,/v1/item,/v1/feed(и в XML) нет полейseller_nameиseller_company, аseller_typeостаётся. Включается для ключа через поддержку; у остальных ключей ответ не меняется.
- Новое Журнал изменений API: этот раздел документации и ручка
GET /v1/changelog— те же записи в JSON, без ключа. Параметрsince— только записи новее указанного момента: так изменения можно отслеживать автоматически.
- Убрано проверьте интеграцию Фильтр
share_fи полеis_share(продажа доли), появившиеся 13.10 в 23:50, убраны: долю помечают не все площадки, и фильтр давал неполный результат. Параметрshare_fбольше не учитывается, поляis_shareв ответе нет. - Изменено
apart_f: признак апартаментов учитывается у ЦИАНа, ДомКлика, Яндекса, Авито, Move, Юлы и sob.ru (было — у первых четырёх).
- Новое Фильтр
apart_fв/v1/itemsи/v1/feed:no— без апартаментов,only— только апартаменты. - Новое Фильтр
share_fи полеis_share— продажа доли. Убраны 14.10 в 01:00.
- Новое Фильтры
floor_not_first=1(без первого этажа) иfloor_not_last=1(без последнего этажа дома) в/v1/itemsи/v1/feed. Приfloor_not_last=1объявления, где площадка не указала этаж или этажность дома, в выдачу не попадают. - Документация Описаны фильтры
floor_min/floor_maxиfloors_min/floors_max— они работали и раньше.
- Новое Поля
price_per_sqm(цена за м²: у продажи — за м², у аренды — за м² в месяц, у аренды коммерческой — за м² в год),price_per_sqm_period(null,monthилиyear) иprice_per_sotka(у земельных участков — цена за сотку). В JSON и в XML.
- Изменено проверьте интеграцию
first_seenу объявления, давно размещённого на площадке, но попавшего к нам недавно, равен дате его публикации, а не моменту, когда мы его нашли, — чтобы старое объявление не выглядело новым. - Изменено проверьте интеграцию В
/v1/feedсобытиеnewприходит и для таких объявлений — сfirst_seenв прошлом. Для постоянной выгрузки берите ленту: сортировка/v1/itemsпо дате такие объявления среди свежих не покажет.
- Новое Курсор работает и с
dedupe=true: каждая группа приходит ровно один раз. Объявления, появившиеся после первой страницы, в этот проход не попадают — их забирайте следующим проходом или лентой/v1/feed. - Изменено проверьте интеграцию Ответа
400 cursor_dedupeбольше нет. Курсор обычной выдачи и курсорdedupe=trueне взаимозаменяемы: чужой или испорченный курсор —400 bad_cursor.
- Исправлено Аренда земельных участков в выдаче больше не возвращается — как и описано в документации (раньше туда попадали такие объявления Авито).
- Новое Параметр
mcd— только станции МЦД;metro_kind=metro— станции изmetroтолько по линиям метро. Без нихmetroпо-прежнему ищет и метро, и МЦД. - Новое У станций в
metros— цвет линии иkind:metro,mcdилиnull./v1/facetsотдаёт вид станций и список МЦД. - Изменено
metroпо названию станции находит и её другие написания у площадок (metro=Москва-Ситинайдёт и «Международную»). - Документация Уточнено, почему на глубине надёжнее курсор: при притоке новых объявлений страницы
offsetсдвигаются, и объявление может прийти дважды или пропасть.
- Новое Курсор в
/v1/items: в каждом ответеnext_cursor— передайте его следующим запросом какcursorс теми же фильтрами. Порядок — по дате появления, новые сверху;offsetи сортировка при курсоре не нужны. Сdedupe=trueпока не работал (400 cursor_dedupe).
- Исправлено
dedupe=trueлистает всю выборку: раньше глубокие страницы со склейкой могли приходить пустыми. - Документация При
dedupe=trueпараметрыlimitиoffsetсчитаются в группах (объектах). - Документация Суточная квота считается по UTC и обнуляется в 03:00 по Москве; в квоту засчитывается каждый запрос с ключом, включая ответы
429и ошибки. - Документация Описан ответ
422: параметр не прошёл проверку (например,limitбольше 1000)./v1/facetsпринимаетlocality— районы и метро конкретного населённого пункта.
- Новое Лента изменений:
/v1/feed— новые объявления и смены цены,/v1/feed/delisted— снятия и возвраты. Курсорnext_cursor, параметрsince, хранение 90 дней; курсор старше — ответ410. - Новое
format=xmlу/v1/items,/v1/item/{…},/v1/feedи/v1/feed/delisted. - Новое Поле
phone_ads_count— сколько живых объявлений у этого номера в нашей базе. Приходит только ключам с доступом к телефонам.
- Изменено проверьте интеграцию
sqm_price_min/sqm_price_maxпринимаются только вместе сrealty_type=commercial, иначе400с причинойsqm_price_commercial_only. - Документация
price— за объект целиком: у продажи — стоимость, у аренды — плата в месяц. - Документация Описан код
404у/v1/item/{source}/{source_id}. Комнаты не собираем — этот тип убран из описанияrealty_type.
- Изменено В
titleплощадь участка от 1 гектара пишется в гектарах («Участок, 10 га»), меньше — в сотках.land_areaпо-прежнему всегда в сотках. - Документация
titleсобирает Metrapi из структурных полей; текст площадки — вdescription.
- Новое Коммерческая недвижимость:
realty_type=commercial(без явногоrealty_typeв выдачу не попадает). Фильтрыcommercial_type,building_class,commercial_building_type,entrance_type,tax_form,lease_type,sqm_price_min/sqm_price_max. Поляcommercial_types,building_class,commercial_building_type,business_center,entrance_type,tax_form,lease_type,commercial_layout.
- Новое Юла — восьмой источник (
source=yula). Запрос телефона для Юлы недоступен: площадка номер не отдаёт.
- Документация проверьте интеграцию Земельный участок — отдельный тип
realty_type=land(так с 01.09; до 11.09 документация ошибочно относила участки кhouse).houseучастков не возвращает, безrealty_typeучастки в выдаче есть. Аренду участков не собираем.
- Изменено проверьте интеграцию
/v1/item/{source}/{source_id}для ненайденного или скрытого объявления отвечает404(раньше —200). Тело прежнее:{"item": null, "detail": "not_found"}.
- Изменено проверьте интеграцию
phones,phone_redirectиphone_checked_atприходят только ключам с доступом к телефонам — так же, какphone. Форматphones:[{"n": "+7…", "r": false}], гдеr— подменный номер.
- Новое Ответ
/v1/itemsи/v1/item/{…}содержит тот же состав полей, что карточка в каталоге, — плюс 39 полей, в том числеtitle,description,locality,metros,jk,sale_type, коммуникации загородных объектов,seller_company,phones,phone_redirect. Полный список — в таблице «Поля объявления». - Новое
group_idиgroup_spread_m— идентификатор группы дублей (не зависит от цены) и разброс её координат в метрах. - Новое История цены: параметр
price_history=1в/v1/items, полеprice_historyв/v1/item/{…}, полная глубина —/v1/item/{source}/{source_id}/price-history.
Поддержка
Технические вопросы — support@metrapi.ru, по оплате — support@metrapi.ru или info@metrapi.ru, подключение и сотрудничество — info@metrapi.ru, или через систему тикетов в личном кабинете. Подробнее — на странице Контакты.