Romanian public data · REST API

Messy open data, one clean API.

Stop parsing CSVs, Excel exports, broken encodings, and schemas that change every year. Canovix serves data.gov.ro as one predictable, typed REST API — filter, sort, paginate, ship.

Free account — 10k calls a month, up to 5 keys. No card required.
canovix — vehicle registry200 · 3 ms
GET /v1/transport/vehicle_registry?county=CLUJ&limit=50
{
  "data": [{
    "county": "CLUJ",
    "manufacturer_canonical": "VOLKSWAGEN",
    "vehicle_count": 27877
  }, ],
  "pagination": { "total": 210, "has_next": true, "next_offset": 50 },
  "meta": {
    "last_updated": "2026-07-12T04:32:11Z",
    "source": "data.gov.ro/dataset/parc-auto-romania"
  }
}
Live from the API — built for civic-tech teams, newsrooms, and researchers
standardized datasets
domains
rows served
<50 msmedian response, cached reads
100%datasets with full provenance
What Canovix does

The same dataset, before and after.

Every publisher exports differently — ragged headers, mixed encodings, thousands separators in three formats. One universal rule set normalizes all of it.

parc-auto-la-31.12.2023.csvdata.gov.ro
Judet|Categorie|Marca|Descriere comerciala|Numar
CLUJ|AUTOTURISME|VOLKSWAGEN|"GOLF|27877
CLUJ|AUTOTURISME|DACIA|LOGAN  |31402
Bucure?ti|AUTOBUZ|IVECO|DAILY|n/a
Pipe delimiters · unescaped quotes · broken diacritics · null spellings
GET /v1/transport/vehicle_registry200 OK
{
  "county": "CLUJ",
  "manufacturer": "VOLKSWAGEN",
  "vehicle_count": 27877
}
Typed fields · snake_case names · real NULLs · validated rows only
Why Canovix exists

The data is public. Using it isn't easy.

Everything below is already free on data.gov.ro — as files. Canovix does the engineering between a download link and a dependable API, once, for everyone.

Government open dataraw files
  • CSV and Excel downloads, one file at a time
  • A different schema for every publisher
  • Manual cleaning after every update
  • Field names that change year to year
  • Broken encodings, five spellings of NULL
  • Raw files — no queries, no API
Canovixone API
  • One JSON REST API for everything
  • Standardized schema and types
  • Consistent snake_case naming
  • Filtering, sorting, and pagination built in
  • Validated values, real NULLs, clean text
  • Ready to integrate in minutes
How it works

From scattered files to one endpoint.

Government sources
data.gov.ro · CKAN
Ingestion
download + archive
Validation
bad rows quarantined
Standardization
one universal rule set
REST API
typed JSON · /v1
Your application
dashboards · agents · models
Every run is audited stage by stage — source URL, checksum, and pipeline version are queryable per dataset. Rows that fail validation are quarantined with reasons, never silently fixed.
Why teams build on it

Built to be boring, on purpose.

One schema, every dataset

Elections, school results, vehicle registries, budgets — all behind one predictable REST contract with consistent field names, types, filters, and pagination.

Standardized by rule

A single universal rule set cleans every dataset: null tokens, padding rows, both thousands conventions, Romanian date formats. No per-dataset exceptions.

Provenance on every row

Each dataset carries its ingestion record — source URL, checksum, pipeline version, import date — so you can cite exactly which government file a number came from.

Query surface

Everything is a query parameter.

Learn the contract once — every one of the datasets answers to the same six primitives.

Filtering

Any column is a filter, with Stripe-style operators: [gte], [lt], [in], [contains]. Unknown parameters are rejected, not ignored.

GET /v1/transport/vehicle_registry?county=CLUJ&vehicle_count[gte]=1000

Sorting

Multi-column sort with a - prefix for descending. Invalid sort fields return a 422, never a silent default.

GET /v1/transport/vehicle_registry?sort=-vehicle_count,county

Pagination

Offset pages with totals for UIs, opaque cursors for cheap deep iteration over millions of rows.

GET /v1/education/evaluare_nationala_24?limit=50&offset=100

