Overview

Public CRM API provides secure read-only access for analytics systems, BI/reporting tools,

partner integrations, and data pipelines.

All responses use a standard JSON envelope:

{
  "data": [...],
  "count": 123,
  "page": { "limit": 50, "cursor": "<token>" },
  "meta": { "from": "...", "to": "...", "sortBy": "...", "sortDir": "...", "filters": {} }
}

Authentication

All requests require an API key in the request header:

x-api-key: <YOUR_API_KEY>
ScenarioHTTP StatusError Code
Missing header401MISSING_API_KEY
Invalid key401INVALID_API_KEY
Disabled key / missing permission403FORBIDDEN

Base URLs

Each resource is served by a dedicated base endpoint URL:

ResourceBase URL
Contactshttps://us-central1-kendal-17416.cloudfunctions.net/contacts
Listingshttps://us-central1-kendal-17416.cloudfunctions.net/listings
Inquirieshttps://us-central1-kendal-17416.cloudfunctions.net/inquiries
Dealshttps://us-central1-kendal-17416.cloudfunctions.net/deals
Appointmentshttps://us-central1-kendal-17416.cloudfunctions.net/appointments

Pagination

All list endpoints use cursor-based pagination:

  1. Call the endpoint without a cursor parameter
  2. Read page.cursor from the response
  3. Call the same endpoint with cursor=<value> to get the next page
  4. Stop when cursor is null

Never construct cursors manually — they are opaque tokens signed by the server.

Rate Limits

Rate limits are applied per API key using a sliding window.

Limit: 2 requests per second per API key.

HeaderDescription
x-ratelimit-remainingRequests remaining in current window
x-ratelimit-resetUnix timestamp when the window resets

Exceeding the limit returns 429 RATE_LIMIT_EXCEEDED.

Best practices:

  • Use /count endpoints when you only need totals
  • Retry UPSTREAM_SEARCH_ERROR with exponential backoff
  • Use explicit from/to for reproducible reports
  • Log the x-request-id response header for debugging

Errors

All errors use a consistent envelope and are accompanied by an HTTP status code.

CodeHTTPMeaning
MISSING_API_KEY401Missing x-api-key header
INVALID_API_KEY401Key not recognized
FORBIDDEN403Missing endpoint permission
INVALID_QUERY400Invalid query parameter value
INVALID_CURSOR400Cursor invalid or tampered
RATE_LIMIT_EXCEEDED429Request rate exceeded for this API key
UPSTREAM_SEARCH_ERROR502Elasticsearch temporary issue — retry with backoff
INTERNAL_ERROR500Unexpected server error

Contacts

Read-only access to CRM contact records. Backed by Elasticsearch index contacts_v2.

GET
/api/v1/contacts

List Contacts

contacts:data

Returns a paginated list of contacts. Supports filtering by status, source, agent, tags, and full-text search.

limit
integer

Range 1-200. Number of records per page.

Default:50
cursor
string

Opaque pagination token from previous page.cursor. Never construct manually.

from
ISO datetime

Inclusive start of date range on lastEditedOn/updatedAt.

Default:now - 90 days
to
ISO datetime

Inclusive end of date range.

Default:now
sortBy
string

Accepted: lastEditedOn, createdOn, updatedAt

Default:lastEditedOn
sortDir
string

Accepted: asc, desc

Default:desc
createdBy
string (CSV)

Filter by creator email. Accepts comma-separated values to match multiple creators (e.g., createdBy=user1@example.com,user2@example.com).

leadAgent
string (CSV)

Filter by lead agent email. Accepts comma-separated values to match multiple agents (e.g., leadAgent=agent1@example.com,agent2@example.com).

assignedAgent
string (CSV)

Filter by assigned agent email. Accepts comma-separated values to match multiple agents. Alias for leadAgent. Also accepts: agentAssigned.

status
string (CSV)

Filter by contact status. Accepts comma-separated values to match multiple statuses (e.g., status=new,active).

source
string (CSV)

Filter by contact source. Accepts comma-separated values to match multiple sources (e.g., source=Imported Contact,Website). Example values: "Imported Contact".

tags
string (CSV)

Filter by contact tags. Accepts comma-separated values to match multiple tags. Possible values: "preLead", "prospect", "client". Alias: tag.

hasEmail
boolean

Only returns contacts with a non-empty email field.

hasPhone
boolean

Only returns contacts with a non-empty phone or phoneNumber field.

q
string

Search contacts by name, email, phone number, source, or status. Supports partial matches (e.g., 'john' finds 'John Smith'). Combine with other filters to narrow results.

data
array

Array of contact objects

contactId
string

Unique contact identifier

organisationId
string

Organization identifier (also available as organizationId)

type
string

Contact type. Possible values: 'preLead', 'prospect', 'client'. Filterable via 'tags' query parameter

id
string

Alternative contact identifier

displayId
string

Human-readable display identifier

contactTitle
string

Contact title or salutation

firstName
string

First name. Searchable via 'q' query parameter

lastName
string

Last name

full name
string

Full name. Searchable via 'q' query parameter

email
string

Email address. Searchable via 'q' query parameter. Filterable via 'hasEmail' query parameter

phone
string

Phone number. Searchable via 'q' query parameter. Filterable via 'hasPhone' query parameter

dateOfBirth
ISO datetime

Date of birth

currentAddress
string

Current address

company
string

Company name

externalContactRole
string

Role for external contacts

nationality
string

Nationality

countryofResidence
string

Country of residence

status
string or array

