DevelopersAPI referenceService reports

Service report templates API

REST endpoints for service report templates in ServFlo: 37 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
List service report templatesGET /organizations/{organizationId}/service-report-templatesread
Create a service report templatePOST /organizations/{organizationId}/service-report-templateswrite
Starter report templates (Template Center)GET /organizations/{organizationId}/service-report-startersread
Copy a starter templatePOST /organizations/{organizationId}/service-report-templates/from-starterwrite
Get a service report templateGET /organizations/{organizationId}/service-report-templates/{templateId}read
Update a service report templatePATCH /organizations/{organizationId}/service-report-templates/{templateId}write
Delete a service report templateDELETE /organizations/{organizationId}/service-report-templates/{templateId}sensitive
Duplicate a service report templatePOST /organizations/{organizationId}/service-report-templates/{templateId}/duplicatewrite
Add a section to a templatePOST /organizations/{organizationId}/service-report-templates/{templateId}/sectionswrite
Rename a template sectionPATCH /organizations/{organizationId}/service-report-templates/{templateId}/sections/{sectionId}write
Delete a template sectionDELETE /organizations/{organizationId}/service-report-templates/{templateId}/sections/{sectionId}sensitive
Reorder template sectionsPOST /organizations/{organizationId}/service-report-templates/{templateId}/sections/reorderwrite
Duplicate a template sectionPOST /organizations/{organizationId}/service-report-templates/{templateId}/sections/{sectionId}/duplicatewrite
Add an item to a template sectionPOST /organizations/{organizationId}/service-report-templates/{templateId}/sections/{sectionId}/itemswrite
Update a template itemPATCH /organizations/{organizationId}/service-report-templates/{templateId}/items/{itemId}write
Delete a template itemDELETE /organizations/{organizationId}/service-report-templates/{templateId}/items/{itemId}sensitive
Reorder a template section's itemsPOST /organizations/{organizationId}/service-report-templates/{templateId}/sections/{sectionId}/items/reorderwrite
Duplicate a template itemPOST /organizations/{organizationId}/service-report-templates/{templateId}/items/{itemId}/duplicatewrite
Add a comment to the libraryPOST /organizations/{organizationId}/service-report-templates/{templateId}/commentswrite
Update a library commentPATCH /organizations/{organizationId}/service-report-templates/{templateId}/comments/{commentId}write
Delete a library commentDELETE /organizations/{organizationId}/service-report-templates/{templateId}/comments/{commentId}sensitive
Duplicate a library commentPOST /organizations/{organizationId}/service-report-templates/{templateId}/comments/{commentId}/duplicatewrite
Reorder library commentsPOST /organizations/{organizationId}/service-report-templates/{templateId}/comments/reorderwrite
Search the comment libraryGET /organizations/{organizationId}/service-report-commentsread
Auto-attach a template for a service typePOST /organizations/{organizationId}/service-report-templates/{templateId}/service-typeswrite
Add an extra section to a templatePOST /organizations/{organizationId}/service-report-templates/{templateId}/extra-sectionswrite
Draft a library comment with AIPOST /organizations/{organizationId}/service-report-templates/{templateId}/draft-commentwrite
Template drafts from standards documentsGET /organizations/{organizationId}/service-report-template-importsread
Start a template from a standards document (one call)POST /organizations/{organizationId}/service-report-template-importswrite
A template draft from a standards documentGET /organizations/{organizationId}/service-report-template-imports/{draftId}read
Rename a template draftPATCH /organizations/{organizationId}/service-report-template-imports/{draftId}write
Delete a template draftDELETE /organizations/{organizationId}/service-report-template-imports/{draftId}sensitive
Start a template from a standards document (upload URL)POST /organizations/{organizationId}/service-report-template-imports/upload-urlwrite
Confirm a standards document uploadPOST /organizations/{organizationId}/service-report-template-imports/{draftId}/confirm-uploadwrite
Draft a template from the uploaded documentPOST /organizations/{organizationId}/service-report-template-imports/{draftId}/startwrite
Review an element of a template draftPOST /organizations/{organizationId}/service-report-template-imports/{draftId}/reviewwrite
Save a reviewed draft as a templatePOST /organizations/{organizationId}/service-report-template-imports/{draftId}/savewrite

List service report templates

GET /organizations/{organizationId}/service-report-templates

The business's report templates (archived ones with includeArchived), with section, item, comment and report counts. The first call copies the starters for the business's trade (once). Read-only apart from that seeding.

PermissionserviceReports.read (Owner, Admin, Dispatcher, Technician, Member)
Riskread, OAuth scope servflo.read. Read: reads only.
MCP toolserviceReportTemplates_list (toolset serviceReports)

Parameters

NameInTypeRequiredDescription
includeArchivedquerybooleanNo

Example

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

Response

200: the answer's fields

An array of objects:

FieldTypeDescription
idstring
namestring
tradeKeystring or null
documentLabelstringWhat the document is called (Inspection report, Test certificate …).
descriptionstring or null
presetKeystring or nullThe starter it was copied from.
baseTemplateIdstring or null
serviceTypeIdsarray of stringService types whose new jobs get this report.
archivedAtstring (date-time) or null
versioninteger
presetVersioninteger or nullThe starter content version it was copied from.
recommendedTradesarray of stringThe template's own list (empty = the defaults).
recommendedTradeOptionsarray of stringWho findings may recommend: the template's list, else ServFlo's defaults.
starterUpdateobject or null"New version available": the starter has newer content (copy it with createFromStarter, newVersion: true for an updated one). Null when current.
starterUpdate.presetKeystring
starterUpdate.namestring
starterUpdate.versioninteger
starterUpdate.reasonenumOne of replaced, updated.
statusesarray of objectItem statuses, in order (default IN, NI, NP, O).
statuses[].keystring
statuses[].labelstring
statuses[].colorstring
statuses[].needsReasonbooleanStatuses: an item with this status needs a reason (default for NI).
statuses[].reasonsarray of stringStatuses: the reason choices offered.
severitiesarray of objectFinding severities, most serious first.
severities[].keystring
severities[].labelstring
severities[].colorstring
severities[].needsReasonbooleanStatuses: an item with this status needs a reason (default for NI).
severities[].reasonsarray of stringStatuses: the reason choices offered.
designobjectBrand color, cover style, summary, contents, estimates, intro, disclaimer, footer, and the standards block (standardsTitle, standardsHtml).
createdAtstring (date-time)
updatedAtstring (date-time)
sectionCountinteger
itemCountinteger
commentCountinteger
reportCountinteger

Create a service report template

POST /organizations/{organizationId}/service-report-templates

A blank template with the default statuses (IN / NI / NP / O), severities (Safety, Repair, Monitor, Maintenance, Info) and design unless given. Add sections, items and comments next. Jobs of its serviceTypeIds get a report from it when created.

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

Request body

