Open Houses

Read open houses agencies open to the network, RSVP to them, and the keyless invitation page for agents without an account.

Overview

An open house is an agency opening one of its listings to other agents for a time window. It states what the introducing agency earns, and other agents say they are coming. Open houses are free for every organization, host and attendee.

The listing behind an open house can come from any connected source (the Fondaro network, Resales Online and the rest). Fondaro reads it live through the same property sources as everything else, so the price and photos you see are the listing's current ones. The commission on the event is fixed when the host publishes it, so a later change to the listing cannot change a promise already made.

What each reader sees:

ReaderStreet addressCommission offeredListing owner's private commission
A signed-in agent (/network/open-houses)Yes: the event's disclosed address and the listing's own address and map position, as for any active network listingYesNever
Anyone with the link (/public/open-houses/:slug)Only after they confirm their RSVP by emailYesNever

Endpoints

Method & pathAuthPurpose
GET /network/open-housesDashboard sessionUpcoming open houses on the network, or your agency's own
GET /network/open-houses/:idDashboard sessionOne open house
GET /network/open-houses/by-slug/:slugDashboard sessionThe same open house, by the slug in its invitation link
GET /network/open-houses/:id/rsvpsDashboard sessionHost only: who is coming, by agency
POST /network/open-houses/:id/rsvpDashboard sessionSay you are going, or that you are not
GET /public/open-houses/:slugNoneThe invitation page data
POST /public/open-houses/:slug/rsvpNoneAsk to RSVP; sends a confirmation email
POST /public/open-houses/:slug/rsvp/confirmNoneConfirm the RSVP from the emailed link

