Octopus XML Feed
Integration Guide
Everything a partner needs to ingest, sync, and maintain Octopus Prime real estate listings โ field-by-field, with stable identity rules and update-handling protocols.
60 min
The feed regenerates automatically every hour with a full snapshot of all live listings.
XML (Kyero V3)
Standard Kyero V3 XML schema โ ingest with any Kyero-compatible parser or CRM.
<id>
Stable record ID + bedroom suffix. Key your entire catalogue on this field.
EUR (from AED)
Prices converted from AED to EUR at the live exchange rate on every refresh.
01 ยท Overview
What is the Octopus XML Feed?
A normalized, Kyero-compatible XML property feed of Octopus Prime's curated UAE developments. One project expands into multiple property entries โ one per bedroom configuration with a listed price.
The feed is regenerated automatically every 60 minutes. Each refresh is a full snapshot โ it contains every currently-available listing. There is no delta format; partners are expected to reconcile against their own stored catalogue using the <id> field.
02 ยท Structure
Feed Structure
A <root> element wraps Kyero-style metadata and sibling <property> elements.
The high-level shape:
<root>
<kyero>
<feed_version>3</feed_version>
</kyero>
<property>
<id>rec0RFLLtuQjVvOnY-2</id>
<date>2026-03-14 19:48:50</date>
<ref>REP-MARL-2BR</ref>
<price>459340</price>
<price_freq>sale</price_freq>
<part_ownership>0</part_ownership>
<leasehold>0</leasehold>
<new_build>1</new_build>
<type>apartment</type>
<town>AL REEM ISLAND</town>
<province>ABU DHABI</province>
<country>UAE</country>
<beds>2</beds>
<baths>2</baths>
<pool>1</pool>
<surface_area><built>81</built><plot>0</plot></surface_area>
<features><feature>Swimming Pool</feature><feature>Gym</feature><feature>Covered Parking</feature><feature>Handover: 2028-12-31</feature><feature>Payment plan: 20% down payment, 30% during construction, 40% on handover, 10% post-handover over 12 months</feature><feature>Full upfront payment discount: 5%</feature></features>
<desc><en> ... </en><es> ... </es></desc>
<images>
<image id="1"><url>...</url></image>
<image id="2"><tags><tag>floorplan</tag></tags><url>...</url></image>
</images>
<video_url>...</video_url>
<prime>0</prime>
<virtual_tour_url>...</virtual_tour_url>
</property>
<property> ... </property>
...
</root>The <kyero> block carries the feed version only (Kyero V3 standard). Each <property> is one sellable unit variant.
03 ยท Identity & Stability
How IDs are formed โ and what stays stable
The single most important section for partners. Get this wrong and your catalogue will duplicate or drop listings.
<id> โ your primary key
Formed as {recordId}-{beds}.
Example: rec0RFLLtuQjVvOnY-2 โ record rec0RFLLtuQjVvOnY (the project), bedroom suffix 2.
<ref> โ human-readable, semi-stable
Formed as {DEV(3)}-{PROJECT(4)}-{BEDS}.
Example: REP-MARL-2BR โ REP (Reportage), MARL (Marlin 2), 2BR.
Rule of thumb
Key on <id>. Store it permanently on first sight. On every sync, look up by id: if it exists โ update fields; if new โ insert; if a stored id is absent from the feed โ the listing was removed, mark unavailable.
A single project with 3 priced bedroom configs produces 3 properties with 3 distinct ids โ they are independent listings from a sync perspective.
04 ยท Field Reference
Every field, explained
Stability tags: STABLE (never changes for a given id) ยท SEMI (changes only on rename) ยท CHANGES (overwrite on sync) ยท FIXED (constant across all listings).
| Field | Type | Stability | Description & handling |
|---|---|---|---|
| id | string | STABLE | Internal record ID + bedroom suffix (e.g. rec0RFLLtuQjVvOnY-2). Deterministic. The primary key you must store. Action: STORE permanently. Use this as your internal unique key for deduplication and updates. |
| ref | string | SEMI | Human-readable code: DEV(3)-PROJECT(4)-BEDS (e.g. REP-MARL-2BR). Derived from developer + project names. Action: Store, but do NOT use as primary key. If developer/project is renamed, ref changes while id stays the same. |
| date | datetime (UTC) | CHANGES | Listing timestamp formatted as YYYY-MM-DD HH:MM:SS (UTC). Action: Use for sorting/display only. Do not treat as last-modified; price/photo changes do not update this field. |
| price | integer (EUR) | CHANGES | Price converted from AED to EUR using the current exchange rate. Rounded to whole euros. Action: OVERWRITE on every sync if value differs. Always store the latest. Never preserve stale price. |
| price_freq | string | FIXED | Always 'sale' โ these are listings for sale, not rentals. Action: Store. Constant. |
| part_ownership | integer | FIXED | Always 0 โ whole-ownership properties, no fractional ownership. Action: Store. Constant. |
| leasehold | integer | FIXED | Always 0 โ freehold properties (not leasehold). Action: Store. Constant. |
| new_build | integer | FIXED | Always 1 (these are all new-build developments). Action: Store. Constant. |
| type | string | STABLE | Normalized singular lowercase type: apartment, studio, villa, townhouse, penthouse, or duplex. Action: Store. Unlikely to change for a given project. |
| town | string | STABLE | District / area name (e.g. AL REEM ISLAND). Action: Store. May be refined over time. |
| province | string | STABLE | City / emirate (e.g. ABU DHABI, DUBAI). Action: Store. |
| country | string | FIXED | Always 'UAE'. Action: Store. Constant. |
| beds | integer | STABLE | Bedroom count for this unit variant (0 = studio, 1โ5). Action: Store. Tied to id suffix โ stable. |
| baths | integer | STABLE | Bathroom count for this unit variant. Action: Store. Enriched from source data. |
| pool | integer | FIXED | Always 1 โ all developments include pool access. Action: Store. Constant. |
| surface_area.built | integer (mยฒ) | STABLE | Built area in square meters (converted from sq ft). Action: Store. Recalculated only if source size changes. |
| surface_area.plot | integer (mยฒ) | STABLE | Plot area in mยฒ. Real value for villas/townhouses with private land; 0 for apartments. Action: Store. Treat 0 as 'not applicable' (apartments). Recalculated only if source size changes. |
| features.feature | array of strings | CHANGES | Amenity / feature list for the project (e.g. Pool, Gym, Covered Parking). Multiple <feature> siblings. Action: OVERWRITE the whole array on sync. Replace your stored list; do not merge with old values. |
| desc.en / desc.es | text (XML-escaped) | CHANGES | Project description in English and Spanish, prefixed with the project name (e.g. 'MARLIN 2. ...'). XML-escaped โ no CDATA sections. Action: OVERWRITE on change. Store both if you serve multilingual markets. |
| images.image | array (id + url) | CHANGES | Gallery images with sequential id attributes (id="1", id="2"โฆ). Each URL is a stable proxy link ending in .jpg that 302-redirects to the current source image. Placeholder/invalid URLs are filtered out. Floor plans carry a <tags><tag>floorplan</tag></tags> marker. Action: URLs are stable proxy links (end in .jpg) that always 302-redirect to the current image. Safe to hot-link, or overwrite the array on sync and self-host if you prefer. |
| tags.tag (floorplan) | string | STABLE | Tag marker inside an <image> element indicating a floor plan resource. Value: 'floorplan'. Action: Store. Use as a flag to display a 'Floor plan available' badge and link to floor_plans_url. |
| video_url | URL | CHANGES | Standard Kyero video URL โ mapped from the project's YouTube link. Action: OVERWRITE on change. Same value as youtube_video_url. |
| prime | integer | FIXED | Always 0 โ Kyero's own 'prime listing' premium flag; not used by Octopus. Action: Store. Constant. |
| features (Handover) | text | CHANGES | Emitted as a <feature>: 'Handover: YYYY-MM-DD'. The expected handover/completion date. Action: OVERWRITE on change. May shift as construction progresses. |
| features (Payment plan) | text | CHANGES | Emitted as a single <feature>: 'Payment plan: X% down payment, Y% during construction, Z% on handover, W% post-handover over N months'. Only present parts are listed. Action: OVERWRITE on change. Up to four parts: down payment, during construction, on handover, post-handover (+ months). |
| features (Full upfront payment discount) | text | CHANGES | Emitted as a <feature>: 'Full upfront payment discount: X%' โ only when a full-payment discount applies. Action: OVERWRITE on change. If absent, no full-payment discount is offered. |
| virtual_tour_url | URL | CHANGES | Kyero V3 standard field. 360ยฐ virtual tour link โ allowed providers: Matterport, Nodalview, EyeSpy360, iStaging. Action: OVERWRITE on change. If absent, no virtual tour is available. |
05 ยท Sync Protocol
How to ingest & maintain your catalogue
Treat every refresh as a full snapshot. Reconcile by id. Overwrite mutable fields.
Fetch & parse
Download the full XML every โค60 min. Parse all <property> elements into a list keyed by id.
Reconcile by id
For each id: if new โ INSERT into your catalogue. If exists โ UPDATE mutable fields. For stored ids absent from feed โ mark unavailable / delete.
Overwrite mutable
price, images, desc, handover (in features), payment plan (in features), video, virtual tour โ always replace with latest. Never preserve stale values.
06 ยท Asset Hosting
Asset URLs โ all hot-link safe
Every URL in the feed resolves to a stable external resource. No downloads or self-hosting required.
Safe to hot-link
<images>โ stable proxy URLs (end in .jpg, 302-redirect to the current image).<video_url>โ YouTube link, stable.<virtual_tour_url>โ virtual tour on a 3rd-party platform (Matterport, Nodalview, etc.).
All URLs in the feed resolve to stable external resources โ no download or mirroring required.
How image URLs work โ the Octopus proxy
Every <image> URL in the feed is a stable proxy link ending in .jpg (e.g. .../functions/feedImage?p=recXXXX-2&i=1.jpg). On each request the proxy reads the current source URL from our cache and returns a 302 redirect to it. The cache refreshes every 60 minutes, so the proxy always resolves to a valid, fresh image โ you can hot-link these URLs directly to your visitors.
07 ยท Update Scenarios
What to do whenโฆ
Real-world situations and the correct handling for each.
Price changed
The price field updates on the next feed refresh. Overwrite the stored price with the new value. The id and ref remain identical โ do not create a duplicate listing.
Photos changed / rotated
Image URLs are stable proxy links โ the same URL always resolves to the current photo via 302. You can keep the URL as-is on every sync, or overwrite your array if you self-host.
A field is missing in an update
A missing optional field (video, virtual tour, floor plan image, post-handover plan) means the data is not available โ clear it on your side. Do NOT preserve the previous value. A missing price or size means the unit variant was removed: delete that property from your catalogue.
New bedroom variant added
A new id appears (e.g. recXXXX-5 for a newly priced 5BR). Treat it as a new listing. Existing ids are untouched.
A property disappeared from the feed
If an id you stored is no longer present in a full feed refresh, the project/variant was removed or sold out. Mark it unavailable or delete it from your catalogue โ do not keep selling it.
Developer or project renamed
ref will change (it is derived from names). id stays the same. Match on id, update the ref + display name. Never duplicate.
Exchange rate moved
price (EUR) is recomputed from the source AED price ร current rate on every generation. Expect small price drift between refreshes even if the AED price is unchanged. Always overwrite price.
Handover date shifted
handover updates on change. Overwrite and reflect on your listing. No id change.
08 ยท Rules of Engagement
Do's & Don'ts
The short version of everything above. Print it. Pin it.
Do
- Key everything on the id field โ it is stable for the lifetime of the listing.
- Overwrite mutable fields (price, images, descriptions, handover, payment plans) on every sync.
- Treat each feed refresh as a full snapshot: compare ids, add new, update existing, remove missing.
- Hot-link image, video and virtual-tour URLs directly โ they are stable. No download or self-hosting is required.
- Poll the feed at most once per 60 minutes โ that is our regeneration cadence.
Don't
- Do not use ref as your primary key โ it can change if names are edited.
- Do not expect brochure, fact-sheet or furnishing fields โ they are not part of the Kyero V3 schema and are not in the feed. Request them via your Octopus contact if needed.
- Do not preserve stale values for fields that go missing โ clear them.
- Do not keep selling listings whose id has disappeared from the feed.
- Do not poll more frequently than 60 min โ you will get identical payloads.
- Do not modify or 'improve' descriptions โ they are curated by Octopus.
09 ยท Worked Example
Anatomy of one property
A real entry from the feed, annotated.
rec0RFLLtuQjVvOnY-2
REP-MARL-2BR
MARLIN 2
459.340 โฌ
20% / 30% / 40% / 10%
2028-12-31
<id> suffix and is an independent listing for sync purposes.