holds_at_pod_terminal and fees_at_pod_terminal. This guide shows you how to use them.
pod_terminal for historical reasons, but these fields report hold and fee data regardless of whether the container is at a port terminal or an inland rail destination. The same readiness logic applies in both scenarios.Determine if a container is ready for pickup
The most common question is straightforward: can I pick up this container? You need two fields from the container’sattributes to answer it:
available_for_pickup— a boolean the terminal sets when the container is cleared for releaseholds_at_pod_terminal— an array of active holds blocking pickup
available_for_pickup is true and there are no active holds:
Where to find holds and fees
Both fields live on the container’sattributes object in the V2 API:
holds_at_pod_terminal— active holds blocking or flagging pickupfees_at_pod_terminal— fees assessed at the terminal
GET /v2/containers/{id}
[]) means there are no active holds or fees of that type.
Hold types at a glance
Each item inholds_at_pod_terminal is a terminal_hold object:
| Field | Type | Description |
|---|---|---|
name | string | The canonical hold type (see table below) |
status | string | "hold" or "pending" |
description | string | null | Raw text from the terminal, if provided |
"released" status — an empty array means no active holds.
| Hold name | Description | Who resolves it |
|---|---|---|
freight | Carrier freight charges unpaid | Shipping line or freight forwarder |
customs | CBP hold — docs, exam, or inspection | Licensed customs broker |
USDA | USDA phytosanitary inspection | Customs broker or USDA compliance team |
VACIS | Non-intrusive X-ray / gamma-ray scan | Customs broker |
TMF | Terminal management fee (pier pass) | Pay terminal directly |
other | Unmapped hold — check description | Terminal or broker |
USDA, VACIS, and TMF are uppercase. freight, customs, and other are lowercase. Match values exactly in your code.freight — Carrier freight charges unpaid
freight — Carrier freight charges unpaid
customs — CBP hold
customs — CBP hold
USDA — Phytosanitary inspection
USDA — Phytosanitary inspection
VACIS — Non-intrusive scan
VACIS — Non-intrusive scan
fees_at_pod_terminal as type "exam".TMF — Terminal management fee
TMF — Terminal management fee
other — Unmapped hold type
other — Unmapped hold type
description field.description to identify the specific issue and contact the terminal or your broker for resolution.status of "pending" means the terminal has flagged a hold as expected but not yet active. Treat it as a warning that a hold is likely incoming. When the hold becomes active, the status changes to "hold" and you receive a container.updated webhook notification.Fee types at a glance
Each item infees_at_pod_terminal is a terminal_fee object:
| Field | Type | Description |
|---|---|---|
type | string | The canonical fee type (see table below) |
amount | number | Fee amount in local currency |
currency_code | string | ISO 4217 currency code, typically "USD" |
| Fee type | Description | Charged by |
|---|---|---|
demurrage | Daily charge after carrier free time expires | Ocean carrier |
extended_dwell_time | Terminal charge for prolonged dwell | Terminal |
exam | CBP/USDA inspection cost | Terminal or exam facility |
total | Combined total of all fees (may overlap with line items) | See individual items |
other | Unmapped fee type | Varies |
demurrage — Daily carrier charge
demurrage — Daily carrier charge
extended_dwell_time — Terminal dwell charge
extended_dwell_time — Terminal dwell charge
exam — Inspection cost
exam — Inspection cost
total — Combined fee total
total — Combined fee total
total fee in the array alongside individual line items, filter it out when summing to avoid double-counting.other — Unmapped fee type
other — Unmapped fee type
Full example: container with multiple holds and fees
customs and freight) and two fees. Both holds must be resolved before the container can be released. The demurrage fee will continue increasing daily until the container is picked up.
Getting notified when holds or fees change
Subscribe to thecontainer.updated webhook to run your release-readiness check in real time whenever holds or fees change. The changeset on the container_updated_event shows the old value and new value side by side — old first, new second.
For full details on setting up webhooks, see Webhooks.
- Hold placed
- Hold cleared
- Pending → Active
- Fee updated
Edge cases
- Empty arrays mean no holds or fees. An empty
holds_at_pod_terminal: []orfees_at_pod_terminal: []is the normal state for most containers. Do not treat it as missing data or an error.
0 is valid. A fee amount of 0 means the terminal reported the fee type but has not yet calculated or posted the dollar amount. This is common for demurrage in the first day or two after discharge. Poll the container or wait for the next container.updated event.description field is raw terminal text. The description on hold objects is unstructured text scraped directly from the terminal. It is useful context for humans but should not be used for programmatic decision-making. Use the name field to drive automation logic.Frequently asked questions
How do I know when a container is ready for pickup?
How do I know when a container is ready for pickup?
available_for_pickup must be true and the holds_at_pod_terminal array must have no items with status: "hold". See the decision logic and code example above.Can a container have holds and fees at the same time?
Can a container have holds and fees at the same time?
What happens when a hold is cleared?
What happens when a hold is cleared?
holds_at_pod_terminal array entirely. There is no "released" status — an empty array means no active holds. You receive a container.updated webhook when this happens.Why does available_for_pickup say false when there are no holds?
Why does available_for_pickup say false when there are no holds?
available_for_pickup, or vice versa. Wait for the next container.updated webhook or poll the container again. Treat available_for_pickup: true with an empty holds array as the definitive readiness signal.Do holds and fees apply at inland rail destinations?
Do holds and fees apply at inland rail destinations?
holds_at_pod_terminal and fees_at_pod_terminal fields report data regardless of whether the container is at a port terminal or an inland rail destination. The field names reference pod_terminal for historical reasons, but the same readiness logic applies in both scenarios.How do I calculate total fees without double-counting?
How do I calculate total fees without double-counting?
total fee alongside individual line items. Filter it out before summing: