# Retrieve a shipment

Operation ID: `getShipment`

Group: Inventory › Shipments

[Open in the interactive reference](https://docs.api.lensing.ai/lensing/v1/endpoints/getShipment)

`GET /inventory/shipments/{id}`

Read-only: Reads and returns; changes nothing.

Retrieves a shipment. Use the shipment's id, not its documentNumber.

The response includes all of the shipment's lines. POST inventory/shipments/search returns the same fields. The collection GET inventory/shipments returns the shipment's main fields only, without the lines.

## Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `Api-Version` | header | string · v1 | yes | The API version this request targets, named by its public identifier. Required on every request; omitting it, or naming a version this company does not have, is answered with 400. This document describes version `v1`. |
| `id` | path | string | yes | The unique identifier of the shipment you want to retrieve. |

## Response

`200` Success

Under `data` (getShipmentOutput):

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `id` | string | yes | The unique identifier for the shipment. Example: `"2f7c9b31-8a05-4d16-b47e-903c5f1a86d2"`. |
| `documentNumber` | string | no | The shipment's document number, for example 'SD-8841'. Absent while none has been assigned. Example: `"SD-8841"`. |
| `documentStatus` | string | yes | The status of the shipment. Possible values: 'DRAFT', 'PACKED', 'PARTIALLY_SHIPPED', 'SHIPPED', 'COMMITTED', 'DELIVERED', 'COMPLETED', 'CANCELLED', 'INVOICED', 'PARTIALLY_INVOICED', 'RETURNED', 'PARTIALLY_RETURNED'. Example: `"DRAFT"`. |
| `documentDate` | date | yes | The date the shipment is dated. Format YYYY-MM-DD. Example: `"2026-08-14"`. |
| `deliveryDate` | date | no | The planned or actual delivery date. Format YYYY-MM-DD. Example: `"2026-08-19"`. |
| `entityId` | string | yes | The unique identifier for the legal entity the shipment belongs to. See id on GET base/entities. Example: `"1a9c4e70-38b5-4d26-9f01-7c2e5b8a6d43"`. |
| `entityName` | string | no | The display name of that legal entity. Example: `"Acme Netherlands B.V."`. |
| `businessPartnerId` | string | yes | The unique identifier for the customer the goods go to. Despite the name, this is a customer id. See id on GET accounting/customers/:id. Example: `"c73f2b81-5d94-4e60-a812-0f9b6d3e45c7"`. |
| `businessPartnerName` | string | no | The display name of that customer. Example: `"Bakker Retail B.V."`. |
| `shipmentCarrierId` | string | no | The unique identifier for the carrier taking the goods. See id on GET inventory/shipment-carriers/:id. Example: `"9d0a5e26-b183-4c47-92f5-6a4e17b0c853"`. |
| `shipmentCarrierName` | string | no | The name of that carrier. Example: `"PostNL"`. |
| `trackingNumber` | string | no | The carrier's tracking number for the goods. Example: `"3SABCD1234567"`. |
| `referenceNumber` | string | no | The customer's own reference for the shipment. Example: `"PO-BAKKER-4417"`. |
| `returnStatus` | string | no | How much of the shipment has come back on sales returns. Possible values: 'OPEN', 'PARTIALLY_RETURNED', 'FULLY_RETURNED'. The return process maintains it. Example: `"OPEN"`. |
| `currency` | string | no | The currency of every amount on the shipment. Format ISO 4217, for example 'EUR'. Example: `"EUR"`. |
| `totalAmount` | decimal | no | The total value of the shipment, in the shipment's currency. Example: `"960.00"`. |
| `notes` | string | no | Free text on the shipment. Example: `"Palletised"`. |
| `createdDate` | date-time | no | The date and time the shipment was created, in UTC. Format YYYY-MM-DDTHH:mm:ss.sssZ. Example: `"2026-08-14T08:30:00.000Z"`. |
| `lastModifiedDate` | date-time | no | The date and time the shipment record last changed, in UTC. Format YYYY-MM-DDTHH:mm:ss.sssZ. Example: `"2026-08-14T08:30:00.000Z"`. |
| `lines` | array<object> | yes | The lines of the shipment. A shipment always has at least one. Example: `[{"id":"8c14a6f2-3b70-4d59-9e02-6f5a1d38b47c","itemId":"5f21c8b0-9d34-4a76-8e12-04b93c7de5a8","itemCode":"WIDGET-01","itemName":"Standard widget","locationId":"e1d84c07-5b39-4a26-9f70-2c8b613ad495","locationCode":"WH-01","locationName":"Rotterdam Distribution Centre","unitId":"3b7d5e9c-1a24-4f80-9c6d-2e8f70b13a45","unitCode":"EA","quantity":"40.00","inventoryQuantity":"40.00","unitPrice":"24.00","sourceDocumentLineId":"f9a4cdef-6095-425e-84f1-7f8192801ea2","sourceDocumentLineType":"SalesOrderProductItem","notes":"Ship complete"}]`. |
| `lines[].id` | string | yes | The unique identifier for the shipment line. |
| `lines[].itemId` | string | yes | The unique identifier for the item going out. See id on GET inventory/items/:id. |
| `lines[].itemCode` | string | no | The short code of that item. |
| `lines[].itemName` | string | no | The display name of that item. |
| `lines[].locationId` | string | no | The unique identifier for the warehouse the goods leave from. Every line of a shipment must use the same warehouse. See id on GET inventory/warehouses/:id. |
| `lines[].locationCode` | string | no | The short code of that warehouse. |
| `lines[].locationName` | string | no | The display name of that warehouse. |
| `lines[].unitId` | string | yes | The unique identifier for the unit the quantity is counted in. See id on GET inventory/unit-of-measures/:id. |
| `lines[].unitCode` | string | no | The short code of that unit. |
| `lines[].quantity` | decimal | yes | The quantity going out, in the line's unit. |
| `lines[].inventoryQuantity` | decimal | no | The same quantity in the item's stocking unit. |
| `lines[].pickedQuantity` | decimal | no | How much of the line has been picked. This API does not set it. |
| `lines[].packedQuantity` | decimal | no | How much of the line has been packed. This API does not set it. |
| `lines[].returnedQuantity` | decimal | no | How much of the line has come back on a sales return. |
| `lines[].openReturnQuantity` | decimal | no | How much of the line may still be returned. |
| `lines[].unitPrice` | decimal | no | The value of one unit, in the shipment's currency. |
| `lines[].status` | string | no | Where the line sits in the warehouse process. This is free text with no fixed set of values. |
| `lines[].sourceDocumentLineId` | string | no | The sales order line this line ships against. Each order publishes its lines as items[].id on GET accounting/sales-orders/:id. |
| `lines[].sourceDocumentLineType` | any | no | The kind of document line the source line is. One of: `"IMInventorySalesOrderLine"`, `"IMInventorySalesDeliveryLine"`, `"IMSalesOrderLine"`, `"IMInventoryPurchaseReturnLine"`, `"IMInventorySalesReturnLine"`, `"IMWarehouseTransferLine"`, `"IMInventoryDecreaseLine"`, `"IMInventoryIncreaseLine"`, `"IMInventoryRevaluationLine"`, `"IMInventoryTransferLine"`, `"IMInventoryAdjustmentLine"`, `"IMInventoryCountLine"`, `"IMInventoryPutAwayTask"`, `"IMInventoryPurchaseReturnReversal"`, `"PurchaseOrderLine"`, `"IMLandedCostAllocationLine"`, `"SalesOrderProductItem"`, `"IMWarehouseTransferOrderLine"`, `"VendorBillItemBase"`, `"InvPurchaseDeliveryLine"`. |
| `lines[].notes` | string | no | Free text on the line. |
| `lines[].batches` | array<object> | no | The batches going out on this line, for a batch-tracked item. Absent when the item is not batch-tracked. |
| `lines[].batches[].batchNumberId` | string | no | The unique identifier for the batch record. |
| `lines[].batches[].batchNumber` | string | yes | The batch number as printed. |
| `lines[].batches[].expirationDate` | date | no | The expiration date of the batch. Format YYYY-MM-DD. |
| `lines[].batches[].quantity` | decimal | yes | The quantity of this batch going out, in the item's inventory unit. |
| `lines[].batches[].inventoryQuantity` | decimal | no | The same quantity in the item's stocking unit. |
| `lines[].batches[].returnedQuantity` | decimal | no | How much of this batch has come back on a sales return. |
| `lines[].batches[].unitCost` | decimal | no | The cost of one unit of this batch at shipment, in the shipment's currency. |
| `lines[].serials` | array<object> | no | The serialized units going out, one entry per unit. Absent when the item is not serialized. |
| `lines[].serials[].serialNumberId` | string | no | The unique identifier for the serial record. |
| `lines[].serials[].serialNumber` | string | yes | The serial number stamped on the unit. |
| `lines[].serials[].returnedQuantity` | decimal | no | How much of this unit has come back on a sales return. |
| `lines[].serials[].unitCost` | decimal | no | The cost of this unit at shipment, in the shipment's currency. |
| `lines[].binLocations` | array<object> | no | The bins the goods come out of, in a bin-tracked warehouse. Each entry that names a batchNumber or serialNumber belongs to that batch or unit, and one that names neither belongs to the line. |
| `lines[].binLocations[].binLocationId` | string | yes | The unique identifier for the bin the goods come out of. See id on GET inventory/bins/:id. |
| `lines[].binLocations[].binLocationCode` | string | no | The short code of that bin. |
| `lines[].binLocations[].quantity` | decimal | yes | The quantity taken from this bin, in the item's inventory unit. |
| `lines[].binLocations[].inventoryQuantity` | decimal | no | The same quantity in the item's stocking unit. |
| `lines[].binLocations[].batchNumber` | string | no | The batch this bin entry belongs to, when it belongs to one of the line's batches. |
| `lines[].binLocations[].serialNumber` | string | no | The serialized unit this bin entry belongs to, when it belongs to one of the line's units. |

```json
{
  "data": {
    "id": "2f7c9b31-8a05-4d16-b47e-903c5f1a86d2",
    "documentNumber": "SD-8841",
    "documentStatus": "DRAFT",
    "documentDate": "2026-08-14",
    "deliveryDate": "2026-08-19",
    "entityId": "1a9c4e70-38b5-4d26-9f01-7c2e5b8a6d43",
    "entityName": "Acme Netherlands B.V.",
    "businessPartnerId": "c73f2b81-5d94-4e60-a812-0f9b6d3e45c7",
    "businessPartnerName": "Bakker Retail B.V.",
    "shipmentCarrierId": "9d0a5e26-b183-4c47-92f5-6a4e17b0c853",
    "shipmentCarrierName": "PostNL",
    "trackingNumber": "3SABCD1234567",
    "referenceNumber": "PO-BAKKER-4417",
    "returnStatus": "OPEN",
    "currency": "EUR",
    "totalAmount": "960.00",
    "notes": "Palletised",
    "createdDate": "2026-08-14T08:30:00.000Z",
    "lastModifiedDate": "2026-08-14T08:30:00.000Z",
    "lines": [
      {
        "id": "8c14a6f2-3b70-4d59-9e02-6f5a1d38b47c",
        "itemId": "5f21c8b0-9d34-4a76-8e12-04b93c7de5a8",
        "itemCode": "WIDGET-01",
        "itemName": "Standard widget",
        "locationId": "e1d84c07-5b39-4a26-9f70-2c8b613ad495",
        "locationCode": "WH-01",
        "locationName": "Rotterdam Distribution Centre",
        "unitId": "3b7d5e9c-1a24-4f80-9c6d-2e8f70b13a45",
        "unitCode": "EA",
        "quantity": "40.00",
        "inventoryQuantity": "40.00",
        "unitPrice": "24.00",
        "sourceDocumentLineId": "f9a4cdef-6095-425e-84f1-7f8192801ea2",
        "sourceDocumentLineType": "SalesOrderProductItem",
        "notes": "Ship complete"
      }
    ]
  },
  "diagnostics": [
    {
      "code": "<code>",
      "message": "<message>",
      "severity": "error",
      "path": [
        "<path>"
      ],
      "details": "<details>"
    }
  ]
}
```

## Errors

| Code | Status |
| --- | --- |
| `NOT_FOUND` | 400 |

## Statuses

- `400` — Invalid request or business failure. Codes: NOT_FOUND
- `401` — The request carries no valid access token.
- `403` — Not authorized
- `404` — Not found
- `429` — Too many requests from this client address. The response has no body and no `Retry-After` header.
- `500` — Internal server error
