XML-лента для проектов и планировок

1. Назначение фида

XML-фид передаёт структурированные данные о проектах недвижимости и типовых планировках. Его задача — позволить принимающей системе автоматически создавать и обновлять карточки проектов, отображать цены, статусы, галереи, удобства, условия оплаты, EOI и маркетинговые промоматериалы от застройщиков.

Фид передаёт планировки в агрегированном виде: одна запись о планировке описывает типовую планировку и количество доступных юнитов этого типа. Это не список конкретных квартир, офисов или лотов.

  • realty-feed: корневой контейнер всего XML-фида. Основной ID: —
  • offers: один проект или комплекс. Основной ID: complex-id
  • layouts: типовая планировка внутри проекта. Основной ID: id
  • payment_plans: один вариант оплаты проекта. Основной ID: id
  • eoi_item: одно условие EOI. Основной ID: —
  • stock: маркетинговая кампания, новость или промо-сообщение от застройщика. Основной ID: —

1.1 Что такое XML-фид

XML-фид — это структурированный файл с данными о проектах недвижимости и типовых планировках. Он включает описания, фото, цены, адреса, статусы, характеристики, удобства и другие данные, необходимые для отображения объектов на сайте агентства или в каталоге.

Проще говоря, XML-фид — это поток данных о недвижимости, который принимающая система регулярно загружает, читает и использует для автоматического обновления карточек объектов.

Alnair предоставляет данные. Разработка сайта, создание каталога, интеграция с CRM и логика импорта выполняются клиентом или его технической командой.

1.2 Что нужно агентству

Чтобы использовать XML-фид, агентству нужна собственная техническая инфраструктура, способная регулярно скачивать XML, разбирать его структуру и обновлять данные в своей системе.

  • Сайт или каталог недвижимости: место, где будут отображаться проекты и планировки из фида.
  • Техническая команда или разработчик: настройка скачивания XML, парсинга и импорта.
  • XML-парсер: чтение структуры XML и преобразование её во внутреннюю модель данных.
  • Модуль импорта: создание, обновление и деактивация проектов и планировок.
  • Планировщик задач: регулярный запуск импорта по расписанию, например через cron или scheduler.
  • Логирование ошибок: контроль неизвестных значений enum, пустых полей и ошибок загрузки.

1.3 Как агентство использует XML-фид

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

  1. Система агентства загружает XML по персональной веб-ссылке.
  2. XML сохраняется как необработанный снимок для диагностики и повторной обработки.
  3. Парсер читает структуру realty-feed, offers, layouts и вложенные блоки.
  4. Модуль импорта создаёт новые проекты и планировки или обновляет существующие.
  5. Объекты, которые исчезли из нового фида, помечаются как неактивные.
  6. Сайт агентства отображает актуальные карточки проектов, цены, галереи и статусы.

Основные возможности интеграции:

  • Автоматическое обновление: проекты и планировки обновляются без ручного ввода.
  • Создание страниц объектов: данные фида используются для карточек проектов и планировок.
  • Актуальные цены и статусы: сайт получает XML-обновления по расписанию.
  • Фильтры и поиск: для фильтрации можно использовать поля район, цена, тип недвижимости, количество комнат и площадь.
  • Медиа-галереи: в интерфейсе можно показывать фото проекта, тематические галереи и изображения планировок.

2. Общая структура XML

<realty-feed>
  <generation-date>2026-06-17T12:06:39+04:00</generation-date>
  <offers>...</offers>
  <offers>...</offers>
</realty-feed>

  • realty-feed: объект. Корневой блок фида.
  • generation-date: datetime. Дата и время генерации XML. Используется для проверки актуальности данных.
  • offers: object[]. Список проектов или комплексов. Каждый блок offers содержит данные проекта и его планировки.

2.1 Доступ к фиду и ограничения на загрузку

Фид предоставляется клиенту по персональной веб-ссылке. Ссылка уникальна для клиента и используется принимающей системой для автоматической загрузки XML.

