RETS (Real Estate Transaction Standard) — открытый протокол обмена данными объектов недвижимости, а запрос «rets standard small» обычно возникает у разработчиков, которым нужно подключить небольшую MLS-систему или сайт агентства к RETS-серверу без развёртывания тяжёлой инфраструктуры. Проблема в том, что полный стек RETS с авторизацией по дайджесту, сессионными cookie и XML-метаданными выглядит избыточным для маленького проекта, поэтому ищут компактный вариант реализации.

В этой статье разберём, что стоит за понятием «small» в контексте RETS, как устроен протокол, какие библиотеки подходят для лёгкой интеграции и на что обратить внимание при выгрузке листингов. Отдельно рассмотрим переход на RESO Web API, который постепенно вытесняет классический RETS.

Что такое RETS и откуда взялся термин «small»

RETS разработан организацией RESO (Real Estate Standards Organization) как единый способ передачи данных между MLS (Multiple Listing Service) и внешними системами: сайтами агентств, CRM, аналитическими сервисами. Протокол работает поверх HTTP/HTTPS и возвращает данные в компактном текстовом или XML-формате.

Термин «small» в запросах обычно означает одно из трёх: компактный формат ответа COMPACT (в отличие от XML), минимальную клиентскую реализацию для небольшого проекта или работу с малой MLS, где объём листингов невелик и полноценная ETL-инфраструктура не нужна. Во всех трёх случаях логика работы одинакова: логин, запрос метаданных, поиск, выгрузка, логаут.

RETS официально признан устаревшим: RESO рекомендует новым интеграциям использовать RESO Web API на базе OData, но множество MLS-серверов до сих пор отдают данные только через RETS.

Как устроен протокол: основные транзакции

Клиент RETS общается с сервером через набор стандартных транзакций. Понимание их последовательности важнее, чем знание конкретной библиотеки — логика везде одинаковая.

  • 🔐 Login — аутентификация по HTTP Digest, получение сессионного cookie и URL-адресов остальных сервисов.
  • 📋 GetMetadata — загрузка описания ресурсов, классов и полей (фактически схемы данных конкретной MLS).
  • 🔍 Search — запрос листингов с фильтрами на языке DMQL (или DMQL2).
  • 🖼️ GetObject — скачивание фотографий и документов объектов.
  • 🚪 Logout — завершение сессии, обязательное для корректной работы лимитов сервера.

Обратите внимание: названия ресурсов, классов и системные имена полей у каждой MLS свои. Универсального маппинга не существует — схему всегда нужно читать через GetMetadata конкретного сервера, а не копировать из чужих примеров.

Компактный формат COMPACT и COMPACT-DECODED

Параметр Format в поисковом запросе определяет вид ответа. Для «лёгких» интеграций чаще всего выбирают COMPACT-DECODED — табличный текст, где поля разделены табуляцией, а значения уже раскодированы в читаемый вид (например, вместо кода статуса возвращается его текстовое обозначение).

Типичный поисковый запрос выглядит так:

SearchType=Property&Class=RES&Query=(Status=|Active)&Format=COMPACT-DECODED&Limit=100

Имена классов (Property, RES) и значения статусов здесь приведены как пример — у вашей MLS они могут отличаться. Сверяйте их с метаданными сервера перед запуском выгрузки.

📊 Как вы планируете получать данные из MLS?
Классический RETS через готовую библиотеку
Пишу собственный минимальный клиент
Перехожу на RESO Web API
Ещё выбираю подход

Минимальная реализация для небольшого проекта

Для малого объёма данных вам не нужен полноценный ETL-конвейер. Достаточно скрипта, который раз в сутки (или чаще, если позволяют условия MLS) выполняет инкрементальную выгрузку по дате изменения записей. Ключевой принцип — никогда не тянуть всю базу целиком, если можно запросить только изменившиеся листинги.

Из готовых инструментов чаще всего упоминают библиотеку PHRETS для PHP и rets-client для Node.js. Обе берут на себя дайджест-авторизацию, разбор COMPACT-ответов и работу с сессией. Если ваш стек другой, ищите клиент под него — самостоятельная реализация Digest-аутентификации и парсинга метаданных заметно увеличит сроки.

