> ## Documentation Index
> Fetch the complete documentation index at: https://docs.landedfees.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Cost layers

> The CostLayer[] shape, statutory fees (HMF, MPF, broker, ISF, exam expected value), and why each layer stays separate.

## The shape

Every landed-cost response returns a `breakdown` array. Each entry is
a `CostLayer`:

```ts theme={null}
type CostLayer = {
  code: string;         // stable machine token, e.g. "SEC_301", "MPF"
  amount: number;       // dollars in the response currency
  rate: number | null;  // ad valorem rate as a decimal, null for flat fees
  exempted: boolean;    // true when the layer would apply but is waived
  note: string | null;  // optional human-readable annotation
};
```

The engine returns one entry per layer that touched the calculation,
whether it added dollars or zeroed out. Exempted layers (FTA
preferences, Section 301 exclusions) are included with
`exempted: true` and `amount: 0` so the audit trail shows *why* a
duty did not apply.

## Duty layers

Duty layers stack per statute. See [Tariff stacking](/concepts/tariff-stacking)
for the overlay families. Every duty layer's `amount` equals the
customs value times its `rate`, unless a specific-rate line
overrides. All calculations round to two decimal places on output.

## The statutory fees

The customs fees below are **not duties**. They ship as their own
`CostLayer` rows so downstream systems can categorize them
separately for accounting (typically a broker-payable expense
account, not landed cost of goods).

### MPF (Merchandise Processing Fee)

CBP fee under 19 CFR 24.23. 0.3464 percent of customs value, subject
to a per-entry minimum ($32.71) and maximum ($634.62), locked at
statutory values for FY 2026. Applies to formal entries only; not
charged on Section 321 de-minimis shipments.

### HMF (Harbor Maintenance Fee)

CBP fee under 19 CFR 24.24. 0.125 percent of customs value on
ocean-mode entries at HMF-collecting US ports. Not applied to air,
truck, rail, or express modes. Not applied when the response detects
a non-HMF port.

### ISF (Importer Security Filing)

Broker-billed fee for 10+2 filing on ocean imports. Returned as an
expected-value estimate (`amount` with `rate: null`) based on
typical broker rates. Actual charges are broker-specific.

### Broker fee

Estimated brokerage fee for the entry. Ranges by tier of complexity
(single-line vs multi-tariff, PGA-touched vs clean). Returned when
`transport_mode` is not `express`; express couriers embed the fee.

### Exam EV (exam expected value)

Probabilistic estimate of the cost of a CBP exam (X-ray, tailgate,
intensive). Weighted by the historical exam rate for the port plus
commodity plus origin combination and the average per-exam cost.
Returned as a single `EXAM_EV` line with `rate: null`. Not billed
unless the entry actually gets pulled; use it for accrual, not
invoicing.

### Destination-country taxes

VAT (EU), GST (AU, IN, CA), IGST plus BCD plus SWS plus AIDC (India),
ICMS plus PIS plus COFINS plus IPI (Brazil), and GST/HST provincial
splits (Canada) each ship as their own layers. Codes are `VAT`,
`GST`, `IGST`, `GST_HST`, `BCD`, `II`, `IPI`, `ICMS`, and so on. See
`CalcBreakdownLayer.code` in the [OpenAPI spec](/api-reference/openapi.yaml).

## Why the fees stay separate

Bundling MPF, HMF, broker, ISF, and exam EV into "fees" would hide
the entries an accounting team needs to reconcile. It would also
make it impossible to audit a specific fee against the underlying
statute. The engine returns each fee as its own row so:

* Accounting can post each expense to the correct GL account.
* The compliance team can trace an MPF or HMF line back to the CFR
  section that authorized it.
* A finance query like "how much did we spend on Section 301 last
  quarter?" is a straight `SUM(amount) WHERE code = 'SEC_301'`.

## Summing the total

```
total_landed_cost
  = customs_value              (goods + freight + insurance + dutiable adjustments)
  + SUM(duty layer amounts)
  + SUM(tax layer amounts)
  + SUM(fee layer amounts)
```

The top-level `duty_amount`, `taxes_amount`, and `fees_amount` in the
response are pre-summed for convenience. The `breakdown[]` array is
the source of truth.
