Inventory Manager API
Products and SKUs, stock at each location, receiving, transfers, stocktakes, catalogs and prices.
Event-sourced inventory service. Commands append events to the journal and fold them into the read model in the same committed write; queries read the projection; consumers follow the event log via replay + SSE.
- Base URL
https://inventory.getmanifold.io- Auth
- A bearer token on every call. See the quickstart.
- OpenAPI
- inventory-manager.openapi.json
items
Commands and queries over inventory items.
- GET
/itemsA page of the SKU master - POST
/itemsCreate a new inventory item with its master data - GET
/items/{sku}One SKU from the master by its SKU - PATCH
/items/{sku}Reconfigure a SKU's master data; only the fields present change - GET
/barcodesResolve a scanned barcode to the one SKU - GET
/items/{sku}/costA SKU's cost basis — the replacement cost a cost-plus catalog marks up - PUT
/items/{sku}/costSet a SKU's cost basis by hand - GET
/items/{sku}/eventsThe SKU's activity log - GET
/items/{sku}/incomingA page of the purchase orders a SKU is expecting - POST
/items/{sku}/incomingRegister units expected from a purchase order - GET
/items/{sku}/backordersA page of the sales orders a SKU is short on - POST
/items/{sku}/adjustAdjust stock for an item by a delta with a reason - POST
/items/{sku}/receiveRecord that a quantity arrived, at locationId or else the default location - POST
/items/{sku}/damageMove a quantity from on-hand to damaged (409 InsufficientStock if on-hand is short) - POST
/items/{sku}/disposeRemove a quantity from the platform for good - POST
/items/{sku}/dispatchDispatch a quantity out of on-hand - POST
/items/{sku}/reserveHold a quantity for a sales order without moving it - POST
/items/{sku}/releaseGive a reservation back — the order was cancelled, split, or re-allocated - POST
/items/{sku}/returnTake units back from a customer — issued by the fulfillment system when a refund restocks - POST
/items/{sku}/incoming/cancelStop expecting a purchase order's units for this SKU - POST
/items/{sku}/identifyName the units that arrived - POST
/items/{sku}/shortfallReport what a sales order still cannot be given - GET
/stock/attentionWhat in the stock needs a person — the home dashboard's inventory cards - GET
/items/{sku}/stockA SKU's stock levels
locations
The places this organization holds stock.
- GET
/locationsA page of the places this organization holds stock, oldest first - POST
/locationsOpen a location - GET
/locations/{locationId}One stock location by its loc_ id - PATCH
/locations/{locationId}Rename a location, re-note it, change whether stock there can be sold, or move it in the… - PUT
/locations/prioritySet the organization's site priority - POST
/locations/{locationId}/archiveClose a location to new stock - PUT
/locations/{locationId}/bindings/{channelId}Bind a location to one of a sales channel's locations - DELETE
/locations/{locationId}/bindings/{channelId}Release a location from one channel's binding
products
The product catalog: products, their options, and the variants that carry SKUs. Sits on top of the SKU master — a variant either is an inventory item or is a composite of several, and its availability is always derived from inventory, never held here.
- GET
/productsA page of the organization's products with their variants, newest first - POST
/productsOpen a product with at least one variant - GET
/products/{productId}One product by its prd_ id - PATCH
/products/{productId}Retitle or re-describe a product - PUT
/products/{productId}/optionsRe-declare the axes a product varies on and - POST
/products/{productId}/archiveWithdraw a product from sale for good - POST
/products/{productId}/variantsAdd a variant to a product, under the same rules as creation - PATCH
/products/{productId}/variants/{variantId}Change a variant's title - DELETE
/products/{productId}/variants/{variantId}Remove a variant from its product - GET
/products/{productId}/availabilityWhat can be promised of each variant right now - GET
/variants/{sku}The product a SKU belongs to, by the SKU of one of its variants - GET
/variants/{sku}/availabilityOne variant's availability by SKU — the storefront's question
assets
Files attached to SKUs and products — photos, spec sheets, drawings. Bytes live in a private bucket and are reached only through signed, expiring URLs; the journal holds the fact of each attachment.
- GET
/items/{sku}/assetsThe files attached to a SKU - POST
/items/{sku}/assetsAttach a file to a SKU - GET
/products/{productId}/assetsThe files attached to a product - POST
/products/{productId}/assetsAttach a file to a product - GET
/assets/{assetId}One stored file by its ast_ id - DELETE
/assets/{assetId}Detach and delete a file, answering with the asset as it was - GET
/assets/{assetId}/contentThe bytes, for a caller holding a session rather than a signed URL
catalogs
Channel catalogs: which products, prices and locations each selling view is allowed to see.
- GET
/catalogsA page of this organization's channel catalogs - POST
/catalogsOpen a catalog: a name and its one ISO 4217 currency - GET
/catalogs/{catalogId}One catalog: its name - PATCH
/catalogs/{catalogId}Rename a catalog, change its currency, or name its compare-at catalog - GET
/catalogs/{catalogId}/productsA page of the products this catalog lists - GET
/catalogs/{catalogId}/pricesA page of this catalog's prices as it answers them - GET
/products/{productId}/catalogsEvery catalog of the organization against one product - POST
/catalogs/{catalogId}/archiveWithdraw a catalog for good - PUT
/catalogs/{catalogId}/pricingChoose how this catalog is priced - GET
/fx/ratesThe recorded forex windows, newest first — optionally narrowed to a base/quote pair - PUT
/fx/ratesRecord the forex rate for one hour-long window - PUT
/catalogs/{catalogId}/products/{productId}Expose a product (all its variants) to this catalog's views - DELETE
/catalogs/{catalogId}/products/{productId}Withdraw a product from this catalog's views - PUT
/catalogs/{catalogId}/prices/{sku}Price one SKU in this catalog's currency - DELETE
/catalogs/{catalogId}/prices/{sku}Forget one SKU's price; the SKU stays listed, unpriced - GET
/catalogs/{catalogId}/viewThe catalog resolved for a channel
settings
How this organization is allowed to move stock, how it is taxed, and the basis its books are kept on.
- GET
/settingsThe organization's stock policy - PUT
/settingsReplace the organization's stock policy - GET
/settings/taxThe organization's tax settings - PUT
/settings/taxReplace the organization's tax settings with the whole configuration sent - GET
/settings/accounting-basisThe books' accounting basis - PUT
/settings/accounting-basisSet the books' accounting basis
fx
Central banks' published reference rates into the organization's home currency.
views
Saved list views: named searches and filters every operator in the organization shares.
- GET
/viewsThe organization's saved list views - POST
/viewsSave the current search and filters of a list as a named view - PUT
/views/{viewId}Rename a view or replace what it saves; anything omitted stays as it was - DELETE
/views/{viewId}Delete a saved view, answering with the view as it was
accounts
The chart of accounts: the ledger accounts a SKU's stock, sales and cost of sales post to. Organization-level configuration, read by every account picker and edited under Settings.
- GET
/accountsThe organization's chart of accounts in natural code order - POST
/accountsAdd an account to the chart, kept by the organization - PUT
/accounts/{accountId}Retitle, describe or renumber an account; anything omitted stays as it was - DELETE
/accounts/{accountId}Remove an account from the chart, answering with the account as it was - PUT
/accounts/managedA ledger app reports its chart of accounts - POST
/accounts/managed/releaseA ledger app lets go of every account it keeps - POST
/accounts/managed/syncAsk the ledger apps that keep any of the chart to sync it now
channels
Sales channels: the places this organization sells — the stores and marketplace accounts its apps provide — with the catalogs each publishes. A channel's locations are its bindings on /locations; its orders name it as their source.
- GET
/channelsThe organization's sales channels - GET
/channels/{channelId}One sales channel, connected or not - PUT
/channels/{channelId}Connect a sales channel - PUT
/channels/{channelId}/intakeSay how a channel's orders are coming in - PUT
/channels/{channelId}/attentionSay what about a channel needs a person's attention - POST
/channels/{channelId}/disconnectDisconnect a sales channel — its app let it go: the store uninstalled, the account closed
sources
Legacy sources: the platforms this organization is migrating from — whatever legacy platforms apps provide — each registered and kept current by its app. Evidence for the onboarding walk and the admin; what a retired app may still do is its installation's, in auth-service.
transfers
Moving stock between the organization's own locations.
- GET
/transfersA page of the organization's stock transfers, newest first - POST
/transfersOpen a transfer between two of the organization's own locations - GET
/transfers/{transferId}One transfer, with per-line quantity, despatched and received - POST
/transfers/{transferId}/despatchSend the transfer on its way - POST
/transfers/{transferId}/receiveBook in what actually turned up: inTransit falls and on-hand rises at the destination - POST
/transfers/{transferId}/cancelWithdraw the transfer
stocktakes
Counting the organization's stock; the first completed count opens the general ledger.
- GET
/stocktakesEvery stocktake the organization has started - POST
/stocktakesStart a stocktake, appending inventory.stocktake-started - GET
/stocktakes/{stocktakeId}One stocktake with every count and cost entered so far - GET
/stocktakes/{stocktakeId}/sheetThe counting sheet: every of the stocktake's scope that holds stock or was counted - PUT
/stocktakes/{stocktakeId}/countsSave counts and costs on an open stocktake - POST
/stocktakes/{stocktakeId}/completeComplete the stocktake - POST
/stocktakes/{stocktakeId}/cancelAbandon an open stocktake
commissions
Sales commissions: groups and their base rates and catalogs, who is in which, when commission is earned and by whom, and each catalog's rules per SKU.
- GET
/commission-groupsThe organization's commission groups - PUT
/commission-groups/{groupId}Create or describe a commission group under the cgr_ id the caller minted - PUT
/commission-groups/{groupId}/catalogsSet the catalogs a group's reps see and sell from - POST
/commission-groups/{groupId}/archiveWithdraw a commission group for good - GET
/commission-membersEvery member put in a commission group - PUT
/commission-members/{userId}Put a member in a commission group (default included) - GET
/commissions/settingsThe organization's commission settings - PUT
/commissions/settingsSet when commission is earned and who earns it, for every group - GET
/catalogs/{catalogId}/commissionA catalog's commission rules - PUT
/catalogs/{catalogId}/commission/{sku}Set a catalog's commission rule for one SKU - DELETE
/catalogs/{catalogId}/commission/{sku}Forget a catalog's commission rule for one SKU - GET
/commissions/termsThe terms an order is snapshotted under
events
The append-only event log: replay for catch-up, SSE for real-time.