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>| Scenario | HTTP Status | Error Code |
|---|---|---|
| Missing header | 401 | MISSING_API_KEY |
| Invalid key | 401 | INVALID_API_KEY |
| Disabled key / missing permission | 403 | FORBIDDEN |
Base URLs
Each resource is served by a dedicated base endpoint URL:
| Resource | Base URL |
|---|---|
| Contacts | https://us-central1-kendal-17416.cloudfunctions.net/contacts |
| Listings | https://us-central1-kendal-17416.cloudfunctions.net/listings |
| Inquiries | https://us-central1-kendal-17416.cloudfunctions.net/inquiries |
| Deals | https://us-central1-kendal-17416.cloudfunctions.net/deals |
| Appointments | https://us-central1-kendal-17416.cloudfunctions.net/appointments |
Pagination
All list endpoints use cursor-based pagination:
- Call the endpoint without a
cursorparameter - Read
page.cursorfrom the response - Call the same endpoint with
cursor=<value>to get the next page - Stop when
cursorisnull
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.
| Header | Description |
|---|---|
x-ratelimit-remaining | Requests remaining in current window |
x-ratelimit-reset | Unix timestamp when the window resets |
Exceeding the limit returns 429 RATE_LIMIT_EXCEEDED.
Best practices:
- Use
/countendpoints when you only need totals - Retry
UPSTREAM_SEARCH_ERRORwith exponential backoff - Use explicit
from/tofor reproducible reports - Log the
x-request-idresponse header for debugging
Errors
All errors use a consistent envelope and are accompanied by an HTTP status code.
| Code | HTTP | Meaning |
|---|---|---|
| MISSING_API_KEY | 401 | Missing x-api-key header |
| INVALID_API_KEY | 401 | Key not recognized |
| FORBIDDEN | 403 | Missing endpoint permission |
| INVALID_QUERY | 400 | Invalid query parameter value |
| INVALID_CURSOR | 400 | Cursor invalid or tampered |
| RATE_LIMIT_EXCEEDED | 429 | Request rate exceeded for this API key |
| UPSTREAM_SEARCH_ERROR | 502 | Elasticsearch temporary issue — retry with backoff |
| INTERNAL_ERROR | 500 | Unexpected server error |
Contacts
Read-only access to CRM contact records. Backed by Elasticsearch index contacts_v2.
/api/v1/contactsList Contacts
contacts:dataReturns a paginated list of contacts. Supports filtering by status, source, agent, tags, and full-text search.
limitintegerRange 1-200. Number of records per page.
cursorstringOpaque pagination token from previous page.cursor. Never construct manually.
fromISO datetimeInclusive start of date range on lastEditedOn/updatedAt.
toISO datetimeInclusive end of date range.
sortBystringAccepted: lastEditedOn, createdOn, updatedAt
sortDirstringAccepted: asc, desc
createdBystring (CSV)Filter by creator email. Accepts comma-separated values to match multiple creators (e.g., createdBy=user1@example.com,user2@example.com).
leadAgentstring (CSV)Filter by lead agent email. Accepts comma-separated values to match multiple agents (e.g., leadAgent=agent1@example.com,agent2@example.com).
assignedAgentstring (CSV)Filter by assigned agent email. Accepts comma-separated values to match multiple agents. Alias for leadAgent. Also accepts: agentAssigned.
statusstring (CSV)Filter by contact status. Accepts comma-separated values to match multiple statuses (e.g., status=new,active).
sourcestring (CSV)Filter by contact source. Accepts comma-separated values to match multiple sources (e.g., source=Imported Contact,Website). Example values: "Imported Contact".
tagsstring (CSV)Filter by contact tags. Accepts comma-separated values to match multiple tags. Possible values: "preLead", "prospect", "client". Alias: tag.
hasEmailbooleanOnly returns contacts with a non-empty email field.
hasPhonebooleanOnly returns contacts with a non-empty phone or phoneNumber field.
qstringSearch 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.
dataarrayArray of contact objects
contactIdstringUnique contact identifier
organisationIdstringOrganization identifier (also available as organizationId)
typestringContact type. Possible values: 'preLead', 'prospect', 'client'. Filterable via 'tags' query parameter
idstringAlternative contact identifier
displayIdstringHuman-readable display identifier
contactTitlestringContact title or salutation
firstNamestringFirst name. Searchable via 'q' query parameter
lastNamestringLast name
full namestringFull name. Searchable via 'q' query parameter
emailstringEmail address. Searchable via 'q' query parameter. Filterable via 'hasEmail' query parameter
phonestringPhone number. Searchable via 'q' query parameter. Filterable via 'hasPhone' query parameter
dateOfBirthISO datetimeDate of birth
currentAddressstringCurrent address
companystringCompany name
externalContactRolestringRole for external contacts
nationalitystringNationality
countryofResidencestringCountry of residence
statusstring or arrayContact status (e.g., 'Initial Consultation'). Filterable via 'status' query parameter
sourcestring or arrayContact source (e.g., 'Imported Contact', 'Website'). Filterable via 'source' query parameter
intentarrayArray of contact intents (e.g., ['Rent', 'Buy'])
tagsarrayArray of tags
notesstringNotes about the contact
isSpambooleanWhether contact is marked as spam
isColdbooleanWhether contact is cold
isArchivedbooleanWhether contact is archived
isResidentbooleanWhether contact is a resident
createdBystringEmail of user who created the contact. Filterable via 'createdBy' query parameter
addedBystringEmail of user who added the contact
leadAgentstringEmail of the lead agent. Filterable via 'leadAgent' or 'assignedAgent' query parameters
agentAssignedarrayArray of assigned agent UIDs. Filterable via 'assignedAgent' or 'agentAssigned' query parameters
assignedBystringEmail of user who assigned agents
convertedBystringEmail of user who converted the contact
accessstring or arrayEmails of users with access
accessLevelarrayArray of access level objects
emailstringEmail of user with access
levelstringAccess level (e.g., 'manage')
addedBystringEmail of user who granted access
typestringAccess type (e.g., 'leadAgent', 'agentAssigned')
addedOnISO datetimeWhen access was granted
sharedAccessLevelsarrayArray of shared access level objects
emailstringEmail of user with shared access
accessLevelstringAccess level (e.g., 'fullAccess')
addedOnISO datetimeWhen shared access was granted
createdOnISO datetimeWhen the contact was created. Sortable via 'sortBy=createdOn' query parameter
lastEditedOnISO datetimeWhen the contact was last edited. Sortable via 'sortBy=lastEditedOn' query parameter. Date range filterable via 'from' and 'to' query parameters
leadAgentAddedOnISO datetimeWhen the lead agent was assigned
assignedOnISO datetimeWhen agents were assigned
convertedOnISO datetimeWhen the contact was converted to a client
convertedToProspectOnISO datetimeWhen converted to prospect
importedOnISO datetimeWhen the contact was imported
emailValidatedOnISO datetimeWhen email was validated
lastInquiryAtISO datetimeLast inquiry timestamp
bedroomInterestarrayArray of bedroom preferences
propertyTypeInterestarrayArray of property type interests
propertyDetailsstringProperty details
locationsOfInterestarrayArray of locations of interest
locationstringLocation
subLocationsOfInterestarrayArray of sub-locations of interest
budgetobjectBudget information
minnumberMinimum budget
maxnumberMaximum budget
currencystringCurrency code
valuenumberBudget value
isRangebooleanWhether budget is a range
listingobjectAssociated listing information
referencestringListing reference
agentDetailsobjectAgent details
uidstringAgent user ID
namestringAgent name
emailstringAgent email
phonestringAgent phone
accessLevelstringAgent access level
convertedToProspectBystringEmail of user who converted to prospect
leadPoolCurrentTeamstringCurrent lead pool team
importedbooleanWhether contact was imported
inquiredOnMetaAdsarrayMeta ads inquired on
conversationSummarystringSummary of conversations
timelinestringTimeline information
additionalInfostringAdditional information
lastEditedBystringEmail of user who last edited
isEmailValidbooleanWhether email is valid
countintegerTotal matching contacts across all pages
pageobjectPagination info
limitintegerRecords per page
cursorstring or nullToken for next page. null when exhausted.
metaobjectApplied filters and sort info
fromstringISO datetime
tostringISO datetime
sortBystringField used for sorting (e.g., lastEditedOn, createdOn, updatedAt)
sortDirstringSort direction: 'asc' (ascending) or 'desc' (descending)
filtersobjectAll filters applied to this query (status, source, tags, etc.)
/api/v1/contacts/countCount Contacts
contacts:countReturns 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.
statusstring (CSV)Filter by contact status. Accepts comma-separated values to match multiple statuses (e.g., status=new,active).
sourcestring (CSV)Filter by contact source. Accepts comma-separated values to match multiple sources (e.g., source=Imported Contact,Website). Example values: "Imported Contact".
tagsstring (CSV)Filter by contact tags. Accepts comma-separated values to match multiple tags. Possible values: "preLead", "prospect", "client". Alias: tag.
hasEmailbooleanOnly returns contacts with a non-empty email field.
hasPhonebooleanOnly returns contacts with a non-empty phone or phoneNumber field.
createdBystring (CSV)Filter by creator email. Accepts comma-separated values to match multiple creators (e.g., createdBy=user1@example.com,user2@example.com).
leadAgentstring (CSV)Filter by lead agent email. Accepts comma-separated values to match multiple agents (e.g., leadAgent=agent1@example.com,agent2@example.com).
assignedAgentstring (CSV)Filter by assigned agent email. Accepts comma-separated values to match multiple agents. Alias for leadAgent. Also accepts: agentAssigned.
qstringSearch 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.
countintegerTotal number of matching contacts
metaobjectFilter echo
fromstringISO datetime
tostringISO datetime
filtersobjectAll filters applied to this query (status, source, tags, etc.)
Listings
Read-only access to property listing records. Backed by Elasticsearch index listings_v1.
/api/v1/listingsList Listings
listings:dataReturns a paginated list of property listings. Supports filtering by status, portal, property type, location, price range, and bedrooms.
limitintegerRange 1-200
cursorstringOpaque pagination token
fromISO datetimeInclusive, filters on updatedAt
toISO datetimeInclusive
sortBystringAccepted: updatedAt, createdAt
sortDirstringasc / desc
statusstring (CSV)Filter by listing status. Accepts comma-separated values to match multiple statuses. Possible values: "onMarket", "offTheMarket", "tempOffMarket".
portalstring (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).
propertyTypestring (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".
citystring (CSV)Filter by city. Accepts comma-separated values to match multiple cities (e.g., city=Dubai,Abu Dhabi). Searches across listing location fields.
locationstring (CSV)Filter by location. Accepts comma-separated values to match multiple locations (e.g., location=Downtown,Marina). Searches across listing location fields.
agentEmailstring (CSV)Filter by assigned agent email. Accepts comma-separated values to match multiple agents (e.g., agentEmail=agent1@example.com,agent2@example.com).
referenceIdstring (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.
bayutReferenceIdstring (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.
propertyFinderReferenceIdstring (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.
minPricenumberMinimum price filter. For rentals, filters by rent amount; for sales, filters by asking price.
maxPricenumberMaximum price filter. For rentals, filters by rent amount; for sales, filters by asking price.
minBedroomsnumberMinimum number of bedrooms.
maxBedroomsnumberMaximum number of bedrooms.
dataarrayArray of listing objects
listingIdstringUnique identifier for the listing (e.g., 'KT-1148'). Filterable via the 'referenceId' query parameter.
bayutReferenceIdstringBayut 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'.
propertyFinderReferenceIdstringProperty 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'.
organisationIdstringID of the organization that owns this listing
propertyIdstringExternal property identifier (if applicable)
categorystringProperty category (e.g., 'Residential', 'Commercial')
marketTypestringMarket type (e.g., 'Ready to Buy', 'Rent', 'Off-Plan')
visibilitystringVisibility setting for the listing
statestringCurrent state (e.g., 'published', 'draft')
statusstringProperty status (e.g., 'Primary Property (New)', 'Secondary Property (Resale)')
isUnderReviewbooleanWhether the listing is currently under review
createdAtISO datetimeWhen the listing was created. Sortable via 'sortBy=createdAt' query parameter
createdBystringEmail of the user who created the listing
lastSavedISO datetimeLast save timestamp
lastSavedBystringEmail of the user who last saved the listing
titlestringProperty title/headline
propertyTypestringType of property (e.g., 'Apartment / Flat', 'Villa / House', 'Whole Building'). Filterable via 'propertyType' query parameter
buildingstringBuilding name
unitNumberstringUnit/apartment number
towerNumberstringTower number (for multi-tower buildings)
floorNumberstringFloor number
streetAndLocalitystringStreet address and locality details
municipalityNumberstringMunicipality registration number
subLocalitystringSub-locality or neighborhood name
postalCodestringPostal/ZIP code
citystringCity name. Filterable via 'city' query parameter
provincestringProvince or state
countrystringCountry name or code
localitystringMain locality/area name. Filterable via 'location' query parameter
usagestringProperty usage type (e.g., 'Residential', 'Commercial')
latitudenumberGeographic latitude coordinate
longitudenumberGeographic longitude coordinate
geoPointLocationobjectGeographic point object
latnumberLatitude
lonnumberLongitude
propertyAreaobjectProperty area in sq ft
typestringArea type
valuenumberArea value
minnumberMinimum area
maxnumberMaximum area
carpetAreaobjectCarpet area in sq ft
typestringArea type
valuenumberArea value
minnumberMinimum area
maxnumberMaximum area
bedroomsobjectNumber of bedrooms. Filterable via 'minBedrooms' and 'maxBedrooms' query parameters
typestringBedroom type
valuenumberNumber of bedrooms
minnumberMinimum bedrooms
maxnumberMaximum bedrooms
bathsobjectNumber of bathrooms
typestringBathroom type
valuenumberNumber of bathrooms
minnumberMinimum bathrooms
maxnumberMaximum bathrooms
storiesobjectNumber of stories/floors
typestringStories type
valuenumberNumber of stories
minnumberMinimum stories
maxnumberMaximum stories
parkingSpacesobjectNumber of parking spaces
typestringParking type
valuenumberNumber of spaces
minnumberMinimum spaces
maxnumberMaximum spaces
stylestringArchitectural style (e.g., 'Mediterranean', 'Modern')
planTypestringFloor plan type
viewstringProperty view (e.g., 'Lake', 'City', 'Mountain')
propertyConditionstringCondition/furnishing status (e.g., 'Fully Furnished', 'Unfurnished')
descstringFull property description
keyFeaturesarrayArray of key features and highlights
imagesarrayArray of image objects
urlstringImage URL
herobooleanWhether this is the hero image
originalImagesarrayArray of original (unwatermarked) image objects
videosarrayArray of video URLs or objects
notesstringInternal notes about the property
additionalInfostringAdditional information or special notes
askingPriceobjectSale price. Filterable via 'minPrice' and 'maxPrice' query parameters
typestringPrice type
valuenumberPrice value
minnumberMinimum price
maxnumberMaximum price
priceOnApplicationbooleanWhether price is available on application only
annualServiceFeesobjectAnnual service/maintenance fees
pricenumberAlternative price field
rentAndFeesobjectRental information. Rent amount filterable via 'minPrice' and 'maxPrice' query parameters
visiblebooleanWhether rent info is visible
frequencystringRent payment frequency (e.g., 'Yearly', 'Monthly')
rentAmountnumberRent amount
leaseTermstringLease term duration
chequesnumberNumber of cheques
securityDepositnumberSecurity deposit amount
applicationFeesnumberApplication fees
openHouseobjectOpen house information
viewingAvailabilitystringViewing availability details
propertyAvailableFromISO datetimeWhen property becomes available
propertyAvailableFromOffPlanISO datetimeAvailability date for off-plan properties
projectDetailsobjectProject information
projectNamestringDevelopment project name
developerNamestringDeveloper name
propertyAvailableFromISO datetimeProject availability date
projectTimelinestringProject timeline and milestones
paymentPlanobjectPayment plan details
visiblebooleanWhether payment plan is visible
stagesarrayPayment stages
exclusivitybooleanWhether listing has exclusivity agreement
exclusivityStartDateISO datetimeExclusivity period start date
exclusivityEndDateISO datetimeExclusivity period end date
occupancyStatusstringCurrent occupancy status
portalsobjectPortal publication status. Filterable via 'portal' query parameter
bayutbooleanPublished on Bayut
dubizzlebooleanPublished on Dubizzle
propertyFinderbooleanPublished on Property Finder
externalWebsitebooleanPublished on external website
pfListingIdstringProperty Finder listing ID
pfStateobjectProperty Finder sync state
stagestringSync stage
typestringSync type
reasonsarraySync reasons or errors
bayutCitystringBayut-specific city field
bayutLocalitystringBayut-specific locality field
bayutSubLocalitystringBayut-specific sub-locality field
bayutBuildingstringBayut-specific building field
assignedAgentobjectPrimary assigned agent. Filterable via 'agentEmail' query parameter
namestringAgent full name
emailstringAgent email address
phoneNumberstringAgent phone number
photostringAgent profile photo URL
licenseNumberstringAgent license number
rolestringAgent role (e.g., 'Admin', 'Agent')
portalAgentsobjectPortal-specific agent assignments
bayutobjectBayut agent details
dubizzleobjectDubizzle agent details
propertyFinderobjectProperty Finder agent details
externalWebsiteobjectExternal website agent details
ownerContactIdsarrayArray of owner contact IDs
previousOwnerContactIdsarrayArray of previous owner contact IDs
regulatoryInfoobjectRegulatory and compliance information
dldNumberstringDubai Land Department permit number
permitExpirationDateISO datetimePermit expiration date
contractExpirationDateISO datetimeContract expiration date
contractNumberstringContract reference number
listingStatusstringCurrent listing status (e.g., 'onMarket', 'offMarket'). Filterable via 'status' query parameter
statusReasonstringReason for current status
neighbourhoodobjectNeighborhood information
visiblebooleanWhether neighborhood info is visible
descstringNeighborhood description
imagesarrayArray of neighborhood images
amenitiesobjectAmenities
visiblebooleanWhether amenities are visible
amenitiesarrayArray of amenity names (e.g., 'Covered Parking', 'Swimming Pool', 'Gym')
spotlight_listingbooleanWhether this is a featured/spotlight listing
duplicatedFromstringReference to original listing if this is a duplicate
countintegerTotal matching listings
pageobjectPagination
limitintegerNo description provided.
cursorstring or nullNo description provided.
metaobjectFilter/sort echo
/api/v1/listings/countCount Listings
listings:countReturns only the total count and filter metadata. Ideal for dashboards showing portfolio size or inventory analytics without fetching full records.
statusstring (CSV)Filter by listing status. Accepts comma-separated values to match multiple statuses. Possible values: "onMarket", "offTheMarket", "tempOffMarket".
portalstring (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).
propertyTypestring (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".
citystring (CSV)Filter by city. Accepts comma-separated values to match multiple cities (e.g., city=Dubai,Abu Dhabi). Searches across listing location fields.
locationstring (CSV)Filter by location. Accepts comma-separated values to match multiple locations (e.g., location=Downtown,Marina). Searches across listing location fields.
agentEmailstring (CSV)Filter by assigned agent email. Accepts comma-separated values to match multiple agents (e.g., agentEmail=agent1@example.com,agent2@example.com).
referenceIdstring (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.
bayutReferenceIdstring (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.
propertyFinderReferenceIdstring (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.
minPricenumberMinimum price filter. For rentals, filters by rent amount; for sales, filters by asking price.
maxPricenumberMaximum price filter. For rentals, filters by rent amount; for sales, filters by asking price.
minBedroomsnumberMinimum number of bedrooms.
maxBedroomsnumberMaximum number of bedrooms.
countintegerTotal matching listings
metaobjectFilter 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.
/api/v1/inquiriesList Inquiries
inquiries:dataReturns 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.
limitintegerRange 1-200. Number of records per page.
cursorstringOpaque pagination token from previous response's page.cursor. Never construct manually.
fromISO datetimeInclusive start of createdAt range.
toISO datetimeInclusive end of createdAt range.
sortBystringCurrently only 'createdAt' is supported.
sortDirstringAccepted: asc, desc
sourcestring (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.
listingIdstring (CSV)Filter by listing identifier. Accepts comma-separated values.
inquiryTypestring (CSV)Filter by inquiry type. Accepted values: 'whatsapp', 'property_inquiry', 'agent_inquiry', 'project_inquiry', 'landingPage', 'Buy', 'meta'. Accepts comma-separated values.
assignedAgentstring (CSV)Filter by assigned agent email. Accepts comma-separated values.
dataarrayArray of inquiry objects
idstringUnique inquiry identifier
orgIdstringOrganization ID
typestringInquiry type. Possible values: 'whatsapp', 'property_inquiry', 'agent_inquiry', 'project_inquiry', 'landingPage', 'Buy', 'meta'
sourcestringInquiry source. Possible values: 'WhatsApp', 'Property Finder', 'Bayut', 'Dubizzle', 'Website', 'Landing Page', 'Meta' and other valid contact sources
leadTypestringLead type. Possible values: 'whatsapp', 'email', 'call', 'leadApi', 'landingPage', 'meta', etc.
contactIdstringAssociated contact ID
listingIdstringAssociated listing ID (optional)
agentIdstringEmail of assigned agent
messagestringInquiry message content (optional)
createdAtstringWhen the inquiry was created (ISO 8601)
updatedAtstringWhen the inquiry was last updated (ISO 8601, optional)
createdBystringEmail of user who created the inquiry
updatedBystringEmail of user who last updated the inquiry
inquiryReceivedAtstringWhen the inquiry was received (ISO 8601, optional)
isClosedbooleanWhether inquiry is closed
closedAtstringWhen the inquiry was closed (ISO 8601, optional)
closedBystringEmail of user who closed the inquiry (optional)
respondedbooleanWhether inquiry has been responded to
respondedAtstringWhen the inquiry was responded to (ISO 8601, optional)
respondedBystringEmail of user who responded (optional)
respondedMessagestringResponse message text (optional)
scheduledViewingStatusbooleanWhether a viewing has been scheduled
contactLinkstringContact link URL (optional)
pfLeadIdstringProperty Finder lead ID (optional)
pfChannelstringCommunication channel. Possible values: 'whatsapp', 'email', 'call' (optional)
pfStatusstringLead status. Possible values: 'sent', 'read' (optional)
pfEntityTypestringEntity type. Possible values: 'listing', 'agent', 'project' (optional)
pfResponseLinkstringResponse link URL (optional)
pfPublicProfileIdstring or numberPublic profile ID (optional)
pfListingIdstringProperty Finder listing ID (optional)
pfProjectIdstringProperty Finder project ID (optional)
pfDeveloperIdstringProperty Finder developer ID (optional)
pfEntityIdstringEntity ID (optional)
pfEnrichmentDataobjectAdditional enrichment data (optional)
pfProjectDataobjectProject details (optional)
developerobjectDeveloper information
dldIdstringDLD ID
idstringProject ID
locationobjectProject location
startingPricestringStarting price
titleobjectLocalized project title
landingPageNamestringLanding page name (optional)
externalSiteDataobjectExternal site data (optional)
intentarray of stringsUser intent (e.g., ['Buy'], ['Rent'])
metaAdNamestringMeta ad campaign name (optional)
metaFormContentobjectForm submission data with custom fields (optional)
countintegerTotal matching inquiries across all pages
pageobjectPagination info
limitintegerRecords per page
cursorstring or nullToken for next page. null when no further pages exist
metaobjectApplied filters and sort info
fromstringStart date of the query range (ISO 8601)
tostringEnd date of the query range (ISO 8601)
sortBystringField used for sorting (always 'createdAt')
sortDirstringSort direction (asc or desc)
filtersobjectApplied filters
/api/v1/inquiries/countCount Inquiries
inquiries:countReturns only the total count and metadata for filtered inquiries. Note: Only one multi-value (CSV) filter is allowed per request.
fromISO datetimeInclusive start of createdAt range.
toISO datetimeInclusive end of createdAt range.
sourcestring (CSV)Filter by inquiry source. Accepted values: 'WhatsApp', 'Property Finder', 'Bayut', 'Dubizzle', 'Website', 'Landing Page', 'Meta' and other valid contact sources.
listingIdstring (CSV)Filter by listing identifier.
inquiryTypestring (CSV)Filter by inquiry type. Accepted values: 'whatsapp', 'property_inquiry', 'agent_inquiry', 'project_inquiry', 'landingPage', 'meta'.
assignedAgentstring (CSV)Filter by assigned agent email.
countintegerTotal matching inquiries
metaobjectFilter and range echo
fromstringStart date of the query range (ISO 8601)
tostringEnd date of the query range (ISO 8601)
filtersobjectAll filters applied to this query
Deals
Read-only access to deal records. Default sort is by last updated date (descending).
/api/v1/dealsList Deals
deals:dataReturns 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.
limitintegerRange 1-200. Number of records per page.
cursorstringOpaque pagination token from previous response's page.cursor. Never construct manually.
fromISO datetimeInclusive start of date range for filtering by last updated date.
toISO datetimeInclusive end of date range for filtering by last updated date.
sortBystringSort field. Currently only 'updatedAt' is supported.
sortDirstringAccepted: asc, desc
stagestring (CSV)Filter by current stage name (e.g., 'Under Offer', 'Closed'). Accepts comma-separated values.
pipelinestring (CSV)Filter by pipeline name (e.g., 'Rental', 'Secondary'). Accepts comma-separated values.
statusstring (CSV)Filter by deal lifecycle status. Accepted values: 'isTerminated' (or 'terminated'), 'isPaused' (or 'paused'), 'isCompleted' (or 'completed'), 'isActive' (or 'active').
assignedAgentstring (CSV)Filter by assigned agent email. Accepts comma-separated values for multiple agents.
displayIdstring (CSV)Filter by display ID (e.g., 'KT-D-114'). Accepts comma-separated values.
contactIdstring (CSV)Filter by contact identifier. Accepts comma-separated values.
listingIdstring (CSV)Filter by listing identifier. Accepts comma-separated values.
minDealValuenumberMinimum deal value filter. Alias: minValue. Uses finalPrice, offerPrice, or askingPrice (in that order).
maxDealValuenumberMaximum deal value filter. Alias: maxValue. Uses finalPrice, offerPrice, or askingPrice (in that order).
createdAtFromISO datetimeInclusive lower bound on deal creation date.
createdAtToISO datetimeInclusive upper bound on deal creation date.
updatedAtFromISO datetimeInclusive lower bound on deal update date. Overrides the default 'from' parameter when supplied.
updatedAtToISO datetimeInclusive upper bound on deal update date. Overrides the default 'to' parameter when supplied.
closeDateFromISO datetimeInclusive lower bound on deal close date.
closeDateToISO datetimeInclusive upper bound on deal close date.
dataarrayArray of deal objects
idstringUnique deal identifier
displayIdstringHuman-readable deal ID (e.g., 'KT-D-114')
organisationIdstringOrganisation ID this deal belongs to
titlestringDeal title/description
pipelinestringPipeline name (e.g., 'Rental', 'Secondary'). Filterable via 'pipeline' query parameter
completedPipelineStagesarrayArray of completed stages
positionnumberStage position in pipeline (0-indexed)
stagestringStage name (e.g., 'Under Offer', 'Closed')
completedOnstringISO 8601 timestamp when stage was completed
approvalStagesStatusarrayStages requiring approval
stageIdstringApproval stage identifier
approversStatusarrayPer-approver state for this stage
checklistStatusarrayChecklist items required before approval
approvalNotesstringOptional approval notes
stageStatusstringOne of: 'unsent', 'pending', 'approved', 'rejected'
approvalRequestedOnISO datetimeWhen approval was requested
approvalRequestedBystringUser who requested approval
approvalApprovedOnISO datetimeWhen approval was granted
approvalApprovedBystringUser who approved
approvalRejectedOnISO datetimeWhen approval was rejected
approvalRejectedBystringUser who rejected
statusstringDeal status. Filterable via 'status' query parameter
isTerminatedbooleanWhether the deal has been terminated. Filterable via 'status=isTerminated'
terminationReasonstringReason provided when the deal was terminated
terminatedOnISO datetimeWhen the deal was terminated
terminatedBystringEmail of user who terminated the deal
isPausedbooleanWhether the deal is currently paused. Filterable via 'status=isPaused'
pauseReasonstringReason provided when the deal was paused
lastPausedOnISO datetimeTimestamp of the most recent pause
lastPausedBystringEmail of user who last paused the deal
lastRestoredOnISO datetimeTimestamp of the most recent un-pause
lastRestoredBystringEmail of user who last restored the deal
firstPartyIntentstringFirst party role (e.g., 'Tenant', 'Landlord', 'Buyer', 'Seller')
secondPartyIntentstringSecond party role
agentstringPrimary agent email. Filterable via 'assignedAgent' query parameter
agentsarrayArray of agent emails involved in the deal. Filterable via 'assignedAgent' query parameter
firstPartyAgentsarrayAgents representing first party
emailstringAgent email
mainAgentbooleanWhether this is the main agent
commissionRatenumberCommission percentage
secondPartyAgentsarrayAgents representing second party
typestringAgent type (e.g., 'contact')
contactIdstringContact ID if agent is a contact
mainAgentbooleanWhether this is the main agent
commissionRatenumberCommission percentage
firstPartyClientsarrayClients on the first party side. Filterable via 'contactId' query parameter
contactIdstringAssociated contact ID
mainClientbooleanWhether this is the main client on the first party side
secondPartyClientsarrayClients on the second party side. Filterable via 'contactId' query parameter
contactIdstringAssociated contact ID
mainClientbooleanWhether this is the main client on the second party side
associatedListingstringListing ID this deal is for (e.g., 'KT-1262'). Filterable via 'listingId' query parameter
listingOwnerProcessedbooleanWhether listing owner has processed the deal
rentAmountnumber | nullRent amount (for rental deals)
rentFrequencystring | nullRent frequency ('Yearly', 'Monthly', 'Daily', etc.)
offerPricenumber | nullOffer price
askingPricenumber | nullAsking price
finalPricenumber | nullFinal agreed price
securityDepositnumber | nullSecurity deposit amount
monthlyServicenumber | nullMonthly service charge
applicationFeesnumber | nullApplication fees
maxChequesnumber | nullMaximum number of cheques allowed
leaseTermnumber | nullLease term in months
additionalInfostringAdditional notes/information
termsstring | nullDeal terms
solicitorIdstring | nullSolicitor ID
mortgageBrokerIdstring | nullMortgage broker ID
createdOnISO datetimeWhen the deal was created. Filterable via 'createdAtFrom' / 'createdAtTo' query parameters
lastUpdatedISO datetimeWhen the deal was last updated. Default sort field (sortBy=updatedAt). Filterable via 'from'/'to' or 'updatedAtFrom'/'updatedAtTo' query parameters
countintegerTotal matching deals across all pages
pageobjectPagination info
limitintegerRecords per page
cursorstring or nullToken for next page. null when no further pages exist
metaobjectApplied filters and sort info
fromstringISO datetime lower bound for last updated date
tostringISO datetime upper bound for last updated date
sortBystringField used for sorting (currently only 'updatedAt')
sortDirstringSort direction: 'asc' or 'desc'
filtersobjectAll filters applied to this query
/api/v1/deals/countCount Deals
deals:countReturns only the total count and applied filter metadata for deals. Useful for dashboards and portfolio metrics without fetching full records — cheaper on rate limits.
fromISO datetimeInclusive lower bound on last updated date.
toISO datetimeInclusive upper bound on last updated date.
stagestring (CSV)Filter by current stage name (e.g., 'Under Offer', 'Closed'). Accepts comma-separated values.
pipelinestring (CSV)Filter by pipeline name (e.g., 'Rental', 'Secondary'). Accepts comma-separated values.
statusstring (CSV)Filter by deal lifecycle status. Accepted: 'isTerminated', 'isPaused', 'isCompleted', 'isActive' (aliases without the 'is' prefix are also accepted).
assignedAgentstring (CSV)Filter by agent email.
displayIdstring (CSV)Filter by display ID (e.g., 'KT-D-114'). Accepts comma-separated values.
contactIdstring (CSV)Filter by contact identifier
listingIdstring (CSV)Filter by listing identifier
minDealValuenumberAlias: minValue. Minimum deal value. Uses finalPrice, offerPrice, or askingPrice (in that order).
maxDealValuenumberAlias: maxValue. Maximum deal value. Uses finalPrice, offerPrice, or askingPrice (in that order).
createdAtFromISO datetimeInclusive lower bound on deal creation date.
createdAtToISO datetimeInclusive upper bound on deal creation date.
updatedAtFromISO datetimeInclusive lower bound on deal update date (overrides 'from' when provided).
updatedAtToISO datetimeInclusive upper bound on deal update date (overrides 'to' when provided).
closeDateFromISO datetimeInclusive lower bound on deal close date.
closeDateToISO datetimeInclusive upper bound on deal close date.
countintegerTotal matching deals
metaobjectFilter and range echo
fromstringISO datetime lower bound for last updated date
tostringISO datetime upper bound for last updated date
filtersobjectAll 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.
/api/v1/appointmentsList Appointments
appointments:dataReturns a paginated list of appointments. Supports filtering by creator, associated contacts/deals/listings, appointment type (e.g., "propertyViewing", "followUp"), status, and time ranges.
limitintegerRange 1-200. Number of records per page.
cursorstringOpaque pagination token from previous response's page.cursor. Never construct manually.
fromISO datetimeInclusive start of startTime range.
toISO datetimeInclusive end of startTime range.
sortBystringCurrently only 'startTime' is supported.
sortDirstringAccepted: asc, desc
createdBystring (CSV)Filter by creator email. Accepts comma-separated values.
contactIdstring (CSV)Filter by contact identifier. Accepts comma-separated values.
dealIdstring (CSV)Filter by deal identifier. Accepts comma-separated values.
listingIdstring (CSV)Filter by listing identifier. Accepts comma-separated values.
statusstring (CSV)Filter by appointment status string.
appointmentTypestring (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'.
endTimeFromISO datetimeInclusive lower bound on endTime.
endTimeToISO datetimeInclusive upper bound on endTime.
dataarrayArray of appointment objects
idstringUnique appointment identifier
titlestringAppointment title
descriptionstringAppointment description (optional)
startTimestringAppointment start time (ISO 8601)
endTimestringAppointment end time (ISO 8601)
appointmentTypestringType of appointment
assignedTeamMembersarray of stringsEmail addresses of assigned team members
assignedContactsarray of stringsContact IDs assigned to the appointment
listingIdsarray of stringsAssociated listing IDs
dealIdsarray of stringsAssociated deal IDs
conferencingLinkstringVideo conferencing link (optional)
referenceDocumentstringReference document URL (optional)
integrationsobjectIntegration details (optional)
contactInvitesobjectContact invite integration (optional)
googleCalendarobjectGoogle Calendar integration (optional)
createdAtstringTimestamp when appointment was created (ISO 8601)
createdBystringEmail of user who created the appointment
lastUpdatedAtstringTimestamp of last update (ISO 8601)
lastUpdatedBystringEmail of user who last updated the appointment
countintegerTotal matching appointments across all pages
pageobjectPagination info
limitintegerRecords per page
cursorstring or nullToken for next page. null when no further pages exist
metaobjectApplied filters and sort info
fromstringStart date of the query range (ISO 8601)
tostringEnd date of the query range (ISO 8601)
sortBystringField used for sorting (always 'startTime')
sortDirstringSort direction (asc or desc)
filtersobjectApplied filters
/api/v1/appointments/countCount Appointments
appointments:countReturns only the total count and filter metadata for appointments without fetching full records. Useful for dashboards and calendar analytics.
fromISO datetimeInclusive start of startTime range.
toISO datetimeInclusive end of startTime range.
createdBystring (CSV)Filter by creator email.
contactIdstring (CSV)Filter by contact identifier.
dealIdstring (CSV)Filter by deal identifier.
listingIdstring (CSV)Filter by listing identifier.
statusstring (CSV)Filter by appointment status.
appointmentTypestring (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'.
endTimeFromISO datetimeInclusive lower bound on endTime.
endTimeToISO datetimeInclusive upper bound on endTime.
countintegerTotal matching appointments
metaobjectFilter and range echo
fromstringStart date of the query range (ISO 8601)
tostringEnd date of the query range (ISO 8601)
filtersobjectApplied filters