Объявления
Получение объявлений
Поиск объявлений по 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}`);
curl https://crm.rentix.md/api/v1/listings/42 \
-H "Authorization: ApiKey YOUR_API_KEY"
$ch = curl_init('https://crm.rentix.md/api/v1/listings/42');
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Authorization: ApiKey YOUR_API_KEY']);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
$listing = json_decode($response, true);
Ответ
{
"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"
}
]
}
Поля ответа
| Поле | Тип | Описание |
|---|---|---|
id | number | Внутренний ID объявления в Rentix |
externalId | string | null | Внешний ID из вашей CRM (null если не привязан) |
publicUrl | string | Публичная ссылка на объявление |
createdAt | string | ISO дата создания |
updatedAt | string | ISO дата последнего обновления |
lastSyncedAt | string | null | ISO дата последней CRM-синхронизации (null если не синхронизировалось) |
formData | object | Все поля объявления (статус, тип, цена, координаты, описание и т.д.) |
formData.id | number | Совпадает с id верхнего уровня |
formData.announcementStatus | string | Статус объявления (draft, active, hidden, pending_active) |
user | object | null | Назначенный агент (null если агент не назначен) |
user.id | number | Внутренний ID пользователя |
user.externalId | string | null | Внешний ID пользователя из вашей CRM |
user.name | string | Имя пользователя |
user.phone | string | Телефон пользователя |
user.role | string | null | Роль в агентстве (admin, editor, viewer) |
files | array | Прикреплённые фотографии |
files[].id | number | Внутренний ID файла |
files[].externalId | string | null | Внешний ID файла из вашей CRM |
files[].contentType | string | MIME-тип (напр. image/jpeg) |
files[].size | string | Размер файла в байтах |
files[].optimization | string | Статус оптимизации (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();
curl https://crm.rentix.md/api/v1/listings/external/apt-001 \
-H "Authorization: ApiKey YOUR_API_KEY"
$ch = curl_init('https://crm.rentix.md/api/v1/listings/external/apt-001');
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Authorization: ApiKey YOUR_API_KEY']);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
$listing = json_decode($response, true);
Получите список объявлений
Возвращает объявления с пагинацией и фильтрацией. Каждый элемент в ответе имеет тот же формат, что и одиночное объявление.
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}`);
curl "https://crm.rentix.md/api/v1/listings?status=active&limit=20" \
-H "Authorization: ApiKey YOUR_API_KEY"
$ch = curl_init('https://crm.rentix.md/api/v1/listings?status=active&limit=20');
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Authorization: ApiKey YOUR_API_KEY']);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
$data = json_decode($response, true);
echo "Всего: {$data['meta']['totalItems']}, страница {$data['meta']['currentPage']}";
Параметры фильтрации
| Параметр | Тип | Описание |
|---|---|---|
status | enum | Фильтр по статусу (draft, active, hidden, pending_active) |
userId | number | Фильтр по агенту (внутренний ID) |
externalUserId | string | Фильтр по агенту (external ID) |
syncedAfter | string | ISO дата — только обновлённые после этой даты |
page | number | Страница (1–1000) |
limit | number | Элементов на странице (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} объявлений`);
}
curl "https://crm.rentix.md/api/v1/listings?syncedAfter=2024-01-15T11:00:00Z" \
-H "Authorization: ApiKey YOUR_API_KEY"
$lastSync = getLastSyncTime() ?: '1970-01-01T00:00:00Z';
$ch = curl_init("https://crm.rentix.md/api/v1/listings?syncedAfter={$lastSync}");
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Authorization: ApiKey YOUR_API_KEY']);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
$data = json_decode($response, true);
foreach ($data['items'] as $listing) {
updateInCrm($listing);
}
saveLastSyncTime(date('c'));
echo "Синхронизировано: " . count($data['items']) . " объявлений";
Результаты отсортированы по
updatedAt — новые изменения первыми.Частые ошибки
| Ошибка | Причина | Решение |
|---|---|---|
Listing not found | Объявление не существует или принадлежит другому агентству | Проверьте ID и убедитесь, что используете правильный API ключ |
Cannot use both userId and externalUserId | Переданы оба параметра | Используйте только один |