EU Open Data Search avatar

EU Open Data Search

Pricing

$2.00 / 1,000 dataset record returneds

Go to Apify Store
EU Open Data Search

EU Open Data Search

Pricing

$2.00 / 1,000 dataset record returneds

Rating

0.0

(0)

Developer

Igor Lima

Igor Lima

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

8 hours ago

Last modified

Share

eu-open-data-search

Search the EU Open Data Portal (1.7 million datasets, measured 16 Sep 2026, harvested from dozens of national catalogues) and get back flat, clean JSON.

The portal's own API answers with records that carry every title in 24 languages, nest the licence three levels down inside each distribution, and include the publisher's contact e-mail. This unit returns one record per dataset, in the language you asked for, with the licence resolved and no personal data in it at all.

Input

Every field is optional. With no input you get the 20 most relevant datasets on the portal.

{
"query": "air quality",
"country": ["be", "nl"],
"catalogue": ["data-gov-be"],
"categories": ["ENVI"],
"formats": ["CSV", "JSON"],
"licenses": ["CC_BY_4_0"],
"language": "en",
"max_results": 20
}
FieldMeaning
queryfull-text search over titles, descriptions and keywords
countrylowercase country codes as the portal uses them (be, de, fr, …)
cataloguesource catalogue id (data-gov-be, govdata, datos-gob-es, …)
categoriesEU data theme codes (ENVI, TECH, AGRI, SOCI, EDUC, …)
formatsdistribution formats (CSV, JSON, XLSX, SHP, PDF, …)
licenseslicence ids as published by the portal (CC_BY_4_0, …)
languagewhich language to collapse multilingual titles to; falls back to English, then to whatever the publisher provided
max_results1 to 500

Output

{
"unit": "eu-open-data-search",
"version": "1.0.0",
"generated_at": "2026-09-16T15:30:00Z",
"source": { "portal": "data.europa.eu", "portal_metadata_license": "CC0-1.0", "...": "..." },
"query": { "...": "echoed back, so a stored result explains itself" },
"total_matches": 269,
"returned": 2,
"datasets": [
{
"id": "https-www-odwb-be-explore-dataset-belaqi-qualite-air-issep-",
"title": "BelAQI Index - Belgian Air Quality Index",
"description": "The dataset presents air quality according to the BelAQI index...",
"portal_url": "https://data.europa.eu/data/datasets/...?locale=en",
"landing_page": "https://www.odwb.be/explore/dataset/belaqi-qualite-air-issep/information/",
"publisher": "City of Liège",
"catalogue_id": "data-gov-be",
"country_code": "BE",
"country_label": "Belgium",
"categories": ["AGRI"],
"keywords": ["environnement", "air"],
"languages": ["fr"],
"issued": "2024-04-15T00:00:00",
"modified": "2026-09-08T01:05:14.968Z",
"high_value_dataset": false,
"formats": ["CSV", "JSON", "PARQUET", "SHP", "XLSX", "..."],
"licenses": [
{ "id": "CC_BY_4_0", "label": "Creative Commons Attribution 4.0 International",
"uri": "http://spdx.org/licenses/CC-BY-4.0" }
],
"attribution_required": "yes",
"distribution_count": 15
}
]
}

esquema.json is the contract. If it changes, this is a new version, not a fix.

Licensing and attribution

Portal metadata is dedicated to the public domain under CC0 1.0 (https://data.europa.eu/en/legal-notice). Individual datasets keep their own licence, which is why every record carries licenses and attribution_required:

  • "yes" — the licence asks for credit. Attribute the publisher.
  • "no" — a public-domain dedication, no credit required.
  • "unknown" — the source published no licence for this dataset. It is never reported as "no" by default: an absent licence is not a permissive one.

No personal data

Upstream records contain contact_point and creator fields with people's names and e-mail addresses. This unit builds its output field by field from an allowlist, so those fields cannot travel through it, and it redacts e-mail addresses out of free text as well. publisher is emitted only when the source types it as an organisation. The smoke test asserts all of this on every run.

Rate limiting

The portal publishes no rate limit. This unit self-throttles to one request per second, walks at most 20 pages per call, and honours Retry-After on HTTP 429. Nothing here works around a limit, a login, or a bot check — it is the official documented API over plain HTTP, with no browser involved.

Running it

python main.py '{"query": "air quality", "max_results": 5}' # or pipe JSON on stdin
python conferir.py output.json # validate against the schema
python fumaca.py # live end-to-end check