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, with 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. A size or a bedroom count is also needed, 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 | No | 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 | No | Area or village within the city, e.g. Germasogeia. |
| neighborhood | No | 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 | No | 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 | No | We generate one if you leave it blank. |
| description | No | English, up to 20,000 characters. |
| contact_phone / contact_whatsapp | No | Shown as call / WhatsApp buttons. If omitted, your agency defaults are used. |
| project_slug | No | Developers only: the slug of one of your developments; the unit then 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 | No | 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 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, all 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 your 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 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.