DevelopersAPI reference

Inventory API

REST endpoints for inventory in SKUFlow: 11 operations with parameters, request and response fields, permissions and curl examples.

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

OperationEndpointRisk
List stock locationsGET /organizations/{organizationId}/inventory/locationsread
Create a warehousePOST /organizations/{organizationId}/inventory/locationswrite
Get a location with its stockGET /organizations/{organizationId}/inventory/locations/{locationId}read
Update a locationPATCH /organizations/{organizationId}/inventory/locations/{locationId}write
Delete a locationDELETE /organizations/{organizationId}/inventory/locations/{locationId}sensitive
List stock levelsGET /organizations/{organizationId}/inventory/stockread
The stock ledgerGET /organizations/{organizationId}/inventory/movementsread
Set a reorder pointPATCH /organizations/{organizationId}/inventory/levelswrite
Adjust stockPOST /organizations/{organizationId}/inventory/adjustmentswrite
Record a stock countPOST /organizations/{organizationId}/inventory/countswrite
Transfer stock between locationsPOST /organizations/{organizationId}/inventory/transferswrite

List stock locations

GET /organizations/{organizationId}/inventory/locations

Warehouses (stock locations) with item, low-stock and negative counts (and stock value with costing.read). Read-only.

Permissioninventory.read (Owner, Admin, Staff, Member)
Riskread, OAuth scope skuflow.read. Read: reads only.
MCP toolinventoryLocations_list (toolset pricebook)

Parameters

NameInTypeRequiredDescription
includeInactivequeryboolean or enumNo

Example

curl "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/inventory/locations" \
  -H "Authorization: Bearer $SKUFLOW_API_KEY"

Response

200: the answer's fields

An array of objects:

FieldTypeDescription
idstring
organizationIdstring
namestring
addressstring or null
isDefaultboolean
activeboolean
createdAtstring (date-time)
updatedAtstring (date-time)
itemCountintegerItems with stock (or negative stock) here.
lowCountintegerItems at or below their reorder point, or negative.
negativeCountinteger
stockValueCentsintegerInteger cents. Present only for roles with costing.read.

Create a warehouse

POST /organizations/{organizationId}/inventory/locations

Adds a warehouse (stock location). The first one becomes the default. Returns the location.

Permissioninventory.manage (Owner, Admin, Staff)
Riskwrite, OAuth scope skuflow.write. Write: creates or changes records inside the business; nothing leaves it.
MCP toolinventoryLocations_create (toolset pricebook)
PlanInventory and purchasing: the Pro plan and up.

Request body

FieldTypeRequiredDescription
namestringYesUp to 200 characters.
addressstring or nullNoUp to 500 characters.
isDefaultbooleanNoThe default warehouse, listed first and preselected for purchase orders. Only one is.
activebooleanNoRetired locations (false) are hidden.

Example

curl -X POST "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/inventory/locations" \
  -H "Authorization: Bearer $SKUFLOW_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"Dana Whitfield"}'

Response

201: the answer's fields
FieldTypeDescription
idstring
organizationIdstring
namestring
addressstring or null
isDefaultboolean
activeboolean
createdAtstring (date-time)
updatedAtstring (date-time)

Get a location with its stock

GET /organizations/{organizationId}/inventory/locations/{locationId}

One warehouse with every stock level there (status, reorder point, suggested order). Read-only.

Permissioninventory.read (Owner, Admin, Staff, Member)
Riskread, OAuth scope skuflow.read. Read: reads only.
MCP toolinventoryLocations_get (toolset pricebook)

Parameters

NameInTypeRequiredDescription
locationIdpathstringYes

Example

curl "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/inventory/locations/{locationId}" \
  -H "Authorization: Bearer $SKUFLOW_API_KEY"

Response

