Next Inventory REST API
The REST API of Next Inventory, the inventory component for Joomla 4, 5 and 6.
Base URL: https://<your-site>/api/index.php/v1/nextinventory
Authentication: create a token in Next Inventory → Configuration → REST API → Tokens and send it as
Authorization: Bearer <token>. If your web server strips the Authorization header (some Apache
- PHP-FPM setups do), send
X-NextInventory-Token: <token>instead.
A token acts as the user who created it. It can do only what its scopes allow AND what that user's Next Inventory role allows; every request goes through the same permission checks, validation and stock rules as the Next Inventory screens.
Responses: success is { "data": ..., "meta": { "total": n } } (meta on lists only); a create
answers 201, a delete 204 with no body. Every failure is
{ "errors": [ { "title": "...", "code": "MACHINE_CODE", "meta": { ... } } ] }.
Stock is changed only through stock movements, transfers and adjustments — never by writing
stock_quantity on an item — so every change is in the ledger (/transactions) and the
FIFO/LIFO cost layers stay correct.
Rate limits: per token and per minute, reads (GET) and changes counted apart: 300 reads
and 120 changes by default, set on REST API → Settings (0 = no limit). Every answer carries
RateLimit-Limit, RateLimit-Remaining and RateLimit-Reset (seconds); over a limit the
answer is 429 RATE_LIMITED with Retry-After: <seconds>. More than 20 unknown tokens from one
address within 5 minutes are answered 429 TOO_MANY_FAILED_LOGINS (a valid token never is).
Concurrent edits: reading one record (GET /items/{id} and the like) returns an ETag
header, as does a successful change to it. Send it back as If-Match on PATCH, DELETE or
an action, and the change is refused with 412 if someone else changed the record meanwhile.
To learn when records change, subscribe a webhook rather than polling.
Safe retries: send an Idempotency-Key header on a POST, PATCH or DELETE and a retry
after a timeout cannot run the request twice (see the parameter).
The same token also works on the administrator task lane
(administrator/index.php?option=com_nextinventory&format=json&task=<controller.task>), which
is the RPC interface the Next Inventory screens themselves use.
Base URL
{site}/api/index.php/v1/nextinventory
| Variable | Meaning | Example |
|---|---|---|
{site} |
Your Joomla site root, without a trailing slash. | https://example.com |
Authentication
Authorization: Bearer <your-api-token>
X-NextInventory-Token is accepted as an alternative — The same token, for servers that strip the Authorization header.
A Next Inventory API token (nxi_…), created under Configuration → REST API → Tokens.
Endpoints
| Method | Operation | Purpose | Group |
|---|---|---|---|
GET |
/items |
List items | Items |
POST |
/items |
Create an item | Items |
GET |
/items/{id} |
Get one item, with its custom fields | Items |
PATCH |
/items/{id} |
Update an item (only the fields sent) | Items |
DELETE |
/items/{id} |
Delete an item | Items |
GET |
/items/{id}/transactions |
The ledger of one item | Items |
GET |
/items/{id}/cost-layers |
FIFO/LIFO cost layers and valuation of one item | Items |
POST |
/items/{id}/image |
Upload an image and make it the item's image | Items |
DELETE |
/items/{id}/image |
Remove the item's image | Items |
GET |
/custom-fields |
The published custom field definitions for items, warehouses or recipients | Custom fields |
GET |
/lookup/barcode |
Find the published item with an exact barcode | Lookup |
GET |
/lookup/sku |
Find the published item with an exact SKU | Lookup |
GET |
/lookup/search |
Up to 10 published items matching title, SKU, barcode or serial number | Lookup |
GET |
/categories |
List categories | Categories |
POST |
/categories |
Create a category | Categories |
GET |
/categories/{id} |
Get one category | Categories |
PATCH |
/categories/{id} |
Update a category | Categories |
DELETE |
/categories/{id} |
Delete a category | Categories |
POST |
/categories/{id}/status |
Publish or unpublish a category | Categories |
GET |
/warehouses |
List warehouses | Warehouses |
POST |
/warehouses |
Create a warehouse | Warehouses |
GET |
/warehouses/{id} |
Get one warehouse, with its custom fields | Warehouses |
PATCH |
/warehouses/{id} |
Update a warehouse | Warehouses |
DELETE |
/warehouses/{id} |
Delete a warehouse | Warehouses |
POST |
/warehouses/{id}/status |
Publish or unpublish a warehouse | Warehouses |
GET |
/warehouses/{id}/inventory |
Items held in one warehouse | Warehouses |
GET |
/recipients |
List recipients (people items are checked out to) | Recipients |
POST |
/recipients |
Create a recipient | Recipients |
GET |
/recipients/{id} |
Get one recipient, with its custom fields | Recipients |
PATCH |
/recipients/{id} |
Update a recipient | Recipients |
DELETE |
/recipients/{id} |
Delete a recipient | Recipients |
POST |
/recipients/{id}/status |
Publish or unpublish a recipient | Recipients |
GET |
/units |
List units of measurement | Units |
POST |
/units |
Create a unit | Units |
GET |
/units/{id} |
Get one unit | Units |
PATCH |
/units/{id} |
Update a unit | Units |
DELETE |
/units/{id} |
Delete a unit | Units |
POST |
/units/{id}/status |
Publish or unpublish a unit | Units |
GET |
/units/{id}/conversion-chain |
The chain of conversions from a unit to its base unit | Units |
GET |
/stock-movement-types |
The movement types the token owner may record | Stock movements |
GET |
/stock-movements |
List stock movements | Stock movements |
POST |
/stock-movements |
Record a check-in, check-out, stock addition or stock removal | Stock movements |
GET |
/stock-movements/{id} |
Get one movement with its lines | Stock movements |
DELETE |
/stock-movements/{id} |
Delete a DRAFT movement | Stock movements |
POST |
/stock-movements/{id}/finalize |
Finalize a draft movement (applies the stock change) | Stock movements |
GET |
/transactions |
The ledger — every stock change, newest first | Transactions |
GET |
/transactions/{id} |
Get one ledger row | Transactions |
GET |
/transfers |
List warehouse transfers | Transfers |
POST |
/transfers |
Move stock between two warehouses | Transfers |
GET |
/transfers/{id} |
Get one transfer with its lines | Transfers |
DELETE |
/transfers/{id} |
Delete a DRAFT transfer | Transfers |
POST |
/transfers/{id}/finalize |
Finalize a draft transfer | Transfers |
GET |
/adjustment-types |
Adjustment types (addition, damage, subtraction) | Adjustments |
GET |
/adjustments |
List stock adjustments | Adjustments |
POST |
/adjustments |
Record found, damaged or lost stock | Adjustments |
GET |
/adjustments/{id} |
Get one adjustment with its lines | Adjustments |
DELETE |
/adjustments/{id} |
Delete a DRAFT adjustment | Adjustments |
POST |
/adjustments/{id}/finalize |
Finalize a draft adjustment | Adjustments |
GET |
/reports/stock-valuation |
Stock value by category, with totals | Reports |
GET |
/reports/low-stock |
Items at or below their low-stock threshold | Reports |
GET |
/reports/stock-by-warehouse |
Quantity and value per warehouse | Reports |
GET |
/reports/stock-by-type |
Quantity and value per item type | Reports |
GET |
/reports/stock-movement |
Stock in and out per day | Reports |
GET |
/reports/transaction-trends |
Transaction counts by type over time | Reports |
GET |
/reports/kpi-trends |
Dashboard KPIs compared with the previous period | Reports |
GET |
/reports/top-performers |
Most (or least) moved items | Reports |
GET |
/reports/category-drilldown |
Items and value inside one category | Reports |
GET |
/reports/cogs |
Cost of goods sold (FIFO/LIFO) | Reports |
GET |
/reports/inventory-aging |
Age of stock still held, by cost layer | Reports |
Webhook events
Outbound events. When stock or a record changes, Next Inventory sends an HTTP POST to each webhook subscribed to that event, so another system can react without polling.
A webhook says something happened; the REST API reads the full record. To keep another system's stock in step, subscribe to stock.changed: it covers every way stock can change.
| Event | When |
|---|---|
stock.changed |
An item's stock quantity changed, in any way |
stock.low |
An item fell to its low-stock threshold |
stock_movement.finalized |
A check in, check out, add or remove batch was finalized |
transfer.finalized |
A warehouse transfer was finalized |
adjustment.finalized |
A stock adjustment was finalized |
item.created |
An item was created |
item.updated |
An item was edited |
item.deleted |
An item was deleted |
warehouse.created |
A warehouse was created |
warehouse.updated |
A warehouse was edited |
warehouse.deleted |
A warehouse was deleted |
recipient.created |
A recipient was created |
recipient.updated |
A recipient was edited |
recipient.deleted |
A recipient was deleted |
ping |
A test message |
Errors
| Status | Code | When |
|---|---|---|
4 |
A refusal. Common codes: MISSING_TOKEN / INVALID_TOKEN (401); API_DISABLED, ACCOUNT_UNUSABLE, ACCESS_DENIED, TASK_NOT_ALLOWED, MISSING_SCOPE, APP_DISABLED, DEMO_LOCKED, FORBIDDEN (403); NOT_FOUND (404); BAD_REQUEST / INVALID_JSON / INVALID_IDEMPOTENCY_KEY (400, validation and stock rules, with the reason in title); IDEMPOTENCY_IN_PROGRESS (409); PRECONDITION_FAILED (412, the record changed since the If-Match ETag was read); IDEMPOTENCY_KEY_REUSED (422); RATE_LIMITED / TOO_MANY_FAILED_LOGINS (429, with a Retry-After header in seconds); SERVER_ERROR (500). |
See also
- Getting Started guide — enabling the API, screenshots and a worked end-to-end example