Объявления

Получение объявлений

Поиск объявлений по ID, external ID и с фильтрами

Получайте информацию об объявлениях для отображения статуса в вашей CRM или для синхронизации изменений.

Найдите объявление по ID

Используйте внутренний ID Rentix.

const response = await fetch('https://crm.rentix.md/api/v1/listings/42', {
  headers: { 'Authorization': 'ApiKey YOUR_API_KEY' }
});
const listing = await response.json();

console.log(`Статус: ${listing.formData.announcementStatus}`);
console.log(`URL: ${listing.publicUrl}`);
Ответ
{
  "id": 42,
  "externalId": "apt-001",
  "publicUrl": "https://rentix.md/announcement/42",
  "createdAt": "2024-01-15T10:30:00.000Z",
  "updatedAt": "2024-01-15T12:00:00.000Z",
  "lastSyncedAt": "2024-01-15T12:00:00.000Z",
  "formData": {
    "id": 42,
    "announcementStatus": "active",
    "announcementType": "rent",
    "propertyType": "residential",
    "propertySecondaryType": "apartment",
    "propertyCoordinates": { "lat": 47.0245, "lng": 28.8323 },
    "announcementValue": 500,
    "announcementCurrency": "EUR",
    "announcementDescription": "Просторная квартира...",
    "...": "остальные поля объявления"
  },
  "user": {
    "id": 1,
    "externalId": "agent-001",
    "name": "John Doe",
    "phone": "+37312345678",
    "role": "admin"
  },
  "files": [
    {
      "id": 123,
      "externalId": "apt-001-photo-1",
      "contentType": "image/jpeg",
      "size": "102400",  // in bytes
      "optimization": "success"
    }
  ]
}

Поля ответа

ПолеТипОписание
idnumberВнутренний ID объявления в Rentix
externalIdstring | nullВнешний ID из вашей CRM (null если не привязан)
publicUrlstringПубличная ссылка на объявление
createdAtstringISO дата создания
updatedAtstringISO дата последнего обновления
lastSyncedAtstring | nullISO дата последней CRM-синхронизации (null если не синхронизировалось)
formDataobjectВсе поля объявления (статус, тип, цена, координаты, описание и т.д.)
formData.idnumberСовпадает с id верхнего уровня
formData.announcementStatusstringСтатус объявления (draft, active, hidden, pending_active)
userobject | nullНазначенный агент (null если агент не назначен)
user.idnumberВнутренний ID пользователя
user.externalIdstring | nullВнешний ID пользователя из вашей CRM
user.namestringИмя пользователя
user.phonestringТелефон пользователя
user.rolestring | nullРоль в агентстве (admin, editor, viewer)
filesarrayПрикреплённые фотографии
files[].idnumberВнутренний ID файла
files[].externalIdstring | nullВнешний ID файла из вашей CRM
files[].contentTypestringMIME-тип (напр. image/jpeg)
files[].sizestringРазмер файла в байтах
files[].optimizationstringСтатус оптимизации (pending, processing, success, failed)
Объект formData содержит те же поля, что используются при создании или обновлении объявления. Подробнее — в Схеме полей.

Найдите объявление по external ID

Используйте ID из вашей CRM. Формат ответа аналогичен.

const response = await fetch('https://crm.rentix.md/api/v1/listings/external/apt-001', {
  headers: { 'Authorization': 'ApiKey YOUR_API_KEY' }
});
const listing = await response.json();

Получите список объявлений

Возвращает объявления с пагинацией и фильтрацией. Каждый элемент в ответе имеет тот же формат, что и одиночное объявление.

const response = await fetch('https://crm.rentix.md/api/v1/listings?status=active&limit=20', {
  headers: { 'Authorization': 'ApiKey YOUR_API_KEY' }
});

const { items, meta } = await response.json();
console.log(`Всего: ${meta.totalItems}, страница ${meta.currentPage} из ${meta.totalPages}`);

Параметры фильтрации

ПараметрТипОписание
statusenumФильтр по статусу (draft, active, hidden, pending_active)
userIdnumberФильтр по агенту (внутренний ID)
externalUserIdstringФильтр по агенту (external ID)
syncedAfterstringISO дата — только обновлённые после этой даты
pagenumberСтраница (1–1000)
limitnumberЭлементов на странице (1–100, по умолчанию 20)
Нельзя использовать userId и externalUserId одновременно.
Ответ
{
  "items": [
    {
      "id": 42,
      "externalId": "apt-001",
      "publicUrl": "https://rentix.md/announcement/42",
      "createdAt": "2024-01-15T10:30:00.000Z",
      "updatedAt": "2024-01-15T12:00:00.000Z",
      "lastSyncedAt": "2024-01-15T12:00:00.000Z",
      "formData": { "id": 42, "announcementStatus": "active", "..." : "..." },
      "user": { "id": 1, "externalId": "agent-001", "name": "John Doe", "phone": "+373...", "role": "admin" },
      "files": [{ "id": 123, "externalId": "photo-1", "contentType": "image/jpeg", "size": "102400",  // in bytes "optimization": "success" }]
    }
  ],
  "meta": {
    "currentPage": 1,
    "itemCount": 20,
    "itemsPerPage": 20,
    "totalItems": 150,
    "totalPages": 8
  }
}

Инкрементальная синхронизация

Для регулярной синхронизации запрашивайте только изменённые объявления с помощью syncedAfter.

// Сохраняйте время последней синхронизации
let lastSync = loadLastSyncTime() || new Date(0).toISOString();

async function syncChanges() {
  const response = await fetch(
    `https://crm.rentix.md/api/v1/listings?syncedAfter=${lastSync}`,
    { headers: { 'Authorization': 'ApiKey YOUR_API_KEY' } }
  );

  const { items, meta } = await response.json();

  for (const listing of items) {
    await updateInCrm(listing);
  }

  // Если есть ещё страницы, загружаем их
  if (meta.currentPage < meta.totalPages) {
    // Загрузить следующие страницы...
  }

  // Сохраняем время для следующей синхронизации
  lastSync = new Date().toISOString();
  saveLastSyncTime(lastSync);

  console.log(`Синхронизировано: ${items.length} объявлений`);
}
Результаты отсортированы по updatedAt — новые изменения первыми.

Частые ошибки

ОшибкаПричинаРешение
Listing not foundОбъявление не существует или принадлежит другому агентствуПроверьте ID и убедитесь, что используете правильный API ключ
Cannot use both userId and externalUserIdПереданы оба параметраИспользуйте только один
Copyright © 2026