DevelopersAPI reference

Visit safety API

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.

OperationEndpointRisk
Get the visit safety settingsGET /organizations/{organizationId}/visit-safety/settingsread
Change the visit safety settingsPATCH /organizations/{organizationId}/visit-safety/settingssensitive
Get a job's safety advisoryGET /organizations/{organizationId}/jobs/{jobId}/safetyread
Check a job's property againPOST /organizations/{organizationId}/jobs/{jobId}/safety/rechecksensitive
Get a property's visit safety statusGET /organizations/{organizationId}/properties/{propertyId}/safetyread
Check a property's visit safety nowPOST /organizations/{organizationId}/properties/{propertyId}/safety/rechecksensitive

Get the visit safety settings

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.

Permissionorganization.manage (Owner, Admin)
Riskread, OAuth scope servflo.read. Read: reads only.
MCP toolvisitSafety_settings (toolset scheduling)

Example

curl "https://app.servflo.ai/api/organizations/$ORGANIZATION_ID/visit-safety/settings" \
  -H "Authorization: Bearer $SERVFLO_API_KEY"

Response

200: the answer's fields
FieldTypeDescription
offenderCheckEnabledboolean
radiusMilesnumber
skipCaliforniaboolean
monthlyCheckCapintegerPaid checks allowed per calendar month (UTC); past it checks are skipped until next month. The free trial allows at most 25.
checksThisMonthnumberPaid checks made this calendar month (UTC).
acknowledgementobject or nullWho accepted the safety-only terms, and when; null until accepted.
acknowledgement.acceptedAtstring
acknowledgement.userIdstring or null
acknowledgement.namestring or null
modeenumlive = offenders.io; fake = scripted (development, tests); off = not available. One of live, fake, off.
termsarray of stringThe terms accepted when turning it on.
pricePerCheckUsdnumber
radiusOptionsarray of number

Change the visit safety settings

PATCH /organizations/{organizationId}/visit-safety/settings

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.

Permissionorganization.manage (Owner, Admin)
Risksensitive, OAuth scope servflo.sensitive. Sensitive: moves money, deletes, sends or shows something to a customer, or grants or revokes access.
MCP toolvisitSafety_updateSettings (toolset scheduling)
ApprovalOver MCP, this tool asks for your OK first (in the AI app when it supports it, otherwise in ServFlo). See Approvals.

Request body

FieldTypeRequiredDescription
offenderCheckEnabledbooleanNo
radiusMilesnumberNo0.25, 0.5 or 1.
skipCaliforniabooleanNo
monthlyCheckCapintegerNoPaid checks allowed per calendar month (default 200; 0 pauses them). Past it, checks are skipped until next month. 0–5000.
acceptTermsbooleanNoAccept the safety-only terms (required the first time it is turned on).

Example

curl -X PATCH "https://app.servflo.ai/api/organizations/$ORGANIZATION_ID/visit-safety/settings" \
  -H "Authorization: Bearer $SERVFLO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"offenderCheckEnabled":true,"radiusMiles":1,"skipCalifornia":true}'

Response

200: the answer's fields
FieldTypeDescription
offenderCheckEnabledboolean
radiusMilesnumber
skipCaliforniaboolean
monthlyCheckCapintegerPaid checks allowed per calendar month (UTC); past it checks are skipped until next month. The free trial allows at most 25.
checksThisMonthnumberPaid checks made this calendar month (UTC).
acknowledgementobject or nullWho accepted the safety-only terms, and when; null until accepted.
acknowledgement.acceptedAtstring
acknowledgement.userIdstring or null
acknowledgement.namestring or null
modeenumlive = offenders.io; fake = scripted (development, tests); off = not available. One of live, fake, off.
termsarray of stringThe terms accepted when turning it on.
pricePerCheckUsdnumber
radiusOptionsarray of number

Get a job's safety advisory

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.

Permission: jobs.read (Owner, Admin, Dispatcher, Technician (own jobs), Member); risk read (OAuth scope servflo.read).

Permissionjobs.read
Riskread, OAuth scope servflo.read. Read: reads only.
MCP toolvisitSafety_forJob (toolset scheduling)

Parameters

NameInTypeRequiredDescription
jobIdpathstringYes

Example

curl "https://app.servflo.ai/api/organizations/$ORGANIZATION_ID/jobs/{jobId}/safety" \
  -H "Authorization: Bearer $SERVFLO_API_KEY"

Response

