Overview
The endpoint is a list of Transport Units. Transport units can be read, created (POST) and changed (PATCH). Deleting transport units through the API is not allowed.
|
Endpoint name |
|
|
Source table |
|
|
Fixed view |
Filter on |
|
Requests allowed |
GET, POST, PATCH |
|
Primary key |
|
|
Record ID |
|
|
Child Objects |
Available with $expand
|
|
Procedures |
|
The child objects have their own pages in this space:
-
pallets: API - Pallets, API - Pallets -
salesAgreements: API - Sales Agreements, API - Sales Agreements. Shows the delivery agreements that are allocated to the transport unit on header level. -
salesAgreementLines: API - Sales Agreement Lines, API - Sales Agreement Lines. Shows the delivery agreement lines that are allocated to the transport unit on line level.
Record relations for Transport Units
|
Data relation |
API properties to use |
|---|---|
|
A Scheduled Trip can have multiple transport units |
Get Get |
|
Each sales agreement is assigned to only one scheduled trip |
Get Get |
|
A sales agreement can be assigned to only one of the transport units of that particular trip. |
In this case, a field for the transport unit is populated on the header of the sales agreement: Get |
|
If multiple transport units are used for the sales agreement, the transport unit can be assigned on line level. |
The following property on the line will always return a transport unit, either the one from the line (if populated), else it will return the one on the header. Get |
|
Each transport unit can therefore contain items for multiple sales agreements. |
Get Get |
Data
Field List
|
Property |
Type |
Format |
Description |
|
|
|---|---|---|---|---|---|
|
1 |
|
string |
uuid |
SystemId |
non-editable |
|
2 |
|
number |
integer |
The primary key of the entry is an integer. It is assigned automatically (AutoIncrement) when a transport unit is created. |
primary key Record ID |
|
3 |
|
string |
max 20 |
Container No. |
optional |
|
4 |
|
string |
max 20 |
This is the Scheduled Trip which the transport unit belongs to. |
optional |
|
5 |
|
string |
max 20 |
Reference No. |
optional |
|
6 |
|
string |
max 71 |
It is a string combined of different information, depending on the Vehicle Type. For Vehicle Type Ship: the vehicle name, followed by the container number, or the reference number if there is no container number. For other vehicle types: the shipping agent code, followed by the vehicle registration number (or the vehicle code if there is no registration number) and the container number, if any. |
non-editable |
|
7 |
|
string |
max 70 |
String combined of "Vehicle Type" + "Shipping Agent Code" + "Vehicle Code" |
non-editable |
|
8 |
|
string |
max 50 |
Vehicle Name |
optional |
|
9 |
|
string |
enum |
Options: " ",Truck,Trailer,Airline,Railway,Ship,Unknown |
optional |
|
10 |
|
string |
enum |
Options: Open,Released,InLoading,ReadyForTransport,InTransport,TransportCompleted,Cancelled The status is not editable directly. Procedure |
non-editable |
|
11 |
|
string |
enum |
|
optional |
|
12 |
|
string |
max 20 |
Seal number |
optional |
|
13 |
|
string |
max 10 |
Location |
optional |
|
14 |
|
string |
max 10 |
Place of Loading |
optional |
|
15 |
|
string |
max 10 |
Place of Delivery |
optional |
|
16 |
|
string |
max 10 |
Place of Destination |
optional |
|
17 |
|
string |
date |
Departure Date (Scheduled) |
optional |
|
18 |
|
string |
time |
Departure Time (Scheduled) |
optional |
|
19 |
|
string |
date |
Arrival date |
optional |
|
20 |
|
string |
time |
Arrival time |
optional |
|
21 |
|
string |
date-time |
Arrival date and time |
non-editable |
|
22 |
|
string |
max 100 |
Temperature Description |
non-editable |
|
23 |
|
number |
integer |
The number of pallets that have this transport unit id in field “Transport Unit ID” |
non-editable |
|
24 |
|
number |
decimal |
The total weight of the trade items on the reserved pallets. |
non-editable |
|
25 |
|
number |
decimal |
The total number of trade items on the reserved pallets. |
non-editable |
|
26 |
|
string |
max 20 |
If there is just one allocated delivery agreement no. This is the table field "Allocated to Delivery Agr. No.". Note: This is not used, if the transport unit contains items for multiple delivery agreements. |
optional |
|
27 |
|
number |
decimal |
Tare Weight |
optional |
|
28 |
|
array |
|
List of the pallets, only visible by using $expand The pallets that have this transport unit in field “Transport Unit ID”. |
|
|
29 |
|
array |
|
List of the sales agreements (delivery agreements), only visible by using $expand |
|
|
30 |
|
array |
|
List of the sales agreement lines (delivery agreement lines) allocated to the transport unit on line level, only visible by using $expand |
|
|
31 |
|
integer |
|
System row version. Increments every time the record is modified. |
non-editable |
|
32 |
|
string |
date-time |
SystemModifiedAt (date and time of last change) |
non-editable |
|
33 |
|
string |
|
The user who last modified the record. |
non-editable |
Object Example
{
"systemId": "fcab40a6-410b-f111-b02e-cfedda509304",
"id": 1,
"containerNo": "CONT-001",
"tripNo": "TRIP-01",
"referenceNo": "",
"description": "DHL TR111 CONT-001",
"shipperDescription": " DHL ",
"vehicleName": "",
"vehicleType": " ",
"status": "Released",
"containerType": " ",
"sealNo": "",
"locationCode": "",
"placeOfLoading": "",
"placeOfDelivery": "",
"placeOfDestination": "",
"departureDateScheduled": "2026-05-01",
"departureTimeScheduled": "14:00:00",
"arrivalDateScheduled": "0001-01-01",
"arrivalTimeScheduled": "00:00:00",
"arrivalDateTimeScheduled": "0001-01-01T00:00:00Z",
"temperatureDescription": "",
"reservedPallets": 0,
"reservedWeight": 145,
"reservedTradeItems": 29,
"deliveryAgreementNo": "",
"tareWeight": 0,
"pallets": [],
"salesAgreements": [],
"salesAgreementLines": [],
"systemRowVersion": 5412,
"lastModified": "2026-05-01T15:07:03.213Z",
"modifiedByUser": "BJARTEY"
}
Procedures
Procedures are called on a specific transport unit: POST transportUnits(<id>)/Microsoft.NAV.<procedureName> with a JSON body of parameters. Each procedure returns a text message in the value property of the response on success. On failure it returns an error with a readable message.
Since the endpoint only shows transport units with status Open .. ReadyForTransport, the procedures can only be called on transport units with those statuses.
|
Procedure |
Parameters |
Description |
Details |
|---|---|---|---|
|
|
|
Load a pallet, identified by its barcode, to the transport unit. The pallet must be reserved to an agreement. |
|
|
|
|
Unload a pallet, identified by its barcode, from the transport unit. The pallet must be loaded to this transport unit. |
|
|
|
|
Set the container no., seal no. and tare weight of the transport unit and change its status to |
|
|
|
|
Deprecated. Always returns an error, use |
Loading Pallets
Load a Pallet
To load a specific pallet into the transport unit, a container for example. The pallet needs to be reserved to an agreement.
The procedure loadPallet loads the pallet to the transport unit the procedure is called on.
POST
.../transportUnits([record-id])/Microsoft.NAV.loadPallet
Body:
{
"palletBarcode": "00200100000000148347"
}
|
Parameters |
Type |
Max Len |
Description |
|
|---|---|---|---|---|
|
|
string |
20 |
The pallet barcode, as it is in BC. |
mandatory |
If successful, the response is: Pallet <Pallet No.> successfully loaded to Transport Unit <ID>.
The database modifications when this is run successfully:
-
On the Pallet
-
Loaded = true
-
“Loading Date-Time” is set to the current date and time
-
“Scheduled Trip No.” field is populated
-
“Transport Unit ID” field is populated
-
-
All the trade items on the pallet will get the same fields changed.
Possible errors:
-
Pallet Barcode cannot be empty. -
Pallet with barcode <barcode> does not exist. -
Transport Unit ID cannot be 0. -
Transport Unit with ID <ID> not found. -
Status of Transport Unit <ID> is <Status>, loading a pallet is not allowed.(when the transport unit status is Cancelled, InTransport or TransportCompleted) -
Pallet <Pallet No.> is already loaded to Transport Unit <ID>. -
Pallet <Pallet No.> is not reserved to any agreement, it cannot be loaded.
Behaviour notes:
-
A barcode with 18 or 19 characters is padded with leading zeros to 20 characters before the pallet is looked up.
-
The pallet is looked up by its barcode, but the messages show the Pallet No. of the pallet.
-
The trade items on the pallet are marked as loaded both in the open trade items and in the trade item ledger entries.
-
The checks for transport unit ID 0, a transport unit that is not found and a wrong status are done in the common backend procedure. Through this endpoint they are normally not reached, as the procedure is called on an existing transport unit with status
Open..ReadyForTransport. -
This is exactly the same functionality as pallets(x).loadToTransportUnit, see API - Pallets.
Unload a Pallet
To unload a pallet from the transport unit.
POST
.../transportUnits([record-id])/Microsoft.NAV.unloadPallet
Body:
{
"palletBarcode": "00200100000000148347"
}
|
Parameters |
Type |
Max Len |
Description |
|
|---|---|---|---|---|
|
|
string |
20 |
The pallet barcode, as it is in BC. |
mandatory |
If successful, the response is: Pallet <Pallet No.> successfully unloaded from Transport Unit <ID>.
The database modifications when this is run successfully:
-
On the Pallet
-
Loaded = false
-
“Loading Date-Time” is cleared
-
“Scheduled Trip No.” is cleared
-
“Transport Unit ID” is cleared
-
-
All the trade items on the pallet will get the same fields changed.
Possible errors:
-
Pallet Barcode cannot be empty. -
Pallet with barcode <barcode> does not exist. -
Transport Unit ID cannot be 0. -
Transport Unit with ID <ID> not found. -
Status of Transport Unit <ID> is <Status>, unloading a pallet is not allowed.(when the transport unit status is Cancelled, InTransport or TransportCompleted) -
Pallet <Pallet No.> is not loaded to Transport Unit <ID>.(also when the pallet is loaded to another transport unit)
Behaviour notes:
-
A barcode with 18 or 19 characters is padded with leading zeros to 20 characters before the pallet is looked up.
-
The pallet keeps its reservation to the agreement, only the loading information is cleared.
-
This is exactly the same functionality as pallets(x).unloadFromTransportUnit, see API - Pallets.
Shipping
Update shipping information
The method updateShippingInfo is used to make a transport unit ready for shipping, i.e. at least when it is a container that needs a Container No. and a Seal No..
POST
.../transportUnits([record-id])/Microsoft.NAV.updateShippingInfo
Body - example:
{
"setContainerNo": "CONT-NO-123",
"setSealNo": "332222",
"setTareWeight": 25
}
|
Parameters |
Type |
Max Len |
Description |
|
|---|---|---|---|---|
|
|
string |
20 |
The value to put in field Container No. |
optional |
|
|
string |
20 |
The value to put in field Seal No. |
optional |
|
|
number |
|
The value to put in field Tare Weight. If not needed, it can be set as zero. |
optional |
If successful, the response is: Transport unit shipping information updated successfully. followed by Container No: <setContainerNo>, Seal No: <setSealNo> and Tare Weight: <setTareWeight> for the parameters that are not empty or zero.
The database modifications when this is run successfully:
-
The transport unit gets the 3 fields updated, as given by the parameters.
-
It also gets Status changed to Ready for Transport
Possible errors:
-
The procedure has no own error messages. Errors raised by Business Central when the transport unit is modified (the table’s modify trigger is run) are returned as they are.
Behaviour notes:
-
A parameter that is empty (or zero for
setTareWeight) does not change the field. Therefore a field cannot be cleared, and the tare weight cannot be set to zero, with this procedure. -
The values are assigned directly to the fields, without field validation. Container No. and Seal No. are code fields and are stored in upper case, but the response message shows the values as they were sent.
-
The status is changed to
ReadyForTransportevery time the procedure is run, also when all parameters are empty.
Deprecated
Deprecated Load Procedure
The procedure loadToTransportUnit had a wrong name and will be removed. It does not load the pallet, it always returns an error. Use loadPallet instead.
POST
.../transportUnits([record-id])/Microsoft.NAV.loadToTransportUnit
Body:
{
"palletBarcode": "00200100000000148347"
}
|
Parameters |
Type |
Max Len |
Description |
|
|---|---|---|---|---|
|
|
string |
20 |
Not used. |
optional |
Possible errors:
-
This API is deprecated, please use the loadPallet API instead.(always)
Examples
Reading Examples
Get a list of transport units
Get a list of all released transport units.
GET .../transportUnits?$filter=status eq 'Released'
Get all transport units in a specific trip:
GET .../transportUnits?$filter=tripNo eq 'TRIP-01'
Get a list of the transport units for a specific trip, but only show selected fields:
GET .../transportUnits?$select=id,description,containerNo,vehicleType,status&$filter=tripNo eq 'TRIP-01'
Response:
{
"@odata.context": "https://containers.wisefish.com/BC/api/wisefish/base/v1.0/$metadata#companies(0c28f579-28b9-f011-af5f-6045bdacc160)/transportUnits",
"value": [
{
"@odata.etag": "W/\"JzIwOzE2ODE4ODEwMzg2NjAwMzkzODA0MTswMDsn\"",
"id": 1,
"containerNo": "CONT-001",
"description": "DHL TR111 CONT-001",
"vehicleType": "Truck",
"status": "Released"
},
{
"@odata.etag": "W/\"JzE5OzQxMTQ3NzA3ODIyNTU1OTY1NDkxOzAwOyc=\"",
"id": 3,
"containerNo": "",
"description": "DHL ABA23",
"vehicleType": "Truck",
"status": "Released"
}
]
}
Details of a transport unit, showing sales info
Get the details of a selected transport unit number 1, also with the pallets and sales agreements which have been assigned to it:
GET .../transportUnits(1)?$expand=pallets,salesAgreements
Read a transport unit with its pallets
Reads transport unit 354 with the pallets loaded to it, using $expand=pallets (the pallet properties are shortened here, see API - Pallets).
Request:
GET .../transportUnits(354)?$expand=pallets
Response:
{
"@odata.context": "https://containers.wisefish.com/BC/api/wisefish/base/v1.0/$metadata#companies(0c28f579-28b9-f011-af5f-6045bdacc160)/transportUnits(pallets())/$entity",
"@odata.etag": "W/\"JzIwOzE0NTU2Nzg5MDEyMzQ1Njc4OTAxOzAwOyc=\"",
"systemId": "5a1c2e7d-8b3f-f111-b02e-cfedda509304",
"id": 354,
"containerNo": "CONT-354",
"tripNo": "TRIP-01",
"referenceNo": "",
"description": "Lagarfoss CONT-354",
"shipperDescription": "Ship EIM LAG",
"vehicleName": "Lagarfoss",
"vehicleType": "Ship",
"status": "InLoading",
"containerType": "40_Reefer",
"sealNo": "",
"locationCode": "MAIN",
"placeOfLoading": "ISREY",
"placeOfDelivery": "NLRTM",
"placeOfDestination": "NLRTM",
"departureDateScheduled": "2026-10-24",
"departureTimeScheduled": "18:00:00",
"arrivalDateScheduled": "2026-10-28",
"arrivalTimeScheduled": "08:00:00",
"arrivalDateTimeScheduled": "2026-10-28T08:00:00Z",
"temperatureDescription": "Frozen, -18 °C",
"reservedPallets": 1,
"reservedWeight": 960,
"reservedTradeItems": 48,
"deliveryAgreementNo": "",
"tareWeight": 0,
"systemRowVersion": 8823,
"lastModified": "2026-10-21T10:15:42.117Z",
"modifiedByUser": "BJARTEY",
"pallets": [
{
"@odata.etag": "W/\"JzE5OzEyMzQ1Njc4OTAxMjM0NTY3ODkwOzAwOyc=\"",
"barcode": "00000111122223333600",
"palletNo": "000000000110",
"transportUnitId": 354,
"loaded": true,
...
}
]
}
Read the sales agreement lines of a transport unit
Reads the delivery agreement lines that are allocated on line level to transport unit 354.
Request:
GET .../transportUnits(354)?$select=id,description&$expand=salesAgreementLines
Create and change transport units
Create a transport unit
Creates a new transport unit on trip TRIP-01. The id is assigned automatically.
Request:
POST .../transportUnits
Body:
{
"tripNo": "TRIP-01",
"vehicleType": "Ship",
"vehicleName": "Lagarfoss",
"containerType": "40_Reefer",
"locationCode": "MAIN",
"departureDateScheduled": "2026-10-24",
"departureTimeScheduled": "18:00:00"
}
Response:
{
"@odata.context": "https://containers.wisefish.com/BC/api/wisefish/base/v1.0/$metadata#companies(0c28f579-28b9-f011-af5f-6045bdacc160)/transportUnits/$entity",
"@odata.etag": "W/\"JzE5OzU1NjY3Nzg4OTkwMDExMjIzMzQ0OzAwOyc=\"",
"systemId": "7e2d4f10-9c3a-f111-b02e-cfedda509304",
"id": 355,
"containerNo": "",
"tripNo": "TRIP-01",
"referenceNo": "",
"description": "Lagarfoss",
"shipperDescription": "Ship ",
"vehicleName": "Lagarfoss",
"vehicleType": "Ship",
"status": "Open",
"containerType": "40_Reefer",
"sealNo": "",
"locationCode": "MAIN",
"placeOfLoading": "",
"placeOfDelivery": "",
"placeOfDestination": "",
"departureDateScheduled": "2026-10-24",
"departureTimeScheduled": "18:00:00",
"arrivalDateScheduled": "0001-01-01",
"arrivalTimeScheduled": "00:00:00",
"arrivalDateTimeScheduled": "0001-01-01T00:00:00Z",
"temperatureDescription": "",
"reservedPallets": 0,
"reservedWeight": 0,
"reservedTradeItems": 0,
"deliveryAgreementNo": "",
"tareWeight": 0,
"systemRowVersion": 9001,
"lastModified": "2026-10-21T11:02:10.530Z",
"modifiedByUser": "BJARTEY"
}
Change the departure of a transport unit
Changes the scheduled departure of transport unit 355. The If-Match header must contain the @odata.etag of the record (or *).
Request:
PATCH .../transportUnits(355)
If-Match: W/"JzE5OzU1NjY3Nzg4OTkwMDExMjIzMzQ0OzAwOyc="
Body:
{
"departureDateScheduled": "2026-10-25",
"departureTimeScheduled": "06:00:00"
}
Response:
{
"@odata.context": "https://containers.wisefish.com/BC/api/wisefish/base/v1.0/$metadata#companies(0c28f579-28b9-f011-af5f-6045bdacc160)/transportUnits/$entity",
"@odata.etag": "W/\"JzE5OzY2Nzc4ODk5MDAxMTIyMzM0NDU1OzAwOyc=\"",
"id": 355,
...
"departureDateScheduled": "2026-10-25",
"departureTimeScheduled": "06:00:00",
...
}
Load and unload pallets
Load a pallet to transport unit 354
Loads pallet 000000000110 (barcode 0000111122223333600, padded to 00000111122223333600) to transport unit 354 using loadPallet.
Request:
POST
.../transportUnits(354)/Microsoft.NAV.loadPallet
Body:
{
"palletBarcode": "0000111122223333600"
}
Response:
{
"@odata.context": "https://containers.wisefish.com/BC/api/wisefish/base/v1.0/$metadata#Edm.String",
"value": "Pallet 000000000110 successfully loaded to Transport Unit 354."
}
Loading a pallet that is not reserved
Tries to load pallet 000000000110 to transport unit 354 when the pallet is not reserved to an agreement.
Request:
POST
.../transportUnits(354)/Microsoft.NAV.loadPallet
Body:
{
"palletBarcode": "0000111122223333600"
}
Response:
{
"error": {
"code": "Application_DialogException",
"message": "Pallet 000000000110 is not reserved to any agreement, it cannot be loaded. CorrelationId: 3f6a2b1c-0d4e-4f5a-9b8c-7d6e5f4a3b2c."
}
}
Unload a pallet from transport unit 354
Unloads pallet 000000000110 from transport unit 354 using unloadPallet.
Request:
POST
.../transportUnits(354)/Microsoft.NAV.unloadPallet
Body:
{
"palletBarcode": "0000111122223333600"
}
Response:
{
"@odata.context": "https://containers.wisefish.com/BC/api/wisefish/base/v1.0/$metadata#Edm.String",
"value": "Pallet 000000000110 successfully unloaded from Transport Unit 354."
}
Make a transport unit ready for transport
Set container no., seal no. and tare weight
Sets the shipping information of transport unit 354 using updateShippingInfo, which also changes the status to ReadyForTransport.
Request:
POST
.../transportUnits(354)/Microsoft.NAV.updateShippingInfo
Body:
{
"setContainerNo": "CONT-NO-123",
"setSealNo": "332222",
"setTareWeight": 25
}
Response:
{
"@odata.context": "https://containers.wisefish.com/BC/api/wisefish/base/v1.0/$metadata#Edm.String",
"value": "Transport unit shipping information updated successfully. Container No: CONT-NO-123 Seal No: 332222 Tare Weight: 25"
}
Set only the seal no.
Sets only the seal number of transport unit 354. The other fields are not changed.
Request:
POST
.../transportUnits(354)/Microsoft.NAV.updateShippingInfo
Body:
{
"setContainerNo": "",
"setSealNo": "332223",
"setTareWeight": 0
}
Response:
{
"@odata.context": "https://containers.wisefish.com/BC/api/wisefish/base/v1.0/$metadata#Edm.String",
"value": "Transport unit shipping information updated successfully. Seal No: 332223"
}
Deprecated procedure
Calling loadToTransportUnit
The deprecated procedure always returns an error.
Request:
POST
.../transportUnits(354)/Microsoft.NAV.loadToTransportUnit
Body:
{
"palletBarcode": "0000111122223333600"
}
Response:
{
"error": {
"code": "Application_DialogException",
"message": "This API is deprecated, please use the loadPallet API instead. CorrelationId: 8b1d2c3e-4f5a-4b6c-8d7e-9f0a1b2c3d4e."
}
}