200: the answer's fields
FieldTypeDescription
idstring
organizationIdstring
namestring
addressstring or null
isDefaultboolean
activeboolean
createdAtstring (date-time)
updatedAtstring (date-time)
levelsarray of object
levels[].idstring
levels[].organizationIdstring
levels[].itemIdstring
levels[].locationIdstring
levels[].onHandnumber
levels[].reorderPointnumber or null
levels[].reorderQtynumber or null
levels[].updatedAtstring (date-time)
levels[].itemobject
levels[].item.idstring
levels[].item.codestring or null
levels[].item.namestring
levels[].item.unitstring
levels[].item.kindstring
levels[].item.costCentsintegerInteger cents. Present only for roles with costing.read.
levels[].item.vendorIdstring or null
levels[].item.vendorobject or null
levels[].item.categoryIdstring or null
levels[].locationobject
levels[].location.idstring
levels[].location.namestring
levels[].statusenumNEGATIVE below zero (allowed, flagged), OUT at 0, LOW at or below the reorder point. One of NEGATIVE, OUT, LOW, OK.
levels[].lowboolean
levels[].suggestedQuantitynumberWhat to order when low: the reorder quantity, else enough to clear the point.
levels[].stockValueCentsintegerInteger cents. Present only for roles with costing.read.
lowCountinteger
stockValueCentsintegerInteger cents. Present only for roles with costing.read.

Update a location

PATCH /organizations/{organizationId}/inventory/locations/{locationId}

Renames it, changes its address, makes it the default warehouse, or retires it (active: false). Returns it.

Permissioninventory.manage (Owner, Admin, Staff)
Riskwrite, OAuth scope skuflow.write. Write: creates or changes records inside the business; nothing leaves it.
MCP toolinventoryLocations_update (toolset pricebook)
PlanInventory and purchasing: the Pro plan and up.

Parameters

NameInTypeRequiredDescription
locationIdpathstringYes

Request body

FieldTypeRequiredDescription
namestringNoUp to 200 characters.
addressstring or nullNoUp to 500 characters.
isDefaultbooleanNoThe default warehouse, listed first and preselected for purchase orders. Only one is.
activebooleanNoRetired locations (false) are hidden.

Example

curl -X PATCH "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/inventory/locations/{locationId}" \
  -H "Authorization: Bearer $SKUFLOW_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"Dana Whitfield","address":"string","isDefault":true}'

Response

200: the answer's fields
FieldTypeDescription
idstring
organizationIdstring
namestring
addressstring or null
isDefaultboolean
activeboolean
createdAtstring (date-time)
updatedAtstring (date-time)

Delete a location

DELETE /organizations/{organizationId}/inventory/locations/{locationId}

Destructive: deletes a location that never held stock or received an order (409 otherwise: retire it with active: false, the ledger is kept).

Permissioninventory.manage (Owner, Admin, Staff)
Risksensitive, OAuth scope skuflow.sensitive. Sensitive: moves money, deletes, sends or shows something to a customer, or grants or revokes access.
MCP toolinventoryLocations_delete (toolset pricebook)
PlanInventory and purchasing: the Pro plan and up.
ApprovalOver MCP, this tool always waits for your approval in SKUFlow. See Approvals.

Parameters

NameInTypeRequiredDescription
locationIdpathstringYes

Example

curl -X DELETE "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/inventory/locations/{locationId}" \
  -H "Authorization: Bearer $SKUFLOW_API_KEY"

Response

200: the answer's fields
FieldTypeDescription
oktrue

List stock levels

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). Paged with a total. Read-only.

Permissioninventory.read (Owner, Admin, Staff, Member)
Riskread, OAuth scope skuflow.read. Read: reads only.
MCP toolinventory_stock (toolset pricebook, in the default set)

Parameters

NameInTypeRequiredDescription
locationIdquerystringNo
itemIdquerystringNo
queryquerystringNoFree-text search over the list's names, numbers and contact details. Up to 200 characters.
lowOnlyqueryboolean or enumNo
limitqueryintegerNoPage size, 1–200. Default 50.
offsetqueryintegerNoRows to skip; the answer's total counts every match. Default 0.

Example

curl "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/inventory/stock" \
  -H "Authorization: Bearer $SKUFLOW_API_KEY"

Response

200: the answer's fields
FieldTypeDescription
itemsarray of object
items[].idstring
items[].organizationIdstring
items[].itemIdstring
items[].locationIdstring
items[].onHandnumber
items[].reorderPointnumber or null
items[].reorderQtynumber or null
items[].updatedAtstring (date-time)
items[].itemobject
items[].item.idstring
items[].item.codestring or null
items[].item.namestring
items[].item.unitstring
items[].item.kindstring
items[].item.costCentsintegerInteger cents. Present only for roles with costing.read.
items[].item.vendorIdstring or null
items[].item.vendorobject or null
items[].item.categoryIdstring or null
items[].locationobject
items[].location.idstring
items[].location.namestring
items[].statusenumNEGATIVE below zero (allowed, flagged), OUT at 0, LOW at or below the reorder point. One of NEGATIVE, OUT, LOW, OK.
items[].lowboolean
items[].suggestedQuantitynumberWhat to order when low: the reorder quantity, else enough to clear the point.
items[].stockValueCentsintegerInteger cents. Present only for roles with costing.read.
totalinteger