200: the answer's fields
FieldTypeDescription
enabledbooleanVisit safety is on for this business.
hasPropertyboolean
checkobject or nullThe property's latest check (reused for 30 days); null when never checked.
check.statusenumOne of PENDING, CLEAR, FLAGGED, SKIPPED, ERROR.
check.riskenumMedium: a listing within 0.1 mi (a two-person crew is suggested); LOW otherwise. One of NONE, LOW, MEDIUM, HIGH.
check.offenderCountinteger
check.nearestMilesnumber or null
check.radiusMilesnumber or null
check.searchBasisstring or nulllocation (the property's coordinates and the radius) or zip (coarser).
check.matchBasisstring or nullWhat was found, in plain words. Never names anyone.
check.suggestTwoPersonCrewboolean
check.statusReasonstring or nullWhy it was skipped or failed.
check.checkedAtstring or null

Check a job's property again

POST /organizations/{organizationId}/jobs/{jobId}/safety/recheck

Money: runs the visit safety check for the job's property now ($0.25), e.g. after its address changed. Needs visit safety on. Returns the advisory.

Permissionjobs.write (Owner, Admin, Dispatcher)
Risksensitive, OAuth scope servflo.sensitive. Sensitive: moves money, deletes, sends or shows something to a customer, or grants or revokes access.
MCP toolvisitSafety_recheck (toolset scheduling)
ApprovalOver MCP, this tool asks for your OK first (in the AI app when it supports it, otherwise in ServFlo). See Approvals.

Parameters

NameInTypeRequiredDescription
jobIdpathstringYes

Example

curl -X POST "https://app.servflo.ai/api/organizations/$ORGANIZATION_ID/jobs/{jobId}/safety/recheck" \
  -H "Authorization: Bearer $SERVFLO_API_KEY"

Response

200: the answer's fields
FieldTypeDescription
enabledbooleanVisit safety is on for this business.
hasPropertyboolean
checkobject or nullThe property's latest check (reused for 30 days); null when never checked.
check.statusenumOne of PENDING, CLEAR, FLAGGED, SKIPPED, ERROR.
check.riskenumMedium: a listing within 0.1 mi (a two-person crew is suggested); LOW otherwise. One of NONE, LOW, MEDIUM, HIGH.
check.offenderCountinteger
check.nearestMilesnumber or null
check.radiusMilesnumber or null
check.searchBasisstring or nulllocation (the property's coordinates and the radius) or zip (coarser).
check.matchBasisstring or nullWhat was found, in plain words. Never names anyone.
check.suggestTwoPersonCrewboolean
check.statusReasonstring or nullWhy it was skipped or failed.
check.checkedAtstring or null

Get a property's visit safety status

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.

Permission: jobs.read (Owner, Admin, Dispatcher, Technician (own jobs), Member); risk read (OAuth scope servflo.read).

Permissionjobs.read
Riskread, OAuth scope servflo.read. Read: reads only.
MCP toolvisitSafety_forProperty (toolset scheduling)

Parameters

NameInTypeRequiredDescription
propertyIdpathstringYes

Example

curl "https://app.servflo.ai/api/organizations/$ORGANIZATION_ID/properties/{propertyId}/safety" \
  -H "Authorization: Bearer $SERVFLO_API_KEY"

Response

200: the answer's fields
FieldTypeDescription
enabledbooleanVisit safety is on for this business.
modeenumlive = offenders.io ($0.25 a check); fake = scripted, free; off = not available. One of live, fake, off.
radiusMilesnumberThe search radius from the settings, in miles.
pricePerCheckUsdnumberThe price of one live check.
searchBasisenumHow 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.
zipstring or null
californiaSkippedbooleanA California property skipped by the settings (Penal Code §290.46).
upcomingJobbooleanAn open job here from yesterday to two weeks ahead (or unscheduled): the event loop re-checks the property when its check is due.
nextCheckAtstring or nullWhen 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.
checkobject or nullThe property's latest check (reused for 30 days); null when never checked.
check.statusenumOne of PENDING, CLEAR, FLAGGED, SKIPPED, ERROR.
check.riskenumMedium: a listing within 0.1 mi (a two-person crew is suggested); LOW otherwise. One of NONE, LOW, MEDIUM, HIGH.
check.offenderCountinteger
check.nearestMilesnumber or null
check.radiusMilesnumber or null
check.searchBasisstring or nulllocation (the property's coordinates and the radius) or zip (coarser).
check.matchBasisstring or nullWhat was found, in plain words. Never names anyone.
check.suggestTwoPersonCrewboolean
check.statusReasonstring or nullWhy it was skipped or failed.
check.checkedAtstring or null

Check a property's visit safety now

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.

Permissionjobs.write (Owner, Admin, Dispatcher)
Risksensitive, OAuth scope servflo.sensitive. Sensitive: moves money, deletes, sends or shows something to a customer, or grants or revokes access.
MCP toolvisitSafety_recheckProperty (toolset scheduling)
ApprovalOver MCP, this tool asks for your OK first (in the AI app when it supports it, otherwise in ServFlo). See Approvals.

Parameters

NameInTypeRequiredDescription
propertyIdpathstringYes

Example

curl -X POST "https://app.servflo.ai/api/organizations/$ORGANIZATION_ID/properties/{propertyId}/safety/recheck" \
  -H "Authorization: Bearer $SERVFLO_API_KEY"

Response

200: the answer's fields
FieldTypeDescription
enabledbooleanVisit safety is on for this business.
modeenumlive = offenders.io ($0.25 a check); fake = scripted, free; off = not available. One of live, fake, off.
radiusMilesnumberThe search radius from the settings, in miles.
pricePerCheckUsdnumberThe price of one live check.
searchBasisenumHow 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.
zipstring or null
californiaSkippedbooleanA California property skipped by the settings (Penal Code §290.46).
upcomingJobbooleanAn open job here from yesterday to two weeks ahead (or unscheduled): the event loop re-checks the property when its check is due.
nextCheckAtstring or nullWhen 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.
checkobject or nullThe property's latest check (reused for 30 days); null when never checked.
check.statusenumOne of PENDING, CLEAR, FLAGGED, SKIPPED, ERROR.
check.riskenumMedium: a listing within 0.1 mi (a two-person crew is suggested); LOW otherwise. One of NONE, LOW, MEDIUM, HIGH.
check.offenderCountinteger
check.nearestMilesnumber or null
check.radiusMilesnumber or null
check.searchBasisstring or nulllocation (the property's coordinates and the radius) or zip (coarser).
check.matchBasisstring or nullWhat was found, in plain words. Never names anyone.
check.suggestTwoPersonCrewboolean
check.statusReasonstring or nullWhy it was skipped or failed.
check.checkedAtstring or null

On this page