For agents & developers
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
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
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.
| Field | Required | Notes |
|---|---|---|
| reference | Yes | Your own unique ID for the property. We match updates on it, so keep it stable. |
| type | Yes | apartment, 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. |
| intent | Yes | sale or rent. |
| price | Yes | Amount in EUR, numbers only. |
| city | Yes | Limassol, Nicosia, Larnaca, Paphos or Famagusta. |
| district | — | Area or village within the city, e.g. Germasogeia. |
| neighborhood | — | A finer location, free text. |
| latitude / longitude | Yes | The map pin, inside Cyprus. In Google Maps, right-click the spot and copy the numbers. |
| bedrooms | For homes | Required for apartments and houses. |
| bathrooms | — | Number of bathrooms. |
| internal_area_sqm | Sales & commercial | Covered area in m². Required for sales and for commercial units. |
| plot_area_sqm | For land | Plot 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
Each file contains the same four example listings — one of each property type.
CSV in detail
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
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
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
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 itBodies 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.