Listings

Create and Update

How to create, update, and publish listings via API

One endpoint PUT /listings for all listing operations: creation, updating, and publishing. The API automatically determines whether to create a new listing or update an existing one.

Create a Listing

Send property data. If externalId is new — a listing is created, if it exists — it's updated.

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-001',
    announcementType: 'rent',
    propertyType: 'residential',
    propertySecondaryType: 'apartment',
    announcementValue: 500,
    announcementCurrency: 'EUR',
    announcementPayPeriod: 'monthly',
    propertyArea: 65,
    propertyFloorNumber: 3,
    propertyFloorsTotal: 9,
    propertyQuantitySize: 'custom-value',
    propertyQuantitySizeValue: 3, // 3 rooms
    propertyHousingMarket: 'new-build',
    propertyVisualState: 'euro-renovation',
    propertyAddress: 'Chișinău, str. Columna 81/1', // or propertyCoordinates: { lat, lng } (preferred)
    announcementDescription: 'Cozy 3-room apartment with heated floors and autonomous heating.'
  })
});

const result = await response.json();
console.log(result.created ? 'Created' : 'Updated');
Response
{
  "id": 42,
  "externalId": "apt-001",
  "status": "draft",
  "publicUrl": "https://rentix.md/announcement/42",
  "created": true,
  "jobId": null
}

The listing is created in draft status. Photos are required for publishing.

Publish a Listing

For publishing you need:

  1. At least 3 photos
  2. Status active

The simplest way — pass photo URLs directly when creating. Adding externalFileId is recommended for tracking:

{
  "externalId": "apt-001",
  "announcementStatus": "active",
  "files": [
    { "url": "https://placehold.co/1920x1080/jpg?text=Living+Room", "externalFileId": "apt-001-photo-1" },
    { "url": "https://placehold.co/1920x1080/jpg?text=Bedroom", "externalFileId": "apt-001-photo-2" },
    { "url": "https://placehold.co/1920x1080/jpg?text=Kitchen", "externalFileId": "apt-001-photo-3" }
  ]
}

You can also use already uploaded files:

{
  "externalId": "apt-001",
  "announcementStatus": "active",
  "files": [
    { "id": 123 },
    { "externalFileId": "apt-001-photo-2" },
    { "externalFileId": "apt-001-photo-3" }
  ]
}
Response
{
  "id": 42,
  "externalId": "apt-001",
  "status": "pending_active",
  "publicUrl": "https://rentix.md/announcement/42",
  "updated": true,
  "jobId": 789
}

Status pending_active means the listing is being processed (photo optimization, translation). It will become active in a few seconds.

How to upload photos — in the Media section.

Update a Listing

Pass only changed fields — others are preserved:

{
  "externalId": "apt-001",
  "announcementValue": 600,
  "announcementDescription": "Updated apartment description..."
}

To clear a field, send null:

{
  "externalId": "apt-001",
  "propertyFloorNumber": null
}

Hide or Close a Deal

ActionHow
Hide from website"announcementStatus": "hidden"
Restore to website"announcementStatus": "active"
Mark as completed"announcementStatus": "completed"

Response Fields

FieldTypeDescription
idnumberRentix internal ID
externalIdstringYour CRM ID
statusstringCurrent listing status
publicUrlstringListing URL on rentix.md
createdbooleantrue if listing was created
updatedbooleantrue if listing was updated
jobIdnumberJob ID (when publishing)

Request Parameters

Identification

FieldTypeDescription
idnumberRentix internal ID
externalIdstringYour CRM ID (up to 255 characters)
Pass eitheridorexternalId — not both at once.

Listing Type (required)

FieldTypeValues
announcementTypeenumrent, sale
propertyTypeenumresidential, commercial, parking
propertySecondaryTypeenumDepends on propertyType (see overview)

Price

FieldTypeDescription
announcementValuenumberPrice (from 1 to 1,000,000,000)
announcementCurrencyenumEUR, USD, MDL
announcementPayPeriodenummonthly, daily, hourly, yearly (rental only)

Characteristics

