DevelopersAPI referenceProjects

Selections API

REST endpoints for selections in ServFlo: 6 operations with parameters, request and response fields, permissions and curl examples.

Base URL: https://app.servflo.ai/api. Every call needs Authorization: Bearer sfk_… (Authentication); {organizationId} ($ORGANIZATION_ID in the examples) is your business's id.

OperationEndpointRisk
A project's selectionsGET /organizations/{organizationId}/projects/{projectId}/selectionsread
Add a selectionPOST /organizations/{organizationId}/projects/{projectId}/selectionswrite
Change a selectionPATCH /organizations/{organizationId}/selections/{selectionId}write
Delete a selectionDELETE /organizations/{organizationId}/selections/{selectionId}sensitive
Let the customer choose againPOST /organizations/{organizationId}/selections/{selectionId}/reopenwrite
Record the customer's choicePOST /organizations/{organizationId}/selections/{selectionId}/choosesensitive

A project's selections

GET /organizations/{organizationId}/projects/{projectId}/selections

The choices the customer makes (flooring, cabinets, fixtures) with the allowance, options and what was chosen. Read-only.

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

Parameters

NameInTypeRequiredDescription
projectIdpathstringYesThe project (GET /projects).

Example

curl "https://app.servflo.ai/api/organizations/$ORGANIZATION_ID/projects/{projectId}/selections" \
  -H "Authorization: Bearer $SERVFLO_API_KEY"

Response

200: the answer's fields

An array of objects:

FieldTypeDescription
idstring
projectIdstring
titlestring
allowanceCentsinteger
statusenumOne of OPEN, SELECTED.
dueDatestring or null
chosenOptionIdstring or null
changeOrderIdstring or null
optionsarray of object
options[].idstring
options[].namestring
options[].priceCentsinteger
options[].differenceCentsintegerPrice − allowance: positive is an upgrade.

Add a selection

POST /organizations/{organizationId}/projects/{projectId}/selections

