Skip to main content

Property Search (powered by our API)

Quick-start guide on building a property search using our API

Katie Searle avatar
Written by Katie Searle
Updated this week

Welcome to the Kato Listing API. This guide walks you through how to build your own property search using our API — from getting connected to going live.

For full technical details, refer to our Kato API Documentation.

👉 See also: Anatomy of a good property search (link to UX best practice page)


1. The basics

1.1 Authentication

All API requests require token-based authentication. Include your API key in the Authorization header:

Authorization: Bearer YOUR_API_KEY

1.2 Pagination

When querying a 'List' endpoint, the response will be paginated for performance.

If for example there are 100,000 results, pagination allows the results to be returned a page at a time.

You can use the limit parameter to change how many results are returned per page.

The default page size is specified varies depending on the end point requested.

You can use the page parameter to select which page you want to see.

For example, if the limit is 50, page 1 would return results 1 to 50, page 2 would return results 51 to 52 etc.

At the bottom of each response you will see a pagination block providing a summary of the data you have requested. This appears as follows:

  • from: First result this page

  • to: Last result this page

  • total: Count of results in total

  • count: Count of results this page

  • per_page: Number of results per page (see limit param)

  • current_page: Current page number (see page param)

  • total_pages: Total number of pages

  • links:

    • first: Navigate to the first page

    • previous: Navigate to the previous page

    • fastback: Navigate 10 pages back

    • next: Navigate to the next page

    • fastforward: Navigate 10 pages forward

    • last: Navigate to the last page

Take careful note of the total_pages count. If there are more than one, simply update the request to fetch page 2 of the results.

When using the links provided, don't forget to append any additional search params.

1.3 Rate limiting

  • Requests are limited to 60 per minute.

  • If you have exceeded your quota, a "429: Too Many Requests" response will be received.


2. Fetching Listings: List Availability

Use the List Availability endpoint to retrieve a list of available properties.

Endpoint

GET /v2/availability

Purpose

Returns a paginated list of current property listings based on specified search criteria.

Key Query Parameters

Parameter

Description

updated_from

Filter listings updated after this date.

page

Pagination control — specify page number.

per_page

Results per page.

Example request

https://client-api.agents-society-sandbox.com/v2/availability?updated_from=2023-07-07

Response Structure

Each listing in the response includes the below information, use this data to populate your search results or listings page. The full response can be found on the API docs, but below highlights the key attributes you'll want to use to build your results pages.

Attribute

Explainer

Meta data

Use to extract and order listings

id

Unique identifier for the listing.

published_to_website

Object defining whether the listing is published, featured, and display settings.

created_at

Timestamp of when the availability was first created in the system.

updated_at

Timestamp of the most recent update to this availability record.

status

Current availability status of the property (e.g., available, under offer).

Location data

Use to plot on a map and search

address

Object containing full address details including building name, line1, town, country.

position

Geolocation data with lat and lng values for map placement.

Availability data

Use to build your result cards and also to filter by

property_types

Array of property types (key & label) such as “office”, “retail”, etc.

💡 Properties can have multiple types

size

Object showing size range (from, to) in square feet/metres.

💡 Ensure you use the normalised from_sqft / to_sqft for your sort and filtering. In terms of display, you'll want to use the Agent input fields from / to

to_let

Boolean indicating if the property is available to let.

for_sale

Boolean indicating if the property is for sale.

rent

Object with rental details: currency, price range, metric (e.g., per sqft).

price

Object with sale price details if for sale.

images

Array of image objects with id, name, and url for each property image.

💡 Use the first image as your index thumbnail.


3. Fetching Property Details: Show Availability

Use the Show Availability endpoint to get full details for a specific listing.

Example request

GET /v2/availability/217027

Purpose

Returns full details for a single listing, used to build your property detail pages.

Response Structure

Each listing in the response includes the below information, this data is ideal for constructing a detailed property page. The full response can be found on the API docs, but below highlights the key attributes you'll want to use to build your property detail pages.

Attribute

Explainer

Meta data

Use to extract and update listings

id

Unique identifier for the listing.

reference_number

Internal reference number for the availability (e.g., agency or CRM ref).

published_to_website

Object defining whether the listing is published, featured, and display settings.

created_at

Timestamp of when the availability was first created in the system.

updated_at

Timestamp of the most recent update to this availability record.

status

Current availability status of the property (e.g., available, under offer).

Location data

Use to plot on a map and build your address strings

address

Object containing full address details including building name, line1, town, country.

position

Geolocation data with lat and lng values for map placement.

Availability data

Use to build your key property details

property_types

Array of property types (key & label) such as “office”, “retail”, etc.

size

Object showing size range (from, to) in square feet/metres.

to_let

Boolean indicating if the property is available to let.

for_sale

Boolean indicating if the property is for sale.

rent

Object with rental details: currency, price range, metric (e.g., per sqft).

price

Object with sale price details if for sale.

service_charge

Object with service charge information (value, metric, currency, comments).

business_rates

Object with business rates (value, metric, currency, comments).

estate_charge

Object for estate-level charges (value, metric, currency, comments).

epc

Energy Performance Certificate details including band and score.

