Portal feeds

Choose which portals each listing goes to, connect portal feeds, and serve the XML feeds portals crawl.

Fondaro sends your active listings to property portals as XML feeds the portals fetch. You choose the portals per listing, connect each portal once to get its feed URL, and give that URL to the portal.

List the portals

GET /properties/portals

The portals a listing can be sent to and what each needs. Needs properties:read.

bash
curl https://api.fondaro.com/properties/portals \  -H "Authorization: Bearer fondaro_pk_abc123"
json
[  {    "id": "kyero",    "slug": "kyero",    "label": "Kyero",    "family": "kyero_v3",    "category": "international",    "availability": "live",    "registration": "feed_url",    "requiresAccountRef": false,    "countries": ["ES"],    "costNote": "subscription"  }]
Portal idsAvailability
jamesedition, kyero, thinkspain, a_place_in_the_sun, properstar, spain_property_portal, trovit, mitula, nestoria, nuroa, green_acres, homesgofastlive
spainhouses, indomio, arkadiabeta
idealista, fotocasa, habitaclia, pisos_com, rightmove, zooplacoming_soon (cannot be selected)

Kyero takes Spanish listings only. JamesEdition has its own feed; see JamesEdition feed.

Choose a listing's portals

PUT /properties/:id/publications

Replaces the full set of portals one of your listings is sent to; [] removes it from every portal. Needs properties:write.

bash
curl -X PUT https://api.fondaro.com/properties/29a1e184-237a-40c8-a1fe-624b0bcbb2f4/publications \  -H "Authorization: Bearer fondaro_pk_abc123" \  -H "Content-Type: application/json" \  -d '{"portals": ["kyero", "trovit"]}'
json
[  { "portal": "kyero", "enabled": true, "status": "live", "firstServedAt": "2026-09-30T06:00:00.000Z", "lastServedAt": "2026-10-02T06:00:00.000Z" },  { "portal": "trovit", "enabled": true, "status": "queued", "firstServedAt": null, "lastServedAt": null }]

Selecting any of Trovit, Mitula, Nestoria or Nuroa selects all four: they share one feed. A coming-soon portal is a 400.

statusMeaning
queuedNot active yet, or not yet served in the feed
in_feedServed in the feed, but no fetch by the portal since
liveThe portal fetched the feed after the listing entered it. This does not prove the portal is showing it
not_connectedSelected, but your agency has not connected that portal
ineligibleA portal rule fails (see Eligibility)

GET /properties/:id on your own listing also returns publications and portalEligibility ([{ portal, eligible, reasons }]).

Connect a portal

These routes take a signed-in dashboard session; every write needs an organization admin.

Method and pathPurpose
GET /properties/portal-connectionsYour connections. feedUrl is hidden unless an admin adds ?includeFeedUrl=true
POST /properties/portal-connections/:portalConnect a portal and create its feed URL
PATCH /properties/portal-connections/:portalSave the portal's account reference ({ "accountRef": "..." }, up to 120 characters)
POST /properties/portal-connections/:portal/rotateReplace the feed URL; the old one stops working at once
DELETE /properties/portal-connections/:portalDisconnect
bash
curl -X POST https://api.fondaro.com/properties/portal-connections/kyero \  -H "Authorization: Bearer $SESSION_TOKEN"
json
{  "portal": "kyero",  "feedUrl": "https://api.fondaro.com/properties/feeds/kyero/<token>.xml",  "accountRef": null,  "createdAt": "2026-10-02T10:00:00.000Z",  "firstCrawledAt": null,  "lastCrawledAt": null,  "rotatedAt": null,  "crawlCount": 0,  "listingsInFeed": 12}

Green-Acres needs its agency id as accountRef before its feed serves anything. Rotating any of the four shared-feed portals rotates all four. After a rotation, give the new URL to the portal.

The feed URL

GET /properties/feeds/:slug/:token.xml

Public, because portal crawlers have no Fondaro login: the token in the path is the secret. Treat it like a password: never log it or put it in a client app.

bash
curl -i https://api.fondaro.com/properties/feeds/kyero/<token>.xml

Returns application/xml with every listing that is selected, active and eligible for that portal. The feed is always complete, so a listing that leaves it is removed by the portal on its next fetch.

FormatSlugs
Kyero V3kyero, thinkspain, a-place-in-the-sun, properstar, spain-property-portal, spainhouses, indomio, arkadia
Thribee (one shared feed)trovit, mitula, nestoria, nuroa
Green-Acresgreen-acres
HomesGoFasthomesgofast

A token works only with its own portal's slug (or any slug of the shared Thribee feed).

Caching. Responses carry Cache-Control: no-store, an ETag, and Last-Modified (the newest listing change). Send If-None-Match with the last ETag to get 304 Not Modified when nothing changed. A 200 or 304 counts as a fetch for the live status.

Errors. An unknown or coming-soon slug, a wrong token, a disabled agency or a missing Green-Acres account reference all return plain 404 Feed not found. A build failure returns 500 Feed unavailable. Neither says which check failed.

Eligibility

A listing is left out of a portal's feed while any rule fails. reasons can hold several:

ReasonMeaning
not_activeNot active (shown as queued)
no_price, price_out_of_rangeNo price, or one the format cannot carry
no_city, no_province, no_postcodeA required place field is empty
no_coordinatesLatitude and longitude are both required
country_not_supportedThe portal does not take the listing's country
currency_not_supportedThe format does not carry the listing's currency
type_not_supportedThe property type has no match at that portal
no_imagesNo usable photo (Kyero-format photo URLs must end in .jpg, .jpeg, .png or .gif with no query string)
rent_period_unsupportedThe rental period cannot be expressed
description_too_shortNo description long enough (Thribee needs 30 characters of text)
no_public_urlThribee needs a public page for the listing

The server decides eligibility; show these reasons rather than re-implementing the rules.