Contact status (e.g., 'Initial Consultation'). Filterable via 'status' query parameter

source
string or array

Contact source (e.g., 'Imported Contact', 'Website'). Filterable via 'source' query parameter

intent
array

Array of contact intents (e.g., ['Rent', 'Buy'])

tags
array

Array of tags

notes
string

Notes about the contact

isSpam
boolean

Whether contact is marked as spam

isCold
boolean

Whether contact is cold

isArchived
boolean

Whether contact is archived

isResident
boolean

Whether contact is a resident

createdBy
string

Email of user who created the contact. Filterable via 'createdBy' query parameter

addedBy
string

Email of user who added the contact

leadAgent
string

Email of the lead agent. Filterable via 'leadAgent' or 'assignedAgent' query parameters

agentAssigned
array

Array of assigned agent UIDs. Filterable via 'assignedAgent' or 'agentAssigned' query parameters

assignedBy
string

Email of user who assigned agents

convertedBy
string

Email of user who converted the contact

access
string or array

Emails of users with access

accessLevel
array

Array of access level objects

email
string

Email of user with access

level
string

Access level (e.g., 'manage')

addedBy
string

Email of user who granted access

type
string

Access type (e.g., 'leadAgent', 'agentAssigned')

addedOn
ISO datetime

When access was granted

sharedAccessLevels
array

Array of shared access level objects

email
string

Email of user with shared access

accessLevel
string

Access level (e.g., 'fullAccess')

addedOn
ISO datetime

When shared access was granted

createdOn
ISO datetime

When the contact was created. Sortable via 'sortBy=createdOn' query parameter

lastEditedOn
ISO datetime

When the contact was last edited. Sortable via 'sortBy=lastEditedOn' query parameter. Date range filterable via 'from' and 'to' query parameters

leadAgentAddedOn
ISO datetime

When the lead agent was assigned

assignedOn
ISO datetime

When agents were assigned

convertedOn
ISO datetime

When the contact was converted to a client

convertedToProspectOn
ISO datetime

When converted to prospect

importedOn
ISO datetime

When the contact was imported

emailValidatedOn
ISO datetime

When email was validated

lastInquiryAt
ISO datetime

Last inquiry timestamp

bedroomInterest
array

Array of bedroom preferences

propertyTypeInterest
array

Array of property type interests

propertyDetails
string

Property details

locationsOfInterest
array

Array of locations of interest

location
string

Location

subLocationsOfInterest
array

Array of sub-locations of interest

budget
object

Budget information

min
number

Minimum budget

max
number

Maximum budget

currency
string

Currency code

value
number

Budget value

isRange
boolean

Whether budget is a range

listing
object

Associated listing information

reference
string

Listing reference

agentDetails
object

Agent details

uid
string

Agent user ID

name
string

Agent name

email
string

Agent email

phone
string

Agent phone

accessLevel
string

Agent access level

convertedToProspectBy
string

Email of user who converted to prospect

leadPoolCurrentTeam
string

Current lead pool team

imported
boolean

Whether contact was imported

inquiredOnMetaAds
array

Meta ads inquired on

conversationSummary
string

Summary of conversations

timeline
string

Timeline information

additionalInfo
string

Additional information

lastEditedBy
string

Email of user who last edited

isEmailValid
boolean

Whether email is valid

count
integer

Total matching contacts across all pages

page
object

Pagination info

limit
integer

Records per page

cursor
string or null

Token for next page. null when exhausted.

meta
object

Applied filters and sort info

from
string

ISO datetime

to
string

ISO datetime

sortBy
string

Field used for sorting (e.g., lastEditedOn, createdOn, updatedAt)

sortDir
string

Sort direction: 'asc' (ascending) or 'desc' (descending)

filters
object

All filters applied to this query (status, source, tags, etc.)

GET
/api/v1/contacts/count

Count Contacts

contacts:count

Returns only the total count and applied filter metadata. Use when you need totals for dashboards and do not need actual records — cheaper on rate limits.

status
string (CSV)

Filter by contact status. Accepts comma-separated values to match multiple statuses (e.g., status=new,active).

source
string (CSV)

Filter by contact source. Accepts comma-separated values to match multiple sources (e.g., source=Imported Contact,Website). Example values: "Imported Contact".

tags
string (CSV)

Filter by contact tags. Accepts comma-separated values to match multiple tags. Possible values: "preLead", "prospect", "client". Alias: tag.

hasEmail
boolean

Only returns contacts with a non-empty email field.

hasPhone
boolean

Only returns contacts with a non-empty phone or phoneNumber field.

createdBy
string (CSV)

Filter by creator email. Accepts comma-separated values to match multiple creators (e.g., createdBy=user1@example.com,user2@example.com).

leadAgent
string (CSV)

Filter by lead agent email. Accepts comma-separated values to match multiple agents (e.g., leadAgent=agent1@example.com,agent2@example.com).

assignedAgent
string (CSV)

Filter by assigned agent email. Accepts comma-separated values to match multiple agents. Alias for leadAgent. Also accepts: agentAssigned.

q
string

Search contacts by name, email, phone number, source, or status. Supports partial matches (e.g., 'john' finds 'John Smith'). Combine with other filters to narrow results.

count
integer

Total number of matching contacts

meta
object

Filter echo

from
string

ISO datetime

to
string

ISO datetime

filters
object

All filters applied to this query (status, source, tags, etc.)

Listings

Read-only access to property listing records. Backed by Elasticsearch index listings_v1.

GET
/api/v1/listings

List Listings

listings:data

