DevelopersAPI reference

Capacity API

REST endpoints for capacity 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
Capacity planning settingsGET /organizations/{organizationId}/capacity/settingsread
Change capacity planning settingsPATCH /organizations/{organizationId}/capacity/settingswrite
Capacity planning boardGET /organizations/{organizationId}/capacity/boardread
One capacity cell in detailGET /organizations/{organizationId}/capacity/cellread
Capacity forecastGET /organizations/{organizationId}/capacity/forecastread
Arrival windows for a phone bookingGET /organizations/{organizationId}/capacity/availabilityread

Capacity planning settings

GET /organizations/{organizationId}/capacity/settings

The planning windows, whether online booking honours capacity, the booking threshold (business default and per window), the amber point and planned non-job minutes per technician day. The defaults until saved. Read-only.

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

Example

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

Response

200: the answer's fields
FieldTypeDescription
windowsarray of objectThe day's planning windows (arrival windows).
windows[].startstringA local time of day, HH:MM (24-hour). Blank means 09:00 on new jobs.
windows[].endstringA local time of day, HH:MM (24-hour). Blank means 09:00 on new jobs.
enforceOnlinebooleanOnline booking honours capacity: windows past their threshold are hidden, filling ones flagged limited.
bookingThresholdPercentinteger
windowThresholdsobject
limitedFromPercentintegerFrom this utilisation a window is amber on the board and limited online.
nonJobMinutesPerDayintegerPlanned non-job time per technician per working day (shop, meetings).

Change capacity planning settings

PATCH /organizations/{organizationId}/capacity/settings

Changes the fields sent. With enforceOnline: true the public booking form stops offering a window once booking it would pass the threshold ("stop online booking at 80%") and shows filling windows as limited: customer-visible at once. Units can override the threshold (PATCH /business-units/{id}). Windows must be in order and not overlap.

Permissionsettings.manage (Owner, Admin)
Riskwrite, OAuth scope servflo.write. Write: creates or changes records inside the business; nothing leaves it.
MCP toolcapacity_updateSettings (toolset scheduling)

Request body

FieldTypeRequiredDescription
windowsarray of objectNoUp to 8 items.
windows[].startstringYesA local time of day, HH:MM (24-hour). Blank means 09:00 on new jobs.
windows[].endstringYesA local time of day, HH:MM (24-hour). Blank means 09:00 on new jobs.
enforceOnlinebooleanNo
bookingThresholdPercentintegerNo10–300.
windowThresholdsobjectNoPer planning window: window start → percent, e.g. { "08:00": 80 }.
limitedFromPercentintegerNo10–300.
nonJobMinutesPerDayintegerNo0–480.

Example

curl -X PATCH "https://app.servflo.ai/api/organizations/$ORGANIZATION_ID/capacity/settings" \
  -H "Authorization: Bearer $SERVFLO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"windows":[{"start":"09:00","end":"09:00"}],"enforceOnline":true,"bookingThresholdPercent":10}'

Response

200: the answer's fields
FieldTypeDescription
windowsarray of objectThe day's planning windows (arrival windows).
windows[].startstringA local time of day, HH:MM (24-hour). Blank means 09:00 on new jobs.
windows[].endstringA local time of day, HH:MM (24-hour). Blank means 09:00 on new jobs.
enforceOnlinebooleanOnline booking honours capacity: windows past their threshold are hidden, filling ones flagged limited.
bookingThresholdPercentinteger
windowThresholdsobject
limitedFromPercentintegerFrom this utilisation a window is amber on the board and limited online.
nonJobMinutesPerDayintegerPlanned non-job time per technician per working day (shop, meetings).

Capacity planning board

GET /organizations/{organizationId}/capacity/board

Per day and planning window from start (default this week's Monday) for days days (default 7, at most 31): technician minutes available (working days and hours, time off, planned non-job time; real minutes across daylight saving) against booked visits and pending NEW requests, with utilisation, open and overbooked minutes and a level (green, amber from the settings' amber point, red past 100%). One row for the whole business and one per active unit (and none: work with no unit); businessUnitId keeps that unit and breaks it down by service type; serviceTypeId narrows demand to one service type. Read-only.

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

Parameters

NameInTypeRequiredDescription
startqueryempty string or stringNo
daysqueryintegerNo1–31.
businessUnitIdquerystringNo
serviceTypeIdquerystringNo

Example

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

Response

200: the answer's fields
FieldTypeDescription
todaystring
timeZonestring
datesarray of string
settingsobject
settings.windowsarray of objectThe day's planning windows (arrival windows).
settings.windows[].startstringA local time of day, HH:MM (24-hour). Blank means 09:00 on new jobs.
settings.windows[].endstringA local time of day, HH:MM (24-hour). Blank means 09:00 on new jobs.
settings.enforceOnlinebooleanOnline booking honours capacity: windows past their threshold are hidden, filling ones flagged limited.
settings.bookingThresholdPercentinteger
settings.windowThresholdsobject
settings.limitedFromPercentintegerFrom this utilisation a window is amber on the board and limited online.
settings.nonJobMinutesPerDayintegerPlanned non-job time per technician per working day (shop, meetings).
unitsarray of object
units[].idstring
units[].namestring
units[].tradestring or null
serviceTypesarray of object
serviceTypes[].idstring
serviceTypes[].namestring
serviceTypes[].colorstring
serviceTypes[].defaultBusinessUnitIdstring or null
rowsarray of object
rows[].keystring
rows[].labelstringThe unit or service type name; empty for the business row.
rows[].kindstringbusiness | unit | serviceType | none
rows[].businessUnitIdstring or null
rows[].serviceTypeIdstring or null
rows[].daysarray of object
rows[].days[].datestring
rows[].days[].dayobject
rows[].days[].windowsarray of object
rows[].totalsobject
rows[].totals.supplyMinutesinteger
rows[].totals.bookedMinutesinteger
rows[].totals.pendingMinutesinteger
rows[].totals.openMinutesinteger
rows[].totals.overbookedSlotsinteger
rows[].totals.utilisationPercentinteger or null

