Contents
On this page

Create Adjustment - Plugixa Inventory

POST /plugixa-inventory/v1/adjustments

Create a draft adjustment: a correction found by counting, or stock written off as damaged.

The user needs the plugixa_inventory_create capability (administrators have every inventory capability). With Pro Roles and permissions enforcing, their role must also allow creating adjustments. Needs Plugixa Inventory Pro with the Inventory adjustments app on in Plugixa Inventory -> App Manager; with it off, this route answers 404.

Request

POST https://your-site.example/wp-json/plugixa-inventory/v1/adjustments

Request body

Content type: application/json

Field Type Required Description
adjustment_type string No addition (the default), damage or subtraction.
warehouse_id integer Yes A live warehouse.
adjustment_date string No YYYY-MM-DD, optionally followed by a time (HH:MM or HH:MM:SS), in the site’s timezone. Defaults to now. It becomes the date of the ledger rows.
reason string No Plain text, line breaks kept. Becomes the reason on the ledger rows.
reference string No Your own reference, at most 50 characters. Left empty, the document gets ADJ-YYYY-NNNN (year of the document date, id padded to four digits) when it is finalized.
details string No HTML.
assigned_user_id integer No A WordPress user id. Not checked.
lines array No The lines. See below.

Lines

Field Type Required Description
item_id integer Yes The item. Checked when the document is finalized, not before.
quantity number Yes Greater than zero. Always positive: the document type decides the direction.
unit_id integer No The unit the quantity is in PRO.
cost_per_unit number No Not negative. Defaults to 0. The costing method can replace it when the document is finalized.
notes string No Plain text.

Lines with neither an item nor a quantity are skipped. Lines are kept in the order sent, numbered from 1 in position. A new document is always a draft: a status you send is ignored. Nothing reaches stock until you finalize it. If a line is refused, nothing is saved.

{
  "adjustment_type": "damage",
  "warehouse_id": 1,
  "reason": "Leak in aisle 4",
  "lines": [
    {
      "item_id": 42,
      "quantity": 3,
      "notes": "Water damage"
    }
  ]
}

Responses

201 Created. data is the new draft with its lines.

{
  "success": true,
  "data": {
    "id": 9,
    "reference": "",
    "adjustment_type": "damage",
    "warehouse_id": 1,
    "adjustment_date": "2026-11-12 10:30:00",
    "status": "draft",
    "finalized_at": null,
    "finalized_by": null,
    "batch_id": "",
    "line_count": 1,
    "total_quantity": 0.0,
    "total_cost": 0.0,
    "reason": "Leak in aisle 4",
    "details": "",
    "attachments": null,
    "assigned_user_id": null,
    "created_by": 1,
    "modified_by": 1,
    "created_at": "2026-11-12 09:30:00",
    "modified_at": "2026-11-12 09:30:00",
    "deleted_at": null,
    "lines": [
      {
        "id": 31,
        "adjustment_id": 9,
        "item_id": 42,
        "unit_id": null,
        "quantity": 3.0,
        "cost_per_unit": 4.2,
        "total_cost": 0.0,
        "transaction_id": 0,
        "notes": "Water damage",
        "position": 1,
        "created_by": "1",
        "modified_by": "1",
        "created_at": "2026-11-12 09:30:00",
        "modified_at": "2026-11-12 09:30:00",
        "deleted_at": null,
        "item_name": "Printer paper A4",
        "item_sku": "PAP-A4",
        "item_type": "consumable",
        "unit_code": null
      }
    ],
    "warehouse_name": "Main warehouse"
  }
}
Field Type Meaning
data.id integer The adjustment’s id
data.adjustment_type string addition, damage or subtraction
data.status string draft or finalized
data.adjustment_date string Document date, in the site’s timezone
data.warehouse_name string|null The warehouse’s name
data.lines[].transaction_id integer The ledger row this line wrote. 0 until finalized

Errors

Status Code When
422 plugixa_inventory_invalid_choice adjustment_type is not one of the allowed values. data.allowed lists them.
422 plugixa_inventory_invalid_date adjustment_date is not a real date in the accepted form.
422 plugixa_inventory_missing_warehouse warehouse_id is missing.
422 plugixa_inventory_unknown_warehouse warehouse_id is not a live warehouse.
422 plugixa_inventory_too_long A text field is longer than its column. data.field names it and data.max gives the limit.
422 plugixa_inventory_line_needs_item A line has a quantity but no item_id.
422 plugixa_inventory_line_needs_quantity A line has an item_id but no quantity above zero. data.item_id names it.
422 plugixa_inventory_not_a_number A line’s number is not a number. data.line (from 1) and data.item_id say which.
422 plugixa_inventory_negative_number A line’s cost_per_unit (or weight) is negative.
500 plugixa_inventory_insert_failed The database refused to save the adjustment.

Plus the errors every endpoint can return.

Examples

curl -s -X POST "https://your-site.example/wp-json/plugixa-inventory/v1/adjustments" \
  -u "admin:$WP_APP_PASSWORD" \
  -H "Content-Type: application/json" \
  -d '{"adjustment_type":"damage","warehouse_id":1,"reason":"Leak in aisle 4","lines":[{"item_id":42,"quantity":3,"notes":"Water damage"}]}'
<?php
$ch = curl_init('https://your-site.example/wp-json/plugixa-inventory/v1/adjustments');
curl_setopt_array($ch, [
    CURLOPT_CUSTOMREQUEST  => 'POST',
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_USERPWD        => 'admin:' . getenv('WP_APP_PASSWORD'),
    CURLOPT_HTTPHEADER     => ['Content-Type: application/json'],
    CURLOPT_POSTFIELDS     => json_encode([
        'adjustment_type' => 'damage',
        'warehouse_id'    => 1,
        'reason'          => 'Leak in aisle 4',
        'lines'           => [
            [
                'item_id'  => 42,
                'quantity' => 3,
                'notes'    => 'Water damage',
            ],
        ],
    ]),
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);
const auth = 'Basic ' + btoa(`admin:${process.env.WP_APP_PASSWORD}`);
const response = await fetch('https://your-site.example/wp-json/plugixa-inventory/v1/adjustments', {
  method: 'POST',
  headers: { 'Authorization': auth, 'Content-Type': 'application/json' },
  body: JSON.stringify({
    adjustment_type: 'damage',
    warehouse_id: 1,
    reason: 'Leak in aisle 4',
    lines: [
      {
        item_id: 42,
        quantity: 3,
        notes: 'Water damage',
      },
    ],
  }),
});
const { data } = await response.json();

Quick Links

Share