For agencies and developers
Listing feed
Keep your listings in the system you already use and let it publish a file. Siia reads the file every hour, adds new listings, updates changed ones and takes down those that have left. Listing on Siia is free and so is the import.
Accepted formats
- Siia XML and Siia JSON, described on this page.
- REDE XML version 0.93 (the <Objects> document of the schema at ekfl.ee/schema), with or without the urn:REDE/0.93 namespace. The spellings of kv.ee's own field list are understood too.
Already sending listings to kv.ee?
kv.ee imports listings in REDE XML (Real Estate Data Exchange), an Estonian standard from 2007. Siia reads the same format, so your system needs no new export: it only has to publish the objects it already prepares for kv.ee as one <Objects> document at an https address. Give that address on the Import tab, or upload the file once to try it. The format is recognised automatically, and the rules on this page apply in the same way.
kv.ee fetches the objects one by one from your system (getObjectById). Siia needs them in one file instead. Ask the supplier of your system for a REDE export at a fixed address; it is the same data. If that is not possible, write to [email protected].
How a REDE file is read
- Only objects with status active are imported, and only when visible is all or missing. An archived, deleted, sold or rented object counts as having left the feed.
- An object offered for sale and for rent becomes two listings. The second one gets the object id with "-rent" or "-sale" added.
- The price must be in euros and public. A house or flat number marked hidden is not shown.
- The description comes from the info texts of the transaction (est, rus, eng, lav). Areas in ares or hectares are turned into m².
- Type, condition, building material, energy class, rooms, floors, balconies, renovation years, photos, videos and coordinates are taken over. Options without a counterpart on Siia are left out.
- The agent is matched by e-mail when the file also contains the broker records (<Broker> with <email>). Otherwise the listings are signed with the owner of the profile.
- Garages, parking spaces and storerooms, and objects outside Estonia, are left out for now.
Already producing a file for another portal?
Send us the file you already produce and we will add support for it. The import is built so that a new format is one small adapter on our side, with nothing to change on yours. Write to [email protected].
How it works
-
01
Create a profile
Sign in and create an agency or developer profile. Invite your agents by e-mail so that listings can be signed with their names.
-
02
Add the feed address
On the Import tab, enter the https address of your file, or upload a file once to try it out.
-
03
Look at the preview
Siia reads the feed without publishing anything and shows how many listings it found, the first ten as it understood them, and every remark per listing.
-
04
Start importing
Only when you confirm does anything go live. From then on the feed is read every hour.
Structure
One document with all the listings you want on Siia, in UTF-8. In XML the root element is <listings> with one <listing> per home. In JSON it is an object with a "listings" array. The field names are the same in both.
Fields
| Field | Required | What it is |
|---|---|---|
external_id |
yes | Your own id of the listing. It must stay the same for as long as the listing exists: this is how Siia knows which listing to update. |
deal |
yes | sale or rent. |
type |
yes | apartment, house, land, commercial or summer_home. |
price |
yes | Whole euros. The monthly rent when deal is rent. |
address |
yes | Either the parts (county, city, district, street, house, unit) or one line such as "Vabriku 12-5, Tallinn". City and street are the minimum for the parts. |
coordinates |
no | lat and lng in WGS84. When they are missing Siia finds the location from the address in the official address register. |
area |
yes | Floor area in m². Not needed for land. |
plot_area |
for land | Plot area in m². |
rooms, bedrooms, bathrooms |
no | Whole numbers. |
floor, floors_total |
no | The floor of the home and the number of floors in the building. |
built_year, renovated_year |
no | Four-digit years. |
condition |
no | See the lists below. |
energy_label |
no | A to H. |
material |
no | See the lists below. |
balcony_area |
no | m². |
features |
no | A list of the values below. |
headline |
no | A short title per language (et, ru, en), up to 80 characters. |
description |
yes | The text per language (et, ru, en), up to 2,000 characters. At least one language. Simple HTML is turned into plain text. |
agent_email |
no | E-mail of the agent who handles the listing. When it matches a member of your profile the listing is signed with their name, otherwise with the owner of the profile. |
photos |
yes | https addresses of JPG, PNG or WebP files in the order they should be shown, the first one is the cover. Up to 40, up to 25 MB each. |
floor_plan |
no | https address of an image or a PDF. |
video_url |
no | A YouTube or Matterport link. |
cadastral_number |
no | The cadastral number of the plot. |
updated_at |
no | When you last changed the listing, ISO 8601. For your own reference: Siia compares the content itself. |
Accepted values
Write the values as below. The usual Estonian words are understood as well (korter, maja, müük, üür), and an optional value we do not know is left empty with a note in the log instead of rejecting the listing.
deal-
salerent type-
apartmenthouselandcommercialsummer_home condition-
new_buildrenovatedgoodneeds_renovation energy_label-
ABCDEFGH material-
stonewoodpanellog features-
balconyterraceliftparkingstoragesaunafireplacefurnishedbicycle_roomunderfloor_heatingfibre
Rules
- Only https addresses are accepted, for the feed and for the photos. The feed may be up to 20 MB and 5000 listings, must answer within 20 seconds and may redirect at most 3 times.
- Nothing is published before the owner of the profile has seen the preview and pressed "Start importing". That confirmation is recorded as your permission to publish the content.
- A listing is created live. To be accepted it needs an id, deal, type, price, address, area, a description and at least one photo; the others are skipped and listed in the log with the reason.
- Listings are matched by external_id. A changed listing is updated, an unchanged one is left alone, and only new photos are downloaded.
- A photo that cannot be downloaded is skipped and tried again on the next run. The listing is still published.
- A listing that is no longer in the feed is taken down only after it has been missing from 2 successful runs in a row. If it comes back, it is published again.
- If the feed cannot be read, or is empty, nothing is changed at all: your listings stay as they were.
- After failures the feed is tried again after 1 h, 3 h, 12 h, 24 h. After the third failure in a row the owner of the profile gets one e-mail.
- Listings typed in by hand on Siia are never touched by the import.
Complete example
Three listings: a full entry, the shortest entry that is accepted, and a plot of land.
<?xml version="1.0" encoding="UTF-8"?>
<!-- Siia listing feed, version 1. Documentation: https://siia.ee/for-agents/feed -->
<listings version="1" generated_at="2026-11-13T08:00:00+02:00">
<!-- A full entry: address in parts, coordinates, three languages. -->
<listing>
<external_id>KB-10231</external_id>
<deal>sale</deal>
<type>apartment</type>
<price currency="EUR">189000</price>
<address>
<county>Harju maakond</county>
<city>Tallinn</city>
<district>Kalamaja</district>
<street>Vabriku</street>
<house>12</house>
<unit>5</unit>
</address>
<coordinates lat="59.447310" lng="24.731420"/>
<area>54.3</area>
<rooms>2</rooms>
<bedrooms>1</bedrooms>
<bathrooms>1</bathrooms>
<floor>3</floor>
<floors_total>5</floors_total>
<built_year>1962</built_year>
<renovated_year>2021</renovated_year>
<condition>renovated</condition>
<energy_label>C</energy_label>
<material>stone</material>
<balcony_area>4.5</balcony_area>
<features>
<feature>balcony</feature>
<feature>storage</feature>
<feature>fibre</feature>
</features>
<headline lang="et">Renoveeritud kahetoaline korter Kalamajas</headline>
<headline lang="ru">Двухкомнатная квартира после ремонта в Каламая</headline>
<headline lang="en">Renovated two-room apartment in Kalamaja</headline>
<description lang="et"><![CDATA[Valgusküllane korter vaikse sisehoovi poole. Uus elektrisüsteem ja torustik, rõdu õhtupäikesega.
Trammipeatus on kolme minuti kaugusel.]]></description>
<description lang="ru"><![CDATA[Светлая квартира с окнами в тихий двор. Новая электрика и трубы, балкон на вечернее солнце.]]></description>
<description lang="en"><![CDATA[A bright apartment facing a quiet courtyard. New wiring and plumbing, a balcony with evening sun.]]></description>
<agent_email>[email protected]</agent_email>
<photos>
<photo>https://media.example.ee/listings/10231/01.jpg</photo>
<photo>https://media.example.ee/listings/10231/02.jpg</photo>
<photo>https://media.example.ee/listings/10231/03.jpg</photo>
</photos>
<floor_plan>https://media.example.ee/listings/10231/plan.png</floor_plan>
<updated_at>2026-11-12T16:40:00+02:00</updated_at>
</listing>
<!-- The shortest entry that is accepted: one address line (Siia looks up the rest), one language. -->
<listing>
<external_id>KB-10244</external_id>
<deal>rent</deal>
<type>apartment</type>
<price currency="EUR">650</price>
<address>
<line>Sõpruse pst 202, Tallinn</line>
</address>
<area>38</area>
<rooms>1</rooms>
<description lang="et">Möbleeritud ühetoaline korter Mustamäel. Vaba alates detsembrist.</description>
<photos>
<photo>https://media.example.ee/listings/10244/01.jpg</photo>
</photos>
<updated_at>2026-11-10T09:15:00+02:00</updated_at>
</listing>
<!-- Land: plot_area instead of area. -->
<listing>
<external_id>KB-10250</external_id>
<deal>sale</deal>
<type>land</type>
<price currency="EUR">42000</price>
<address>
<county>Tartu maakond</county>
<city>Kambja vald</city>
<district>Kulli küla</district>
<street>Kuuse</street>
</address>
<coordinates lat="58.262100" lng="26.705300"/>
<plot_area>1850</plot_area>
<cadastral_number>28201:001:0345</cadastral_number>
<headline lang="et">Elamumaa krunt Kulli külas</headline>
<description lang="et">Tasane krunt asfalttee ääres, elekter ja vesi krundi piiril.</description>
<description lang="en">A level residential plot by a paved road, electricity and water at the boundary.</description>
<agent_email>[email protected]</agent_email>
<photos>
<photo>https://media.example.ee/listings/10250/01.jpg</photo>
<photo>https://media.example.ee/listings/10250/02.jpg</photo>
</photos>
<updated_at>2026-11-01T12:00:00+02:00</updated_at>
</listing>
</listings>
{
"version": 1,
"generated_at": "2026-11-13T08:00:00+02:00",
"listings": [
{
"external_id": "KB-10231",
"deal": "sale",
"type": "apartment",
"price": 189000,
"address": {
"county": "Harju maakond",
"city": "Tallinn",
"district": "Kalamaja",
"street": "Vabriku",
"house": "12",
"unit": "5"
},
"coordinates": { "lat": 59.44731, "lng": 24.73142 },
"area": 54.3,
"rooms": 2,
"bedrooms": 1,
"bathrooms": 1,
"floor": 3,
"floors_total": 5,
"built_year": 1962,
"renovated_year": 2021,
"condition": "renovated",
"energy_label": "C",
"material": "stone",
"balcony_area": 4.5,
"features": ["balcony", "storage", "fibre"],
"headline": {
"et": "Renoveeritud kahetoaline korter Kalamajas",
"ru": "Двухкомнатная квартира после ремонта в Каламая",
"en": "Renovated two-room apartment in Kalamaja"
},
"description": {
"et": "Valgusküllane korter vaikse sisehoovi poole. Uus elektrisüsteem ja torustik, rõdu õhtupäikesega.\n\nTrammipeatus on kolme minuti kaugusel.",
"ru": "Светлая квартира с окнами в тихий двор. Новая электрика и трубы, балкон на вечернее солнце.",
"en": "A bright apartment facing a quiet courtyard. New wiring and plumbing, a balcony with evening sun."
},
"agent_email": "[email protected]",
"photos": [
"https://media.example.ee/listings/10231/01.jpg",
"https://media.example.ee/listings/10231/02.jpg",
"https://media.example.ee/listings/10231/03.jpg"
],
"floor_plan": "https://media.example.ee/listings/10231/plan.png",
"updated_at": "2026-11-12T16:40:00+02:00"
},
{
"external_id": "KB-10244",
"deal": "rent",
"type": "apartment",
"price": 650,
"address": "Sõpruse pst 202, Tallinn",
"area": 38,
"rooms": 1,
"description": { "et": "Möbleeritud ühetoaline korter Mustamäel. Vaba alates detsembrist." },
"photos": ["https://media.example.ee/listings/10244/01.jpg"],
"updated_at": "2026-11-10T09:15:00+02:00"
},
{
"external_id": "KB-10250",
"deal": "sale",
"type": "land",
"price": 42000,
"address": {
"county": "Tartu maakond",
"city": "Kambja vald",
"district": "Kulli küla",
"street": "Kuuse"
},
"coordinates": { "lat": 58.2621, "lng": 26.7053 },
"plot_area": 1850,
"cadastral_number": "28201:001:0345",
"headline": { "et": "Elamumaa krunt Kulli külas" },
"description": {
"et": "Tasane krunt asfalttee ääres, elekter ja vesi krundi piiril.",
"en": "A level residential plot by a paved road, electricity and water at the boundary."
},
"agent_email": "[email protected]",
"photos": [
"https://media.example.ee/listings/10250/01.jpg",
"https://media.example.ee/listings/10250/02.jpg"
],
"updated_at": "2026-11-01T12:00:00+02:00"
}
]
}
Price list of a new-build project
A developer can keep the price list of a project in a spreadsheet and give its link on the project page, under Units and prices. Accepted: CSV or TSV, a Google Sheet (a normal share link for anyone with the link, or File, Share, Publish to web as CSV), or JSON with an array of objects that use the column names as keys. One row per unit, the first row names the columns.
| Field | Required | What it is |
|---|---|---|
code |
yes | Unit code, unique in the project, for example A-12. Units are matched by it. |
rooms |
yes | Number of rooms. |
area_m2 |
yes | Floor area in m². A decimal comma or point. |
floor |
yes | Floor, 0 for the ground floor. |
balcony_m2 |
no | Balcony or terrace in m². |
price |
yes | Price in euros. Spaces and the euro sign are ignored. |
status |
no | available, reserved or sold. Also vaba, müügis, broneeritud, müüdud, свободна, бронь, продана. Empty means available; any other word leaves the row out. |
plan_url |
no | https link to the floor plan of the unit. |
Estonian column names work too: kood, tube, pind, korrus, rõdu, hind, staatus, plaan.
- Check shows how many units would be added, changed or are missing, and which rows cannot be read. Nothing changes before Start syncing.
- After that the link is read every hour. A row that cannot be read is left out, the rest is synced. A sheet that cannot be downloaded changes nothing.
- A unit that is not in the sheet is marked sold after 2 syncs in a row without it. Units are never deleted.
- A reservation a buyer made on Siia stays while it lasts, even when the sheet says available. Sold in the sheet ends it.
- At most 1 000 rows and 2 MB. After failures we try again in 1 h, 3 h, 12 h, 24 h; after 3 failures in a row the owner of the profile gets one e-mail.
code,rooms,area_m2,floor,balcony_m2,price,status,plan_url
A-1,1,31.5,0,,149000,available,https://example.ee/plans/a-1.pdf
A-2,2,48.5,1,5.2,219000,available,https://example.ee/plans/a-2.pdf
A-3,2,50.0,1,5.2,226000,reserved,
A-4,3,72.4,2,8.0,315000,sold,https://example.ee/plans/a-4.pdf
B-1,4,96.0,3,12.5,429000,available,