---
title: "Composite shipment summary"
method: POST
path: "/api/shipment/summary"
tags: ["Composite"]
---

# Composite shipment summary

`POST /api/shipment/summary`

## Request

- Base URL: `https://www.freightutils.com`
- URL: `https://www.freightutils.com/api/shipment/summary`
- Auth: none declared

Chains CBM, chargeable weight, LDM, ADR compliance, and UK duty estimation into one response. The flagship composite endpoint.

## Request body

- object
  - `mode` 'road' | 'air' | 'sea' | 'multimodal', required
  - `items` object[], required
    - `description` string
    - `length` number, required
    - `width` number, required
    - `height` number, required
    - `weight` number, required: Gross weight in kg PER ITEM (per piece) — multiplied by quantity.
    - `quantity` integer: Number of pieces: a whole number from 1 to 1,000,000, sent as a number. Omit it for 1; null, 0, fractions or text are a 400.
    - `stackable` boolean
    - `pallet_type` 'euro' | 'uk' | 'us' | 'custom' | 'none': Pallet standard the item sits on, if any (sets the pallet footprint for the road LDM).
    - `hs_code` string
    - `un_number` string
    - `customs_value` number: Customs value in GBP PER ITEM (per piece), 0 or more — multiplied by quantity for the line; the duty estimate uses the sum over all lines (echoed as customs.customsValueTotal). Left out, null or blank means none; a negative, NaN or infinite value is refused with 400 naming the item.
    - `adr_quantity` number: ADR 1.1.3.6.3 quantity for this dangerous-goods line — the TOTAL for the whole line, all pieces together, never per piece. Separate from weight (gross package mass). Supply it with adr_quantity_unit on every DG line and adrFlags.totalPoints is calculated.
    - `adr_quantity_unit` 'L' | 'kg': Dimension of adr_quantity. Checked against the dimension 1.1.3.6.3 counts for the row — a litres row given kilograms still withholds the total.
  - `origin` object
    - `country` string
    - `locode` string
  - `destination` object
    - `country` string
    - `locode` string
  - `incoterm` string
  - `freight_cost` number: Freight cost in GBP, 0 or more (added to the CIF value of the UK duty estimate). Left out, null or blank means 0. A negative, NaN or infinite value is refused with 400 naming the field.
  - `insurance_cost` number: Insurance cost in GBP, 0 or more (added to the CIF value of the UK duty estimate). Left out, null or blank means 0. A negative, NaN or infinite value is refused with 400 naming the field.

## Response `200`

Complete shipment summary

## Other responses

- `400`: Invalid input — e.g. a piece count that is not a whole number ≥ 1, an adr_quantity / adr_quantity_unit that is not a number > 0 / "L" or "kg", a cost that is negative or not a finite number, or a field the route does not read (refused by name, never ignored). The error names what arrived.
- `405`: Use POST

---

[API](https://skmtc.dev/freightutils/apis/freightutils-api.md) · [All operations](https://skmtc.dev/freightutils/apis/freightutils-api/llms.txt) · [OpenAPI document](https://skmtc.dev/freightutils/apis/freightutils-api/revisions/6607bb3cea90?raw)
