Skip to content

Inventory

Stock in LithosPOS is held per store and moves through documents, not through direct balance writes. Every change is an adjustment, a transfer, a production or a purchase receipt — so the merchant can always answer “why did this number change?”.

MethodPathScope
GET/v1/stock-adjustmentsstock_adjustments.read
POST/v1/stock-adjustmentsstock_adjustments.write
PATCH/v1/stock-adjustments/:idstock_adjustments.write
GET/v1/stock-transfersstock_transfers.read
POST/v1/stock-transfersstock_transfers.write
PATCH/v1/stock-transfers/:idstock_transfers.write
PATCH/v1/stock-transfers/:id/receivestock_transfers.write
GET/v1/recipesrecipes.read
POST/v1/recipesrecipes.write
PATCH/v1/recipes/:idrecipes.write
GET/v1/productionsproductions.read
POST/v1/productionsproductions.write

An adjustment records a count, a write-off or a correction against one store.

Terminal window
curl -s "$API_BASE_URL/stock-adjustments" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"no": 1042,
"type": 2,
"storeId": 1,
"date": "2026-07-29",
"narration": "Monthly count — dry store",
"items": [
{ "itemId": 8841, "qty": 36, "cost": 1.12 },
{ "itemId": 8850, "qty": 4, "cost": 0.80, "note": "damaged" }
]
}'
FieldTypeRequiredNotes
nonumberyesDocument number in the merchant’s own sequence
typenumberyes0 decrease, 1 increase, 2 set to counted quantity
storeIdnumberyesStore whose stock changes
datestringnoYYYY-MM-DD. Defaults to today
narrationstringnoReason, shown in the stock ledger
items[].itemIdnumberyes
items[].variantIdnumberno0 when the item has no variants
items[].qtynumberyesInterpretation depends on type
items[].costnumbernoUnit cost used for valuation
items[].batchIdnumbernoRequired for batch-tracked items
items[].notestringnoPer-line reason

type decides what qty means: with 0 and 1 it is a delta, with 2 it is the counted quantity on the shelf and the system computes the difference.

A transfer is a two-sided document: it leaves the source store when created and arrives at the destination when received.

Terminal window
# 1. Raise the transfer
curl -s "$API_BASE_URL/stock-transfers" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"transferNo": 231,
"date": "2026-07-29",
"fromStoreId": 2,
"toStoreId": 1,
"narration": "Weekly replenishment",
"items": [
{ "itemId": 8841, "qty": 24, "rate": 1.12 },
{ "itemId": 8850, "qty": 12, "rate": 0.80 }
]
}'
# 2. Receive it at the destination
curl -s -X PATCH "$API_BASE_URL/stock-transfers/774/receive" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H 'Content-Type: application/json' \
-d '{ "reciveDate": "2026-07-30" }'
FieldTypeRequiredNotes
transferNonumberyesDocument number
datestringyesYYYY-MM-DD dispatch date
reciveDatestringnoExpected or actual arrival date
fromStoreId / toStoreIdnumberyesMust differ
items[].itemId, qty, ratenumberyesrate is the transfer valuation, not a selling price
items[].taxableAmountnumbernorate × qty; recomputed server-side
items[].serialNoarraynoPre-picked serial numbers for serial-tracked items

Until a transfer is received, the stock is in transit: gone from the source, not yet countable at the destination.

A recipe describes what a made-to-order or prepared item consumes.

Terminal window
curl -s "$API_BASE_URL/recipes" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"Recipe": "Flat White",
"ItemId": 8841,
"Qty": 1,
"ServingUnit": "cup",
"AutoDeduct": 1,
"Ingredients": [
{ "ItemId": 9001, "Qty": 18, "Unit": "g" },
{ "ItemId": 9002, "Qty": 150, "Unit": "ml" }
]
}'
FieldTypeRequiredNotes
RecipestringyesName, up to 45 characters
ItemIdnumberyesThe item this recipe produces
QtynumbernoYield quantity, default 1
AutoDeductnumberno1 depletes ingredients when the item sells
WasteFactorPctnumbernoAdds an allowance on top of the ingredient quantities
Ingredients[].ItemIdnumberyes
Ingredients[].QtynumberyesPer yield unit
Ingredients[].UnitstringnoFree text, up to 20 characters
Ingredients[].CostOverridenumber | nullnonull uses the ingredient item’s own cost

With AutoDeduct on, selling the finished item consumes the ingredients automatically — no production document required.

A production converts ingredients into finished stock in one step: batch cooking, bottling, assembling a pack.

Terminal window
curl -s "$API_BASE_URL/productions" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"storeId": 1,
"itemId": 8905,
"qty": 40,
"date": "2026-07-29",
"narration": "Morning bake",
"items": [
{ "itemId": 9010, "qty": 8000, "cost": 0.0012 },
{ "itemId": 9011, "qty": 120, "cost": 0.02 }
]
}'
FieldTypeRequiredNotes
storeIdnumberyesWhere the production happens
itemIdnumberyesThe finished item produced
qtynumberyesUnits produced
nonumbernoBatch number. Omit to let the server allocate the next one
batchIdnumbernoFor batch-tracked finished goods
datestringnoYYYY-MM-DD
items[].itemId, qtynumberyesIngredients consumed
items[].costnumbernoUnit cost, used to value the finished stock

The finished item’s stock rises by qty and each ingredient falls by its line quantity, in one transaction.