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 .
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.
Permission serviceReports.read (Owner, Admin, Dispatcher, Technician, Member)Risk read, OAuth scope servflo.read. Read: reads only.MCP tool serviceReportTemplates_list (toolset serviceReports)
Name In Type Required Description includeArchivedquery boolean No
curl "https://app.servflo.ai/api/organizations/ $ORGANIZATION_ID /service-report-templates" \
-H "Authorization: Bearer $SERVFLO_API_KEY "
200: the answer's fields An array of objects:
Field Type Description idstring namestring tradeKeystring or null documentLabelstring What the document is called (Inspection report, Test certificate …). descriptionstring or null presetKeystring or null The starter it was copied from. baseTemplateIdstring or null serviceTypeIdsarray of string Service types whose new jobs get this report. archivedAtstring (date-time) or null versioninteger presetVersioninteger or null The starter content version it was copied from. recommendedTradesarray of string The template's own list (empty = the defaults). recommendedTradeOptionsarray of string Who 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.reasonenum One of replaced, updated. statusesarray of object Item statuses, in order (default IN, NI, NP, O). statuses[].keystring statuses[].labelstring statuses[].colorstring statuses[].needsReasonboolean Statuses: an item with this status needs a reason (default for NI). statuses[].reasonsarray of string Statuses: the reason choices offered. severitiesarray of object Finding severities, most serious first. severities[].keystring severities[].labelstring severities[].colorstring severities[].needsReasonboolean Statuses: an item with this status needs a reason (default for NI). severities[].reasonsarray of string Statuses: the reason choices offered. designobject Brand 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
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.
Permission serviceReports.manage (Owner, Admin)Risk write, OAuth scope servflo.write. Write: creates or changes records inside the business; nothing leaves it.MCP tool serviceReportTemplates_create (toolset serviceReports)
Field Type Required Description namestring Yes Up to 200 characters. documentLabelstring No Default “Service report”. Up to 80 characters. descriptionstring or null No Up to 2000 characters. tradeKeystring or null No Up to 60 characters. statusesarray of object No Item statuses, in order: [{ key, label, color }]. May be empty (no statuses on this report). Up to 12 items. statuses[].keystring Yes Stable key stored on items and findings (e.g. IN, safety). statuses[].labelstring Yes What the report shows (e.g. Inspected). Up to 60 characters. statuses[].colorstring Yes statuses[].descriptionstring or null No Up to 300 characters. statuses[].needsReasonboolean No Statuses only: an item with this status needs a reason (Not inspected). statuses[].reasonsarray of string No Statuses only: the reason choices offered (default Inaccessible, Unsafe …). Up to 20 items. statuses[].meaningenum No Statuses 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 null No Statuses only: the wording the client's report and PDF print, when not label. Up to 60 characters. severitiesarray of object No Finding severities, most serious first: [{ key, label, color }]. The summary is built from them. Up to 12 items. severities[].keystring Yes Stable key stored on items and findings (e.g. IN, safety). severities[].labelstring Yes What the report shows (e.g. Inspected). Up to 60 characters. severities[].colorstring Yes severities[].descriptionstring or null No Up to 300 characters. severities[].needsReasonboolean No Statuses only: an item with this status needs a reason (Not inspected). severities[].reasonsarray of string No Statuses only: the reason choices offered (default Inaccessible, Unsafe …). Up to 20 items. severities[].meaningenum No Statuses 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 null No Statuses only: the wording the client's report and PDF print, when not label. Up to 60 characters. designobject No Changes to the design (merged with the current one). design.brandColorstring No Accent color of headings and the cover. Default #0f766e. design.coverStyleenum No photo: large cover photo; band: color band with a small photo; minimal: text only. One of photo, band, minimal. Default photo. design.showSummaryboolean No Show the summary of findings after the cover. Default true. design.summarySeveritiesarray of string No Severity keys listed in the summary. Up to 12 items. Default ["safety","repair","monitor"]. design.showTableOfContentsboolean No Default true. design.showEstimatesboolean No Show findings' repair cost ranges to the client. Default false. design.introHtmlstring No Shown after the cover (safe HTML). Default ``. design.disclaimerHtmlstring No Standards, limitations and state-required text, at the end (safe HTML). Default ``. design.footerTextstring No Printed on every page. Up to 300 characters. Default ``. design.standardsTitlestring No Heading of the standards block (e.g. "Standards of practice and limitations"). Up to 120 characters. Default ``. design.standardsHtmlstring No The standards the inspection follows, its scope and exclusions (safe HTML), printed before the sections; empty = not shown. Default ``. serviceTypeIdsarray of string No Service types (GET /service-types) whose new jobs get this report automatically. Up to 500 items. baseTemplateIdstring or null No The template this one builds on (stored for layering; Part 4). archivedboolean No Archived templates attach to no new jobs and leave the library search. recommendedTradesarray of string No Who findings may recommend (replaces the list; empty = ServFlo's defaults). Up to 60 items.
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"}'
201: the answer's fields Field Type Description idstring namestring tradeKeystring or null documentLabelstring What the document is called (Inspection report, Test certificate …). descriptionstring or null presetKeystring or null The starter it was copied from. baseTemplateIdstring or null serviceTypeIdsarray of string Service types whose new jobs get this report. archivedAtstring (date-time) or null versioninteger presetVersioninteger or null The starter content version it was copied from. recommendedTradesarray of string The template's own list (empty = the defaults). recommendedTradeOptionsarray of string Who 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.reasonenum One of replaced, updated. statusesarray of object Item statuses, in order (default IN, NI, NP, O). statuses[].keystring statuses[].labelstring statuses[].colorstring statuses[].needsReasonboolean Statuses: an item with this status needs a reason (default for NI). statuses[].reasonsarray of string Statuses: the reason choices offered. severitiesarray of object Finding severities, most serious first. severities[].keystring severities[].labelstring severities[].colorstring severities[].needsReasonboolean Statuses: an item with this status needs a reason (default for NI). severities[].reasonsarray of string Statuses: the reason choices offered. designobject Brand 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 string Empty = every status. sections[].items[].describeFieldsarray of object What to describe on this item (copied into reports). commentsarray of object comments[].idstring comments[].templateIdstring comments[].itemIdsarray of string Template items it is suggested for. comments[].namestring comments[].severitystring or null comments[].isLimitationboolean comments[].answerFormatstring comments[].optionsarray of string comments[].defaultLocationstring or null comments[].defaultTextstring Safe HTML. comments[].observationstring Safe HTML: what was seen. comments[].implicationstring Safe HTML: why it matters. comments[].recommendationstring Safe HTML: what to do. comments[].recommendedTradestring or null Who should do it ("Licensed plumber"). comments[].costLowCentsinteger or null comments[].costHighCentsinteger or null comments[].pricebookItemIdstring or null comments[].inSummaryboolean comments[].sortOrderinteger
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.
Permission serviceReports.read (Owner, Admin, Dispatcher, Technician, Member)Risk read, OAuth scope servflo.read. Read: reads only.MCP tool serviceReportTemplates_starters (toolset serviceReports)
curl "https://app.servflo.ai/api/organizations/ $ORGANIZATION_ID /service-report-starters" \
-H "Authorization: Bearer $SERVFLO_API_KEY "
200: the answer's fields An array of objects:
Field Type Description presetKeystring namestring tradeKeystring documentLabelstring descriptionstring sectionCountinteger itemCountinteger
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).
Permission serviceReports.manage (Owner, Admin)Risk write, OAuth scope servflo.write. Write: creates or changes records inside the business; nothing leaves it.MCP tool serviceReportTemplates_createFromStarter (toolset serviceReports)
Field Type Required Description presetKeystring Yes The starter's key. Up to 80 characters. newVersionboolean No When 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)”.
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"}'
201: the answer's fields Field Type Description createdboolean templateobject template.idstring template.namestring template.tradeKeystring or null template.documentLabelstring What the document is called (Inspection report, Test certificate …). template.descriptionstring or null template.presetKeystring or null The starter it was copied from. template.baseTemplateIdstring or null template.serviceTypeIdsarray of string Service types whose new jobs get this report. template.archivedAtstring (date-time) or null template.versioninteger template.presetVersioninteger or null The starter content version it was copied from. template.recommendedTradesarray of string The template's own list (empty = the defaults). template.recommendedTradeOptionsarray of string Who 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.reasonenum One of replaced, updated. template.statusesarray of object Item statuses, in order (default IN, NI, NP, O). template.statuses[].keystring template.statuses[].labelstring template.statuses[].colorstring template.statuses[].needsReasonboolean Statuses: an item with this status needs a reason (default for NI). template.statuses[].reasonsarray of string Statuses: the reason choices offered. template.severitiesarray of object Finding severities, most serious first. template.severities[].keystring template.severities[].labelstring template.severities[].colorstring template.severities[].needsReasonboolean Statuses: an item with this status needs a reason (default for NI). template.severities[].reasonsarray of string Statuses: the reason choices offered. template.designobject Brand 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 string Template 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[].defaultTextstring Safe HTML. template.comments[].observationstring Safe HTML: what was seen. template.comments[].implicationstring Safe HTML: why it matters. template.comments[].recommendationstring Safe HTML: what to do. template.comments[].recommendedTradestring or null Who 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 /organizations/{organizationId}/service-report-templates/{templateId}
One template: settings (statuses, severities, design), sections with their items in order, and the comment library. Read-only.
Permission serviceReports.read (Owner, Admin, Dispatcher, Technician, Member)Risk read, OAuth scope servflo.read. Read: reads only.MCP tool serviceReportTemplates_get (toolset serviceReports)
Name In Type Required Description templateIdpath string Yes
curl "https://app.servflo.ai/api/organizations/ $ORGANIZATION_ID /service-report-templates/{templateId}" \
-H "Authorization: Bearer $SERVFLO_API_KEY "
200: the answer's fields Field Type Description idstring namestring tradeKeystring or null documentLabelstring What the document is called (Inspection report, Test certificate …). descriptionstring or null presetKeystring or null The starter it was copied from. baseTemplateIdstring or null serviceTypeIdsarray of string Service types whose new jobs get this report. archivedAtstring (date-time) or null versioninteger presetVersioninteger or null The starter content version it was copied from. recommendedTradesarray of string The template's own list (empty = the defaults). recommendedTradeOptionsarray of string Who 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.reasonenum One of replaced, updated. statusesarray of object Item statuses, in order (default IN, NI, NP, O). statuses[].keystring statuses[].labelstring statuses[].colorstring statuses[].needsReasonboolean Statuses: an item with this status needs a reason (default for NI). statuses[].reasonsarray of string Statuses: the reason choices offered. severitiesarray of object Finding severities, most serious first. severities[].keystring severities[].labelstring severities[].colorstring severities[].needsReasonboolean Statuses: an item with this status needs a reason (default for NI). severities[].reasonsarray of string Statuses: the reason choices offered. designobject Brand 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 string Empty = every status. sections[].items[].describeFieldsarray of object What to describe on this item (copied into reports). commentsarray of object comments[].idstring comments[].templateIdstring comments[].itemIdsarray of string Template items it is suggested for. comments[].namestring comments[].severitystring or null comments[].isLimitationboolean comments[].answerFormatstring comments[].optionsarray of string comments[].defaultLocationstring or null comments[].defaultTextstring Safe HTML. comments[].observationstring Safe HTML: what was seen. comments[].implicationstring Safe HTML: why it matters. comments[].recommendationstring Safe HTML: what to do. comments[].recommendedTradestring or null Who should do it ("Licensed plumber"). comments[].costLowCentsinteger or null comments[].costHighCentsinteger or null comments[].pricebookItemIdstring or null comments[].inSummaryboolean comments[].sortOrderinteger
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.
Permission serviceReports.manage (Owner, Admin)Risk write, OAuth scope servflo.write. Write: creates or changes records inside the business; nothing leaves it.MCP tool serviceReportTemplates_update (toolset serviceReports)
Name In Type Required Description templateIdpath string Yes
Field Type Required Description namestring No Up to 200 characters. documentLabelstring No Default “Service report”. Up to 80 characters. descriptionstring or null No Up to 2000 characters. tradeKeystring or null No Up to 60 characters. statusesarray of object No Item statuses, in order: [{ key, label, color }]. May be empty (no statuses on this report). Up to 12 items. statuses[].keystring Yes Stable key stored on items and findings (e.g. IN, safety). statuses[].labelstring Yes What the report shows (e.g. Inspected). Up to 60 characters. statuses[].colorstring Yes statuses[].descriptionstring or null No Up to 300 characters. statuses[].needsReasonboolean No Statuses only: an item with this status needs a reason (Not inspected). statuses[].reasonsarray of string No Statuses only: the reason choices offered (default Inaccessible, Unsafe …). Up to 20 items. statuses[].meaningenum No Statuses 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 null No Statuses only: the wording the client's report and PDF print, when not label. Up to 60 characters. severitiesarray of object No Finding severities, most serious first: [{ key, label, color }]. The summary is built from them. Up to 12 items. severities[].keystring Yes Stable key stored on items and findings (e.g. IN, safety). severities[].labelstring Yes What the report shows (e.g. Inspected). Up to 60 characters. severities[].colorstring Yes severities[].descriptionstring or null No Up to 300 characters. severities[].needsReasonboolean No Statuses only: an item with this status needs a reason (Not inspected). severities[].reasonsarray of string No Statuses only: the reason choices offered (default Inaccessible, Unsafe …). Up to 20 items. severities[].meaningenum No Statuses 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 null No Statuses only: the wording the client's report and PDF print, when not label. Up to 60 characters. designobject No Changes to the design (merged with the current one). design.brandColorstring No Accent color of headings and the cover. Default #0f766e. design.coverStyleenum No photo: large cover photo; band: color band with a small photo; minimal: text only. One of photo, band, minimal. Default photo. design.showSummaryboolean No Show the summary of findings after the cover. Default true. design.summarySeveritiesarray of string No Severity keys listed in the summary. Up to 12 items. Default ["safety","repair","monitor"]. design.showTableOfContentsboolean No Default true. design.showEstimatesboolean No Show findings' repair cost ranges to the client. Default false. design.introHtmlstring No Shown after the cover (safe HTML). Default ``. design.disclaimerHtmlstring No Standards, limitations and state-required text, at the end (safe HTML). Default ``. design.footerTextstring No Printed on every page. Up to 300 characters. Default ``. design.standardsTitlestring No Heading of the standards block (e.g. "Standards of practice and limitations"). Up to 120 characters. Default ``. design.standardsHtmlstring No The standards the inspection follows, its scope and exclusions (safe HTML), printed before the sections; empty = not shown. Default ``. serviceTypeIdsarray of string No Service types (GET /service-types) whose new jobs get this report automatically. Up to 500 items. baseTemplateIdstring or null No The template this one builds on (stored for layering; Part 4). archivedboolean No Archived templates attach to no new jobs and leave the library search. recommendedTradesarray of string No Who findings may recommend (replaces the list; empty = ServFlo's defaults). Up to 60 items.
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"}'
200: the answer's fields Field Type Description idstring namestring tradeKeystring or null documentLabelstring What the document is called (Inspection report, Test certificate …). descriptionstring or null presetKeystring or null The starter it was copied from. baseTemplateIdstring or null serviceTypeIdsarray of string Service types whose new jobs get this report. archivedAtstring (date-time) or null versioninteger presetVersioninteger or null The starter content version it was copied from. recommendedTradesarray of string The template's own list (empty = the defaults). recommendedTradeOptionsarray of string Who 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.reasonenum One of replaced, updated. statusesarray of object Item statuses, in order (default IN, NI, NP, O). statuses[].keystring statuses[].labelstring statuses[].colorstring statuses[].needsReasonboolean Statuses: an item with this status needs a reason (default for NI). statuses[].reasonsarray of string Statuses: the reason choices offered. severitiesarray of object Finding severities, most serious first. severities[].keystring severities[].labelstring severities[].colorstring severities[].needsReasonboolean Statuses: an item with this status needs a reason (default for NI). severities[].reasonsarray of string Statuses: the reason choices offered. designobject Brand 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 string Empty = every status. sections[].items[].describeFieldsarray of object What to describe on this item (copied into reports). commentsarray of object comments[].idstring comments[].templateIdstring comments[].itemIdsarray of string Template items it is suggested for. comments[].namestring comments[].severitystring or null comments[].isLimitationboolean comments[].answerFormatstring comments[].optionsarray of string comments[].defaultLocationstring or null comments[].defaultTextstring Safe HTML. comments[].observationstring Safe HTML: what was seen. comments[].implicationstring Safe HTML: why it matters. comments[].recommendationstring Safe HTML: what to do. comments[].recommendedTradestring or null Who should do it ("Licensed plumber"). comments[].costLowCentsinteger or null comments[].costHighCentsinteger or null comments[].pricebookItemIdstring or null comments[].inSummaryboolean comments[].sortOrderinteger
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.
Permission serviceReports.manage (Owner, Admin)Risk sensitive, OAuth scope servflo.sensitive. Sensitive: moves money, deletes, sends or shows something to a customer, or grants or revokes access.MCP tool serviceReportTemplates_delete (toolset serviceReports)Approval Over MCP, this tool always waits for your approval in ServFlo. See Approvals .
Name In Type Required Description templateIdpath string Yes
curl -X DELETE "https://app.servflo.ai/api/organizations/ $ORGANIZATION_ID /service-report-templates/{templateId}" \
-H "Authorization: Bearer $SERVFLO_API_KEY "
200: the answer's fields Field Type Description oktrue
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.
Permission serviceReports.manage (Owner, Admin)Risk write, OAuth scope servflo.write. Write: creates or changes records inside the business; nothing leaves it.MCP tool serviceReportTemplates_duplicate (toolset serviceReports)
Name In Type Required Description templateIdpath string Yes
Field Type Required Description namestring No Up to 200 characters.
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"}'
201: the answer's fields Field Type Description idstring namestring tradeKeystring or null documentLabelstring What the document is called (Inspection report, Test certificate …). descriptionstring or null presetKeystring or null The starter it was copied from. baseTemplateIdstring or null serviceTypeIdsarray of string Service types whose new jobs get this report. archivedAtstring (date-time) or null versioninteger presetVersioninteger or null The starter content version it was copied from. recommendedTradesarray of string The template's own list (empty = the defaults). recommendedTradeOptionsarray of string Who 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.reasonenum One of replaced, updated. statusesarray of object Item statuses, in order (default IN, NI, NP, O). statuses[].keystring statuses[].labelstring statuses[].colorstring statuses[].needsReasonboolean Statuses: an item with this status needs a reason (default for NI). statuses[].reasonsarray of string Statuses: the reason choices offered. severitiesarray of object Finding severities, most serious first. severities[].keystring severities[].labelstring severities[].colorstring severities[].needsReasonboolean Statuses: an item with this status needs a reason (default for NI). severities[].reasonsarray of string Statuses: the reason choices offered. designobject Brand 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 string Empty = every status. sections[].items[].describeFieldsarray of object What to describe on this item (copied into reports). commentsarray of object comments[].idstring comments[].templateIdstring comments[].itemIdsarray of string Template items it is suggested for. comments[].namestring comments[].severitystring or null comments[].isLimitationboolean comments[].answerFormatstring comments[].optionsarray of string comments[].defaultLocationstring or null comments[].defaultTextstring Safe HTML. comments[].observationstring Safe HTML: what was seen. comments[].implicationstring Safe HTML: why it matters. comments[].recommendationstring Safe HTML: what to do. comments[].recommendedTradestring or null Who should do it ("Licensed plumber"). comments[].costLowCentsinteger or null comments[].costHighCentsinteger or null comments[].pricebookItemIdstring or null comments[].inSummaryboolean comments[].sortOrderinteger
POST /organizations/{organizationId}/service-report-templates/{templateId}/sections
Adds a section at the end (or at sortOrder). Returns the whole template.
Permission serviceReports.manage (Owner, Admin)Risk write, OAuth scope servflo.write. Write: creates or changes records inside the business; nothing leaves it.MCP tool serviceReportTemplates_addSection (toolset serviceReports)
Name In Type Required Description templateIdpath string Yes
Field Type Required Description namestring Yes Up to 200 characters. iconstring or null No Up to 40 characters. descriptionstring or null No Up to 2000 characters. sortOrderinteger No 0–10000.
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"}'
201: the answer's fields Field Type Description idstring namestring tradeKeystring or null documentLabelstring What the document is called (Inspection report, Test certificate …). descriptionstring or null presetKeystring or null The starter it was copied from. baseTemplateIdstring or null serviceTypeIdsarray of string Service types whose new jobs get this report. archivedAtstring (date-time) or null versioninteger presetVersioninteger or null The starter content version it was copied from. recommendedTradesarray of string The template's own list (empty = the defaults). recommendedTradeOptionsarray of string Who 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.reasonenum One of replaced, updated. statusesarray of object Item statuses, in order (default IN, NI, NP, O). statuses[].keystring statuses[].labelstring statuses[].colorstring statuses[].needsReasonboolean Statuses: an item with this status needs a reason (default for NI). statuses[].reasonsarray of string Statuses: the reason choices offered. severitiesarray of object Finding severities, most serious first. severities[].keystring severities[].labelstring severities[].colorstring severities[].needsReasonboolean Statuses: an item with this status needs a reason (default for NI). severities[].reasonsarray of string Statuses: the reason choices offered. designobject Brand 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 string Empty = every status. sections[].items[].describeFieldsarray of object What to describe on this item (copied into reports). commentsarray of object comments[].idstring comments[].templateIdstring comments[].itemIdsarray of string Template items it is suggested for. comments[].namestring comments[].severitystring or null comments[].isLimitationboolean comments[].answerFormatstring comments[].optionsarray of string comments[].defaultLocationstring or null comments[].defaultTextstring Safe HTML. comments[].observationstring Safe HTML: what was seen. comments[].implicationstring Safe HTML: why it matters. comments[].recommendationstring Safe HTML: what to do. comments[].recommendedTradestring or null Who should do it ("Licensed plumber"). comments[].costLowCentsinteger or null comments[].costHighCentsinteger or null comments[].pricebookItemIdstring or null comments[].inSummaryboolean comments[].sortOrderinteger
PATCH
/organizations/{organizationId}/service-report-templates/{templateId}/sections/{sectionId}
Changes the section's name, icon or description. Returns the whole template.
Permission serviceReports.manage (Owner, Admin)Risk write, OAuth scope servflo.write. Write: creates or changes records inside the business; nothing leaves it.MCP tool serviceReportTemplates_updateSection (toolset serviceReports)
Name In Type Required Description templateIdpath string Yes sectionIdpath string Yes
Field Type Required Description namestring No Up to 200 characters. iconstring or null No Up to 40 characters. descriptionstring or null No Up to 2000 characters.
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"}'
200: the answer's fields Field Type Description idstring namestring tradeKeystring or null documentLabelstring What the document is called (Inspection report, Test certificate …). descriptionstring or null presetKeystring or null The starter it was copied from. baseTemplateIdstring or null serviceTypeIdsarray of string Service types whose new jobs get this report. archivedAtstring (date-time) or null versioninteger presetVersioninteger or null The starter content version it was copied from. recommendedTradesarray of string The template's own list (empty = the defaults). recommendedTradeOptionsarray of string Who 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.reasonenum One of replaced, updated. statusesarray of object Item statuses, in order (default IN, NI, NP, O). statuses[].keystring statuses[].labelstring statuses[].colorstring statuses[].needsReasonboolean Statuses: an item with this status needs a reason (default for NI). statuses[].reasonsarray of string Statuses: the reason choices offered. severitiesarray of object Finding severities, most serious first. severities[].keystring severities[].labelstring severities[].colorstring severities[].needsReasonboolean Statuses: an item with this status needs a reason (default for NI). severities[].reasonsarray of string Statuses: the reason choices offered. designobject Brand 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 string Empty = every status. sections[].items[].describeFieldsarray of object What to describe on this item (copied into reports). commentsarray of object comments[].idstring comments[].templateIdstring comments[].itemIdsarray of string Template items it is suggested for. comments[].namestring comments[].severitystring or null comments[].isLimitationboolean comments[].answerFormatstring comments[].optionsarray of string comments[].defaultLocationstring or null comments[].defaultTextstring Safe HTML. comments[].observationstring Safe HTML: what was seen. comments[].implicationstring Safe HTML: why it matters. comments[].recommendationstring Safe HTML: what to do. comments[].recommendedTradestring or null Who should do it ("Licensed plumber"). comments[].costLowCentsinteger or null comments[].costHighCentsinteger or null comments[].pricebookItemIdstring or null comments[].inSummaryboolean comments[].sortOrderinteger
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.
Permission serviceReports.manage (Owner, Admin)Risk sensitive, OAuth scope servflo.sensitive. Sensitive: moves money, deletes, sends or shows something to a customer, or grants or revokes access.MCP tool serviceReportTemplates_deleteSection (toolset serviceReports)Approval Over MCP, this tool always waits for your approval in ServFlo. See Approvals .
Name In Type Required Description templateIdpath string Yes sectionIdpath string Yes
curl -X DELETE "https://app.servflo.ai/api/organizations/ $ORGANIZATION_ID /service-report-templates/{templateId}/sections/{sectionId}" \
-H "Authorization: Bearer $SERVFLO_API_KEY "
200: the answer's fields Field Type Description idstring namestring tradeKeystring or null documentLabelstring What the document is called (Inspection report, Test certificate …). descriptionstring or null presetKeystring or null The starter it was copied from. baseTemplateIdstring or null serviceTypeIdsarray of string Service types whose new jobs get this report. archivedAtstring (date-time) or null versioninteger presetVersioninteger or null The starter content version it was copied from. recommendedTradesarray of string The template's own list (empty = the defaults). recommendedTradeOptionsarray of string Who 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.reasonenum One of replaced, updated. statusesarray of object Item statuses, in order (default IN, NI, NP, O). statuses[].keystring statuses[].labelstring statuses[].colorstring statuses[].needsReasonboolean Statuses: an item with this status needs a reason (default for NI). statuses[].reasonsarray of string Statuses: the reason choices offered. severitiesarray of object Finding severities, most serious first. severities[].keystring severities[].labelstring severities[].colorstring severities[].needsReasonboolean Statuses: an item with this status needs a reason (default for NI). severities[].reasonsarray of string Statuses: the reason choices offered. designobject Brand 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 string Empty = every status. sections[].items[].describeFieldsarray of object What to describe on this item (copied into reports). commentsarray of object comments[].idstring comments[].templateIdstring comments[].itemIdsarray of string Template items it is suggested for. comments[].namestring comments[].severitystring or null comments[].isLimitationboolean comments[].answerFormatstring comments[].optionsarray of string comments[].defaultLocationstring or null comments[].defaultTextstring Safe HTML. comments[].observationstring Safe HTML: what was seen. comments[].implicationstring Safe HTML: why it matters. comments[].recommendationstring Safe HTML: what to do. comments[].recommendedTradestring or null Who should do it ("Licensed plumber"). comments[].costLowCentsinteger or null comments[].costHighCentsinteger or null comments[].pricebookItemIdstring or null comments[].inSummaryboolean comments[].sortOrderinteger
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.
Permission serviceReports.manage (Owner, Admin)Risk write, OAuth scope servflo.write. Write: creates or changes records inside the business; nothing leaves it.MCP tool serviceReportTemplates_reorderSections (toolset serviceReports)
Name In Type Required Description templateIdpath string Yes
Field Type Required Description sectionIdsarray of string Yes The template's section ids in the new order. Up to 500 items.
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"]}'
200: the answer's fields Field Type Description idstring namestring tradeKeystring or null documentLabelstring What the document is called (Inspection report, Test certificate …). descriptionstring or null presetKeystring or null The starter it was copied from. baseTemplateIdstring or null serviceTypeIdsarray of string Service types whose new jobs get this report. archivedAtstring (date-time) or null versioninteger presetVersioninteger or null The starter content version it was copied from. recommendedTradesarray of string The template's own list (empty = the defaults). recommendedTradeOptionsarray of string Who 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.reasonenum One of replaced, updated. statusesarray of object Item statuses, in order (default IN, NI, NP, O). statuses[].keystring statuses[].labelstring statuses[].colorstring statuses[].needsReasonboolean Statuses: an item with this status needs a reason (default for NI). statuses[].reasonsarray of string Statuses: the reason choices offered. severitiesarray of object Finding severities, most serious first. severities[].keystring severities[].labelstring severities[].colorstring severities[].needsReasonboolean Statuses: an item with this status needs a reason (default for NI). severities[].reasonsarray of string Statuses: the reason choices offered. designobject Brand 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 string Empty = every status. sections[].items[].describeFieldsarray of object What to describe on this item (copied into reports). commentsarray of object comments[].idstring comments[].templateIdstring comments[].itemIdsarray of string Template items it is suggested for. comments[].namestring comments[].severitystring or null comments[].isLimitationboolean comments[].answerFormatstring comments[].optionsarray of string comments[].defaultLocationstring or null comments[].defaultTextstring Safe HTML. comments[].observationstring Safe HTML: what was seen. comments[].implicationstring Safe HTML: why it matters. comments[].recommendationstring Safe HTML: what to do. comments[].recommendedTradestring or null Who should do it ("Licensed plumber"). comments[].costLowCentsinteger or null comments[].costHighCentsinteger or null comments[].pricebookItemIdstring or null comments[].inSummaryboolean comments[].sortOrderinteger
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.
Permission serviceReports.manage (Owner, Admin)Risk write, OAuth scope servflo.write. Write: creates or changes records inside the business; nothing leaves it.MCP tool serviceReportTemplates_duplicateSection (toolset serviceReports)
Name In Type Required Description templateIdpath string Yes sectionIdpath string Yes
curl -X POST "https://app.servflo.ai/api/organizations/ $ORGANIZATION_ID /service-report-templates/{templateId}/sections/{sectionId}/duplicate" \
-H "Authorization: Bearer $SERVFLO_API_KEY "
201: the answer's fields Field Type Description idstring namestring tradeKeystring or null documentLabelstring What the document is called (Inspection report, Test certificate …). descriptionstring or null presetKeystring or null The starter it was copied from. baseTemplateIdstring or null serviceTypeIdsarray of string Service types whose new jobs get this report. archivedAtstring (date-time) or null versioninteger presetVersioninteger or null The starter content version it was copied from. recommendedTradesarray of string The template's own list (empty = the defaults). recommendedTradeOptionsarray of string Who 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.reasonenum One of replaced, updated. statusesarray of object Item statuses, in order (default IN, NI, NP, O). statuses[].keystring statuses[].labelstring statuses[].colorstring statuses[].needsReasonboolean Statuses: an item with this status needs a reason (default for NI). statuses[].reasonsarray of string Statuses: the reason choices offered. severitiesarray of object Finding severities, most serious first. severities[].keystring severities[].labelstring severities[].colorstring severities[].needsReasonboolean Statuses: an item with this status needs a reason (default for NI). severities[].reasonsarray of string Statuses: the reason choices offered. designobject Brand 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 string Empty = every status. sections[].items[].describeFieldsarray of object What to describe on this item (copied into reports). commentsarray of object comments[].idstring comments[].templateIdstring comments[].itemIdsarray of string Template items it is suggested for. comments[].namestring comments[].severitystring or null comments[].isLimitationboolean comments[].answerFormatstring comments[].optionsarray of string comments[].defaultLocationstring or null comments[].defaultTextstring Safe HTML. comments[].observationstring Safe HTML: what was seen. comments[].implicationstring Safe HTML: why it matters. comments[].recommendationstring Safe HTML: what to do. comments[].recommendedTradestring or null Who should do it ("Licensed plumber"). comments[].costLowCentsinteger or null comments[].costHighCentsinteger or null comments[].pricebookItemIdstring or null comments[].inSummaryboolean comments[].sortOrderinteger
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.
Permission serviceReports.manage (Owner, Admin)Risk write, OAuth scope servflo.write. Write: creates or changes records inside the business; nothing leaves it.MCP tool serviceReportTemplates_addItem (toolset serviceReports)
Name In Type Required Description templateIdpath string Yes sectionIdpath string Yes
Field Type Required Description namestring Yes Up to 200 characters. descriptionstring or null No Up to 2000 characters. allowedStatusesarray of string No Up to 12 items. describeFieldsarray of object No What 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[].keystring Yes Stable key the answers are stored under (e.g. coveringType). describeFields[].labelstring Yes What the report prints (e.g. Roof covering). Up to 120 characters. describeFields[].typeenum Yes choice: one of options; multi: any of options; text; number (with unit). One of choice, multi, text, number. describeFields[].optionsarray of string No Up to 40 items. Default []. describeFields[].unitstring or null No number: the unit printed after it. Up to 20 characters. describeFields[].requiredboolean No Must be answered before publishing (a blocking checklist item; "Publish anyway" acknowledges it). Default false. describeFields[].helpstring or null No A hint for the inspector. Up to 500 characters. describeFields[].sortOrderinteger No 0–10000. Default 0.
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"}'
201: the answer's fields Field Type Description idstring namestring tradeKeystring or null documentLabelstring What the document is called (Inspection report, Test certificate …). descriptionstring or null presetKeystring or null The starter it was copied from. baseTemplateIdstring or null serviceTypeIdsarray of string Service types whose new jobs get this report. archivedAtstring (date-time) or null versioninteger presetVersioninteger or null The starter content version it was copied from. recommendedTradesarray of string The template's own list (empty = the defaults). recommendedTradeOptionsarray of string Who 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.reasonenum One of replaced, updated. statusesarray of object Item statuses, in order (default IN, NI, NP, O). statuses[].keystring statuses[].labelstring statuses[].colorstring statuses[].needsReasonboolean Statuses: an item with this status needs a reason (default for NI). statuses[].reasonsarray of string Statuses: the reason choices offered. severitiesarray of object Finding severities, most serious first. severities[].keystring severities[].labelstring severities[].colorstring severities[].needsReasonboolean Statuses: an item with this status needs a reason (default for NI). severities[].reasonsarray of string Statuses: the reason choices offered. designobject Brand 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 string Empty = every status. sections[].items[].describeFieldsarray of object What to describe on this item (copied into reports). commentsarray of object comments[].idstring comments[].templateIdstring comments[].itemIdsarray of string Template items it is suggested for. comments[].namestring comments[].severitystring or null comments[].isLimitationboolean comments[].answerFormatstring comments[].optionsarray of string comments[].defaultLocationstring or null comments[].defaultTextstring Safe HTML. comments[].observationstring Safe HTML: what was seen. comments[].implicationstring Safe HTML: why it matters. comments[].recommendationstring Safe HTML: what to do. comments[].recommendedTradestring or null Who should do it ("Licensed plumber"). comments[].costLowCentsinteger or null comments[].costHighCentsinteger or null comments[].pricebookItemIdstring or null comments[].inSummaryboolean comments[].sortOrderinteger
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.
Permission serviceReports.manage (Owner, Admin)Risk write, OAuth scope servflo.write. Write: creates or changes records inside the business; nothing leaves it.MCP tool serviceReportTemplates_updateItem (toolset serviceReports)
Name In Type Required Description templateIdpath string Yes itemIdpath string Yes
Field Type Required Description namestring No Up to 200 characters. descriptionstring or null No Up to 2000 characters. allowedStatusesarray of string No Up to 12 items. describeFieldsarray of object No What 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[].keystring Yes Stable key the answers are stored under (e.g. coveringType). describeFields[].labelstring Yes What the report prints (e.g. Roof covering). Up to 120 characters. describeFields[].typeenum Yes choice: one of options; multi: any of options; text; number (with unit). One of choice, multi, text, number. describeFields[].optionsarray of string No Up to 40 items. Default []. describeFields[].unitstring or null No number: the unit printed after it. Up to 20 characters. describeFields[].requiredboolean No Must be answered before publishing (a blocking checklist item; "Publish anyway" acknowledges it). Default false. describeFields[].helpstring or null No A hint for the inspector. Up to 500 characters. describeFields[].sortOrderinteger No 0–10000. Default 0. sectionIdstring No Move to this section of the template.
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"]}'
200: the answer's fields Field Type Description idstring namestring tradeKeystring or null documentLabelstring What the document is called (Inspection report, Test certificate …). descriptionstring or null presetKeystring or null The starter it was copied from. baseTemplateIdstring or null serviceTypeIdsarray of string Service types whose new jobs get this report. archivedAtstring (date-time) or null versioninteger presetVersioninteger or null The starter content version it was copied from. recommendedTradesarray of string The template's own list (empty = the defaults). recommendedTradeOptionsarray of string Who 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.reasonenum One of replaced, updated. statusesarray of object Item statuses, in order (default IN, NI, NP, O). statuses[].keystring statuses[].labelstring statuses[].colorstring statuses[].needsReasonboolean Statuses: an item with this status needs a reason (default for NI). statuses[].reasonsarray of string Statuses: the reason choices offered. severitiesarray of object Finding severities, most serious first. severities[].keystring severities[].labelstring severities[].colorstring severities[].needsReasonboolean Statuses: an item with this status needs a reason (default for NI). severities[].reasonsarray of string Statuses: the reason choices offered. designobject Brand 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 string Empty = every status. sections[].items[].describeFieldsarray of object What to describe on this item (copied into reports). commentsarray of object comments[].idstring comments[].templateIdstring comments[].itemIdsarray of string Template items it is suggested for. comments[].namestring comments[].severitystring or null comments[].isLimitationboolean comments[].answerFormatstring comments[].optionsarray of string comments[].defaultLocationstring or null comments[].defaultTextstring Safe HTML. comments[].observationstring Safe HTML: what was seen. comments[].implicationstring Safe HTML: why it matters. comments[].recommendationstring Safe HTML: what to do. comments[].recommendedTradestring or null Who should do it ("Licensed plumber"). comments[].costLowCentsinteger or null comments[].costHighCentsinteger or null comments[].pricebookItemIdstring or null comments[].inSummaryboolean comments[].sortOrderinteger
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.
Permission serviceReports.manage (Owner, Admin)Risk sensitive, OAuth scope servflo.sensitive. Sensitive: moves money, deletes, sends or shows something to a customer, or grants or revokes access.MCP tool serviceReportTemplates_deleteItem (toolset serviceReports)Approval Over MCP, this tool always waits for your approval in ServFlo. See Approvals .
Name In Type Required Description templateIdpath string Yes itemIdpath string Yes
curl -X DELETE "https://app.servflo.ai/api/organizations/ $ORGANIZATION_ID /service-report-templates/{templateId}/items/{itemId}" \
-H "Authorization: Bearer $SERVFLO_API_KEY "
200: the answer's fields Field Type Description idstring namestring tradeKeystring or null documentLabelstring What the document is called (Inspection report, Test certificate …). descriptionstring or null presetKeystring or null The starter it was copied from. baseTemplateIdstring or null serviceTypeIdsarray of string Service types whose new jobs get this report. archivedAtstring (date-time) or null versioninteger presetVersioninteger or null The starter content version it was copied from. recommendedTradesarray of string The template's own list (empty = the defaults). recommendedTradeOptionsarray of string Who 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.reasonenum One of replaced, updated. statusesarray of object Item statuses, in order (default IN, NI, NP, O). statuses[].keystring statuses[].labelstring statuses[].colorstring statuses[].needsReasonboolean Statuses: an item with this status needs a reason (default for NI). statuses[].reasonsarray of string Statuses: the reason choices offered. severitiesarray of object Finding severities, most serious first. severities[].keystring severities[].labelstring severities[].colorstring severities[].needsReasonboolean Statuses: an item with this status needs a reason (default for NI). severities[].reasonsarray of string Statuses: the reason choices offered. designobject Brand 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 string Empty = every status. sections[].items[].describeFieldsarray of object What to describe on this item (copied into reports). commentsarray of object comments[].idstring comments[].templateIdstring comments[].itemIdsarray of string Template items it is suggested for. comments[].namestring comments[].severitystring or null comments[].isLimitationboolean comments[].answerFormatstring comments[].optionsarray of string comments[].defaultLocationstring or null comments[].defaultTextstring Safe HTML. comments[].observationstring Safe HTML: what was seen. comments[].implicationstring Safe HTML: why it matters. comments[].recommendationstring Safe HTML: what to do. comments[].recommendedTradestring or null Who should do it ("Licensed plumber"). comments[].costLowCentsinteger or null comments[].costHighCentsinteger or null comments[].pricebookItemIdstring or null comments[].inSummaryboolean comments[].sortOrderinteger
POST
/organizations/{organizationId}/service-report-templates/{templateId}/sections/{sectionId}/items/reorder
Puts the section's items in the order of itemIds. Returns the template.
Permission serviceReports.manage (Owner, Admin)Risk write, OAuth scope servflo.write. Write: creates or changes records inside the business; nothing leaves it.MCP tool serviceReportTemplates_reorderItems (toolset serviceReports)
Name In Type Required Description templateIdpath string Yes sectionIdpath string Yes
Field Type Required Description itemIdsarray of string Yes The section's item ids in the new order. Up to 500 items.
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"]}'
200: the answer's fields Field Type Description idstring namestring tradeKeystring or null documentLabelstring What the document is called (Inspection report, Test certificate …). descriptionstring or null presetKeystring or null The starter it was copied from. baseTemplateIdstring or null serviceTypeIdsarray of string Service types whose new jobs get this report. archivedAtstring (date-time) or null versioninteger presetVersioninteger or null The starter content version it was copied from. recommendedTradesarray of string The template's own list (empty = the defaults). recommendedTradeOptionsarray of string Who 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.reasonenum One of replaced, updated. statusesarray of object Item statuses, in order (default IN, NI, NP, O). statuses[].keystring statuses[].labelstring statuses[].colorstring statuses[].needsReasonboolean Statuses: an item with this status needs a reason (default for NI). statuses[].reasonsarray of string Statuses: the reason choices offered. severitiesarray of object Finding severities, most serious first. severities[].keystring severities[].labelstring severities[].colorstring severities[].needsReasonboolean Statuses: an item with this status needs a reason (default for NI). severities[].reasonsarray of string Statuses: the reason choices offered. designobject Brand 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 string Empty = every status. sections[].items[].describeFieldsarray of object What to describe on this item (copied into reports). commentsarray of object comments[].idstring comments[].templateIdstring comments[].itemIdsarray of string Template items it is suggested for. comments[].namestring comments[].severitystring or null comments[].isLimitationboolean comments[].answerFormatstring comments[].optionsarray of string comments[].defaultLocationstring or null comments[].defaultTextstring Safe HTML. comments[].observationstring Safe HTML: what was seen. comments[].implicationstring Safe HTML: why it matters. comments[].recommendationstring Safe HTML: what to do. comments[].recommendedTradestring or null Who should do it ("Licensed plumber"). comments[].costLowCentsinteger or null comments[].costHighCentsinteger or null comments[].pricebookItemIdstring or null comments[].inSummaryboolean comments[].sortOrderinteger
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.
Permission serviceReports.manage (Owner, Admin)Risk write, OAuth scope servflo.write. Write: creates or changes records inside the business; nothing leaves it.MCP tool serviceReportTemplates_duplicateItem (toolset serviceReports)
Name In Type Required Description templateIdpath string Yes itemIdpath string Yes
curl -X POST "https://app.servflo.ai/api/organizations/ $ORGANIZATION_ID /service-report-templates/{templateId}/items/{itemId}/duplicate" \
-H "Authorization: Bearer $SERVFLO_API_KEY "
201: the answer's fields Field Type Description idstring namestring tradeKeystring or null documentLabelstring What the document is called (Inspection report, Test certificate …). descriptionstring or null presetKeystring or null The starter it was copied from. baseTemplateIdstring or null serviceTypeIdsarray of string Service types whose new jobs get this report. archivedAtstring (date-time) or null versioninteger presetVersioninteger or null The starter content version it was copied from. recommendedTradesarray of string The template's own list (empty = the defaults). recommendedTradeOptionsarray of string Who 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.reasonenum One of replaced, updated. statusesarray of object Item statuses, in order (default IN, NI, NP, O). statuses[].keystring statuses[].labelstring statuses[].colorstring statuses[].needsReasonboolean Statuses: an item with this status needs a reason (default for NI). statuses[].reasonsarray of string Statuses: the reason choices offered. severitiesarray of object Finding severities, most serious first. severities[].keystring severities[].labelstring severities[].colorstring severities[].needsReasonboolean Statuses: an item with this status needs a reason (default for NI). severities[].reasonsarray of string Statuses: the reason choices offered. designobject Brand 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 string Empty = every status. sections[].items[].describeFieldsarray of object What to describe on this item (copied into reports). commentsarray of object comments[].idstring comments[].templateIdstring comments[].itemIdsarray of string Template items it is suggested for. comments[].namestring comments[].severitystring or null comments[].isLimitationboolean comments[].answerFormatstring comments[].optionsarray of string comments[].defaultLocationstring or null comments[].defaultTextstring Safe HTML. comments[].observationstring Safe HTML: what was seen. comments[].implicationstring Safe HTML: why it matters. comments[].recommendationstring Safe HTML: what to do. comments[].recommendedTradestring or null Who should do it ("Licensed plumber"). comments[].costLowCentsinteger or null comments[].costHighCentsinteger or null comments[].pricebookItemIdstring or null comments[].inSummaryboolean comments[].sortOrderinteger
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.
Permission serviceReports.manage (Owner, Admin)Risk write, OAuth scope servflo.write. Write: creates or changes records inside the business; nothing leaves it.MCP tool serviceReportTemplates_createComment (toolset serviceReports)
Name In Type Required Description templateIdpath string Yes
Field Type Required Description namestring Yes Up to 200 characters. itemIdsarray of string No Template items it is suggested for. Up to 500 items. severitystring or null No A severity key of the template / report (default safety, repair, monitor, maintenance, info); null = informational. Up to 24 characters. isLimitationboolean No Says what could not be checked (listed apart from problems). answerFormatenum No CHECKBOX (one of options), MULTI (any of options), NUMBER (options[0] is the unit) or TEXT. One of CHECKBOX, MULTI, NUMBER, TEXT. optionsarray of string No Up to 30 items. defaultLocationstring or null No Up to 200 characters. defaultTextstring or null No Rich 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 null No What was seen (safe HTML). With any of the three parts set, they print instead of text. implicationstring or null No Why it matters (safe HTML). recommendationstring or null No What to do next (safe HTML). recommendedTradestring or null No Who should do it: usually one of the template's recommendedTradeOptions ("Licensed electrician", "Structural engineer" …). Up to 120 characters. costLowCentsinteger or null No 0–100000000. costHighCentsinteger or null No 0–100000000. pricebookItemIdstring or null No inSummaryboolean No sortOrderinteger No 0–100000.
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"}'
201: the answer's fields Field Type Description idstring templateIdstring itemIdsarray of string Template items it is suggested for. namestring severitystring or null isLimitationboolean answerFormatstring optionsarray of string defaultLocationstring or null defaultTextstring Safe HTML. observationstring Safe HTML: what was seen. implicationstring Safe HTML: why it matters. recommendationstring Safe HTML: what to do. recommendedTradestring or null Who should do it ("Licensed plumber"). costLowCentsinteger or null costHighCentsinteger or null pricebookItemIdstring or null inSummaryboolean sortOrderinteger
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.
Permission serviceReports.manage (Owner, Admin)Risk write, OAuth scope servflo.write. Write: creates or changes records inside the business; nothing leaves it.MCP tool serviceReportTemplates_updateComment (toolset serviceReports)
Name In Type Required Description templateIdpath string Yes commentIdpath string Yes
Field Type Required Description namestring No Up to 200 characters. itemIdsarray of string No Template items it is suggested for (replaces). Up to 500 items. severitystring or null No A severity key of the template / report (default safety, repair, monitor, maintenance, info); null = informational. Up to 24 characters. isLimitationboolean No answerFormatenum No CHECKBOX (one of options), MULTI (any of options), NUMBER (options[0] is the unit) or TEXT. One of CHECKBOX, MULTI, NUMBER, TEXT. optionsarray of string No Up to 30 items. defaultLocationstring or null No Up to 200 characters. defaultTextstring or null No Rich 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 null No What was seen (safe HTML). With any of the three parts set, they print instead of text. implicationstring or null No Why it matters (safe HTML). recommendationstring or null No What to do next (safe HTML). recommendedTradestring or null No Who should do it: usually one of the template's recommendedTradeOptions ("Licensed electrician", "Structural engineer" …). Up to 120 characters. costLowCentsinteger or null No 0–100000000. costHighCentsinteger or null No 0–100000000. pricebookItemIdstring or null No inSummaryboolean No sortOrderinteger No 0–100000.
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"}'
200: the answer's fields Field Type Description idstring templateIdstring itemIdsarray of string Template items it is suggested for. namestring severitystring or null isLimitationboolean answerFormatstring optionsarray of string defaultLocationstring or null defaultTextstring Safe HTML. observationstring Safe HTML: what was seen. implicationstring Safe HTML: why it matters. recommendationstring Safe HTML: what to do. recommendedTradestring or null Who should do it ("Licensed plumber"). costLowCentsinteger or null costHighCentsinteger or null pricebookItemIdstring or null inSummaryboolean sortOrderinteger
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.
Permission serviceReports.manage (Owner, Admin)Risk sensitive, OAuth scope servflo.sensitive. Sensitive: moves money, deletes, sends or shows something to a customer, or grants or revokes access.MCP tool serviceReportTemplates_deleteComment (toolset serviceReports)Approval Over MCP, this tool always waits for your approval in ServFlo. See Approvals .
Name In Type Required Description templateIdpath string Yes commentIdpath string Yes
curl -X DELETE "https://app.servflo.ai/api/organizations/ $ORGANIZATION_ID /service-report-templates/{templateId}/comments/{commentId}" \
-H "Authorization: Bearer $SERVFLO_API_KEY "
200: the answer's fields Field Type Description oktrue
POST
/organizations/{organizationId}/service-report-templates/{templateId}/comments/{commentId}/duplicate
Copies the comment (named “… (copy)”) with the same tags. Returns the copy.
Permission serviceReports.manage (Owner, Admin)Risk write, OAuth scope servflo.write. Write: creates or changes records inside the business; nothing leaves it.MCP tool serviceReportTemplates_duplicateComment (toolset serviceReports)
Name In Type Required Description templateIdpath string Yes commentIdpath string Yes
curl -X POST "https://app.servflo.ai/api/organizations/ $ORGANIZATION_ID /service-report-templates/{templateId}/comments/{commentId}/duplicate" \
-H "Authorization: Bearer $SERVFLO_API_KEY "
201: the answer's fields Field Type Description idstring templateIdstring itemIdsarray of string Template items it is suggested for. namestring severitystring or null isLimitationboolean answerFormatstring optionsarray of string defaultLocationstring or null defaultTextstring Safe HTML. observationstring Safe HTML: what was seen. implicationstring Safe HTML: why it matters. recommendationstring Safe HTML: what to do. recommendedTradestring or null Who should do it ("Licensed plumber"). costLowCentsinteger or null costHighCentsinteger or null pricebookItemIdstring or null inSummaryboolean sortOrderinteger
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.
Permission serviceReports.manage (Owner, Admin)Risk write, OAuth scope servflo.write. Write: creates or changes records inside the business; nothing leaves it.MCP tool serviceReportTemplates_reorderComments (toolset serviceReports)
Name In Type Required Description templateIdpath string Yes
Field Type Required Description commentIdsarray of string Yes The library comments in their new order (e.g. one item's). Up to 500 items.
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"]}'
200: the answer's fields Field Type Description idstring namestring tradeKeystring or null documentLabelstring What the document is called (Inspection report, Test certificate …). descriptionstring or null presetKeystring or null The starter it was copied from. baseTemplateIdstring or null serviceTypeIdsarray of string Service types whose new jobs get this report. archivedAtstring (date-time) or null versioninteger presetVersioninteger or null The starter content version it was copied from. recommendedTradesarray of string The template's own list (empty = the defaults). recommendedTradeOptionsarray of string Who 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.reasonenum One of replaced, updated. statusesarray of object Item statuses, in order (default IN, NI, NP, O). statuses[].keystring statuses[].labelstring statuses[].colorstring statuses[].needsReasonboolean Statuses: an item with this status needs a reason (default for NI). statuses[].reasonsarray of string Statuses: the reason choices offered. severitiesarray of object Finding severities, most serious first. severities[].keystring severities[].labelstring severities[].colorstring severities[].needsReasonboolean Statuses: an item with this status needs a reason (default for NI). severities[].reasonsarray of string Statuses: the reason choices offered. designobject Brand 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 string Empty = every status. sections[].items[].describeFieldsarray of object What to describe on this item (copied into reports). commentsarray of object comments[].idstring comments[].templateIdstring comments[].itemIdsarray of string Template items it is suggested for. comments[].namestring comments[].severitystring or null comments[].isLimitationboolean comments[].answerFormatstring comments[].optionsarray of string comments[].defaultLocationstring or null comments[].defaultTextstring Safe HTML. comments[].observationstring Safe HTML: what was seen. comments[].implicationstring Safe HTML: why it matters. comments[].recommendationstring Safe HTML: what to do. comments[].recommendedTradestring or null Who should do it ("Licensed plumber"). comments[].costLowCentsinteger or null comments[].costHighCentsinteger or null comments[].pricebookItemIdstring or null comments[].inSummaryboolean comments[].sortOrderinteger
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.
Permission serviceReports.read (Owner, Admin, Dispatcher, Technician, Member)Risk read, OAuth scope servflo.read. Read: reads only.MCP tool serviceReportTemplates_searchComments (toolset serviceReports)
Name In Type Required Description queryquery string No Up to 200 characters. templateIdquery string No itemIdquery string No A template item: comments tagged to it first. severityquery string No Up to 24 characters. limitquery integer No 1–200.
curl "https://app.servflo.ai/api/organizations/ $ORGANIZATION_ID /service-report-comments" \
-H "Authorization: Bearer $SERVFLO_API_KEY "
200: the answer's fields An array of objects:
Field Type Description idstring templateIdstring itemIdsarray of string Template items it is suggested for. namestring severitystring or null isLimitationboolean answerFormatstring optionsarray of string defaultLocationstring or null defaultTextstring Safe HTML. observationstring Safe HTML: what was seen. implicationstring Safe HTML: why it matters. recommendationstring Safe HTML: what to do. recommendedTradestring or null Who 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.
Permission serviceReports.manage (Owner, Admin)Risk write, OAuth scope servflo.write. Write: creates or changes records inside the business; nothing leaves it.MCP tool serviceReportTemplates_setServiceTypeLink (toolset serviceReports)
Name In Type Required Description templateIdpath string Yes
Field Type Required Description serviceTypeIdstring Yes A service type (GET /service-types). linkedboolean Yes
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}'
200: the answer's fields Field Type Description idstring serviceTypeIdsarray of string
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.
Permission serviceReports.manage (Owner, Admin)Risk write, OAuth scope servflo.write. Write: creates or changes records inside the business; nothing leaves it.MCP tool serviceReportTemplates_addExtraSection (toolset serviceReports)
Name In Type Required Description templateIdpath string Yes
Field Type Required Description keystring Yes The extra section's key. Up to 60 characters.
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"}'
201: the answer's fields Field Type Description createdboolean False when the template already had a section of that name. sectionIdstring The template section the catalog section became. templateobject template.idstring template.namestring template.tradeKeystring or null template.documentLabelstring What the document is called (Inspection report, Test certificate …). template.descriptionstring or null template.presetKeystring or null The starter it was copied from. template.baseTemplateIdstring or null template.serviceTypeIdsarray of string Service types whose new jobs get this report. template.archivedAtstring (date-time) or null template.versioninteger template.presetVersioninteger or null The starter content version it was copied from. template.recommendedTradesarray of string The template's own list (empty = the defaults). template.recommendedTradeOptionsarray of string Who 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.reasonenum One of replaced, updated. template.statusesarray of object Item statuses, in order (default IN, NI, NP, O). template.statuses[].keystring template.statuses[].labelstring template.statuses[].colorstring template.statuses[].needsReasonboolean Statuses: an item with this status needs a reason (default for NI). template.statuses[].reasonsarray of string Statuses: the reason choices offered. template.severitiesarray of object Finding severities, most serious first. template.severities[].keystring template.severities[].labelstring template.severities[].colorstring template.severities[].needsReasonboolean Statuses: an item with this status needs a reason (default for NI). template.severities[].reasonsarray of string Statuses: the reason choices offered. template.designobject Brand 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 string Template 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[].defaultTextstring Safe HTML. template.comments[].observationstring Safe HTML: what was seen. template.comments[].implicationstring Safe HTML: why it matters. template.comments[].recommendationstring Safe HTML: what to do. template.comments[].recommendedTradestring or null Who 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
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.
Permission serviceReports.manage (Owner, Admin)Risk write, OAuth scope servflo.write. Write: creates or changes records inside the business; nothing leaves it.MCP tool serviceReportTemplates_draftComment (toolset serviceReports)
Name In Type Required Description templateIdpath string Yes
Field Type Required Description itemIdstring or null No A template item it is for. wordsstring Yes A few words ("double tapped breaker"). Up to 500 characters.
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"}'
200: the answer's fields Field Type Description namestring or null severitystring or null observationstring implicationstring recommendationstring recommendedTradestring or null isLimitationboolean sourceenum One of AI, FAKE, NONE, TEMPLATE.
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.
Permission serviceReports.manage (Owner, Admin)Risk read, OAuth scope servflo.read. Read: reads only.MCP tool serviceReportTemplates_importList (toolset serviceReports)
curl "https://app.servflo.ai/api/organizations/ $ORGANIZATION_ID /service-report-template-imports" \
-H "Authorization: Bearer $SERVFLO_API_KEY "
200: the answer's fields An array of objects:
Field Type Description idstring namestring documentLabelstring tradeKeystring or null partsarray of string fileNamestring contentTypestring sizeBytesinteger pagesinteger or null pagesEstimatedboolean Word files: pages are estimated (about 3,000 characters each). statusenum UPLOADING → 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 estimateobject About how many AI credits reading this document uses. estimate.creditsinteger estimate.modelstring creditsUsedinteger errorstring or null templateIdstring or null The template made from it (SAVED). countsobject counts.sectionsinteger counts.itemsinteger counts.fieldsinteger counts.commentsinteger counts.limitationsinteger counts.acceptedinteger counts.removedinteger counts.pendinginteger draftobject The 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[].decisionenum One of pending, accepted, removed. draft.sections[].itemsarray of object fileUrlstring or null A 10-minute link to the source document. createdAtstring (date-time) finishedAtstring (date-time) or null
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.
Permission serviceReports.manage (Owner, Admin)Risk write, OAuth scope servflo.write. Write: creates or changes records inside the business; nothing leaves it.MCP tool serviceReportTemplates_importFromFile (toolset serviceReports)
Field Type Required Description namestring Yes The template's name. Up to 200 characters. documentLabelstring No What the report is called ("Inspection report"). Up to 120 characters. tradeKeystring or null No The trade (home-inspection, hvac, electrical …): its statuses and trades are used. Up to 60 characters. partsarray of enum No What to draft: sections, describe, comments, limitations, statuses (default all). fileNamestring No The file's name, e.g. receipt.jpg (default: from the URL, else 'file'). Up to 500 characters. contentTypestring No MIME 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. contentBase64string No The file's bytes as base64 (a data: URL is accepted too). Up to 10 MB. Give this or sourceUrl. sourceUrlstring (uri) No A 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. startboolean No Start reading it now (uses AI credits).
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"}'
201: the answer's fields Field Type Description idstring namestring documentLabelstring tradeKeystring or null partsarray of string fileNamestring contentTypestring sizeBytesinteger pagesinteger or null pagesEstimatedboolean Word files: pages are estimated (about 3,000 characters each). statusenum UPLOADING → 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 estimateobject About how many AI credits reading this document uses. estimate.creditsinteger estimate.modelstring creditsUsedinteger errorstring or null templateIdstring or null The template made from it (SAVED). countsobject counts.sectionsinteger counts.itemsinteger counts.fieldsinteger counts.commentsinteger counts.limitationsinteger counts.acceptedinteger counts.removedinteger counts.pendinginteger draftobject The 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[].decisionenum One of pending, accepted, removed. draft.sections[].itemsarray of object fileUrlstring or null A 10-minute link to the source document. createdAtstring (date-time) finishedAtstring (date-time) or null
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.
Permission serviceReports.manage (Owner, Admin)Risk read, OAuth scope servflo.read. Read: reads only.MCP tool serviceReportTemplates_importGet (toolset serviceReports)
Name In Type Required Description draftIdpath string Yes A template draft (GET /service-report-template-imports).
curl "https://app.servflo.ai/api/organizations/ $ORGANIZATION_ID /service-report-template-imports/{draftId}" \
-H "Authorization: Bearer $SERVFLO_API_KEY "
200: the answer's fields Field Type Description idstring namestring documentLabelstring tradeKeystring or null partsarray of string fileNamestring contentTypestring sizeBytesinteger pagesinteger or null pagesEstimatedboolean Word files: pages are estimated (about 3,000 characters each). statusenum UPLOADING → 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 estimateobject About how many AI credits reading this document uses. estimate.creditsinteger estimate.modelstring creditsUsedinteger errorstring or null templateIdstring or null The template made from it (SAVED). countsobject counts.sectionsinteger counts.itemsinteger counts.fieldsinteger counts.commentsinteger counts.limitationsinteger counts.acceptedinteger counts.removedinteger counts.pendinginteger draftobject The 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[].decisionenum One of pending, accepted, removed. draft.sections[].itemsarray of object fileUrlstring or null A 10-minute link to the source document. createdAtstring (date-time) finishedAtstring (date-time) or null
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.
Permission serviceReports.manage (Owner, Admin)Risk write, OAuth scope servflo.write. Write: creates or changes records inside the business; nothing leaves it.MCP tool serviceReportTemplates_importUpdate (toolset serviceReports)
Name In Type Required Description draftIdpath string Yes A template draft (GET /service-report-template-imports).
Field Type Required Description namestring No Up to 200 characters. documentLabelstring No Up to 120 characters. tradeKeystring or null No Up to 60 characters. partsarray of enum No What to draft (only before it starts reading).
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"}'
200: the answer's fields Field Type Description idstring namestring documentLabelstring tradeKeystring or null partsarray of string fileNamestring contentTypestring sizeBytesinteger pagesinteger or null pagesEstimatedboolean Word files: pages are estimated (about 3,000 characters each). statusenum UPLOADING → 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 estimateobject About how many AI credits reading this document uses. estimate.creditsinteger estimate.modelstring creditsUsedinteger errorstring or null templateIdstring or null The template made from it (SAVED). countsobject counts.sectionsinteger counts.itemsinteger counts.fieldsinteger counts.commentsinteger counts.limitationsinteger counts.acceptedinteger counts.removedinteger counts.pendinginteger draftobject The 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[].decisionenum One of pending, accepted, removed. draft.sections[].itemsarray of object fileUrlstring or null A 10-minute link to the source document. createdAtstring (date-time) finishedAtstring (date-time) or null
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.
Permission serviceReports.manage (Owner, Admin)Risk sensitive, OAuth scope servflo.sensitive. Sensitive: moves money, deletes, sends or shows something to a customer, or grants or revokes access.MCP tool serviceReportTemplates_importDelete (toolset serviceReports)Approval Over MCP, this tool always waits for your approval in ServFlo. See Approvals .
Name In Type Required Description draftIdpath string Yes A template draft (GET /service-report-template-imports).
curl -X DELETE "https://app.servflo.ai/api/organizations/ $ORGANIZATION_ID /service-report-template-imports/{draftId}" \
-H "Authorization: Bearer $SERVFLO_API_KEY "
200: the answer's fields Field Type Description idstring deletedboolean
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.
Permission serviceReports.manage (Owner, Admin)Risk write, OAuth scope servflo.write. Write: creates or changes records inside the business; nothing leaves it.MCP tool serviceReportTemplates_importCreateUpload (toolset serviceReports)
Field Type Required Description namestring Yes The template's name. Up to 200 characters. documentLabelstring No What the report is called ("Inspection report"). Up to 120 characters. tradeKeystring or null No The trade (home-inspection, hvac, electrical …): its statuses and trades are used. Up to 60 characters. partsarray of enum No What to draft: sections, describe, comments, limitations, statuses (default all). fileNamestring Yes Up to 300 characters. contentTypeenum Yes One of application/pdf, application/vnd.openxmlformats-officedocument.wordprocessingml.document. sizeBytesinteger Yes 1–20971520.
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}'
201: the answer's fields Field Type Description 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.pagesEstimatedboolean Word files: pages are estimated (about 3,000 characters each). draft.statusenum UPLOADING → 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.estimateobject About how many AI credits reading this document uses. draft.estimate.creditsinteger draft.estimate.modelstring draft.creditsUsedinteger draft.errorstring or null draft.templateIdstring or null The 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.draftobject The 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 null A 10-minute link to the source document. draft.createdAtstring (date-time) draft.finishedAtstring (date-time) or null uploadUrlstring
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.
Permission serviceReports.manage (Owner, Admin)Risk write, OAuth scope servflo.write. Write: creates or changes records inside the business; nothing leaves it.MCP tool serviceReportTemplates_importConfirmUpload (toolset serviceReports)
Name In Type Required Description draftIdpath string Yes A template draft (GET /service-report-template-imports).
curl -X POST "https://app.servflo.ai/api/organizations/ $ORGANIZATION_ID /service-report-template-imports/{draftId}/confirm-upload" \
-H "Authorization: Bearer $SERVFLO_API_KEY "
200: the answer's fields Field Type Description idstring namestring documentLabelstring tradeKeystring or null partsarray of string fileNamestring contentTypestring sizeBytesinteger pagesinteger or null pagesEstimatedboolean Word files: pages are estimated (about 3,000 characters each). statusenum UPLOADING → 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 estimateobject About how many AI credits reading this document uses. estimate.creditsinteger estimate.modelstring creditsUsedinteger errorstring or null templateIdstring or null The template made from it (SAVED). countsobject counts.sectionsinteger counts.itemsinteger counts.fieldsinteger counts.commentsinteger counts.limitationsinteger counts.acceptedinteger counts.removedinteger counts.pendinginteger draftobject The 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[].decisionenum One of pending, accepted, removed. draft.sections[].itemsarray of object fileUrlstring or null A 10-minute link to the source document. createdAtstring (date-time) finishedAtstring (date-time) or null
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.
Permission serviceReports.manage (Owner, Admin)Risk write, OAuth scope servflo.write. Write: creates or changes records inside the business; nothing leaves it.MCP tool serviceReportTemplates_importStart (toolset serviceReports)
Name In Type Required Description draftIdpath string Yes A template draft (GET /service-report-template-imports).
curl -X POST "https://app.servflo.ai/api/organizations/ $ORGANIZATION_ID /service-report-template-imports/{draftId}/start" \
-H "Authorization: Bearer $SERVFLO_API_KEY "
200: the answer's fields Field Type Description idstring namestring documentLabelstring tradeKeystring or null partsarray of string fileNamestring contentTypestring sizeBytesinteger pagesinteger or null pagesEstimatedboolean Word files: pages are estimated (about 3,000 characters each). statusenum UPLOADING → 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 estimateobject About how many AI credits reading this document uses. estimate.creditsinteger estimate.modelstring creditsUsedinteger errorstring or null templateIdstring or null The template made from it (SAVED). countsobject counts.sectionsinteger counts.itemsinteger counts.fieldsinteger counts.commentsinteger counts.limitationsinteger counts.acceptedinteger counts.removedinteger counts.pendinginteger draftobject The 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[].decisionenum One of pending, accepted, removed. draft.sections[].itemsarray of object fileUrlstring or null A 10-minute link to the source document. createdAtstring (date-time) finishedAtstring (date-time) or null
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.
Permission serviceReports.manage (Owner, Admin)Risk write, OAuth scope servflo.write. Write: creates or changes records inside the business; nothing leaves it.MCP tool serviceReportTemplates_importReview (toolset serviceReports)
Name In Type Required Description draftIdpath string Yes A template draft (GET /service-report-template-imports).
Field Type Required Description elementIdstring Yes The element's id inside the draft. Up to 100 characters. decisionenum or null No One of pending, accepted, removed. patchobject or null No Fields to correct.
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"}'
200: the answer's fields Field Type Description idstring namestring documentLabelstring tradeKeystring or null partsarray of string fileNamestring contentTypestring sizeBytesinteger pagesinteger or null pagesEstimatedboolean Word files: pages are estimated (about 3,000 characters each). statusenum UPLOADING → 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 estimateobject About how many AI credits reading this document uses. estimate.creditsinteger estimate.modelstring creditsUsedinteger errorstring or null templateIdstring or null The template made from it (SAVED). countsobject counts.sectionsinteger counts.itemsinteger counts.fieldsinteger counts.commentsinteger counts.limitationsinteger counts.acceptedinteger counts.removedinteger counts.pendinginteger draftobject The 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[].decisionenum One of pending, accepted, removed. draft.sections[].itemsarray of object fileUrlstring or null A 10-minute link to the source document. createdAtstring (date-time) finishedAtstring (date-time) or null
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.
Permission serviceReports.manage (Owner, Admin)Risk write, OAuth scope servflo.write. Write: creates or changes records inside the business; nothing leaves it.MCP tool serviceReportTemplates_importSave (toolset serviceReports)
Name In Type Required Description draftIdpath string Yes A template draft (GET /service-report-template-imports).
curl -X POST "https://app.servflo.ai/api/organizations/ $ORGANIZATION_ID /service-report-template-imports/{draftId}/save" \
-H "Authorization: Bearer $SERVFLO_API_KEY "
200: the answer's fields Field Type Description templateIdstring createdboolean templateobject template.idstring template.namestring