Inside Schengen, a border is a road sign. You cross it at motorway speed and your ETA never notices. Twenty years of that has trained every routing engine, every TMS, and every dispatcher’s intuition to treat a European frontier as a rounding error.
Then a load runs to the EU’s external frontier, and the rounding error becomes the trip.
On the morning of 16 July 2026, the loaded-truck queue at Yahodyn–Dorohusk — the main Ukraine–Poland freight crossing — was reporting a wait of 5,964 minutes. That is four days and three hours, with 1,006 trucks physically in the queue. The queue for empty trucks at the same crossing was worse: 6,555 minutes, or four days and thirteen hours, with 1,334 trucks waiting.
No amount of clever road-network routing tells you that. It isn’t a traffic condition, it isn’t congestion, and it will not resolve in twenty minutes. It is a queue with a length, and the only way to know about it is to read the queue.
Why “Average Border Wait” Is a Useless Number
The instinct is to reach for an average and pad the ETA. The live data says don’t bother.
Across the 38 truck checkpoints on Ukraine’s EU-facing frontier that morning, the distribution wasn’t a bell curve. It was two clusters and nothing in between: 21 checkpoints reported a wait of exactly zero, and the rest ran from about ten hours to four and a half days. There was essentially no middle.
That shape is the whole planning problem. A border crossing is either flowing — in which case it costs you nothing and needs no padding — or it is a multi-day parking lot. An average across those two states describes no crossing that actually exists, and a fixed buffer is either wasted margin or nowhere near enough. The only useful question is binary and current: is this specific crossing, for this kind of truck, moving right now?
The Queue Is Published. It Just Isn’t in Your Stack.
Ukraine runs an electronic queue system for border crossings — єЧерга (eCherha) — operated by the State Customs Service. Trucks book and hold a place in it, and it publishes the live state of every checkpoint: how long the queue is taking, and how many vehicles are in it. The underlying dataset is open data, published under CC BY 4.0.
NAPSPAN normalizes it into the same border_crossings feature type that carries the CBP and CBSA land-border waits on the North American side, so it answers to the same /features call as everything else:
curl -H "X-API-Key: $KEY" \
"https://api.napspan.com/api/v1/features?type=border_crossings&jurisdiction=UKR"
{
"data": [
{
"id": "echerga-truck-1",
"source": "UKR",
"jurisdiction": "UKR",
"feature_type": "border_crossings",
"name": "Ягодин – Дорогуськ (для вантажівок ≥ 7,5 тонн)",
"latitude": 51.1880897,
"longitude": 23.8105033,
"is_active": true,
"properties": {
"source_feed": "echerga",
"vehicle_type": "truck",
"queue_type": "dynamic",
"wait_time_minutes": 5964,
"vehicles_in_queue": 1006,
"neighbor_country": "Польща",
"is_paused": false
},
"last_updated": "2026-07-16T09:40:00Z"
}
],
"total": 68, "limit": 100, "offset": 0, "has_more": false
}
The whole frontier is in there. That call returns 68 queues facing five neighbours — Poland, Slovakia, Hungary, Romania, and Moldova — each with a live wait and a live queue depth, refreshed on a ten-minute poll. 38 of them are truck queues; the rest are the coach queues the same system publishes. vehicle_type tells them apart, and it’s the field to filter on — a coach queue says nothing about your freight lane.
The Part That Changes Dispatch: It Rides the Route
Querying the frontier by jurisdiction is the manual path. The one that changes a dispatcher’s day is that the queue comes back attached to the route. Send a normal truck routing request to POST /api/v1/routing/route, and any border crossing on the corridor arrives in the warnings[] channel — no second call, no spatial join on your side:
{
"warnings": [
{
"type": "border_crossing",
"severity": "critical",
"title": "Ягодин – Дорогуськ (для вантажівок ≥ 7,5 тонн)",
"description": "Commercial border wait ~4 d 3 h. 1006 trucks in queue.",
"status": "open",
"as_of": "2026-07-16T09:40:00Z",
"distance_along_route_m": 288000,
"projected_arrival_time": "2026-07-16T14:05:00Z",
"source": "UKR",
"source_id": "1",
"geometry": { "type": "Point", "coordinates": [23.8105033, 51.1880897] },
"properties": {
"commercial_wait_minutes": 5964,
"vehicles_in_queue": 1006
}
}
]
}
A few deliberate choices in that object are worth calling out, because they are what make it usable rather than merely present:
- The wait reads like a wait.
descriptionrenders as4 d 3 h, not~5964 min. Nobody can act on 5,964 minutes. The machine-readablecommercial_wait_minutesstays in minutes so your own thresholds keep working — the humanising is presentation, not data loss. - Queue depth comes with it.
vehicles_in_queueis the figure that makes the wait concrete. “Four days” is abstract; “a thousand trucks are in front of you” is a decision. - Severity is banded for a truck.
infounder 15 minutes,warningfrom 15,criticalpast 45 or whenever the crossing is closed. Setmin_severity: "warning"and a flowing border stays silent while a jammed one shouts. - Only the truck queue counts. The feed publishes each checkpoint once per vehicle type. A ninety-minute coach queue at the same crossing never bands your freight route — we key severity on the truck queue alone.
- You get the crossing before the driver does.
distance_along_route_mandprojected_arrival_timeplace it on the corridor, so this is a decision made at dispatch — reroute to a quieter checkpoint, re-sequence the load, warn the customer — not a surprise found at hour ninety.
It rides the same request as the corridor’s truck restrictions and VMS signs, its toll costs, and 561/2006 break planning. One call returns a drivable truck route, the rules that would stop it, where the driver must legally rest, what it costs — and now how long the frontier will hold it.
What to Expect From the Data
A few honest notes, so the coverage behaves the way you expect:
- This is the external frontier, not every EU border. Intra-Schengen crossings do not queue, so there is nothing to report and no warning to give. The live queue layer covers Ukraine’s EU-facing checkpoints, which is where the EU’s freight border problem actually lives. Other external frontiers do not yet have an equivalent live feed wired — we will say so plainly rather than pad the map.
- One physical crossing publishes several queues. Yahodyn–Dorohusk reports loaded trucks, empty trucks, and certain cargo categories as separate rows at the same coordinates, and they diverge — on 16 July the empty-truck queue ran ten hours longer than the loaded one. Read the checkpoint name; don’t assume one number per border post.
- Paused checkpoints drop out. When the operator suspends a queue, the feed flags it and we mark the crossing inactive, so it stops generating warnings rather than reporting a stale wait as live. Ten of the 38 were paused that morning.
- Some checkpoints are scheduled, not live. Where a checkpoint runs on booked slots instead of a live queue, there is no wait to report — it stays
infoand we publish no invented number. - It’s a planning input. The queue is authoritative about the queue. It is not a promise about customs, paperwork, or what the officer at the window decides.
The Common Thread
This is the same shape as the five road-data problems every cross-border European fleet hits: the information exists, a public authority publishes it, and it is in a national format that nobody’s routing stack speaks. Solving that once per country is a permanent maintenance commitment that competes with the product you actually sell.
NAPSPAN does that aggregation once. The Ukrainian electronic queue arrives in the same border_crossings schema as a US CBP lane wait, filterable by jurisdiction, attached to your route on the same request as the tolls and the rest breaks, served from Europe, and licence-classified before it ships — this feed under CC BY 4.0, credited on every record.
Try It
- API docs —
/featureswithtype=border_crossings, plusPOST /routing/route - Live map — the frontier, as it stands right now
- Free API key — no card, 14-day trial
Find the four-day queue at dispatch, not at hour ninety
Live electronic-queue waits and queue depth for every truck checkpoint on the EU’s Ukrainian frontier — normalized into one schema and surfaced automatically on your route. Free 14-day trial. No card.
Get Free API Key Read the Docs