Returns a paginated list of property listings. Supports filtering by status, portal, property type, location, price range, and bedrooms.

limit
integer

Range 1-200

Default:50
cursor
string

Opaque pagination token

from
ISO datetime

Inclusive, filters on updatedAt

Default:now - 90 days
to
ISO datetime

Inclusive

Default:now
sortBy
string

Accepted: updatedAt, createdAt

Default:updatedAt
sortDir
string

asc / desc

Default:desc
status
string (CSV)

Filter by listing status. Accepts comma-separated values to match multiple statuses. Possible values: "onMarket", "offTheMarket", "tempOffMarket".

portal
string (CSV)

Filter by portal publication status. Accepts one or more portal names (bayut, dubizzle, propertyFinder, externalWebsite) as comma-separated values (e.g., portal=bayut or portal=bayut,dubizzle).

propertyType
string (CSV)

Filter by property type. Accepts comma-separated values to match multiple types. Possible values: "Apartment / Flat", "Villa / House", "Bungalow", "Duplex", "Penthouse", "Townhouse", "Bulk Unit", "Full Residential Floor", "Whole Building", "Hotel Apartment", "Loft Apartment", "Residential Land / Plot", "Office", "Compound", "Factory", "Farm", "Labor Camp", "Business Centre", "Retail", "Restaurant", "Storage", "Shop", "Showroom", "Co-working Space", "Warehouse", "Half Floor", "Staff Accommodation".

city
string (CSV)

Filter by city. Accepts comma-separated values to match multiple cities (e.g., city=Dubai,Abu Dhabi). Searches across listing location fields.

location
string (CSV)

Filter by location. Accepts comma-separated values to match multiple locations (e.g., location=Downtown,Marina). Searches across listing location fields.

agentEmail
string (CSV)

Filter by assigned agent email. Accepts comma-separated values to match multiple agents (e.g., agentEmail=agent1@example.com,agent2@example.com).

referenceId
string (CSV)

Filter by listing reference ID. Matches the main listingId, bayutReferenceId, or propertyFinderReferenceId. Accepts comma-separated values to match multiple listings (e.g., referenceId=KD-1074,KD-1075). Bayut and Property Finder reference matches only apply when those portal reference values are stored separately and differ from the main listingId.

bayutReferenceId
string (CSV)

Filter by Bayut reference ID. Accepts comma-separated values to match multiple listings (e.g., bayutReferenceId=KD-1074-B,KD-1075-B2). This only returns matches when bayutReferenceId is stored separately and differs from the main listingId.

propertyFinderReferenceId
string (CSV)

Filter by Property Finder reference ID. Accepts comma-separated values to match multiple listings (e.g., propertyFinderReferenceId=KD-1074-P3,KD-1075-P). This only returns matches when propertyFinderReferenceId is stored separately and differs from the main listingId.

minPrice
number

Minimum price filter. For rentals, filters by rent amount; for sales, filters by asking price.

maxPrice
number

Maximum price filter. For rentals, filters by rent amount; for sales, filters by asking price.

minBedrooms
number

Minimum number of bedrooms.

maxBedrooms
number

Maximum number of bedrooms.

data
array

Array of listing objects

listingId
string

Unique identifier for the listing (e.g., 'KT-1148'). Filterable via the 'referenceId' query parameter.

bayutReferenceId
string

Bayut reference identifier for the listing, returned when present. This is only distinct/useful when it differs from the main listingId. Filterable via 'referenceId' or 'bayutReferenceId'.

propertyFinderReferenceId
string

Property Finder reference identifier for the listing, returned when present. This is only distinct/useful when it differs from the main listingId. Filterable via 'referenceId' or 'propertyFinderReferenceId'.

organisationId
string

ID of the organization that owns this listing

propertyId
string

External property identifier (if applicable)

category
string

Property category (e.g., 'Residential', 'Commercial')

marketType
string

Market type (e.g., 'Ready to Buy', 'Rent', 'Off-Plan')

visibility
string

Visibility setting for the listing

state
string

Current state (e.g., 'published', 'draft')

status
string

Property status (e.g., 'Primary Property (New)', 'Secondary Property (Resale)')

isUnderReview
boolean

Whether the listing is currently under review

createdAt
ISO datetime

When the listing was created. Sortable via 'sortBy=createdAt' query parameter

createdBy
string

Email of the user who created the listing

lastSaved
ISO datetime

Last save timestamp

lastSavedBy
string

Email of the user who last saved the listing

title
string

Property title/headline

propertyType
string

Type of property (e.g., 'Apartment / Flat', 'Villa / House', 'Whole Building'). Filterable via 'propertyType' query parameter

building
string

Building name

unitNumber
string

Unit/apartment number

towerNumber
string

Tower number (for multi-tower buildings)

floorNumber
string

Floor number

streetAndLocality
string

Street address and locality details

municipalityNumber
string

Municipality registration number

subLocality
string

Sub-locality or neighborhood name

postalCode
string

Postal/ZIP code

city
string

City name. Filterable via 'city' query parameter

province
string

Province or state

country
string

Country name or code

locality
string

Main locality/area name. Filterable via 'location' query parameter

usage
string

Property usage type (e.g., 'Residential', 'Commercial')

latitude
number

Geographic latitude coordinate

longitude
number

Geographic longitude coordinate

geoPointLocation
object

Geographic point object

lat
number

Latitude

lon
number

Longitude

propertyArea
object

Property area in sq ft

type
string

Area type

value
number

Area value

min
number

Minimum area

max
number

Maximum area

