Anunțuri

Obținere anunțuri

Căutare anunțuri după ID, external ID și cu filtre

Obține informații despre anunțuri pentru a afișa statusul în CRM sau pentru sincronizarea modificărilor.

Găsește anunțul după ID

Folosește ID-ul intern 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(`Status: ${listing.formData.announcementStatus}`);
console.log(`URL: ${listing.publicUrl}`);
Răspuns
{
  "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": "Un apartament spațios...",
    "...": "alte câmpuri ale anunțului"
  },
  "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"
    }
  ]
}

Câmpuri răspuns

CâmpTipDescriere
idnumberID-ul intern al anunțului în Rentix
externalIdstring | nullID-ul extern din CRM-ul tău (null dacă nu este legat)
publicUrlstringLink-ul public al anunțului pe Rentix
createdAtstringData ISO a creării
updatedAtstringData ISO a ultimei actualizări
lastSyncedAtstring | nullData ISO a ultimei sincronizări CRM (null dacă nu a fost sincronizat)
formDataobjectToate câmpurile anunțului (status, tip, preț, coordonate, descriere etc.)
formData.idnumberAcelași cu id de la nivel superior
formData.announcementStatusstringStatusul anunțului (draft, active, hidden, pending_active)
userobject | nullAgentul atribuit (null dacă nu este atribuit niciun agent)
user.idnumberID-ul intern al utilizatorului
user.externalIdstring | nullID-ul extern al utilizatorului din CRM
user.namestringNumele utilizatorului
user.phonestringTelefonul utilizatorului
user.rolestring | nullRolul în agenție (admin, editor, viewer)
filesarrayFotografii atașate
files[].idnumberID-ul intern al fișierului
files[].externalIdstring | nullID-ul extern al fișierului din CRM
files[].contentTypestringTip MIME (ex. image/jpeg)
files[].sizestringDimensiunea fișierului în bytes
files[].optimizationstringStatusul optimizării (pending, processing, success, failed)
Obiectul formData conține aceleași câmpuri folosite la crearea sau actualizarea unui anunț. Vezi Schema câmpurilor pentru detalii complete.

Găsește anunțul după external ID

Folosește ID-ul din CRM-ul tău. Formatul răspunsului este identic.

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();

Obține lista anunțurilor

Returnează anunțuri cu paginare și filtrare. Fiecare element din răspuns are același format ca un anunț individual.

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(`Total: ${meta.totalItems}, pagina ${meta.currentPage} din ${meta.totalPages}`);

Parametri de filtrare

ParametruTipDescriere
statusenumFiltru după status (draft, active, hidden, pending_active)
userIdnumberFiltru după agent (ID intern)
externalUserIdstringFiltru după agent (external ID)
syncedAfterstringDată ISO — doar actualizate după această dată
pagenumberPagină (1–1000)
limitnumberElemente pe pagină (1–100, implicit 20)
Nu poți folosi userId și externalUserId simultan.
Răspuns
{
  "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
  }
}

Sincronizare incrementală

Pentru sincronizare regulată, interogă doar anunțurile modificate folosind syncedAfter.

// Salvează timpul ultimei sincronizări
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);
  }

  // Dacă sunt mai multe pagini, le încărcăm
  if (meta.currentPage < meta.totalPages) {
    // Încarcă paginile următoare...
  }

  // Salvăm timpul pentru următoarea sincronizare
  lastSync = new Date().toISOString();
  saveLastSyncTime(lastSync);

  console.log(`Sincronizate: ${items.length} anunțuri`);
}
Rezultatele sunt sortate după updatedAt — cele mai noi modificări primele.

Erori frecvente

EroareCauzăSoluție
Listing not foundAnunțul nu există sau aparține altei agențiiVerifică ID-ul și asigură-te că folosești cheia API corectă
Cannot use both userId and externalUserIdAi transmis ambii parametriFolosește doar unul
Copyright © 2026