Autonomously curated catalog of free, open Norwegian APIs — built for AI code agents.
A machine-readable catalog of Norwegian public APIs (weather, transport, business register, statistics, geodata, …) with metadata that AI coding agents actually need: when to use it, what to chain it with, sample requests, and citation-grounded descriptions.
The catalog is self-maintaining: a daily pipeline harvests Felles datakatalog, proposes new entries via curator subagents, verifies citations, runs live smoke tests, and opens PRs.
Bootstrap — the schema is in place, the first hand-curated entry
(met.locationforecast)
validates end-to-end, and the harvester pulls live FDK data.
A generated landing page lives at derived/index.md —
human-readable index of every entry grouped by status, with views
by category and by provider.
Machine consumers should read derived/index.json.
These artifacts are rebuilt by uv run open-apis index from the YAML under
catalog/. They are derived data — never edit by hand.
uv sync
uv run open-apis schema # regenerate catalog/schema.json
uv run open-apis validate catalog/by-provider/met/locationforecast.yaml
uv run open-apis smoke catalog/by-provider/met/locationforecast.yaml
uv run open-apis harvest dataservices 2 # 200 entries from FDK
uv run open-apis index # rebuild derived/ landing + index.jsonSee CLAUDE.md for the autonomy model. Short version:
- Source of truth:
pipeline/models.py(Pydantic) →catalog/schema.json - Catalog:
catalog/by-provider/<provider>/<api>.yaml(canonical) andcatalog/staging/...(quarantine) - Raw artifacts:
raw/<provider>/<date>/...(immutable, citations point here) - Pipeline:
pipeline/{harvest_fdk,validate,smoke,citations}.py - Agent infrastructure:
.claude/{agents,skills,hooks,rules}/
- GitHub Actions runs the pure-Python validators and smoke tests. No LLM. No API key. Free.
- LLM curation runs on your machine via a Claude Code scheduled task
(
~/.claude/scheduled-tasks/daily-harvest/). It uses your existing Claude Code subscription — no Anthropic API billing.
This split is intentional: the deterministic gates (schema, citation substring match, smoke) live in CI where they protect the main branch from any contributor; the agentic curation happens locally where it's free under your subscription.
Every textual field in a catalog entry has a source_quote that must
literally appear in the raw artifact it cites. The validator does this check
with a string substring match — not another LLM. This is the deterministic
anti-hallucination gate.
A separate citation-reviewer subagent (read-only, no write tools) independently
verifies each entry. A Stop hook prevents Claude Code from terminating with
unreviewed changes to catalog/.
- Code: MIT
- Catalog metadata: NLOD-2.0 (matches the upstream Felles datakatalog license)
This is a single-developer + agent project. PRs from humans are welcome but the daily harvester does the bulk of the work.