carpetArea
object

Carpet area in sq ft

type
string

Area type

value
number

Area value

min
number

Minimum area

max
number

Maximum area

bedrooms
object

Number of bedrooms. Filterable via 'minBedrooms' and 'maxBedrooms' query parameters

type
string

Bedroom type

value
number

Number of bedrooms

min
number

Minimum bedrooms

max
number

Maximum bedrooms

baths
object

Number of bathrooms

type
string

Bathroom type

value
number

Number of bathrooms

min
number

Minimum bathrooms

max
number

Maximum bathrooms

stories
object

Number of stories/floors

type
string

Stories type

value
number

Number of stories

min
number

Minimum stories

max
number

Maximum stories

parkingSpaces
object

Number of parking spaces

type
string

Parking type

value
number

Number of spaces

min
number

Minimum spaces

max
number

Maximum spaces

style
string

Architectural style (e.g., 'Mediterranean', 'Modern')

planType
string

Floor plan type

view
string

Property view (e.g., 'Lake', 'City', 'Mountain')

propertyCondition
string

Condition/furnishing status (e.g., 'Fully Furnished', 'Unfurnished')

desc
string

Full property description

keyFeatures
array

Array of key features and highlights

images
array

Array of image objects

url
string

Image URL

hero
boolean

Whether this is the hero image

originalImages
array

Array of original (unwatermarked) image objects

videos
array

Array of video URLs or objects

notes
string

Internal notes about the property

additionalInfo
string

Additional information or special notes

askingPrice
object

Sale price. Filterable via 'minPrice' and 'maxPrice' query parameters

type
string

Price type

value
number

Price value

min
number

Minimum price

max
number

Maximum price

priceOnApplication
boolean

Whether price is available on application only

annualServiceFees
object

Annual service/maintenance fees

price
number

Alternative price field

rentAndFees
object

Rental information. Rent amount filterable via 'minPrice' and 'maxPrice' query parameters

visible
boolean

Whether rent info is visible

frequency
string

Rent payment frequency (e.g., 'Yearly', 'Monthly')

rentAmount
number

Rent amount

leaseTerm
string

Lease term duration

cheques
number

Number of cheques

securityDeposit
number

Security deposit amount

applicationFees
number

Application fees

openHouse
object

Open house information

viewingAvailability
string

Viewing availability details

propertyAvailableFrom
ISO datetime

When property becomes available

propertyAvailableFromOffPlan
ISO datetime

Availability date for off-plan properties

projectDetails
object

Project information

projectName
string

Development project name

developerName
string

Developer name

propertyAvailableFrom
ISO datetime

Project availability date

projectTimeline
string

Project timeline and milestones

paymentPlan
object

Payment plan details

visible
boolean

Whether payment plan is visible

stages
array

Payment stages

exclusivity
boolean

Whether listing has exclusivity agreement

exclusivityStartDate
ISO datetime

Exclusivity period start date

exclusivityEndDate
ISO datetime

Exclusivity period end date

occupancyStatus
string

Current occupancy status

portals
object

Portal publication status. Filterable via 'portal' query parameter

bayut
boolean

Published on Bayut

dubizzle
boolean

Published on Dubizzle

propertyFinder
boolean

Published on Property Finder

externalWebsite
boolean

Published on external website

pfListingId
string

Property Finder listing ID

pfState
object

Property Finder sync state

stage
string

Sync stage

type
string

Sync type

reasons
array

Sync reasons or errors

bayutCity
string

Bayut-specific city field

bayutLocality
string

Bayut-specific locality field

bayutSubLocality
string

Bayut-specific sub-locality field

bayutBuilding
string

Bayut-specific building field

assignedAgent
object

Primary assigned agent. Filterable via 'agentEmail' query parameter

name
string

Agent full name

email
string

Agent email address

phoneNumber
string

Agent phone number

photo
string

Agent profile photo URL

licenseNumber
string

Agent license number

role
string

Agent role (e.g., 'Admin', 'Agent')

portalAgents
object

Portal-specific agent assignments

bayut
object

Bayut agent details

dubizzle
object

Dubizzle agent details

propertyFinder
object

Property Finder agent details

externalWebsite
object

External website agent details

ownerContactIds
array

Array of owner contact IDs

previousOwnerContactIds
array

Array of previous owner contact IDs

regulatoryInfo
object

Regulatory and compliance information

dldNumber
string

Dubai Land Department permit number

permitExpirationDate
ISO datetime

Permit expiration date

contractExpirationDate
ISO datetime

Contract expiration date

contractNumber
string

Contract reference number

listingStatus
string

Current listing status (e.g., 'onMarket', 'offMarket'). Filterable via 'status' query parameter

statusReason
string

Reason for current status

neighbourhood
object

Neighborhood information

visible
boolean

Whether neighborhood info is visible

desc
string

Neighborhood description

images
array

Array of neighborhood images

amenities
object

Amenities

visible
boolean

Whether amenities are visible

amenities
array

Array of amenity names (e.g., 'Covered Parking', 'Swimming Pool', 'Gym')

spotlight_listing
boolean

Whether this is a featured/spotlight listing

duplicatedFrom
string

Reference to original listing if this is a duplicate

count
integer

Total matching listings

page
object

Pagination

limit
integer

No description provided.

cursor
string or null

No description provided.

meta
object

Filter/sort echo

GET
/api/v1/listings/count

Count Listings

listings:count

Returns only the total count and filter metadata. Ideal for dashboards showing portfolio size or inventory analytics without fetching full records.