A choice for the customer with its allowance (what the contract includes), a due date and options (each with a price and a photo from the project's files). The customer picks in the portal; a pick over or under the allowance becomes an approved change order for the difference.

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

Parameters

NameInTypeRequiredDescription
projectIdpathstringYesThe project (GET /projects).

Request body

FieldTypeRequiredDescription
titlestringYesUp to 200 characters.
categorystring or nullNoUp to 100 characters.
descriptionstring or nullNoUp to 5000 characters.
dueDateempty string or string or nullNo
allowanceCentsintegerNoMoney in integer cents (12500 = 125.00). -100000000–100000000. Default 0.
optionsarray of objectNoUp to 30 items. Default [].
options[].namestringYesUp to 200 characters.
options[].descriptionstring or nullNoUp to 2000 characters.
options[].priceCentsintegerYesMoney in integer cents (12500 = 125.00). -100000000–100000000.
options[].fileIdstring or nullNoA photo from the project's files (GET …/files).

Example

curl -X POST "https://app.servflo.ai/api/organizations/$ORGANIZATION_ID/projects/{projectId}/selections" \
  -H "Authorization: Bearer $SERVFLO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"title":"string"}'

Response

201: the answer's fields
FieldTypeDescription
idstring
projectIdstring
titlestring
allowanceCentsinteger
statusenumOne of OPEN, SELECTED.
dueDatestring or null
chosenOptionIdstring or null
changeOrderIdstring or null
optionsarray of object
options[].idstring
options[].namestring
options[].priceCentsinteger
options[].differenceCentsintegerPrice − allowance: positive is an upgrade.

Change a selection

PATCH /organizations/{organizationId}/selections/{selectionId}

Title, category, description, due date; the allowance and options (all of them) only while it is OPEN.

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

Parameters

NameInTypeRequiredDescription
selectionIdpathstringYes

Request body

FieldTypeRequiredDescription
titlestringNoUp to 200 characters.
categorystring or nullNoUp to 100 characters.
descriptionstring or nullNoUp to 5000 characters.
dueDateempty string or string or nullNo
allowanceCentsintegerNoMoney in integer cents (12500 = 125.00). -100000000–100000000.
optionsarray of objectNoUp to 30 items.
options[].namestringYesUp to 200 characters.
options[].descriptionstring or nullNoUp to 2000 characters.
options[].priceCentsintegerYesMoney in integer cents (12500 = 125.00). -100000000–100000000.
options[].fileIdstring or nullNoA photo from the project's files (GET …/files).

Example

curl -X PATCH "https://app.servflo.ai/api/organizations/$ORGANIZATION_ID/selections/{selectionId}" \
  -H "Authorization: Bearer $SERVFLO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"title":"string","category":"string","description":"string"}'

Response

200: the answer's fields
FieldTypeDescription
idstring
projectIdstring
titlestring
allowanceCentsinteger
statusenumOne of OPEN, SELECTED.
dueDatestring or null
chosenOptionIdstring or null
changeOrderIdstring or null
optionsarray of object
options[].idstring
options[].namestring
options[].priceCentsinteger
options[].differenceCentsintegerPrice − allowance: positive is an upgrade.

Delete a selection

DELETE /organizations/{organizationId}/selections/{selectionId}

Destructive: deletes a selection that has not made a change order.

Permissionprojects.write (Owner, Admin, Dispatcher)
Risksensitive, OAuth scope servflo.sensitive. Sensitive: moves money, deletes, sends or shows something to a customer, or grants or revokes access.
MCP toolselections_delete (toolset projects)
ApprovalOver MCP, this tool always waits for your approval in ServFlo. See Approvals.

Parameters

NameInTypeRequiredDescription
selectionIdpathstringYes

Example

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

Response

200: the answer's fields
FieldTypeDescription
oktrue

Let the customer choose again

POST /organizations/{organizationId}/selections/{selectionId}/reopen

Opens a made choice again; the next pick is priced against the earlier one (a new change order for the difference).

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

Parameters

NameInTypeRequiredDescription
selectionIdpathstringYes

Example

curl -X POST "https://app.servflo.ai/api/organizations/$ORGANIZATION_ID/selections/{selectionId}/reopen" \
  -H "Authorization: Bearer $SERVFLO_API_KEY"

Response

200: the answer's fields
FieldTypeDescription
idstring
projectIdstring
titlestring
allowanceCentsinteger
statusenumOne of OPEN, SELECTED.
dueDatestring or null
chosenOptionIdstring or null
changeOrderIdstring or null
optionsarray of object
options[].idstring
options[].namestring
options[].priceCentsinteger
options[].differenceCentsintegerPrice − allowance: positive is an upgrade.

Record the customer's choice

POST /organizations/{organizationId}/selections/{selectionId}/choose

Acts for the customer and changes the contract: records the option the customer chose (name: theirs, as they confirmed it). A price over or under the allowance becomes an APPROVED change order for the difference (contract, budget and progress billing follow).

Permissionprojects.write (Owner, Admin, Dispatcher)
Risksensitive, OAuth scope servflo.sensitive. Sensitive: moves money, deletes, sends or shows something to a customer, or grants or revokes access.
MCP toolselections_choose (toolset projects)
ApprovalOver MCP, this tool asks for your OK first (in the AI app when it supports it, otherwise in ServFlo). See Approvals.

Parameters

NameInTypeRequiredDescription
selectionIdpathstringYes

Request body

FieldTypeRequiredDescription
optionIdstringYes
namestringYesUp to 200 characters.

Example

curl -X POST "https://app.servflo.ai/api/organizations/$ORGANIZATION_ID/selections/{selectionId}/choose" \
  -H "Authorization: Bearer $SERVFLO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"optionId":"option_id","name":"Dana Whitfield"}'

Response

200: the answer's fields
FieldTypeDescription
selectionobject
selection.idstring
selection.projectIdstring
selection.titlestring
selection.allowanceCentsinteger
selection.statusenumOne of OPEN, SELECTED.
selection.dueDatestring or null
selection.chosenOptionIdstring or null
selection.changeOrderIdstring or null
selection.optionsarray of object
selection.options[].idstring
selection.options[].namestring
selection.options[].priceCentsinteger
selection.options[].differenceCentsintegerPrice − allowance: positive is an upgrade.
changeOrderIdstring or null

On this page