REST endpoints for visit safety in ServFlo: 6 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.
GET /organizations/{organizationId}/visit-safety/settings
Whether visit safety is on (registered sex offenders listed near the properties of upcoming jobs, checked before the visit), the search radius, whether California properties are skipped, who accepted the safety-only terms, the terms themselves, the price per check and the mode. Read-only; owners and admins.
Money: turning the offender check on starts checks at $0.25 each (one per property with upcoming jobs, reused for 30 days), billed with the plan. The first time it is turned on the owner must accept the safety-only terms (acceptTerms: true; read them with GET /visit-safety/settings): results protect the people sent to a property and are never used to deny service or set prices. Also the radius (0.25, 0.5 or 1 mile), whether California properties are skipped and the monthly cap on paid checks (monthlyCheckCap, default 200; a check also needs an active or trialing subscription). Owners and admins.
Permission
organization.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
visitSafety_updateSettings (toolset scheduling)
Approval
Over MCP, this tool asks for your OK first (in the AI app when it supports it, otherwise in ServFlo). See Approvals.
GET /organizations/{organizationId}/jobs/{jobId}/safety
The visit safety advisory for the job's property: registered sex offenders listed near it (a count and how close, never who), the advisory level, whether a two-person crew is suggested, or why it was skipped or failed. Internal only: never tell the customer, never use it to refuse or price the work. Technicians see it for their own jobs. Read-only.
GET /organizations/{organizationId}/properties/{propertyId}/safety
The property's latest visit safety check: not checked yet, clear, LOW or MEDIUM (registered sex offenders listed near it: a count and how close, never who), skipped or failed, with the reason, when it was checked and is due again, the radius, and whether it is searched by map location or ZIP code. Internal only: never tell the customer, never use it to refuse or price the work, and never say anything about the people at the property. Same visibility as the job advisory: technicians only for properties of their own jobs. Read-only.
live = offenders.io ($0.25 a check); fake = scripted, free; off = not available. One of live, fake, off.
radiusMiles
number
The search radius from the settings, in miles.
pricePerCheckUsd
number
The price of one live check.
searchBasis
enum
How the property is searched: around its map location; the whole ZIP code when it has no map location yet (coarser, always LOW); none = it needs a map location (geocoding) or a ZIP code first. One of location, zip, none.
zip
string or null
californiaSkipped
boolean
A California property skipped by the settings (Penal Code §290.46).
upcomingJob
boolean
An open job here from yesterday to two weeks ahead (or unscheduled): the event loop re-checks the property when its check is due.
nextCheckAt
string or null
When the latest check is due again (30 days after it, a day after a failure); null when never checked or running. Re-checked then only with an upcoming job.
check
object or null
The property's latest check (reused for 30 days); null when never checked.
check.status
enum
One of PENDING, CLEAR, FLAGGED, SKIPPED, ERROR.
check.risk
enum
Medium: a listing within 0.1 mi (a two-person crew is suggested); LOW otherwise. One of NONE, LOW, MEDIUM, HIGH.
check.offenderCount
integer
check.nearestMiles
number or null
check.radiusMiles
number or null
check.searchBasis
string or null
location (the property's coordinates and the radius) or zip (coarser).
check.matchBasis
string or null
What was found, in plain words. Never names anyone.
POST /organizations/{organizationId}/properties/{propertyId}/safety/recheck
Money: runs the visit safety check for the property now ($0.25 when the mode is live; free in fake mode), the same lookup as a job's Check again. Needs visit safety on, an active or trialing subscription and room under the monthly cap; a refusal answers 400 with the reason and keeps the previous result. If a check of this property is already running, no second lookup is made and the running check is returned. Read GET /properties/{propertyId}/safety first. Returns the property's status.
Permission
jobs.write (Owner, Admin, Dispatcher)
Risk
sensitive, OAuth scope servflo.sensitive. Sensitive: moves money, deletes, sends or shows something to a customer, or grants or revokes access.
MCP tool
visitSafety_recheckProperty (toolset scheduling)
Approval
Over MCP, this tool asks for your OK first (in the AI app when it supports it, otherwise in ServFlo). See Approvals.
live = offenders.io ($0.25 a check); fake = scripted, free; off = not available. One of live, fake, off.
radiusMiles
number
The search radius from the settings, in miles.
pricePerCheckUsd
number
The price of one live check.
searchBasis
enum
How the property is searched: around its map location; the whole ZIP code when it has no map location yet (coarser, always LOW); none = it needs a map location (geocoding) or a ZIP code first. One of location, zip, none.
zip
string or null
californiaSkipped
boolean
A California property skipped by the settings (Penal Code §290.46).
upcomingJob
boolean
An open job here from yesterday to two weeks ahead (or unscheduled): the event loop re-checks the property when its check is due.
nextCheckAt
string or null
When the latest check is due again (30 days after it, a day after a failure); null when never checked or running. Re-checked then only with an upcoming job.
check
object or null
The property's latest check (reused for 30 days); null when never checked.
check.status
enum
One of PENDING, CLEAR, FLAGGED, SKIPPED, ERROR.
check.risk
enum
Medium: a listing within 0.1 mi (a two-person crew is suggested); LOW otherwise. One of NONE, LOW, MEDIUM, HIGH.
check.offenderCount
integer
check.nearestMiles
number or null
check.radiusMiles
number or null
check.searchBasis
string or null
location (the property's coordinates and the radius) or zip (coarser).
check.matchBasis
string or null
What was found, in plain words. Never names anyone.