status
string (CSV)

Filter by listing status. Accepts comma-separated values to match multiple statuses. Possible values: "onMarket", "offTheMarket", "tempOffMarket".

portal
string (CSV)

Filter by portal publication status. Accepts one or more portal names (bayut, dubizzle, propertyFinder, externalWebsite) as comma-separated values (e.g., portal=bayut or portal=bayut,dubizzle).

propertyType
string (CSV)

Filter by property type. Accepts comma-separated values to match multiple types. Possible values: "Apartment / Flat", "Villa / House", "Bungalow", "Duplex", "Penthouse", "Townhouse", "Bulk Unit", "Full Residential Floor", "Whole Building", "Hotel Apartment", "Loft Apartment", "Residential Land / Plot", "Office", "Compound", "Factory", "Farm", "Labor Camp", "Business Centre", "Retail", "Restaurant", "Storage", "Shop", "Showroom", "Co-working Space", "Warehouse", "Half Floor", "Staff Accommodation".

city
string (CSV)

Filter by city. Accepts comma-separated values to match multiple cities (e.g., city=Dubai,Abu Dhabi). Searches across listing location fields.

location
string (CSV)

Filter by location. Accepts comma-separated values to match multiple locations (e.g., location=Downtown,Marina). Searches across listing location fields.

agentEmail
string (CSV)

Filter by assigned agent email. Accepts comma-separated values to match multiple agents (e.g., agentEmail=agent1@example.com,agent2@example.com).

referenceId
string (CSV)

Filter by listing reference ID. Matches the main listingId, bayutReferenceId, or propertyFinderReferenceId. Accepts comma-separated values to match multiple listings (e.g., referenceId=KD-1074,KD-1075). Bayut and Property Finder reference matches only apply when those portal reference values are stored separately and differ from the main listingId.

bayutReferenceId
string (CSV)

Filter by Bayut reference ID. Accepts comma-separated values to match multiple listings (e.g., bayutReferenceId=KD-1074-B,KD-1075-B2). This only returns matches when bayutReferenceId is stored separately and differs from the main listingId.

propertyFinderReferenceId
string (CSV)

Filter by Property Finder reference ID. Accepts comma-separated values to match multiple listings (e.g., propertyFinderReferenceId=PF-1074-P,PF-1075-P2). This only returns matches when propertyFinderReferenceId is stored separately and differs from the main listingId.

minPrice
number

Minimum price filter. For rentals, filters by rent amount; for sales, filters by asking price.

maxPrice
number

Maximum price filter. For rentals, filters by rent amount; for sales, filters by asking price.

minBedrooms
number

Minimum number of bedrooms.

maxBedrooms
number

Maximum number of bedrooms.

count
integer

Total matching listings

meta
object

Filter echo

Inquiries

Read-only access to inquiry records. Default sort is by creation date (descending). Note: Only one multi-value (CSV) filter is allowed per request.

GET
/api/v1/inquiries

List Inquiries

inquiries:data

Returns a paginated list of inquiries. Supports filtering by source, listing identifier, inquiry type, and assigned agent. Note: Only one multi-value (CSV) filter is allowed per request.

limit
integer

Range 1-200. Number of records per page.

Default:50
cursor
string

Opaque pagination token from previous response's page.cursor. Never construct manually.

from
ISO datetime

Inclusive start of createdAt range.

Default:now - 90 days
to
ISO datetime

Inclusive end of createdAt range.

Default:now
sortBy
string

Currently only 'createdAt' is supported.

Default:createdAt
sortDir
string

Accepted: asc, desc

Default:desc
source
string (CSV)

Filter by inquiry source. Accepted values: 'WhatsApp', 'Property Finder', 'Bayut', 'Dubizzle', 'Website', 'Landing Page', 'Meta' and other valid contact sources. Accepts comma-separated values.

listingId
string (CSV)

Filter by listing identifier. Accepts comma-separated values.

inquiryType
string (CSV)

Filter by inquiry type. Accepted values: 'whatsapp', 'property_inquiry', 'agent_inquiry', 'project_inquiry', 'landingPage', 'Buy', 'meta'. Accepts comma-separated values.

assignedAgent
string (CSV)

Filter by assigned agent email. Accepts comma-separated values.

data
array

Array of inquiry objects

id
string

Unique inquiry identifier

orgId
string

Organization ID

type
string

Inquiry type. Possible values: 'whatsapp', 'property_inquiry', 'agent_inquiry', 'project_inquiry', 'landingPage', 'Buy', 'meta'

source
string

Inquiry source. Possible values: 'WhatsApp', 'Property Finder', 'Bayut', 'Dubizzle', 'Website', 'Landing Page', 'Meta' and other valid contact sources

leadType
string

Lead type. Possible values: 'whatsapp', 'email', 'call', 'leadApi', 'landingPage', 'meta', etc.

contactId
string

Associated contact ID

listingId
string

Associated listing ID (optional)

agentId
string

Email of assigned agent

message
string

Inquiry message content (optional)

createdAt
string

When the inquiry was created (ISO 8601)

updatedAt
string

When the inquiry was last updated (ISO 8601, optional)

createdBy
string

Email of user who created the inquiry

updatedBy
string

Email of user who last updated the inquiry

inquiryReceivedAt
string

When the inquiry was received (ISO 8601, optional)

isClosed
boolean

Whether inquiry is closed

closedAt
string

When the inquiry was closed (ISO 8601, optional)

closedBy
string

Email of user who closed the inquiry (optional)

responded
boolean

Whether inquiry has been responded to

