Specificație feed anunțuri UniversImobiliar
Un feed este un fișier XML, JSON sau CSV pe care îl publicați la un URL stabil. Îl citim zilnic și anunțurile dvs. apar, se actualizează sau expiră automat pe universimobiliar.ro. Documentul acesta este pentru agenții și dezvoltatori care vor să publice anunțuri fără introducere manuală.
Cum funcționează
- Alegeți formatul: XML, JSON sau CSV.
- Completați câmpurile de mai jos — un element / un rând per proprietate.
- Publicați fișierul la un URL https stabil. Opțional îl puteți proteja cu un header
Authorization— ne trimiteți valoarea și o folosim la fiecare citire. - Ne trimiteți URL-ul feed-ului.
- Rulăm un test împreună, apoi activăm importul zilnic.
- Folosiți același
external_idla fiecare actualizare — nu ștergeți și recreați un anunț cu alt ID. - Un anunț care lipsește din feed este marcat expirat la următoarea rulare — nu se șterge și poate reveni dacă reapare.
- Fără HTML în texte — etichetele se elimină automat.
- Codare UTF-8.
- Implicit maximum 500 de anunțuri per feed — contactați-ne pentru volume mai mari.
- Poze: URL public https, jpg/png/webp, maximum 30 per anunț, maximum 8 MB fiecare.
- Recomandăm actualizarea feed-ului zilnic.
- Coordonatele
lat/lngtrebuie să fie în România.
Fără CRM? Folosiți Excel / Google Sheets
Descărcați template-anunturi.csv, completați-l în
Excel sau Google Sheets (un rând = un anunț). În Google Sheets:
Fișier → Distribuiți → Publicați pe web → format CSV, apoi copiați linkul generat
și ni-l trimiteți — acela este URL-ul feed-ului dvs.
Coloanele cu mai multe valori (images, features) se separă cu caracterul |.
Câmpuri
| Câmp | Obligatoriu | Tip / valori acceptate | Observații |
|---|---|---|---|
external_id | DA | text, unic și stabil | ID-ul din sistemul dvs. |
title | DA | text 3–200 | |
deal_type | DA | vanzare / inchiriere (acceptăm și sale/rent) | |
property_type | DA | apartament, garsoniera, penthouse, duplex, casa, vila, teren, spatiu_comercial, birou, industrial, hotel (și echivalente EN) | garsoniera/penthouse/duplex setează automat subtipul |
price | DA | număr (ex. 85000 sau 85.000) | fără TVA dacă vat_included=nu |
currency | DA | EUR / RON | |
county | DA | județ (ex. Cluj, București, Ilfov) | |
city | DA | localitate (ex. Cluj-Napoca; pentru București: „București Sector 3") | trebuie să corespundă nomenclatorului SIRUTA |
district | nu | cartier/zonă (ex. Mărăști) | |
energy_class | recomandat (obligatorie legal) | A–G | lipsa generează avertisment |
description | recomandat | text simplu, paragrafe separate prin linie goală | |
images | recomandat | listă URL-uri https (XML: <image> repetat; JSON: array; CSV: separate cu |) | prima imagine devine imaginea principală |
address | nu | text | nu se afișează public, doar intern/membri |
lat, lng | nu | zecimale WGS84 | afișăm doar zona aproximativă |
phone | nu | text | nu se afișează public |
subtype | nu | apartament / garsoniera / penthouse / duplex | |
price_unit | nu | total / mp / luna | implicit: luna pentru închiriere, total pentru vânzare |
vat_included, negotiable | nu | da / nu | |
rooms, bedrooms, bathrooms | nu | număr întreg | |
area_usable, area_built | nu | m², număr | |
floor | nu | text (ex. 3, Parter, Demisol) | |
floors_total, year_built | nu | număr | |
partitioning | nu | decomandat / semidecomandat / nedecomandat / open_space | |
comfort | nu | 1 / 2 / 3 / lux | |
furnishing | nu | nemobilat / mobilat_partial / mobilat / lux | |
parking_spots | nu | număr | |
land_area, front_length | nu (teren) | m², m | |
commercial_area, building_class (A/B/C), destination, rent_per_sqm | nu (comercial) | ||
features | nu | listă text liber (Balcon, Centrală proprie…) | |
updated_at | nu | dată ISO (2026-10-01) | |
project_name | nu (dezvoltatori) | numele proiectului | folosit pentru asocierea cu pagina proiectului (în curând) |
Descărcări
template-anunturi.xml— șablon XML complet, fiecare câmp explicat prin comentariu.exemplu-anunturi.xml— 3 anunțuri realiste completate (XML).exemplu-anunturi.json— aceleași 3 anunțuri, format JSON.template-anunturi.csv— șablon CSV (UTF-8, delimiter;) cu aceleași 3 exemple.
Formatul XML
Rădăcina este <root> și conține un element <ad> pentru fiecare proprietate:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<ad>
<external_id>ID-UNIC-123</external_id>
<title>Apartament 2 camere</title>
<deal_type>vanzare</deal_type>
<price>85000</price>
...
<images>
<image>https://exemplu.ro/p1.jpg</image>
<image>https://exemplu.ro/p2.jpg</image>
</images>
</ad>
</root>
Formatul JSON
Obiect cu cheia ads, un array de obiecte; images și features sunt array-uri:
{
"ads": [
{
"external_id": "ID-UNIC-123",
"title": "Apartament 2 camere",
"deal_type": "vanzare",
"price": "85000",
"images": ["https://exemplu.ro/p1.jpg", "https://exemplu.ro/p2.jpg"],
"features": ["Balcon"]
}
]
}
Formatul CSV
Primul rând conține numele câmpurilor de mai sus. Delimitatorul poate fi ; sau ,,
codare UTF-8 (cu sau fără BOM). Textele care conțin delimitatorul se încadrează între ghilimele
("Apartament 3 camere, Zorilor"). Listele (images, features) se separă cu |.
Ce se întâmplă după import
- Anunțurile organizațiilor neverificate intră în așteptare până la verificarea organizației.
- Posibilele duplicate cu anunțuri ale altor proprietari sunt semnalate automat.
- Fiecare rulare produce un raport (create / actualizate / expirate / erori) — vi-l putem trimite la cerere.
Pentru administratorul UniversImobiliar
Maparea de lipit în câmpul mapping al feed-ului, în funcție de format:
JSON (itemPath ads):
{
"itemPath": "ads",
"fields": {
"sourceRef": "external_id", "title": "title", "description": "description",
"transaction": "deal_type", "category": "property_type", "subtype": "subtype",
"price": "price", "currency": "currency", "priceUnit": "price_unit",
"vatIncluded": "vat_included", "negotiable": "negotiable",
"county": "county", "localityName": "city", "zoneName": "district",
"address": "address", "lat": "lat", "lng": "lng",
"rooms": "rooms", "bedrooms": "bedrooms", "baths": "bathrooms",
"surfaceUsable": "area_usable", "surfaceBuilt": "area_built",
"floor": "floor", "totalFloors": "floors_total", "yearBuilt": "year_built",
"partitioning": "partitioning", "comfort": "comfort", "furnishing": "furnishing",
"parkingSpots": "parking_spots", "energyClass": "energy_class",
"landSurface": "land_area", "frontLength": "front_length",
"commercialSurface": "commercial_area", "buildingClass": "building_class",
"destination": "destination", "rentPerSqm": "rent_per_sqm",
"contactPhone": "phone", "updatedAt": "updated_at"
},
"imagesPath": "images",
"featuresPath": "features"
}
CSV (aceleași câmpuri, itemPath gol — coloanele sunt citite după nume):
{
"itemPath": "",
"fields": {
"sourceRef": "external_id", "title": "title", "description": "description",
"transaction": "deal_type", "category": "property_type", "subtype": "subtype",
"price": "price", "currency": "currency", "priceUnit": "price_unit",
"vatIncluded": "vat_included", "negotiable": "negotiable",
"county": "county", "localityName": "city", "zoneName": "district",
"address": "address", "lat": "lat", "lng": "lng",
"rooms": "rooms", "bedrooms": "bedrooms", "baths": "bathrooms",
"surfaceUsable": "area_usable", "surfaceBuilt": "area_built",
"floor": "floor", "totalFloors": "floors_total", "yearBuilt": "year_built",
"partitioning": "partitioning", "comfort": "comfort", "furnishing": "furnishing",
"parkingSpots": "parking_spots", "energyClass": "energy_class",
"landSurface": "land_area", "frontLength": "front_length",
"commercialSurface": "commercial_area", "buildingClass": "building_class",
"destination": "destination", "rentPerSqm": "rent_per_sqm",
"contactPhone": "phone", "updatedAt": "updated_at"
},
"imagesPath": "images",
"featuresPath": "features"
}