The stock ledger

GET /organizations/{organizationId}/inventory/movements

Stock movements newest first, filtered by item, location, purchase order or kind; each with the signed quantity and the balance after. Append-only. Read-only.

Permissioninventory.read (Owner, Admin, Staff, Member)
Riskread, OAuth scope skuflow.read. Read: reads only.
MCP toolinventory_movements (toolset pricebook)

Parameters

NameInTypeRequiredDescription
itemIdquerystringNo
locationIdquerystringNo
purchaseOrderIdquerystringNo
kindqueryenumNoRECEIVE (purchase receipt), TRANSFER_OUT / TRANSFER_IN (the two halves of a transfer), USE (consumed in production or sold), RETURN (back into stock), ADJUST (correction or count). One of RECEIVE, TRANSFER_OUT, TRANSFER_IN, USE, RETURN, ADJUST.
limitqueryintegerNoPage size, 1–200. Default 50.
offsetqueryintegerNoRows to skip; the answer's total counts every match. Default 0.

Example

curl "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/inventory/movements" \
  -H "Authorization: Bearer $SKUFLOW_API_KEY"

Response

200: the answer's fields
FieldTypeDescription
itemsarray of object
items[].idstring
items[].itemIdstring
items[].locationIdstring
items[].kindenumRECEIVE (purchase receipt), TRANSFER_OUT / TRANSFER_IN (the two halves of a transfer), USE (consumed in production or sold), RETURN (back into stock), ADJUST (correction or count). One of RECEIVE, TRANSFER_OUT, TRANSFER_IN, USE, RETURN, ADJUST.
items[].quantitynumberSigned: positive into the location, negative out of it.
items[].balanceAfternumberThe location's on-hand after this movement.
items[].costCentsintegerInteger cents. Present only for roles with costing.read.
items[].purchaseOrderIdstring or null
items[].transferIdstring or null
items[].userIdstring or null
items[].reasonstring or null
items[].createdAtstring (date-time)
items[].itemobject
items[].item.idstring
items[].item.codestring or null
items[].item.namestring
items[].item.unitstring
items[].locationobject
items[].location.idstring
items[].location.namestring
items[].purchaseOrderobject or null
items[].purchaseOrder.idstring
items[].purchaseOrder.identifierstring
totalinteger

Set a reorder point

PATCH /organizations/{organizationId}/inventory/levels

Sets the reorder point and reorder quantity of an item at a location (null clears them). Stock is not changed (use adjustments). Returns the level.

Permissioninventory.manage (Owner, Admin, Staff)
Riskwrite, OAuth scope skuflow.write. Write: creates or changes records inside the business; nothing leaves it.
MCP toolinventory_setLevel (toolset pricebook)
PlanInventory and purchasing: the Pro plan and up.

Request body

FieldTypeRequiredDescription
itemIdstringYesA stocked MATERIAL item (GET /pricebook/items).
locationIdstringYes
reorderPointnumber or nullNoLow at or below this. 0–1000000.
reorderQtynumber or nullNoHow many to order. 0–1000000.

Example

curl -X PATCH "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/inventory/levels" \
  -H "Authorization: Bearer $SKUFLOW_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"itemId":"item_id","locationId":"location_id"}'

Response

200: the answer's fields
FieldTypeDescription
idstring
organizationIdstring
itemIdstring
locationIdstring
onHandnumber
reorderPointnumber or null
reorderQtynumber or null
updatedAtstring (date-time)
itemobject
item.idstring
item.codestring or null
item.namestring
item.unitstring
item.kindstring
item.costCentsintegerInteger cents. Present only for roles with costing.read.
item.vendorIdstring or null
item.vendorobject or null
item.vendor.idstring
item.vendor.namestring
item.categoryIdstring or null
locationobject
location.idstring
location.namestring
statusenumNEGATIVE below zero (allowed, flagged), OUT at 0, LOW at or below the reorder point. One of NEGATIVE, OUT, LOW, OK.
lowboolean
suggestedQuantitynumberWhat to order when low: the reorder quantity, else enough to clear the point.
stockValueCentsintegerInteger cents. Present only for roles with costing.read.

