DevelopersAPI reference

Field API

REST endpoints for field in ServFlo: 13 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
On my way to a jobPOST /organizations/{organizationId}/jobs/{jobId}/on-my-waywrite
Arrived at a jobPOST /organizations/{organizationId}/jobs/{jobId}/arrivewrite
Start a jobPOST /organizations/{organizationId}/jobs/{jobId}/startwrite
Complete a jobPOST /organizations/{organizationId}/jobs/{jobId}/completewrite
Record the customer's signaturePOST /organizations/{organizationId}/jobs/{jobId}/signaturewrite
A job's photos and signatureGET /organizations/{organizationId}/jobs/{jobId}/photosread
Start a job photo uploadPOST /organizations/{organizationId}/jobs/{jobId}/photoswrite
Confirm a finished photo uploadPOST /organizations/{organizationId}/jobs/{jobId}/photos/{attachmentId}/confirmwrite
Re-tag a job photoPATCH /organizations/{organizationId}/jobs/{jobId}/photos/{attachmentId}write
Delete a job photoDELETE /organizations/{organizationId}/jobs/{jobId}/photos/{attachmentId}sensitive
Add a job photo (content in the request)POST /organizations/{organizationId}/jobs/{jobId}/photos/contentwrite
A technician's day: visits in order, with the clockGET /organizations/{organizationId}/my-dayread
Who is working todayGET /organizations/{organizationId}/team-todayread

On my way to a job

POST /organizations/{organizationId}/jobs/{jobId}/on-my-way

Marks a SCHEDULED or CONFIRMED job 'On the way' (onMyWayAt, visible to the office) and starts the technician's TRAVEL clock (stopping any other travel). Emits technician.on_my_way: SENDS TO THE CUSTOMER when the business has the "On my way" automation on (a text with the technician's name and an ETA). Technicians only for their own jobs (404 otherwise).

Permissionjobs.work (Owner, Admin, Dispatcher, Technician)
Riskwrite, OAuth scope servflo.write. Write: creates or changes records inside the business; nothing leaves it.
MCP tooljobs_onMyWay (toolset scheduling)

Parameters

NameInTypeRequiredDescription
jobIdpathstringYes

Example

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

Response

200: the answer's fields
FieldTypeDescription
idstring
identifierstring
statusenumOne of SCHEDULED, CONFIRMED, IN_PROGRESS, COMPLETED, CANCELLED.
onMyWayAtstring (date-time) or null
arrivedAtstring (date-time) or null
startedAtstring (date-time) or null
completedAtstring (date-time) or null
completionNotesstring or null
nextJobIdstring or null

Arrived at a job

POST /organizations/{organizationId}/jobs/{jobId}/arrive

Stamps arrivedAt and stops the technician's TRAVEL clock for this job. The job is not started; call POST …/start for that (starting also counts as arriving).

Permissionjobs.work (Owner, Admin, Dispatcher, Technician)
Riskwrite, OAuth scope servflo.write. Write: creates or changes records inside the business; nothing leaves it.
MCP tooljobs_arrive (toolset scheduling)

Parameters

NameInTypeRequiredDescription
jobIdpathstringYes

Example

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

Response

200: the answer's fields
FieldTypeDescription
idstring
identifierstring
statusenumOne of SCHEDULED, CONFIRMED, IN_PROGRESS, COMPLETED, CANCELLED.
onMyWayAtstring (date-time) or null
arrivedAtstring (date-time) or null
startedAtstring (date-time) or null
completedAtstring (date-time) or null
completionNotesstring or null
nextJobIdstring or null

Start a job

POST /organizations/{organizationId}/jobs/{jobId}/start

Sets the job IN_PROGRESS with startedAt, stops the technician's travel and any other running job clock, and starts a JOB time entry for this job. Emits job.started. Nothing is sent to the customer.

Permissionjobs.work (Owner, Admin, Dispatcher, Technician)
Riskwrite, OAuth scope servflo.write. Write: creates or changes records inside the business; nothing leaves it.
MCP tooljobs_start (toolset scheduling)

Parameters

NameInTypeRequiredDescription
jobIdpathstringYes

Example

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

Response

200: the answer's fields
FieldTypeDescription
idstring
identifierstring
statusenumOne of SCHEDULED, CONFIRMED, IN_PROGRESS, COMPLETED, CANCELLED.
onMyWayAtstring (date-time) or null
arrivedAtstring (date-time) or null
startedAtstring (date-time) or null
completedAtstring (date-time) or null
completionNotesstring or null
nextJobIdstring or null

