NOIRESTATES
ListingsNew listingsMarketReportsAsk Noir
List with usInquire
NOIRESTATES© 2026 NOIRESTATES · CYPRUS
@noirestates_cy[email protected]
ListingsNew developmentsNew listingsMarket
ValuationHow we valueReports
LimassolNicosiaPaphosLarnacaFamagustaAll areas
AboutContactList with usImport guidePrivacyTermsCookies

For agents & developers

List your properties with us.

Send us your inventory once and keep it in sync automatically. If your CRM already exports a feed, we can read it. If it doesn't, a spreadsheet is enough. Not sure what your CRM exports? We'll set it up for you.

Formats

Four ways in — pick the easiest for you.

Kyero XML. If your CRM already publishes a Kyero feed (most overseas-portal exporters do), just send us its URL — no extra work.

NoirEstates XML. Our own simple schema: one flat<listing> element per property. Download the example and XSD below.

NoirEstates CSV. One row per property, with a header row of field names. Anyone with Excel or Google Sheets can produce it — download the template and fill it in.

They all carry the same information and end up as the same listing. Prices are in euro, and every property needs a map pin inside Cyprus.

Your own XML. Developers whose portal exports its own format don't have to change anything — send us the URL and we write the mapping for it, usually within a day. Sold units drop off automatically as your feed marks them.

The fields

What a listing needs.

Seven fields are always required — reference, type, intent, price, city, latitude, longitude — plus a size or bedroom count depending on the property. Everything else is optional and simply makes the listing richer.

FieldRequiredNotes
referenceYesYour own unique ID for the property. We match updates on it, so keep it stable.
typeYesapartment, house, land or commercial. Common labels (Villa, Penthouse, Office, Plot…) are understood too.
subtype—Free-text label shown on the listing, e.g. Penthouse or Villa.
intentYessale or rent.
priceYesAmount in EUR, numbers only.
cityYesLimassol, Nicosia, Larnaca, Paphos or Famagusta.
district—Area or village within the city, e.g. Germasogeia.
neighborhood—A finer location, free text.
latitude / longitudeYesThe map pin, inside Cyprus. In Google Maps, right-click the spot and copy the numbers.
bedroomsFor homesRequired for apartments and houses.
bathrooms—Number of bathrooms.
internal_area_sqmSales & commercialCovered area in m². Required for sales and for commercial units.
plot_area_sqmFor landPlot size in m². Required for land.
title—We generate one if you leave it blank.
description—English, up to 20,000 characters.
contact_phone / contact_whatsapp—Shown as call / WhatsApp buttons. If omitted, your agency defaults are used.
project_slug—Developers only: the slug of one of your developments — the unit appears on its development page automatically. Find it under Dashboard → Projects (it is also the /developments/… URL). Leave it out to manage the link from your dashboard; it never detaches a unit.
images—Public photo URLs — we download and host them ourselves. XML: one <image> per photo. CSV: separate URLs with a vertical bar ( | ).

Templates

Download and fill in.

Each file contains the same four example listings — one of each property type.

CSV templateSpreadsheet-ready, four example listingsDownload →Example XMLThe same four listings as XMLDownload →XML schema (XSD)Validate your XML before sendingDownload →

CSV in detail

A spreadsheet is enough.

The first row is the header — the field names above, in any order and in any capitalisation. Each following row is one property. Save as CSV (UTF-8); Excel's "CSV UTF-8" export works as-is.

For several photos, put every URL in the single image_urlscell separated by a vertical bar, for examplehttps://…/1.jpg|https://…/2.jpg.

XML in detail

One flat listing per element.

A single <noirestates> root wraps one<listing> per property; each field is a child element with the name from the table, and each photo is its own<image> element. The document must be UTF-8. Validate against the XSD before sending and you'll know it will import.

Going live

Every feed is checked first.

When you add a feed we run it as a dry run and hand you a report: how many listings parsed, which fields are covered, and any rows that need a fix — before a single listing publishes.

Once it's live we re-check the feed on a schedule. New listings appear, changed ones update in place, and a property you remove from a clean feed is paused automatically — so your inventory on NoirEstates always matches your own.

Push API

Or push listings from your CRM.

If your CRM can't publish a pollable feed, push listings one at a time. Create a per-org API key under Dashboard → Organisation → Push API keys (owner/admin), then send it as X-Api-Key or aBearer token:

# create or update one listing (idempotent on your reference)
PUT /api/partner/listings/{your-reference}
X-Api-Key: nkp_live_xxxxxxxx
Content-Type: application/json

{ "property_type": "apartment", "intent": "sale", "price": 285000,
  "city": "Limassol", "district": "Germasogeia",
  "latitude": 34.70, "longitude": 33.09,
  "bedrooms": 2, "internal_area_sqm": 95, "title": "Bright 2-bed" }

# POST /api/partner/listings  (same body + "external_ref") also works
# DELETE /api/partner/listings/{your-reference}  removes it

Bodies obey the same rules as feed and form listings (EUR prices, coordinates required); a bad request comes back with a clear reason. Each push updates in place on your reference, and a DELETE removes the listing — the same live inventory, one property at a time. Developers can include project_slug — the same field as in feeds — to attach the unit to one of their developments.

Ready to list with us, or not sure which format fits your CRM? Get in touch — onboarding is hands-on and free while we grow.

Talk to usHow we value property →