respondedAt
string

When the inquiry was responded to (ISO 8601, optional)

respondedBy
string

Email of user who responded (optional)

respondedMessage
string

Response message text (optional)

scheduledViewingStatus
boolean

Whether a viewing has been scheduled

contactLink
string

Contact link URL (optional)

pfLeadId
string

Property Finder lead ID (optional)

pfChannel
string

Communication channel. Possible values: 'whatsapp', 'email', 'call' (optional)

pfStatus
string

Lead status. Possible values: 'sent', 'read' (optional)

pfEntityType
string

Entity type. Possible values: 'listing', 'agent', 'project' (optional)

pfResponseLink
string

Response link URL (optional)

pfPublicProfileId
string or number

Public profile ID (optional)

pfListingId
string

Property Finder listing ID (optional)

pfProjectId
string

Property Finder project ID (optional)

pfDeveloperId
string

Property Finder developer ID (optional)

pfEntityId
string

Entity ID (optional)

pfEnrichmentData
object

Additional enrichment data (optional)

pfProjectData
object

Project details (optional)

developer
object

Developer information

dldId
string

DLD ID

id
string

Project ID

location
object

Project location

startingPrice
string

Starting price

title
object

Localized project title

landingPageName
string

Landing page name (optional)

externalSiteData
object

External site data (optional)

intent
array of strings

User intent (e.g., ['Buy'], ['Rent'])

metaAdName
string

Meta ad campaign name (optional)

metaFormContent
object

Form submission data with custom fields (optional)

count
integer

Total matching inquiries across all pages

page
object

Pagination info

limit
integer

Records per page

cursor
string or null

Token for next page. null when no further pages exist

meta
object

Applied filters and sort info

from
string

Start date of the query range (ISO 8601)

to
string

End date of the query range (ISO 8601)

sortBy
string

Field used for sorting (always 'createdAt')

sortDir
string

Sort direction (asc or desc)

filters
object

Applied filters

GET
/api/v1/inquiries/count

Count Inquiries

inquiries:count

Returns only the total count and metadata for filtered inquiries. Note: Only one multi-value (CSV) filter is allowed per request.

from
ISO datetime

Inclusive start of createdAt range.

Default:now - 90 days
to
ISO datetime

Inclusive end of createdAt range.

Default:now
source
string (CSV)

Filter by inquiry source. Accepted values: 'WhatsApp', 'Property Finder', 'Bayut', 'Dubizzle', 'Website', 'Landing Page', 'Meta' and other valid contact sources.

listingId
string (CSV)

Filter by listing identifier.

inquiryType
string (CSV)

Filter by inquiry type. Accepted values: 'whatsapp', 'property_inquiry', 'agent_inquiry', 'project_inquiry', 'landingPage', 'meta'.

assignedAgent
string (CSV)

Filter by assigned agent email.

count
integer

Total matching inquiries

meta
object

Filter and range echo

from
string

Start date of the query range (ISO 8601)

to
string

End date of the query range (ISO 8601)

filters
object

All filters applied to this query

Deals

Read-only access to deal records. Default sort is by last updated date (descending).

GET
/api/v1/deals

List Deals

deals:data

Returns a paginated list of deals. Supports filtering by pipeline stage, lifecycle status (active/paused/terminated/completed), assigned agent, contact, listing, deal value range, and date windows. Note: Only one multi-value (CSV) filter is allowed per request.

limit
integer

Range 1-200. Number of records per page.

Default:50
cursor
string

Opaque pagination token from previous response's page.cursor. Never construct manually.

from
ISO datetime

Inclusive start of date range for filtering by last updated date.

Default:now - 90 days
to
ISO datetime

Inclusive end of date range for filtering by last updated date.

Default:now
sortBy
string

Sort field. Currently only 'updatedAt' is supported.

Default:updatedAt
sortDir
string

Accepted: asc, desc

Default:desc
stage
string (CSV)

Filter by current stage name (e.g., 'Under Offer', 'Closed'). Accepts comma-separated values.

pipeline
string (CSV)

Filter by pipeline name (e.g., 'Rental', 'Secondary'). Accepts comma-separated values.

status
string (CSV)

Filter by deal lifecycle status. Accepted values: 'isTerminated' (or 'terminated'), 'isPaused' (or 'paused'), 'isCompleted' (or 'completed'), 'isActive' (or 'active').

assignedAgent
string (CSV)

Filter by assigned agent email. Accepts comma-separated values for multiple agents.

displayId
string (CSV)

Filter by display ID (e.g., 'KT-D-114'). Accepts comma-separated values.

contactId
string (CSV)

Filter by contact identifier. Accepts comma-separated values.

listingId
string (CSV)

Filter by listing identifier. Accepts comma-separated values.

minDealValue
number

Minimum deal value filter. Alias: minValue. Uses finalPrice, offerPrice, or askingPrice (in that order).

maxDealValue
number

Maximum deal value filter. Alias: maxValue. Uses finalPrice, offerPrice, or askingPrice (in that order).

createdAtFrom
ISO datetime

Inclusive lower bound on deal creation date.

createdAtTo
ISO datetime

Inclusive upper bound on deal creation date.

updatedAtFrom
ISO datetime

Inclusive lower bound on deal update date. Overrides the default 'from' parameter when supplied.

updatedAtTo
ISO datetime

Inclusive upper bound on deal update date. Overrides the default 'to' parameter when supplied.

closeDateFrom
ISO datetime

Inclusive lower bound on deal close date.

closeDateTo
ISO datetime

