BYTETOOLS

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.

No API key requiredCORS enabledHTTPSFree tier

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
curl 'https://data.public.lu/api/1/datasets/?page_size=1'
JavaScript (fetch)
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);
Python (requests)
import requests

res = requests.get("https://data.public.lu/api/1/datasets/?page_size=1", timeout=20)
res.raise_for_status()
print(res.json())
Response — HTTP 200 (truncated)
{
  "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

ParameterTypeRequiredDescription
page_sizequeryOptionalDatasets per page. 1
pagequeryOptionalPage number, one-based. 2
qqueryOptionalFree-text search across titles and descriptions. mobilité
organizationqueryOptionalFilter by publishing organisation ID. cfl
tagqueryOptionalFilter by tag. transport
sortqueryOptionalSort 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

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.