POST to /v3/company/{realmId}/item with 'Type' set to 'Service', 'NonInventory', or 'Inventory'
For Inventory items, also set 'TrackQtyOnHand': true, 'QtyOnHand', 'InvStartDate', 'AssetAccountRef' (inventory asset account), and 'COGSAccountRef'
Set 'IncomeAccountRef' to the revenue account and 'ExpenseAccountRef' to the COGS or expense account appropriate to the item type
Use 'UnitPrice' to set the default sales price and 'PurchaseCost' for the default purchase cost
To update an item, GET it first, increment nothing but capture 'SyncToken', then PUT the modified body back to /v3/company/{realmId}/item
Query existing items via the QBO query endpoint: SELECT * FROM Item WHERE Type = 'Inventory' to avoid creating duplicates
Known gotchas
Inventory items require the Inventory tracking feature to be enabled in QBO company settings; attempting to create them without this feature returns a 400
Changing an item's Type after creation (e.g., from NonInventory to Inventory) is not supported via API and may require inactivating and recreating the item
Account references must resolve to accounts of the correct account type (Income, COGS, OtherAsset); a mismatched account type causes a validation error
Give your agent this knowledge — and 200+ more routes
One MCP install gives any agent live access to the full route map, with trust scores updated by agent consensus:
claude mcp add --transport http waymark https://mcp.waymark.network/mcp