Персональная ссылка доступна администратору в аккаунте Alnair. Администратор может передать её технической команде клиента для настройки импорта.

  • Тип доступа: персональная веб-ссылка. Индивидуальный URL XML-фида для клиента.
  • Где получить ссылку: аккаунт Alnair. Ссылка доступна администратору клиента.
  • Частота обновления фида: каждые 4 часа. Данные XML обновляются на стороне Alnair один раз в 4 часа.
  • Минимальный интервал загрузки: не чаще 1 раза в час. Принимающая система не должна обращаться к фиду чаще одного раза в час.
  • Превышение лимита: блокировка доступа. При слишком частых запросах доступ к фиду может быть временно заблокирован.

Рекомендуемая логика интеграции: настроить плановую загрузку через cron или scheduler, сохранять последний полученный XML и не запрашивать фид при каждой загрузке страницы сайта. Оптимальный режим — загружать фид не чаще одного раза в час, учитывая, что новые данные появляются примерно каждые 4 часа.

3. Проект: <offers>

offers — основная сущность фида. Она содержит описание проекта, застройщика, локацию, статус строительства и продаж, цены, медиа, удобства, планы оплаты, EOI, маркетинговые акции и типовые планировки.

<offers>
  <complex-id>5646</complex-id>
  <type>project</type>
  <logo>https://...</logo>
  <photo>https://...</photo>
  <title>...</title>
  <description>...</description>
  <price_on_request>1</price_on_request>
  <status>...</status>
  <construction_start_at>2025-01-01T00:00:00+04:00</construction_start_at>
  <construction_progress>15</construction_progress>
  <planned_completion_at>2027-12-31T00:00:00+04:00</planned_completion_at>
  <predicted_completion_at>2027-12-31T00:00:00+04:00</predicted_completion_at>
  <amenities>...</amenities>
  <developer>...</developer>
  <city>Dubai</city>
  <address>...</address>
  <latitude>25.000000</latitude>
  <longitude>55.000000</longitude>
  <districts>...</districts>
  <album>...</album>
  <albums>...</albums>
  <constructions_count>1</constructions_count>
  <for_sale_count>10</for_sale_count>
  <price>...</price>
  <br_prices>...</br_prices>
  <updated_at>2026-06-17T10:53:20+04:00</updated_at>
  <is_sold_out>0</is_sold_out>
  <payment_plans>...</payment_plans>
  <sales_status>...</sales_status>
  <stocks>...</stocks>
  <eoi>...</eoi>
  <service_charge>...</service_charge>
  <assignment>...</assignment>
  <is_limited_publication>0</is_limited_publication>
  <layouts>...</layouts>
</offers>

  • complex-id: integer. Уникальный ID проекта в Alnair. Используйте как внешний ID проекта для upsert.
  • type: enum. Тип сущности верхнего уровня: project или compound. Сохраняйте сырое значение и импортируйте как проект верхнего уровня.
  • logo: url. Логотип проекта. Показывайте в брендинге, не используйте как обложку.
  • photo: url. Основное изображение проекта / обложка. Используйте как cover image и hero image.
  • title: localized object. Название проекта на en/ru/ar. Отображайте в зависимости от языка интерфейса.
  • description: localized HTML. Описание проекта на en/ru/ar. Отображайте безопасно; HTML находится внутри CDATA.
  • price_on_request: 0/1. Флаг скрытия цены. Если 1, показывайте «Цена по запросу».
  • status: object. Статус строительства. Не путайте с sales_status.
  • construction_start_at: datetime. Дата начала строительства. Показывайте, если заполнена.
  • construction_progress: decimal. Процент готовности строительства. Отображайте как процент.
  • planned_completion_at: datetime. Плановая дата завершения проекта. Используйте как дату передачи.
  • predicted_completion_at: datetime. Прогнозируемая дата завершения. Может использоваться как обновлённая дата завершения.
  • amenities: object. Удобства и особенности проекта. Сопоставляйте по key.
  • developer: object. Застройщик проекта. Сохраняйте название и логотип.
  • city / address: string. Город и адрес проекта. Используйте в данных о локации.
  • latitude / longitude: decimal. Координаты. Используйте для карты.
  • districts: object. Районы проекта. Используйте для фильтров и карточки проекта.
  • album: object. Основная общая галерея проекта. Показывайте как общую галерею.
  • albums: object. Тематические галереи проекта. Группируйте по title.
  • for_sale_count: integer. Количество доступных юнитов в проекте. Можно отображать как наличие.
  • price: object. Общий диапазон цен проекта. Скрывайте, если price_on_request=1.
  • br_prices: object[]. Цены по количеству спален или категории. Используйте для фильтров и списков.
  • updated_at: datetime. Дата обновления проекта. Используйте для синхронизации.
  • is_sold_out: 0/1. Флаг распроданности. Используйте вместе с sales_status.
  • payment_plans: object[]. Варианты оплаты от застройщика. Отображайте как варианты оплаты.
  • sales_status: localized object. Статус продаж проекта. Определяет этап продаж.
  • stocks: object. Маркетинговые кампании и промо-сообщения от застройщика. Отображайте как промо-блоки.
  • eoi: object. Expression of Interest. Показывайте только для Presale (EOI).
  • service_charge: object. Сервисный сбор. Показывайте, если значение заполнено.
  • assignment: decimal. Условие перепродажи. Пустое значение означает, что условие не указано.
  • is_limited_publication: 0/1. Ограничение публикации. Если 1, не публикуйте публично без разрешения.
  • layouts: object[]. Типовые планировки проекта. Импортируйте как дочерние сущности проекта.