FieldTypeDescription
propertyAreanumberArea, m²
propertyLandAreanumberLand area, m²
propertyFloorNumbernumberFloor (from -10 to 100)
propertyFloorsTotalnumberTotal floors (from 1 to 100)
propertyCeilingHeightnumberCeiling height, m
propertyQuantitySizeenumapartment-studio, custom-value
propertyQuantitySizeValuenumberNumber of rooms (if custom-value)

Location

FieldTypeDescription
propertyCoordinatesobject{ lat, lng } — exact GPS coordinates (recommended)
propertyAddressstringStreet address — geocoded to coordinates automatically (max 500 characters)
Provide eitherpropertyCoordinatesorpropertyAddress — not both. Coordinates are recommended for accuracy. propertyAddress format: City, Street Number (e.g. Chișinău, str. Columna 81/1).

Condition

FieldTypeValues
propertyVisualStateenumclassic-renovation, euro-renovation, design-renovation, requires-renovation, white-finish, rough-finish
propertyHousingMarketenumsecondary, new-build
propertyBuildingMaterialenumbrick, mixed, cotilet, monolithic, concrete, block, wood, panel, aerated-concrete
propertyLayoutenum102, 135, 143, brezhnevka, varnitskaia, gostinka, custom, small-family, moldovan-series, ground-level, rubashka, stalinka, khrushchyovka, cheska
propertyAttributesarrayAmenities and rules (see schema)

Rental Terms

FieldTypeDescription
announcementMinRentPeriodnumberMinimum rental period, hours
announcementPrepaymentenumno-prepayment, first-and-last-month, months-3, months-6, custom-amount
announcementPrepaymentValuenumberAmount (if custom-amount)
announcementRentDepositenummonths-1, months-3, custom-amount
announcementRentDepositValuenumberAmount (if custom-amount)
announcementBargainenumyes, no

Description and Media

FieldTypeDescription
announcementDescriptionstring/objectDescription (40–2000 characters) or object with translations
filesarrayArray of files (see below)
applyAnalysisbooleanAuto-detect attributes from photos and description (default true)

files element format:

FormatExampleDescription
URL + external ID{ "url": "...", "externalFileId": "..." }Recommended — auto-import with tracking
URL only{ "url": "https://..." }Auto-import without tracking
By internal ID{ "id": 123 }Already uploaded file
By external ID{ "externalFileId": "photo-1" }File with your ID
It's recommended to always include externalFileId when passing URLs — this allows tracking files and avoiding duplication on repeat requests.

User and Status

FieldTypeDescription
userobject{ userId } or { externalUserId } — assign an agent
announcementStatusenumdraft, active, hidden, completed
For the full list of fields for a specific property type — see the schema reference.

Validation

Check data without saving — useful for validating forms in your CRM.

POST /api/v1/listings/validate

curl -X POST https://crm.rentix.md/api/v1/listings/validate \
  -H "Authorization: ApiKey YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "announcementType": "rent",
    "propertyType": "residential",
    "propertySecondaryType": "apartment",
    "announcementValue": 500,
    "announcementDescription": "Short"
  }'
Response with Errors
{
  "valid": false,
  "errors": [
    {
      "field": "announcementDescription",
      "code": "STRING_TOO_SHORT",
      "message": "Minimum length: 40 characters"
    }
  ],
  "warnings": []
}
Successful Validation
{
  "valid": true,
  "errors": [],
  "warnings": []
}

Multilingual Description

Description can be a string or an object with translations:

{
  "announcementDescription": {
    "ru": "Уютная 3-комнатная квартира с тёплыми полами...",
    "en": "Cozy 3-room apartment with heated floors...",
    "ro": "Apartament confortabil cu 3 camere cu podele calde..."
  }
}

If you pass a string — the system will automatically translate to other languages.

Supported locales: ru, en, ro


Common Errors

ErrorCauseSolution
Cannot provide both id and externalIdBoth identifiers were passedUse only one
announcementDescription too shortDescription is less than 40 charactersAdd more details
Minimum 3 photos requiredNot enough photos for publishingUpload at least 3 photos
Invalid propertySecondaryTypeSubtype doesn't match typeCheck allowed combinations

Next Steps

Copyright © 2026