Первичная синхронизация
При первом подключении 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. Агенты (опционально)
Объявления можно публиковать без привязки к конкретному агенту — в этом случае будет отображаться информация агентства. Это удобно на этапе перехода, пока не все агенты зарегистрированы на платформе.
Приглашение агентов
Агентов нужно приглашать через веб-интерфейс — им потребуется подтверждение по телефону:
- Войдите на rentix.md
- Откройте Меню → Название агентства → Приглашения
- Введите 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);
Что происходит после отправки
После отправки данных система автоматически:
- Загружает фотографии по указанным URL
- Оптимизирует изображения — сжатие, конвертация, создание превью
- Анализирует фото — определяет характеристики объекта (удобства, мебель и т.д.)
- Переводит описание на все языки платформы
- Публикует объявление — статус меняется на
active
Вам не нужно отслеживать статус каждой операции. Если возникнет ошибка, вы увидите её в результате bulk-запроса.
Что дальше
После первичной синхронизации настройте непрерывную синхронизацию для регулярного обновления данных.