data.public.lu API
Free Luxembourg open data API with no key: national datasets on the uData platform, with descriptions in French, German and English and rich per-dataset quality metrics. Tested example.
Endpoint tested and returned HTTP 200 on 2026-08-21
What is the data.public.lu API?
data.public.lu is Luxembourg's national open data portal, running the open-source uData platform with a free, key-free REST API. It serves national and municipal datasets with multilingual descriptions and per-dataset quality scoring, using page-based pagination rather than CKAN's row offsets.
uData is the platform behind France's data.gouv.fr, and Luxembourg runs the same software, so anything you write here ports directly. The API is conventionally REST rather than CKAN's action-call style: `/api/1/datasets/` lists, `/api/1/datasets/{id}/` fetches one, and results arrive under a `data` key with `page`, `page_size` and `next_page` alongside. That is a friendlier shape than `package_search`, and the OpenAPI specification is published, so clients can be generated rather than hand-written.
Luxembourg's own flavour shows in the content. Descriptions are frequently long-form and multilingual — the CFL Mobility record documents its entire column layout in French inside the description field — reflecting a country that operates in French, German and Luxembourgish with English as a working language. The catalogue is small compared to its neighbours but skews practical: transport, geodata, environment and administrative registers rather than bulk statistical dumps. Every record also carries `archived`, `deleted` and `badges`, so you can filter out retired datasets that a plain search would otherwise return.
Quick facts
- Base URL
https://data.public.lu/api/1- Authentication
- No API key for reads. An API key is only needed to publish or modify datasets, which requires a portal account.
- Rate limit
- No published limit. Page sizes are capped by the platform.
- Pricing
- Free. Most datasets are CC BY or CC0; check the licence field on each record.
- CORS
- Enabled — callable directly from browser JavaScript
- Official docs
- Read the docs
How to use the data.public.lu API
Every request below was executed against the live API on 2026-08-21, and the response shown is the real body it returned — not an illustration.
1. List Luxembourg open datasets
GET https://data.public.lu/api/1/datasets/?page_size=1
curl 'https://data.public.lu/api/1/datasets/?page_size=1'const res = await fetch("https://data.public.lu/api/1/datasets/?page_size=1");
if (!res.ok) throw new Error(`Request failed: ${res.status}`);
const data = await res.json();
console.log(data);import requests
res = requests.get("https://data.public.lu/api/1/datasets/?page_size=1", timeout=20)
res.raise_for_status()
print(res.json()){
"data": [
{
"acronym": "CFL Mobility",
"archived": null,
"badges": [],
"contact_point": null,
"created_at": "2024-09-10T13:50:33.451000+00:00",
"deleted": null,
"description": "L’objectif premier est ici de fournir la liste des véhicules FLEX disponibles et de décrire la dernière station connue par véhicule. \n\nLes champs repris dans ce documents sont les suivants:\n\n- car_type\t\t: Type de voiture\t\t(Ex.: Small Car, Transporter, …)\n- fuel_type\t\t: Type de carburant\t\t(Ex.:Diesel, Electric, Super petrol)\n- available\t\t: Disponibilité de la voiture\t(TRUE)\n- brand_name\t\t: Marque de voiture\t\t(Ex.:Audi, BMW, VW, Mini, …)\n- model_name\t\t: Modèle de voiture\t\n- station_name\t\t: Nom de la station\t\n- station_town\t\t: Ville/village de la station\t\n- station_zipcode\t\t: Code postal de la station\t\n- station_street\t\t: Rue de la station\t\n- station_streetnumber\t: N° de rue de la station\t\n- station_latitude\t: Point GPS Latitude\t\n- station_longitude\t: Point GPS Longitude\t\n- createdDate\t\t: Date et heure de création du fichier\t\n\nLes coordonnées GPS montrent la position exacte de la station, l'adresse peut différer de la position réelle.",
"extras": {},
"frequency": "continuous",
"frequency_date": null,
"harvest": null,
"id": "66e03289744a07b26071baab",
"internal": {
"created_at_internal": "2024-09-10T13:50:33.451000+00:00",
"last_modified_internal": "2026-08-21T07:55:22.116000+00:00"
},
"last_modified": "2026-08-21T07:55:22.116000+00:00"Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
page_size | query | Optional | Datasets per page. 1 |
page | query | Optional | Page number, one-based. 2 |
q | query | Optional | Free-text search across titles and descriptions. mobilité |
organization | query | Optional | Filter by publishing organisation ID. cfl |
tag | query | Optional | Filter by tag. transport |
sort | query | Optional | Sort key, prefixed with `-` for descending. -created |
Response fields
dataarray- The datasets. uData wraps results in `data`, not CKAN's `result.results`.
data[].title / descriptionstring- Title and a long-form description, often documenting the file's column layout in French.
data[].acronymstring- Short name where the publisher supplied one.
data[].archived / deletedstring or null- Non-null marks a retired dataset. Filter these out before displaying results.
data[].badgesarray- Portal quality markers, such as designation as a reference dataset.
data[].created_atstring- ISO 8601 with a UTC offset, unlike CKAN's naive timestamps.
data[].extrasobject- Publisher-supplied extension fields; frequently empty.
page / page_size / next_pageinteger and string- Page-based pagination — increment `page`, do not compute offsets.
What you can build with the data.public.lu API
- Search Luxembourg transport and geodata programmatically
- Reuse a data.gouv.fr client against a second uData portal
- Filter out archived datasets before showing search results
- Harvest Luxembourg metadata into a cross-border catalogue
Common errors and how to fix them
404 on /api/3/action/...
This is uData, not CKAN.
Fix: Use `/api/1/datasets/`. CKAN action-style paths do not exist on this platform.
Retired datasets in results
Archived and deleted records are returned by default.
Fix: Filter client-side on `archived` and `deleted` being null.
Pagination misses records
`page` is one-based and page-oriented.
Fix: Increment `page` by one per request; there is no offset parameter to compute.
Description renders as a wall of text
Publishers document column layouts inside the description.
Fix: Render it as pre-formatted text, or truncate to the first paragraph for list views.
data.public.lu API — frequently asked questions
Is the data.public.lu API free?
Yes. Reads need no key. An API key is required only to create or modify datasets, which needs a portal account.
Is this the same API as data.gouv.fr?
Effectively yes — both run uData, so the `/api/1/` routes, response envelope and pagination are identical. A client written for one works against the other by changing the hostname.
What languages is the metadata in?
Mostly French, with German and English appearing depending on the publisher. Luxembourg operates multilingually, so do not assume any single language is always populated.
How do I avoid showing withdrawn datasets?
Check `archived` and `deleted` on each record — the API returns them alongside live datasets, and only filters them if you ask. Both being null means the dataset is current.
Tools that pair with this API
CSV to JSON Converter
Convert CSV to a JSON array of objects online. Header-row detection, comma/semicolon/tab delimiters and pretty-printed output — 100% in your browser.
JSON Path Finder
Evaluate a dot/bracket path against your JSON and list every leaf path for discovery. Free online JSON path finder that runs 100% in your browser.
JSON to CSV Converter
Convert a JSON array of objects to CSV online. Automatic column headers from the union of all keys, delimiter choice and proper quoting — all in-browser.
data.public.lu is an independent third-party service and is not affiliated with ByteTools or ByteVancer. Details on this page were verified on 2026-08-21; always check the official documentation before relying on this API in production, as terms and limits can change.