☑️ Чек-лист первой инкрементальной выгрузки RETS

Выполнено: 0 / 6
⚠️ Внимание: многие RETS-серверы ограничивают число одновременных сессий и размер одного ответа. Если скрипт падает с обрывом соединения, проверьте, не забыли ли вы Logout в предыдущем запуске и не превышает ли выгрузка лимит записей за один запрос.

Типичные ошибки при подключении

Больше всего вопросов вызывает этап авторизации. RETS использует HTTP Digest, и если клиент отправляет Basic-авторизацию или не передаёт сессионный cookie в последующих запросах, сервер отвечает ошибкой 401. Вторая частая проблема — неверные имена полей в DMQL-запросе: запрос с несуществующим системным именем возвращает ошибку 20200 (Unknown Query Field) или похожий код.

СимптомВероятная причинаЧто проверить
Ошибка 401 при логинеНеверный тип авторизации или учётные данныеDigest-режим в клиенте, логин/пароль, user-agent
Код 20200 в ответе SearchПоле из запроса отсутствует в метаданныхСистемные имена полей через GetMetadata
Обрыв выгрузки на больших выборкахПревышен лимит записей сервераПараметры Limit/Offset, постраничность
Отказ в новых сессияхНе закрыты предыдущие сессииВызов Logout, таймауты сессий
Коды вместо текста в поляхИспользуется COMPACT вместо COMPACT-DECODEDПараметр Format в запросе
💡

Сохраняйте сырой ответ GetMetadata в файл при первой настройке — это избавит от лишних запросов к серверу на этапе отладки и даст актуальный справочник полей.

RETS или RESO Web API: что выбрать сейчас

Если MLS предлагает оба варианта, для нового проекта разумнее смотреть в сторону RESO Web API: это REST-подход с OAuth 2.0 и JSON вместо сессий и COMPACT-таблиц. Код интеграции получается заметно проще, а стандартизированные поля Data Dictionary снижают зависимость от локальных схем конкретной MLS.

Однако выбор не всегда за вами: часть MLS продолжает работать только по RETS, и тогда компактный RETS-клиент остаётся единственным вариантом. Практичная стратегия — изолировать слой получения данных за собственным интерфейсом, чтобы при миграции MLS на Web API переписать только адаптер, а не всю систему.

Почему RETS считается устаревшим

Протокол спроектирован в конце 1990-х: сессионная модель, собственный язык запросов DMQL и текстовый формат COMPACT плохо сочетаются с современными REST-практиками. RESO официально перевела RETS в статус устаревшего и развивает вместо него Web API на базе OData 4.0. При этом фактическая поддержка RETS на серверах MLS сохраняется, поэтому навык работы с ним остаётся востребованным.

💡

Для небольшой интеграции достаточно готового RETS-клиента, инкрементальной выгрузки по дате изменения и корректного закрытия сессий — полноценная инфраструктура не нужна.

FAQ: частые вопросы по RETS

Что означает «small» в контексте RETS?

Единого официального «малого» стандарта RETS не существует. Под этим обычно понимают компактный формат ответа COMPACT, минимальную клиентскую реализацию или работу с небольшой MLS. Базовый протокол во всех случаях один и тот же.

Можно ли подключиться к RETS без готовой библиотеки?

Технически да — это обычные HTTP-запросы. Но придётся самостоятельно реализовать Digest-аутентификацию, управление сессионными cookie и разбор COMPACT-ответов, что заметно увеличивает трудозатраты. Для большинства проектов готовый клиент оправдан.

Почему сервер возвращает коды вместо понятных значений полей?

Вы используете формат COMPACT. Переключите параметр Format на COMPACT-DECODED — сервер сам подставит текстовые расшифровки справочных значений.

Как часто можно делать выгрузки?

Это определяется правилами конкретной MLS, а не протоколом. Уточните лимиты в соглашении о доступе к данным и используйте инкрементальные запросы по дате изменения, чтобы не нагружать сервер полными выгрузками.

Стоит ли начинать новый проект на RETS?

Если MLS поддерживает RESO Web API — начинайте с него. RETS выбирайте только когда другого способа получить данные нет, и сразу проектируйте код так, чтобы слой доступа к данным можно было заменить.