APIStock adjustment

Get adjustments

GET
/public/v1/adjustments

List stock adjustments for your company, oldest first (by creation time), with optional filters.

A stock adjustment is a manual change to on-hand inventory that isn't a sale, purchase, or transfer — for example recording waste, theft, damage, a physical recount, or a reconciliation with the state compliance system.

Narrow the result with the product_ids, batch_ids, and location_ids filters (matching each adjustment's product_id / batch_id / location_id) and with the inserted_datetime, completion_datetime, and updated_datetime windows. When several filters are supplied an adjustment must satisfy all of them (AND).

Results are always scoped to the company the API key belongs to. The response is a paginated envelope: data holds the page of adjustments and next_page is the URL of the following page, or null on the last page.

This endpoint returns eventually consistent data, with changes taking up to 1 second to propagate in responses.

Required permission: products_permissions_view.

Authorization

Bearer
headerAuthorizationBearer <token>

API token generated in Distru (Settings → Distru API). Send it on every request as Authorization: Bearer YOUR_API_TOKEN.

Query Parameters

ids[]?array<string>

Restrict the result to specific stock adjustments by ID (the same ID returned as each stock adjustment's id). Repeat the bracketed key once per ID. Unknown IDs simply match nothing; an empty list is treated as no filter. At most 200 IDs may be given.

inserted_datetime?string

Filter by when the adjustment was created in Distru (its inserted_datetime). Inclusive ISO8601 range after,before separated by a comma; either bound may be omitted — after, keeps adjustments created on or after after, ,before those on or before before, and after,before those inside the closed range. A range with both bounds empty is rejected.

completion_datetime?string

Filter by the adjustment's effective date — the completion_datetime in the response. Inclusive ISO8601 range after,before separated by a comma; either bound may be omitted. A range with both bounds empty is rejected.

updated_datetime?string

Filter by when the adjustment was last modified in Distru (its updated_datetime). Same inclusive ISO8601 after,before comma range format as inserted_datetime, with either bound optional.

batch_ids[]?array<string>

Restrict to adjustments made against specific batches by batch ID (as returned in each adjustment's batch_id). Repeat the bracketed key once per ID; matches ANY. Unknown IDs match nothing; an empty list is no filter. At most 200 IDs.

location_ids[]?array<string>

Restrict to adjustments made at specific locations by location ID (as returned in each adjustment's location_id). Repeat the bracketed key once per ID; matches ANY. Unknown IDs match nothing; an empty list is no filter. At most 200 IDs.

product_ids[]?array<string>

Restrict to adjustments of specific products by product ID (as returned in each adjustment's product_id). Repeat the bracketed key once per ID; matches ANY. A malformed ID is rejected with a 400; an unknown-but-well-formed ID matches nothing; an empty list is no filter. At most 200 IDs.

page?string

Page selector. Page size is fixed by the server; paginate by following the next_page URL in each response rather than building page selectors yourself — it is null on the last page. next_page uses page[after]=<cursor>, an opaque token marking where the next page resumes; pass it back exactly as given, and only to the endpoint that issued it. This is seek-based, so every page stays fast no matter how deep you page.

Response Body

A list of stock adjustments

*/*
  1. response

A collection of Stock Adjustments

data?array<>

Stock Adjustments

next_page?string

URL for the next page of results; null when there is no next page

Example Request
curl -X GET 'https://app.distru.com/public/v1/adjustments'
Example Response
{  "data": [    {      "batch_id": null,      "completion_datetime": "2026-10-13T15:03:31.435186Z",      "compliance_quantity": null,      "compliance_unit_type": null,      "creator": {        "banned": false,        "deleted_at": null,        "email": "[email protected]",        "full_name": "FirstName5184 LastName5185",        "id": "00000000-0000-0000-0000-000000000a0f",        "inserted_datetime": "2026-10-13T15:03:31.429207Z",        "role": {          "id": "00000000-0000-0000-0000-000000000a7b",          "name": "Admin 2682"        },        "updated_datetime": "2026-10-13T15:03:31.429207Z"      },      "description": null,      "id": "00000000-0000-0000-0000-00000000007e",      "inserted_datetime": "2026-10-13T15:03:31.443403Z",      "license_id": null,      "location_id": null,      "owner_id": "00000000-0000-0000-0000-0000000009f1",      "package_id": null,      "product_id": "ccfa574a-c5ee-4a01-a313-fa025fe768e5",      "quantity": "10",      "reason": "revaluation",      "total_cost": "10000",      "unit_cost": "1000",      "unit_type": {        "id": "00000000-0000-0000-0000-00000000524f",        "name": "Gram"      },      "updated_datetime": "2026-10-13T15:03:31.443403Z"    },    {      "batch_id": null,      "completion_datetime": "2026-10-13T15:03:31.603489Z",      "compliance_quantity": "1",      "compliance_unit_type": {        "id": "00000000-0000-0000-0000-000000005251",        "name": "Ounce"      },      "creator": {        "banned": false,        "deleted_at": null,        "email": "[email protected]",        "full_name": "FirstName5122 LastName5123",        "id": "00000000-0000-0000-0000-0000000009f1",        "inserted_datetime": "2026-10-13T15:03:31.355598Z",        "role": {          "id": "00000000-0000-0000-0000-000000000a5c",          "name": "Admin 2651"        },        "updated_datetime": "2026-10-13T15:03:31.355598Z"      },      "description": "A default note describing this transaction",      "id": "00000000-0000-0000-0000-000000000081",      "inserted_datetime": "2026-10-13T15:03:31.620517Z",      "license_id": "00000000-0000-0000-0000-000000000095",      "location_id": "00000000-0000-0000-0000-0000000001d0",      "owner_id": null,      "package_id": "00000000-0000-0000-0000-000000000043",      "product_id": "a97c9ce1-5b34-4d4a-a9dd-e3163db6185a",      "quantity": "1",      "reason": "Voluntary Surrender",      "total_cost": "900",      "unit_cost": "900",      "unit_type": {        "id": "00000000-0000-0000-0000-000000005251",        "name": "Ounce"      },      "updated_datetime": "2026-10-13T15:03:31.620517Z"    },    {      "batch_id": "00000000-0000-0000-0000-00000000014b",      "completion_datetime": "2026-10-13T15:03:31.721323Z",      "compliance_quantity": null,      "compliance_unit_type": null,      "creator": {        "banned": false,        "deleted_at": null,        "email": "[email protected]",        "full_name": "FirstName5436 LastName5437",        "id": "00000000-0000-0000-0000-000000000a8a",        "inserted_datetime": "2026-10-13T15:03:31.717831Z",        "role": {          "id": "00000000-0000-0000-0000-000000000af6",          "name": "Admin 2805"        },        "updated_datetime": "2026-10-13T15:03:31.717831Z"      },      "description": null,      "id": "00000000-0000-0000-0000-000000000083",      "inserted_datetime": "2026-10-13T15:03:31.726016Z",      "license_id": null,      "location_id": "00000000-0000-0000-0000-0000000001cc",      "owner_id": null,      "package_id": null,      "product_id": "6a22ffc2-1159-41e2-84ab-f9f5c23192d4",      "quantity": "1",      "reason": "revaluation",      "total_cost": "-800",      "unit_cost": "-800",      "unit_type": {        "id": "00000000-0000-0000-0000-00000000524f",        "name": "Gram"      },      "updated_datetime": "2026-10-13T15:03:31.726016Z"    }  ],  "next_page": null}