Upstream API FAQ
The questions that come up most often when building against the v3 Upstream API. For the endpoint reference itself, see Upstream.
Polling and the since parameterβ
How do I use since?β
Pass it as a query parameter on the GET request:
GET /v3/upstream?since=2026-06-06T14:30:00Z
Several date formats are accepted, but ISO 8601 with an explicit timezone is the recommended form. It removes any ambiguity about how a bare date is interpreted.
since and cursor work together rather than as alternatives. Page through with both until
next_cursor comes back null, then store the highest metadata.last_updated you saw as the
starting point for the next run.
Why did a tradeflow come back that had not changed?β
A tradeflow can be touched by data that is not reflected in the message you receive. The clearest example is data arriving for the container's next journey: something changed on the record, so the timestamp moves, but the content of the message for your shipment is the same.
This is confusing rather than harmful, and these cases are filtered out where they can be identified.
I am receiving duplicate messages where only last_updated differsβ
Same root cause as above. If you are deduplicating on your side, compare the payload rather than the timestamp.
Active and deactivated tradeflowsβ
Do you send is_active: false?β
Yes.
The default behaviour without the active parameter is to return active tradeflows plus
recently deactivated ones, within a 7 day window. After that window they drop off entirely.
With active=true set explicitly, only strictly active tradeflows are returned.
If your polling interval is longer than the deactivation window, you can miss the deactivation
entirely. A tradeflow deactivated the day after your last poll will simply be absent from the next
one, with no is_active: false message ever observed.
For an ERP replication that needs to mirror deactivations, poll inside the window.
Vessel and voyageβ
Where is the vessel in the payload?β
In the shipment element, in two places:
shipment.current_vessel - the current vessel with its identifiers:
{
"current_vessel": {
"name": "MAERSK SOPHIE",
"imo": "9721234",
"mmsi": "219028000"
}
}
shipment.shipment_legs - the per-leg detail, which is where you look when a journey has more
than one vessel.
Cargo opening and cut-offsβ
Where do I find yard opening and closing times?β
They are separate fields with separate origins:
| Field | Contains | Source |
|---|---|---|
cargo_opening | Yard opening | Terminal data |
cutoffs[] | Yard closing, VGM, shipping instructions, dangerous goods, customs, out of gauge | The carrier |
Cut-offs are populated on the export leg at the port of loading. Coverage depends on the carrier and the port publishing them.
Ingestion and pausesβ
Why has the feed stopped for one tradeflow?β
Check whether the tradeflow carries a data anomaly. When one is detected, outbound messages for that tradeflow are paused rather than sent, and the tradeflow is flagged.
The pause is deliberate: it stops a tradeflow that is known to be inconsistent from propagating into your system. A typical trigger is containers on the file that the carrier does not associate with the booking.
Resolve the anomaly and the feed resumes. See anomaly classification.
Sending data inβ
customer_name created a party I did not expectβ
Send the customer once. If you pass the customer in customer_name and again as a partner with
a role, you create a second party from the same company, and it appears as a separate entity.
Check that customer_name holds the company and not the contact person. A contact name in that
field creates an entity named after the individual.
An order was accepted but did not appearβ
A 202 response means the message was accepted for processing, not that the tradeflow exists yet. Processing is asynchronous and normally quick.
If it does not appear at all, confirm that tradeflow_reference was set on the request. Support
can check the inbound logs for your reference and confirm whether the call arrived.
Errorsβ
I am getting 403 responses intermittentlyβ
Send the timestamps of the failures. Intermittent 403s on an otherwise working token are investigated from the request logs rather than from the token itself.
I am getting 504 on the upstream endpointβ
Timeouts on upstream have been traced to load peaks when large numbers of vessel schedule changes land at once. If you see them clustered in a window rather than spread out, include the window when reporting.