Katana Inventory & Sales Orders
Is that SKU in stock, and where? For makers running Katana MRP: check inventory per variant and location, spot negative stock, trace inventory movements, then open sales orders, record fulfillments, log stock adjustments and follow purchase orders from suppliers.
Connect this API to an AI agent Browse all specs
What you can do with Katana Inventory & Sales Orders via MCP
Every endpoint below becomes a governed tool your AI agent (Claude, ChatGPT, or a customer-facing VX agent) can call — with scoped permissions, sandbox testing, and audit logs.
| Method | Path | Operation | Description |
|---|---|---|---|
| GET | /inventory |
listInventory | List current stock levels per variant and location |
| GET | /inventory_movements |
listInventoryMovements | List inventory movements (what changed stock, when and why) |
| GET | /negative_stock |
listNegativeStock | List variants that have gone into negative stock |
| GET | /variants |
listVariants | Find product and material variants by SKU or other filters |
| GET | /variants/{id} |
getVariant | Get one variant with its SKU, prices and config |
| GET | /products |
listProducts | List products you sell or make |
| GET | /locations |
listLocations | List warehouses and factory locations |
| GET | /customers |
listCustomers | List or look up customers |
| GET | /sales_orders |
listSalesOrders | List sales orders with status and delivery filters |
| POST | /sales_orders |
createSalesOrder | Create a sales order for a customer |
| GET | /sales_orders/{id} |
getSalesOrder | Get one sales order with its rows |
| GET | /sales_order_fulfillments |
listSalesOrderFulfillments | List fulfillments (shipments) of sales orders |
| POST | /sales_order_fulfillments |
createSalesOrderFulfillment | Record a fulfillment that ships sales order rows |
| GET | /stock_adjustments |
listStockAdjustments | List stock adjustments |
| POST | /stock_adjustments |
createStockAdjustment | Adjust stock up or down at a location |
| GET | /purchase_orders |
listPurchaseOrders | List purchase orders to suppliers |
| GET | /purchase_orders/{id} |
getPurchaseOrder | Get one purchase order with its rows |
Authentication
katanaApiKey
Bearer token — sent as Authorization: Bearer <token>
Katana uses a live API key sent as Authorization: Bearer <key>.
How to get a credential
- Log in to Katana as an admin (API access needs the Professional plan or higher).
- Go to Settings > API.
- Select Add new API key and copy the key; it is shown once.
Permissions used
Katana API keys have no scopes: a key can read and write everything in the factory account.
| Access | Operations |
|---|---|
| Read | listInventory, listInventoryMovements, listNegativeStock, listVariants, getVariant, listProducts, listLocations, listCustomers, listSalesOrders, getSalesOrder, listSalesOrderFulfillments, listStockAdjustments, listPurchaseOrders, getPurchaseOrder |
| Write | createSalesOrder, createSalesOrderFulfillment, createStockAdjustment |
Common errors
| Code | Meaning | Fix |
|---|---|---|
| 401 | Missing, mistyped or deleted key | Create a new key under Settings > API and update the credential. |
| 403 | Plan without API access | Upgrade to a plan that includes the API. |
| 422 / 400 | Body failed validation (unknown variant_id, missing location_id) | Look up ids with listVariants and listLocations first. |
| 429 | More than 60 requests per 60 seconds | Wait for the Retry-After seconds, then retry. |
Store the key as a VX Agents credential (bearer token) so it is never pasted into chat.
Usage guide
Setup
Add your Katana API key as a bearer credential (Katana Settings > API > Add new API key; Professional plan or higher). If you ship from one warehouse, pin its location_id (from listLocations) so stock checks and adjustments always use it.
Check stock and fulfil an order
listVariantswithskuto turn a SKU into avariant_id.listInventorywithvariant_id(andlocation_id) to see in stock, committed and expected quantities.listNegativeStockfor a daily sanity check;listInventoryMovementswithvariant_idexplains why a number changed.listCustomers(filter by name or email) to find thecustomer_id.createSalesOrderwithcustomer_idandsales_order_rows(variant_id,quantity, optionalprice_per_unit). Confirm the customer, items and prices with the user before calling it.getSalesOrderto read the new rows and their ids.createSalesOrderFulfillmentwithsales_order_id,statusandsales_order_fulfillment_rows(sales_order_row_id,quantity). Confirm before calling it: it takes stock out of inventory.
Other jobs
- Stock count fixes:
createStockAdjustmentwithlocation_idandstock_adjustment_rows(variant_id,quantity, positive or negative). Confirm the quantities with the user first;listStockAdjustmentsshows past ones. - Incoming stock:
listPurchaseOrders(filter by status) andgetPurchaseOrdershow what suppliers still owe you. listProductsandgetVariantgive names, SKUs and sales prices.
Good to know
- Ids are integers. Dates are ISO 8601 UTC (
2026-10-23T09:00:00.000Z). - List calls paginate with
page(from 1) andlimit(default 50, max 250). - Rate limit: 60 requests per 60 seconds; on 429 wait for
Retry-Afterseconds. - Keys have no scopes, so a key can write everything: keep writes to what the user asked for.
Source: Katana API reference (https://developer.katanamrp.com/reference/api-introduction), checked 2026-10-23.
How to use this spec
- Create a free VX Agents account (sandbox tools included).
- Open the marketplace and connect “Katana Inventory & Sales Orders” to an agent.
- Expose it as an MCP server for Claude/ChatGPT, or chat with it directly.