Документация API

REST API ко всем объявлениям недвижимости России из 8 источников. Базовый адрес: https://api.metrapi.ru
Документация обновлена: 28.10.2026, 01:30 МСК · что изменилось

Введение

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.

Быстрый старт

  1. Получите ключ — подключите полный доступ в личном кабинете или напишите на info@metrapi.ru. Ключ выглядит как metrapi_xxxxxxxx.
  2. Добавьте его в заголовок X-Api-Key каждого запроса.
  3. Шлите запросы на 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&region=Самарская+область   # -> { "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зона обхода: город сбора и его окрестности (код), можно несколько. Для конкретного города — localitycity=msk&city=spb
deal_typeтип сделкиsale — продажа, rent — аренда
realty_typeтип объекта, можно несколько. Земельный участок — отдельный тип land: house участков не возвращает. Без параметра в выдачу попадают квартиры, дома и участки; коммерческая приходит только по явному запросу realty_type=commercial; гаражи — только по явному запросу realty_type=garageflat — квартира, 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_first1 = без первого этажа (со второго и выше)floor_not_first=1
floor_not_last1 = без последнего этажа дома. Объявления, где площадка не указала этаж или этажность дома, в выдачу не попадаютfloor_not_last=1
apart_fno — без апартаментов, only — только апартаменты. Признак ставит площадка (ЦИАН, ДомКлик, Яндекс, Авито, Move, Юла, sob.ru)apart_f=no
sale_typeтип продажи, можно несколько: free — свободная продажа, alt — альтернатива, none — площадка тип не указала. Тип отмечают ЦИАН, ДомКлик, Яндекс, Авито и sob.ru; у Move, Юлы и FarPost его нет — их объявления попадают только в none. Редкие типы (переуступка, первичная продажа вторички) в выдачу с фильтром не попадают. Незнакомый код — 400 bad_sale_typesale_type=free&sale_type=alt
lat / lon / radius_kmкруг на карте: центр и радиус от 0.1 до 10 км, все три вместе. Область — для поиска рядом (район, два соседних); целый город ищите через region / locality. В выдачу попадают объявления с координатами внутри круга; без координат — не попадают. Неполный круг или радиус вне диапазона — 400 bad_radiuslat=55.7558&lon=37.6173&radius_km=2
polyобласть-многоугольник: точки «широта,долгота» через ;, от 3 до 50 точек, не больше 30 км по диагонали рамки (от самой южной и западной точки до самой северной и восточной). Неверный контур — 400 bad_poly; вместе с кругом — 400 bad_areapoly=55.75,37.60;55.76,37.62;55.74,37.63
districtрайон, можно несколькоdistrict=Тверской
metroстанция метро или МЦД, можно несколько — метро и МЦД вместе. По названию станции находятся и её другие написания у площадок (metro=Москва-Сити найдёт и объявления со старым именем «Международная»)metro=Тверская
metro_kindmetro — станции из 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_afterlast_seen_after=2026-10-15T00:00:00Z
dedupeсклейка дублейdedupe=true
archived1 = включить снятые с публикации (по умолчанию их нет в выдаче)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=truecursor=eyJ...
formatформат ответа: json (по умолчанию) или xml — см. Формат XMLformat=xml

Чего нет в выдаче

Часть объявлений отсекается ещё до фильтров — если не знать об этом, результат выглядит неполным без видимой причины:

Что не отдаёмПодробности
Снятые с публикацииПо умолчанию их нет. Добавьте archived=1, чтобы получить и их — у таких объявлений заполнено поле delisted_at.
Посуточная арендаИсключена полностью: в базе она есть, но в выдачу не попадает, поэтому rent_period=daily вернёт пусто. Нужна посуточная — напишите нам.
КомнатыНе собираем.
Аренда земельных участковНе собираем: участки есть только в продаже, поэтому realty_type=land&deal_type=rent вернёт пусто.
Новостройки от застройщикаНе собираем принципиально — только вторичный рынок и переуступки.
Отключённые площадкиЭтажи, БН.ру, N1 и Мир Квартир сейчас не собираются; их объявлений в выдаче нет. Живой список — /v1/sources.

Поля объявления

Ответ содержит только перечисленные ниже поля. Незаполненные приходят как 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_redirecttrue — номер подменный: это переадресация площадки, а не прямой номер продавца. Признак приходит вместе с номером, гадать по источнику не нужно
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когда объявление вручную актуализировали

Коды ответов

КодЗначение
200OK
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) открыты без ключа. Живые запросы — в песочнице.

GET/v1/items

Список объявлений с фильтрами. Главный эндпоинт. Все параметры — из таблицы Фильтры. Не чаще 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": [ { ... } ] }
GET/v1/item/{source}/{source_id}

Одно объявление по источнику и его 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"
GET/v1/item/{source}/{source_id}/price-history

История изменений цены объявления: массив {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"}
]}
GET/v1/feed

Лента изменений: новые объявления и смены цены по курсору (подробно — в разделе Лента изменений). Параметры: 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}
]}
GET/v1/feed/delisted

Снятия с публикации (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"
GET/v1/sources

Список источников и их статус. Значение code используйте в фильтре source=.

curl -H "X-Api-Key: КЛЮЧ" "https://api.metrapi.ru/v1/sources"
# -> { "sources": [ {"code":"avito","name":"Avito","status":"live"}, ... ] }
GET/v1/stats

Сводная статистика каталога (сколько объявлений, по источникам). Удобно для дашбордов.

curl "https://api.metrapi.ru/v1/stats"
GET/v1/cities

Коды зон обхода — значения для параметра city=. Зона — это город сбора и его окрестности: city=kazan вернёт объявления и по соседним населённым пунктам Татарстана. Нужен конкретный город — фильтруйте locality.

curl "https://api.metrapi.ru/v1/cities"
GET/v1/facets

Районы и метро указанного города (с числом объявлений) — для значений district= и metro=. Параметры: city (код зоны), deal_type, locality — районы и метро конкретного населённого пункта. У станции поле kinds — какими она бывает (metro, mcd или обе), остановки МЦД отдельно списком mcd.

curl "https://api.metrapi.ru/v1/facets?city=msk&deal_type=sale"
GET/v1/land-statuses

Список статусов участка — значения для фильтра land_status=; подходят и для домов, и для земельных участков.

curl "https://api.metrapi.ru/v1/land-statuses"
GET/v1/changelog

Журнал изменений 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 при следующей проверке.
POST/v1/phone/refresh/{source}/{source_id}

Запросить актуальный телефон по одному объявлению. Не чаще 1 раза в 5 секунд на ключ; одно и то же объявление перезапрашивается у площадки не чаще раза в час — внутри этого окна отдаём уже собранный номер. Для Avito и Юлы запрос телефона недоступен — эти площадки номер не отдают.

curl -X POST -H "X-Api-Key: КЛЮЧ" \
  "https://api.metrapi.ru/v1/phone/refresh/avito/1234567890"
Обновляет только телефон. Полная актуализация всех полей — отдельный эндпоинт /v1/item/.../refresh.
POST/v1/item/{source}/{source_id}/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. Больше — 400 bad_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, или через систему тикетов в личном кабинете. Подробнее — на странице Контакты.