Complete a job

POST /organizations/{organizationId}/jobs/{jobId}/complete

Sets the job COMPLETED with completedAt and optional completion notes, stops its JOB and TRAVEL time, submits its complete draft forms and books a recurring job's next visit (nextJobId). Refused with 400 naming the missing answers while any form on the job lacks a required field: fill them with PATCH …/forms/{formId} first. Take the customer's signature with POST …/signature. Emits job.completed.

Permissionjobs.work (Owner, Admin, Dispatcher, Technician)
Riskwrite, OAuth scope servflo.write. Write: creates or changes records inside the business; nothing leaves it.
MCP tooljobs_complete (toolset scheduling)

Parameters

NameInTypeRequiredDescription
jobIdpathstringYes

Request body

FieldTypeRequiredDescription
completionNotesstring or nullNoWhat was done; shown on the job and in the equipment history.

Example

curl -X POST "https://app.servflo.ai/api/organizations/$ORGANIZATION_ID/jobs/{jobId}/complete" \
  -H "Authorization: Bearer $SERVFLO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"completionNotes":"string"}'

Response

200: the answer's fields
FieldTypeDescription
idstring
identifierstring
statusenumOne of SCHEDULED, CONFIRMED, IN_PROGRESS, COMPLETED, CANCELLED.
onMyWayAtstring (date-time) or null
arrivedAtstring (date-time) or null
startedAtstring (date-time) or null
completedAtstring (date-time) or null
completionNotesstring or null
nextJobIdstring or null

Record the customer's signature

POST /organizations/{organizationId}/jobs/{jobId}/signature