FieldTypeRequiredDescription
namestringYesUp to 200 characters.
documentLabelstringNoDefault “Service report”. Up to 80 characters.
descriptionstring or nullNoUp to 2000 characters.
tradeKeystring or nullNoUp to 60 characters.
statusesarray of objectNoItem statuses, in order: [{ key, label, color }]. May be empty (no statuses on this report). Up to 12 items.
statuses[].keystringYesStable key stored on items and findings (e.g. IN, safety).
statuses[].labelstringYesWhat the report shows (e.g. Inspected). Up to 60 characters.
statuses[].colorstringYes
statuses[].descriptionstring or nullNoUp to 300 characters.
statuses[].needsReasonbooleanNoStatuses only: an item with this status needs a reason (Not inspected).
statuses[].reasonsarray of stringNoStatuses only: the reason choices offered (default Inaccessible, Unsafe …). Up to 20 items.
statuses[].meaningenumNoStatuses only: what it means, whatever it is called (ok, attention, defect, not_inspected, not_present, info), for colours, filters and AI. One of ok, attention, defect, not_inspected, not_present, info.
statuses[].printsAsstring or nullNoStatuses only: the wording the client's report and PDF print, when not label. Up to 60 characters.
severitiesarray of objectNoFinding severities, most serious first: [{ key, label, color }]. The summary is built from them. Up to 12 items.
severities[].keystringYesStable key stored on items and findings (e.g. IN, safety).
severities[].labelstringYesWhat the report shows (e.g. Inspected). Up to 60 characters.
severities[].colorstringYes
severities[].descriptionstring or nullNoUp to 300 characters.
severities[].needsReasonbooleanNoStatuses only: an item with this status needs a reason (Not inspected).
severities[].reasonsarray of stringNoStatuses only: the reason choices offered (default Inaccessible, Unsafe …). Up to 20 items.
severities[].meaningenumNoStatuses only: what it means, whatever it is called (ok, attention, defect, not_inspected, not_present, info), for colours, filters and AI. One of ok, attention, defect, not_inspected, not_present, info.
severities[].printsAsstring or nullNoStatuses only: the wording the client's report and PDF print, when not label. Up to 60 characters.
designobjectNoChanges to the design (merged with the current one).
design.brandColorstringNoAccent color of headings and the cover. Default #0f766e.
design.coverStyleenumNophoto: large cover photo; band: color band with a small photo; minimal: text only. One of photo, band, minimal. Default photo.
design.showSummarybooleanNoShow the summary of findings after the cover. Default true.
design.summarySeveritiesarray of stringNoSeverity keys listed in the summary. Up to 12 items. Default ["safety","repair","monitor"].
design.showTableOfContentsbooleanNoDefault true.
design.showEstimatesbooleanNoShow findings' repair cost ranges to the client. Default false.
design.introHtmlstringNoShown after the cover (safe HTML). Default ``.
design.disclaimerHtmlstringNoStandards, limitations and state-required text, at the end (safe HTML). Default ``.
design.footerTextstringNoPrinted on every page. Up to 300 characters. Default ``.
design.standardsTitlestringNoHeading of the standards block (e.g. "Standards of practice and limitations"). Up to 120 characters. Default ``.
design.standardsHtmlstringNoThe standards the inspection follows, its scope and exclusions (safe HTML), printed before the sections; empty = not shown. Default ``.
serviceTypeIdsarray of stringNoService types (GET /service-types) whose new jobs get this report automatically. Up to 500 items.
baseTemplateIdstring or nullNoThe template this one builds on (stored for layering; Part 4).
archivedbooleanNoArchived templates attach to no new jobs and leave the library search.
recommendedTradesarray of stringNoWho findings may recommend (replaces the list; empty = ServFlo's defaults). Up to 60 items.

Example

curl -X POST "https://app.servflo.ai/api/organizations/$ORGANIZATION_ID/service-report-templates" \
  -H "Authorization: Bearer $SERVFLO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"Dana Whitfield"}'

Response

201: the answer's fields
FieldTypeDescription
idstring
namestring
tradeKeystring or null
documentLabelstringWhat the document is called (Inspection report, Test certificate …).
descriptionstring or null
presetKeystring or nullThe starter it was copied from.
baseTemplateIdstring or null
serviceTypeIdsarray of stringService types whose new jobs get this report.
archivedAtstring (date-time) or null
versioninteger
presetVersioninteger or nullThe starter content version it was copied from.
recommendedTradesarray of stringThe template's own list (empty = the defaults).
recommendedTradeOptionsarray of stringWho findings may recommend: the template's list, else ServFlo's defaults.
starterUpdateobject or null"New version available": the starter has newer content (copy it with createFromStarter, newVersion: true for an updated one). Null when current.
starterUpdate.presetKeystring
starterUpdate.namestring
starterUpdate.versioninteger
starterUpdate.reasonenumOne of replaced, updated.
statusesarray of objectItem statuses, in order (default IN, NI, NP, O).
statuses[].keystring
statuses[].labelstring
statuses[].colorstring
statuses[].needsReasonbooleanStatuses: an item with this status needs a reason (default for NI).
statuses[].reasonsarray of stringStatuses: the reason choices offered.
severitiesarray of objectFinding severities, most serious first.
severities[].keystring
severities[].labelstring
severities[].colorstring
severities[].needsReasonbooleanStatuses: an item with this status needs a reason (default for NI).
severities[].reasonsarray of stringStatuses: the reason choices offered.
designobjectBrand color, cover style, summary, contents, estimates, intro, disclaimer, footer, and the standards block (standardsTitle, standardsHtml).
createdAtstring (date-time)
updatedAtstring (date-time)
reportCountinteger
sectionsarray of object
sections[].idstring
sections[].namestring
sections[].iconstring or null
sections[].descriptionstring or null
sections[].sortOrderinteger
sections[].itemsarray of object
sections[].items[].idstring
sections[].items[].sectionIdstring
sections[].items[].namestring
sections[].items[].descriptionstring or null
sections[].items[].sortOrderinteger
sections[].items[].allowedStatusesarray of stringEmpty = every status.
sections[].items[].describeFieldsarray of objectWhat to describe on this item (copied into reports).
commentsarray of object
comments[].idstring
comments[].templateIdstring
comments[].itemIdsarray of stringTemplate items it is suggested for.
comments[].namestring
comments[].severitystring or null
comments[].isLimitationboolean
comments[].answerFormatstring
comments[].optionsarray of string
comments[].defaultLocationstring or null
comments[].defaultTextstringSafe HTML.
comments[].observationstringSafe HTML: what was seen.
comments[].implicationstringSafe HTML: why it matters.
comments[].recommendationstringSafe HTML: what to do.
comments[].recommendedTradestring or nullWho should do it ("Licensed plumber").
comments[].costLowCentsinteger or null
comments[].costHighCentsinteger or null
comments[].pricebookItemIdstring or null
comments[].inSummaryboolean
comments[].sortOrderinteger

Starter report templates (Template Center)

GET /organizations/{organizationId}/service-report-starters

ServFlo's starter templates for many trades (home inspection, commercial, HVAC, electrical, plumbing, sewer camera, roofing, pest/WDO, septic, chimney, pool, backflow test, solar survey). Copy one with POST /service-report-templates/from-starter. Read-only.

PermissionserviceReports.read (Owner, Admin, Dispatcher, Technician, Member)
Riskread, OAuth scope servflo.read. Read: reads only.
MCP toolserviceReportTemplates_starters (toolset serviceReports)

Example

curl "https://app.servflo.ai/api/organizations/$ORGANIZATION_ID/service-report-starters" \
  -H "Authorization: Bearer $SERVFLO_API_KEY"

Response

200: the answer's fields

An array of objects:

FieldTypeDescription
presetKeystring
namestring
tradeKeystring
documentLabelstring
descriptionstring
sectionCountinteger
itemCountinteger

Copy a starter template

POST /organizations/{organizationId}/service-report-templates/from-starter

Copies a starter (GET /service-report-starters) into the business's templates with its sections, items and comments, which the owner can then change freely. Idempotent: copying the same starter again returns the copy already made (created: false).

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

Request body

FieldTypeRequiredDescription
presetKeystringYesThe starter's key. Up to 80 characters.
newVersionbooleanNoWhen the business's copy is older than the starter (starterUpdate), make a fresh copy of the new content; the old copy is kept, renamed “… (previous version)”.

Example

curl -X POST "https://app.servflo.ai/api/organizations/$ORGANIZATION_ID/service-report-templates/from-starter" \
  -H "Authorization: Bearer $SERVFLO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"presetKey":"string"}'

Response

201: the answer's fields
FieldTypeDescription
createdboolean
templateobject
template.idstring
template.namestring
template.tradeKeystring or null
template.documentLabelstringWhat the document is called (Inspection report, Test certificate …).
template.descriptionstring or null
template.presetKeystring or nullThe starter it was copied from.
template.baseTemplateIdstring or null
template.serviceTypeIdsarray of stringService types whose new jobs get this report.
template.archivedAtstring (date-time) or null
template.versioninteger
template.presetVersioninteger or nullThe starter content version it was copied from.
template.recommendedTradesarray of stringThe template's own list (empty = the defaults).
template.recommendedTradeOptionsarray of stringWho findings may recommend: the template's list, else ServFlo's defaults.
template.starterUpdateobject or null"New version available": the starter has newer content (copy it with createFromStarter, newVersion: true for an updated one). Null when current.
template.starterUpdate.presetKeystring
template.starterUpdate.namestring
template.starterUpdate.versioninteger
template.starterUpdate.reasonenumOne of replaced, updated.
template.statusesarray of objectItem statuses, in order (default IN, NI, NP, O).
template.statuses[].keystring
template.statuses[].labelstring
template.statuses[].colorstring
template.statuses[].needsReasonbooleanStatuses: an item with this status needs a reason (default for NI).
template.statuses[].reasonsarray of stringStatuses: the reason choices offered.
template.severitiesarray of objectFinding severities, most serious first.
template.severities[].keystring
template.severities[].labelstring
template.severities[].colorstring
template.severities[].needsReasonbooleanStatuses: an item with this status needs a reason (default for NI).
template.severities[].reasonsarray of stringStatuses: the reason choices offered.
template.designobjectBrand color, cover style, summary, contents, estimates, intro, disclaimer, footer, and the standards block (standardsTitle, standardsHtml).
template.createdAtstring (date-time)
template.updatedAtstring (date-time)
template.reportCountinteger
template.sectionsarray of object
template.sections[].idstring
template.sections[].namestring
template.sections[].iconstring or null
template.sections[].descriptionstring or null
template.sections[].sortOrderinteger
template.sections[].itemsarray of object
template.commentsarray of object
template.comments[].idstring
template.comments[].templateIdstring
template.comments[].itemIdsarray of stringTemplate items it is suggested for.
template.comments[].namestring
template.comments[].severitystring or null
template.comments[].isLimitationboolean
template.comments[].answerFormatstring
template.comments[].optionsarray of string
template.comments[].defaultLocationstring or null
template.comments[].defaultTextstringSafe HTML.
template.comments[].observationstringSafe HTML: what was seen.
template.comments[].implicationstringSafe HTML: why it matters.
template.comments[].recommendationstringSafe HTML: what to do.
template.comments[].recommendedTradestring or nullWho should do it ("Licensed plumber").
template.comments[].costLowCentsinteger or null
template.comments[].costHighCentsinteger or null
template.comments[].pricebookItemIdstring or null
template.comments[].inSummaryboolean
template.comments[].sortOrderinteger

Get a service report template

GET /organizations/{organizationId}/service-report-templates/{templateId}

One template: settings (statuses, severities, design), sections with their items in order, and the comment library. Read-only.

PermissionserviceReports.read (Owner, Admin, Dispatcher, Technician, Member)
Riskread, OAuth scope servflo.read. Read: reads only.
MCP toolserviceReportTemplates_get (toolset serviceReports)

Parameters

NameInTypeRequiredDescription
templateIdpathstringYes

Example

curl "https://app.servflo.ai/api/organizations/$ORGANIZATION_ID/service-report-templates/{templateId}" \
  -H "Authorization: Bearer $SERVFLO_API_KEY"

Response

200: the answer's fields
FieldTypeDescription
idstring
namestring
tradeKeystring or null
documentLabelstringWhat the document is called (Inspection report, Test certificate …).
descriptionstring or null
presetKeystring or nullThe starter it was copied from.
baseTemplateIdstring or null
serviceTypeIdsarray of stringService types whose new jobs get this report.
archivedAtstring (date-time) or null
versioninteger
presetVersioninteger or nullThe starter content version it was copied from.
recommendedTradesarray of stringThe template's own list (empty = the defaults).
recommendedTradeOptionsarray of stringWho findings may recommend: the template's list, else ServFlo's defaults.
starterUpdateobject or null"New version available": the starter has newer content (copy it with createFromStarter, newVersion: true for an updated one). Null when current.
starterUpdate.presetKeystring
starterUpdate.namestring
starterUpdate.versioninteger
starterUpdate.reasonenumOne of replaced, updated.
statusesarray of objectItem statuses, in order (default IN, NI, NP, O).
statuses[].keystring
statuses[].labelstring
statuses[].colorstring
statuses[].needsReasonbooleanStatuses: an item with this status needs a reason (default for NI).
statuses[].reasonsarray of stringStatuses: the reason choices offered.
severitiesarray of objectFinding severities, most serious first.
severities[].keystring
severities[].labelstring
severities[].colorstring
severities[].needsReasonbooleanStatuses: an item with this status needs a reason (default for NI).
severities[].reasonsarray of stringStatuses: the reason choices offered.
designobjectBrand color, cover style, summary, contents, estimates, intro, disclaimer, footer, and the standards block (standardsTitle, standardsHtml).
createdAtstring (date-time)
updatedAtstring (date-time)
reportCountinteger
sectionsarray of object
sections[].idstring
sections[].namestring
sections[].iconstring or null
sections[].descriptionstring or null
sections[].sortOrderinteger
sections[].itemsarray of object
sections[].items[].idstring
sections[].items[].sectionIdstring
sections[].items[].namestring
sections[].items[].descriptionstring or null
sections[].items[].sortOrderinteger
sections[].items[].allowedStatusesarray of stringEmpty = every status.
sections[].items[].describeFieldsarray of objectWhat to describe on this item (copied into reports).
commentsarray of object
comments[].idstring
comments[].templateIdstring
comments[].itemIdsarray of stringTemplate items it is suggested for.
comments[].namestring
comments[].severitystring or null
comments[].isLimitationboolean
comments[].answerFormatstring
comments[].optionsarray of string
comments[].defaultLocationstring or null
comments[].defaultTextstringSafe HTML.
comments[].observationstringSafe HTML: what was seen.
comments[].implicationstringSafe HTML: why it matters.
comments[].recommendationstringSafe HTML: what to do.
comments[].recommendedTradestring or nullWho should do it ("Licensed plumber").
comments[].costLowCentsinteger or null
comments[].costHighCentsinteger or null
comments[].pricebookItemIdstring or null
comments[].inSummaryboolean
comments[].sortOrderinteger

Update a service report template

PATCH /organizations/{organizationId}/service-report-templates/{templateId}

Changes what is sent: name, label, statuses / severities (the whole list), design (merged), service types (replaced), archive. Reports already on jobs keep their own copy. Returns the template.

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

Parameters

NameInTypeRequiredDescription
templateIdpathstringYes

Request body

FieldTypeRequiredDescription
namestringNoUp to 200 characters.
documentLabelstringNoDefault “Service report”. Up to 80 characters.
descriptionstring or nullNoUp to 2000 characters.
tradeKeystring or nullNoUp to 60 characters.
statusesarray of objectNoItem statuses, in order: [{ key, label, color }]. May be empty (no statuses on this report). Up to 12 items.
statuses[].keystringYesStable key stored on items and findings (e.g. IN, safety).
statuses[].labelstringYesWhat the report shows (e.g. Inspected). Up to 60 characters.
statuses[].colorstringYes
statuses[].descriptionstring or nullNoUp to 300 characters.
statuses[].needsReasonbooleanNoStatuses only: an item with this status needs a reason (Not inspected).
statuses[].reasonsarray of stringNoStatuses only: the reason choices offered (default Inaccessible, Unsafe …). Up to 20 items.
statuses[].meaningenumNoStatuses only: what it means, whatever it is called (ok, attention, defect, not_inspected, not_present, info), for colours, filters and AI. One of ok, attention, defect, not_inspected, not_present, info.
statuses[].printsAsstring or nullNoStatuses only: the wording the client's report and PDF print, when not label. Up to 60 characters.
severitiesarray of objectNoFinding severities, most serious first: [{ key, label, color }]. The summary is built from them. Up to 12 items.
severities[].keystringYesStable key stored on items and findings (e.g. IN, safety).
severities[].labelstringYesWhat the report shows (e.g. Inspected). Up to 60 characters.
severities[].colorstringYes
severities[].descriptionstring or nullNoUp to 300 characters.
severities[].needsReasonbooleanNoStatuses only: an item with this status needs a reason (Not inspected).
severities[].reasonsarray of stringNoStatuses only: the reason choices offered (default Inaccessible, Unsafe …). Up to 20 items.
severities[].meaningenumNoStatuses only: what it means, whatever it is called (ok, attention, defect, not_inspected, not_present, info), for colours, filters and AI. One of ok, attention, defect, not_inspected, not_present, info.
severities[].printsAsstring or nullNoStatuses only: the wording the client's report and PDF print, when not label. Up to 60 characters.
designobjectNoChanges to the design (merged with the current one).
design.brandColorstringNoAccent color of headings and the cover. Default #0f766e.
design.coverStyleenumNophoto: large cover photo; band: color band with a small photo; minimal: text only. One of photo, band, minimal. Default photo.
design.showSummarybooleanNoShow the summary of findings after the cover. Default true.
design.summarySeveritiesarray of stringNoSeverity keys listed in the summary. Up to 12 items. Default ["safety","repair","monitor"].
design.showTableOfContentsbooleanNoDefault true.
design.showEstimatesbooleanNoShow findings' repair cost ranges to the client. Default false.
design.introHtmlstringNoShown after the cover (safe HTML). Default ``.
design.disclaimerHtmlstringNoStandards, limitations and state-required text, at the end (safe HTML). Default ``.
design.footerTextstringNoPrinted on every page. Up to 300 characters. Default ``.
design.standardsTitlestringNoHeading of the standards block (e.g. "Standards of practice and limitations"). Up to 120 characters. Default ``.
design.standardsHtmlstringNoThe standards the inspection follows, its scope and exclusions (safe HTML), printed before the sections; empty = not shown. Default ``.
serviceTypeIdsarray of stringNoService types (GET /service-types) whose new jobs get this report automatically. Up to 500 items.
baseTemplateIdstring or nullNoThe template this one builds on (stored for layering; Part 4).
archivedbooleanNoArchived templates attach to no new jobs and leave the library search.
recommendedTradesarray of stringNoWho findings may recommend (replaces the list; empty = ServFlo's defaults). Up to 60 items.

Example

curl -X PATCH "https://app.servflo.ai/api/organizations/$ORGANIZATION_ID/service-report-templates/{templateId}" \
  -H "Authorization: Bearer $SERVFLO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"Dana Whitfield","documentLabel":"string","description":"string"}'

Response

200: the answer's fields
FieldTypeDescription
idstring
namestring
tradeKeystring or null
documentLabelstringWhat the document is called (Inspection report, Test certificate …).
descriptionstring or null
presetKeystring or nullThe starter it was copied from.
baseTemplateIdstring or null
serviceTypeIdsarray of stringService types whose new jobs get this report.
archivedAtstring (date-time) or null
versioninteger
presetVersioninteger or nullThe starter content version it was copied from.
recommendedTradesarray of stringThe template's own list (empty = the defaults).
recommendedTradeOptionsarray of stringWho findings may recommend: the template's list, else ServFlo's defaults.
starterUpdateobject or null"New version available": the starter has newer content (copy it with createFromStarter, newVersion: true for an updated one). Null when current.
starterUpdate.presetKeystring
starterUpdate.namestring
starterUpdate.versioninteger
starterUpdate.reasonenumOne of replaced, updated.
statusesarray of objectItem statuses, in order (default IN, NI, NP, O).
statuses[].keystring
statuses[].labelstring
statuses[].colorstring
statuses[].needsReasonbooleanStatuses: an item with this status needs a reason (default for NI).
statuses[].reasonsarray of stringStatuses: the reason choices offered.
severitiesarray of objectFinding severities, most serious first.
severities[].keystring
severities[].labelstring
severities[].colorstring
severities[].needsReasonbooleanStatuses: an item with this status needs a reason (default for NI).
severities[].reasonsarray of stringStatuses: the reason choices offered.
designobjectBrand color, cover style, summary, contents, estimates, intro, disclaimer, footer, and the standards block (standardsTitle, standardsHtml).
createdAtstring (date-time)
updatedAtstring (date-time)
reportCountinteger
sectionsarray of object
sections[].idstring
sections[].namestring
sections[].iconstring or null
sections[].descriptionstring or null
sections[].sortOrderinteger
sections[].itemsarray of object
sections[].items[].idstring
sections[].items[].sectionIdstring
sections[].items[].namestring
sections[].items[].descriptionstring or null
sections[].items[].sortOrderinteger
sections[].items[].allowedStatusesarray of stringEmpty = every status.
sections[].items[].describeFieldsarray of objectWhat to describe on this item (copied into reports).
commentsarray of object
comments[].idstring
comments[].templateIdstring
comments[].itemIdsarray of stringTemplate items it is suggested for.
comments[].namestring
comments[].severitystring or null
comments[].isLimitationboolean
comments[].answerFormatstring
comments[].optionsarray of string
comments[].defaultLocationstring or null
comments[].defaultTextstringSafe HTML.
comments[].observationstringSafe HTML: what was seen.
comments[].implicationstringSafe HTML: why it matters.
comments[].recommendationstringSafe HTML: what to do.
comments[].recommendedTradestring or nullWho should do it ("Licensed plumber").
comments[].costLowCentsinteger or null
comments[].costHighCentsinteger or null
comments[].pricebookItemIdstring or null
comments[].inSummaryboolean
comments[].sortOrderinteger

Delete a service report template

DELETE /organizations/{organizationId}/service-report-templates/{templateId}

Destructive: deletes the template and its comment library. Reports already on jobs keep their copy. Prefer archived: true to stop using it.

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

Parameters

NameInTypeRequiredDescription
templateIdpathstringYes

Example

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

Response

200: the answer's fields
FieldTypeDescription
oktrue

Duplicate a service report template

POST /organizations/{organizationId}/service-report-templates/{templateId}/duplicate

A full copy (sections, items, comments) named name or “… (copy)”, assigned to no service type. Returns the copy.

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

Parameters

NameInTypeRequiredDescription
templateIdpathstringYes

Request body

FieldTypeRequiredDescription
namestringNoUp to 200 characters.

Example

curl -X POST "https://app.servflo.ai/api/organizations/$ORGANIZATION_ID/service-report-templates/{templateId}/duplicate" \
  -H "Authorization: Bearer $SERVFLO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"Dana Whitfield"}'

Response

201: the answer's fields
FieldTypeDescription
idstring
namestring
tradeKeystring or null
documentLabelstringWhat the document is called (Inspection report, Test certificate …).
descriptionstring or null
presetKeystring or nullThe starter it was copied from.
baseTemplateIdstring or null
serviceTypeIdsarray of stringService types whose new jobs get this report.
archivedAtstring (date-time) or null
versioninteger
presetVersioninteger or nullThe starter content version it was copied from.
recommendedTradesarray of stringThe template's own list (empty = the defaults).
recommendedTradeOptionsarray of stringWho findings may recommend: the template's list, else ServFlo's defaults.
starterUpdateobject or null"New version available": the starter has newer content (copy it with createFromStarter, newVersion: true for an updated one). Null when current.
starterUpdate.presetKeystring
starterUpdate.namestring
starterUpdate.versioninteger
starterUpdate.reasonenumOne of replaced, updated.
statusesarray of objectItem statuses, in order (default IN, NI, NP, O).
statuses[].keystring
statuses[].labelstring
statuses[].colorstring
statuses[].needsReasonbooleanStatuses: an item with this status needs a reason (default for NI).
statuses[].reasonsarray of stringStatuses: the reason choices offered.
severitiesarray of objectFinding severities, most serious first.
severities[].keystring
severities[].labelstring
severities[].colorstring
severities[].needsReasonbooleanStatuses: an item with this status needs a reason (default for NI).
severities[].reasonsarray of stringStatuses: the reason choices offered.
designobjectBrand color, cover style, summary, contents, estimates, intro, disclaimer, footer, and the standards block (standardsTitle, standardsHtml).
createdAtstring (date-time)
updatedAtstring (date-time)
reportCountinteger
sectionsarray of object
sections[].idstring
sections[].namestring
sections[].iconstring or null
sections[].descriptionstring or null
sections[].sortOrderinteger
sections[].itemsarray of object
sections[].items[].idstring
sections[].items[].sectionIdstring
sections[].items[].namestring
sections[].items[].descriptionstring or null
sections[].items[].sortOrderinteger
sections[].items[].allowedStatusesarray of stringEmpty = every status.
sections[].items[].describeFieldsarray of objectWhat to describe on this item (copied into reports).
commentsarray of object
comments[].idstring
comments[].templateIdstring
comments[].itemIdsarray of stringTemplate items it is suggested for.
comments[].namestring
comments[].severitystring or null
comments[].isLimitationboolean
comments[].answerFormatstring
comments[].optionsarray of string
comments[].defaultLocationstring or null
comments[].defaultTextstringSafe HTML.
comments[].observationstringSafe HTML: what was seen.
comments[].implicationstringSafe HTML: why it matters.
comments[].recommendationstringSafe HTML: what to do.
comments[].recommendedTradestring or nullWho should do it ("Licensed plumber").
comments[].costLowCentsinteger or null
comments[].costHighCentsinteger or null
comments[].pricebookItemIdstring or null
comments[].inSummaryboolean
comments[].sortOrderinteger

Add a section to a template

POST /organizations/{organizationId}/service-report-templates/{templateId}/sections

Adds a section at the end (or at sortOrder). Returns the whole template.

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

Parameters

NameInTypeRequiredDescription
templateIdpathstringYes

Request body

FieldTypeRequiredDescription
namestringYesUp to 200 characters.
iconstring or nullNoUp to 40 characters.
descriptionstring or nullNoUp to 2000 characters.
sortOrderintegerNo0–10000.

Example

curl -X POST "https://app.servflo.ai/api/organizations/$ORGANIZATION_ID/service-report-templates/{templateId}/sections" \
  -H "Authorization: Bearer $SERVFLO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"Dana Whitfield"}'

Response

201: the answer's fields
FieldTypeDescription
idstring
namestring
tradeKeystring or null
documentLabelstringWhat the document is called (Inspection report, Test certificate …).
descriptionstring or null
presetKeystring or nullThe starter it was copied from.
baseTemplateIdstring or null
serviceTypeIdsarray of stringService types whose new jobs get this report.
archivedAtstring (date-time) or null
versioninteger
presetVersioninteger or nullThe starter content version it was copied from.
recommendedTradesarray of stringThe template's own list (empty = the defaults).
recommendedTradeOptionsarray of stringWho findings may recommend: the template's list, else ServFlo's defaults.
starterUpdateobject or null"New version available": the starter has newer content (copy it with createFromStarter, newVersion: true for an updated one). Null when current.
starterUpdate.presetKeystring
starterUpdate.namestring
starterUpdate.versioninteger
starterUpdate.reasonenumOne of replaced, updated.
statusesarray of objectItem statuses, in order (default IN, NI, NP, O).
statuses[].keystring
statuses[].labelstring
statuses[].colorstring
statuses[].needsReasonbooleanStatuses: an item with this status needs a reason (default for NI).
statuses[].reasonsarray of stringStatuses: the reason choices offered.
severitiesarray of objectFinding severities, most serious first.
severities[].keystring
severities[].labelstring
severities[].colorstring
severities[].needsReasonbooleanStatuses: an item with this status needs a reason (default for NI).
severities[].reasonsarray of stringStatuses: the reason choices offered.
designobjectBrand color, cover style, summary, contents, estimates, intro, disclaimer, footer, and the standards block (standardsTitle, standardsHtml).
createdAtstring (date-time)
updatedAtstring (date-time)
reportCountinteger
sectionsarray of object
sections[].idstring
sections[].namestring
sections[].iconstring or null
sections[].descriptionstring or null
sections[].sortOrderinteger
sections[].itemsarray of object
sections[].items[].idstring
sections[].items[].sectionIdstring
sections[].items[].namestring
sections[].items[].descriptionstring or null
sections[].items[].sortOrderinteger
sections[].items[].allowedStatusesarray of stringEmpty = every status.
sections[].items[].describeFieldsarray of objectWhat to describe on this item (copied into reports).
commentsarray of object
comments[].idstring
comments[].templateIdstring
comments[].itemIdsarray of stringTemplate items it is suggested for.
comments[].namestring
comments[].severitystring or null
comments[].isLimitationboolean
comments[].answerFormatstring
comments[].optionsarray of string
comments[].defaultLocationstring or null
comments[].defaultTextstringSafe HTML.
comments[].observationstringSafe HTML: what was seen.
comments[].implicationstringSafe HTML: why it matters.
comments[].recommendationstringSafe HTML: what to do.
comments[].recommendedTradestring or nullWho should do it ("Licensed plumber").
comments[].costLowCentsinteger or null
comments[].costHighCentsinteger or null
comments[].pricebookItemIdstring or null
comments[].inSummaryboolean
comments[].sortOrderinteger

Rename a template section

PATCH

/organizations/{organizationId}/service-report-templates/{templateId}/sections/{sectionId}

Changes the section's name, icon or description. Returns the whole template.

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

Parameters

NameInTypeRequiredDescription
templateIdpathstringYes
sectionIdpathstringYes

Request body

FieldTypeRequiredDescription
namestringNoUp to 200 characters.
iconstring or nullNoUp to 40 characters.
descriptionstring or nullNoUp to 2000 characters.

Example

curl -X PATCH "https://app.servflo.ai/api/organizations/$ORGANIZATION_ID/service-report-templates/{templateId}/sections/{sectionId}" \
  -H "Authorization: Bearer $SERVFLO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"Dana Whitfield","icon":"string","description":"string"}'

Response

200: the answer's fields
FieldTypeDescription
idstring
namestring
tradeKeystring or null
documentLabelstringWhat the document is called (Inspection report, Test certificate …).
descriptionstring or null
presetKeystring or nullThe starter it was copied from.
baseTemplateIdstring or null
serviceTypeIdsarray of stringService types whose new jobs get this report.
archivedAtstring (date-time) or null
versioninteger
presetVersioninteger or nullThe starter content version it was copied from.
recommendedTradesarray of stringThe template's own list (empty = the defaults).
recommendedTradeOptionsarray of stringWho findings may recommend: the template's list, else ServFlo's defaults.
starterUpdateobject or null"New version available": the starter has newer content (copy it with createFromStarter, newVersion: true for an updated one). Null when current.
starterUpdate.presetKeystring
starterUpdate.namestring
starterUpdate.versioninteger
starterUpdate.reasonenumOne of replaced, updated.
statusesarray of objectItem statuses, in order (default IN, NI, NP, O).
statuses[].keystring
statuses[].labelstring
statuses[].colorstring
statuses[].needsReasonbooleanStatuses: an item with this status needs a reason (default for NI).
statuses[].reasonsarray of stringStatuses: the reason choices offered.
severitiesarray of objectFinding severities, most serious first.
severities[].keystring
severities[].labelstring
severities[].colorstring
severities[].needsReasonbooleanStatuses: an item with this status needs a reason (default for NI).
severities[].reasonsarray of stringStatuses: the reason choices offered.
designobjectBrand color, cover style, summary, contents, estimates, intro, disclaimer, footer, and the standards block (standardsTitle, standardsHtml).
createdAtstring (date-time)
updatedAtstring (date-time)
reportCountinteger
sectionsarray of object
sections[].idstring
sections[].namestring
sections[].iconstring or null
sections[].descriptionstring or null
sections[].sortOrderinteger
sections[].itemsarray of object
sections[].items[].idstring
sections[].items[].sectionIdstring
sections[].items[].namestring
sections[].items[].descriptionstring or null
sections[].items[].sortOrderinteger
sections[].items[].allowedStatusesarray of stringEmpty = every status.
sections[].items[].describeFieldsarray of objectWhat to describe on this item (copied into reports).
commentsarray of object
comments[].idstring
comments[].templateIdstring
comments[].itemIdsarray of stringTemplate items it is suggested for.
comments[].namestring
comments[].severitystring or null
comments[].isLimitationboolean
comments[].answerFormatstring
comments[].optionsarray of string
comments[].defaultLocationstring or null
comments[].defaultTextstringSafe HTML.
comments[].observationstringSafe HTML: what was seen.
comments[].implicationstringSafe HTML: why it matters.
comments[].recommendationstringSafe HTML: what to do.
comments[].recommendedTradestring or nullWho should do it ("Licensed plumber").
comments[].costLowCentsinteger or null
comments[].costHighCentsinteger or null
comments[].pricebookItemIdstring or null
comments[].inSummaryboolean
comments[].sortOrderinteger

Delete a template section

DELETE

/organizations/{organizationId}/service-report-templates/{templateId}/sections/{sectionId}

Destructive: deletes the section and its items from the template (comments stay in the library). Reports on jobs keep theirs.

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

Parameters

NameInTypeRequiredDescription
templateIdpathstringYes
sectionIdpathstringYes

Example

curl -X DELETE "https://app.servflo.ai/api/organizations/$ORGANIZATION_ID/service-report-templates/{templateId}/sections/{sectionId}" \
  -H "Authorization: Bearer $SERVFLO_API_KEY"

Response

200: the answer's fields
FieldTypeDescription
idstring
namestring
tradeKeystring or null
documentLabelstringWhat the document is called (Inspection report, Test certificate …).
descriptionstring or null
presetKeystring or nullThe starter it was copied from.
baseTemplateIdstring or null
serviceTypeIdsarray of stringService types whose new jobs get this report.
archivedAtstring (date-time) or null
versioninteger
presetVersioninteger or nullThe starter content version it was copied from.
recommendedTradesarray of stringThe template's own list (empty = the defaults).
recommendedTradeOptionsarray of stringWho findings may recommend: the template's list, else ServFlo's defaults.
starterUpdateobject or null"New version available": the starter has newer content (copy it with createFromStarter, newVersion: true for an updated one). Null when current.
starterUpdate.presetKeystring
starterUpdate.namestring
starterUpdate.versioninteger
starterUpdate.reasonenumOne of replaced, updated.
statusesarray of objectItem statuses, in order (default IN, NI, NP, O).
statuses[].keystring
statuses[].labelstring
statuses[].colorstring
statuses[].needsReasonbooleanStatuses: an item with this status needs a reason (default for NI).
statuses[].reasonsarray of stringStatuses: the reason choices offered.
severitiesarray of objectFinding severities, most serious first.
severities[].keystring
severities[].labelstring
severities[].colorstring
severities[].needsReasonbooleanStatuses: an item with this status needs a reason (default for NI).
severities[].reasonsarray of stringStatuses: the reason choices offered.
designobjectBrand color, cover style, summary, contents, estimates, intro, disclaimer, footer, and the standards block (standardsTitle, standardsHtml).
createdAtstring (date-time)
updatedAtstring (date-time)
reportCountinteger
sectionsarray of object
sections[].idstring
sections[].namestring
sections[].iconstring or null
sections[].descriptionstring or null
sections[].sortOrderinteger
sections[].itemsarray of object
sections[].items[].idstring
sections[].items[].sectionIdstring
sections[].items[].namestring
sections[].items[].descriptionstring or null
sections[].items[].sortOrderinteger
sections[].items[].allowedStatusesarray of stringEmpty = every status.
sections[].items[].describeFieldsarray of objectWhat to describe on this item (copied into reports).
commentsarray of object
comments[].idstring
comments[].templateIdstring
comments[].itemIdsarray of stringTemplate items it is suggested for.
comments[].namestring
comments[].severitystring or null
comments[].isLimitationboolean
comments[].answerFormatstring
comments[].optionsarray of string
comments[].defaultLocationstring or null
comments[].defaultTextstringSafe HTML.
comments[].observationstringSafe HTML: what was seen.
comments[].implicationstringSafe HTML: why it matters.
comments[].recommendationstringSafe HTML: what to do.
comments[].recommendedTradestring or nullWho should do it ("Licensed plumber").
comments[].costLowCentsinteger or null
comments[].costHighCentsinteger or null
comments[].pricebookItemIdstring or null
comments[].inSummaryboolean
comments[].sortOrderinteger

Reorder template sections

POST /organizations/{organizationId}/service-report-templates/{templateId}/sections/reorder

Puts the template's sections in the order of sectionIds (any not named keep their order after). Returns the template.

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

Parameters

NameInTypeRequiredDescription
templateIdpathstringYes

Request body

FieldTypeRequiredDescription
sectionIdsarray of stringYesThe template's section ids in the new order. Up to 500 items.

Example

curl -X POST "https://app.servflo.ai/api/organizations/$ORGANIZATION_ID/service-report-templates/{templateId}/sections/reorder" \
  -H "Authorization: Bearer $SERVFLO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"sectionIds":["section_id"]}'

Response

200: the answer's fields
FieldTypeDescription
idstring
namestring
tradeKeystring or null
documentLabelstringWhat the document is called (Inspection report, Test certificate …).
descriptionstring or null
presetKeystring or nullThe starter it was copied from.
baseTemplateIdstring or null
serviceTypeIdsarray of stringService types whose new jobs get this report.
archivedAtstring (date-time) or null
versioninteger
presetVersioninteger or nullThe starter content version it was copied from.
recommendedTradesarray of stringThe template's own list (empty = the defaults).
recommendedTradeOptionsarray of stringWho findings may recommend: the template's list, else ServFlo's defaults.
starterUpdateobject or null"New version available": the starter has newer content (copy it with createFromStarter, newVersion: true for an updated one). Null when current.
starterUpdate.presetKeystring
starterUpdate.namestring
starterUpdate.versioninteger
starterUpdate.reasonenumOne of replaced, updated.
statusesarray of objectItem statuses, in order (default IN, NI, NP, O).
statuses[].keystring
statuses[].labelstring
statuses[].colorstring
statuses[].needsReasonbooleanStatuses: an item with this status needs a reason (default for NI).
statuses[].reasonsarray of stringStatuses: the reason choices offered.
severitiesarray of objectFinding severities, most serious first.
severities[].keystring
severities[].labelstring
severities[].colorstring
severities[].needsReasonbooleanStatuses: an item with this status needs a reason (default for NI).
severities[].reasonsarray of stringStatuses: the reason choices offered.
designobjectBrand color, cover style, summary, contents, estimates, intro, disclaimer, footer, and the standards block (standardsTitle, standardsHtml).
createdAtstring (date-time)
updatedAtstring (date-time)
reportCountinteger
sectionsarray of object
sections[].idstring
sections[].namestring
sections[].iconstring or null
sections[].descriptionstring or null
sections[].sortOrderinteger
sections[].itemsarray of object
sections[].items[].idstring
sections[].items[].sectionIdstring
sections[].items[].namestring
sections[].items[].descriptionstring or null
sections[].items[].sortOrderinteger
sections[].items[].allowedStatusesarray of stringEmpty = every status.
sections[].items[].describeFieldsarray of objectWhat to describe on this item (copied into reports).
commentsarray of object
comments[].idstring
comments[].templateIdstring
comments[].itemIdsarray of stringTemplate items it is suggested for.
comments[].namestring
comments[].severitystring or null
comments[].isLimitationboolean
comments[].answerFormatstring
comments[].optionsarray of string
comments[].defaultLocationstring or null
comments[].defaultTextstringSafe HTML.
comments[].observationstringSafe HTML: what was seen.
comments[].implicationstringSafe HTML: why it matters.
comments[].recommendationstringSafe HTML: what to do.
comments[].recommendedTradestring or nullWho should do it ("Licensed plumber").
comments[].costLowCentsinteger or null
comments[].costHighCentsinteger or null
comments[].pricebookItemIdstring or null
comments[].inSummaryboolean
comments[].sortOrderinteger

Duplicate a template section

POST

/organizations/{organizationId}/service-report-templates/{templateId}/sections/{sectionId}/duplicate

Copies the section and its items right after it; comments tagged to the items are tagged to the copies too. Returns the template.

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

Parameters

NameInTypeRequiredDescription
templateIdpathstringYes
sectionIdpathstringYes

Example

curl -X POST "https://app.servflo.ai/api/organizations/$ORGANIZATION_ID/service-report-templates/{templateId}/sections/{sectionId}/duplicate" \
  -H "Authorization: Bearer $SERVFLO_API_KEY"

Response

201: the answer's fields
FieldTypeDescription
idstring
namestring
tradeKeystring or null
documentLabelstringWhat the document is called (Inspection report, Test certificate …).
descriptionstring or null
presetKeystring or nullThe starter it was copied from.
baseTemplateIdstring or null
serviceTypeIdsarray of stringService types whose new jobs get this report.
archivedAtstring (date-time) or null
versioninteger
presetVersioninteger or nullThe starter content version it was copied from.
recommendedTradesarray of stringThe template's own list (empty = the defaults).
recommendedTradeOptionsarray of stringWho findings may recommend: the template's list, else ServFlo's defaults.
starterUpdateobject or null"New version available": the starter has newer content (copy it with createFromStarter, newVersion: true for an updated one). Null when current.
starterUpdate.presetKeystring
starterUpdate.namestring
starterUpdate.versioninteger
starterUpdate.reasonenumOne of replaced, updated.
statusesarray of objectItem statuses, in order (default IN, NI, NP, O).
statuses[].keystring
statuses[].labelstring
statuses[].colorstring
statuses[].needsReasonbooleanStatuses: an item with this status needs a reason (default for NI).
statuses[].reasonsarray of stringStatuses: the reason choices offered.
severitiesarray of objectFinding severities, most serious first.
severities[].keystring
severities[].labelstring
severities[].colorstring
severities[].needsReasonbooleanStatuses: an item with this status needs a reason (default for NI).
severities[].reasonsarray of stringStatuses: the reason choices offered.
designobjectBrand color, cover style, summary, contents, estimates, intro, disclaimer, footer, and the standards block (standardsTitle, standardsHtml).
createdAtstring (date-time)
updatedAtstring (date-time)
reportCountinteger
sectionsarray of object
sections[].idstring
sections[].namestring
sections[].iconstring or null
sections[].descriptionstring or null
sections[].sortOrderinteger
sections[].itemsarray of object
sections[].items[].idstring
sections[].items[].sectionIdstring
sections[].items[].namestring
sections[].items[].descriptionstring or null
sections[].items[].sortOrderinteger
sections[].items[].allowedStatusesarray of stringEmpty = every status.
sections[].items[].describeFieldsarray of objectWhat to describe on this item (copied into reports).
commentsarray of object
comments[].idstring
comments[].templateIdstring
comments[].itemIdsarray of stringTemplate items it is suggested for.
comments[].namestring
comments[].severitystring or null
comments[].isLimitationboolean
comments[].answerFormatstring
comments[].optionsarray of string
comments[].defaultLocationstring or null
comments[].defaultTextstringSafe HTML.
comments[].observationstringSafe HTML: what was seen.
comments[].implicationstringSafe HTML: why it matters.
comments[].recommendationstringSafe HTML: what to do.
comments[].recommendedTradestring or nullWho should do it ("Licensed plumber").
comments[].costLowCentsinteger or null
comments[].costHighCentsinteger or null
comments[].pricebookItemIdstring or null
comments[].inSummaryboolean
comments[].sortOrderinteger

Add an item to a template section

POST

/organizations/{organizationId}/service-report-templates/{templateId}/sections/{sectionId}/items

Adds an item (a thing to check) at the end of the section. allowedStatuses limits its statuses (empty = all). Returns the template.

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

Parameters

NameInTypeRequiredDescription
templateIdpathstringYes
sectionIdpathstringYes

Request body

FieldTypeRequiredDescription
namestringYesUp to 200 characters.
descriptionstring or nullNoUp to 2000 characters.
allowedStatusesarray of stringNoUp to 12 items.
describeFieldsarray of objectNoWhat to describe on this item, in order: [{ key, label, type: choice|multi|text|number, options, unit, required, help, sortOrder }]. Replaces the list. Up to 40 items.
describeFields[].keystringYesStable key the answers are stored under (e.g. coveringType).
describeFields[].labelstringYesWhat the report prints (e.g. Roof covering). Up to 120 characters.
describeFields[].typeenumYeschoice: one of options; multi: any of options; text; number (with unit). One of choice, multi, text, number.
describeFields[].optionsarray of stringNoUp to 40 items. Default [].
describeFields[].unitstring or nullNonumber: the unit printed after it. Up to 20 characters.
describeFields[].requiredbooleanNoMust be answered before publishing (a blocking checklist item; "Publish anyway" acknowledges it). Default false.
describeFields[].helpstring or nullNoA hint for the inspector. Up to 500 characters.
describeFields[].sortOrderintegerNo0–10000. Default 0.

Example

curl -X POST "https://app.servflo.ai/api/organizations/$ORGANIZATION_ID/service-report-templates/{templateId}/sections/{sectionId}/items" \
  -H "Authorization: Bearer $SERVFLO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"Dana Whitfield"}'

Response

201: the answer's fields
FieldTypeDescription
idstring
namestring
tradeKeystring or null
documentLabelstringWhat the document is called (Inspection report, Test certificate …).
descriptionstring or null
presetKeystring or nullThe starter it was copied from.
baseTemplateIdstring or null
serviceTypeIdsarray of stringService types whose new jobs get this report.
archivedAtstring (date-time) or null
versioninteger
presetVersioninteger or nullThe starter content version it was copied from.
recommendedTradesarray of stringThe template's own list (empty = the defaults).
recommendedTradeOptionsarray of stringWho findings may recommend: the template's list, else ServFlo's defaults.
starterUpdateobject or null"New version available": the starter has newer content (copy it with createFromStarter, newVersion: true for an updated one). Null when current.
starterUpdate.presetKeystring
starterUpdate.namestring
starterUpdate.versioninteger
starterUpdate.reasonenumOne of replaced, updated.
statusesarray of objectItem statuses, in order (default IN, NI, NP, O).
statuses[].keystring
statuses[].labelstring
statuses[].colorstring
statuses[].needsReasonbooleanStatuses: an item with this status needs a reason (default for NI).
statuses[].reasonsarray of stringStatuses: the reason choices offered.
severitiesarray of objectFinding severities, most serious first.
severities[].keystring
severities[].labelstring
severities[].colorstring
severities[].needsReasonbooleanStatuses: an item with this status needs a reason (default for NI).
severities[].reasonsarray of stringStatuses: the reason choices offered.
designobjectBrand color, cover style, summary, contents, estimates, intro, disclaimer, footer, and the standards block (standardsTitle, standardsHtml).
createdAtstring (date-time)
updatedAtstring (date-time)
reportCountinteger
sectionsarray of object
sections[].idstring
sections[].namestring
sections[].iconstring or null
sections[].descriptionstring or null
sections[].sortOrderinteger
sections[].itemsarray of object
sections[].items[].idstring
sections[].items[].sectionIdstring
sections[].items[].namestring
sections[].items[].descriptionstring or null
sections[].items[].sortOrderinteger
sections[].items[].allowedStatusesarray of stringEmpty = every status.
sections[].items[].describeFieldsarray of objectWhat to describe on this item (copied into reports).
commentsarray of object
comments[].idstring
comments[].templateIdstring
comments[].itemIdsarray of stringTemplate items it is suggested for.
comments[].namestring
comments[].severitystring or null
comments[].isLimitationboolean
comments[].answerFormatstring
comments[].optionsarray of string
comments[].defaultLocationstring or null
comments[].defaultTextstringSafe HTML.
comments[].observationstringSafe HTML: what was seen.
comments[].implicationstringSafe HTML: why it matters.
comments[].recommendationstringSafe HTML: what to do.
comments[].recommendedTradestring or nullWho should do it ("Licensed plumber").
comments[].costLowCentsinteger or null
comments[].costHighCentsinteger or null
comments[].pricebookItemIdstring or null
comments[].inSummaryboolean
comments[].sortOrderinteger

Update a template item

PATCH /organizations/{organizationId}/service-report-templates/{templateId}/items/{itemId}

Renames, describes, limits statuses, sets what inspectors must describe (describeFields, replaces the list: key, label, type choice|multi|text|number, options, unit, required, help), or moves the item to another section of the template (sectionId, at its end). Reports already on jobs keep their copy. Returns the template.

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

Parameters

NameInTypeRequiredDescription
templateIdpathstringYes
itemIdpathstringYes

Request body

FieldTypeRequiredDescription
namestringNoUp to 200 characters.
descriptionstring or nullNoUp to 2000 characters.
allowedStatusesarray of stringNoUp to 12 items.
describeFieldsarray of objectNoWhat to describe on this item, in order: [{ key, label, type: choice|multi|text|number, options, unit, required, help, sortOrder }]. Replaces the list. Up to 40 items.
describeFields[].keystringYesStable key the answers are stored under (e.g. coveringType).
describeFields[].labelstringYesWhat the report prints (e.g. Roof covering). Up to 120 characters.
describeFields[].typeenumYeschoice: one of options; multi: any of options; text; number (with unit). One of choice, multi, text, number.
describeFields[].optionsarray of stringNoUp to 40 items. Default [].
describeFields[].unitstring or nullNonumber: the unit printed after it. Up to 20 characters.
describeFields[].requiredbooleanNoMust be answered before publishing (a blocking checklist item; "Publish anyway" acknowledges it). Default false.
describeFields[].helpstring or nullNoA hint for the inspector. Up to 500 characters.
describeFields[].sortOrderintegerNo0–10000. Default 0.
sectionIdstringNoMove to this section of the template.

Example

curl -X PATCH "https://app.servflo.ai/api/organizations/$ORGANIZATION_ID/service-report-templates/{templateId}/items/{itemId}" \
  -H "Authorization: Bearer $SERVFLO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"Dana Whitfield","description":"string","allowedStatuses":["string"]}'

Response

200: the answer's fields
FieldTypeDescription
idstring
namestring
tradeKeystring or null
documentLabelstringWhat the document is called (Inspection report, Test certificate …).
descriptionstring or null
presetKeystring or nullThe starter it was copied from.
baseTemplateIdstring or null
serviceTypeIdsarray of stringService types whose new jobs get this report.
archivedAtstring (date-time) or null
versioninteger
presetVersioninteger or nullThe starter content version it was copied from.
recommendedTradesarray of stringThe template's own list (empty = the defaults).
recommendedTradeOptionsarray of stringWho findings may recommend: the template's list, else ServFlo's defaults.
starterUpdateobject or null"New version available": the starter has newer content (copy it with createFromStarter, newVersion: true for an updated one). Null when current.
starterUpdate.presetKeystring
starterUpdate.namestring
starterUpdate.versioninteger
starterUpdate.reasonenumOne of replaced, updated.
statusesarray of objectItem statuses, in order (default IN, NI, NP, O).
statuses[].keystring
statuses[].labelstring
statuses[].colorstring
statuses[].needsReasonbooleanStatuses: an item with this status needs a reason (default for NI).
statuses[].reasonsarray of stringStatuses: the reason choices offered.
severitiesarray of objectFinding severities, most serious first.
severities[].keystring
severities[].labelstring
severities[].colorstring
severities[].needsReasonbooleanStatuses: an item with this status needs a reason (default for NI).
severities[].reasonsarray of stringStatuses: the reason choices offered.
designobjectBrand color, cover style, summary, contents, estimates, intro, disclaimer, footer, and the standards block (standardsTitle, standardsHtml).
createdAtstring (date-time)
updatedAtstring (date-time)
reportCountinteger
sectionsarray of object
sections[].idstring
sections[].namestring
sections[].iconstring or null
sections[].descriptionstring or null
sections[].sortOrderinteger
sections[].itemsarray of object
sections[].items[].idstring
sections[].items[].sectionIdstring
sections[].items[].namestring
sections[].items[].descriptionstring or null
sections[].items[].sortOrderinteger
sections[].items[].allowedStatusesarray of stringEmpty = every status.
sections[].items[].describeFieldsarray of objectWhat to describe on this item (copied into reports).
commentsarray of object
comments[].idstring
comments[].templateIdstring
comments[].itemIdsarray of stringTemplate items it is suggested for.
comments[].namestring
comments[].severitystring or null
comments[].isLimitationboolean
comments[].answerFormatstring
comments[].optionsarray of string
comments[].defaultLocationstring or null
comments[].defaultTextstringSafe HTML.
comments[].observationstringSafe HTML: what was seen.
comments[].implicationstringSafe HTML: why it matters.
comments[].recommendationstringSafe HTML: what to do.
comments[].recommendedTradestring or nullWho should do it ("Licensed plumber").
comments[].costLowCentsinteger or null
comments[].costHighCentsinteger or null
comments[].pricebookItemIdstring or null
comments[].inSummaryboolean
comments[].sortOrderinteger

Delete a template item

DELETE /organizations/{organizationId}/service-report-templates/{templateId}/items/{itemId}

Destructive: deletes the item from the template; comments lose its tag but stay in the library. Reports on jobs keep theirs.

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

Parameters

NameInTypeRequiredDescription
templateIdpathstringYes
itemIdpathstringYes

Example

curl -X DELETE "https://app.servflo.ai/api/organizations/$ORGANIZATION_ID/service-report-templates/{templateId}/items/{itemId}" \
  -H "Authorization: Bearer $SERVFLO_API_KEY"

Response

200: the answer's fields
FieldTypeDescription
idstring
namestring
tradeKeystring or null
documentLabelstringWhat the document is called (Inspection report, Test certificate …).
descriptionstring or null
presetKeystring or nullThe starter it was copied from.
baseTemplateIdstring or null
serviceTypeIdsarray of stringService types whose new jobs get this report.
archivedAtstring (date-time) or null
versioninteger
presetVersioninteger or nullThe starter content version it was copied from.
recommendedTradesarray of stringThe template's own list (empty = the defaults).
recommendedTradeOptionsarray of stringWho findings may recommend: the template's list, else ServFlo's defaults.
starterUpdateobject or null"New version available": the starter has newer content (copy it with createFromStarter, newVersion: true for an updated one). Null when current.
starterUpdate.presetKeystring
starterUpdate.namestring
starterUpdate.versioninteger
starterUpdate.reasonenumOne of replaced, updated.
statusesarray of objectItem statuses, in order (default IN, NI, NP, O).
statuses[].keystring
statuses[].labelstring
statuses[].colorstring
statuses[].needsReasonbooleanStatuses: an item with this status needs a reason (default for NI).
statuses[].reasonsarray of stringStatuses: the reason choices offered.
severitiesarray of objectFinding severities, most serious first.
severities[].keystring
severities[].labelstring
severities[].colorstring
severities[].needsReasonbooleanStatuses: an item with this status needs a reason (default for NI).
severities[].reasonsarray of stringStatuses: the reason choices offered.
designobjectBrand color, cover style, summary, contents, estimates, intro, disclaimer, footer, and the standards block (standardsTitle, standardsHtml).
createdAtstring (date-time)
updatedAtstring (date-time)
reportCountinteger
sectionsarray of object
sections[].idstring
sections[].namestring
sections[].iconstring or null
sections[].descriptionstring or null
sections[].sortOrderinteger
sections[].itemsarray of object
sections[].items[].idstring
sections[].items[].sectionIdstring
sections[].items[].namestring
sections[].items[].descriptionstring or null
sections[].items[].sortOrderinteger
sections[].items[].allowedStatusesarray of stringEmpty = every status.
sections[].items[].describeFieldsarray of objectWhat to describe on this item (copied into reports).
commentsarray of object
comments[].idstring
comments[].templateIdstring
comments[].itemIdsarray of stringTemplate items it is suggested for.
comments[].namestring
comments[].severitystring or null
comments[].isLimitationboolean
comments[].answerFormatstring
comments[].optionsarray of string
comments[].defaultLocationstring or null
comments[].defaultTextstringSafe HTML.
comments[].observationstringSafe HTML: what was seen.
comments[].implicationstringSafe HTML: why it matters.
comments[].recommendationstringSafe HTML: what to do.
comments[].recommendedTradestring or nullWho should do it ("Licensed plumber").
comments[].costLowCentsinteger or null
comments[].costHighCentsinteger or null
comments[].pricebookItemIdstring or null
comments[].inSummaryboolean
comments[].sortOrderinteger

Reorder a template section's items

POST

/organizations/{organizationId}/service-report-templates/{templateId}/sections/{sectionId}/items/reorder

Puts the section's items in the order of itemIds. Returns the template.

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

Parameters

NameInTypeRequiredDescription
templateIdpathstringYes
sectionIdpathstringYes

Request body

FieldTypeRequiredDescription
itemIdsarray of stringYesThe section's item ids in the new order. Up to 500 items.

Example

curl -X POST "https://app.servflo.ai/api/organizations/$ORGANIZATION_ID/service-report-templates/{templateId}/sections/{sectionId}/items/reorder" \
  -H "Authorization: Bearer $SERVFLO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"itemIds":["item_id"]}'

Response

200: the answer's fields
FieldTypeDescription
idstring
namestring
tradeKeystring or null
documentLabelstringWhat the document is called (Inspection report, Test certificate …).
descriptionstring or null
presetKeystring or nullThe starter it was copied from.
baseTemplateIdstring or null
serviceTypeIdsarray of stringService types whose new jobs get this report.
archivedAtstring (date-time) or null
versioninteger
presetVersioninteger or nullThe starter content version it was copied from.
recommendedTradesarray of stringThe template's own list (empty = the defaults).
recommendedTradeOptionsarray of stringWho findings may recommend: the template's list, else ServFlo's defaults.
starterUpdateobject or null"New version available": the starter has newer content (copy it with createFromStarter, newVersion: true for an updated one). Null when current.
starterUpdate.presetKeystring
starterUpdate.namestring
starterUpdate.versioninteger
starterUpdate.reasonenumOne of replaced, updated.
statusesarray of objectItem statuses, in order (default IN, NI, NP, O).
statuses[].keystring
statuses[].labelstring
statuses[].colorstring
statuses[].needsReasonbooleanStatuses: an item with this status needs a reason (default for NI).
statuses[].reasonsarray of stringStatuses: the reason choices offered.
severitiesarray of objectFinding severities, most serious first.
severities[].keystring
severities[].labelstring
severities[].colorstring
severities[].needsReasonbooleanStatuses: an item with this status needs a reason (default for NI).
severities[].reasonsarray of stringStatuses: the reason choices offered.
designobjectBrand color, cover style, summary, contents, estimates, intro, disclaimer, footer, and the standards block (standardsTitle, standardsHtml).
createdAtstring (date-time)
updatedAtstring (date-time)
reportCountinteger
sectionsarray of object
sections[].idstring
sections[].namestring
sections[].iconstring or null
sections[].descriptionstring or null
sections[].sortOrderinteger
sections[].itemsarray of object
sections[].items[].idstring
sections[].items[].sectionIdstring
sections[].items[].namestring
sections[].items[].descriptionstring or null
sections[].items[].sortOrderinteger
sections[].items[].allowedStatusesarray of stringEmpty = every status.
sections[].items[].describeFieldsarray of objectWhat to describe on this item (copied into reports).
commentsarray of object
comments[].idstring
comments[].templateIdstring
comments[].itemIdsarray of stringTemplate items it is suggested for.
comments[].namestring
comments[].severitystring or null
comments[].isLimitationboolean
comments[].answerFormatstring
comments[].optionsarray of string
comments[].defaultLocationstring or null
comments[].defaultTextstringSafe HTML.
comments[].observationstringSafe HTML: what was seen.
comments[].implicationstringSafe HTML: why it matters.
comments[].recommendationstringSafe HTML: what to do.
comments[].recommendedTradestring or nullWho should do it ("Licensed plumber").
comments[].costLowCentsinteger or null
comments[].costHighCentsinteger or null
comments[].pricebookItemIdstring or null
comments[].inSummaryboolean
comments[].sortOrderinteger

Duplicate a template item

POST

/organizations/{organizationId}/service-report-templates/{templateId}/items/{itemId}/duplicate

Copies the item right after it (its comments are tagged to the copy too). Returns the template.

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

Parameters

NameInTypeRequiredDescription
templateIdpathstringYes
itemIdpathstringYes

Example

curl -X POST "https://app.servflo.ai/api/organizations/$ORGANIZATION_ID/service-report-templates/{templateId}/items/{itemId}/duplicate" \
  -H "Authorization: Bearer $SERVFLO_API_KEY"

Response

201: the answer's fields
FieldTypeDescription
idstring
namestring
tradeKeystring or null
documentLabelstringWhat the document is called (Inspection report, Test certificate …).
descriptionstring or null
presetKeystring or nullThe starter it was copied from.
baseTemplateIdstring or null
serviceTypeIdsarray of stringService types whose new jobs get this report.
archivedAtstring (date-time) or null
versioninteger
presetVersioninteger or nullThe starter content version it was copied from.
recommendedTradesarray of stringThe template's own list (empty = the defaults).
recommendedTradeOptionsarray of stringWho findings may recommend: the template's list, else ServFlo's defaults.
starterUpdateobject or null"New version available": the starter has newer content (copy it with createFromStarter, newVersion: true for an updated one). Null when current.
starterUpdate.presetKeystring
starterUpdate.namestring
starterUpdate.versioninteger
starterUpdate.reasonenumOne of replaced, updated.
statusesarray of objectItem statuses, in order (default IN, NI, NP, O).
statuses[].keystring
statuses[].labelstring
statuses[].colorstring
statuses[].needsReasonbooleanStatuses: an item with this status needs a reason (default for NI).
statuses[].reasonsarray of stringStatuses: the reason choices offered.
severitiesarray of objectFinding severities, most serious first.
severities[].keystring
severities[].labelstring
severities[].colorstring
severities[].needsReasonbooleanStatuses: an item with this status needs a reason (default for NI).
severities[].reasonsarray of stringStatuses: the reason choices offered.
designobjectBrand color, cover style, summary, contents, estimates, intro, disclaimer, footer, and the standards block (standardsTitle, standardsHtml).
createdAtstring (date-time)
updatedAtstring (date-time)
reportCountinteger
sectionsarray of object
sections[].idstring
sections[].namestring
sections[].iconstring or null
sections[].descriptionstring or null
sections[].sortOrderinteger
sections[].itemsarray of object
sections[].items[].idstring
sections[].items[].sectionIdstring
sections[].items[].namestring
sections[].items[].descriptionstring or null
sections[].items[].sortOrderinteger
sections[].items[].allowedStatusesarray of stringEmpty = every status.
sections[].items[].describeFieldsarray of objectWhat to describe on this item (copied into reports).
commentsarray of object
comments[].idstring
comments[].templateIdstring
comments[].itemIdsarray of stringTemplate items it is suggested for.
comments[].namestring
comments[].severitystring or null
comments[].isLimitationboolean
comments[].answerFormatstring
comments[].optionsarray of string
comments[].defaultLocationstring or null
comments[].defaultTextstringSafe HTML.
comments[].observationstringSafe HTML: what was seen.
comments[].implicationstringSafe HTML: why it matters.
comments[].recommendationstringSafe HTML: what to do.
comments[].recommendedTradestring or nullWho should do it ("Licensed plumber").
comments[].costLowCentsinteger or null
comments[].costHighCentsinteger or null
comments[].pricebookItemIdstring or null
comments[].inSummaryboolean
comments[].sortOrderinteger

Add a comment to the library

POST /organizations/{organizationId}/service-report-templates/{templateId}/comments

A canned finding in the template's comment library: name, severity (or none = informational), limitation flag, answer format and options, default location and text, an optional repair cost range or pricebook item, and the items it is suggested for (itemIds). Text is sanitized. Returns the comment.

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

Parameters

NameInTypeRequiredDescription
templateIdpathstringYes

Request body

FieldTypeRequiredDescription
namestringYesUp to 200 characters.
itemIdsarray of stringNoTemplate items it is suggested for. Up to 500 items.
severitystring or nullNoA severity key of the template / report (default safety, repair, monitor, maintenance, info); null = informational. Up to 24 characters.
isLimitationbooleanNoSays what could not be checked (listed apart from problems).
answerFormatenumNoCHECKBOX (one of options), MULTI (any of options), NUMBER (options[0] is the unit) or TEXT. One of CHECKBOX, MULTI, NUMBER, TEXT.
optionsarray of stringNoUp to 30 items.
defaultLocationstring or nullNoUp to 200 characters.
defaultTextstring or nullNoRich text as HTML: p, br, strong/b, em/i, u, ul/ol/li, h3/h4, blockquote, a href (http/https/mailto/tel). Anything else is removed on save.
observationstring or nullNoWhat was seen (safe HTML). With any of the three parts set, they print instead of text.
implicationstring or nullNoWhy it matters (safe HTML).
recommendationstring or nullNoWhat to do next (safe HTML).
recommendedTradestring or nullNoWho should do it: usually one of the template's recommendedTradeOptions ("Licensed electrician", "Structural engineer" …). Up to 120 characters.
costLowCentsinteger or nullNo0–100000000.
costHighCentsinteger or nullNo0–100000000.
pricebookItemIdstring or nullNo
inSummarybooleanNo
sortOrderintegerNo0–100000.

Example

curl -X POST "https://app.servflo.ai/api/organizations/$ORGANIZATION_ID/service-report-templates/{templateId}/comments" \
  -H "Authorization: Bearer $SERVFLO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"Dana Whitfield"}'

Response

201: the answer's fields
FieldTypeDescription
idstring
templateIdstring
itemIdsarray of stringTemplate items it is suggested for.
namestring
severitystring or null
isLimitationboolean
answerFormatstring
optionsarray of string
defaultLocationstring or null
defaultTextstringSafe HTML.
observationstringSafe HTML: what was seen.
implicationstringSafe HTML: why it matters.
recommendationstringSafe HTML: what to do.
recommendedTradestring or nullWho should do it ("Licensed plumber").
costLowCentsinteger or null
costHighCentsinteger or null
pricebookItemIdstring or null
inSummaryboolean
sortOrderinteger

Update a library comment

PATCH

/organizations/{organizationId}/service-report-templates/{templateId}/comments/{commentId}

Changes the fields sent (itemIds replaces the tags). Findings already made from it keep their own text. Returns the comment.

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

Parameters

NameInTypeRequiredDescription
templateIdpathstringYes
commentIdpathstringYes

Request body

FieldTypeRequiredDescription
namestringNoUp to 200 characters.
itemIdsarray of stringNoTemplate items it is suggested for (replaces). Up to 500 items.
severitystring or nullNoA severity key of the template / report (default safety, repair, monitor, maintenance, info); null = informational. Up to 24 characters.
isLimitationbooleanNo
answerFormatenumNoCHECKBOX (one of options), MULTI (any of options), NUMBER (options[0] is the unit) or TEXT. One of CHECKBOX, MULTI, NUMBER, TEXT.
optionsarray of stringNoUp to 30 items.
defaultLocationstring or nullNoUp to 200 characters.
defaultTextstring or nullNoRich text as HTML: p, br, strong/b, em/i, u, ul/ol/li, h3/h4, blockquote, a href (http/https/mailto/tel). Anything else is removed on save.
observationstring or nullNoWhat was seen (safe HTML). With any of the three parts set, they print instead of text.
implicationstring or nullNoWhy it matters (safe HTML).
recommendationstring or nullNoWhat to do next (safe HTML).
recommendedTradestring or nullNoWho should do it: usually one of the template's recommendedTradeOptions ("Licensed electrician", "Structural engineer" …). Up to 120 characters.
costLowCentsinteger or nullNo0–100000000.
costHighCentsinteger or nullNo0–100000000.
pricebookItemIdstring or nullNo
inSummarybooleanNo
sortOrderintegerNo0–100000.

Example

curl -X PATCH "https://app.servflo.ai/api/organizations/$ORGANIZATION_ID/service-report-templates/{templateId}/comments/{commentId}" \
  -H "Authorization: Bearer $SERVFLO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"Dana Whitfield","itemIds":["item_id"],"severity":"string"}'

Response

200: the answer's fields
FieldTypeDescription
idstring
templateIdstring
itemIdsarray of stringTemplate items it is suggested for.
namestring
severitystring or null
isLimitationboolean
answerFormatstring
optionsarray of string
defaultLocationstring or null
defaultTextstringSafe HTML.
observationstringSafe HTML: what was seen.
implicationstringSafe HTML: why it matters.
recommendationstringSafe HTML: what to do.
recommendedTradestring or nullWho should do it ("Licensed plumber").
costLowCentsinteger or null
costHighCentsinteger or null
pricebookItemIdstring or null
inSummaryboolean
sortOrderinteger

Delete a library comment

DELETE

/organizations/{organizationId}/service-report-templates/{templateId}/comments/{commentId}

Destructive: removes the comment from the library. Findings already made from it stay as they are.

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

Parameters

NameInTypeRequiredDescription
templateIdpathstringYes
commentIdpathstringYes

Example

curl -X DELETE "https://app.servflo.ai/api/organizations/$ORGANIZATION_ID/service-report-templates/{templateId}/comments/{commentId}" \
  -H "Authorization: Bearer $SERVFLO_API_KEY"

Response

200: the answer's fields
FieldTypeDescription
oktrue

Duplicate a library comment

POST

/organizations/{organizationId}/service-report-templates/{templateId}/comments/{commentId}/duplicate

Copies the comment (named “… (copy)”) with the same tags. Returns the copy.

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

Parameters

NameInTypeRequiredDescription
templateIdpathstringYes
commentIdpathstringYes

Example

curl -X POST "https://app.servflo.ai/api/organizations/$ORGANIZATION_ID/service-report-templates/{templateId}/comments/{commentId}/duplicate" \
  -H "Authorization: Bearer $SERVFLO_API_KEY"

Response

201: the answer's fields
FieldTypeDescription
idstring
templateIdstring
itemIdsarray of stringTemplate items it is suggested for.
namestring
severitystring or null
isLimitationboolean
answerFormatstring
optionsarray of string
defaultLocationstring or null
defaultTextstringSafe HTML.
observationstringSafe HTML: what was seen.
implicationstringSafe HTML: why it matters.
recommendationstringSafe HTML: what to do.
recommendedTradestring or nullWho should do it ("Licensed plumber").
costLowCentsinteger or null
costHighCentsinteger or null
pricebookItemIdstring or null
inSummaryboolean
sortOrderinteger

Reorder library comments

POST /organizations/{organizationId}/service-report-templates/{templateId}/comments/reorder

Puts the named library comments in the order of commentIds. They take the places they held in the library, so ordering one item's comments (the ones tagged to it, from GET the template) leaves every other comment where it was. The writer suggests an item's comments in this order. Returns the template.

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

Parameters

NameInTypeRequiredDescription
templateIdpathstringYes

Request body

FieldTypeRequiredDescription
commentIdsarray of stringYesThe library comments in their new order (e.g. one item's). Up to 500 items.

Example

curl -X POST "https://app.servflo.ai/api/organizations/$ORGANIZATION_ID/service-report-templates/{templateId}/comments/reorder" \
  -H "Authorization: Bearer $SERVFLO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"commentIds":["comment_id"]}'

Response

200: the answer's fields
FieldTypeDescription
idstring
namestring
tradeKeystring or null
documentLabelstringWhat the document is called (Inspection report, Test certificate …).
descriptionstring or null
presetKeystring or nullThe starter it was copied from.
baseTemplateIdstring or null
serviceTypeIdsarray of stringService types whose new jobs get this report.
archivedAtstring (date-time) or null
versioninteger
presetVersioninteger or nullThe starter content version it was copied from.
recommendedTradesarray of stringThe template's own list (empty = the defaults).
recommendedTradeOptionsarray of stringWho findings may recommend: the template's list, else ServFlo's defaults.
starterUpdateobject or null"New version available": the starter has newer content (copy it with createFromStarter, newVersion: true for an updated one). Null when current.
starterUpdate.presetKeystring
starterUpdate.namestring
starterUpdate.versioninteger
starterUpdate.reasonenumOne of replaced, updated.
statusesarray of objectItem statuses, in order (default IN, NI, NP, O).
statuses[].keystring
statuses[].labelstring
statuses[].colorstring
statuses[].needsReasonbooleanStatuses: an item with this status needs a reason (default for NI).
statuses[].reasonsarray of stringStatuses: the reason choices offered.
severitiesarray of objectFinding severities, most serious first.
severities[].keystring
severities[].labelstring
severities[].colorstring
severities[].needsReasonbooleanStatuses: an item with this status needs a reason (default for NI).
severities[].reasonsarray of stringStatuses: the reason choices offered.
designobjectBrand color, cover style, summary, contents, estimates, intro, disclaimer, footer, and the standards block (standardsTitle, standardsHtml).
createdAtstring (date-time)
updatedAtstring (date-time)
reportCountinteger
sectionsarray of object
sections[].idstring
sections[].namestring
sections[].iconstring or null
sections[].descriptionstring or null
sections[].sortOrderinteger
sections[].itemsarray of object
sections[].items[].idstring
sections[].items[].sectionIdstring
sections[].items[].namestring
sections[].items[].descriptionstring or null
sections[].items[].sortOrderinteger
sections[].items[].allowedStatusesarray of stringEmpty = every status.
sections[].items[].describeFieldsarray of objectWhat to describe on this item (copied into reports).
commentsarray of object
comments[].idstring
comments[].templateIdstring
comments[].itemIdsarray of stringTemplate items it is suggested for.
comments[].namestring
comments[].severitystring or null
comments[].isLimitationboolean
comments[].answerFormatstring
comments[].optionsarray of string
comments[].defaultLocationstring or null
comments[].defaultTextstringSafe HTML.
comments[].observationstringSafe HTML: what was seen.
comments[].implicationstringSafe HTML: why it matters.
comments[].recommendationstringSafe HTML: what to do.
comments[].recommendedTradestring or nullWho should do it ("Licensed plumber").
comments[].costLowCentsinteger or null
comments[].costHighCentsinteger or null
comments[].pricebookItemIdstring or null
comments[].inSummaryboolean
comments[].sortOrderinteger

Search the comment library

GET /organizations/{organizationId}/service-report-comments

One library, searched first: comments whose name, text or location contain every word of query, across the business's live templates (or one, templateId), optionally by severity; with itemId (a template item) the ones tagged to it come first. Use a result's id as commentId when adding a finding. Read-only.

PermissionserviceReports.read (Owner, Admin, Dispatcher, Technician, Member)
Riskread, OAuth scope servflo.read. Read: reads only.
MCP toolserviceReportTemplates_searchComments (toolset serviceReports)

Parameters

NameInTypeRequiredDescription
queryquerystringNoUp to 200 characters.
templateIdquerystringNo
itemIdquerystringNoA template item: comments tagged to it first.
severityquerystringNoUp to 24 characters.
limitqueryintegerNo1–200.

Example

curl "https://app.servflo.ai/api/organizations/$ORGANIZATION_ID/service-report-comments" \
  -H "Authorization: Bearer $SERVFLO_API_KEY"

Response

200: the answer's fields

An array of objects:

FieldTypeDescription
idstring
templateIdstring
itemIdsarray of stringTemplate items it is suggested for.
namestring
severitystring or null
isLimitationboolean
answerFormatstring
optionsarray of string
defaultLocationstring or null
defaultTextstringSafe HTML.
observationstringSafe HTML: what was seen.
implicationstringSafe HTML: why it matters.
recommendationstringSafe HTML: what to do.
recommendedTradestring or nullWho should do it ("Licensed plumber").
costLowCentsinteger or null
costHighCentsinteger or null
pricebookItemIdstring or null
inSummaryboolean
sortOrderinteger
templateNamestring
taggedToItemboolean

POST /organizations/{organizationId}/service-report-templates/{templateId}/service-types

Links (linked: true) or unlinks a template and a service type: new jobs of that type (and jobs changed to it) get a report from the template automatically. Idempotent. Returns the template.

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

Parameters

NameInTypeRequiredDescription
templateIdpathstringYes

Request body

FieldTypeRequiredDescription
serviceTypeIdstringYesA service type (GET /service-types).
linkedbooleanYes

Example

curl -X POST "https://app.servflo.ai/api/organizations/$ORGANIZATION_ID/service-report-templates/{templateId}/service-types" \
  -H "Authorization: Bearer $SERVFLO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"serviceTypeId":"serviceType_id","linked":true}'

Response

200: the answer's fields
FieldTypeDescription
idstring
serviceTypeIdsarray of string

Add an extra section to a template

POST /organizations/{organizationId}/service-report-templates/{templateId}/extra-sections

Adds a section from the extra-section catalog (GET /service-report-extra-sections: detached-garage, outbuilding, well, septic, pool-spa, lawn-sprinklers, solar, radon, sewer-scope) to a template in one call: its items with their describe fields and their library comments. Reports already on jobs are not changed. Idempotent on the section's name: adding it again only fills in what is missing (created: false). Returns the new section's id and the template.

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

Parameters

NameInTypeRequiredDescription
templateIdpathstringYes

Request body

FieldTypeRequiredDescription
keystringYesThe extra section's key. Up to 60 characters.

Example

curl -X POST "https://app.servflo.ai/api/organizations/$ORGANIZATION_ID/service-report-templates/{templateId}/extra-sections" \
  -H "Authorization: Bearer $SERVFLO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"key":"string"}'

Response

201: the answer's fields
FieldTypeDescription
createdbooleanFalse when the template already had a section of that name.
sectionIdstringThe template section the catalog section became.
templateobject
template.idstring
template.namestring
template.tradeKeystring or null
template.documentLabelstringWhat the document is called (Inspection report, Test certificate …).
template.descriptionstring or null
template.presetKeystring or nullThe starter it was copied from.
template.baseTemplateIdstring or null
template.serviceTypeIdsarray of stringService types whose new jobs get this report.
template.archivedAtstring (date-time) or null
template.versioninteger
template.presetVersioninteger or nullThe starter content version it was copied from.
template.recommendedTradesarray of stringThe template's own list (empty = the defaults).
template.recommendedTradeOptionsarray of stringWho findings may recommend: the template's list, else ServFlo's defaults.
template.starterUpdateobject or null"New version available": the starter has newer content (copy it with createFromStarter, newVersion: true for an updated one). Null when current.
template.starterUpdate.presetKeystring
template.starterUpdate.namestring
template.starterUpdate.versioninteger
template.starterUpdate.reasonenumOne of replaced, updated.
template.statusesarray of objectItem statuses, in order (default IN, NI, NP, O).
template.statuses[].keystring
template.statuses[].labelstring
template.statuses[].colorstring
template.statuses[].needsReasonbooleanStatuses: an item with this status needs a reason (default for NI).
template.statuses[].reasonsarray of stringStatuses: the reason choices offered.
template.severitiesarray of objectFinding severities, most serious first.
template.severities[].keystring
template.severities[].labelstring
template.severities[].colorstring
template.severities[].needsReasonbooleanStatuses: an item with this status needs a reason (default for NI).
template.severities[].reasonsarray of stringStatuses: the reason choices offered.
template.designobjectBrand color, cover style, summary, contents, estimates, intro, disclaimer, footer, and the standards block (standardsTitle, standardsHtml).
template.createdAtstring (date-time)
template.updatedAtstring (date-time)
template.reportCountinteger
template.sectionsarray of object
template.sections[].idstring
template.sections[].namestring
template.sections[].iconstring or null
template.sections[].descriptionstring or null
template.sections[].sortOrderinteger
template.sections[].itemsarray of object
template.commentsarray of object
template.comments[].idstring
template.comments[].templateIdstring
template.comments[].itemIdsarray of stringTemplate items it is suggested for.
template.comments[].namestring
template.comments[].severitystring or null
template.comments[].isLimitationboolean
template.comments[].answerFormatstring
template.comments[].optionsarray of string
template.comments[].defaultLocationstring or null
template.comments[].defaultTextstringSafe HTML.
template.comments[].observationstringSafe HTML: what was seen.
template.comments[].implicationstringSafe HTML: why it matters.
template.comments[].recommendationstringSafe HTML: what to do.
template.comments[].recommendedTradestring or nullWho should do it ("Licensed plumber").
template.comments[].costLowCentsinteger or null
template.comments[].costHighCentsinteger or null
template.comments[].pricebookItemIdstring or null
template.comments[].inSummaryboolean
template.comments[].sortOrderinteger

Draft a library comment with AI

POST /organizations/{organizationId}/service-report-templates/{templateId}/draft-comment

Claude drafts a reusable library comment from a few words (and the template item, itemId): name, severity, observation, implication, recommendation, recommended trade and whether it is a limitation, in fresh wording. Not saved: pass the fields to createComment. Uses AI credits; source NONE when AI is off.

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

Parameters

NameInTypeRequiredDescription
templateIdpathstringYes

Request body

FieldTypeRequiredDescription
itemIdstring or nullNoA template item it is for.
wordsstringYesA few words ("double tapped breaker"). Up to 500 characters.

Example

curl -X POST "https://app.servflo.ai/api/organizations/$ORGANIZATION_ID/service-report-templates/{templateId}/draft-comment" \
  -H "Authorization: Bearer $SERVFLO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"words":"string"}'

Response

200: the answer's fields
FieldTypeDescription
namestring or null
severitystring or null
observationstring
implicationstring
recommendationstring
recommendedTradestring or null
isLimitationboolean
sourceenumOne of AI, FAKE, NONE, TEMPLATE.

Template drafts from standards documents

GET /organizations/{organizationId}/service-report-template-imports

The business's templates being drafted from its own standards documents (newest first): status, progress, counts, credits. Read-only.

PermissionserviceReports.manage (Owner, Admin)
Riskread, OAuth scope servflo.read. Read: reads only.
MCP toolserviceReportTemplates_importList (toolset serviceReports)

Example

curl "https://app.servflo.ai/api/organizations/$ORGANIZATION_ID/service-report-template-imports" \
  -H "Authorization: Bearer $SERVFLO_API_KEY"

Response

200: the answer's fields

An array of objects:

FieldTypeDescription
idstring
namestring
documentLabelstring
tradeKeystring or null
partsarray of string
fileNamestring
contentTypestring
sizeBytesinteger
pagesinteger or null
pagesEstimatedbooleanWord files: pages are estimated (about 3,000 characters each).
statusenumUPLOADING → UPLOADED (estimate shown) → QUEUED → READING → REVIEW → SAVED; FAILED can be started again (it resumes). One of UPLOADING, UPLOADED, QUEUED, READING, REVIEW, SAVING, SAVED, FAILED.
progressobject{ stage: queued|outline|drafting|done|failed, done, total, counts }.
estimatedCreditsinteger or null
estimateobjectAbout how many AI credits reading this document uses.
estimate.creditsinteger
estimate.modelstring
creditsUsedinteger
errorstring or null
templateIdstring or nullThe template made from it (SAVED).
countsobject
counts.sectionsinteger
counts.itemsinteger
counts.fieldsinteger
counts.commentsinteger
counts.limitationsinteger
counts.acceptedinteger
counts.removedinteger
counts.pendinginteger
draftobjectThe drafted content: sections → items (describe fields, comments with narratives and severity), statuses, limitations; every element has an id, a citation { page, section, quote } and a decision.
draft.sectionsarray of object
draft.sections[].idstring
draft.sections[].namestring
draft.sections[].citationobject or null
draft.sections[].decisionenumOne of pending, accepted, removed.
draft.sections[].itemsarray of object
fileUrlstring or nullA 10-minute link to the source document.
createdAtstring (date-time)
finishedAtstring (date-time) or null

Start a template from a standards document (one call)

POST /organizations/{organizationId}/service-report-template-imports

Uploads a PDF or Word (.docx) standards document in one call (base64 or a public URL, up to 10 MB and 200 pages) with the template's name, report label, trade and what to draft, and returns the draft with its credit estimate. With start: true the AI starts reading it at once (uses AI credits; 402 when the estimate is more than the business has). Poll GET …/{draftId} for progress; the person who started it is notified when it is ready to review. The document stays private to the business.

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

Request body

FieldTypeRequiredDescription
namestringYesThe template's name. Up to 200 characters.
documentLabelstringNoWhat the report is called ("Inspection report"). Up to 120 characters.
tradeKeystring or nullNoThe trade (home-inspection, hvac, electrical …): its statuses and trades are used. Up to 60 characters.
partsarray of enumNoWhat to draft: sections, describe, comments, limitations, statuses (default all).
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.
startbooleanNoStart reading it now (uses AI credits).

Example

curl -X POST "https://app.servflo.ai/api/organizations/$ORGANIZATION_ID/service-report-template-imports" \
  -H "Authorization: Bearer $SERVFLO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"Dana Whitfield"}'

Response

201: the answer's fields
FieldTypeDescription
idstring
namestring
documentLabelstring
tradeKeystring or null
partsarray of string
fileNamestring
contentTypestring
sizeBytesinteger
pagesinteger or null
pagesEstimatedbooleanWord files: pages are estimated (about 3,000 characters each).
statusenumUPLOADING → UPLOADED (estimate shown) → QUEUED → READING → REVIEW → SAVED; FAILED can be started again (it resumes). One of UPLOADING, UPLOADED, QUEUED, READING, REVIEW, SAVING, SAVED, FAILED.
progressobject{ stage: queued|outline|drafting|done|failed, done, total, counts }.
estimatedCreditsinteger or null
estimateobjectAbout how many AI credits reading this document uses.
estimate.creditsinteger
estimate.modelstring
creditsUsedinteger
errorstring or null
templateIdstring or nullThe template made from it (SAVED).
countsobject
counts.sectionsinteger
counts.itemsinteger
counts.fieldsinteger
counts.commentsinteger
counts.limitationsinteger
counts.acceptedinteger
counts.removedinteger
counts.pendinginteger
draftobjectThe drafted content: sections → items (describe fields, comments with narratives and severity), statuses, limitations; every element has an id, a citation { page, section, quote } and a decision.
draft.sectionsarray of object
draft.sections[].idstring
draft.sections[].namestring
draft.sections[].citationobject or null
draft.sections[].decisionenumOne of pending, accepted, removed.
draft.sections[].itemsarray of object
fileUrlstring or nullA 10-minute link to the source document.
createdAtstring (date-time)
finishedAtstring (date-time) or null

A template draft from a standards document

GET /organizations/{organizationId}/service-report-template-imports/{draftId}

One draft: progress while it is read, then the drafted sections, items, describe fields, comments, statuses and limitations, each with its citation (page and a short quote of the source) and review decision; counts; a 10-minute link to the source file. Read-only.

PermissionserviceReports.manage (Owner, Admin)
Riskread, OAuth scope servflo.read. Read: reads only.
MCP toolserviceReportTemplates_importGet (toolset serviceReports)

Parameters

NameInTypeRequiredDescription
draftIdpathstringYesA template draft (GET /service-report-template-imports).

Example

curl "https://app.servflo.ai/api/organizations/$ORGANIZATION_ID/service-report-template-imports/{draftId}" \
  -H "Authorization: Bearer $SERVFLO_API_KEY"

Response

200: the answer's fields
FieldTypeDescription
idstring
namestring
documentLabelstring
tradeKeystring or null
partsarray of string
fileNamestring
contentTypestring
sizeBytesinteger
pagesinteger or null
pagesEstimatedbooleanWord files: pages are estimated (about 3,000 characters each).
statusenumUPLOADING → UPLOADED (estimate shown) → QUEUED → READING → REVIEW → SAVED; FAILED can be started again (it resumes). One of UPLOADING, UPLOADED, QUEUED, READING, REVIEW, SAVING, SAVED, FAILED.
progressobject{ stage: queued|outline|drafting|done|failed, done, total, counts }.
estimatedCreditsinteger or null
estimateobjectAbout how many AI credits reading this document uses.
estimate.creditsinteger
estimate.modelstring
creditsUsedinteger
errorstring or null
templateIdstring or nullThe template made from it (SAVED).
countsobject
counts.sectionsinteger
counts.itemsinteger
counts.fieldsinteger
counts.commentsinteger
counts.limitationsinteger
counts.acceptedinteger
counts.removedinteger
counts.pendinginteger
draftobjectThe drafted content: sections → items (describe fields, comments with narratives and severity), statuses, limitations; every element has an id, a citation { page, section, quote } and a decision.
draft.sectionsarray of object
draft.sections[].idstring
draft.sections[].namestring
draft.sections[].citationobject or null
draft.sections[].decisionenumOne of pending, accepted, removed.
draft.sections[].itemsarray of object
fileUrlstring or nullA 10-minute link to the source document.
createdAtstring (date-time)
finishedAtstring (date-time) or null

Rename a template draft

PATCH /organizations/{organizationId}/service-report-template-imports/{draftId}

Changes the name, report label or trade the template will be saved with (and, before reading starts, what to draft). Not after it was saved.

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

Parameters

NameInTypeRequiredDescription
draftIdpathstringYesA template draft (GET /service-report-template-imports).

Request body

FieldTypeRequiredDescription
namestringNoUp to 200 characters.
documentLabelstringNoUp to 120 characters.
tradeKeystring or nullNoUp to 60 characters.
partsarray of enumNoWhat to draft (only before it starts reading).

Example

curl -X PATCH "https://app.servflo.ai/api/organizations/$ORGANIZATION_ID/service-report-template-imports/{draftId}" \
  -H "Authorization: Bearer $SERVFLO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"Dana Whitfield","documentLabel":"string","tradeKey":"string"}'

Response

200: the answer's fields
FieldTypeDescription
idstring
namestring
documentLabelstring
tradeKeystring or null
partsarray of string
fileNamestring
contentTypestring
sizeBytesinteger
pagesinteger or null
pagesEstimatedbooleanWord files: pages are estimated (about 3,000 characters each).
statusenumUPLOADING → UPLOADED (estimate shown) → QUEUED → READING → REVIEW → SAVED; FAILED can be started again (it resumes). One of UPLOADING, UPLOADED, QUEUED, READING, REVIEW, SAVING, SAVED, FAILED.
progressobject{ stage: queued|outline|drafting|done|failed, done, total, counts }.
estimatedCreditsinteger or null
estimateobjectAbout how many AI credits reading this document uses.
estimate.creditsinteger
estimate.modelstring
creditsUsedinteger
errorstring or null
templateIdstring or nullThe template made from it (SAVED).
countsobject
counts.sectionsinteger
counts.itemsinteger
counts.fieldsinteger
counts.commentsinteger
counts.limitationsinteger
counts.acceptedinteger
counts.removedinteger
counts.pendinginteger
draftobjectThe drafted content: sections → items (describe fields, comments with narratives and severity), statuses, limitations; every element has an id, a citation { page, section, quote } and a decision.
draft.sectionsarray of object
draft.sections[].idstring
draft.sections[].namestring
draft.sections[].citationobject or null
draft.sections[].decisionenumOne of pending, accepted, removed.
draft.sections[].itemsarray of object
fileUrlstring or nullA 10-minute link to the source document.
createdAtstring (date-time)
finishedAtstring (date-time) or null

Delete a template draft

DELETE /organizations/{organizationId}/service-report-template-imports/{draftId}

Destructive: deletes the draft and its uploaded document (a template already saved from it stays). Cannot be undone.

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

Parameters

NameInTypeRequiredDescription
draftIdpathstringYesA template draft (GET /service-report-template-imports).

Example

curl -X DELETE "https://app.servflo.ai/api/organizations/$ORGANIZATION_ID/service-report-template-imports/{draftId}" \
  -H "Authorization: Bearer $SERVFLO_API_KEY"

Response

200: the answer's fields
FieldTypeDescription
idstring
deletedboolean

Start a template from a standards document (upload URL)

POST /organizations/{organizationId}/service-report-template-imports/upload-url

Step 1 of the browser upload: records the draft (name, report label, trade, what to draft) and returns a signed URL to PUT the PDF or Word file to (5 minutes; up to 20 MB and 200 pages). Then call …/{draftId}/confirm-upload, then …/{draftId}/start. API and AI callers: use POST /service-report-template-imports with the file instead. The document stays private to the business.

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

Request body

FieldTypeRequiredDescription
namestringYesThe template's name. Up to 200 characters.
documentLabelstringNoWhat the report is called ("Inspection report"). Up to 120 characters.
tradeKeystring or nullNoThe trade (home-inspection, hvac, electrical …): its statuses and trades are used. Up to 60 characters.
partsarray of enumNoWhat to draft: sections, describe, comments, limitations, statuses (default all).
fileNamestringYesUp to 300 characters.
contentTypeenumYesOne of application/pdf, application/vnd.openxmlformats-officedocument.wordprocessingml.document.
sizeBytesintegerYes1–20971520.

Example

curl -X POST "https://app.servflo.ai/api/organizations/$ORGANIZATION_ID/service-report-template-imports/upload-url" \
  -H "Authorization: Bearer $SERVFLO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"Dana Whitfield","fileName":"string","contentType":"application/pdf","sizeBytes":1}'

Response

201: the answer's fields
FieldTypeDescription
draftobject
draft.idstring
draft.namestring
draft.documentLabelstring
draft.tradeKeystring or null
draft.partsarray of string
draft.fileNamestring
draft.contentTypestring
draft.sizeBytesinteger
draft.pagesinteger or null
draft.pagesEstimatedbooleanWord files: pages are estimated (about 3,000 characters each).
draft.statusenumUPLOADING → UPLOADED (estimate shown) → QUEUED → READING → REVIEW → SAVED; FAILED can be started again (it resumes). One of UPLOADING, UPLOADED, QUEUED, READING, REVIEW, SAVING, SAVED, FAILED.
draft.progressobject{ stage: queued|outline|drafting|done|failed, done, total, counts }.
draft.estimatedCreditsinteger or null
draft.estimateobjectAbout how many AI credits reading this document uses.
draft.estimate.creditsinteger
draft.estimate.modelstring
draft.creditsUsedinteger
draft.errorstring or null
draft.templateIdstring or nullThe template made from it (SAVED).
draft.countsobject
draft.counts.sectionsinteger
draft.counts.itemsinteger
draft.counts.fieldsinteger
draft.counts.commentsinteger
draft.counts.limitationsinteger
draft.counts.acceptedinteger
draft.counts.removedinteger
draft.counts.pendinginteger
draft.draftobjectThe drafted content: sections → items (describe fields, comments with narratives and severity), statuses, limitations; every element has an id, a citation { page, section, quote } and a decision.
draft.draft.sectionsarray of object
draft.fileUrlstring or nullA 10-minute link to the source document.
draft.createdAtstring (date-time)
draft.finishedAtstring (date-time) or null
uploadUrlstring

Confirm a standards document upload

POST /organizations/{organizationId}/service-report-template-imports/{draftId}/confirm-upload

Step 2: the browser finished the PUT. The pages are counted (refused over 200) and the credit estimate is returned (estimate). Then call …/start.

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

Parameters

NameInTypeRequiredDescription
draftIdpathstringYesA template draft (GET /service-report-template-imports).

Example

curl -X POST "https://app.servflo.ai/api/organizations/$ORGANIZATION_ID/service-report-template-imports/{draftId}/confirm-upload" \
  -H "Authorization: Bearer $SERVFLO_API_KEY"

Response

200: the answer's fields
FieldTypeDescription
idstring
namestring
documentLabelstring
tradeKeystring or null
partsarray of string
fileNamestring
contentTypestring
sizeBytesinteger
pagesinteger or null
pagesEstimatedbooleanWord files: pages are estimated (about 3,000 characters each).
statusenumUPLOADING → UPLOADED (estimate shown) → QUEUED → READING → REVIEW → SAVED; FAILED can be started again (it resumes). One of UPLOADING, UPLOADED, QUEUED, READING, REVIEW, SAVING, SAVED, FAILED.
progressobject{ stage: queued|outline|drafting|done|failed, done, total, counts }.
estimatedCreditsinteger or null
estimateobjectAbout how many AI credits reading this document uses.
estimate.creditsinteger
estimate.modelstring
creditsUsedinteger
errorstring or null
templateIdstring or nullThe template made from it (SAVED).
countsobject
counts.sectionsinteger
counts.itemsinteger
counts.fieldsinteger
counts.commentsinteger
counts.limitationsinteger
counts.acceptedinteger
counts.removedinteger
counts.pendinginteger
draftobjectThe drafted content: sections → items (describe fields, comments with narratives and severity), statuses, limitations; every element has an id, a citation { page, section, quote } and a decision.
draft.sectionsarray of object
draft.sections[].idstring
draft.sections[].namestring
draft.sections[].citationobject or null
draft.sections[].decisionenumOne of pending, accepted, removed.
draft.sections[].itemsarray of object
fileUrlstring or nullA 10-minute link to the source document.
createdAtstring (date-time)
finishedAtstring (date-time) or null

Draft a template from the uploaded document

POST /organizations/{organizationId}/service-report-template-imports/{draftId}/start

Starts the AI reading the uploaded document in the background: the outline (sections, items, statuses, limitations), then each section's describe fields and comments, every element cited to the source. Uses AI credits (about estimate.credits; 402 before starting when the business has fewer). Also retries a FAILED draft, resuming after what was drafted. Poll GET …/{draftId}; the person is notified when it is ready.

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

Parameters

NameInTypeRequiredDescription
draftIdpathstringYesA template draft (GET /service-report-template-imports).

Example

curl -X POST "https://app.servflo.ai/api/organizations/$ORGANIZATION_ID/service-report-template-imports/{draftId}/start" \
  -H "Authorization: Bearer $SERVFLO_API_KEY"

Response

200: the answer's fields
FieldTypeDescription
idstring
namestring
documentLabelstring
tradeKeystring or null
partsarray of string
fileNamestring
contentTypestring
sizeBytesinteger
pagesinteger or null
pagesEstimatedbooleanWord files: pages are estimated (about 3,000 characters each).
statusenumUPLOADING → UPLOADED (estimate shown) → QUEUED → READING → REVIEW → SAVED; FAILED can be started again (it resumes). One of UPLOADING, UPLOADED, QUEUED, READING, REVIEW, SAVING, SAVED, FAILED.
progressobject{ stage: queued|outline|drafting|done|failed, done, total, counts }.
estimatedCreditsinteger or null
estimateobjectAbout how many AI credits reading this document uses.
estimate.creditsinteger
estimate.modelstring
creditsUsedinteger
errorstring or null
templateIdstring or nullThe template made from it (SAVED).
countsobject
counts.sectionsinteger
counts.itemsinteger
counts.fieldsinteger
counts.commentsinteger
counts.limitationsinteger
counts.acceptedinteger
counts.removedinteger
counts.pendinginteger
draftobjectThe drafted content: sections → items (describe fields, comments with narratives and severity), statuses, limitations; every element has an id, a citation { page, section, quote } and a decision.
draft.sectionsarray of object
draft.sections[].idstring
draft.sections[].namestring
draft.sections[].citationobject or null
draft.sections[].decisionenumOne of pending, accepted, removed.
draft.sections[].itemsarray of object
fileUrlstring or nullA 10-minute link to the source document.
createdAtstring (date-time)
finishedAtstring (date-time) or null

Review an element of a template draft

POST /organizations/{organizationId}/service-report-template-imports/{draftId}/review

Accept, remove (or set back to pending) one drafted element — a section or item (applies to everything in it), a describe field, a comment, a limitation or a status — and/or correct it with patch (section/item: name, description; field: label, type, options, unit, required, help; comment: name, severity, isLimitation, observation, implication, recommendation (safe HTML), recommendedTrade; limitation: text; status: label, meaning, needsReason). Only while the draft is in review. Nothing is created until …/save.

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

Parameters

NameInTypeRequiredDescription
draftIdpathstringYesA template draft (GET /service-report-template-imports).

Request body

FieldTypeRequiredDescription
elementIdstringYesThe element's id inside the draft. Up to 100 characters.
decisionenum or nullNoOne of pending, accepted, removed.
patchobject or nullNoFields to correct.

Example

curl -X POST "https://app.servflo.ai/api/organizations/$ORGANIZATION_ID/service-report-template-imports/{draftId}/review" \
  -H "Authorization: Bearer $SERVFLO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"elementId":"element_id"}'

Response

200: the answer's fields
FieldTypeDescription
idstring
namestring
documentLabelstring
tradeKeystring or null
partsarray of string
fileNamestring
contentTypestring
sizeBytesinteger
pagesinteger or null
pagesEstimatedbooleanWord files: pages are estimated (about 3,000 characters each).
statusenumUPLOADING → UPLOADED (estimate shown) → QUEUED → READING → REVIEW → SAVED; FAILED can be started again (it resumes). One of UPLOADING, UPLOADED, QUEUED, READING, REVIEW, SAVING, SAVED, FAILED.
progressobject{ stage: queued|outline|drafting|done|failed, done, total, counts }.
estimatedCreditsinteger or null
estimateobjectAbout how many AI credits reading this document uses.
estimate.creditsinteger
estimate.modelstring
creditsUsedinteger
errorstring or null
templateIdstring or nullThe template made from it (SAVED).
countsobject
counts.sectionsinteger
counts.itemsinteger
counts.fieldsinteger
counts.commentsinteger
counts.limitationsinteger
counts.acceptedinteger
counts.removedinteger
counts.pendinginteger
draftobjectThe drafted content: sections → items (describe fields, comments with narratives and severity), statuses, limitations; every element has an id, a citation { page, section, quote } and a decision.
draft.sectionsarray of object
draft.sections[].idstring
draft.sections[].namestring
draft.sections[].citationobject or null
draft.sections[].decisionenumOne of pending, accepted, removed.
draft.sections[].itemsarray of object
fileUrlstring or nullA 10-minute link to the source document.
createdAtstring (date-time)
finishedAtstring (date-time) or null

Save a reviewed draft as a template

POST /organizations/{organizationId}/service-report-template-imports/{draftId}/save

Creates a normal report template from the reviewed draft (every element not removed): sections, items with describe fields, the comment library, statuses (the drafted scale when kept, else the trade's) and the general limitations as the template's standards block. Idempotent: a saved draft returns its template. Then attach it to a service type or use it on a job like any template.

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

Parameters

NameInTypeRequiredDescription
draftIdpathstringYesA template draft (GET /service-report-template-imports).

Example

curl -X POST "https://app.servflo.ai/api/organizations/$ORGANIZATION_ID/service-report-template-imports/{draftId}/save" \
  -H "Authorization: Bearer $SERVFLO_API_KEY"

Response

200: the answer's fields
FieldTypeDescription
templateIdstring
createdboolean
templateobject
template.idstring
template.namestring

On this page

List service report templatesParametersExampleResponseCreate a service report templateRequest bodyExampleResponseStarter report templates (Template Center)ExampleResponseCopy a starter templateRequest bodyExampleResponseGet a service report templateParametersExampleResponseUpdate a service report templateParametersRequest bodyExampleResponseDelete a service report templateParametersExampleResponseDuplicate a service report templateParametersRequest bodyExampleResponseAdd a section to a templateParametersRequest bodyExampleResponseRename a template sectionParametersRequest bodyExampleResponseDelete a template sectionParametersExampleResponseReorder template sectionsParametersRequest bodyExampleResponseDuplicate a template sectionParametersExampleResponseAdd an item to a template sectionParametersRequest bodyExampleResponseUpdate a template itemParametersRequest bodyExampleResponseDelete a template itemParametersExampleResponseReorder a template section's itemsParametersRequest bodyExampleResponseDuplicate a template itemParametersExampleResponseAdd a comment to the libraryParametersRequest bodyExampleResponseUpdate a library commentParametersRequest bodyExampleResponseDelete a library commentParametersExampleResponseDuplicate a library commentParametersExampleResponseReorder library commentsParametersRequest bodyExampleResponseSearch the comment libraryParametersExampleResponseAuto-attach a template for a service typeParametersRequest bodyExampleResponseAdd an extra section to a templateParametersRequest bodyExampleResponseDraft a library comment with AIParametersRequest bodyExampleResponseTemplate drafts from standards documentsExampleResponseStart a template from a standards document (one call)Request bodyExampleResponseA template draft from a standards documentParametersExampleResponseRename a template draftParametersRequest bodyExampleResponseDelete a template draftParametersExampleResponseStart a template from a standards document (upload URL)Request bodyExampleResponseConfirm a standards document uploadParametersExampleResponseDraft a template from the uploaded documentParametersExampleResponseReview an element of a template draftParametersRequest bodyExampleResponseSave a reviewed draft as a templateParametersExampleResponse