API Documentation
REST + JSON over HTTPS. One base URL, one key, predictable envelopes.
| Base URL | https://nakordoni.eu/api/v1/data/ |
|---|---|
| Format | JSON, UTF-8 |
| Auth | Authorization: Bearer NKD-DEV-… |
| Versioning | Path-versioned & per-endpoint: /api/v1/… is stable; /api/v2/… serves the newer behaviour only for endpoints that changed, and transparently falls back to v1 for the rest. v1 responses never change. |
On this page
Authentication
Every request needs your API key in the Authorization header (recommended) or as a ?key= parameter.
curl "https://nakordoni.eu/api/v1/data/queue?ppid=id_13" \ -H "Authorization: Bearer NKD-DEV-XXXX-XXXX-XXXX"
Response envelope
{
"ok": true,
"api_version": "v1",
"product": "queue",
"attribution": "Data by nakordoni.eu",
"data": { ... },
"usage": { "limit": 1000, "used": 42, "reset": "2026-06-06T00:00:00Z" }
}
Errors return ok:false with error.code (missing_api_key, invalid_api_key, qps_exceeded, quota_exceeded, unknown_product, product_unavailable, bad_request, internal_error) and HTTP status 401/403/404/429/500. Rate-limit headers X-Devapi-Limit and X-Devapi-Remaining are sent on every metered response.
Quotas
| Explorer | Pay As You Grow | |
|---|---|---|
| calls/day on standard data APIs | 1,000 | 50,000 |
| calls/day on forecast & statistics APIs | 200 | 10,000 |
| QPS | 2 | 20 |
Daily counters reset at midnight UTC. You get an email at 80% and 100% of quota.
Code samples
curl
curl "https://nakordoni.eu/api/v1/data/queue?ppid=id_13" \ -H "Authorization: Bearer $NKD_API_KEY"
JavaScript (fetch)
const res = await fetch('https://nakordoni.eu/api/v1/data/forecast?ppid=id_13&prediction_steps=24', {
headers: { Authorization: `Bearer ${process.env.NKD_API_KEY}` }
});
const { ok, data, error, usage } = await res.json();
if (!ok) throw new Error(error?.code ?? res.status);
console.log(`forecast points: ${data.length}, calls left today: ${usage.limit - usage.used}`);
Python (requests)
import os, requests
r = requests.get(
"https://nakordoni.eu/api/v1/data/stats",
params={"ppid": "id_15", "compare": 1},
headers={"Authorization": f"Bearer {os.environ['NKD_API_KEY']}"},
timeout=15,
)
payload = r.json()
print(payload["data"]["daily"], payload["usage"])
Excel (Power Query)
Pull live queue, forecast or truck-ban data straight into a workbook with Power Query's built-in JSON connector — no code, refreshable on a schedule. The same Headers pattern works for every product in this API; just change the URL.
Data → Get Data → From Other Sources → Blank Query, then Home → Advanced Editor and paste:
let
ApiKey = "NKD-DEV-XXXX-XXXX-XXXX",
Source = Json.Document(Web.Contents("https://nakordoni.eu/api/v1/data/queue",
[Query = [ppid = "id_13"], Headers = [Authorization = "Bearer " & ApiKey]])),
data = Source[data],
AsTable = Record.ToTable(data)
in
AsTable
Keep the API key inside the M query (Home → Advanced Editor), not in a worksheet cell — Power Query blocks a web request built from another query or cell ("Formula.Firewall") unless its privacy level is set to Organizational.
Multiple checkpoints in one table (fleet dashboards) — e.g. every truck crossing UA→EU (crossing_type=9):
let
ApiKey = "NKD-DEV-XXXX-XXXX-XXXX",
Source = Json.Document(Web.Contents("https://nakordoni.eu/api/v1/data/border/1/all/9",
[Headers = [Authorization = "Bearer " & ApiKey]])),
checkpoints = Source[data],
AsTable = Table.FromRecords(checkpoints)
in
AsTable
Data → Refresh All in Excel, or a scheduled refresh in Power BI / Excel Online, keeps the numbers current — no polling code needed.
ERP integration (BAS / BAF and 1C-family platforms)
BAS / BAF and other 1C-family platforms can call this API directly from a scheduled job — HTTPConnection plus ReadJSON, no middleware, no extra service to host. The most common setup keeps an information register of EU fuel prices up to date.
Refreshing an information register (fuel prices, all countries in one call)
// Scheduled job — runs once a day
Connection = New HTTPConnection("nakordoni.eu", 443, , , , 30, New OpenSSLSecureConnection);
Headers = New Map;
Headers.Insert("Authorization", "Bearer NKD-DEV-XXXX-XXXX-XXXX");
Request = New HTTPRequest("/api/v1/data/fuel", Headers);
Response = Connection.Get(Request);
Reader = New JSONReader;
Reader.SetString(Response.GetBodyAsString("UTF-8"));
Answer = ReadJSON(Reader, True);
Reader.Close();
If Answer["ok"] <> True Then
// Answer["error"]["code"] says why; Answer["usage"] holds your quota state
Return;
EndIf;
For Each Row In Answer["data"] Do
Record = InformationRegisters.FuelPrices.CreateRecordManager();
Record.Period = CurrentSessionDate();
Record.Country = Row["country"]; // "PL", "DE", "SK", "RO", ...
Record.Diesel = Row["diesel"];
Record.Petrol = Row["petrol"];
Record.LPG = Row["lpg"];
Record.Currency = Row["currency"];
Record.Write();
EndDo;
Three things to get right: pass New OpenSSLSecureConnection on port 443 or the request dies on TLS; call /api/v1/data/fuel without a country parameter so one request returns every country instead of one call per country; and test ok before touching data — failures come back as ok:false with an error.code, not as an exception. The sample uses the platform English keyword set; the localized equivalents (HTTPСоединение, ПрочитатьJSON, РегистрыСведений) behave identically.
Fuel prices upstream move once a day, so a daily or twice-daily scheduled job is enough and stays far inside the free Explorer quota. Live queue data (queue, multi, border) changes every few minutes — poll those on their own schedule, and use multi to read up to 20 checkpoints in a single request instead of looping.
MCP Server
Prefer tool-calling over REST? We run a real MCP server (Streamable HTTP transport) exposing a safe read-only subset of this API as MCP tools — same API key, same quota, just a different transport.
Endpoint: https://nakordoni.eu/mcp · Server card: /.well-known/mcp/server-card.json
get_api_status — no key required list_checkpoints — country, lang get_border_queue — origin, destination, crossing_type, lang get_live_queue — ppid, lang get_queue_forecast — ppid, prediction_steps
Client config (Claude Desktop / Claude Code):
{
"mcpServers": {
"nakordoni": {
"url": "https://nakordoni.eu/mcp",
"headers": { "Authorization": "Bearer NKD-DEV-XXXX-XXXX-XXXX" }
}
}
}
Products
Pick an endpoint for its full reference, parameters, versions and a live sandbox.
Standard draws from the standard data quota · Heavy draws from the forecast & statistics quota — see Quotas
Border Queues
Live health of every Developer-API product: online / degraded / offline, response latency and last-checked time, plus an overall …
Directory of all monitored border checkpoints: IDs, names, countries, coordinates and status. Use it to discover ppid values for …
All checkpoints on a given border + vehicle type in one call — live queue, wait estimate, and data freshness for every crossing. …
Find checkpoint PPIDs by name in any language. Returns all PPIDs for that location grouped by vehicle type. Up to 20 names per re…
Real-time queue length, wait estimate and status for any monitored checkpoint. Includes a snapshot block: current queue (queue_no…
Fetch queue status and data freshness for up to 20 checkpoints in a single request. Quota counts as ⌈(N PPIDs × sub-products) / 2…
Nearby alternative checkpoints on the same border with current queues and distance deltas.
When a checkpoint was last updated, by which source, and a freshness rating.
Forecasts & Stats
ML ensemble forecast of queue levels: 24-hour and 7-day (168h) horizons with confidence bounds. The same model that powers nakord…
Hourly historical queue stats per checkpoint and date: 24 hourly values, daily avg/min/max, peak and quietest hours, day-over-day…
Typical-week load statistics per checkpoint: 7×24 day-of-week × hour matrix (median + p25/p75 band), quietest/busiest day, best/w…
Fuel & Locations
Average petrol/diesel/LPG prices across EU countries plus nearest stations, aggregated from official national sources.
Per-city fuel price summary for a country: cheapest station price and average across the top 5 stations in each major city.
Truck parkings (14k+), free showers, services and supermarkets across Europe with coordinates.
EUR-based exchange rates for PLN, CZK, HUF, USD, GBP, CHF, NOK and UAH, sourced from Frankfurter (ECB), cached 6 hours. No parame…
Travel Planning
A door-to-door plan for a border trip: the route, the crossings on it with a live queue or a forecast for your arrival time, and …
Travel time + border queue data for all checkpoints from a given origin. Returns drive time, current queue, total estimated journ…
European truck driving restrictions by country and date, including seasonal and holiday bans.
Sunday retail-opening regulations and upcoming trading Sundays per regulated EU country.
Official public holidays per European country — dates, local names and type, each country's full holiday list included. Backed by…
Drivers & Roads
Approved road condition reports near borders and on major corridors: potholes, roadworks, closures, ice, hazards — combining driv…
Border-crossing performance per bus carrier: crossings, average/median/min/max wait minutes — built from our own plate-matched cr…
AI Assistant
Ask our production AI assistant any border-crossing question (queues, forecasts, rules, fuel, routes) and get the same grounded a…
Your own AI assistant, grounded on YOUR content plus OUR live border data. Point it at your markdown files or let us fetch the pa…
Other
History data export
Approved developers can download hourly-averaged, published border-queue history for up to 5 checkpoints (rolling window up to 90 days) as gzipped CSV, NDJSON, or JSON. This is a portal-only feature — NOT an API endpoint; you build and download exports from the "Data export" tab in your account.
Access is granted on request: open a Data ticket telling us which checkpoints, the time window, and your intended use. Once approved, the Data export tab appears in your account. Default limit: 1 export/day, up to 5 checkpoints each — ask us to raise it.
Fields — one row per checkpoint per UTC hour
| Parameter | Description |
|---|---|
ppid | Checkpoint id |
checkpoint_name | Checkpoint name |
hour_utc | Hour bucket, ISO-8601 UTC |
direction | e.g. UA->PL |
vehicle_type | car / bus / truck / pedestrian |
avg_queue_length | Hourly average queue length |
avg_wait_minutes | Hourly average wait; null where a checkpoint has no official wait feed |
sample_count | Number of observations in the hour |
Data is published-only and passes our anomaly / data-quality checks before export (no raw per-report data). All timestamps are UTC. Files are kept for 10 days.
Provenance: every file embeds a signed fingerprint (sha256 + HMAC) in its header, so any copy can later be confirmed as genuine nakordoni.eu data and checked for tampering — even after download.
# sha256: 3f9c… # signature: e87b… ppid,checkpoint_name,hour_utc,direction,vehicle_type,avg_queue_length,avg_wait_minutes,sample_count id_10,Hrushiv,2026-06-12T02:00:00Z,UA->PL,car,11,,4
What you can build
The same data products render the visuals on nakordoni.eu — weekly forecast charts, hourly queue profiles, live status cards. A taste of what the forecast and stats APIs contain:
Attribution
Explorer-plan integrations must show a visible "Data by nakordoni.eu" link wherever the data is displayed. It keeps the free plan free.
The exact code
Copy this snippet as-is. The link must stay indexable: a plain HTML <a href> that search engines can follow — do NOT add rel="nofollow" or rel="sponsored", do not render it only via JavaScript, and do not hide it with CSS.
<a href="https://nakordoni.eu/" title="Border queues, forecasts & statistics">Data by nakordoni.eu</a>
Compact small-print variant (e.g. under a chart or widget):
<p style="font-size:12px;margin:4px 0"> Data by <a href="https://nakordoni.eu/">nakordoni.eu</a> </p>
You may link to your language version instead, e.g. https://nakordoni.eu/pl/ — any indexable link to nakordoni.eu counts. The anchor text "Data by nakordoni.eu" must stay in English.
Where to place it
- Directly next to or under the data block (table, chart, widget, answer) — on the same screen, visible without extra clicks.
- On every page or app screen where our data appears — not only on an "about" page.
- Readable size and contrast: at least ~11px, not hidden, not collapsed, not the same color as the background.
- Native mobile apps without HTML links: show the text "Data by nakordoni.eu" on the data screen and put the tappable link on your info/about screen.
We periodically verify attribution on the "page where the data is used" you provided at signup. Missing or de-indexed attribution on the Explorer plan leads to a reminder first, then key suspension. Pay As You Grow customers may omit attribution.