Guides

Первичная синхронизация

Загрузите все объявления из CRM при первом подключении

При первом подключении CRM нужно загрузить все существующие объявления в Rentix. Благодаря встроенному импорту фотографий по URL, это делается в один шаг.

Обзор процесса

1. Подготовка        → Проверка API ключа
2. Агенты (опционально) → Приглашение и привязка агентов
3. Синхронизация     → Bulk-загрузка объявлений с фото и статусом

Система автоматически обрабатывает фотографии, переводит описания и публикует объявления. Вам не нужно отслеживать статус каждой операции.


Шаг 1. Подготовка

Проверьте подключение

const API_KEY = 'YOUR_API_KEY';
const BASE_URL = 'https://crm.rentix.md/api/v1';

async function checkConnection() {
  const response = await fetch(`${BASE_URL}/agency`, {
    headers: { 'Authorization': `ApiKey ${API_KEY}` }
  });

  if (!response.ok) {
    throw new Error('Ошибка подключения. Проверьте API ключ.');
  }

  const agency = await response.json();
  console.log(`Подключено: ${agency.name}`);
  console.log(`Лимит объявлений: ${agency.limits.monthlyListings.limit}`);

  return agency;
}

Шаг 2. Агенты (опционально)

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

Приглашение агентов

Агентов нужно приглашать через веб-интерфейс — им потребуется подтверждение по телефону:

  1. Войдите на rentix.md
  2. Откройте МенюНазвание агентстваПриглашения
  3. Введите email агента и отправьте приглашение

Привязка после регистрации

После того как агенты приняли приглашения, привяжите их к записям в вашей CRM:

async function linkAgents(crmAgents) {
  // Получить агентов из Rentix
  const response = await fetch(`${BASE_URL}/users`, {
    headers: { 'Authorization': `ApiKey ${API_KEY}` }
  });
  const { items: rentixAgents } = await response.json();

  // Подготовить операции привязки
  const operations = [];

  for (const crmAgent of crmAgents) {
    const match = rentixAgents.find(r => r.phone === crmAgent.phone);
    if (match && !match.externalId) {
      operations.push({
        op: 'link',
        id: match.id,
        externalId: crmAgent.id
      });
    }
  }

  if (operations.length === 0) return;

  // Bulk-привязка
  await fetch(`${BASE_URL}/users/bulk`, {
    method: 'POST',
    headers: {
      'Authorization': `ApiKey ${API_KEY}`,
      'Content-Type': 'application/json'
    },
    body: JSON.stringify({ operations })
  });

  console.log(`Привязано агентов: ${operations.length}`);
}

После привязки вы сможете указывать агентов в объявлениях по их external ID из вашей CRM.


Шаг 3. Синхронизация объявлений

Отправляйте объявления пакетами по 100 штук. Фотографии передавайте по URL — система загрузит их автоматически.

Преобразование данных

function transformListing(crmListing) {
  return {
    op: 'upsert',
    externalId: crmListing.id,

    // Тип
    announcementType: crmListing.type === 'sale' ? 'sale' : 'rent',
    propertyType: 'residential',
    propertySecondaryType: mapPropertyType(crmListing.category),

    // Цена
    announcementValue: crmListing.price,
    announcementCurrency: crmListing.currency || 'EUR',
    announcementPayPeriod: crmListing.type === 'rent' ? 'monthly' : undefined,

    // Характеристики
    propertyArea: crmListing.area,
    propertyFloorNumber: crmListing.floor,
    propertyFloorsTotal: crmListing.totalFloors,

    // Описание
    announcementDescription: crmListing.description,

    // Фото — передайте URL и externalFileId для отслеживания
    files: crmListing.photos.map((photo, index) => ({
      url: photo.url,
      externalFileId: photo.id,
    })),

    // Агент (если привязан)
    user: { externalUserId: crmListing.agentId },

    // Сразу публикуем
    announcementStatus: 'active'
  };
}

function mapPropertyType(category) {
  const map = {
    'квартира': 'apartment',
    'дом': 'house',
    'комната': 'room',
  };
  return map[category];
}

Отправка пакетами

function chunkArray(array, size) {
  const chunks = [];
  for (let i = 0; i < array.length; i += size) {
    chunks.push(array.slice(i, i + size));
  }
  return chunks;
}

async function syncListings(crmListings) {
  const operations = crmListings.map(transformListing);
  const chunks = chunkArray(operations, 100);

  let total = 0;

  // Отправляйте пакеты последовательно
  for (const chunk of chunks) {
    const response = await fetch(`${BASE_URL}/listings/bulk`, {
      method: 'POST',
      headers: {
        'Authorization': `ApiKey ${API_KEY}`,
        'Content-Type': 'application/json'
      },
      body: JSON.stringify({ operations: chunk })
    });

    const result = await response.json();
    total += result.summary.succeeded;

    console.log(`Обработано: ${total}/${crmListings.length}`);

    // Логировать ошибки
    const failed = result.results.filter(r => !r.success);
    for (const f of failed) {
      console.error(`Ошибка ${f.externalId}: ${f.error?.message}`);
    }
  }

  return total;
}
Отправляйте пакеты последовательно, а не параллельно. Система ставит все операции в очередь — параллельная отправка не ускорит обработку, но может привести к ошибкам.

Полный скрипт

async function fullSync() {
  console.log('=== Первичная синхронизация ===');

  // 1. Проверка подключения
  console.log('\n1. Проверка подключения...');
  await checkConnection();

  // 2. Получить данные из CRM
  console.log('\n2. Получение данных из CRM...');
  const crmListings = await getListingsFromCRM(); // ваша функция
  console.log(`Найдено: ${crmListings.length} объявлений`);

  // 3. Синхронизация объявлений
  console.log('\n3. Синхронизация объявлений...');
  const synced = await syncListings(crmListings);

  console.log('\n=== Синхронизация завершена ===');
  console.log(`Отправлено: ${synced} объявлений`);
  console.log('Объявления появятся на сайте после обработки.');
}

fullSync().catch(console.error);

Что происходит после отправки

После отправки данных система автоматически:

  1. Загружает фотографии по указанным URL
  2. Оптимизирует изображения — сжатие, конвертация, создание превью
  3. Анализирует фото — определяет характеристики объекта (удобства, мебель и т.д.)
  4. Переводит описание на все языки платформы
  5. Публикует объявление — статус меняется на active

Вам не нужно отслеживать статус каждой операции. Если возникнет ошибка, вы увидите её в результате bulk-запроса.


Что дальше

После первичной синхронизации настройте непрерывную синхронизацию для регулярного обновления данных.

Copyright © 2026