Skip to content

List Stock Movements ​

Returns a paginated list of stock movements.

Required license

This endpoint requires the Stock management add-on.

Request ​

GET /api/oauth/v2/resource/wares/movements

HeaderValue
AuthorizationBearer {access_token}

Query parameters ​

ParameterTypeRequiredDescription
offsetintegerNoStart position (default: 0)
limitintegerNoNumber of results (default: 50, max: 200)
wareIdstring (UUID)NoFilter by a specific ware
typestringNoComma-separated list of movement types (see below)
directionstringNoin or out
fromstring (ISO 8601)NoOnly movements on or after this movement date
untilstring (ISO 8601)NoOnly movements on or before this movement date. A date without a time (e.g. 2026-06-30) counts through end of day (23:59:59)
createdSincestring (ISO 8601)NoIncremental sync window, start bound
createdUntilstring (ISO 8601)NoIncremental sync window, end bound

Note: from/until bound the business date range of a movement, createdSince/createdUntil bound an incremental sync window. Both pairs technically filter the same movement date, but stay independently usable and combine: they are AND-combined, so the narrowest bound wins. from after until returns 400 validation_error. updatedSince, updatedUntil, and deletedSince are not supported on this endpoint and are silently ignored.

Response ​

Success (200 OK) ​

Example: outflow from an invoice

json
{
  "data": [
    {
      "id": "b2c3d4e5-f6a7-8901-bcde-f12345678901",
      "date": "2026-08-20T09:14:00+02:00",
      "type": "out_invoice",
      "customTypeName": null,
      "direction": "out",
      "amount": -2,
      "stockOld": 26,
      "stockNew": 24,
      "notice": null,
      "ware": "c3d4e5f6-a7b8-9012-cdef-012345678901",
      "consumer": null,
      "createdBy": "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
    }
  ],
  "meta": {
    "total": 318,
    "offset": 0,
    "limit": 50
  }
}

Example: outflow with a consumer

json
{
  "data": [
    {
      "id": "e5f6a7b8-c9d0-1234-efab-234567890123",
      "date": "2026-08-21T10:05:00+02:00",
      "type": "out_customer",
      "customTypeName": null,
      "direction": "out",
      "amount": -1,
      "stockOld": 5,
      "stockNew": 4,
      "notice": null,
      "ware": "c3d4e5f6-a7b8-9012-cdef-012345678901",
      "consumer": "f0e1d2c3-b4a5-6789-fedc-ba9876543210",
      "createdBy": null
    }
  ],
  "meta": {
    "total": 318,
    "offset": 0,
    "limit": 50
  }
}

Response fields ​

FieldTypeDescription
dataArrayList of stock movements
data[].idstring (UUID)Unique ID of the movement
data[].datestring (ISO 8601)Date and time of the movement
data[].typestringOne of the movement types above
data[].customTypeNamestring | nullDisplay name of a company-specific type. Only set for in_custom / out_custom
data[].directionstringin or out
data[].amountnumberSigned. Equals stockNew - stockOld. Outgoing movements are negative
data[].stockOldnumberStock before the movement
data[].stockNewnumberStock after the movement
data[].noticestring | nullFree-text note
data[].warestring (UUID) | nullID of the affected ware, loadable via Get Ware
data[].consumerstring (UUID) | nullID of the consumer this movement is attributed to, if applicable
data[].createdBystring (UUID) | nullID of the user who created the movement
meta.totalintegerTotal number of movements
meta.offsetintegerCurrent start position
meta.limitintegerNumber of returned entries

Note on amount: amount is signed — outgoing movements are negative. Summing amount across incoming and outgoing movements without accounting for the sign produces a wrong total.

Note on inventory: For type inventory, the direction comes from comparing stockNew against stockOld — an inventory correction can go either way, the type name alone does not tell you the direction.

Movement types ​

TypeDescription
inRegular stock inflow
in_invoice_stornoInflow from a reversed invoice
in_customCompany-specific inflow type
in_purchaseInflow from a completed purchase order
inventoryInventory correction (can be either direction, see below)
out_invoiceOutflow from an invoice
out_customerOutflow assigned to a customer
out_lossOutflow due to loss (e.g. breakage, expiry)
out_otherOther outflow
out_customCompany-specific outflow type

Company-specific types are normalized to in_custom or out_custom. Their original display name is returned in customTypeName.

Beispiele
bash
curl -X GET "https://my.offisy.at/api/oauth/v2/resource/wares/movements?offset=0&limit=50&wareId=b2c3d4e5-f6a7-8901-bcde-f01234567890&type=beispiel&direction=beispiel&from=beispiel&until=beispiel&createdSince=beispiel&createdUntil=beispiel" \
  -H "Authorization: Bearer {access_token}"
Parameter
Zuerst Token anfordern

Possible errors ​

StatusCodeDescription
400validation_errorInvalid type / direction / wareId value
400validation_errorfrom, until, createdSince, or createdUntil is not a valid ISO 8601 date or date/time
400validation_errorfrom is after until
401invalid_clientInvalid or missing access token
403insufficient_scopeScope wares not present, or Stock management add-on not licensed
404not_foundWare for wareId not found or not permitted

Offisy GmbH