API - Transport Units


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

transportUnits

Source table

WiFi Transport Unit

Fixed view

Filter on Status = Open .. ReadyForTransport

Requests allowed

GET, POST, PATCH

Primary key

ID

Record ID

id

Child Objects

Available with $expand

pallets, salesAgreements, salesAgreementLines

Procedures

loadPallet, unloadPallet, updateShippingInfo

loadToTransportUnit (deprecated)


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 scheduledTrips(id).transportUnits to get the array of all the transport units of the trip.

Get transportUnits(id).tripNo to see which trip a transport unit is assigned to.

Each sales agreement is assigned to only one scheduled trip

Get salesAgreements(id).scheduledTripNo to see which trip the sales agreement is assigned to.

Get scheduledTrips(id).salesAgreements to get the array of all the sales agreements in a particular trip.

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 salesAgreements(id).transportUnitId to see which transport unit the sales agreement is assigned to.

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 salesAgreementLines(id).transportUnitId

Each transport unit can therefore contain items for multiple sales agreements.

Get transportUnits(id).salesAgreements to get the array of all the sales agreement headers assigned to that particular transport unit.

Get transportUnits(id).salesAgreementLines to get the array of all the sales agreement lines assigned to that particular transport unit.


Data

Field List

Property

Type

Format

Description


1

systemId

string

uuid

SystemId

non-editable

2

id

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

containerNo

string

max 20

Container No.

optional

4

tripNo

string

max 20

This is the Scheduled Trip which the transport unit belongs to.

optional

5

referenceNo

string

max 20

Reference No.

optional

6

description

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

shipperDescription

string

max 70

String combined of "Vehicle Type" + "Shipping Agent Code" + "Vehicle Code"

non-editable

8

vehicleName

string

max 50

Vehicle Name

optional

9

vehicleType

string

enum

Options: " ",Truck,Trailer,Airline,Railway,Ship,Unknown

optional

10

status

string

enum

Options: Open,Released,InLoading,ReadyForTransport,InTransport,TransportCompleted,Cancelled

The status is not editable directly. Procedure updateShippingInfo sets it to ReadyForTransport.

non-editable

11

containerType

string

enum

OptionMembers = " ","40_Reefer","40_Dry","20_Reefer","20_Dry","45_Reefer","45_Dry";

optional

12

sealNo

string

max 20

Seal number

optional

13

locationCode

string

max 10

Location

optional

14

placeOfLoading

string

max 10

Place of Loading

optional

15

placeOfDelivery

string

max 10

Place of Delivery

optional

16

placeOfDestination

string

max 10

Place of Destination

optional

17

departureDateScheduled

string

date

Departure Date (Scheduled)

optional

18

departureTimeScheduled

string

time

Departure Time (Scheduled)

optional

19

arrivalDateScheduled

string

date

Arrival date

optional

20

arrivalTimeScheduled

string

time

Arrival time

optional

21

arrivalDateTimeScheduled

string

date-time

Arrival date and time

non-editable

22

temperatureDescription

string

max 100

Temperature Description

non-editable

23

reservedPallets

number

integer

The number of pallets that have this transport unit id in field “Transport Unit ID”

non-editable

24

reservedWeight

number

decimal

The total weight of the trade items on the reserved pallets.

non-editable

25

reservedTradeItems

number

decimal

The total number of trade items on the reserved pallets.

non-editable

26

deliveryAgreementNo

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

tareWeight

number

decimal

Tare Weight

optional

28

pallets

array


List of the pallets, only visible by using $expand

The pallets that have this transport unit in field “Transport Unit ID”.


29

salesAgreements

array


List of the sales agreements (delivery agreements), only visible by using $expand


30

salesAgreementLines

array


List of the sales agreement lines (delivery agreement lines) allocated to the transport unit on line level, only visible by using $expand


31

systemRowVersion

integer


System row version. Increments every time the record is modified.

non-editable

32

lastModified

string

date-time

SystemModifiedAt (date and time of last change)

non-editable

33

modifiedByUser

string


The user who last modified the record.

non-editable


Object Example

