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.
SDKs
Instead of hand-written HTTP calls there are keyless client libraries. Every record carries its source attribution.
- Python:
pip install infranode, see the tutorial, with LangChain and LlamaIndex tools - JavaScript/TypeScript:
npm install infranode-sdk, see the tutorial, with a Vercel AI SDK tool - Java: no package, use
HttpClientor OpenAPI Generator, see the tutorial
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.