Listings

Retrieve Listings

Search listings by ID, external ID, and with filters

Get listing information to display status in your CRM or to sync changes.

Find a Listing by ID

Use the Rentix internal ID.

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}`);
Response
{
  "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": "A spacious apartment...",
    "...": "other listing fields"
  },
  "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"
    }
  ]
}

Response Fields

FieldTypeDescription
idnumberInternal Rentix listing ID
externalIdstring | nullYour CRM's external ID (null if not linked)
publicUrlstringPublic listing URL on Rentix
createdAtstringISO date of creation
updatedAtstringISO date of last update
lastSyncedAtstring | nullISO date of last CRM sync (null if never synced)
formDataobjectAll listing fields (status, type, price, coordinates, description, etc.)
formData.idnumberSame as top-level id
formData.announcementStatusstringListing status (draft, active, hidden, pending_active)
userobject | nullAssigned agent (null if no agent assigned)
user.idnumberInternal user ID
user.externalIdstring | nullExternal user ID from your CRM
user.namestringUser name
user.phonestringUser phone
user.rolestring | nullAgency role (admin, editor, viewer)
filesarrayAttached photos
files[].idnumberInternal file ID
files[].externalIdstring | nullExternal file ID from your CRM
files[].contentTypestringMIME type (e.g. image/jpeg)
files[].sizestringFile size in bytes
files[].optimizationstringOptimization status (pending, processing, success, failed)
The formData object contains the same fields you use when creating or updating a listing. See Field Schema for full field details.

Find a Listing by External ID

Use the ID from your CRM. Returns the same response shape as above.

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

Get Listing List

Returns listings with pagination and filtering. Each item in the response has the same shape as a single listing.

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}, page ${meta.currentPage} of ${meta.totalPages}`);

Filter Parameters

ParameterTypeDescription
statusenumFilter by status (draft, active, hidden, pending_active)
userIdnumberFilter by agent (internal ID)
externalUserIdstringFilter by agent (external ID)
syncedAfterstringISO date — only updated after this date
pagenumberPage (1–1000)
limitnumberItems per page (1–100, default 20)
You cannot use userId and externalUserId at the same time.
Response
{
  "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
  }
}

Incremental Sync

For regular synchronization, request only changed listings using syncedAfter.

// Store the last sync time
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 there are more pages, load them
  if (meta.currentPage < meta.totalPages) {
    // Load next pages...
  }

  // Save time for the next sync
  lastSync = new Date().toISOString();
  saveLastSyncTime(lastSync);

  console.log(`Synced: ${items.length} listings`);
}
Results are sorted by updatedAt — newest changes first.

Common Errors

ErrorCauseSolution
Listing not foundListing doesn't exist or belongs to another agencyCheck the ID and make sure you're using the correct API key
Cannot use both userId and externalUserIdBoth parameters were passedUse only one
Copyright © 2026