Hosting (create, edit, publish, cancel, and the host's list of who is coming) uses the same /network/open-houses routes from the dashboard. Only your agency's admin or the listing's own agent can manage an open house.

The /network routes use the dashboard's Clerk bearer token and your active organization. They do not accept a property API key. On the MCP server, the same reads are the list_open_houses and get_open_house tools under the properties:read scope.

List open houses

GET /network/open-houses
Query parameterTypeDefaultDescription
scopenetwork | minenetworknetwork: published events other agents can see, nearest first. mine: your agency's events in every status
fromISO date-timenowEvents that end after this moment
toISO date-timenoneEvents that start before this moment
areastringnoneMatches the listing's city, area or community. Case and accents do not matter
placeIdUUIDnoneA place from GET /places: only events whose listing is in that place or inside it (a town and its neighbourhoods, a province and its towns). Combines with area. An unknown id returns 400 OPEN_HOUSE_FILTER_INVALID
sourcesource idnoneOnly events on listings from this source, for example internal or resales_online
listingSourcesource idnoneWith listingId: the open houses of exactly one listing
listingIdstringnoneThe listing's id in its source. Needs listingSource
listingCountrystringnoneThe listing's country, when its reference carries one (portal listings). A listing without one only matches events without one
limit1 to 10050Page size

To ask whether one listing has an open house, pass its reference exactly as a property search or detail returned it:

curl "https://api.fondaro.com/network/open-houses?listingSource=internal&listingId=a1b2c3d4-5e6f-7a8b-9c0d-1e2f3a4b5c6d" \
  -H "Authorization: Bearer $TOKEN"

listingId without listingSource, or a source that names a different source than listingSource, answers 400 OPEN_HOUSE_FILTER_INVALID.

curl "https://api.fondaro.com/network/open-houses?area=nueva%20andalucia&limit=10" \
  -H "Authorization: Bearer $TOKEN"
{
  "items": [
    {
      "id": "0b4d6c1e-8a53-4c2e-9f61-2b1f0e7d9a10",
      "slug": "q3H8vZ0bRk2mXw4t",
      "status": "published",
      "visibility": "network",
      "listingRef": { "source": "internal", "id": "a1b2c3d4-5e6f-7a8b-9c0d-1e2f3a4b5c6d" },
      "startsAt": "2026-09-29T09:00:00.000Z",
      "endsAt": "2026-09-29T12:00:00.000Z",
      "timezone": "Europe/Madrid",
      "disclosedAddress": "Calle Ejemplo 7, Los Granados Golf",
      "mapUrl": "https://maps.example.com/?q=36.49,-4.98",
      "commissionOffer": 4,
      "commissionNotes": "+ VAT, payable on invoice",
      "invitation": {
        "headline": "Garden apartment on the golf",
        "body": "Come and see it before it goes to the portals.",
        "points": ["South facing", "Community fees 1,800 EUR a year"]
      },
      "contactName": "Lucia Moreno",
      "contactPhone": "+34 600 000 002",
      "host": { "organizationId": "…", "name": "Example Realty", "logoUrl": "https://…" },
      "hostUserId": "user_2abc…",
      "listing": {
        "ref": { "source": "internal", "id": "a1b2c3d4-5e6f-7a8b-9c0d-1e2f3a4b5c6d" },
        "source": "internal",
        "title": "Garden apartment",
        "price": 650000,
        "currency": "EUR",
        "bedrooms": 3,
        "city": "Marbella",
        "area": "Nueva Andalucía",
        "address": { "line1": "Calle Ejemplo 7", "postalCode": "29660" },
        "latitude": 36.4912,
        "longitude": -4.9876,
        "agent": { "firstName": "Lucia", "lastName": "Moreno" }
      },
      "goingCount": 4,
      "myRsvp": null,
      "isHost": false,
      "createdAt": "2026-09-24T08:00:00.000Z",
      "updatedAt": "2026-09-24T08:05:00.000Z"
    }
  ],
  "hasMore": false
}

listing is null when the listing can no longer be read or is no longer on the market; the event's own fields still show. hostUserId is who to message: start a conversation with POST /chat/dms and recipientUserId set to it. hostHandle is the host agent's network handle (/network/agents/{handle}), or null when their profile is not open to you; host.networkSlug is the host agency's page (/network/agencies/{slug}), or null. commissionOffer is a percentage for the introducing agency.

Get one open house

GET /network/open-houses/:id
curl https://api.fondaro.com/network/open-houses/0b4d6c1e-8a53-4c2e-9f61-2b1f0e7d9a10 \
  -H "Authorization: Bearer $TOKEN"

Returns one object in the shape above. Another agency's open house is readable once it is published, including one shared by link only. A draft is visible to the host alone; anything else reads as 404.

By its invitation link

GET /network/open-houses/by-slug/:slug
curl https://api.fondaro.com/network/open-houses/by-slug/q3H8vZ0bRk2mXw4t \
  -H "Authorization: Bearer $TOKEN"

The invitation link /open-houses/:slug carries only the slug. This answers with the same object, the same rules and the same 404s as the read by id, so an app that opens the link while signed in can show the full event, including one shared by link only.

Who is coming (host only)

GET /network/open-houses/:id/rsvps
[
  {
    "id": "5e0c…",
    "status": "going",
    "kind": "network",
    "attendeeUserId": "user_2xyz…",
    "attendeeOrganizationId": "…",
    "agencyName": "Costa Homes",
    "attendeeName": "Ana García",
    "attendeeImageUrl": "https://img.clerk.com/…",
    "guestName": null,
    "guestEmail": null,
    "createdAt": "2026-09-25T10:00:00.000Z",
    "updatedAt": "2026-09-25T10:00:00.000Z"
  },
  {
    "id": "7a91…",
    "status": "going",
    "kind": "guest",
    "attendeeUserId": null,
    "attendeeOrganizationId": null,
    "agencyName": "Guest Agency",
    "attendeeName": null,
    "attendeeImageUrl": null,
    "guestName": "Pat Guest",
    "guestEmail": "pat@example.com",
    "createdAt": "2026-09-25T11:00:00.000Z",
    "updatedAt": "2026-09-25T11:00:00.000Z"
  }
]

An agent on Fondaro carries their name and photo as another agency sees them: never their sign-in email. A guest is named by what they typed when they confirmed. Only your agency's admin or the listing's agent can read this list.

RSVP as a signed-in agent

POST /network/open-houses/:id/rsvp
curl -X POST https://api.fondaro.com/network/open-houses/0b4d6c1e-8a53-4c2e-9f61-2b1f0e7d9a10/rsvp \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "status": "going" }'

You have one RSVP per open house. Send { "status": "declined" } to take it back and going again to change your mind. Returns the open house with your myRsvp. Your own agency's events answer 400 OPEN_HOUSE_OWN_EVENT; a cancelled or finished one answers 409 OPEN_HOUSE_RSVP_CLOSED.

The public invitation

GET /public/open-houses/:slug

No authentication. The slug is the link the host shares; open houses are never listed publicly and the response carries X-Robots-Tag: noindex, nofollow. It is cached for up to five minutes.

curl https://api.fondaro.com/public/open-houses/q3H8vZ0bRk2mXw4t
{
  "slug": "q3H8vZ0bRk2mXw4t",
  "status": "published",
  "startsAt": "2026-09-29T09:00:00.000Z",
  "endsAt": "2026-09-29T12:00:00.000Z",
  "timezone": "Europe/Madrid",
  "commissionOffer": 4,
  "commissionNotes": "+ VAT, payable on invoice",
  "invitation": { "body": "Come and see it before it goes to the portals." },
  "contactName": "Lucia Moreno",
  "contactPhone": "+34 600 000 002",
  "host": { "name": "Example Realty", "logoUrl": "https://…" },
  "listing": {
    "ref": { "source": "internal", "id": "a1b2c3d4-5e6f-7a8b-9c0d-1e2f3a4b5c6d" },
    "title": "Garden apartment",
    "price": 650000,
    "city": "Marbella",
    "area": "Nueva Andalucía"
  },
  "goingCount": 4,
  "rsvpOpen": true
}

There is no street address, postcode, map link or map position here. They appear only in the confirmation response below.

RSVP without an account

POST /public/open-houses/:slug/rsvp
curl -X POST https://api.fondaro.com/public/open-houses/q3H8vZ0bRk2mXw4t/rsvp \
  -H "Content-Type: application/json" \
  -d '{ "name": "Ana Example", "agency": "Example Homes", "email": "ana@example.com" }'

Answers 202 { "status": "pending_confirmation" } and emails a confirmation link to the address given. Nothing is saved and the host sees nothing until the link is confirmed. The answer is the same whether or not that email has answered before. The form's hidden website field must stay empty. The route allows 5 requests a minute per network address.

Confirm the RSVP

POST /public/open-houses/:slug/rsvp/confirm

The email links to the invitation page on fondaro.com, which sends the token here. It is a POST so an email scanner opening the link cannot confirm on someone's behalf. The link is valid for 48 hours and can be opened again.

curl -X POST https://api.fondaro.com/public/open-houses/q3H8vZ0bRk2mXw4t/rsvp/confirm \
  -H "Content-Type: application/json" \
  -d '{ "token": "v2:…" }'
{
  "status": "confirmed",
  "openHouse": { "slug": "q3H8vZ0bRk2mXw4t", "goingCount": 5, "rsvpOpen": true },
  "disclosedAddress": "Calle Ejemplo 7, Los Granados Golf",
  "mapUrl": "https://maps.example.com/?q=36.49,-4.98",
  "listingAddress": { "line1": "Calle Ejemplo 7", "postalCode": "29660" },
  "latitude": 36.4912,
  "longitude": -4.9876
}

openHouse is the full public object from above (shortened here). A link that is not valid answers 400 OPEN_HOUSE_RSVP_TOKEN_INVALID.

Errors

Errors carry a code:

StatusCodeMeaning
404OPEN_HOUSE_NOT_FOUNDNo such open house, or it is not visible to you
400OPEN_HOUSE_FILTER_INVALIDThe one-listing filter is incomplete or contradicts source
403OPEN_HOUSE_HOST_ONLYOnly the host agency's admin or the listing's agent can do this
400OPEN_HOUSE_OWN_EVENTYour agency hosts this open house
409OPEN_HOUSE_RSVP_CLOSEDThe open house is cancelled or has ended
400OPEN_HOUSE_RSVP_TOKEN_INVALIDThe confirmation link is not valid or has expired
503OPEN_HOUSE_EMAIL_FAILEDThe confirmation email could not be sent; try again

Notifications

Signed-in agents with the mobile app get a push for the open houses they are part of. Each push carries { "type": "open_house.<event>", "route": "open_house", "openHouseId": "…" }:

TypeWho gets it
open_house.rsvp_createdThe member who created the event, when someone says they are coming
open_house.updatedEveryone going, when the time, the address or the commission changes
open_house.cancelledEveryone going, when the event is cancelled

Each type is also a notification preference key (PUT /notifications/preferences with types); all three are on by default.