REST endpoints for settings in ServFlo: 12 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.
Where customers hear about the business (Google, referral …), active and hidden, with customer counts. Read by anyone who can read customers, since customers point at them. Read-only.
The extra fields the business defined (key, label, type, options, required, visibleToCustomer, sensitive) for customers, properties, equipment, jobs, visits, quotes, invoices or technicians; archived ones with includeArchived. For equipment, equipmentTypeId gives the fields for every type plus that type's own (what a piece of that type carries); allEquipmentTypes lists every type's. Needed to read and write customFields on those records. Values of sensitive fields read as •••• without customFields.sensitive.read (POST /custom-fields/reveal for one). Read-only.
The record type: CUSTOMER, PROPERTY, EQUIPMENT (all types or one, equipmentTypeId), JOB, VISIT, QUOTE, INVOICE or TECHNICIAN. One of CUSTOMER, PROPERTY, EQUIPMENT, JOB, VISIT, QUOTE, INVOICE, TECHNICIAN.
includeArchived
query
boolean
No
equipmentTypeId
query
string
No
Equipment: the fields for every type plus this type's own.
POST /organizations/{organizationId}/custom-fields
Defines a custom field on customers, properties, equipment (every type, or one with equipmentTypeId), jobs, visits, quotes, invoices or technicians. Its key is derived from the label once and never changes; SELECT and MULTI_SELECT need options. visibleToCustomer prints it on quote and invoice documents and their emails and shows it in the customer portal (customer-visible); sensitive (gate, alarm or lockbox codes, medical notes) masks its values for anyone without customFields.sensitive.read and can't be combined with visibleToCustomer. A new field has no values yet, so both flags may be set here; change them later with POST /custom-fields/{fieldId}/flags. Returns the definition.
Permission
settings.manage (Owner, Admin)
Risk
write, OAuth scope servflo.write. Write: creates or changes records inside the business; nothing leaves it.
The record type: CUSTOMER, PROPERTY, EQUIPMENT (all types or one, equipmentTypeId), JOB, VISIT, QUOTE, INVOICE or TECHNICIAN. One of CUSTOMER, PROPERTY, EQUIPMENT, JOB, VISIT, QUOTE, INVOICE, TECHNICIAN.
label
string
Yes
Up to 200 characters.
type
enum
Yes
One of TEXT, TEXTAREA, NUMBER, DATE, CHECKBOX, SELECT, MULTI_SELECT, URL, EMAIL, PHONE.
options
array of string
No
Up to 200 items.
required
boolean
No
sortOrder
integer
No
equipmentTypeId
string or null
No
EQUIPMENT only: the type the field belongs to; unset = every type.
visibleToCustomer
boolean
No
Show it to the customer (documents, emails, portal). Default false.
sensitive
boolean
No
Sensitive (gate codes, medical notes): values masked as •••• for callers without customFields.sensitive.read. Default false.
Changes label, options, required or order, or archives it. The type and the equipment type cannot change. Archived fields keep their saved values but leave forms. Whether customers see it or it is sensitive: POST /custom-fields/{fieldId}/flags.
Permission
settings.manage (Owner, Admin)
Risk
write, OAuth scope servflo.write. Write: creates or changes records inside the business; nothing leaves it.
POST /organizations/{organizationId}/custom-fields/{fieldId}/flags
EXPOSES TO CUSTOMERS / CHANGES WHO SEES IT: visibleToCustomer: true prints the field's saved values on quotes and invoices, their emails and the customer portal; sensitive: true masks its values (••••) for everyone without customFields.sensitive.read, false shows them to every role that reads the record. A field can't be both (400). Returns the definition.
Permission
settings.manage (Owner, Admin)
Risk
sensitive, OAuth scope servflo.sensitive. Sensitive: moves money, deletes, sends or shows something to a customer, or grants or revokes access.
MCP tool
customFields_setFlags (toolset settings)
Approval
Over MCP, this tool asks for your OK first (in the AI app when it supports it, otherwise in ServFlo). See Approvals.
POST /organizations/{organizationId}/custom-fields/reveal
Exposes a secret: one sensitive value (a gate or lockbox code, a medical note) of one record, which other answers show as ••••. Recorded in the activity log. Technicians: only the customers, properties, equipment, jobs and visits of their own jobs (404 otherwise). Get the field's key from GET /custom-fields.
The record type: CUSTOMER, PROPERTY, EQUIPMENT (all types or one, equipmentTypeId), JOB, VISIT, QUOTE, INVOICE or TECHNICIAN. One of CUSTOMER, PROPERTY, EQUIPMENT, JOB, VISIT, QUOTE, INVOICE, TECHNICIAN.
recordId
string
Yes
The customer, property, equipment, job, visit, quote, invoice or technician id.
The job sign-off statement, the quote terms and the membership agreement: the business's wording (null = ServFlo's default), the defaults, and the resolved text customers see ({business} replaced by the business's name). Read-only.
Changes what customers agree to: sets the job sign-off statement, the quote terms and/or the membership agreement (up to 5000 characters each; {business} is replaced by the business's name). Null or empty restores the default. Signatures already given keep the text they were shown.
Permission
settings.manage (Owner, Admin)
Risk
sensitive, OAuth scope servflo.sensitive. Sensitive: moves money, deletes, sends or shows something to a customer, or grants or revokes access.
MCP tool
signingTerms_update (toolset settings)
Approval
Over MCP, this tool asks for your OK first (in the AI app when it supports it, otherwise in ServFlo). See Approvals.