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. The carrier's own gate-open time (EFC) appears in
cutoffs[] and can differ from cargo_opening:
| Field | Contains | Source |
|---|---|---|
cargo_opening | Yard opening | Terminal data |
cutoffs[] | Yard closing, VGM, documentation, shipping instructions, dangerous goods, LCL delivery, customs, out of gauge, earliest full-container delivery (EFC), empty container pickup (ECP) | 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โ
Why has the feed gone quiet for one tradeflow?โ
The v3 feed does not pause for data anomalies: every change to a tradeflow is delivered, and
data_quality.anomalies is an indicative count you can use to filter on your side. If a
tradeflow has gone quiet, nothing about it has changed since your last poll. See
anomaly classification.
Sending data inโ
customer_name created a party I did not expectโ
Send the customer once, spelled the same way everywhere. Identical names resolve to the same
organisation, but if customer_name and a partner entry spell the company differently (for example
ACME and ACME NV), they become two separate parties.
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โ
What do the authentication errors mean?โ
| Status | Meaning |
|---|---|
400 | The token is not in the {env}_{organisation-slug}_{random} format. |
401 | The Authorization header is missing or malformed, or the token is not recognised. |
403 | The token has been revoked, or it is used on the wrong host (prod_โฆ on api.dockflow.com, uat_โฆ on uat.dockflow.com). |
See Authorization.