DevelopersAPI referenceProjects

Project templates API

REST endpoints for project templates in ServFlo: 4 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
Project templatesGET /organizations/{organizationId}/project-templatesread
Add a project templatePOST /organizations/{organizationId}/project-templateswrite
Change a project templatePATCH /organizations/{organizationId}/project-templates/{projectTemplateId}write
Delete a project templateDELETE /organizations/{organizationId}/project-templates/{projectTemplateId}sensitive

Project templates

GET /organizations/{organizationId}/project-templates

Phase templates (phases with typical working days, starting budget lines), seeded once from the business's trade (remodeling, general contractor, roofing; a generic one for all). Read-only.

Permissionprojects.read (Owner, Admin, Dispatcher, Technician, Member)
Riskread, OAuth scope servflo.read. Read: reads only.
MCP toolprojectTemplates_list (toolset projects)

Parameters

NameInTypeRequiredDescription
includeRetiredquerybooleanNo

Example

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

Response

200: the answer's fields

An array of objects:

FieldTypeDescription
idstring
namestring
presetKeystring or null
phasesarray of object
phases[].namestring
phases[].daysnumber
budgetLinesarray of object
budgetLines[].categoryenumBudget bucket: LABOR, MATERIALS, SUBCONTRACTORS, EQUIPMENT or OTHER. One of LABOR, MATERIALS, SUBCONTRACTORS, EQUIPMENT, OTHER.
budgetLines[].descriptionstring
activeboolean

Add a project template

POST /organizations/{organizationId}/project-templates

A template: phases in order with their working days, and starting budget lines.

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

Request body

FieldTypeRequiredDescription
namestringYesUp to 200 characters.
phasesarray of objectYesUp to 60 items.
phases[].namestringYesUp to 200 characters.
phases[].daysintegerYes1–365.
budgetLinesarray of objectNoUp to 60 items.
budgetLines[].categoryenumYesBudget bucket: LABOR, MATERIALS, SUBCONTRACTORS, EQUIPMENT or OTHER. One of LABOR, MATERIALS, SUBCONTRACTORS, EQUIPMENT, OTHER.
budgetLines[].descriptionstringYesUp to 200 characters.

Example

curl -X POST "https://app.servflo.ai/api/organizations/$ORGANIZATION_ID/project-templates" \
  -H "Authorization: Bearer $SERVFLO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"Dana Whitfield","phases":[{"name":"Dana Whitfield","days":1}]}'

Response

201: the answer's fields
FieldTypeDescription
idstring
namestring
presetKeystring or null
phasesarray of object
phases[].namestring
phases[].daysnumber
budgetLinesarray of object
budgetLines[].categoryenumBudget bucket: LABOR, MATERIALS, SUBCONTRACTORS, EQUIPMENT or OTHER. One of LABOR, MATERIALS, SUBCONTRACTORS, EQUIPMENT, OTHER.
budgetLines[].descriptionstring
activeboolean

Change a project template

PATCH /organizations/{organizationId}/project-templates/{projectTemplateId}

Name, phases, budget lines; active: false retires it.

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

Parameters

NameInTypeRequiredDescription
projectTemplateIdpathstringYes

Request body

FieldTypeRequiredDescription
namestringNoUp to 200 characters.
phasesarray of objectNoUp to 60 items.
phases[].namestringYesUp to 200 characters.
phases[].daysintegerYes1–365.
budgetLinesarray of objectNoUp to 60 items.
budgetLines[].categoryenumYesBudget bucket: LABOR, MATERIALS, SUBCONTRACTORS, EQUIPMENT or OTHER. One of LABOR, MATERIALS, SUBCONTRACTORS, EQUIPMENT, OTHER.
budgetLines[].descriptionstringYesUp to 200 characters.
activebooleanNo

Example

curl -X PATCH "https://app.servflo.ai/api/organizations/$ORGANIZATION_ID/project-templates/{projectTemplateId}" \
  -H "Authorization: Bearer $SERVFLO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"Dana Whitfield","phases":[{"name":"Dana Whitfield","days":1}],"budgetLines":[{"category":"LABOR","description":"string"}]}'

Response

200: the answer's fields
FieldTypeDescription
idstring
namestring
presetKeystring or null
phasesarray of object
phases[].namestring
phases[].daysnumber
budgetLinesarray of object
budgetLines[].categoryenumBudget bucket: LABOR, MATERIALS, SUBCONTRACTORS, EQUIPMENT or OTHER. One of LABOR, MATERIALS, SUBCONTRACTORS, EQUIPMENT, OTHER.
budgetLines[].descriptionstring
activeboolean

Delete a project template

DELETE /organizations/{organizationId}/project-templates/{projectTemplateId}

Destructive: deletes a template (projects made from it keep their phases).

Permissionprojects.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 toolprojectTemplates_delete (toolset projects)
ApprovalOver MCP, this tool always waits for your approval in ServFlo. See Approvals.

Parameters

NameInTypeRequiredDescription
projectTemplateIdpathstringYes

Example

curl -X DELETE "https://app.servflo.ai/api/organizations/$ORGANIZATION_ID/project-templates/{projectTemplateId}" \
  -H "Authorization: Bearer $SERVFLO_API_KEY"

Response

200: the answer's fields
FieldTypeDescription
oktrue

On this page