Marketing text & media

Use to enrich the listing with marketing text and rich media

marketing

Marketing content object: summary, description, location text, specs, key points.

💡 summary - one sentence summarising the opportunity. Useful for lead-in headings.

💡 key_points - typically 4-6 bullet points highlighting standout features

💡 other headings - there are fixed headings and also some additional headings Agents can add themselves. The array spits out these headings and content in the order they want them displayed.

images

Array of image assets for galleries (includes id, name, url).

💡 The order of the images is usually very important for the Agents.

💡 Ensure you localise the images.

videos

Array of video links or media assets (if provided).

💡 Array will include a type of either normal video or 360 tour.

files

Array of downloadable documents (e.g., brochures, spec sheets).

💡 Ensure you localise the files.

assignees

Array of agents or contacts linked to this property, with name, contact info, photo.

💡 Ensure you persist the order of the Agents.

💡 Sometimes you may already have an Agents profile on your website, in that case use the Agents email to marry things up.

Floor / units

Use to build accommodation tables within a listing.

floor_units

Array of unit-level data (e.g., part floors) with size, rent, availability.

marketing_columns

(Accommodation Table)

Computed view for displaying key marketing data (e.g., unit name, rent, availability).

💡 In Kato the Agents can build an accommodation table, this array helps you extract that and build that within the listing.


4. Handling Enquiries

Capture user interest with an enquiry form on your property details page.

Endpoint

https://client-api.agents-society-sandbox.com/v2/enquiry

Purpose

Submit applicant enquiries (single property or multi-property shortlist) to Kato in a structured format.

POST format

Every enquiry should include the below data points to ensure the applicant and their enquiry are added correctly to Kato.

Field

Required

Description

Validation / Options

contact_title

Optional

Title of the contact.

Options: “Mr”, “Mrs”, “Ms”, “Miss”, “Dr”, “Professor”, “Reverend”, “Pastor”, “Rabbi”, “Sister”, “Councillor”, “Sergeant”.

forename

Optional

Contact’s first name.

Free text.

surname

Required

Contact’s surname.

Free text.

email

Conditionally Required

Contact’s email address. Required if tel is not provided.

Must be a valid email format.

tel

Conditionally Required

Contact’s telephone number. Required if email is not provided.

Allowed: digits (0-9), spaces, dashes (-), plus (+), parentheses.

contact_type

Optional

Defines the relationship type of the contact.

Options: “agent”, “applicant”, “architect”, “asset_manager”, “landlord”, “lessor”, “tenant”, “investor”, “investor_private”, “developer”, “purchaser”, “vendor”, “supplier”, “facilities_manager”, “client”, “property_owner”, “investment_agent”, “solicitor”, “bank”, “contractor”, “planning_consultant”, “other”.

contact_source

Optional

Numeric code for how the enquiry was received.

Options: 10 (Website), 11 (Telephone), 12 (Email).

title

Optional

Title of the enquiry requirement.

Auto-generated if lettings is provided.

comments

Optional

Free text comments or further information.

Free text.

lettings

Optional

Disposal ID for a specific property.

Must be a valid Disposal ID. Overrides tenures, types, size_from, size_to, title.

tenures

Optional

Requirement type.

Comma-separated: “tolet”, “forsale”.

types

Optional

Property type for the enquiry.

Must match valid property types (e.g., “office”, “retail”).

size_from

Optional

Minimum size requirement.

Must be less than size_to.

size_to

Optional

Maximum size requirement.

Must be greater than size_from.

size_unit

Optional

Unit of measurement.

Options: “sqft”, “sqm”, “hectare”, “desks”, “acres”, “beds”.

Example Request (Single Property Enquiry)

POST /v2/enquiry
Authorization: Bearer YOUR_API_KEY
Content-Type: multipart/form-data

contact_title=Mr
forename=Steve
surname=Oven
email=steveoven@example.com
contact_type=applicant
contact_source=10
title=Looking for offices in London
comments=Hi, I am looking for office spaces in central London
lettings=233868

Important Notes

  • Either email or tel is required (one must be provided).

  • If lettings is specified, it will override tenures, types, size_from, size_to, and title.

  • The form-data submission should match the format shown — use key-value pairs.

Enquiry Form UX Recommendations

  • Use inline validation for email and phone formats.

  • If you’re supporting shortlists (multi-property enquiries), submit one request per enquiry.

  • Implement spam protection (e.g., reCAPTCHA or similar).

  • Ensure clear user confirmation after submission.


5. Keeping data up-to-date

Set up automated jobs to:

  • Poll for new listings: Regularly check for newly added properties.

  • Update existing listings: Refresh data to reflect any changes.

  • Remove inactive listings: Ensure outdated properties are no longer displayed.

Recommended sync frequency: every 2–6 hours, depending on your requirements.


6. Testing and Going Live

Before launching:

  • Validate your API integration (authentication, search, detail views).

  • Confirm that data updates flow correctly.

  • Test edge cases (e.g., empty search results, error handling).

  • Run through the enquiry submission process.

  • Monitor performance and response times.

Once testing is complete, proceed to go live 🎉

Did this answer your question?