4. Локализованные поля

Локализованные поля имеют одинаковую структуру: значения на английском, русском и арабском передаются внутри тега.

<title>
  <en>Project Name</en>
  <ru>Название проекта</ru>
  <ar>اسم المشروع</ar>
</title>

  • en: английское значение. Рекомендуемый запасной вариант.
  • ru: русское значение.
  • ar: арабское значение.

Правило fallback:

  1. Используйте язык интерфейса, если он заполнен.
  2. Если нужный язык пуст, используйте en.
  3. Если en пуст, используйте ru.
  4. Если ru пуст, используйте ar.
  5. Если все значения пусты, не отображайте поле.

5. Статусы

5.1 Статус строительства: <status>

Статус строительства показывает физическое состояние проекта. Он не обозначает доступность для продаж.

<status>
  <key>development_stage_progress</key>
  <en>In Progress</en>
  <ru>Строится</ru>
  <ar>قيد الإنشاء</ar>
</status>

  • Scheduled: проект запланирован.
  • In Progress: строительство ведётся.
  • Ready: проект завершён.
  • Stopped: строительство остановлено.

5.2 Статус продаж: <sales_status>

Статус продаж показывает коммерческий этап проекта: анонс, пресейл, запуск, активные продажи или распродан.

  • Preliminary Info: ранняя информация о проекте.
  • Announcement: проект анонсирован.
  • Presale (EOI): идёт сбор EOI.
  • Launch: запуск продаж.
  • On Sale: проект доступен для покупки.
  • Sold Out: проект распродан.
  • Pending: статус ожидает обновления.

6. Застройщик и локация

Эти блоки нужны для отображения бренда застройщика и географического расположения проекта.

<developer>
  <title>
    <en>Developer Name</en>
    <ru>Developer Name</ru>
    <ar>Developer Name</ar>
  </title>
  <logo>https://...</logo>
</developer>
<city>Dubai</city>
<address>Project Address, Dubai</address>
<latitude>25.01809076</latitude>
<longitude>55.13354525</longitude>
<districts>
  <district>Jumeirah Village Triangle (JVT)</district>
</districts>

  • developer.title: localized object. Название застройщика.
  • developer.logo: url. Логотип застройщика.
  • city: string. Город.
  • address: string. Адрес.
  • latitude / longitude: decimal. Координаты для карты.
  • districts.district: string[]. Районы проекта.

7. Цены

7.1 Цена проекта: <price>

Цена на уровне проекта показывает общий диапазон цен на доступные предложения в проекте.

<price>
  <min>815462</min>
  <max>2089780</max>
  <min_usd>222009</min_usd>
  <max_usd>568942</max_usd>
  <currency>AED</currency>
</price>

  • min: decimal. Минимальная цена.
  • max: decimal. Максимальная цена.
  • min_usd: decimal. Минимальная цена в USD.
  • max_usd: decimal. Максимальная цена в USD.
  • currency: enum. Основная валюта, обычно AED.

Если price_on_request = 1, точные цены публично не отображаются, даже если price заполнен.

7.2 Цены по категориям: <br_prices>