Inclusive upper bound on deal close date.

data
array

Array of deal objects

id
string

Unique deal identifier

displayId
string

Human-readable deal ID (e.g., 'KT-D-114')

organisationId
string

Organisation ID this deal belongs to

title
string

Deal title/description

pipeline
string

Pipeline name (e.g., 'Rental', 'Secondary'). Filterable via 'pipeline' query parameter

completedPipelineStages
array

Array of completed stages

position
number

Stage position in pipeline (0-indexed)

stage
string

Stage name (e.g., 'Under Offer', 'Closed')

completedOn
string

ISO 8601 timestamp when stage was completed

approvalStagesStatus
array

Stages requiring approval

stageId
string

Approval stage identifier

approversStatus
array

Per-approver state for this stage

checklistStatus
array

Checklist items required before approval

approvalNotes
string

Optional approval notes

stageStatus
string

One of: 'unsent', 'pending', 'approved', 'rejected'

approvalRequestedOn
ISO datetime

When approval was requested

approvalRequestedBy
string

User who requested approval

approvalApprovedOn
ISO datetime

When approval was granted

approvalApprovedBy
string

User who approved

approvalRejectedOn
ISO datetime

When approval was rejected

approvalRejectedBy
string

User who rejected

status
string

Deal status. Filterable via 'status' query parameter

isTerminated
boolean

Whether the deal has been terminated. Filterable via 'status=isTerminated'

terminationReason
string

Reason provided when the deal was terminated

terminatedOn
ISO datetime

When the deal was terminated

terminatedBy
string

Email of user who terminated the deal

isPaused
boolean

Whether the deal is currently paused. Filterable via 'status=isPaused'

pauseReason
string

Reason provided when the deal was paused

lastPausedOn
ISO datetime

Timestamp of the most recent pause

lastPausedBy
string

Email of user who last paused the deal

lastRestoredOn
ISO datetime

Timestamp of the most recent un-pause

lastRestoredBy
string

Email of user who last restored the deal

firstPartyIntent
string

First party role (e.g., 'Tenant', 'Landlord', 'Buyer', 'Seller')

secondPartyIntent
string

Second party role

agent
string

Primary agent email. Filterable via 'assignedAgent' query parameter

agents
array

Array of agent emails involved in the deal. Filterable via 'assignedAgent' query parameter

firstPartyAgents
array

Agents representing first party

email
string

Agent email

mainAgent
boolean

Whether this is the main agent

commissionRate
number

Commission percentage

secondPartyAgents
array

Agents representing second party

type
string

Agent type (e.g., 'contact')

contactId
string

Contact ID if agent is a contact

mainAgent
boolean

Whether this is the main agent

commissionRate
number

Commission percentage

firstPartyClients
array

Clients on the first party side. Filterable via 'contactId' query parameter

contactId
string

Associated contact ID

mainClient
boolean

Whether this is the main client on the first party side

secondPartyClients
array

Clients on the second party side. Filterable via 'contactId' query parameter

contactId
string

Associated contact ID

mainClient
boolean

Whether this is the main client on the second party side

associatedListing
string

Listing ID this deal is for (e.g., 'KT-1262'). Filterable via 'listingId' query parameter

listingOwnerProcessed
boolean

Whether listing owner has processed the deal

rentAmount
number | null

Rent amount (for rental deals)

rentFrequency
string | null

Rent frequency ('Yearly', 'Monthly', 'Daily', etc.)

offerPrice
number | null

Offer price

askingPrice
number | null

Asking price

finalPrice
number | null

Final agreed price

securityDeposit
number | null

Security deposit amount

monthlyService
number | null

Monthly service charge

applicationFees
number | null

Application fees

maxCheques
number | null

Maximum number of cheques allowed

leaseTerm
number | null

Lease term in months

additionalInfo
string

Additional notes/information

terms
string | null

Deal terms

solicitorId
string | null

Solicitor ID

mortgageBrokerId
string | null

Mortgage broker ID

createdOn
ISO datetime

When the deal was created. Filterable via 'createdAtFrom' / 'createdAtTo' query parameters

lastUpdated
ISO datetime

When the deal was last updated. Default sort field (sortBy=updatedAt). Filterable via 'from'/'to' or 'updatedAtFrom'/'updatedAtTo' query parameters

count
integer

Total matching deals across all pages

page
object

Pagination info

limit
integer

Records per page

cursor
string or null

Token for next page. null when no further pages exist

meta
object

Applied filters and sort info

from
string

ISO datetime lower bound for last updated date

to
string

ISO datetime upper bound for last updated date

sortBy
string

Field used for sorting (currently only 'updatedAt')

sortDir
string

Sort direction: 'asc' or 'desc'

filters
object

All filters applied to this query

GET
/api/v1/deals/count

Count Deals

deals:count

Returns only the total count and applied filter metadata for deals. Useful for dashboards and portfolio metrics without fetching full records — cheaper on rate limits.

from
ISO datetime

Inclusive lower bound on last updated date.

Default:now - 90 days
to
ISO datetime

Inclusive upper bound on last updated date.

Default:now
stage
string (CSV)

Filter by current stage name (e.g., 'Under Offer', 'Closed'). Accepts comma-separated values.

pipeline
string (CSV)

Filter by pipeline name (e.g., 'Rental', 'Secondary'). Accepts comma-separated values.

status
string (CSV)

Filter by deal lifecycle status. Accepted: 'isTerminated', 'isPaused', 'isCompleted', 'isActive' (aliases without the 'is' prefix are also accepted).