Full-text search

Diacritic-insensitive search across the whole catalog — somaj finds șomaj.

GET /v1/search?q=somaj

Field selection

Project only the columns you need and keep payloads small.

GET /v1/transport/vehicle_registry?fields=county,vehicle_count

Metadata & discovery

Every dataset self-describes: columns, types, row count, sample rows, and the provenance of its latest ingestion.

GET /v1/datasets/vehicle_registry
Try it

See a response before you sign up.

Real endpoints, sample responses. Pick a dataset, run the request, read the exact envelope your code will get — then mint a key and run it for real.

API explorersample response
GET
/v1/transport/vehicle_registry?county=CLUJ&sort=-vehicle_count&limit=2
county=CLUJsort=-vehicle_countlimit=2Authorization: Bearer rok_…
{
  "data": [
    { "county": "CLUJ", "manufacturer_canonical": "VOLKSWAGEN", "vehicle_count": 27877 },
    { "county": "CLUJ", "manufacturer_canonical": "DACIA", "vehicle_count": 31402 }
  ],
  "pagination": { "total": 210, "count": 2, "has_next": true, "next_offset": 2 },
  "meta": { "dataset": "vehicle_registry", "source": "https://data.gov.ro/dataset/parc-auto-romania" }
}
Datasets

Every dataset behind one contract.

education

Baccalaureate results 2025

108k rows
GET /v1/education/rezultate_bacalaureat_sesiunea_iunie_2025
e.g.?medie[gte]=9&sort=-medie
transport

Vehicle registry

383k rows
GET /v1/transport/vehicle_registry
e.g.?county[in]=CLUJ,BIHOR&manufacturer[contains]=dacia
justice

Local election results 2020

673k rows
GET /v1/justice/alegeri_pentru_autoritatile_administratiei_publice_locale_2020
e.g.?uat_name[contains]=cluj
economy

Registered unemployment

monthly
GET /v1/economy/somaj2025
e.g.?sort=-rata_somajului&fields=county,rata_somajului
finance

Public enterprises

1.7k rows
GET /v1/finance/lista_intreprinderilor_publice_ip_monitorizate_la_nivelul_mf
e.g.?limit=100&count=false
geospatial

SIRUTA territorial registry

17k rows
GET /v1/geospatial/siruta
e.g.?locality[contains]=cluj
economy

CAEN nomenclature

decode table
GET /v1/economy/nomenclator_caen
e.g.?name[contains]=software
environment

Verified ETS emissions

yearly
GET /v1/environment/emisii_verificate_ets
e.g.?sort=-verified_emissions&limit=10
education

Evaluarea Națională 2024

yearly
GET /v1/education/evaluare_nationala_24
e.g.?nota_matematica[gte]=9.5
health

Bathing water quality

monitoring
GET /v1/health/calitatea_apei_de_imbaiere
e.g.?fields=bathingwateridentifier,qualityclass
population

Asylum applications

2019
GET /v1/population/asylum_applications
e.g.?origin_country[contains]=siria
energy

Anghel Saligny gas program

investments
GET /v1/energy/assd
e.g.?judetul[contains]=cluj
A sample of the catalog. Browse everything in the dataset reference or enumerate /v1/datasets at runtime.
Who it's for

Built for people who ship.

Developers

One predictable contract instead of two hundred file formats. Generate a client from the OpenAPI spec and never write another CSV parser.

AI agents

Machine-readable discovery at /v1/datasets: agents can enumerate the catalog, inspect schemas, and query clean JSON — no scraping, no guessing.

Civic tech

Build dashboards and watchdog tools on validated data, with provenance behind every number you publish.

Journalists

Filter, sort, and export to CSV in one request — and cite the exact government file, checksum included, behind every figure.

Researchers

Bulk NDJSON and CSV exports with typed columns and stable schemas, so year-over-year analysis doesn't start with cleanup.

Startups

Prototype on the free tier today, scale on metered plans later — without budgeting an engineer for data cleaning.

Under the hood

Production-grade by default.

