REST endpoints for properties in ServFlo: 9 operations with parameters, request and response fields, permissions and curl examples.
Base URL: https://app.servflo.ai/api. Every call needs Authorization: Bearer sfk_… (Authentication); {organizationId} ($ORGANIZATION_ID in the examples) is your business's id.
Properties (service addresses) with their current occupants, filtered by text, type, tag, or customerId (that customer's current properties); paged with a total. A technician sees only properties where they have a job. Read-only.
One of RESIDENTIAL, COMMERCIAL, MULTI_FAMILY, INDUSTRIAL.
items[].contactName
string or null
Who to ask for on site.
items[].contactPhone
string or null
items[].contactEmail
string or null
items[].timezone
string
IANA timezone of the property.
items[].accessInstructions
string or null
items[].safetyNotes
string or null
items[].gateCode
string or null
items[].petsOnSite
boolean
items[].petNotes
string or null
items[].yearBuilt
integer or null
items[].squareFeet
integer or null
items[].tags
array of string
items[].latitude
number or null
items[].longitude
number or null
items[].geocodeSource
string or null
Where the coordinates came from: GEOCODER (the address), GEOCODER_STREET / GEOCODER_AREA (approximate: only its street or town is on the map; visit safety then searches the ZIP), MANUAL (pinned by hand).
items[].geocodedAt
string (date-time) or null
items[].taxRate
number or null
Tax rate in percent for work here; null = the business default.
items[].customFields
any
Custom field values by key (definitions: GET /custom-fields).
items[].createdAt
string (date-time)
items[].updatedAt
string (date-time)
items[].occupancies
array of object
Current occupants, primary first.
items[].occupancies[].id
string
Occupancy id (for PATCH …/occupancies/{occupancyId}).
Creates a property (service address). With customerId it is linked to that customer from startedOn or today (default role OWNER, primary). Returns the property.
Permission
properties.write (Owner, Admin, Dispatcher)
Risk
write, OAuth scope servflo.write. Write: creates or changes records inside the business; nothing leaves it.
MCP tool
properties_create (toolset customers, in the default set)
One of RESIDENTIAL, COMMERCIAL, MULTI_FAMILY, INDUSTRIAL.
contactName
string or null
Who to ask for on site.
contactPhone
string or null
contactEmail
string or null
timezone
string
IANA timezone of the property.
accessInstructions
string or null
safetyNotes
string or null
gateCode
string or null
petsOnSite
boolean
petNotes
string or null
yearBuilt
integer or null
squareFeet
integer or null
tags
array of string
latitude
number or null
longitude
number or null
geocodeSource
string or null
Where the coordinates came from: GEOCODER (the address), GEOCODER_STREET / GEOCODER_AREA (approximate: only its street or town is on the map; visit safety then searches the ZIP), MANUAL (pinned by hand).
geocodedAt
string (date-time) or null
taxRate
number or null
Tax rate in percent for work here; null = the business default.
customFields
any
Custom field values by key (definitions: GET /custom-fields).
GET /organizations/{organizationId}/properties/{propertyId}
One property with every occupancy (owner, tenant … with dates), its equipment count and custom fields. A technician gets 404 unless they have a job there. Read-only.
One of RESIDENTIAL, COMMERCIAL, MULTI_FAMILY, INDUSTRIAL.
contactName
string or null
Who to ask for on site.
contactPhone
string or null
contactEmail
string or null
timezone
string
IANA timezone of the property.
accessInstructions
string or null
safetyNotes
string or null
gateCode
string or null
petsOnSite
boolean
petNotes
string or null
yearBuilt
integer or null
squareFeet
integer or null
tags
array of string
latitude
number or null
longitude
number or null
geocodeSource
string or null
Where the coordinates came from: GEOCODER (the address), GEOCODER_STREET / GEOCODER_AREA (approximate: only its street or town is on the map; visit safety then searches the ZIP), MANUAL (pinned by hand).
geocodedAt
string (date-time) or null
taxRate
number or null
Tax rate in percent for work here; null = the business default.
customFields
any
Custom field values by key (definitions: GET /custom-fields).
createdAt
string (date-time)
updatedAt
string (date-time)
occupancies
array of object
Every occupancy, current ones first (endedOn null), then past ones.
occupancies[].id
string
Occupancy id (for PATCH …/occupancies/{occupancyId}).
One of RESIDENTIAL, COMMERCIAL, MULTI_FAMILY, INDUSTRIAL.
contactName
string or null
Who to ask for on site.
contactPhone
string or null
contactEmail
string or null
timezone
string
IANA timezone of the property.
accessInstructions
string or null
safetyNotes
string or null
gateCode
string or null
petsOnSite
boolean
petNotes
string or null
yearBuilt
integer or null
squareFeet
integer or null
tags
array of string
latitude
number or null
longitude
number or null
geocodeSource
string or null
Where the coordinates came from: GEOCODER (the address), GEOCODER_STREET / GEOCODER_AREA (approximate: only its street or town is on the map; visit safety then searches the ZIP), MANUAL (pinned by hand).
geocodedAt
string (date-time) or null
taxRate
number or null
Tax rate in percent for work here; null = the business default.
customFields
any
Custom field values by key (definitions: GET /custom-fields).
POST /organizations/{organizationId}/properties/{propertyId}/occupancies
Links a customer to the property as owner, tenant, landlord or property manager from a date. A new primary demotes the current one. Returns the occupancy.
Permission
properties.write (Owner, Admin, Dispatcher)
Risk
write, OAuth scope servflo.write. Write: creates or changes records inside the business; nothing leaves it.
POST /organizations/{organizationId}/properties/{propertyId}/transfer
For a sale or move: ends every current link on onDate (default today) and makes toCustomerId the primary occupant. Equipment and history stay with the property. Returns the new occupancy.
Permission
properties.write (Owner, Admin, Dispatcher)
Risk
write, OAuth scope servflo.write. Write: creates or changes records inside the business; nothing leaves it.
POST /organizations/{organizationId}/properties/{propertyId}/geocode
Looks the property's address up again now with the configured geocoder (SERVFLO_GEOCODER: OpenStreetMap Nominatim, a self-hosted server or the test fake; answers are cached by address) and stores the coordinates, replacing a hand-placed pin. found: false keeps the old coordinates (nothing found, or geocoding is off). Waits for the answer (Nominatim allows one request a second).
Permission
properties.write (Owner, Admin, Dispatcher)
Risk
write, OAuth scope servflo.write. Write: creates or changes records inside the business; nothing leaves it.