Adjust stock

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.

Permissioninventory.manage (Owner, Admin, Staff)
Riskwrite, OAuth scope skuflow.write. Write: creates or changes records inside the business; nothing leaves it.
MCP toolinventory_adjust (toolset pricebook)
PlanInventory and purchasing: the Pro plan and up.

Request body

FieldTypeRequiredDescription
itemIdstringYes
locationIdstringYes
quantitynumberYesUnits of the item; may be fractional. -1000000–1000000.
reasonstringYesWhy (required). Up to 1000 characters.

Example

curl -X POST "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/inventory/adjustments" \
  -H "Authorization: Bearer $SKUFLOW_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"itemId":"item_id","locationId":"location_id","quantity":1,"reason":"string"}'

Response

201: the answer's fields
FieldTypeDescription
movementobject
movement.idstring
movement.itemIdstring
movement.locationIdstring
movement.kindenumRECEIVE (purchase receipt), TRANSFER_OUT / TRANSFER_IN (the two halves of a transfer), USE (consumed in production or sold), RETURN (back into stock), ADJUST (correction or count). One of RECEIVE, TRANSFER_OUT, TRANSFER_IN, USE, RETURN, ADJUST.
movement.quantitynumberSigned: positive into the location, negative out of it.
movement.balanceAfternumberThe location's on-hand after this movement.
movement.costCentsintegerInteger cents. Present only for roles with costing.read.
movement.purchaseOrderIdstring or null
movement.transferIdstring or null
movement.userIdstring or null
movement.reasonstring or null
movement.createdAtstring (date-time)
levelobject
level.itemIdstring
level.locationIdstring
level.onHandnumber
negativebooleanThe location is below zero now (allowed, flagged).

Record a stock count

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.

Permissioninventory.manage (Owner, Admin, Staff)
Riskwrite, OAuth scope skuflow.write. Write: creates or changes records inside the business; nothing leaves it.
MCP toolinventory_count (toolset pricebook)
PlanInventory and purchasing: the Pro plan and up.

Request body

FieldTypeRequiredDescription
locationIdstringYes
countsarray of objectYesUp to 1000 items.
counts[].itemIdstringYes
counts[].countednumberYes-1000000–1000000.
reasonstring or nullNoDefaults to "Stock count". Up to 1000 characters.

Example

curl -X POST "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/inventory/counts" \
  -H "Authorization: Bearer $SKUFLOW_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"locationId":"location_id","counts":[{"itemId":"item_id","counted":1}]}'

Response

201: the answer's fields
FieldTypeDescription
countedinteger
adjustedinteger
linesarray of object
lines[].itemIdstring
lines[].beforenumber
lines[].countednumber
lines[].adjustmentnumber

Transfer stock between locations

POST /organizations/{organizationId}/inventory/transfers

Moves stock from one location to another (one warehouse restocking another): 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.

Permissioninventory.manage (Owner, Admin, Staff)
Riskwrite, OAuth scope skuflow.write. Write: creates or changes records inside the business; nothing leaves it.
MCP toolinventory_transfer (toolset pricebook)
PlanInventory and purchasing: the Pro plan and up.

Request body

FieldTypeRequiredDescription
fromLocationIdstringYes
toLocationIdstringYes
linesarray of objectYesUp to 500 items.
lines[].itemIdstringYes
lines[].quantitynumberYesAt most 1000000.
reasonstring or nullNoUp to 1000 characters.

Example

curl -X POST "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/inventory/transfers" \
  -H "Authorization: Bearer $SKUFLOW_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"fromLocationId":"fromLocation_id","toLocationId":"toLocation_id","lines":[{"itemId":"item_id","quantity":1}]}'

Response

201: the answer's fields
FieldTypeDescription
transferIdstring
linesarray of object
lines[].itemIdstring
lines[].quantitynumber
lines[].fromOnHandnumber
lines[].toOnHandnumber

On this page