assignedAgent
string (CSV)

Filter by agent email.

displayId
string (CSV)

Filter by display ID (e.g., 'KT-D-114'). Accepts comma-separated values.

contactId
string (CSV)

Filter by contact identifier

listingId
string (CSV)

Filter by listing identifier

minDealValue
number

Alias: minValue. Minimum deal value. Uses finalPrice, offerPrice, or askingPrice (in that order).

maxDealValue
number

Alias: maxValue. Maximum deal value. Uses finalPrice, offerPrice, or askingPrice (in that order).

createdAtFrom
ISO datetime

Inclusive lower bound on deal creation date.

createdAtTo
ISO datetime

Inclusive upper bound on deal creation date.

updatedAtFrom
ISO datetime

Inclusive lower bound on deal update date (overrides 'from' when provided).

updatedAtTo
ISO datetime

Inclusive upper bound on deal update date (overrides 'to' when provided).

closeDateFrom
ISO datetime

Inclusive lower bound on deal close date.

closeDateTo
ISO datetime

Inclusive upper bound on deal close date.

count
integer

Total matching deals

meta
object

Filter and range echo

from
string

ISO datetime lower bound for last updated date

to
string

ISO datetime upper bound for last updated date

filters
object

All filters applied to this query

Appointments

Read-only access to appointment records. Default sort is by start time (descending). Note: Only one multi-value (CSV) filter is allowed per request.

GET
/api/v1/appointments

List Appointments

appointments:data

Returns a paginated list of appointments. Supports filtering by creator, associated contacts/deals/listings, appointment type (e.g., "propertyViewing", "followUp"), status, and time ranges.

limit
integer

Range 1-200. Number of records per page.

Default:50
cursor
string

Opaque pagination token from previous response's page.cursor. Never construct manually.

from
ISO datetime

Inclusive start of startTime range.

Default:now - 90 days
to
ISO datetime

Inclusive end of startTime range.

Default:now
sortBy
string

Currently only 'startTime' is supported.

Default:startTime
sortDir
string

Accepted: asc, desc

Default:desc
createdBy
string (CSV)

Filter by creator email. Accepts comma-separated values.

contactId
string (CSV)

Filter by contact identifier. Accepts comma-separated values.

dealId
string (CSV)

Filter by deal identifier. Accepts comma-separated values.

listingId
string (CSV)

Filter by listing identifier. Accepts comma-separated values.

status
string (CSV)

Filter by appointment status string.

appointmentType
string (CSV)

Filter by appointment type. Accepted values: 'Follow-Up', 'Valuation', 'In-Person Meeting', 'Online Meeting', 'Developer Briefing', 'Admin Work', 'Lead Generation', 'Viewing', 'Lead Call', 'General', 'Other'.

endTimeFrom
ISO datetime

Inclusive lower bound on endTime.

endTimeTo
ISO datetime

Inclusive upper bound on endTime.

data
array

Array of appointment objects

id
string

Unique appointment identifier

title
string

Appointment title

description
string

Appointment description (optional)

startTime
string

Appointment start time (ISO 8601)

endTime
string

Appointment end time (ISO 8601)

appointmentType
string

Type of appointment

assignedTeamMembers
array of strings

Email addresses of assigned team members

assignedContacts
array of strings

Contact IDs assigned to the appointment

listingIds
array of strings

Associated listing IDs

dealIds
array of strings

Associated deal IDs

conferencingLink
string

Video conferencing link (optional)

referenceDocument
string

Reference document URL (optional)

integrations
object

Integration details (optional)

contactInvites
object

Contact invite integration (optional)

googleCalendar
object

Google Calendar integration (optional)

createdAt
string

Timestamp when appointment was created (ISO 8601)

createdBy
string

Email of user who created the appointment

lastUpdatedAt
string

Timestamp of last update (ISO 8601)

lastUpdatedBy
string

Email of user who last updated the appointment

count
integer

Total matching appointments across all pages

page
object

Pagination info

limit
integer

Records per page

cursor
string or null

Token for next page. null when no further pages exist

meta
object

Applied filters and sort info

from
string

Start date of the query range (ISO 8601)

to
string

End date of the query range (ISO 8601)

sortBy
string

Field used for sorting (always 'startTime')

sortDir
string

Sort direction (asc or desc)

filters
object

Applied filters

GET
/api/v1/appointments/count

Count Appointments

appointments:count

Returns only the total count and filter metadata for appointments without fetching full records. Useful for dashboards and calendar analytics.

from
ISO datetime

Inclusive start of startTime range.

Default:now - 90 days
to
ISO datetime

Inclusive end of startTime range.

Default:now
createdBy
string (CSV)

Filter by creator email.

contactId
string (CSV)

Filter by contact identifier.

dealId
string (CSV)

Filter by deal identifier.

listingId
string (CSV)

Filter by listing identifier.

status
string (CSV)

Filter by appointment status.

appointmentType
string (CSV)

Filter by appointment type. Accepted values: 'Follow-Up', 'Valuation', 'In-Person Meeting', 'Online Meeting', 'Developer Briefing', 'Admin Work', 'Lead Generation', 'Viewing', 'Lead Call', 'General', 'Other'.

endTimeFrom
ISO datetime

Inclusive lower bound on endTime.

endTimeTo
ISO datetime

Inclusive upper bound on endTime.

count
integer

Total matching appointments

meta
object

Filter and range echo

from
string

Start date of the query range (ISO 8601)

to
string

End date of the query range (ISO 8601)

filters
object

Applied filters