Technicians API REST endpoints for technicians in ServFlo: 10 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}/technicians
Every technician (active and inactive) with contact details, calendar colour and openJobCount. Read-only. Use GET /technicians/options for pickers.
Permission technicians.read (Owner, Admin, Dispatcher, Technician, Member)Risk read, OAuth scope servflo.read. Read: reads only.MCP tool technicians_list (toolset team)
curl "https://app.servflo.ai/api/organizations/ $ORGANIZATION_ID /technicians" \
-H "Authorization: Bearer $SERVFLO_API_KEY "
200: the answer's fields An array of objects:
Field Type Description idstring Technician id. organizationIdstring namestring emailstring or null phonestring or null colorstring Calendar colour, #rrggbb. activeboolean userIdstring or null The linked ServFlo account, if any. invitedEmailstring or null invitedAtstring (date-time) or null workStartTimestring Working day start, HH:MM (24-hour). workEndTimestring Working day end, HH:MM (24-hour). homeAddressstring or null homeLatitudenumber or null homeLongitudenumber or null workDaysarray of integer Working weekdays, 0 = Sunday … 6 = Saturday. onlineBookableboolean hourlyCostCentsinteger or null Loaded hourly cost in cents (costing.read only). hourlyPayCentsinteger or null Hourly pay in cents (costing.read only). homeBusinessUnitIdstring or null customFieldsany Custom field values by key (definitions: GET /custom-fields?entity=TECHNICIAN). createdAtstring (date-time) updatedAtstring (date-time) businessUnitIdsarray of string openJobCountinteger Jobs still open on their plate.
POST /organizations/{organizationId}/technicians
Adds a technician (a person jobs are assigned to; not a sign-in account). Returns the technician.
Permission technicians.write (Owner, Admin)Risk write, OAuth scope servflo.write. Write: creates or changes records inside the business; nothing leaves it.MCP tool technicians_create (toolset team, in the default set)
Field Type Required Description namestring Yes customFieldsobject No Technician custom field values (GET /custom-fields?entity=TECHNICIAN), e.g. licence number or van; required ones are checked on create. emailempty string or string (email) or null No phonestring or null No colorstring No activeboolean No workStartTimestring No Start of their working day, HH:MM (default 08:00); the dispatch board warns outside it. workEndTimestring No End of their working day, HH:MM (default 17:00). homeAddressstring or null No Where their day starts when not at the business (route planning); geocoded after saving. Up to 500 characters. homeLatitudenumber or null No Home base pinned by hand (WGS84). -90–90. homeLongitudenumber or null No -180–180. hourlyCostCentsinteger or null No Burdened cost of one hour of their time, cents (job costing). Hidden from roles without costing.read. 0–10000000. hourlyPayCentsinteger or null No Their hourly pay, cents. Hidden from roles without costing.read. 0–10000000. workDaysarray of integer No Days they work, 0 = Sunday … 6 = Saturday (default Monday–Friday): online booking offers only these. Up to 7 items. onlineBookableboolean No Whether online booking may offer and assign their time (default true). homeBusinessUnitIdstring or null No Their home business unit (GET /business-units): new jobs they are assigned default to it when the service type names none. Up to 100 characters. businessUnitIdsarray of string No Other units they may work for (replaces the list). With no units at all they work for every unit. Up to 100 items.
curl -X POST "https://app.servflo.ai/api/organizations/ $ORGANIZATION_ID /technicians" \
-H "Authorization: Bearer $SERVFLO_API_KEY " \
-H "Content-Type: application/json" \
-d '{"name":"Dana Whitfield"}'
201: the answer's fields Field Type Description idstring Technician id. organizationIdstring namestring emailstring or null phonestring or null colorstring Calendar colour, #rrggbb. activeboolean userIdstring or null The linked ServFlo account, if any. invitedEmailstring or null invitedAtstring (date-time) or null workStartTimestring Working day start, HH:MM (24-hour). workEndTimestring Working day end, HH:MM (24-hour). homeAddressstring or null homeLatitudenumber or null homeLongitudenumber or null workDaysarray of integer Working weekdays, 0 = Sunday … 6 = Saturday. onlineBookableboolean hourlyCostCentsinteger or null Loaded hourly cost in cents (costing.read only). hourlyPayCentsinteger or null Hourly pay in cents (costing.read only). homeBusinessUnitIdstring or null customFieldsany Custom field values by key (definitions: GET /custom-fields?entity=TECHNICIAN). createdAtstring (date-time) updatedAtstring (date-time)
GET /organizations/{organizationId}/technicians/options
Active technicians as id, name and colour, for assigning jobs (POST /jobs/{jobId}/assign). Read-only.
Permission technicians.read (Owner, Admin, Dispatcher, Technician, Member)Risk read, OAuth scope servflo.read. Read: reads only.MCP tool technicians_options (toolset team, in the default set)
curl "https://app.servflo.ai/api/organizations/ $ORGANIZATION_ID /technicians/options" \
-H "Authorization: Bearer $SERVFLO_API_KEY "
200: the answer's fields An array of objects:
Field Type Description idstring Technician id. namestring colorstring workStartTimestring workEndTimestring homeBusinessUnitIdstring or null businessUnitIdsarray of string
PATCH /organizations/{organizationId}/technicians/{technicianId}
Changes the fields sent; active: false hides them from pickers while keeping their jobs. Returns the technician.
Permission technicians.write (Owner, Admin)Risk write, OAuth scope servflo.write. Write: creates or changes records inside the business; nothing leaves it.MCP tool technicians_update (toolset team)
Name In Type Required Description technicianIdpath string Yes
Field Type Required Description namestring No customFieldsobject No Technician custom field values (GET /custom-fields?entity=TECHNICIAN), e.g. licence number or van; required ones are checked on create. emailempty string or string (email) or null No phonestring or null No colorstring No activeboolean No workStartTimestring No Start of their working day, HH:MM (default 08:00); the dispatch board warns outside it. workEndTimestring No End of their working day, HH:MM (default 17:00). homeAddressstring or null No Where their day starts when not at the business (route planning); geocoded after saving. Up to 500 characters. homeLatitudenumber or null No Home base pinned by hand (WGS84). -90–90. homeLongitudenumber or null No -180–180. hourlyCostCentsinteger or null No Burdened cost of one hour of their time, cents (job costing). Hidden from roles without costing.read. 0–10000000. hourlyPayCentsinteger or null No Their hourly pay, cents. Hidden from roles without costing.read. 0–10000000. workDaysarray of integer No Days they work, 0 = Sunday … 6 = Saturday (default Monday–Friday): online booking offers only these. Up to 7 items. onlineBookableboolean No Whether online booking may offer and assign their time (default true). homeBusinessUnitIdstring or null No Their home business unit (GET /business-units): new jobs they are assigned default to it when the service type names none. Up to 100 characters. businessUnitIdsarray of string No Other units they may work for (replaces the list). With no units at all they work for every unit. Up to 100 items.
curl -X PATCH "https://app.servflo.ai/api/organizations/ $ORGANIZATION_ID /technicians/{technicianId}" \
-H "Authorization: Bearer $SERVFLO_API_KEY " \
-H "Content-Type: application/json" \
-d '{"name":"Dana Whitfield","customFields":{},"email":"dana@example.com"}'
200: the answer's fields Field Type Description idstring Technician id. organizationIdstring namestring emailstring or null phonestring or null colorstring Calendar colour, #rrggbb. activeboolean userIdstring or null The linked ServFlo account, if any. invitedEmailstring or null invitedAtstring (date-time) or null workStartTimestring Working day start, HH:MM (24-hour). workEndTimestring Working day end, HH:MM (24-hour). homeAddressstring or null homeLatitudenumber or null homeLongitudenumber or null workDaysarray of integer Working weekdays, 0 = Sunday … 6 = Saturday. onlineBookableboolean hourlyCostCentsinteger or null Loaded hourly cost in cents (costing.read only). hourlyPayCentsinteger or null Hourly pay in cents (costing.read only). homeBusinessUnitIdstring or null customFieldsany Custom field values by key (definitions: GET /custom-fields?entity=TECHNICIAN). createdAtstring (date-time) updatedAtstring (date-time)
DELETE /organizations/{organizationId}/technicians/{technicianId}
Destructive: deletes the technician; their jobs stay, unassigned. Prefer active: false (PATCH) to keep history.
Permission technicians.write (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 technicians_delete (toolset team)Approval Over MCP, this tool always waits for your approval in ServFlo. See Approvals .
Name In Type Required Description technicianIdpath string Yes
curl -X DELETE "https://app.servflo.ai/api/organizations/ $ORGANIZATION_ID /technicians/{technicianId}" \
-H "Authorization: Bearer $SERVFLO_API_KEY "
200: the answer's fields Field Type Description oktrue
POST /organizations/{organizationId}/technicians/{technicianId}/link
Grants access: links an organization member (GET /members) to this technician record: they then see this technician's jobs, customers and My day, and their time is recorded against it. A member can be linked to one technician only (409). Returns the technician.
Permission technicians.write (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 technicians_link (toolset team)Approval Over MCP, this tool asks for your OK first (in the AI app when it supports it, otherwise in ServFlo). See Approvals .
Name In Type Required Description technicianIdpath string Yes
Field Type Required Description userIdstring Yes The member's user id (GET /members). Up to 200 characters.
curl -X POST "https://app.servflo.ai/api/organizations/ $ORGANIZATION_ID /technicians/{technicianId}/link" \
-H "Authorization: Bearer $SERVFLO_API_KEY " \
-H "Content-Type: application/json" \
-d '{"userId":"user_id"}'
200: the answer's fields Field Type Description idstring namestring emailstring or null phonestring or null colorstring activeboolean userIdstring or null The linked ServFlo account, if any. invitedEmailstring or null invitedAtstring (date-time) or null createdAtstring (date-time) updatedAtstring (date-time)
DELETE /organizations/{organizationId}/technicians/{technicianId}/link
Revokes access: the account is no longer this technician (it stays a member; change or remove its role in Members). Clears a pending invitation too. Their jobs and time stay.
Permission technicians.write (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 technicians_unlink (toolset team)Approval Over MCP, this tool always waits for your approval in ServFlo. See Approvals .
Name In Type Required Description technicianIdpath string Yes
curl -X DELETE "https://app.servflo.ai/api/organizations/ $ORGANIZATION_ID /technicians/{technicianId}/link" \
-H "Authorization: Bearer $SERVFLO_API_KEY "
200: the answer's fields Field Type Description idstring namestring emailstring or null phonestring or null colorstring activeboolean userIdstring or null The linked ServFlo account, if any. invitedEmailstring or null invitedAtstring (date-time) or null createdAtstring (date-time) updatedAtstring (date-time)
GET /organizations/{organizationId}/time-off
Time off that ends on or after from (default today), soonest first, optionally for one technician. Online booking offers no slots in it. Read-only.
Permission technicians.read (Owner, Admin, Dispatcher, Technician, Member)Risk read, OAuth scope servflo.read. Read: reads only.MCP tool timeOff_list (toolset scheduling)
Name In Type Required Description technicianIdquery string No fromquery empty string or string No Only time off ending on or after this day.
curl "https://app.servflo.ai/api/organizations/ $ORGANIZATION_ID /time-off" \
-H "Authorization: Bearer $SERVFLO_API_KEY "
200: the answer's fields Field Type Description itemsarray of object items[].idstring items[].technicianIdstring items[].startDatestring items[].endDatestring items[].startTimestring or null items[].endTimestring or null items[].reasonstring or null items[].createdAtstring (date-time) items[].technicianobject items[].technician.idstring items[].technician.namestring items[].technician.colorstring
POST /organizations/{organizationId}/time-off
Marks a technician away from startDate to endDate (inclusive): whole days, or startTime–endTime on each of those days. Online booking stops offering that time; existing jobs are not moved (check the dispatch board).
Permission technicians.write (Owner, Admin)Risk write, OAuth scope servflo.write. Write: creates or changes records inside the business; nothing leaves it.MCP tool timeOff_create (toolset scheduling)
Field Type Required Description technicianIdstring Yes startDatestring Yes A calendar date in the business's own calendar, YYYY-MM-DD. endDatestring Yes A calendar date in the business's own calendar, YYYY-MM-DD. startTimestring or null No With endTime: part of each day; omit for whole days. endTimestring or null No A local time of day, HH:MM (24-hour). Blank means 09:00 on new jobs. reasonstring or null No Up to 200 characters.
curl -X POST "https://app.servflo.ai/api/organizations/ $ORGANIZATION_ID /time-off" \
-H "Authorization: Bearer $SERVFLO_API_KEY " \
-H "Content-Type: application/json" \
-d '{"technicianId":"technician_id","startDate":"2026-11-03","endDate":"2026-11-03"}'
201: the answer's fields Field Type Description idstring technicianIdstring startDatestring endDatestring startTimestring or null endTimestring or null reasonstring or null createdAtstring (date-time) technicianobject technician.idstring technician.namestring technician.colorstring
DELETE /organizations/{organizationId}/time-off/{timeOffId}
Destructive: removes the time off; online booking may offer that time again at once.
Permission technicians.write (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 timeOff_delete (toolset scheduling)Approval Over MCP, this tool always waits for your approval in ServFlo. See Approvals .
Name In Type Required Description timeOffIdpath string Yes
curl -X DELETE "https://app.servflo.ai/api/organizations/ $ORGANIZATION_ID /time-off/{timeOffId}" \
-H "Authorization: Bearer $SERVFLO_API_KEY "
200: the answer's fields Field Type Description oktrue