Skip to main content

Sale versus rent shapes

transaction picks the schema. Rentals carry rent and house_rules and must not carry price or the thirteen sale-only fields.

transaction picks the schema: "sale" or "rent". The two shapes share most fields (Payload v1) and differ in these:

Sale Rent
price required not allowed
rent not allowed required
house_rules not allowed required ({} allowed)
legal the full object { "mandate_attested": … } only
structure every field without the seven sale-only fields
commission buyer_pct, seller_pct landlord_pct, agency_fee_pct
structure.heating the sixteen current values the sixteen, plus the legacy electric

The sale-only fields#

A rental must not carry price or any of these thirteen fields:

  • structure.rooms
  • structure.total_floors
  • structure.year_built
  • structure.building_group
  • structure.condition
  • structure.garage
  • structure.basement
  • legal.ownership_status
  • legal.legalization_status
  • legal.mortgage_eligible
  • legal.exclusive
  • legal.broker_license_no
  • legal.tapija_note

Sending any of them on a rental is 422 validation_failed with unknown_field at its pointer (for example /structure/rooms): rental listings have no such columns, and a silent drop would hide a mapping bug in your software.

rent#

Field Type Required Rules
amount number Yes monthly rent, 1–10,000,000
currency "EUR" | "RSD" Yes
type string Yes long_term, mid_term, short_term, room
deposit_months number No 0–12
min_lease_months integer No 0–120
max_lease_months integer No 0–120, not below min_lease_months
available_from date No YYYY-MM-DD
utilities_included object No utility name → true / false, e.g. { "water": true, "heating": false }
utilities_estimate_rsd integer No 0–100,000,000
owner_lives_nearby boolean No required to publish for every category except business premises
owner_proximity string No same_apartment, same_floor, upstairs, downstairs, same_building, same_street, walking_distance; only when owner_lives_nearby is true; same_apartment only when type is room
max_occupants integer No 1–20

house_rules#

Exactly the object the agency's own editor writes. Every key is optional; send {} when you have none. The keys are pets (an object with policy and optional kinds, dog_size, max_count, deposit_eur, note), smoking, guests, parties, quiet_hours, subletting, students, families, foreign_tenants, registers_residence and other; GET /vocabularies lists their values.

A complete rent listing#

json
{
  "external_id": "REAA-22001",
  "transaction": "rent",
  "category": "apartment",
  "state": "active",
  "title": { "sr": "Dvosoban stan za izdavanje, Novi Beograd", "en": "Two-room flat to let, New Belgrade" },
  "description": { "sr": "Namešten dvosoban stan u mirnom bloku, blizu prevoza i škola, dostupan od novembra." },
  "rent": {
    "amount": 650, "currency": "EUR", "type": "long_term", "deposit_months": 1,
    "min_lease_months": 12, "max_lease_months": null, "available_from": "2026-11-01",
    "utilities_included": { "water": true, "heating": false }, "utilities_estimate_rsd": 12000,
    "owner_lives_nearby": false, "owner_proximity": null, "max_occupants": 4
  },
  "location": { "place_id": "b2c0d6a4-3f1e-4d2a-9c8b-7e6f5a4b3c2d", "address_line": "Bulevar Mihajla Pupina 10", "neighbourhood": null, "lat": null, "lng": null },
  "structure": { "area_sqm": 56, "bedrooms": 1, "bathrooms": 1, "floor": 4, "levels": 1, "furnished": "furnished", "heating": "district", "elevator": true, "parking": false, "balcony": true, "terrace": false, "air_conditioning": true },
  "legal": { "mandate_attested": true },
  "commission": { "landlord_pct": null, "agency_fee_pct": 50 },
  "amenities": ["built_in_wardrobes", "intercom"],
  "attributes": {},
  "photos": [
    { "url": "https://cdn.reaa.rs/listings/22001/1.jpg", "caption": null, "room_type": "living_room", "digest": null },
    { "url": "https://cdn.reaa.rs/listings/22001/2.jpg", "caption": null, "room_type": "kitchen", "digest": null },
    { "url": "https://cdn.reaa.rs/listings/22001/3.jpg", "caption": null, "room_type": "bedroom", "digest": null }
  ],
  "video_url": null,
  "virtual_tour_url": null,
  "agent": { "email": "milan@agencija.rs", "name": "Milan Petrović", "phone": "+381601234567" },
  "source": { "updated_at": "2026-10-12T08:00:00Z", "url": null },
  "house_rules": { "smoking": "balcony_only", "parties": "not_allowed", "pets": { "policy": "on_request" } },
  "digest": null
}

Last updated