Stores the customer's sign-off: a PNG drawn on the device (base64 or a data URL, at most 300 KB) as a SIGNATURE file on the job, with who signed, when, and the signing device's address and browser. Shown on the job and as 'Work accepted by' on invoices made from it. Stores the statement the customer agreed to (terms, else the business's current sign-off statement) and the work and amounts shown (summary). Signing again replaces the previous signature. Emits job.signed.

Permissionjobs.work (Owner, Admin, Dispatcher, Technician)
Riskwrite, OAuth scope servflo.write. Write: creates or changes records inside the business; nothing leaves it.
MCP tooljobs_sign (toolset scheduling)

Parameters

NameInTypeRequiredDescription
jobIdpathstringYes

Request body

FieldTypeRequiredDescription
signedBystringYesThe name of the person signing. Up to 200 characters.
pngBase64stringYesThe signature as a PNG, base64 or a data:image/png;base64 URL.
termsstring or nullNoThe statement shown above the signature (GET /signing-terms resolved.signOffTerms); omitted: the business's current one. Up to 5000 characters.
summaryobject or nullNoThe work and amounts shown to the customer.
summary.workstring or nullNoUp to 5000 characters.
summary.itemsarray of objectNoUp to 200 items.
summary.items[].descriptionstringYesUp to 500 characters.
summary.items[].quantitynumberYes
summary.items[].amountCentsintegerYes
summary.totalCentsinteger or nullNo

Example

curl -X POST "https://app.servflo.ai/api/organizations/$ORGANIZATION_ID/jobs/{jobId}/signature" \
  -H "Authorization: Bearer $SERVFLO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"signedBy":"string","pngBase64":"string"}'

Response

200: the answer's fields
FieldTypeDescription
signedBystring
signedAtstring (date-time)
termsstring or nullThe statement the customer agreed to, as shown when they signed.
summaryobject or nullThe work and amounts the customer was shown.
summary.workstring or nullUp to 5000 characters.
summary.itemsarray of objectUp to 200 items.
summary.items[].descriptionstringUp to 500 characters.
summary.items[].quantitynumber
summary.items[].amountCentsinteger
summary.totalCentsinteger or null
imageUrlstring or nullThe signature PNG, valid for 10 minutes.

A job's photos and signature

GET /organizations/{organizationId}/jobs/{jobId}/photos

Confirmed photos on the job, newest first, with tag (BEFORE, AFTER, GENERAL, ISSUE, or SIGNATURE for the customer's sign-off) and view/download URLs valid for 10 minutes. Read-only. Technicians: their own jobs 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 tooljobPhotos_list (toolset scheduling)

Parameters

NameInTypeRequiredDescription
jobIdpathstringYes

Example

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

Response

200: the answer's fields

An array of objects:

FieldTypeDescription
idstring
jobIdstring or null
tagenum or nullOne of BEFORE, AFTER, GENERAL, ISSUE, SIGNATURE.
fileNamestring
contentTypestring
sizeBytesinteger
uploadedByUserIdstring or null
uploadedAtstring (date-time) or null
createdAtstring (date-time)
urlstringView URL, valid for 10 minutes.
downloadUrlstringDownload URL, valid for 10 minutes.

Start a job photo upload

POST /organizations/{organizationId}/jobs/{jobId}/photos

Step 1 of 2 of adding a photo to a job: records it with its tag and returns uploadUrl; PUT the image there (same Content-Type, within 5 minutes), then call POST …/photos/{attachmentId}/confirm. Images up to 25 MB (the app downscales to 2000 px first), or short videos (video/mp4, video/quicktime) up to 150 MB. Unconfirmed uploads are not listed.

Permissionjobs.work (Owner, Admin, Dispatcher, Technician)
Riskwrite, OAuth scope servflo.write. Write: creates or changes records inside the business; nothing leaves it.
MCP tooljobPhotos_createUpload (toolset scheduling)

Parameters

NameInTypeRequiredDescription
jobIdpathstringYes

Request body

FieldTypeRequiredDescription
fileNamestringYesUp to 500 characters.
contentTypestringYesAn image/* type (image/jpeg) or video/mp4 / video/quicktime. Up to 200 characters.
sizeBytesintegerYes
tagenumNoBEFORE, AFTER, GENERAL or ISSUE (what the photo shows). One of BEFORE, AFTER, GENERAL, ISSUE. Default GENERAL.

Example

curl -X POST "https://app.servflo.ai/api/organizations/$ORGANIZATION_ID/jobs/{jobId}/photos" \
  -H "Authorization: Bearer $SERVFLO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"fileName":"string","contentType":"string","sizeBytes":1}'

Response

201: the answer's fields
FieldTypeDescription
attachmentobject
attachment.idstring
attachment.jobIdstring or null
attachment.tagenum or nullOne of BEFORE, AFTER, GENERAL, ISSUE, SIGNATURE.
attachment.fileNamestring
attachment.contentTypestring
attachment.sizeBytesinteger
attachment.uploadedByUserIdstring or null
attachment.uploadedAtstring (date-time) or null
attachment.createdAtstring (date-time)
uploadUrlstringPUT the bytes here within 5 minutes.

Confirm a finished photo upload

POST /organizations/{organizationId}/jobs/{jobId}/photos/{attachmentId}/confirm

Step 2 of 2: marks the photo as uploaded so it is listed on the job (and in the portal, when the business shows job photos there and the job is completed). Returns the photo with its URLs.

Permissionjobs.work (Owner, Admin, Dispatcher, Technician)
Riskwrite, OAuth scope servflo.write. Write: creates or changes records inside the business; nothing leaves it.
MCP tooljobPhotos_confirm (toolset scheduling)

Parameters

NameInTypeRequiredDescription
jobIdpathstringYes
attachmentIdpathstringYes

Example

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

Response

200: the answer's fields
FieldTypeDescription
idstring
jobIdstring or null
tagenum or nullOne of BEFORE, AFTER, GENERAL, ISSUE, SIGNATURE.
fileNamestring
contentTypestring
sizeBytesinteger
uploadedByUserIdstring or null
uploadedAtstring (date-time) or null
createdAtstring (date-time)
urlstringView URL, valid for 10 minutes.
downloadUrlstringDownload URL, valid for 10 minutes.

Re-tag a job photo

PATCH /organizations/{organizationId}/jobs/{jobId}/photos/{attachmentId}

Changes a photo's tag (BEFORE, AFTER, GENERAL, ISSUE). The signature cannot be re-tagged. Returns the photo.

Permissionjobs.work (Owner, Admin, Dispatcher, Technician)
Riskwrite, OAuth scope servflo.write. Write: creates or changes records inside the business; nothing leaves it.
MCP tooljobPhotos_update (toolset scheduling)

Parameters

NameInTypeRequiredDescription
jobIdpathstringYes
attachmentIdpathstringYes

Request body

FieldTypeRequiredDescription
tagenumYesBEFORE, AFTER, GENERAL or ISSUE (what the photo shows). One of BEFORE, AFTER, GENERAL, ISSUE.

Example

curl -X PATCH "https://app.servflo.ai/api/organizations/$ORGANIZATION_ID/jobs/{jobId}/photos/{attachmentId}" \
  -H "Authorization: Bearer $SERVFLO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"tag":"BEFORE"}'

Response

200: the answer's fields
FieldTypeDescription
idstring
jobIdstring or null
tagenum or nullOne of BEFORE, AFTER, GENERAL, ISSUE, SIGNATURE.
fileNamestring
contentTypestring
sizeBytesinteger
uploadedByUserIdstring or null
uploadedAtstring (date-time) or null
createdAtstring (date-time)
urlstringView URL, valid for 10 minutes.
downloadUrlstringDownload URL, valid for 10 minutes.

Delete a job photo

DELETE /organizations/{organizationId}/jobs/{jobId}/photos/{attachmentId}

Destructive: deletes the photo and its stored image. The customer's signature cannot be deleted here.

Permissionjobs.work (Owner, Admin, Dispatcher, Technician)
Risksensitive, OAuth scope servflo.sensitive. Sensitive: moves money, deletes, sends or shows something to a customer, or grants or revokes access.
MCP tooljobPhotos_delete (toolset scheduling)
ApprovalOver MCP, this tool always waits for your approval in ServFlo. See Approvals.

Parameters

NameInTypeRequiredDescription
jobIdpathstringYes
attachmentIdpathstringYes

Example

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

Response

200: the answer's fields
FieldTypeDescription
oktrue

Add a job photo (content in the request)

POST /organizations/{organizationId}/jobs/{jobId}/photos/content

Adds a photo (or a short video/mp4 or video/quicktime) to a job in one call, tagged BEFORE, AFTER, GENERAL or ISSUE: send contentBase64 or a public sourceUrl (up to 10 MB). It is listed on the job (and in the customer portal when the business shows completed jobs' photos). Technicians: their own jobs. Returns the photo with 10-minute URLs.

Permissionjobs.work (Owner, Admin, Dispatcher, Technician)
Riskwrite, OAuth scope servflo.write. Write: creates or changes records inside the business; nothing leaves it.
MCP tooljobPhotos_upload (toolset scheduling, in the default set)

Parameters

NameInTypeRequiredDescription
jobIdpathstringYesThe job (GET /jobs).

Request body

FieldTypeRequiredDescription
tagenumNoBEFORE, AFTER, GENERAL or ISSUE (what the photo shows). One of BEFORE, AFTER, GENERAL, ISSUE. Default GENERAL.
fileNamestringNoThe file's name, e.g. receipt.jpg (default: from the URL, else 'file'). Up to 500 characters.
contentTypestringNoMIME type, e.g. image/jpeg or application/pdf. Optional: taken from a data: URL, the URL's answer or the file's first bytes. Up to 200 characters.
contentBase64stringNoThe file's bytes as base64 (a data: URL is accepted too). Up to 10 MB. Give this or sourceUrl.
sourceUrlstring (uri)NoA public http(s) URL ServFlo downloads the file from (up to 10 MB, 20 s, 3 redirects; private and internal addresses are refused). Give this or contentBase64. Up to 2000 characters.

Example

curl -X POST "https://app.servflo.ai/api/organizations/$ORGANIZATION_ID/jobs/{jobId}/photos/content" \
  -H "Authorization: Bearer $SERVFLO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"tag":"GENERAL","fileName":"string","contentType":"string"}'

Response

201: the answer's fields
FieldTypeDescription
idstring
jobIdstring or null
tagenum or nullOne of BEFORE, AFTER, GENERAL, ISSUE, SIGNATURE.
fileNamestring
contentTypestring
sizeBytesinteger
uploadedByUserIdstring or null
uploadedAtstring (date-time) or null
createdAtstring (date-time)
urlstringView URL, valid for 10 minutes.
downloadUrlstringDownload URL, valid for 10 minutes.

A technician's day: visits in order, with the clock

GET /organizations/{organizationId}/my-day

The visits on date for a technician (every visit whose crew they are on, cancelled left out), in the dispatcher's route order when set, else by time, each with customer and phone, address, access notes, gate code and hazards, equipment, forms still to fill and the straight-line distance from the previous stop when both are geocoded; plus the technician's clock (clocked in, on a break, today's paid minutes). A technician always gets their own day; others pass technicianId (GET /technicians/options) or get their own linked technician's day. technician: null means the caller is not linked to a technician record yet. Read-only.

Permissionschedule.read (Owner, Admin, Dispatcher, Technician, Member)
Riskread, OAuth scope servflo.read. Read: reads only.
MCP toolmyDay_get (toolset scheduling)

Parameters

NameInTypeRequiredDescription
datequerystringNoThe day, YYYY-MM-DD. Defaults to today in the organization's timezone.
technicianIdquerystringNoWhose day (office roles); ignored for technicians.
timeZonequerystringNoIANA timezone days and weeks are counted in (e.g. America/Chicago). Defaults to the organization's timezone (Settings → General). Up to 100 characters.

Example

curl "https://app.servflo.ai/api/organizations/$ORGANIZATION_ID/my-day" \
  -H "Authorization: Bearer $SERVFLO_API_KEY"

Response

200: the answer's fields
FieldTypeDescription
datestring
technicianobject or null
technician.idstring
technician.namestring
technician.colorstring
technician.linkedboolean
linkedbooleanWhether the technician has a ServFlo account linked.
visitsarray of object
visits[].idstringThe job's id (as before visits existed).
visits[].jobIdstring
visits[].visitIdstringThe visit: use it with POST /jobs/{jobId}/visits/{visitId}/…
visits[].identifierstring
visits[].statusenumThe visit's status. One of SCHEDULED, CONFIRMED, IN_PROGRESS, COMPLETED, CANCELLED.
visits[].jobStatusenumOne of SCHEDULED, CONFIRMED, IN_PROGRESS, COMPLETED, CANCELLED.
visits[].routeOrderinteger or nullThe dispatcher's route position; the day is in this order when set.
visits[].visitNotesstring or nullNotes for this visit (the job's are notes).
visits[].crewarray of object
visits[].crew[].technicianIdstring
visits[].crew[].isLeadboolean
visits[].crew[].namestring
visits[].crew[].colorstring
visits[].priorityenumOne of LOW, NORMAL, HIGH, URGENT.
visits[].scheduledDatestring
visits[].scheduledTimestring or null
visits[].durationMinutesinteger
visits[].addressstring or null
visits[].notesstring or null
visits[].completionNotesstring or null
visits[].onMyWayAtstring (date-time) or null
visits[].arrivedAtstring (date-time) or null
visits[].startedAtstring (date-time) or null
visits[].completedAtstring (date-time) or null
visits[].signedBystring or null
visits[].signedAtstring (date-time) or null
visits[].customerobject
visits[].customer.idstring
visits[].customer.namestring
visits[].customer.phonestring or null
visits[].customer.emailstring or null
visits[].customer.doNotServiceboolean
visits[].customer.doNotServiceReasonstring or null
visits[].propertyobject or null
visits[].property.idstring
visits[].property.namestring or null
visits[].property.addressstring or null
visits[].property.address2string or null
visits[].property.citystring or null
visits[].property.statestring or null
visits[].property.zipstring or null
visits[].property.gateCodestring or null
visits[].property.accessInstructionsstring or null
visits[].property.safetyNotesstring or null
visits[].property.petsOnSiteboolean
visits[].property.petNotesstring or null
visits[].property.contactNamestring or null
visits[].property.contactPhonestring or null
visits[].property.latitudenumber or null
visits[].property.longitudenumber or null
visits[].assetobject or null
visits[].asset.idstring
visits[].asset.namestring
visits[].asset.serialNumberstring
visits[].asset.manufacturerstring or null
visits[].asset.modelstring or null
visits[].serviceTypeobject or null
visits[].serviceType.idstring
visits[].serviceType.namestring
visits[].serviceType.colorstring
visits[].distanceFromPreviousKmnumber or nullStraight-line km from the previous stop, when both are geocoded.
visits[].membershipobject or nullSet when the customer is a member: plan name and whether their work is priority.
visits[].membership.membershipIdstring
visits[].membership.identifierstringMEM-n
visits[].membership.planNamestring
visits[].membership.prioritybooleanThe plan flags its members' work as priority on the board.
visits[].membership.dueMonthstring or nullYYYY-MM when the job is an included member visit; null for other work for a member.
visits[].membership.dueDatestring or nullYYYY-MM-DD when the member visit is on a week cadence (every N weeks); null for month-based visits.
visits[].photoCountinteger
visits[].formsarray of object
visits[].forms[].idstring
visits[].forms[].namestring
visits[].forms[].statusenumOne of DRAFT, SUBMITTED.
visits[].forms[].missingCountinteger
clockobject or null
clock.clockedInboolean
clock.onBreakboolean
clock.activityenum or nullThe non-job time running now, if any. One of SHOP, SUPPLY_HOUSE, MEETING, TRAINING, VEHICLE, ADMIN, OTHER.
clock.runningarray of object
clock.running[].idstring
clock.running[].organizationIdstring
clock.running[].userIdstring
clock.running[].technicianIdstring or null
clock.running[].jobIdstring or null
clock.running[].kindenumSHIFT (clocked in), JOB (working a job), TRAVEL (on the way), BREAK, ACTIVITY (non-job work: see activity). One of SHIFT, JOB, TRAVEL, BREAK, ACTIVITY.
clock.running[].activityenum or nullWhat an ACTIVITY entry was spent on. One of SHOP, SUPPLY_HOUSE, MEETING, TRAINING, VEHICLE, ADMIN, OTHER.
clock.running[].startedAtstring (date-time)
clock.running[].endedAtstring (date-time) or null
clock.running[].notestring or null
clock.running[].sourceenumOne of CLOCK, MANUAL, AUTO.
clock.running[].statusenumApproval state: OPEN, SUBMITTED, APPROVED or REJECTED. Running = endedAt null. One of OPEN, SUBMITTED, APPROVED, REJECTED.
clock.running[].editReasonstring or null
clock.running[].editedByUserIdstring or null
clock.running[].approvedByUserIdstring or null
clock.running[].approvedAtstring (date-time) or null
clock.running[].createdAtstring (date-time)
clock.running[].updatedAtstring (date-time)
clock.running[].jobobject or null
clock.running[].technicianobject or null
clock.running[].userNamestring or null
clock.running[].minutesintegerWhole minutes (a running entry counts to now).
clock.running[].datestringThe day it started, in the requested timezone.
clock.todayobject
clock.today.SHIFTinteger
clock.today.JOBinteger
clock.today.TRAVELinteger
clock.today.BREAKinteger
clock.today.ACTIVITYinteger
clock.today.paidintegerPaid minutes: SHIFT minus BREAK on a day with a shift, else JOB plus TRAVEL plus ACTIVITY.
progressobject
progress.totalinteger
progress.completedinteger
progress.inProgressinteger

Who is working today

GET /organizations/{organizationId}/team-today

Every active technician with whether they are clocked in (and since when) or on a break, the job they are on (IN_PROGRESS, else ON_THE_WAY), their next job, progress through date's jobs and paid minutes so far. For the dashboard's Team today card. A technician sees only their own row. Read-only.

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

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

Parameters

NameInTypeRequiredDescription
datequerystringNoThe day, YYYY-MM-DD. Defaults to today in the organization's timezone.
timeZonequerystringNoIANA timezone days and weeks are counted in (e.g. America/Chicago). Defaults to the organization's timezone (Settings → General). Up to 100 characters.

Example

curl "https://app.servflo.ai/api/organizations/$ORGANIZATION_ID/team-today" \
  -H "Authorization: Bearer $SERVFLO_API_KEY"

Response

200: the answer's fields

An array of objects:

FieldTypeDescription
technicianobject
technician.idstring
technician.namestring
technician.colorstring
linkedboolean
clockedInboolean
clockedInAtstring (date-time) or null
onBreakboolean
currentobject or null
current.idstring
current.visitIdstring
current.identifierstring
current.statusenumOne of SCHEDULED, CONFIRMED, IN_PROGRESS, COMPLETED, CANCELLED.
current.technicianIdstring or null
current.scheduledTimestring or null
current.onMyWayAtstring (date-time) or null
current.arrivedAtstring (date-time) or null
current.startedAtstring (date-time) or null
current.completedAtstring (date-time) or null
current.customerobject
current.customer.idstring
current.customer.namestring
current.stateenumOne of IN_PROGRESS, ON_THE_WAY.
nextobject or null
next.idstring
next.visitIdstring
next.identifierstring
next.statusenumOne of SCHEDULED, CONFIRMED, IN_PROGRESS, COMPLETED, CANCELLED.
next.technicianIdstring or null
next.scheduledTimestring or null
next.onMyWayAtstring (date-time) or null
next.arrivedAtstring (date-time) or null
next.startedAtstring (date-time) or null
next.completedAtstring (date-time) or null
next.customerobject
next.customer.idstring
next.customer.namestring
progressobject
progress.totalinteger
progress.completedinteger
paidMinutesTodayinteger

On this page