viafrei 1.3.12 → 1.3.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/API.md +623 -0
- package/CHANGELOG.md +684 -0
- package/LICENSE +2 -1
- package/NOTICE +23 -7
- package/README.md +207 -48
- package/SOURCES.md +332 -87
- package/dist/config.d.ts +10 -0
- package/dist/config.js +39 -6
- package/dist/failure.d.ts +10 -1
- package/dist/failure.js +51 -3
- package/dist/fetch.d.ts +19 -0
- package/dist/fetch.js +77 -4
- package/package.json +20 -2
package/SOURCES.md
CHANGED
|
@@ -14,7 +14,11 @@ can be breached without noticing. Those two are first, before the catalogue.
|
|
|
14
14
|
The authoritative, always-current register is the resource
|
|
15
15
|
**`viafrei://attribution`** on the server itself. Any MCP client can read it. If
|
|
16
16
|
this page and that resource ever disagree, the resource is right and this page is
|
|
17
|
-
stale: tell us and we will fix it.
|
|
17
|
+
stale: tell us and we will fix it. One row we re-measured on 2026-09-27 disagrees
|
|
18
|
+
the other way round — it is named in the catalogue below, at the BKG row, and the
|
|
19
|
+
fix belongs to the server rather than to this page. Whatever the surfaces say,
|
|
20
|
+
the answer you hold is the thing to read: `_meta.sources` and the attribution
|
|
21
|
+
lines on it are produced from the same result you are looking at.
|
|
18
22
|
|
|
19
23
|
---
|
|
20
24
|
|
|
@@ -44,55 +48,116 @@ What that means for you, in plain words:
|
|
|
44
48
|
|
|
45
49
|
### Public-transport realtime is share-alike
|
|
46
50
|
|
|
47
|
-
Realtime public-transport data comes from **DELFI e.V.** under
|
|
48
|
-
**
|
|
51
|
+
Realtime public-transport data comes from **DELFI e.V.** under a Creative
|
|
52
|
+
Commons **Attribution-ShareAlike** licence. **The version is an open question and
|
|
53
|
+
this page does not invent one** — see the section on this feed below for what the
|
|
54
|
+
catalogue and the access point actually state. Treat the share-alike as applying;
|
|
55
|
+
do not rely on a particular version for a derivative. Share-alike means the
|
|
56
|
+
obligation travels:
|
|
49
57
|
|
|
50
58
|
- anything you derive from it — a table of delays, a punctuality figure, a
|
|
51
|
-
screen that reuses the numbers — has to be offered under
|
|
52
|
-
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
59
|
+
screen that reuses the numbers — has to be offered under BY-SA too;
|
|
60
|
+
- **share-alike reaches adaptations, not aggregations.** If you *modify* the
|
|
61
|
+
data — recompute it, reshape it, **rearrange** it, build a delay table or a
|
|
62
|
+
punctuality series out of it — what you made is Adapted Material under
|
|
63
|
+
art. 1(a), which names material "translated, altered, **arranged**,
|
|
64
|
+
transformed, or otherwise modified", and you must license it under BY-SA
|
|
65
|
+
(art. 3(b)(1)) and pass the licence URI on (art. 3(b)(2)). An arrangement is
|
|
66
|
+
therefore inside the obligation, not outside it. If you merely **show** it
|
|
67
|
+
next to data from another source, that is an aggregation and no ShareAlike
|
|
68
|
+
obligation touches the other source.
|
|
69
|
+
|
|
70
|
+
The words quoted above come from the **4.0** text, because 4.0 is the
|
|
71
|
+
text we read. **Which version applies is the open question set out below**,
|
|
72
|
+
and this page does not guess what another version's definition says: the
|
|
73
|
+
vocabulary the catalogue draws on offers three terms — unversioned, 3.0 DE
|
|
74
|
+
and 4.0 — and the middle one is a German port whose definitions are in
|
|
75
|
+
German. "It holds whichever version applies" would have been a claim about
|
|
76
|
+
texts nobody here has opened, which is the same shape as the error corrected
|
|
77
|
+
above.
|
|
78
|
+
|
|
79
|
+
Creative Commons' own position: the condition "applies only for works
|
|
80
|
+
considered adaptations under copyright law, not simply in collections with
|
|
81
|
+
other works". An earlier version of this page said you may not blend it into a
|
|
82
|
+
work under a different licence. That was wrong in the direction that matters —
|
|
83
|
+
it told you a licence forbids something it permits, which art. 3(b)(3) is
|
|
84
|
+
itself about not doing to a recipient, and it would have condemned our own
|
|
85
|
+
service, since a weather answer can name `["dwd","osm"]` and a transit answer
|
|
86
|
+
is built on a place resolved from the gazetteer;
|
|
87
|
+
- the attribution line stays with it, either way.
|
|
56
88
|
|
|
57
89
|
If that is not what you want for your product, ask for the same answer from a
|
|
58
90
|
source that is not BY-SA, or keep the two apart.
|
|
59
91
|
|
|
60
|
-
### And one that applies
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
92
|
+
### And one that applies if you get an OpenStreetMap-derived result back
|
|
93
|
+
|
|
94
|
+
Some answers are built from **OpenStreetMap**, under the **ODbL 1.0**. Address
|
|
95
|
+
and point-of-interest lookups always are; so is any other answer whose place our
|
|
96
|
+
own gazetteer could not resolve, because place resolution falls through to the
|
|
97
|
+
OSM tables. The public service gives such answers, measured on 2026-09-27, so
|
|
98
|
+
**this binds you** as soon as one of those tables answered you — not at some
|
|
99
|
+
later date, today. An earlier version of this page said the opposite, on the
|
|
100
|
+
strength of a measurement taken before the extract was loaded; if you read that
|
|
101
|
+
version, re-read this section.
|
|
102
|
+
|
|
103
|
+
You can tell which answers are affected without guessing, and the test is the
|
|
104
|
+
answer rather than the question: the result carries
|
|
105
|
+
`OSM-Standortdaten: © OpenStreetMap-Mitwirkende, ODbL 1.0` and names `osm` in
|
|
106
|
+
`_meta.sources`. What decides it is **which table answered**, not which tool you
|
|
107
|
+
called and not what your input looked like. A place the server resolved from its
|
|
108
|
+
own gazetteer does not carry the line, and neither does a station or a motorway;
|
|
109
|
+
a place it resolved from OpenStreetMap does — and place resolution falls through
|
|
110
|
+
the gazetteer to the OSM tables, so **any** tool that takes a `place` can come
|
|
111
|
+
back with an OSM-derived answer. Measured on 2026-09-27: a weather warning asked
|
|
112
|
+
for `Zeiss-Großplanetarium` named `["dwd","osm"]` and carried the ODbL line. So
|
|
113
|
+
"did I ask for an address?" is the wrong question, and so is "is this a
|
|
114
|
+
geocoding tool?" — **read `_meta.sources` and the attribution line on the answer
|
|
115
|
+
you actually got.**
|
|
66
116
|
|
|
67
117
|
ODbL's share-alike is on the *database*, not on the sentence: if you build your
|
|
68
|
-
own database out of address results and use it publicly, you
|
|
69
|
-
the same offer we make. **Our side of that offer stands** —
|
|
70
|
-
server states it in `viafrei://attribution`: ask, and you get
|
|
71
|
-
|
|
72
|
-
|
|
118
|
+
own database out of address or point-of-interest results and use it publicly, you
|
|
119
|
+
owe your recipients the same offer we make. **Our side of that offer stands** —
|
|
120
|
+
ODbL § 4.6 — and the server states it in `viafrei://attribution`: ask, and you get
|
|
121
|
+
**both** our extracts — addresses and points of interest, one file each — and our
|
|
122
|
+
alterations to them, under ODbL 1.0 with a single licence notice covering the two.
|
|
123
|
+
Both, because a recipient who derived from POI results is entitled to the POI
|
|
124
|
+
database and this sentence named only the addresses until 2026-09-27. An issue on
|
|
125
|
+
this repository reaches us, and the server's own register names the contact route
|
|
126
|
+
as well.
|
|
73
127
|
|
|
74
128
|
---
|
|
75
129
|
|
|
76
130
|
## The catalogue
|
|
77
131
|
|
|
78
|
-
**Status is not a promise, it is a measurement.** Every "live" below
|
|
79
|
-
by calling the public endpoint on
|
|
80
|
-
answer named. A source can be licensed, cleared and loaded and still not answer
|
|
132
|
+
**Status is not a promise, it is a measurement.** Every "live" below **except the
|
|
133
|
+
one labelled `not re-measured`** was checked by calling the public endpoint on
|
|
134
|
+
**2026-09-27** and reading which source the answer named. A source can be licensed, cleared and loaded and still not answer
|
|
81
135
|
a question today; where that is so, this page says it.
|
|
82
136
|
|
|
137
|
+
The measurement was taken by calling **fifteen of the server's sixteen read-only
|
|
138
|
+
tools — every one except `find_cheapest_fuel`** — once each, and reading
|
|
139
|
+
`_meta.sources` out of the result: not by reading the code, and not by asking
|
|
140
|
+
whether a feed was running. Thirteen sources were named by at least one answer.
|
|
141
|
+
The tool not called is the one whose row is deliberately not re-measured, and
|
|
142
|
+
the count above says so rather than absorbing it: a status this page cannot stand behind is
|
|
143
|
+
worse than an honest gap.
|
|
144
|
+
|
|
83
145
|
- **live** — an answer came back naming it when this page was checked;
|
|
84
146
|
- **in the service** — licensed and loaded, and the spot check produced no
|
|
85
147
|
answer that named it, so it is reported as unconfirmed rather than as live;
|
|
86
|
-
- **not on the public service today** — cleared and built, and it does not
|
|
87
|
-
answer right now. Do not design around it yet;
|
|
88
148
|
- **read** — the licence is read and cleared, and nothing uses it yet.
|
|
89
149
|
|
|
150
|
+
There used to be a fourth value, **not on the public service today**, and no row
|
|
151
|
+
carries it any more: the three rows that did now answer. It is removed from this
|
|
152
|
+
legend rather than left standing, because a legend entry nothing uses reads as a
|
|
153
|
+
status somebody could still be relying on.
|
|
154
|
+
|
|
90
155
|
| Source | Publisher | Covers | Publisher's rhythm | Licence | Status |
|
|
91
156
|
|---|---|---|---|---|---|
|
|
92
157
|
| Motorway traffic | Die Autobahn GmbH des Bundes | Roadworks, warnings, closures, webcams, lorry parking, charging points on the Bundesautobahnen | continuous | open, no licence text published — see below | live |
|
|
93
158
|
| Roadworks (DATEX II) | Bundesanstalt für Straßen- und Verkehrswesen (BASt), via the national access point | Arbeitsstellen on the Bundesautobahnen | a few times a day | CC BY 4.0 | live |
|
|
94
159
|
| Lorry parking, static | Lkw-Parken BAB Deutschland / BMV, via the national access point | Nationwide lorry parking sites on the Bundesautobahnen | a few releases a year | GeoNutzV | live |
|
|
95
|
-
| Fuel prices (MTS-K) | Tankerkönig / Markttransparenzstelle für Kraftstoffe | Prices and station details for German filling stations | continuous, in the publisher's own cycle | CC BY 4.0 **plus the MTS-K purpose limit** | live, **limited coverage** |
|
|
160
|
+
| Fuel prices (MTS-K) | Tankerkönig / Markttransparenzstelle für Kraftstoffe | Prices and station details for German filling stations | continuous, in the publisher's own cycle | CC BY 4.0 **plus the MTS-K purpose limit** | live, **limited coverage**, **not re-measured** — see below |
|
|
96
161
|
| Timetables | Deutsche Bahn AG (DB API Marketplace) | Planned and changed rail departures per station | continuous | CC BY 4.0 | live |
|
|
97
162
|
| StaDa — Station Data | Deutsche Bahn AG (DB API Marketplace) | Station master data: name, number, address, coordinates, facilities | static master data | CC BY 4.0 | live |
|
|
98
163
|
| Official weather warnings | Deutscher Wetterdienst (DWD) | Amtliche Wetterwarnungen per municipality | as issued | CC BY 4.0, with a source note fixed by law | live |
|
|
@@ -101,36 +166,71 @@ a question today; where that is so, this page says it.
|
|
|
101
166
|
| Charging point master data | EnBW AG, via the national access point | AFIR charge-point master data for EnBW mobility+ | static releases | CC BY 4.0 | in the service |
|
|
102
167
|
| Charging point availability | Tesla Germany GmbH and Volkswagen Group Charging GmbH, via the national access point | AFIR dynamic status for their own networks | live status | **CC0 1.0** | in the service |
|
|
103
168
|
| German road rules | ViaFrei, compiled from official sources | Environmental zones, tolls, equipment duties, charging rules | reviewed at least twice a year | our own text | live |
|
|
104
|
-
| Public-transport realtime (GTFS-RT Trip Updates) | DELFI e.V., via the national access point (Mobilithek) | Germany-wide departure and arrival forecasts | real time | **CC BY-SA
|
|
105
|
-
| FaSta — Facility Status | Deutsche Bahn AG (DB API Marketplace) | Live state of lifts and escalators at stations | live status | CC BY 4.0 |
|
|
106
|
-
| Geocoding (addresses) | OpenStreetMap contributors | Street and house-number points in Germany | refreshed from the OSM extract | **ODbL 1.0** |
|
|
169
|
+
| Public-transport realtime (GTFS-RT Trip Updates) | DELFI e.V., via the national access point (Mobilithek) | Germany-wide departure and arrival forecasts | real time | **CC BY-SA (version unstated)** | live |
|
|
170
|
+
| FaSta — Facility Status | Deutsche Bahn AG (DB API Marketplace) | Live state of lifts and escalators at stations | live status | CC BY 4.0 | live |
|
|
171
|
+
| Geocoding (addresses and points of interest) | OpenStreetMap contributors | Street and house-number points and mapped points of interest in Germany | refreshed from the OSM extract | **ODbL 1.0** | live |
|
|
107
172
|
| Timetable data (static GTFS) | DELFI e.V. | Germany-wide scheduled public transport | weekly release | CC BY 4.0 | read |
|
|
108
173
|
| Stop directory (zHV) | DELFI e.V. | Every public-transport stop in Germany with its identifier and coordinates | weekly release | CC BY 4.0 | read |
|
|
109
|
-
|
|
|
110
|
-
|
|
|
174
|
+
| Disruption reports (Störungsmeldungen) | DELFI e.V., via the national access point (Mobilithek) | Germany-wide public-transport disruption messages | real time | **CC BY-SA 4.0** | read |
|
|
175
|
+
| Station car parks (DB BahnPark) | Deutsche Bahn AG (DB API Marketplace) | Car parks at railway stations, with their operator and access details | continuous | **dl-de/by-2-0** | read |
|
|
176
|
+
| Administrative units and place names | Bundesamt für Kartographie und Geodäsie (BKG), product GN250 | Länder, Regierungsbezirke, Kreise, Gemeinden with their official keys and names | yearly release | **dl-de/by-2-0** | live |
|
|
177
|
+
| Police traffic events | Landesbetrieb Straßenbau NRW (VIZ.NRW), via the national access point | Police traffic reports, Germany-wide | continuous | **Datenlizenz Deutschland – Zero – 2.0** | in the service — see below |
|
|
111
178
|
|
|
112
|
-
|
|
113
|
-
|
|
179
|
+
Two of those rows need saying out loud rather than in a cell, because a cell
|
|
180
|
+
cannot carry a reason — fuel takes two bullets, because the coverage limit and
|
|
181
|
+
the decision not to re-measure are different facts.
|
|
114
182
|
|
|
115
183
|
- **Fuel coverage is not nationwide.** We watch a limited set of stations, on
|
|
116
184
|
the terms the publisher sets, and we ask for a station's details only when
|
|
117
185
|
somebody actually asks a question. Outside that set you may get nothing back.
|
|
118
186
|
That is a consequence of the MTS-K rules, not a gap we are hiding.
|
|
119
|
-
- **
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
187
|
+
- **Fuel is the one row not re-measured on 2026-09-27, and that was deliberate.**
|
|
188
|
+
MTS-K sets a minimum interval per station and its terms make needless querying
|
|
189
|
+
a real risk to the access itself, so this page does not spend a request on
|
|
190
|
+
proving a status it already knew. The cell is carried forward from the previous
|
|
191
|
+
check and labelled `not re-measured` rather than dressed up as today's
|
|
192
|
+
measurement. Everything else in the table was called.
|
|
193
|
+
- **Police traffic events are stored, and on 2026-09-27 no answer named them.**
|
|
194
|
+
It is polled and its rows are kept. The status is a statement about the
|
|
195
|
+
answers, not about the code: `check_road_status` was called on the A40, A3,
|
|
196
|
+
A1, A57 and A46 — VIZ.NRW's own Land — and named only the motorway interface
|
|
197
|
+
and the BASt roadworks feed. So by the rule at the top of this section the
|
|
198
|
+
row reads `in the service` and not `live`. What it does **not** say is that no
|
|
199
|
+
tool can reach the feed: whether a source is named is decided by a live
|
|
200
|
+
catalogue row rather than by code, so this row could begin carrying its
|
|
201
|
+
attribution line with no release at all. Do not design around it yet — and
|
|
202
|
+
read `_meta.sources`, not this page, on the day you do.
|
|
203
|
+
|
|
204
|
+
**What changed on 2026-09-27, stated plainly because this page said the
|
|
205
|
+
opposite until today.** Address lookup, lift and escalator status, and
|
|
206
|
+
public-transport realtime were all listed as not answering. All three now
|
|
207
|
+
answer, and each was confirmed by a call whose result named the source: OSM for
|
|
208
|
+
addresses and points of interest, FaSta for lifts and escalators, DELFI for
|
|
209
|
+
realtime. The BKG administrative gazetteer was listed as merely `read` and is
|
|
210
|
+
in fact named by answers from five different tools. If you read an earlier
|
|
211
|
+
version of this page and concluded something was unavailable, re-check it here.
|
|
212
|
+
|
|
213
|
+
**And one row where this page is newer than the register.** BKG is `live` here, on
|
|
214
|
+
five measured answers, while `viafrei://attribution` carries it as planned —
|
|
215
|
+
"licence read, data not ingested yet". The answers decide it, and one part of an
|
|
216
|
+
answer decides it: `bkg_gvisys` appeared in `_meta.sources`, and only a row that
|
|
217
|
+
answered can put an id there. The attribution line came with it, which is
|
|
218
|
+
corroboration and not proof — that line is rendered from whichever ids a result
|
|
219
|
+
carries and knows nothing about whether the data is loaded. The flag is a server-side change and the server is
|
|
220
|
+
where it will be fixed.
|
|
221
|
+
|
|
222
|
+
**Do not read that as "one" being measured across the table.** It is the only
|
|
223
|
+
disagreement among the rows this page re-measured on 2026-09-27, which is not the
|
|
224
|
+
same statement. The nearest other candidate is the DELFI stop directory (zHV),
|
|
225
|
+
flagged the same way on the same day: we asked for a stop by name and the station
|
|
226
|
+
directory answered instead (`db_stada`, with BKG and GeoNames), which is consistent
|
|
227
|
+
with the flag and a long way from proof — stops and stations live in the same table
|
|
228
|
+
and the resolver ranks them, so a station hit can hide a stop row completely.
|
|
229
|
+
Asking a question is not reading the server's table, and this is reported as the
|
|
230
|
+
weaker thing it is. **What settles any of
|
|
231
|
+
these for you is the answer in your hand**: read `_meta.sources` and the
|
|
232
|
+
attribution lines on the result, never a status cell on a page that was printed
|
|
233
|
+
before you asked.
|
|
134
234
|
|
|
135
235
|
## The sources in detail
|
|
136
236
|
|
|
@@ -173,32 +273,85 @@ absence of a licence permits. If you intend to republish it, ask them.
|
|
|
173
273
|
|
|
174
274
|
Publisher: <https://www.autobahn.de>
|
|
175
275
|
|
|
176
|
-
### DELFI e.V. — public-transport realtime · CC BY-SA
|
|
276
|
+
### DELFI e.V. — public-transport realtime · CC BY-SA (version unstated)
|
|
177
277
|
|
|
178
278
|
Germany-wide GTFS-RT Trip Updates — the live forecast behind a departure board
|
|
179
279
|
— published by DELFI e.V. through the national access point (Mobilithek), and
|
|
180
|
-
listed on GovData
|
|
280
|
+
listed on GovData under a Creative Commons **Attribution-ShareAlike** licence.
|
|
281
|
+
|
|
282
|
+
**The version is an open question, and this page will not invent one.** The
|
|
283
|
+
GovData catalogue record for this feed carries the *unversioned* licence URI
|
|
284
|
+
`http://dcat-ap.de/def/licenses/cc-by-sa` on its only resource (read 2026-09-27).
|
|
285
|
+
The dataset-level licence field is empty, which is **not** evidence of anything —
|
|
286
|
+
in DCAT-AP.de the licence lives on the distribution, and every record sampled from
|
|
287
|
+
this catalogue has it empty at dataset level, the versioned siblings included. The
|
|
288
|
+
resource field is the one that speaks. Per the dcat-ap.de vocabulary that is
|
|
289
|
+
a distinct term from `…/cc-by-sa/4.0`. It is not a habit of the publisher's
|
|
290
|
+
either: DELFI's sibling records in the same catalogue *are* versioned — the
|
|
291
|
+
GTFS-RT Service Alerts feed carries `cc-by-sa/4.0` and the static timetable
|
|
292
|
+
`cc-by/4.0` — so DELFI states a version when it means one, and on this feed it
|
|
293
|
+
did not. An earlier version of this page said GovData listed the feed as
|
|
294
|
+
CC-BY-SA 4.0; that reading could not be reproduced and the claim is withdrawn.
|
|
295
|
+
|
|
296
|
+
Why it is not pedantry: art. 3(b)(1) sets the Adapter's Licence to "the same
|
|
297
|
+
License Elements, this version or later, or a BY-SA Compatible License", so the
|
|
298
|
+
version decides what a recipient may put on a derivative — and 3.0 unported has
|
|
299
|
+
no express sui-generis-database-rights clause where 4.0 art. 4 does, which is
|
|
300
|
+
exactly the derived-delay-table case. **Treat it as CC BY-SA and assume the
|
|
301
|
+
share-alike applies; do not rely on a specific version for a derivative.**
|
|
302
|
+
|
|
303
|
+
The authoritative field says the same thing. The national access point's own
|
|
304
|
+
metadata for this feed, read 2026-09-27, carries:
|
|
305
|
+
|
|
306
|
+
```
|
|
307
|
+
standardLicense : http://dcat-ap.de/def/licenses/cc-by-sa
|
|
308
|
+
customLicenseAsResource : null
|
|
309
|
+
sourceNote : null
|
|
310
|
+
```
|
|
311
|
+
|
|
312
|
+
So GovData's harvest is faithful and there is no versioned statement anywhere in
|
|
313
|
+
the chain. The attribution string the server emits today still names 4.0; that is
|
|
314
|
+
a defect at the source, tracked there, and it will be corrected in the server
|
|
315
|
+
rather than by rewording this page — what this page documents is what the server
|
|
316
|
+
actually sends.
|
|
181
317
|
|
|
182
318
|
```
|
|
183
319
|
Echtzeitdaten: DELFI e.V. via Mobilithek, CC BY-SA 4.0
|
|
184
320
|
```
|
|
185
321
|
|
|
186
322
|
Share-alike. See [the obligation above](#public-transport-realtime-is-share-alike):
|
|
187
|
-
what you derive from this stays
|
|
188
|
-
|
|
323
|
+
what you *derive* from this stays BY-SA — an adaptation, including a
|
|
324
|
+
rearrangement — while merely showing it beside another source's data is an
|
|
325
|
+
aggregation and constrains that other source not at all. The licence **version**
|
|
326
|
+
is the open question set out below; treat the share-alike as applying regardless.
|
|
327
|
+
|
|
328
|
+
**It answers.** Asked for Hamburg on 2026-09-27, `check_transit_disruption`
|
|
329
|
+
returned a region-wide punctuality answer naming this feed. Until 2026-09-21 the
|
|
330
|
+
same call produced an internal error and this page said so; that is fixed, and
|
|
331
|
+
the paragraph is left here rather than deleted so a reader who saw the old one
|
|
332
|
+
knows which of the two is current.
|
|
333
|
+
|
|
334
|
+
What it answers is a **region**, not a line: see the scope note in the
|
|
335
|
+
README — no tool here answers "is the S1 on time".
|
|
336
|
+
|
|
337
|
+
Licence family: Creative Commons Attribution-ShareAlike — the catalogue and the
|
|
338
|
+
access point both state the term without a version, so no version URL is given
|
|
339
|
+
here on purpose. The 4.0 text, for reference only:
|
|
340
|
+
<https://creativecommons.org/licenses/by-sa/4.0/> ·
|
|
341
|
+
publisher: <https://www.opendata-oepnv.de>
|
|
189
342
|
|
|
190
|
-
**
|
|
191
|
-
|
|
192
|
-
is there; the answer is not, so plan for it rather than on it.
|
|
343
|
+
**Three** more DELFI datasets are cleared and not yet in use, and they do not
|
|
344
|
+
share one licence:
|
|
193
345
|
|
|
194
|
-
|
|
195
|
-
|
|
346
|
+
- the Germany-wide static timetable — `Fahrplandaten: DELFI e.V., CC BY 4.0, bearbeitet` — **CC BY 4.0**;
|
|
347
|
+
- the central stop directory — `Haltestellendaten: DELFI e.V. (zentrales Haltestellenverzeichnis), CC BY 4.0, bearbeitet` — **CC BY 4.0**;
|
|
348
|
+
- the disruption reports — `Störungsmeldungen: DELFI e.V. via Mobilithek, CC BY-SA 4.0` — **CC BY-SA 4.0, share-alike**.
|
|
196
349
|
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
350
|
+
This page said "two, both CC BY 4.0 — the share-alike is on the realtime feed"
|
|
351
|
+
until 2026-09-27, and both halves were wrong: there are three, and the
|
|
352
|
+
share-alike is on **two** DELFI feeds, the trip updates we serve today and the
|
|
353
|
+
disruption reports we do not serve yet. If you are planning for the day the
|
|
354
|
+
disruption feed appears, plan for share-alike, not for CC BY.
|
|
202
355
|
|
|
203
356
|
### Tankerkönig / MTS-K — fuel prices · CC BY 4.0 **plus a purpose limit**
|
|
204
357
|
|
|
@@ -226,9 +379,10 @@ The historical price archive published beside the API is licensed
|
|
|
226
379
|
**CC BY-NC-SA** — non-commercial. It is not a source for any answer this
|
|
227
380
|
service gives, and it never will be while that licence stands.
|
|
228
381
|
|
|
229
|
-
### Deutsche Bahn AG — timetables, stations, facilities
|
|
382
|
+
### Deutsche Bahn AG — timetables, stations, facilities, station car parks
|
|
230
383
|
|
|
231
|
-
|
|
384
|
+
**Four** products on the DB API Marketplace, each read at its own product page,
|
|
385
|
+
and they do **not** share one licence. The three we serve are CC BY 4.0:
|
|
232
386
|
|
|
233
387
|
```
|
|
234
388
|
Fahrplandaten: Deutsche Bahn AG, DB API Marketplace, CC BY 4.0, bearbeitet
|
|
@@ -236,6 +390,20 @@ Bahnhofsdaten: Deutsche Bahn AG, DB API Marketplace, CC BY 4.0, bearbeitet
|
|
|
236
390
|
Aufzüge und Fahrtreppen: Deutsche Bahn AG, DB API Marketplace, CC BY 4.0, bearbeitet
|
|
237
391
|
```
|
|
238
392
|
|
|
393
|
+
The fourth is read and not yet held — station car parks, under **Datenlizenz
|
|
394
|
+
Deutschland – Namensnennung – Version 2.0**, which is a different licence with a
|
|
395
|
+
different attribution line:
|
|
396
|
+
|
|
397
|
+
```
|
|
398
|
+
Parking Information Daten der DB BahnPark – API über den DB API Marketplace
|
|
399
|
+
```
|
|
400
|
+
|
|
401
|
+
It is in the table because this page is the register and a row is how we say a
|
|
402
|
+
licence has been read. It is `read`, so no answer carries that line today; the
|
|
403
|
+
line is here so that nobody has to go and find it on the day one does. Do not
|
|
404
|
+
assume the CC BY 4.0 line above covers it — one publisher, four products, two
|
|
405
|
+
licences.
|
|
406
|
+
|
|
239
407
|
The product pages say it in one sentence: *"Dieser Datensatz wird bereitgestellt
|
|
240
408
|
unter der Lizenz Creative Commons Attribution 4.0 International (CC BY 4.0)."*
|
|
241
409
|
DB adds one carve-out, and it is narrower than it looks: once the data has been
|
|
@@ -243,10 +411,16 @@ contributed to OpenStreetMap, a mention of Deutsche Bahn AG in the contributor
|
|
|
243
411
|
list is enough. That is a relaxation **for OSM**, not permission to drop the
|
|
244
412
|
line from your own results.
|
|
245
413
|
|
|
246
|
-
Facility status — the live state of lifts and escalators — **
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
414
|
+
Facility status — the live state of lifts and escalators — **answers on the
|
|
415
|
+
public service**: asked for Köln Messe/Deutz on 2026-09-27 it returned ten
|
|
416
|
+
facilities with their states, naming this feed and the station directory that
|
|
417
|
+
resolves the name to the number the feed is keyed by. Until the directory was
|
|
418
|
+
loaded the lookup stopped before it started, and this page said not to build on
|
|
419
|
+
it; that is no longer the case.
|
|
420
|
+
|
|
421
|
+
The station directory is still what the lookup depends on, so a station missing
|
|
422
|
+
from it produces "I cannot resolve that station" rather than an empty facility
|
|
423
|
+
list — the distinction matters if you are deciding whether to retry.
|
|
250
424
|
|
|
251
425
|
Publisher: <https://developers.deutschebahn.com>
|
|
252
426
|
|
|
@@ -262,9 +436,19 @@ festgelegten Leistungen des DWD dürfen unter den Bedingungen der Lizenz Creativ
|
|
|
262
436
|
Commons BY 4.0 (CC BY 4.0) unter Beigabe eines Quellenvermerks weiterverwendet
|
|
263
437
|
werden."*
|
|
264
438
|
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
439
|
+
§ 7 DWD-Gesetz — headed *Quellenschutz* — makes the source note a legal **duty**:
|
|
440
|
+
distribution of DWD data, products and special services, warnings in particular,
|
|
441
|
+
"ist nur unter Angabe der Quelle zulässig". Its second sentence adds that fuller
|
|
442
|
+
protection under the Urheberrechtsgesetz "bleibt davon unberührt", so attribution
|
|
443
|
+
is the statute's minimum and not necessarily the whole of what is owed. It
|
|
444
|
+
prescribes no wording at all — an earlier version of this
|
|
445
|
+
page said the statute fixed the three words, which it does not. The **wording**
|
|
446
|
+
is set by the DWD itself, in *Vorgaben für die Gestaltung des
|
|
447
|
+
DWD-Quellenvermerks*: either the text form `Quelle: Deutscher Wetterdienst` or
|
|
448
|
+
the DWD logo, placed "unmittelbar an der verwendeten DWD-Information".
|
|
449
|
+
Reproduce the text form as it stands — it is the publisher's prescribed form and
|
|
450
|
+
shortening it defeats its purpose — but the constraint is the DWD's guidance, not
|
|
451
|
+
the statute's characters. It also has to sit immediately next to the DWD information it
|
|
268
452
|
belongs to.
|
|
269
453
|
|
|
270
454
|
There is a second line, and the difference matters:
|
|
@@ -308,26 +492,82 @@ nothing else.
|
|
|
308
492
|
|
|
309
493
|
Master data — where the posts are, which plug, how many kW — answers today.
|
|
310
494
|
**Live availability does not exist for most of Germany**, because only some
|
|
311
|
-
operators publish it
|
|
312
|
-
|
|
495
|
+
operators publish it. A result marks every such site `keine Statusdaten` and
|
|
496
|
+
closes with a sentence saying that this means unknown and not free — measured on
|
|
497
|
+
2026-09-27, asking for Leipzig. It does not count them for you, and this page
|
|
498
|
+
said it did until today; what it does is refuse to leave them out or to call them
|
|
499
|
+
free, which is the part that matters when you act on the answer.
|
|
313
500
|
|
|
314
|
-
### OpenStreetMap —
|
|
501
|
+
### OpenStreetMap — addresses and points of interest · ODbL 1.0
|
|
315
502
|
|
|
316
503
|
```
|
|
317
|
-
|
|
504
|
+
OSM-Standortdaten: © OpenStreetMap-Mitwirkende, ODbL 1.0
|
|
318
505
|
```
|
|
319
506
|
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
507
|
+
**Reproduce that line, not a shorter one.** This page printed
|
|
508
|
+
`Geokodierung: …` until 2026-09-27 and no answer has carried that prefix since the
|
|
509
|
+
release in which `find_poi` and `find_address` began returning an OSM row **as**
|
|
510
|
+
the answer — a name, a brand, a door — rather than only a coordinate resolved from
|
|
511
|
+
one. `Geokodierung` describes the narrower thing and would have been a false
|
|
512
|
+
statement about what the data was used for. If you copied the old string, change it.
|
|
513
|
+
|
|
514
|
+
**Which answers carry it**, in the platform's own words — verbatim, with the
|
|
515
|
+
qualifier emphasised here because it is the part two earlier versions of this
|
|
516
|
+
page dropped: *"Only results whose
|
|
517
|
+
input resolved through one of these two OSM tables carry this line. A result about
|
|
518
|
+
a place **from our own gazetteer**, a station or a motorway is not built from
|
|
519
|
+
OpenStreetMap and carries neither the ODbL attribution nor the obligation."*
|
|
520
|
+
|
|
521
|
+
Read the qualifier. The predicate is **which table answered**, and it is not a
|
|
522
|
+
list of tools. Place resolution falls through the gazetteer to the OSM tables, so
|
|
523
|
+
a tool that takes a `place` — a weather warning, a road status, a charging
|
|
524
|
+
station, a car park, `find_nearby` — returns an OSM-derived answer whenever the
|
|
525
|
+
gazetteer did not know the name. Measured on 2026-09-27: a weather warning for
|
|
526
|
+
`Zeiss-Großplanetarium` named `["dwd","osm"]` and carried this line; one for
|
|
527
|
+
`Allianz Arena` named `["osm"]` alone.
|
|
528
|
+
|
|
529
|
+
Two wrong versions of this sentence have now been caught, and both erred the same
|
|
530
|
+
way, towards telling a reader an obligation did not apply. **One of them shipped.**
|
|
531
|
+
1.3.12 said the line was carried "on every answer whose input was an address, and
|
|
532
|
+
on no other answer" — false for `find_poi`, and published. The second never
|
|
533
|
+
shipped: it was written while fixing the first and caught in review. It said "an
|
|
534
|
+
answer about a place, a station or a motorway does not", which drops the four
|
|
535
|
+
words that make it true and is false for every place the gazetteer could not
|
|
536
|
+
resolve. Two rounds of correcting one sentence is the reason the paragraph above
|
|
537
|
+
now states a predicate instead of listing tools or input shapes.
|
|
538
|
+
|
|
539
|
+
The positive test is the one to rely on: **read `_meta.sources` and the attribution
|
|
540
|
+
line on the answer you actually got.** Do not infer either from the shape of your
|
|
541
|
+
question.
|
|
542
|
+
|
|
543
|
+
Address data is imported **per deployment**, and the public service has it:
|
|
544
|
+
asked for a house number on 2026-09-27 it answered with the address and this
|
|
545
|
+
line. **So the line and the obligation apply to what you get from the public
|
|
546
|
+
service today.** How complete that import is was measured the same day from the
|
|
547
|
+
service's own per-Land verdict — which reads both tables, names any missing Land and exits
|
|
548
|
+
non-zero on one — rather than extrapolated from a single lookup: **all sixteen
|
|
549
|
+
Länder are imported, and every row is scoped to the Land it came from.** Two
|
|
550
|
+
address lookups in the two Länder least likely to have been staged —
|
|
551
|
+
Mecklenburg-Vorpommern and Saarland, asked in Rostock and Saarbrücken — both
|
|
552
|
+
answered through the public endpoint with `osm` in `_meta.sources`, over OSM data
|
|
553
|
+
dated 2026-09-22. No row count is written here on
|
|
554
|
+
purpose: it would be true the day it was typed and stale at the next import, and
|
|
555
|
+
reporting it is the verdict's job rather than this page's. One caveat, because it
|
|
556
|
+
nearly misled this very measurement — **a single address that does not resolve
|
|
557
|
+
says nothing about its Land**: a market-square house number in Erfurt came back
|
|
558
|
+
unfound from a Land that is fully imported, because that address is not in
|
|
559
|
+
OpenStreetMap under the spelling it was asked for. (The postcode is left out on
|
|
560
|
+
purpose - the leak sweep refuses a bare five-digit number in this repository, and
|
|
561
|
+
an allow-list entry added to carry an example would be a caption pointing at a
|
|
562
|
+
value.) Until the extract was loaded they did not, and this page said
|
|
563
|
+
so — the correction is the substantive one in this release.
|
|
564
|
+
|
|
565
|
+
A deployment that has not imported the extract answers that it can find places,
|
|
325
566
|
stations and motorways but not house numbers, which is the right answer rather
|
|
326
|
-
than a guessed coordinate.
|
|
327
|
-
|
|
328
|
-
extract, both apply in full.
|
|
567
|
+
than a guessed coordinate. There, neither this line nor the obligation arises,
|
|
568
|
+
because no OSM-derived answer is produced.
|
|
329
569
|
|
|
330
|
-
Our ODbL § 4.6 offer is [above](#and-one-that-applies-
|
|
570
|
+
Our ODbL § 4.6 offer is [above](#and-one-that-applies-if-you-get-an-openstreetmap-derived-result-back).
|
|
331
571
|
|
|
332
572
|
Licence: <https://opendatacommons.org/licenses/odbl/1-0/> ·
|
|
333
573
|
copyright: <https://www.openstreetmap.org/copyright>
|
|
@@ -440,10 +680,15 @@ Leaving a dataset out is as much a part of "we use all legal ways" as using one:
|
|
|
440
680
|
- The dates in this page are the dates the relevant page was read, not the dates
|
|
441
681
|
it was written.
|
|
442
682
|
- **The statuses are measured, not declared.** Each one was checked on
|
|
443
|
-
2026-09-
|
|
444
|
-
the answer named
|
|
445
|
-
|
|
446
|
-
|
|
683
|
+
2026-09-27 by asking the public endpoint a question and reading which source
|
|
684
|
+
the answer named — except the fuel row, which says `not re-measured` for the
|
|
685
|
+
reason given above. That is why **three** rows say a source is loaded but not
|
|
686
|
+
confirmed by an answer where the register says the licence is cleared — EnBW
|
|
687
|
+
static, the Tesla/VW availability feeds, and the police traffic events, which
|
|
688
|
+
moved into that state in this release: cleared is not live, and a page that
|
|
689
|
+
blurred the two would be the one thing this page exists not to be. The number is
|
|
690
|
+
written here because it is small enough to count; if it stops matching the table,
|
|
691
|
+
the table is right.
|
|
447
692
|
- Where a source's terms are unknown or unreadable, this page says so instead of
|
|
448
693
|
rounding it up to "open data" — the motorway interface above is named on every
|
|
449
694
|
answer for exactly that reason, and the datasets in the section before this
|
package/dist/config.d.ts
CHANGED
|
@@ -13,6 +13,16 @@ export declare const DEFAULT_MCP_URL: string;
|
|
|
13
13
|
export declare const URL_ENV_VAR = "VIAFREI_MCP_URL";
|
|
14
14
|
/** Environment variable that overrides the request timeout, in milliseconds. */
|
|
15
15
|
export declare const TIMEOUT_ENV_VAR = "VIAFREI_MCP_TIMEOUT_MS";
|
|
16
|
+
/**
|
|
17
|
+
* Environment variable that adds HTTP headers, for an API key an MCP client
|
|
18
|
+
* cannot pass as a flag. Several headers are separated by a NEWLINE, because a
|
|
19
|
+
* newline can never appear in a header name or value, so no value is
|
|
20
|
+
* unrepresentable: a comma, a semicolon and a space all occur inside real header
|
|
21
|
+
* values, and any of those as the separator would make something unsendable.
|
|
22
|
+
*/
|
|
23
|
+
export declare const HEADER_ENV_VAR = "VIAFREI_MCP_HEADER";
|
|
24
|
+
/** The separator between headers in HEADER_ENV_VAR. See HEADER_ENV_VAR. */
|
|
25
|
+
export declare const HEADER_ENV_SEPARATOR = "\n";
|
|
16
26
|
/** How long a single HTTP request may take before it is given up on. */
|
|
17
27
|
export declare const DEFAULT_TIMEOUT_MS = 30000;
|
|
18
28
|
/**
|