One capacity cell in detail

GET /organizations/{organizationId}/capacity/cell

The drill-down of a board cell: the technicians whose time makes the supply (minutes each), and the visits and NEW requests that make the demand, for date and the window starting at windowStart (or the whole day), for one unit (businessUnitId), work with no unit (noUnit), and/or one service type. Read-only.

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

Parameters

NameInTypeRequiredDescription
datequerystringYesA calendar date in the business's own calendar, YYYY-MM-DD.
windowStartquerystringNoA local time of day, HH:MM (24-hour). Blank means 09:00 on new jobs.
businessUnitIdquerystringNo
noUnitquerybooleanNo
serviceTypeIdquerystringNo

Example

curl "https://app.servflo.ai/api/organizations/$ORGANIZATION_ID/capacity/cell?date=2026-11-03" \
  -H "Authorization: Bearer $SERVFLO_API_KEY"

Response

200: the answer's fields
FieldTypeDescription
datestring
windowobject or null
window.startstringA local time of day, HH:MM (24-hour). Blank means 09:00 on new jobs.
window.endstringA local time of day, HH:MM (24-hour). Blank means 09:00 on new jobs.
cellobject
cell.datestring
cell.windowobject or nullNull for the whole day.
cell.window.startstringA local time of day, HH:MM (24-hour). Blank means 09:00 on new jobs.
cell.window.endstringA local time of day, HH:MM (24-hour). Blank means 09:00 on new jobs.
cell.supplyMinutesintegerTechnician minutes available.
cell.bookedMinutesintegerVisits booked (each crew member's time).
cell.pendingMinutesintegerNEW requests: booked online slots and preferred days.
cell.predictedMinutesintegerPredicted service-due work (forecast only; never in utilisation).
cell.openMinutesinteger
cell.overbookedMinutesinteger
cell.utilisationPercentinteger or null
cell.levelenumOne of none, green, amber, red.
cell.technicianCountinteger
techniciansarray of object
technicians[].idstring
technicians[].namestring
technicians[].colorstring
technicians[].supplyMinutesinteger
visitsarray of object
visits[].idstring
visits[].jobIdstring
visits[].identifierstring
visits[].scheduledTimestring or null
visits[].durationMinutesinteger
visits[].statusstring
visits[].customerobject
visits[].customer.idstring
visits[].customer.namestring
visits[].serviceTypeobject or null
visits[].serviceType.idstring
visits[].serviceType.namestring
visits[].businessUnitobject or null
visits[].businessUnit.idstring
visits[].businessUnit.namestring
visits[].crewarray of object
visits[].crew[].idstring
visits[].crew[].namestring
visits[].crew[].colorstring
requestsarray of object
requests[].idstring
requests[].identifierstring
requests[].namestring
requests[].bookedTimestring or null
requests[].durationMinutesinteger or null
requests[].preferredTimeWindowstring
requests[].serviceTypeobject or null
requests[].serviceType.idstring
requests[].serviceType.namestring

Capacity forecast

GET /organizations/{organizationId}/capacity/forecast

The next weeks weeks (1–4, default 4, from this week's Monday), per week: technician minutes available, booked and pending work, and PREDICTED work from Customer 360's service-due predictions (not booked: a projection, labelled as such), with utilisation and projected utilisation. One series for the business and one per active unit, or just businessUnitId. Read-only.

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

Parameters

NameInTypeRequiredDescription
weeksqueryintegerNo1–4.
businessUnitIdquerystringNo

Example

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

Response

200: the answer's fields
FieldTypeDescription
todaystring
timeZonestring
weeksinteger
seriesarray of object
series[].keystring
series[].labelstring
series[].businessUnitIdstring or null
series[].weeksarray of object
series[].weeks[].weekStartstring
series[].weeks[].supplyMinutesnumber
series[].weeks[].bookedMinutesnumber
series[].weeks[].pendingMinutesnumber
series[].weeks[].predictedMinutesnumber
series[].weeks[].utilisationPercentinteger or null
series[].weeks[].projectedPercentinteger or null
series[].weeks[].levelenumOne of none, green, amber, red.
series[].weeks[].projectedLevelenumOne of none, green, amber, red.

Arrival windows for a phone booking

GET /organizations/{organizationId}/capacity/availability

For the CSR booking screen: the arrival windows a service can be booked in from from (default today) for days days (default 7), from every active technician who works for the service's unit (or businessUnitId), with no lead time or daily cap, each flagged limited (filling), overThreshold (online booking would hide it; staff may still book it) and its projected utilisation. Then create the job (POST /jobs) or request at the chosen time. Read-only.

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

Parameters

NameInTypeRequiredDescription
serviceTypeIdquerystringYes
businessUnitIdquerystringNo
fromqueryempty string or stringNo
daysqueryintegerNo1–31.

Example

curl "https://app.servflo.ai/api/organizations/$ORGANIZATION_ID/capacity/availability?serviceTypeId=serviceType_id" \
  -H "Authorization: Bearer $SERVFLO_API_KEY"

Response

200: the answer's fields
FieldTypeDescription
durationMinutesinteger
arrivalWindowMinutesinteger
businessUnitIdstring or null
capacityEnforcedOnlineboolean
daysarray of object
days[].datestring
days[].slotsarray of object
days[].slots[].timestring
days[].slots[].windowEndstring
days[].slots[].limitedboolean
days[].slots[].overThresholdboolean
days[].slots[].projectedPercentinteger or null

On this page