> For the complete documentation index, see [llms.txt](https://dev.skladon.com/main/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://dev.skladon.com/main/integration/api/stock-movements.md).

# Stock movements

In order to get stock movements you can either setup a webhook or use API endpoints to retrieve them.

### Webhooks

Currently supported stock movement types:&#x20;

* stock\_correction
* completition

Every stock movent type offers webhook when new stock stock movement of that type is created

List of currently available webhooks:

* CREATE\_STOCK\_MOVEMENT\_STOCK\_CORRECTION
* CREATE\_STOCK\_MOVEMENT\_COMPLETITION

### API Endpoints

## Filter stock movements (grid)

> Paged stock-movement search. Body: \`#/definitions/V21GridRequestGeneric\`.\
> Use \*\*stock-movement\*\* column names from that definition. Filters on this endpoint may also use operator \*\*\`likein\`\*\* (in addition to the standard operator set documented on \`V21GridRequestGeneric\`).<br>

```json
{"openapi":"3.1.1","info":{"title":"GWMS API v2.1 (v21)","version":"2.1.0"},"tags":[{"name":"StockMovements","description":"Stock movements (grid)"}],"servers":[{"url":"https://gw.new.skladon.net/v21"}],"security":[{"authorization":[],"XApiKey":[]}],"components":{"securitySchemes":{"authorization":{"type":"apiKey","name":"authorization","in":"header"}},"parameters":{"HeaderXApiKey":{"schema":{"type":"string"},"name":"x-api-key","in":"header","required":true,"description":"Eshop API key from onboarding"},"HeaderAuthorization":{"schema":{"type":"string"},"name":"authorization","in":"header","required":true,"description":"Bearer JWT from POST /v21/users/login"}},"schemas":{"V21GenericGridResponse":{"type":"object","description":"Grid result envelope. `data.data` is an array of row objects (shape depends on requested `columns`).\n`data.request` echoes the grid request. `data.totalCount` is the total number of matching rows (for pagination).\n","required":["statusCode","message"],"properties":{"statusCode":{"type":"number"},"message":{"type":"string"},"data":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object"}},"request":{"type":"object"},"totalCount":{"type":"number"}}}}},"ErrorMessageResponse":{"type":"object","description":"Shape of every 4xx and 5xx response under `/v21`. See the \"Error response format\" section in the API description.","properties":{"statusCode":{"type":"number","description":"Repeats the HTTP status code of the response."},"error":{"type":"string","description":"Standard HTTP status text for `statusCode`."},"message":{"type":"string","description":"Human readable detail of what went wrong."}},"required":["statusCode","error","message"]},"V21GridRequestGeneric":{"type":"object","description":"Paged list / search body for all `POST …/filter` endpoints.\n\n**Top-level fields**\n- `page` (integer ≥ 1, default 1)\n- `items` (page size, 1–1000, default 10)\n- `columns` (string[]): which fields each row should include; **empty array = all columns** for that grid\n- `sorts`: array of `{ column, direction }`; `direction` is `ASC`, `DESC`, `asc`, or `desc`\n- `filters`: **OR of AND-groups**. Outer array = OR. Each inner array = AND of conditions. Each condition = `{ column, operator, value }`.\n\n**Filter operators** (unless noted for stock movements only)\n- `eq` / `neq` — equal / not equal\n- `gt` / `gte` / `lt` / `lte` — comparisons\n- `in` / `nin` — value must be an **array** of scalars in `value`\n- `like` / `nlike` — substring match / not match\n- `between` / `nbetween` — `value` must be an **array of two** endpoints\n- `null` / `notnull` — column IS NULL / IS NOT NULL\n- `empty` / `notempty` — null or empty string / neither\n- **Stock movements only** (this endpoint’s filters): `likein` is also allowed (same family as `like`).\n\n**`value` type**: string, number, boolean, array, or `null`, depending on `operator` (e.g. `in`/`nin`/`between` expect arrays as above).\n\n---\n\n**Columns that are filter only**: a few columns can be filtered and sorted on but are not part of\nthe response — orders `method` (internal delivery marker, always `DEL`), products\n`insertToProductId` (the response exposes the resolved `insertToProductSkus` and\n`insertToCountries` instead) and claims `note` (a Skladon-internal note that v2.1 no longer returns).\n\n**Sorting and `NULL` values**: sorting is delegated to MySQL `ORDER BY` without an explicit\n`NULLS FIRST` / `NULLS LAST` clause, so rows with `NULL` in the sorted column come **first** for\n`ASC` and **last** for `DESC`. Rows that compare equal have no guaranteed order between pages —\nwhen paging through a full export, always append a stable tiebreaker such as\n`{\"column\": \"id\", \"direction\": \"ASC\"}` as the last sort.\n\n---\n\n**Column names for `POST /products/filter`** (also use these in `sorts[].column` and filter `column`):\n`id`, `customField1`, `customField2`, `customField3`, `description`, `ean`, `eanLockedByDcix`, `expMethod`, `guid`, `hsCode`, `isbn`, `mpn`, `name`, `note`, `price`, `productType`, `rop`, `sku`, `upc`, `active`, `scanImeiSn`, `originCountry`, `snRegex`, `unitPrice`, `weight`, `width`, `height`, `length`, `insertToProductId`, `insertType`, `insertByOrderType`, `insertPriceFrom`, `insertPriceTo`, `expirationDays`, `createdAt`, `updatedAt`, `dimensionsChangedAt`, `deletedAt`, `quantityConversion`, `isDeleted`, `ageCheck`, `batteryType`, `sourceSys`.\n\n**Column names for `POST /orders/filter`**:\n`id`, `addressId`, `allowExpedition`, `billingAddressAdditionalInfo`, `billingAttentionName`, `billingCity`, `billingCompanyId`, `billingCompanyName`, `billingEmail`, `billingName`, `billingPhone`, `billingPostCode`, `billingProvinceCode`, `billingState`, `billingStreet`, `billingTaxId`, `codCurrency`, `codPrice`, `codRefNumber`, `currency`, `eshopOrderId`, `invoiceDate`, `requiredExpeditionDate`, `invoiceNumber`, `marketplace`, `message`, `method`, `note`, `orderType`, `paid`, `partnerOrderId`, `paymentMethod`, `price`, `printFiles`, `holdByQuality`, `pickFromCustomsWarehouse`, `underSanction`, `recipientAddressAdditionalInfo`, `recipientAttentionName`, `recipientCity`, `recipientCompanyId`, `recipientCompanyName`, `recipientEmail`, `recipientName`, `recipientPhone`, `recipientPostCode`, `recipientProvinceCode`, `recipientState`, `recipientStreet`, `recipientTaxId`, `shipper`, `shipperServiceCode`, `branchId`, `shippingPrice`, `status`, `timestamp`, `trackingNumbers`, `recipientGln`, `billingGln`, `deliveredAt`, `updatedAt`, `disableShippingReorder`, `waitingForPaymentAt`, `productsNotAvailableAt`, `suspendedAt`, `releaseFromSuspendedAt`, `incorrectAt`, `waitingForShipmentAt`, `shipmentOrderedAt`, `inProcessAt`, `packedAt`, `waitingForCarrierAt`, `shippedAt`, `atPickupPointAt`, `returningBackAt`, `returnedBackAt`, `preReceivedAt`, `parentOrderId`, `parentEshopOrderId`, `returnTrackingNumber`, `exchangeTrackingNumber`, `eshopNote`, `orderBoxCount`, `incorrectOrderMessage`, `canceledAt`, `slaDate`, `scannedAt`, `preorderReleaseAt`, `printReturnLabel`, `sourceSys`, `weight`.\n\n**Column names for `POST /receivings/filter`**:\n`id`, `asn`, `createdAt`, `slaDate`, `quantity`, `received`, `diffQuantity`, `driverCompanyOtherName`, `canceledAt`, `confirmedAt`, `unloadedAt`, `receivedAt`, `eshopReceivingId`, `deliveryNoteNumber`, `deliveryType`, `description`, `driverCompany`, `driverDispatcherContact`, `driverName`, `driverPhone`, `driverTrailerLicensePlate`, `duty`, `estimatedDelivery`, `status`, `supplier`, `trackingNumber`, `unitsAmount`, `urgent`, `eshopNote`, `asnLabelEmail`, `priority`, `containerNumber`, `announcedPalletsCount`, `receivingType`, `realDelivery`, `slaSuspended`, `photoDocumentationTaken`, `deliveredPalletsCount`, `deliveredCartonsCount`, `incoterms`, `returnedEurPalletsCount`, `deliveredStandardPalletsCount`, `returnedStandardPalletsCount`, `deliveredOtherPalletsCount`, `deliveredBrokenPalletsCount`, `skladonNote`.\n\n**Column names for `POST /returns/filter`**:\n`id`, `description`, `eshopReturnId`, `eshopOrderId`, `note`, `orderType`, `shipper`, `shipperServiceCode`, `status`, `trackingNumber`, `rma`, `createdAt`, `eshopNote`, `canceledAt`, `confirmedAt`, `receivedAt`, `sourceSys`, `transportPaidBy`, `orderId`, `partnerOrderId`, `recipientName`, `senderStreet`, `senderCity`, `senderState`, `senderPostcode`, `senderPhone`, `orderShipper`, `orderShipperServiceCode`, `orderTrackingNumber`.\n\n**Column names for `POST /claims/filter`**:\n`id`, `fcn`, `eshopClaimId`, `eshopOrderId`, `orderId`, `orderType`, `shipper`, `trackingNumber`, `returnTrackingNumber`, `cctv`, `description`, `note`, `claimCause`, `causeOtherType`, `status`, `createdAt`, `closedAt`, `inProcessAt`, `moreInfoNeededAt`, `informationAddedAt`, `rejectedAt`, `canceledAt`, `acceptedExpectCompensationAt`, `acceptedPendingClientCompensationAt`, `resolutionText`, `resolver`, `transportPrice`, `goodsPrice`, `totalServicePrice`, `compensationCurrency`, `eshopNote`.\n\n**Column names for `POST /stock-movements/filter`**:\n`count`, `createdAt`, `updatedAt`, `expirationDate`, `id`, `lot`, `sku`, `type`.\n","properties":{"page":{"type":"integer","minimum":1,"default":1},"items":{"type":"integer","minimum":1,"maximum":1000,"default":10},"columns":{"type":"array","items":{"type":"string"}},"sorts":{"type":"array","items":{"type":"object","required":["column","direction"],"properties":{"column":{"type":"string"},"direction":{"type":"string","enum":["ASC","DESC","asc","desc"]}}}},"filters":{"type":"array","description":"Outer array = OR of groups. Each inner array = AND of `{ column, operator, value }`.\nOperators and allowed `column` values are documented on `V21GridRequestGeneric`.\n","items":{"type":"array","items":{"type":"object","required":["column","operator","value"],"properties":{"column":{"type":"string"},"operator":{"type":"string","description":"Filter operator; see `V21GridRequestGeneric` for the full list.\nStock-movement filters also support `likein`.\n"},"value":{"description":"Scalar, array, or null — depends on operator (e.g. `in`/`nin`/`between` use arrays)."}}}}}}}}},"paths":{"/stock-movements/filter":{"post":{"tags":["StockMovements"],"summary":"Filter stock movements (grid)","description":"Paged stock-movement search. Body: `#/definitions/V21GridRequestGeneric`.\nUse **stock-movement** column names from that definition. Filters on this endpoint may also use operator **`likein`** (in addition to the standard operator set documented on `V21GridRequestGeneric`).\n","operationId":"v21_postStockMovementsFilter","parameters":[{"$ref":"#/components/parameters/HeaderXApiKey"},{"$ref":"#/components/parameters/HeaderAuthorization"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V21GenericGridResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessageResponse"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/V21GridRequestGeneric"}}},"required":true}}}}}
```
