Quickstart
InfraNode serves normalised open data for German cities behind a single REST API. Every endpoint is publicly readable; your first call needs no key. Three steps and you are in.
Step 1, base URL
All endpoints live under the versioned base URL. Paths follow the pattern
/api/v1/cities/{slug}/{resource}.
https://infranode.dev/api/v1
Step 2, first call
Fetch the weather for Hamburg. No header, no setup, one GET is enough.
curl "https://infranode.dev/api/v1/cities/hamburg/weather"const res = await fetch("https://infranode.dev/api/v1/cities/hamburg/weather");
const data = await res.json();
console.log(data);import httpx
res = httpx.get("https://infranode.dev/api/v1/cities/hamburg/weather")
res.raise_for_status()
print(res.json()) Step 3, read the response
Every response follows the same canonical envelope. At the top level you always read the same two blocks, no matter which resource you query:
| Field | Content |
|---|---|
data | The actual payload, typed per endpoint (here the weather values). |
data[].attribution |
Not a separate top-level block: each data record carries an embedded
attribution field with text,
license_url and modified, that is licence and
origin of the respective data.
|
meta |
Context about the request: city slug, timestamp, queried source, the
source_status (ok, no_data or
disabled) plus correlation_id and
cache_status.
|
If a source returns nothing for a city, the status code stays
200 and source_status is set to
no_data. That cleanly separates "no data" from a real error.
Rate limits and API keys
Anonymous calls are limited per IP. A valid key in the
X-API-Key header raises the limit to the higher keyed tier. You
create a key yourself via POST /api/v1/keys; the plaintext token
is returned only once. A key only expires if it goes unused for 30 days;
every use automatically extends it back to 30 days. On overrun the API
answers with status 429.
Next steps
The left navigation lists every operation, with parameters, code samples in curl, JavaScript and Python, and a live console for the callable endpoints. The reference content is in German, the code samples are universal.