REST endpoints for inventory in ServFlo: 16 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}/inventory/locations
Warehouses and trucks with item, low-stock and negative counts (and stock value with costing.read). A technician sees only their own truck(s). Read-only.
POST /organizations/{organizationId}/inventory/locations
Adds a location. The first warehouse becomes the default. A TRUCK names its technician: material that technician uses on a job is drawn from it. Returns the location.
Permission
inventory.manage (Owner, Admin, Dispatcher)
Risk
write, OAuth scope servflo.write. Write: creates or changes records inside the business; nothing leaves it.
GET /organizations/{organizationId}/inventory/locations/{locationId}
One warehouse or truck with every stock level there (status, reorder point, suggested order). A technician gets 404 for any location but their own truck. Read-only.
GET /organizations/{organizationId}/inventory/stock
Stock per item and location, filtered by location, item or text; lowOnly is the Low stock view (at or below the reorder point, or negative). A technician sees only their truck. Paged with a total. Read-only.
GET /organizations/{organizationId}/inventory/movements
Stock movements newest first, filtered by item, location, job, purchase order or kind; each with the signed quantity and the balance after. Append-only. A technician sees their own truck's. Read-only.
RECEIVE (purchase receipt), TRANSFER_OUT / TRANSFER_IN (the two halves of a transfer), USE (on a job), RETURN (back from a job), ADJUST (correction or count). One of RECEIVE, TRANSFER_OUT, TRANSFER_IN, USE, RETURN, ADJUST.
limit
query
integer
No
Page size, 1–200. Default 50.
offset
query
integer
No
Rows to skip; the answer's total counts every match. Default 0.
RECEIVE (purchase receipt), TRANSFER_OUT / TRANSFER_IN (the two halves of a transfer), USE (on a job), RETURN (back from a job), ADJUST (correction or count). One of RECEIVE, TRANSFER_OUT, TRANSFER_IN, USE, RETURN, ADJUST.
items[].quantity
number
Signed: positive into the location, negative out of it.
items[].balanceAfter
number
The location's on-hand after this movement.
items[].costCents
integer
Integer cents. Present only for roles with costing.read.
items[].jobId
string or null
items[].purchaseOrderId
string or null
items[].transferId
string or null
items[].userId
string or null
items[].reason
string or null
items[].createdAt
string (date-time)
items[].item
object
items[].item.id
string
items[].item.code
string or null
items[].item.name
string
items[].item.unit
string
items[].location
object
items[].location.id
string
items[].location.name
string
items[].location.kind
enum
WAREHOUSE, or TRUCK (a technician's van, stocked from a warehouse). One of WAREHOUSE, TRUCK.
POST /organizations/{organizationId}/inventory/adjustments
Adds (positive) or removes (negative) stock at a location with a reason (damage, found, correction): an ADJUST movement in the ledger. Negative stock is allowed and flagged. Returns the movement and the new level.
Permission
inventory.manage (Owner, Admin, Dispatcher)
Risk
write, OAuth scope servflo.write. Write: creates or changes records inside the business; nothing leaves it.
RECEIVE (purchase receipt), TRANSFER_OUT / TRANSFER_IN (the two halves of a transfer), USE (on a job), RETURN (back from a job), ADJUST (correction or count). One of RECEIVE, TRANSFER_OUT, TRANSFER_IN, USE, RETURN, ADJUST.
movement.quantity
number
Signed: positive into the location, negative out of it.
movement.balanceAfter
number
The location's on-hand after this movement.
movement.costCents
integer
Integer cents. Present only for roles with costing.read.
movement.jobId
string or null
movement.purchaseOrderId
string or null
movement.transferId
string or null
movement.userId
string or null
movement.reason
string or null
movement.createdAt
string (date-time)
level
object
level.itemId
string
level.locationId
string
level.onHand
number
negative
boolean
The location is below zero now (allowed, flagged).
POST /organizations/{organizationId}/inventory/counts
Sets each counted item at a location to what was counted (an ADJUST movement for each difference; unchanged items are not moved). Returns what changed.
Permission
inventory.manage (Owner, Admin, Dispatcher)
Risk
write, OAuth scope servflo.write. Write: creates or changes records inside the business; nothing leaves it.
POST /organizations/{organizationId}/inventory/transfers
Moves stock from one location to another (a warehouse restocking a truck): a TRANSFER_OUT and a TRANSFER_IN per line, sharing a transferId, in one transaction. The source may go negative (flagged). Returns the new levels.
Permission
inventory.manage (Owner, Admin, Dispatcher)
Risk
write, OAuth scope servflo.write. Write: creates or changes records inside the business; nothing leaves it.
GET /organizations/{organizationId}/parts-requests
What technicians asked for from the app (PRQ-n), newest first: for a job or to restock their truck, with the lines, the technician, the job and the truck. open=true lists REQUESTED, ORDERED and READY. Read-only.
For a job, or to restock the truck. One of JOB, RESTOCK.
status
enum
REQUESTED → ORDERED (from a supplier) → READY (waiting for pickup) → DONE (on the truck), or CANCELLED. One of REQUESTED, ORDERED, READY, DONE, CANCELLED.
For a job, or to restock the truck. One of JOB, RESTOCK.
status
enum
REQUESTED → ORDERED (from a supplier) → READY (waiting for pickup) → DONE (on the truck), or CANCELLED. One of REQUESTED, ORDERED, READY, DONE, CANCELLED.
Tells the technician: sets the status (REQUESTED → ORDERED → READY → DONE, or CANCELLED from any open status) and an optional officeNote ('At Ferguson, counter 2'); the technician's phone is told when it is ordered, ready or cancelled. 409 for a closed request.
Permission
inventory.manage (Owner, Admin, Dispatcher)
Risk
write, OAuth scope servflo.write. Write: creates or changes records inside the business; nothing leaves it.
For a job, or to restock the truck. One of JOB, RESTOCK.
status
enum
REQUESTED → ORDERED (from a supplier) → READY (waiting for pickup) → DONE (on the truck), or CANCELLED. One of REQUESTED, ORDERED, READY, DONE, CANCELLED.
POST /organizations/{organizationId}/parts-requests/{partsRequestId}/fulfil
Moves stock: transfers the request's pricebook lines from fromLocationId (a warehouse, GET /inventory/locations) onto the technician's truck as an ordinary transfer, then marks the request DONE. Lines without a pricebook item are left to the office. 400 when the technician has no truck or stock is short.
Permission
inventory.manage (Owner, Admin, Dispatcher)
Risk
write, OAuth scope servflo.write. Write: creates or changes records inside the business; nothing leaves it.
For a job, or to restock the truck. One of JOB, RESTOCK.
status
enum
REQUESTED → ORDERED (from a supplier) → READY (waiting for pickup) → DONE (on the truck), or CANCELLED. One of REQUESTED, ORDERED, READY, DONE, CANCELLED.