br_prices группирует цены и площади по количеству спален или типу объекта. Это удобно для фильтров и коротких карточек проекта.

<br_prices>
  <key>1</key>
  <count>7</count>
  <min_price>1070564</min_price>
  <max_price>1289674</max_price>
  <min_price_m2>17204</min_price_m2>
  <max_price_m2>18483</max_price_m2>
  <currency>AED</currency>
  <min_area><m2>57.92</m2><ft2>623.45</ft2></min_area>
  <max_area><m2>74.17</m2><ft2>798.36</ft2></max_area>
</br_prices>

  • studio: студии.
  • 1-6: количество спален.
  • villa: виллы.
  • townhouse: таунхаусы.
  • n: не применимо / нежилая категория / другое.

8. Медиа

Медиа в фиде разделено на несколько типов. Их не следует объединять в одну галерею без учёта назначения: одно изображение может быть обложкой проекта, другое — логотипом, третье — промо-изображением, а четвёртое — планом этажа.

  • logo: offers.logo. Логотип проекта. Показывайте в брендинге проекта, не используйте как обложку.
  • photo: offers.photo. Основное изображение проекта / обложка. Используйте как cover image в карточке и hero image на странице проекта.
  • album.image: offers.album.image. Основная общая галерея проекта. Показывайте в общей галерее проекта.
  • albums.album.images.image: offers.albums.album.images.image. Тематическая галерея проекта. Группируйте по albums.album.title.
  • developer.logo: offers.developer.logo. Логотип застройщика. Показывайте в блоке застройщика.
  • stocks.stock.logo: offers.stocks.stock.logo. Изображение маркетинговой кампании. Показывайте внутри промо-блока.
  • layouts.album.image: offers.layouts.album.image. Галерея конкретной типовой планировки. Показывайте на уровне планировки.
  • levels_photos.level_photo.image: offers.layouts.levels_photos.level_photo.image. Изображение планировки по уровню. Используйте как план этажа.

<photo>https://...</photo>
<album>
  <image>https://...</image>
</album>
<albums>
  <album>
    <title><en>Infrastructure</en><ru>Инфраструктура</ru><ar>...</ar></title>
    <images>
      <image>https://...</image>
    </images>
  </album>
</albums>

  • Презентация проекта: изображения презентации проекта.
  • Ход строительства: фото прогресса строительства.
  • Примеры отделки: примеры отделки.
  • Инфраструктура: инфраструктура проекта.
  • Вид: виды и окружение.

Не каждая категория должна присутствовать в каждом проекте. Если название категории пустое, изображения можно импортировать как без категории или поместить в общую галерею.

В текущей структуре нет отдельного тега XML для истории/story. Новости, промо-сообщения и маркетинговые материалы проекта передаются через stocks. Для истории строительства можно использовать категорию Construction progress, если она присутствует в albums.

9. Удобства

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

<amenities>
  <amenity>
    <key>project_facilities_gym</key>
    <en>Gym</en>
    <ru>Тренажёрный зал</ru>
    <ar>صالة رياضية</ar>
  </amenity>
</amenities>

  • amenities: object. Контейнер удобств.
  • amenity: object. Одно удобство.
  • key: enum. Технический ключ.
  • en / ru / ar: string. Название удобства на трёх языках.

В ключе projecet_hotel_license есть опечатка, но его нужно сопоставлять как Hotel License. Рекомендуется поддерживать этот alias и не ломать импорт.

10. Маркетинговые акции: <stocks>

stocks — это маркетинговые кампании, новости и промо-сообщения от застройщиков. Они могут включать специальные цены, скидки, условия запуска, анонсы EOI, временные предложения по оплате и рекламные материалы. Этот блок не является складским остатком и не определяет наличие юнитов.

<stocks>
  <stock>
    <title>...</title>
    <description>...</description>
    <start_at>2025-06-26T00:00:00+04:00</start_at>
    <end_at/>
    <logo>https://...</logo>
  </stock>
</stocks>

  • stocks: object. Контейнер маркетинговых сообщений.
  • stock: object. Одна кампания, новость или промо-объявление.
  • title: localized object. Заголовок промо.
  • description: localized HTML. Описание промо.
  • start_at: datetime. Дата начала.
  • end_at: datetime. Дата окончания; может быть пустой.
  • logo: url. Изображение промо.

