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
The API is open and needs no API key. Calls are limited per IP (abuse
protection): up to 300 requests per minute (short bursts)
and 6000 per hour (sustained). Every response carries the
standard headers RateLimit-Limit,
RateLimit-Remaining and RateLimit-Reset. On
overrun the API answers with status 429 and a
Retry-After header. The MCP endpoint
(mcp.infranode.dev) is rate limited separately to 480 requests
per minute per IP.
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.