Непрерывная синхронизация
После первичной синхронизации настройте регулярное обновление, чтобы изменения в CRM отражались на Rentix.
Подходы к синхронизации
Вы можете отправлять данные в Rentix в любое время и любым удобным способом:
- Сразу при изменении — отправляйте данные в момент сохранения в CRM
- Периодически — запускайте синхронизацию по расписанию
- Пакетами — накапливайте изменения и отправляйте группой через bulk-эндпоинт
Выбор зависит от вашей архитектуры и требований к скорости обновления данных.
Синхронизация по расписанию
Периодически запрашивайте изменённые объявления из вашей CRM и отправляйте их в Rentix.
Логика работы
- Сохраните время последней успешной синхронизации
- Запросите изменённые объявления из CRM (начиная с этого времени)
- Отправьте изменения в Rentix через bulk-эндпоинт
- Обновите время последней синхронизации
Пример запроса
const response = await fetch('https://crm.rentix.md/api/v1/listings/bulk', {
method: 'POST',
headers: {
'Authorization': 'ApiKey YOUR_API_KEY',
'Content-Type': 'application/json'
},
body: JSON.stringify({
operations: [
{
op: 'upsert',
externalId: 'apt-123',
announcementValue: 45000,
announcementStatus: 'active'
},
{
op: 'upsert',
externalId: 'apt-456',
announcementStatus: 'hidden'
}
]
})
});
const result = await response.json();
console.log(`Обновлено: ${result.summary.succeeded}/${result.summary.total}`);
curl -X POST https://crm.rentix.md/api/v1/listings/bulk \
-H "Authorization: ApiKey YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"operations": [
{
"op": "upsert",
"externalId": "apt-123",
"announcementStatus": "active",
"announcementValue": 45000
},
{
"op": "upsert",
"externalId": "apt-456",
"announcementStatus": "hidden"
}
]
}'
$data = [
'operations' => [
[
'op' => 'upsert',
'externalId' => 'apt-123',
'announcementValue' => 45000,
'announcementStatus' => 'active'
],
[
'op' => 'upsert',
'externalId' => 'apt-456',
'announcementStatus' => 'hidden'
]
]
];
$ch = curl_init('https://crm.rentix.md/api/v1/listings/bulk');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Authorization: ApiKey YOUR_API_KEY',
'Content-Type: application/json'
]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
announcementStatus: "hidden" для объявлений, удалённых в вашей CRM.Синхронизация по событию
При изменении объявления в CRM отправляйте данные в Rentix сразу.
Для одного объявления
const response = await fetch('https://crm.rentix.md/api/v1/listings', {
method: 'PUT',
headers: {
'Authorization': 'ApiKey YOUR_API_KEY',
'Content-Type': 'application/json'
},
body: JSON.stringify({
externalId: 'apt-123',
announcementValue: 46000,
announcementDescription: 'Обновлённое описание'
})
});
const result = await response.json();
curl -X PUT https://crm.rentix.md/api/v1/listings \
-H "Authorization: ApiKey YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"externalId": "apt-123",
"announcementValue": 46000,
"announcementDescription": "Обновлённое описание"
}'
$data = [
'externalId' => 'apt-123',
'announcementValue' => 46000,
'announcementDescription' => 'Обновлённое описание'
];
$ch = curl_init('https://crm.rentix.md/api/v1/listings');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT');
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Authorization: ApiKey YOUR_API_KEY',
'Content-Type: application/json'
]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
Для нескольких объявлений
Если ваша CRM накапливает изменения или генерирует пакетные события, используйте bulk-эндпоинт.
Комбинированный подход
Для максимальной надёжности комбинируйте оба подхода:
- События — для мгновенных обновлений
- Периодическая проверка — для обнаружения пропущенных изменений
Периодическая проверка выступает как резервный механизм на случай сбоев в событийной системе.
Рекомендации
Отправляйте только изменения
{
"operations": [
{
"op": "upsert",
"externalId": "apt-123",
"announcementValue": 45000
}
]
}
Rentix обновит только переданные поля. Если изменилась только цена — отправляйте только цену.
Используйте bulk для массовых обновлений
Вместо 100 отдельных запросов отправьте один bulk-запрос с 100 операциями. Максимум — 100 операций на запрос.
Обрабатывайте частичные ошибки
Bulk-эндпоинт возвращает результат по каждой операции:
{
"summary": {
"total": 3,
"succeeded": 2,
"failed": 1
},
"results": [
{ "externalId": "apt-123", "success": true },
{ "externalId": "apt-456", "success": true },
{ "externalId": "apt-789", "success": false, "error": "Invalid status" }
]
}
Неудачные операции не влияют на успешные. Обработайте ошибки и повторите неудачные операции отдельно.
Обработка ошибок
Rate limiting
При получении 429 Too Many Requests подождите и повторите запрос. Заголовок Retry-After указывает рекомендуемое время ожидания.
Временные ошибки
Ошибки 5xx обычно временные. Повторите запрос через несколько секунд.
Ошибки валидации
Ошибки 400 Bad Request требуют исправления данных. Проверьте сообщение об ошибке и исправьте данные перед повтором.
Мониторинг
Рекомендуем отслеживать:
| Метрика | Описание |
|---|---|
| Количество обновлённых объявлений | Сколько объявлений успешно синхронизировано |
| Количество ошибок | Сколько операций завершились ошибкой |
| Время последней синхронизации | Когда последний раз данные были синхронизированы |
| Задержка синхронизации | Время между изменением в CRM и обновлением в Rentix |