JSON
{
    "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

loadPallet

palletBarcode (code, max 20)

Load a pallet, identified by its barcode, to the transport unit. The pallet must be reserved to an agreement.

Show more

unloadPallet

palletBarcode (code, max 20)

Unload a pallet, identified by its barcode, from the transport unit. The pallet must be loaded to this transport unit.

Show more

updateShippingInfo

setContainerNo (text, max 20), setSealNo (text, max 20), setTareWeight (decimal)

Set the container no., seal no. and tare weight of the transport unit and change its status to ReadyForTransport.

Show more

loadToTransportUnit

palletBarcode (code, max 20)

Deprecated. Always returns an error, use loadPallet instead.

Show more


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.

JSON
POST
.../transportUnits([record-id])/Microsoft.NAV.loadPallet

Body:
{
    "palletBarcode": "00200100000000148347"
}

Parameters

Type

Max Len

Description


palletBarcode

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.

JSON
POST
.../transportUnits([record-id])/Microsoft.NAV.unloadPallet

Body:
{
    "palletBarcode": "00200100000000148347"
}

Parameters

Type

Max Len

Description


palletBarcode

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..

JSON
POST
.../transportUnits([record-id])/Microsoft.NAV.updateShippingInfo  

Body - example:
{
    "setContainerNo": "CONT-NO-123",
    "setSealNo": "332222",
    "setTareWeight": 25
}

Parameters

Type

Max Len

Description


setContainerNo

string

20

The value to put in field Container No.

optional

setSealNo

string

20

The value to put in field Seal No.

optional

setTareWeight

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 ReadyForTransport every 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.

JSON
POST
.../transportUnits([record-id])/Microsoft.NAV.loadToTransportUnit

Body:
{
    "palletBarcode": "00200100000000148347"
}

Parameters

Type

Max Len

Description


palletBarcode

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.

JSON
GET .../transportUnits?$filter=status eq 'Released'


Get all transport units in a specific trip:

JSON
GET .../transportUnits?$filter=tripNo eq 'TRIP-01'


Get a list of the transport units for a specific trip, but only show selected fields:

JSON
GET .../transportUnits?$select=id,description,containerNo,vehicleType,status&$filter=tripNo eq 'TRIP-01'

Response:

JSON
{
    "@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:

JSON
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:

JSON
GET .../transportUnits(354)?$expand=pallets

Response:

JSON
{
    "@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:

JSON
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:

JSON
POST .../transportUnits

Body:
{
    "tripNo": "TRIP-01",
    "vehicleType": "Ship",
    "vehicleName": "Lagarfoss",
    "containerType": "40_Reefer",
    "locationCode": "MAIN",
    "departureDateScheduled": "2026-10-24",
    "departureTimeScheduled": "18:00:00"
}

Response:

JSON
{
    "@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:

JSON
PATCH .../transportUnits(355)
If-Match: W/"JzE5OzU1NjY3Nzg4OTkwMDExMjIzMzQ0OzAwOyc="

Body:
{
    "departureDateScheduled": "2026-10-25",
    "departureTimeScheduled": "06:00:00"
}

Response:

JSON
{
    "@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:

JSON
POST
.../transportUnits(354)/Microsoft.NAV.loadPallet

Body:
{
    "palletBarcode": "0000111122223333600"
}

Response:

JSON
{
    "@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:

JSON
POST
.../transportUnits(354)/Microsoft.NAV.loadPallet

Body:
{
    "palletBarcode": "0000111122223333600"
}

Response:

JSON
{
    "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:

JSON
POST
.../transportUnits(354)/Microsoft.NAV.unloadPallet

Body:
{
    "palletBarcode": "0000111122223333600"
}

Response:

JSON
{
    "@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:

JSON
POST
.../transportUnits(354)/Microsoft.NAV.updateShippingInfo

Body:
{
    "setContainerNo": "CONT-NO-123",
    "setSealNo": "332222",
    "setTareWeight": 25
}

Response:

JSON
{
    "@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:

JSON
POST
.../transportUnits(354)/Microsoft.NAV.updateShippingInfo

Body:
{
    "setContainerNo": "",
    "setSealNo": "332223",
    "setTareWeight": 0
}

Response:

JSON
{
    "@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:

JSON
POST
.../transportUnits(354)/Microsoft.NAV.loadToTransportUnit

Body:
{
    "palletBarcode": "0000111122223333600"
}

Response:

JSON
{
    "error": {
        "code": "Application_DialogException",
        "message": "This API is deprecated, please use the loadPallet API instead.  CorrelationId:  8b1d2c3e-4f5a-4b6c-8d7e-9f0a1b2c3d4e."
    }
}