REST endpoints for project files in ServFlo: 6 operations with parameters, request and response fields, permissions and curl examples.
Base URL: https://app.servflo.ai/api. Every call needs Authorization: Bearer sfk_… (Authentication); {organizationId} ($ORGANIZATION_ID in the examples) is your business's id.
GET /organizations/{organizationId}/projects/{projectId}/files
Plans, permits, contracts, photos and lien waivers with who they are shared with and 10-minute URLs. Technicians see those shared with the crew. Read-only.
POST /organizations/{organizationId}/projects/{projectId}/files
Step 1 of a browser upload: records the file and returns a signed URL to PUT it to (5 minutes, same Content-Type), then POST …/files/{projectFileId}/confirm. Up to 25 MB. Sharing defaults by category (plans: everyone; photos: the crew). API keys and AI apps use POST …/files/content.
PLAN, PERMIT, CONTRACT, PHOTO, SELECTION, LIEN_WAIVER or OTHER (the crew adds PHOTO or OTHER). One of PLAN, PERMIT, CONTRACT, PHOTO, SELECTION, LIEN_WAIVER, OTHER. Default OTHER.
phaseId
string or null
No
dailyLogId
string or null
No
A photo of this daily log.
subPaymentId
string or null
No
A lien waiver for this payment to a subcontractor.
POST /organizations/{organizationId}/projects/{projectId}/files/content
Adds a plan, permit, contract, photo or lien waiver in one call: send contentBase64 or a public sourceUrl (up to 10 MB). Returns the file with a 10-minute URL.
PLAN, PERMIT, CONTRACT, PHOTO, SELECTION, LIEN_WAIVER or OTHER (the crew adds PHOTO or OTHER). One of PLAN, PERMIT, CONTRACT, PHOTO, SELECTION, LIEN_WAIVER, OTHER. Default OTHER.
phaseId
string or null
No
dailyLogId
string or null
No
A photo of this daily log.
subPaymentId
string or null
No
A lien waiver for this payment to a subcontractor.
sharedWithCrew
boolean
No
sharedWithSubs
boolean
No
sharedWithCustomer
boolean
No
fileName
string
No
The file's name, e.g. receipt.jpg (default: from the URL, else 'file'). Up to 500 characters.
contentType
string
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.
contentBase64
string
No
The file's bytes as base64 (a data: URL is accepted too). Up to 10 MB. Give this or sourceUrl.
sourceUrl
string (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.
EXPOSES TO THE CUSTOMER OR SUBS when switched on: who the file is shared with (crew, subcontractors' links, the customer's portal), its category and phase.
Permission
projects.write (Owner, Admin, Dispatcher)
Risk
sensitive, OAuth scope servflo.sensitive. Sensitive: moves money, deletes, sends or shows something to a customer, or grants or revokes access.
MCP tool
projectFiles_update (toolset projects)
Approval
Over MCP, this tool asks for your OK first (in the AI app when it supports it, otherwise in ServFlo). See Approvals.