Для доступности объекта используйте for_sale_count, layouts.sale_units_count и sales_status, а не stocks.

11. EOI

EOI означает Expression of Interest. Блок описывает предварительный интерес или условия депозита для проектов в статусе Presale (EOI).

<eoi>
  <is_eoi_return>0</is_eoi_return>
  <eoi_items>
    <eoi_item>
      <price>100000</price>
      <percent/>
      <description>
        <en>EOI amount for 2 Bedrooms</en>
        <ru>Сумма EOI для 2-комнатных</ru>
        <ar>...</ar>
      </description>
    </eoi_item>
  </eoi_items>
</eoi>

  • is_eoi_return: 0/1/empty. 0 = невозвратный, 1 = возвратный, empty = не указано.
  • eoi_items: object. Контейнер условий EOI.
  • eoi_item: object. Одно условие EOI.
  • price: decimal. Фиксированная сумма EOI.
  • percent: decimal. Процент EOI, если используется.
  • description: localized object. Описание условия.
  • sales_status.en = Presale (EOI) и eoi_items заполнен: показывайте EOI.
  • Любой другой sales_status: скрывайте EOI.

12. Сервисный сбор и assignment

<service_charge>
  <value>172.22</value>
  <unit>sq. m</unit>
  <currency>AED</currency>
</service_charge>
<assignment>40.00</assignment>

  • service_charge.value: сумма сервисного сбора. Если пусто, блок не показывайте.
  • service_charge.unit: единица расчёта, обычно sq. m. Может быть пустой.
  • service_charge.currency: валюта, обычно AED. Может быть пустой.
  • assignment: процент, после которого возможен assignment. Пусто = информация не указана, не ограничение.

13. Планы оплаты: <payment_plans>

payment_plans описывает варианты оплаты объекта от застройщика. У одного проекта может быть несколько планов оплаты. Каждый план разбивает оплату по этапам: бронирование, строительство, передача и постоплата. Сборы и дополнительные платежи передаются отдельно, поэтому общий процент может превышать 100%. Например, 104% может означать 100% стоимости объекта + 4% DLD fee.

  • Basic: id, title, currency. Идентификатор плана, название и валюта. title — свободный текст, не enum.
  • Booking: on_booking_percent, on_booking_fix, on_booking_payments_count, on_booking_fees. Платежи и сборы на этапе бронирования.
  • Construction: on_construction_percent, on_construction_fix, on_construction_payments_count, on_construction_fees. Платежи в период строительства.
  • Handover: on_handover_percent, on_handover_fix, on_handover_payments_count, on_handover_fees. Платежи при передаче объекта.
  • Post-handover: post_handover_percent, post_handover_fix, on_post_handover_payments_count, on_post_handover_fees. Платежи после передачи.
  • ROI: roi_percent, roi_fix, roi_payments_count, roi_fees. Поля для схем ROI или гарантированного дохода.
  • Additional fees: additional, additional_percent, additional_fix, additional_fix_m2. Дополнительные платежи, например DLD Fee.
  • Periods: period_after_handover, period_after_roi. Периодичность повторяющихся платежей.
  • Totals: price_total, fees_included_total. Общие суммы плана и включённые сборы.

14. Планировки: <layouts>

layouts описывает типовую планировку внутри проекта. Это агрегированный тип юнита, а не конкретная квартира или офис.

  • id: integer. Уникальный ID планировки. Используйте как внешний ID планировки.
  • title: localized object. Название планировки. Отображайте в зависимости от языка интерфейса.
  • project_id: integer. ID родительского проекта. Связывайте с offers.complex-id.
  • building_name: localized object. Название здания. Не показывайте, если пусто.
  • price_on_request: 0/1. Флаг скрытия цены. Если 1, цену не показывайте.
  • area_min / area_max: object. Диапазон площади. m2 и ft2.
  • area_balcony_min / area_balcony_max: object. Диапазон площади балкона. Может быть пустым.
  • type: localized object. Тип объекта. См. справочник Unit type.
  • sale_units_count: integer. Количество доступных юнитов этого типа. Это не список лотов.
  • album: object. Галерея планировки. Показывайте на уровне планировки.
  • levels_photos: object. Изображения по уровню. Используйте как планы этажей.
  • floors_count: integer. Количество уровней. 1, 2, 3 и т. д.
  • rooms_count: localized object. Количество комнат. См. справочник Rooms count.
  • price: object. Диапазон цен планировки. Скрывайте, если price_on_request=1.
  • is_limited_publication: 0/1. Ограничение публикации. Если 1, скрывайте публично.

