An open-source catalogue of Romanian APIs — public sector (ANAF, BNR, ONRC, CNAS, INS …) and private (PSD2 banks, couriers, payments, invoicing …). One Markdown file per service: endpoints, auth flow, how to get access, sandbox, request/response examples, existing SDKs and known gotchas, with a flat YAML frontmatter any script or agent can parse.
Everything works straight from this repo — there is no hosted site to depend on.
| 125 service files | src/content/docs/apis/ — read them on GitHub, grep them, feed them to an LLM |
catalog.json |
one JSON index of all 125 services, committed at the repo root → raw URL · JSON Schema |
| Link checker | scripts/check-apis.mjs — last run: reports/links-2026-09-24.md |
| Static site (optional) | Astro Starlight: search, sidebar, llms.txt. Run it locally with npm run dev; not published anywhere yet |
Not built yet (planned, no dates): hosted MCP server, REST facades for scrape-only services, our own SDKs, canonical OpenAPI specs. The service files link to existing third-party SDKs and specs where they exist — that is all. If you read "MCP" in a service file, it refers to someone else's project.
https://raw.githubusercontent.com/Jamaalx/ro-api-hub/main/catalog.json
const res = await fetch('https://raw.githubusercontent.com/Jamaalx/ro-api-hub/main/catalog.json');
const { services } = await res.json();
// Public, keyless APIs that are currently usable
const open = services.filter((s) => s.auth === 'none' && s.status === 'active');
console.log(open.map((s) => `${s.slug} — ${s.official_docs}`).join('\n'));
// Everything about one service, then read its full Markdown file
const vat = services.find((s) => s.slug === 'anaf-vat-v9');
const md = await (await fetch(vat.source_url.replace('github.com', 'raw.githubusercontent.com').replace('/blob/', '/'))).text();Each entry has: slug, name, category, sector (public/private/aggregators/community), institution, status, auth, protocol, sandbox_available, contract_required, openapi_spec, pricing, official_docs, api_base_url (+ api_base_url_note when it is not a URL), verified_at, links_checked_at, source_url (the file on GitHub), page_url (null until the site is published).
status values: active usable · stale outdated, or its documented host is gone · gated needs a contract, certificate or partnership · broken no public API (the file documents a scraping fallback) · suspended service down.
Dates: verified_at is when someone actually exercised the API. links_checked_at only means the checker saw the documented URLs answer — the API itself was not tested.
From anaf-vat-v9.md:
curl -X POST 'https://webservicesp.anaf.ro/PlatitorTvaRest/api/v9/ws/tva' \
-H 'Content-Type: application/json' \
-d '[{"cui": 43990858, "data": "2026-09-24"}]'Up to 100 CUIs per call, ~1 req/s. The file lists the response shape, the SDKs that wrap it (PHP, TS, Go …) and the gotchas.
| Sector | Category | Services | active |
|---|---|---|---|
| public | Elections (AEP) | 1 | 1 |
| public | Finance (BNR, ASF, BVB) | 8 | 5 |
| public | Fiscal (ANAF) | 10 | 8 |
| public | Geo / meteo (ANCPI, ANM, ANAR) | 9 | 6 |
| public | Gov portals | 3 | 2 |
| public | Health (CNAS) | 4 | 4 |
| public | Identity (ROeID, STS) | 3 | 2 |
| public | Justice | 2 | 2 |
| public | Open data | 2 | 1 |
| public | Procurement (SEAP) | 2 | 2 |
| public | Company registry (ONRC) | 2 | 0 |
| public | Regulators / civic | 7 | 4 |
| public | Statistics (INS) | 2 | 2 |
| public | Transport (CNAIR, RAR, DRPCIV, CFR) | 6 | 3 |
| private | Banks — PSD2 | 10 | 7 |
| private | Couriers | 6 | 6 |
| private | Energy | 3 | 0 |
| private | Insurance | 2 | 1 |
| private | Invoicing SaaS | 6 | 5 |
| private | Jobs | 3 | 1 |
| private | Maps | 2 | 2 |
| private | Marketplaces | 3 | 2 |
| private | Payments | 6 | 6 |
| private | SMS | 1 | 1 |
| private | Telecom | 4 | 1 |
| — | Aggregators | 9 | 7 |
| — | Community SDKs / datasets | 9 | 5 |
Status totals (from the frontmatter, after the 2026-09-24 link check): 86 active · 11 stale · 8 gated · 13 broken (no public API) · 7 suspended. The full editorial index with notes per service is apis/index.md.
- Point the agent at
catalog.json(raw URL above) and let it fetch the individualsource_urlfiles it needs. - Or build the site (
npm run build):dist/llms.txt,dist/llms-full.txt,dist/llms-small.txtand per-category bundles indist/_llms-txt/(fiscal, finance, banks-psd2, couriers, all-public, all-private). - Rules for AI contributors:
AGENTS.md.
Requires Node 22.12+.
npm install
npm run dev # optional site at http://localhost:4321 (regenerates public/catalog.json first)
npm run build # static site in dist/
npm run check:links # after build: every internal link in dist/ must resolve
npm run catalog # regenerate catalog.json after editing frontmatter — commit it
npm run check:catalog # fails if the committed catalog.json is stale
npm run check:apis # live link check -> reports/links-latest.mdnode scripts/check-apis.mjs [--write] [--report file.md] [--json file.json] [--only slug,slug]
- Unauthenticated
HEAD/GETonly, 10 s timeout, max 4 requests in flight, max 1 request/second per host, User-Agentro-api-hub-checker (+https://github.com/Jamaalx/ro-api-hub). official_docsmust answer 2xx/3xx; 401/403/418/429 are reported as "blocked — needs a human", not dead.api_base_urlis only requested forauth: noneservices (any HTTP status proves the host is alive); for keyed APIs only the hostname is resolved, so no endpoint that needs credentials is ever called.- Network failures are retried once, ≥30 s later. Exit code 1 if anything is dead.
--writesetslinks_checked_aton fully-ok services and adds a dated note under "Known issues" for dead URLs; anactiveservice whose host is gone becomesstale. Files are never deleted.
A weekly GitHub Actions run (check-apis.yml) opens an issue when links die.
The public URL lives in one place, site.config.mjs: SITE_URL env var, falling back to https://jamaalx.github.io/ro-api-hub (GitHub Pages, not enabled yet). A path in the URL becomes Astro's base, and canonical URLs, sitemap, robots.txt, llms.txt and catalog.json follow it:
SITE_URL=https://apis.example.org npm run builddist/ is plain static files — any static host works. A Dockerfile (nginx) is included for self-hosting.
Read AGENTS.md and contributing.md. To add a service:
- Check it doesn't already exist:
grep -ri "<slug>" src/content/docs/apis/ - Copy
templates/api-service.mdtosrc/content/docs/apis/{public|private}/{category}/{slug}.md(orapis/aggregators/,apis/community/) - Fill in all frontmatter fields —
src/content.config.tsvalidates them at build time;unknownis allowed, guessing is not - Body sections in order: Overview · Endpoints · Authentication · Request example · Response example · Existing SDKs · Testing approach · Known issues / gotchas · Tutorial seeds · ro-api-hub integration plan · References
- Set
verified_at:to the date you actually tested the API (leavelinks_checked_atto the checker) npm run catalog && npm run buildmust pass; commitcatalog.jsonwith your change- Open a PR titled
add: {service name}(orfix: {service} — {what}for corrections)
Found a dead link or a changed endpoint? A PR that fixes the URL (and removes the "Link check" note) is the most useful contribution there is.
Never fabricate endpoint URLs, version numbers or behaviour. No marketing copy.
- Code (Astro site, scripts, config): MIT — © 2026 Alex Mantello (ZED-ZEN)
- Catalogue content (the service files in
src/content/docs/andcatalog.json): CC BY 4.0 — attribute to "ro-api-hub" with a link to this repo
Inspired by BrasilAPI, api.gouv.fr, APIs.guru, the llms.txt spec, the Model Context Protocol, and the Romanian developer community (Code for Romania, peviitor-ro, the ANAF API community, and everyone who wrote a thin ANAF/BNR wrapper over the years).