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

List Item Transactions

GET /items/{id}/transactions

The ledger of one item

Scope transactions:read.

Request

GET https://example.com/api/index.php/v1/nextinventory/items/{id}/transactions?limit=<integer>&offset=<integer>

Parameters

Name Type In Required Description
id integer path Yes (min 1)
limit integer query No Page size. (min 1) Defaults to 20.
offset integer query No Rows to skip. (min 0) Defaults to 0.

Responses

200 — A page of ledger rows.

{
    "data": [
        {
            "id": 1,
            "item_id": 1,
            "item_title": "string",
            "item_sku": "string",
            "transaction_type": "string",
            "quantity_change": 1.5,
            "new_quantity": 1.5,
            "transaction_unit_id": 1,
            "original_quantity": 1.5,
            "cost_per_unit": 1.5,
            "total_cost": 1.5,
            "batch_id": "string",
            "recipient_id": 1,
            "recipient": "string",
            "reason": "string",
            "created_by": 1,
            "created_by_name": "string",
            "created": "2026-01-01T12:00:00Z"
        }
    ],
    "meta": {
        "total": 1
    }
}
Field Type Meaning
data[].id integer
data[].item_id integer
data[].item_title string|null
data[].item_sku string|null
data[].transaction_type string
data[].quantity_change number Signed: negative for stock out.
data[].new_quantity number
data[].transaction_unit_id integer|null
data[].original_quantity number|null
data[].cost_per_unit number|null
data[].total_cost number|null
data[].batch_id string|null Shared by every row of one movement/transfer/adjustment.
data[].recipient_id integer|null
data[].recipient string|null
data[].reason string|null
data[].created_by integer
data[].created_by_name string|null
data[].created string|null (date-time)
meta.total integer Rows matching the filters, across all pages.

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).

Examples

curl

curl -s "https://example.com/api/index.php/v1/nextinventory/items/1/transactions" \
  -H "Authorization: Bearer $API_TOKEN"

PHP

<?php
$ch = curl_init('https://example.com/api/index.php/v1/nextinventory/items/1/transactions?limit=<integer>&offset=<integer>');

curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER     => [
        'Authorization: Bearer ' . getenv('API_TOKEN'),
    ],
]);

$response = json_decode(curl_exec($ch), true);
curl_close($ch);

JavaScript

const API_TOKEN = process.env.API_TOKEN;

const response = await fetch("https://example.com/api/index.php/v1/nextinventory/items/1/transactions?limit=<integer>&offset=<integer>", {
  headers: {
    "Authorization": `Bearer ${API_TOKEN}`,
  },
});
const data = await response.json();

All Extensions