OpenAPI spec
Full spec at /docs — generate clients, import into Postman.
Stable versioning
Everything lives under /v1; schemas evolve by adding columns, never breaking them.
Bearer authentication
Keys sent as Authorization: Bearer — only a sha256 hash is ever stored.
One response envelope
{data, pagination, meta, links} on every list endpoint, no exceptions.
Typed responses
Real integers, dates, and NULLs — not strings that look like numbers.
Caching built in
ETag/304 conditional requests, gzip, and Last-Modified on every dataset.
Streaming exports
CSV and NDJSON exports that accept the same filters as the list endpoints.
Transparent limits
X-RateLimit headers on every response; 429s tell you exactly when to retry.
Built onPostgreSQLRESTJSONOpenAPIRedis cacheAutomated ingestionStandardized datasets
Pricing

Start free. Pay for volume, nothing else.

Every plan includes the full catalog — every dataset, filtered exports, and provenance. Plans differ only in how much you can call.

Free

€0/month
  • 10,000 requests / month
  • 60 requests / minute
Start free

Starter

€19/month
  • 100,000 requests / month
  • 120 requests / minute
Create account

Pro

Popular
€59/month
  • 1,000,000 requests / month
  • 300 requests / minute
Create account

Business

€199/month
  • 10,000,000 requests / month
  • 1,200 requests / minute
Create account

Enterprise

Custom
  • Custom volume
  • 6,000+ requests / minute
Contact us

Every plan runs on an account — create a free one (up to 5 keys and a live usage dashboard, no card) and start calling right away. For a paid plan, create the account then email us to upgrade: your existing keys move to the new limits in place, nothing changes in your integration. Self-serve billing is on the way; Enterprise is bespoke, so talk to us.

Quickstart

Live in three requests.

1
Create a free account
No card required. Sign up, mint an API key in your dashboard, and get 10k calls a month on the free tier.
2
Call an endpoint
Send the key as a bearer token. Every dataset speaks the same JSON: filters, sorting, pagination, exports.
3
Ship
An OpenAPI spec for codegen or Postman, streaming CSV/NDJSON exports, and docs with curl, Python, and JavaScript examples.
Terminal
$ curl "/v1/economy/somaj2025?county=CLUJ" \
  -H "Authorization: Bearer rok_…"
{
  "data": [ … ],
  "pagination": { "total": 1, "has_next": false },
  "meta": { "api_version": "v1" }
}

Start free. Your keys, your dashboard.

Create a free account to mint up to 5 API keys, revoke them anytime, and watch your usage live — 10k calls a month, no card required.

  • Keys are shown once and stored only as hashes
  • Live usage chart — per day and against your quota
  • Delete your account (and all its data) anytime

Questions, answered.

How fresh is the data?

Every response is served from the latest successful ingestion of its source file, and each dataset's provenance (source URL, checksum, import date) is available at /v1/datasets/{id}. Sources are re-ingested as they change upstream — most government datasets update monthly or yearly.

What does the free tier include?

10,000 calls a month across every dataset at 60 requests/minute, with up to 5 API keys and a live usage dashboard — no card required. Paid plans raise both limits, starting at €19/month for 100,000 calls.

How do I upgrade to a paid plan?

Create a free account, then email contact@canovix.ro with the plan you want — we upgrade your account and every key on it moves to the new limits in place, so nothing changes in your integration. Self-serve billing is on the roadmap; Enterprise is bespoke, so contact us.

How do I authenticate?

Create a free account, mint an API key in your dashboard, and send it as a bearer token in the Authorization header (Authorization: Bearer rok_…). Only a hash of the key is stored server-side.

Is the data official?

Yes — it comes straight from data.gov.ro's open datasets under their open licenses. We standardize names, types, and formats, but never alter the underlying figures; rows that fail validation are quarantined, not silently fixed.

Can I get the raw data too?

Every dataset has a streaming export endpoint (CSV or NDJSON) that accepts the same filters as the list endpoint — one request, no pagination.

Ship on Romanian open data today.

Free account — 10k calls a month, up to 5 keys, no card. Sign up, mint a key in your dashboard, and make your first call in minutes.