Developers API reference Projects 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 .
GET /organizations/{organizationId}/projects/{projectId}/selections
The choices the customer makes (flooring, cabinets, fixtures) with the allowance, options and what was chosen. Read-only.
Permission projects.read (Owner, Admin, Dispatcher, Technician, Member)Risk read, OAuth scope servflo.read. Read: reads only.MCP tool selections_list (toolset projects)
Name In Type Required Description projectIdpath string Yes The project (GET /projects).
curl "https://app.servflo.ai/api/organizations/ $ORGANIZATION_ID /projects/{projectId}/selections" \
-H "Authorization: Bearer $SERVFLO_API_KEY "
200: the answer's fields An array of objects:
Field Type Description idstring projectIdstring titlestring allowanceCentsinteger statusenum One of OPEN, SELECTED. dueDatestring or null chosenOptionIdstring or null changeOrderIdstring or null optionsarray of object options[].idstring options[].namestring options[].priceCentsinteger options[].differenceCentsinteger Price − allowance: positive is an upgrade.
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.
Permission projects.write (Owner, Admin, Dispatcher)Risk write, OAuth scope servflo.write. Write: creates or changes records inside the business; nothing leaves it.MCP tool selections_create (toolset projects)
Name In Type Required Description projectIdpath string Yes The project (GET /projects).
Field Type Required Description titlestring Yes Up to 200 characters. categorystring or null No Up to 100 characters. descriptionstring or null No Up to 5000 characters. dueDateempty string or string or null No allowanceCentsinteger No Money in integer cents (12500 = 125.00). -100000000–100000000. Default 0. optionsarray of object No Up to 30 items. Default []. options[].namestring Yes Up to 200 characters. options[].descriptionstring or null No Up to 2000 characters. options[].priceCentsinteger Yes Money in integer cents (12500 = 125.00). -100000000–100000000. options[].fileIdstring or null No A photo from the project's files (GET …/files).
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"}'
201: the answer's fields Field Type Description idstring projectIdstring titlestring allowanceCentsinteger statusenum One of OPEN, SELECTED. dueDatestring or null chosenOptionIdstring or null changeOrderIdstring or null optionsarray of object options[].idstring options[].namestring options[].priceCentsinteger options[].differenceCentsinteger Price − allowance: positive is an upgrade.
PATCH /organizations/{organizationId}/selections/{selectionId}
Title, category, description, due date; the allowance and options (all of them) only while it is OPEN.
Permission projects.write (Owner, Admin, Dispatcher)Risk write, OAuth scope servflo.write. Write: creates or changes records inside the business; nothing leaves it.MCP tool selections_update (toolset projects)
Name In Type Required Description selectionIdpath string Yes
Field Type Required Description titlestring No Up to 200 characters. categorystring or null No Up to 100 characters. descriptionstring or null No Up to 5000 characters. dueDateempty string or string or null No allowanceCentsinteger No Money in integer cents (12500 = 125.00). -100000000–100000000. optionsarray of object No Up to 30 items. options[].namestring Yes Up to 200 characters. options[].descriptionstring or null No Up to 2000 characters. options[].priceCentsinteger Yes Money in integer cents (12500 = 125.00). -100000000–100000000. options[].fileIdstring or null No A photo from the project's files (GET …/files).
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"}'
200: the answer's fields Field Type Description idstring projectIdstring titlestring allowanceCentsinteger statusenum One of OPEN, SELECTED. dueDatestring or null chosenOptionIdstring or null changeOrderIdstring or null optionsarray of object options[].idstring options[].namestring options[].priceCentsinteger options[].differenceCentsinteger Price − allowance: positive is an upgrade.
DELETE /organizations/{organizationId}/selections/{selectionId}
Destructive: deletes a selection that has not made a change order.
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 selections_delete (toolset projects)Approval Over MCP, this tool always waits for your approval in ServFlo. See Approvals .
Name In Type Required Description selectionIdpath string Yes
curl -X DELETE "https://app.servflo.ai/api/organizations/ $ORGANIZATION_ID /selections/{selectionId}" \
-H "Authorization: Bearer $SERVFLO_API_KEY "
200: the answer's fields Field Type Description oktrue
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).
Permission projects.write (Owner, Admin, Dispatcher)Risk write, OAuth scope servflo.write. Write: creates or changes records inside the business; nothing leaves it.MCP tool selections_reopen (toolset projects)
Name In Type Required Description selectionIdpath string Yes
curl -X POST "https://app.servflo.ai/api/organizations/ $ORGANIZATION_ID /selections/{selectionId}/reopen" \
-H "Authorization: Bearer $SERVFLO_API_KEY "
200: the answer's fields Field Type Description idstring projectIdstring titlestring allowanceCentsinteger statusenum One of OPEN, SELECTED. dueDatestring or null chosenOptionIdstring or null changeOrderIdstring or null optionsarray of object options[].idstring options[].namestring options[].priceCentsinteger options[].differenceCentsinteger Price − allowance: positive is an upgrade.
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).
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 selections_choose (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 .
Name In Type Required Description selectionIdpath string Yes
Field Type Required Description optionIdstring Yes namestring Yes Up to 200 characters.
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"}'
200: the answer's fields Field Type Description selectionobject selection.idstring selection.projectIdstring selection.titlestring selection.allowanceCentsinteger selection.statusenum One 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[].differenceCentsinteger Price − allowance: positive is an upgrade. changeOrderIdstring or null