What is the HAVHO feed?

HAVHO is a property feed format for any agency website, property platform, CRM, or aggregator that needs to publish real-estate data for import. A feed is a single properties array: each property listing carries its own agency and agent, and listings that disappear from the array are removed automatically.

Field names follow the HAVHO Property Feed contract exactly. The pipeline is:

Data flow

Agency website / property system / source feed → normalisation → HAVHO feed document (this spec) → AdminBuilder import → the HAVHO app.

The three record types

RecordKey fieldPurpose
Agencyid (in agency)The organisation a listing belongs to.
Agentid (in agent)The person responsible for a listing; always linked to one agency.
Property listingidAn active listing, linked to exactly one agent and one agency.
Removed listing— (automatic)A listing that is no longer in properties is removed on the next sync. An explicit deletions array with a reason is optional.

When AdminBuilder imports the feed it stores each property together with its agent and agency (one record per listing — there are no separate agent or agency records to keep in step). See the Field Reference for every field.

Identifier rules

Transport

Paging (large feeds)

A feed may be split into pages. Give us the feed URL and we request it one page per run: the first run reads page=1, the next run page=2, and so on. We add (or replace) the page query parameter and keep everything else you put in the URL:

https://api.example.com/properties?site=acme&page=1
https://api.example.com/properties?site=acme&page=2
https://api.example.com/properties?site=acme&page=3   → { "properties": [] }   (end)

Protecting your feed (optional)

Sync model

The feed is pulled on a schedule and treated as the current state of the source:

Always send the full current set

Because absence means removal, each pull must contain all active listings. A failed request, an unreadable document or a document without a properties collection never removes anything; an intentionally empty properties array removes all of the feed's listings.

Every record gets a sourceUpdatedAt automatically: the time it was first stored, moved forward whenever any returned value changes — including price, description, address, images, or agent/agency contact details. Consumers use it to detect changes incrementally. You may still send your own if your source has a reliable timestamp.

Incremental retrieval

A feed may support returning only records changed since a given time by honouring an updated_since query parameter (ISO-8601). When it does, it echoes the value back in the envelope's updated_since field. When it does not, it returns the full snapshot and updated_since is null — the importer copes with both.

Reading the catalogue back out

Everything above is about sending us a feed. A separate read-only REST API (/api/havho/v1) serves the imported catalogue back out to a consuming application — different audience, different field names (it uses externalListingId where the feed uses id). That API, its pagination, incremental sync and every endpoint's exact response shape are documented on its own page:

REST API Reference →

Pricing

Images

Controlled values

FieldAllowed values
statusOptional. Leave it out: everything in properties is active
typesale, rent
propertyTypehouse, apartment, townhouse, vacant land, farm/ smallholding, commercial property, industrial property, development
featuresFree text (max 100 labels, 100 characters each). Known labels Pet friendly, Garden, Flatlet, Pool, Security Estate power the site filters; any other label (e.g. Borehole, Solar Inverter) is kept as sent.
reason (deletions)sold, rented, withdrawn, expired, deleted, source_removed

Quickstart

  1. Normalise your source data into the JSON or XML document — a properties array, each property with its agency and agent. Every field is in the Field Reference.
  2. Serve it at a stable HTTPS URL. Protect it with an X-API-Key header if it should not be public.
  3. Check it against sample-feed.json / sample-feed.xml.
  4. In your provider dashboard: Submit a feed — paste the URL (and the key, if protected). It is fetched and dry-run through the importer on submit, showing the record counts and any problems before anything goes live.