15. Справочник значений enum

  • Тип проекта: project, compound.
  • Статус продаж: Preliminary Info, Announcement, Presale (EOI), Launch, On Sale, Sold Out, Pending.
  • Статус строительства: Scheduled, Ready, Stopped, In Progress.
  • Тип юнита: Apartment, Villa, Townhouse, Duplex, Triplex, Penthouse, Retail, Office, Suite.
  • Количество комнат: Studio, 1 BR, 2 BR, 3 BR, 4 BR, 5 BR, 6 BR, 7 BR, 8 BR, NA.
  • Ключ BR price: studio, 1, 2, 3, 4, 5, 6, villa, townhouse, n.
  • Категория галереи: Project presentation, Construction progress, Finishing examples, Infrastructure, View.
  • Валюта: AED.
  • Единица сервисного сбора: sq. m.
  • Булевы флаги: 0, 1; для некоторых полей допускается пустое значение.

Если фид содержит значение, которого нет в справочнике, импорт не должен падать. Значение нужно сохранить как сырое, сопоставить как неизвестное и записать в лог для проверки.

16. Пустые значения

Пустое значение означает «не указано», а не 0. Пустые теги могут выглядеть как <field/> или <field></field>.

  • assignment: условие assignment не указано.
  • service_charge.value: сервисный сбор не указан.
  • eoi.is_eoi_return: возвратность EOI не указана.
  • area_balcony_min.m2: площадь балкона не указана.
  • description.en: описание отсутствует.

17. Правила отображения

  • Цена скрыта: price_on_request = 1. Показывайте «Цена по запросу».
  • Цена видна: price_on_request = 0. Показывайте min/max цены.
  • EOI: sales_status.en = Presale (EOI) и EOI заполнен. Показывайте EOI.
  • EOI неактуален: sales_status.en != Presale (EOI). Скрывайте EOI.
  • Распродано: is_sold_out = 1 или sales_status.en = Sold Out. Показывайте «Распродано» или скрывайте из списка.
  • Ограниченная публикация: is_limited_publication = 1. Не публикуйте публично.
  • Assignment пуст: assignment пуст. Не показывайте блок assignment.
  • Сервисный сбор пуст: service_charge.value пуст. Не показывайте сервисный сбор.

18. Правила импорта

  • Проект: искать по complex-id; если найден — обновить, если нет — создать.
  • Планировка: искать по layouts.id; связывать с проектом по project_id.
  • Удаление: если объект исчез из нового фида, помечать его неактивным, а не удалять сразу.
  • Неизвестный enum: сохранять сырое значение, сопоставлять как unknown и логировать.
  • Пустые значения: не преобразовывать в 0 без явного правила для конкретного поля.

Поле проекта → Источник

  • external_project_id: complex-id.
  • raw_offer_type: type.
  • title_*: title.
  • description_*: description.
  • developer_name: developer.title.
  • developer_logo_url: developer.logo.
  • city/address/coordinates: city, address, latitude, longitude.
  • districts: districts.district.
  • construction_status: status.en.
  • sales_status: sales_status.en.
  • price_min / price_max: price.
  • price_on_request: price_on_request.
  • galleries: photo, album, albums.
  • payment_plans: payment_plans.
  • eoi: eoi.
  • stocks: stocks.
  • source_updated_at: updated_at.

Поле планировки → Источник

  • external_layout_id: layouts.id.
  • external_project_id: layouts.project_id.
  • title_*: layouts.title.
  • building_name_*: building_name.
  • unit_type: type.en.
  • rooms_count: rooms_count.en.
  • sale_units_count: sale_units_count.
  • area_min / area_max: area_min, area_max.
  • balcony_min / balcony_max: area_balcony_min, area_balcony_max.
  • floors_count: floors_count.
  • price_min / price_max: price.
  • layout_gallery: album.
  • levels_photos: levels_photos.
  • is_limited_publication: is_limited_publication.