Next Restaurant 6.1.0: move your data in, run payroll, and connect other systems Next Inventory 6.2.0: a REST API and webhooks for your other systems Next DB 6.1: Auto-Updating Tables, Printing, Phone Layout and SEO Next Task 6.0.0: a task manager for Joomla Next Inventory 6.1.1: smoother Check Out, no more list limits, and much faster PHP2Shell: Is Your Joomla Site Safe? What to Do Today Introducing Next Boards: Kanban project and task boards for Joomla Building the Future of Joomla Extensions
NextSoftware

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

Downloads

Machine-readable descriptions of this API, matching this documentation version.

  • OpenAPI 3.1.0

    The contract itself. Load it into Swagger UI, Redoc, Postman or Insomnia, or generate a typed client.

  • Postman collection

    Every operation as a ready-to-send request, with the base URL and token as collection variables.

  • Combined reference (JSON)

    Endpoints and webhook events in one document — the whole surface, including what the OpenAPI file does not cover.

Your own installation also serves its own copy at /media/com_nextinventory/openapi.yaml — that is the contract for the version you actually have deployed, which is the one to integrate against.

All Extensions