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:
"released" status β an empty array means no active holds.
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:
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:Related guides
Container statuses
available_for_pickup and current_status are derivedWebhooks
container.updated events