Skip to main content

xippios-eurostat

Typed Python client, MCP server and FastAPI routes for Eurostat dissemination API, part of the xippios SDK family. Names and semantics follow the upstream documentation; every response carries release metadata (source, endpoint, retrieved_at, published_at, vintage).

Install

uv add xippios-eurostat            # client only
uv add "xippios-eurostat[mcp]"     # + MCP server
uv add "xippios-eurostat[http]"    # + FastAPI router

No API key is needed.

30-second example

from xippios.eurostat import get_data

milk = get_data("apro_mk_cola", {"geo": "AT", "time": ["2022", "2023"]})
cube = milk.data  # the JSON-stat 2.0 dataset, member by member
cube.id  # ["freq", "milkitem", "dairyprod", "unit", "geo", "time"]
cube.size  # [1, 3, 10, 2, 1, 2]: codes per dimension
cube.value["40"]  # 3247.05: cell 40, row-major over size, the last dimension fastest
cube.status["64"]  # "|C": confidential, as cube.extension["status"]["label"] names it
first = next(cube.observations())  # one cell with its codes and labels
first.codes  # {"freq": "A", "milkitem": "PRD", "dairyprod": "D1110D", "unit": "THS_T", ...}
first.labels["dairyprod"], first.value  # "Raw cows' milk delivered to dairies", 3247.05
milk.meta.published_at  # 2026-10-05 23:00+02:00: the dataset's last update, `updated`
milk.meta.vintage  # "2026-10-05T23:00:00+0200": the same, as Eurostat prints it
milk.meta.request  # {"dataset": "apro_mk_cola", "filters": {...}, "lang": "EN"}

get_data(dataset, filters=None, *, lang=Lang.EN, since_time_period=None, until_time_period=None, last_time_period=None, geo_level=None) sends one request to the Statistics API (statistics/1.0/data/{datasetCode}). A DS- dataset, Comext trade or Prodcom production, is requested on Eurostat's Comext base, every other on the main base; the call and its answer are the same, and a value is the text Eurostat prints where a Prodcom indicator is a unit or a flag:

oil = get_data(
    "DS-059358",  # Prodcom: sold production, exports and imports
    {"reporter": "AT", "product": "10411200"},  # fish and marine oils, NACE 10.41
    since_time_period="2022",
    until_time_period="2023",
)
oil.data.id  # ["freq", "reporter", "product", "indicators", "time"]
oil.data.value["6"], oil.data.value["12"]  # 349477 (EXPVAL 2022), "KG" (QNTUNIT 2022)

filters maps any dimension of the dataset to one code or a list of codes ({"geo": "AT", "milkitem": "PRD"}); a time filter selects periods, and so do since_time_period, until_time_period and last_time_period. Eurostat accepts one time parameter per query, the one exception being since_time_period with until_time_period; any other combination is refused before sending. lang takes Lang.EN, Lang.FR or Lang.DE and geo_level a GeoLevel (aggregate, country, nuts1, nuts2, nuts3, city), both in xippios.eurostat.models; a plain string such as "FR" works too. A code that matches nothing gives an empty cube, size 0 on that dimension. meta.published_at is the cube's updated with Eurostat's zone; one printed without a zone, never seen, is kept as printed with meta.published_at_naive set, and meta.vintage holds the text either way. An unknown dataset, and Eurostat's "No results found", raise NotFoundError; a query Eurostat refuses or judges too large raises InvalidRequestError with Eurostat's message and how to narrow it. A query Eurostat would answer asynchronously raises it too: this package does not poll asynchronous answers, and the Statistics API's own route is to send the same request again later. Ask for small slices: the cube comes back whole, and over MCP a result above 64 KB is replaced by a preview and a note.

Slices

from xippios.eurostat import get_cross_section, get_latest_period, get_series

milk = {"milkitem": "PRD", "dairyprod": "D1110D", "unit": "THS_T"}
series = get_series("apro_mk_cola", {**milk, "geo": "AT"}, since="2015", until="2023")
[(o.codes["time"], o.value) for o in series.data]  # [("2015", 3102.56), ..., ("2023", 3242.85)]
latest = get_latest_period("apro_mk_cola", {**milk, "geo": "AT"})
latest.data[0].codes["time"], latest.data[0].value  # ("2025", 3503.31)
section = get_cross_section("apro_mk_cola", "2023", milk)  # every geo code the dataset holds
len(section.data)  # 36: the geo codes with a value or a status in 2023
section.meta.request  # {"dataset": "apro_mk_cola", "filters": {..., "time": "2023"}, "lang": "EN"}

Each slice sends one get_data request and returns the cube's observations as a list of Observation, with get_data's meta: meta.request names what was sent (since_time_period, last_time_period, the time filter). get_series(dataset, filters, *, since=None, until=None, lang=Lang.EN) wants every dimension but time pinned to one code; an answer that spans more than one series raises InvalidRequestError naming each dimension still open and its codes. get_latest_period(dataset, filters=None, *, lang=Lang.EN) asks for lastTimePeriod=1, the most recent period, and get_cross_section(dataset, period, filters=None, *, lang=Lang.EN) for time=<period>; both return any number of series in cube order. Each refuses a time filter before sending, since it selects the periods itself, and get_cross_section an empty period. A code that matches nothing gives an empty list. Over MCP each slice keeps the family's cap, 200 rows or 64 KB, with a note of its own on how to see the rest.

Prodcom production

from xippios.eurostat import get_sold_production, get_total_production, list_products

soya = list_products(search="soya")  # the PRODCOM products, without a request
soya.data[0]  # Code(code="10412100", label="Crude soya-bean oil and its fractions ...")
oil = get_sold_production("10411200", reporters=["AT"], since="2022", until="2023")
values = {(o.codes["indicators"], o.codes["time"]): o.value for o in oil.data}
values["EXPVAL", "2023"], values["QNTUNIT", "2023"]  # 415790 (euro), "KG"
oil.meta.request  # {"dataset": "DS-059358", "filters": {"reporter": ["AT"], ...}, ...}
manure = get_total_production("20158000", reporters=["AT"], since="2022", until="2023")
[(o.codes["indicators"], o.codes["time"], o.value) for o in manure.data][:2]
# [("APRODQNT", "2022", 84470389), ("APRODQNT", "2023", 14769157)], in QNTUNIT "KG"

Eurostat's Prodcom statistics, production of manufactured goods, food and agricultural inputs among them, are served on the Comext base. get_sold_production(product, reporters=None, since=None, until=None, indicators=None) reads DS-059358, sold production, exports and imports, and get_total_production(...) DS-059359, total production, one product at a time: each sends one get_data request and returns the cube's observations in cube order with get_data's meta. reporters are country codes (["AT"]), since and until years, and indicators the measures (PRODVAL, PRODQNT in QNTUNIT, EXPVAL, EXPQNT, IMPVAL, IMPQNT for DS-059358; APRODQNT in QNTUNIT for DS-059359), None for every one. A value is a number, or the text Eurostat prints for a unit or a flag ("KG", ":E"). The product is checked against the dataset's product list packaged with this version, each reporter against CXT_FREE_ISO, Comext's list of reporters and partners, and each indicator against the whole CXT_INDICATORS list, before sending: a code they lack raises UnknownCode naming the closest. CXT_INDICATORS also holds the indicators of the other dataset and of Comext's trade datasets, so one the dataset lacks (PRODVAL for DS-059359) passes the check and Eurostat answers it with an empty cube, an empty list. A reporter the list holds and the dataset lacks is Eurostat's to answer, as the indicator was; no such answer is recorded. list_products(search=None) lists DS-059358's products (CXT_PRODCOM2_SOLD), eight-digit codes that start with their NACE class (1041 oils and fats, 2015 fertilisers); DS-059359 covers a few hundred of them, chiefly chemicals, fertilisers and metals, which list_codes("cxt_prodcom2_total") lists. Over MCP the production tasks keep the family's cap, 200 rows or 64 KB, with a note naming reporters, indicators and since, and eurostat_list_products takes up to 1,000 rows within 64 KB, with a note naming search.

Comext trade

from xippios.eurostat import get_trade, get_trade_hs, list_cn8, list_hs

list_cn8(search="crude soya-bean oil").data[1]
# Code(code="15071090", label="Crude soya-bean oil, whether or not degummed (excl. for ...")
list_hs(search="soya").data[0]  # Code(code="1201", label="Soya beans, whether or not broken")
oil = get_trade("15071090", reporters=["AT"], partners=["DE"], since="2023-01", until="2023-12")
values = {(o.codes["flow"], o.codes["indicators"], o.codes["time"]): o.value for o in oil.data}
values["2", "VALUE_IN_EUROS", "2023-12"]  # 305451: Austria's exports to Germany, in euro
values["2", "QUANTITY_IN_100KG", "2023-12"]  # 3372.15, in 100 kg
oil.meta.request  # {"dataset": "DS-045409", "filters": {"freq": "M", "reporter": ["AT"], ...}, ...}
heading = get_trade_hs("1507", reporters=["AT"], partners=["DE"], since="2023-12", until="2023-12")
[(o.codes["flow"], o.codes["indicators"], o.value) for o in heading.data][:2]
# [("1", "VALUE_EUR", 1222), ("1", "VALUE_NAC", 1222)]: imports of soya-bean oil, HS 1507

Eurostat's Comext trade statistics, the EU side of the trade picture, are served on the Comext base. get_trade(product, reporters=None, partners=None, flow=None, since=None, until=None, freq=Freq.M, indicators=None) reads DS-045409, EU trade since 1988 by HS2-4-6 and CN8, and get_trade_hs(...), with the same parameters, DS-059341, international trade of EU and non-EU countries since 2002 by HS2-4-6, one product at a time: each sends one get_data request and returns the cube's observations in cube order (reporter, partner, flow, indicator, oldest period first) with get_data's meta. product is an eight-digit CN code ("15071090", crude soya-bean oil) or an HS chapter, heading or subheading ("15", "1507", "150710"); reporters and partners are country codes of CXT_FREE_ISO (["AT"], ["DE", "US"]), which holds aggregates too ("EU27_2020_EXTRA", "WORLD"); flow is "1" for imports and "2" for exports, None for both; freq "M" for monthly periods (since="2023-01") or "A" for annual ones (since="2023"), Freq.M and Freq.A in xippios.eurostat.models; indicators the measures, VALUE_IN_EUROS, QUANTITY_IN_100KG and SUPPLEMENTARY_QUANTITY in DS-045409, VALUE_EUR, VALUE_NAC and QUANTITY_KG in DS-059341, None for every one. Every code is checked against the lists packaged with this version before sending, the product against CXT_NC, the reporters and partners against CXT_FREE_ISO, the flow against CXT_EU_FLUX and the indicators against CXT_INDICATORS: a code they lack raises UnknownCode naming the closest. DS-059341's product list is CXT_NC too, so a CN8 code passes the check for get_trade_hs, and DS-059341 answers one asynchronously (HTTP 413 ASYNCHRONOUS_RESPONSE), which this package does not poll: InvalidRequestError; give it an HS code. list_cn8(search=None) and list_hs(search=None) list CXT_NC's codes by length, the eight-character ones and the two-, four- and six-character ones, without a request (list_codes("cxt_nc") lists them all, TOTAL with them); a code with letters in it ("1507XXXX", "15SSS421") is Eurostat's position for trade no regular code holds (not elsewhere specified, confidential), as its label says. Over MCP the trade tasks keep the family's cap, 200 rows or 64 KB, with a note naming partners, indicators, since and freq, and eurostat_list_cn8 and eurostat_list_hs take up to 1,000 rows within 64 KB, with a note naming search.

Datasets and codes

from xippios.eurostat import list_codes, list_datasets

milk = list_datasets(search="milk")  # 18 leaves of the table of contents
cola = list_datasets(search="apro_mk_cola").data[0]
cola.code, cola.type  # ("apro_mk_cola", "dataset")
cola.title  # "Production of main cows' milk products - annual data"
cola.path  # "Database by themes > Agriculture, forestry and fisheries > ... > Milk and milk products"
cola.last_update, cola.data_start, cola.data_end  # ("05.10.2026", "1968", "2025"), as printed
milk.meta.vintage, milk.meta.published_at  # "20261028T1000", 2026-10-28 10:00 without a zone
austria = list_codes("geo", search="austria")
austria.data  # [Code(code="AT", label="Austria")]
austria.meta.vintage, austria.meta.published_at  # "28.0", 2026-03-25 23:00+01:00
list_codes("unit", search="THS_T").data[0]  # Code(code="THS_T", label="Thousand tonnes")

Both answer from lists packaged with this version, without a request: meta.retrieved_at is when the package fetched the list, meta.endpoint the operation it came from. list_datasets(search=None) reads Eurostat's table of contents (catalogue/toc/xml): every dataset and pre-defined table of the navigation tree, over 10,000 leaves, one per listing in the tree, each with its code, type, English title, the folders above it (path, joined with " > "), its last update and structure change, its first and last period and its number of values as Eurostat prints them. meta.vintage is the table of contents' creationDate as printed and meta.published_at the same time, which Eurostat prints without a zone, so meta.published_at_naive is set. list_codes(codelist, search=None) reads one of eighteen SDMX codelists (sdmx/2.1/codelist/ESTAT/<ID>, English labels): FREQ, GEO, UNIT, CROPS, STRUCPRO, MILKITEM, DAIRYPROD, STATINFO, LEG_FORM, FARMTYPE, SO_EUR and UAAREA, the codelists of the dimensions of apro_cpnh1, apro_mk_cola and ef_m_farmleg, named as the dimension is ("geo", case-insensitive); and from the Comext base CXT_PRODCOM2_SOLD, CXT_PRODCOM2_TOTAL and CXT_INDICATORS, the product and indicators codes of the Prodcom datasets, and CXT_NC, CXT_FREE_ISO and CXT_EU_FLUX, the product, reporter and partner, and flow codes of the Comext trade datasets, whose meta.endpoint is the codelist's full URL there. meta.vintage is the codelist's version and meta.published_at its last update, None for CXT_EU_FLUX, which names none. Another name raises UnknownCode naming the closest packaged codelists. search keeps the records whose code or title (label) contains the text, ignoring case. Over MCP eurostat_list_datasets keeps the family's cap and eurostat_list_codes takes up to 1,000 codes within the family's 64 KB, so every packaged codelist but GEO, the two PRODCOM product lists and CXT_NC comes whole; both notes name search.

Bulk download

from pathlib import Path

from xippios.eurostat import download_dataset
from xippios.eurostat.parse import parse_sdmx_csv

milk = download_dataset(
    "apro_mk_cola", "A...THS_T.AT", since="2022", until="2023", dest=Path("milk.csv.gz")
)
milk.data.path  # PosixPath("milk.csv.gz"): the gzip-compressed SDMX-CSV file
milk.data.bytes  # 335
milk.data.filename  # "estat_apro_mk_cola_filtered_en.csv.gz", Eurostat's name for it
milk.meta.vintage  # "05/10/26 23:00:00": LAST UPDATE as printed, day first
milk.meta.published_at  # 2026-10-05 23:00 without a zone, meta.published_at_naive set
rows = parse_sdmx_csv(milk.data.path)  # one SdmxCsvRow per observation, read lazily
first = next(rows)
first.dimensions  # {"freq": "A", "milkitem": "PRD", "dairyprod": "D1110D", ...}
first.time_period, first.obs_value  # ("2022", Decimal("3247.05"))

download_dataset(dataset, key="", *, since=None, until=None, last_n_observations=None, dest) sends one SDMX 2.1 data query (dataQuery, sdmx/2.1/data/{flowRef}/{key}) with format=SDMX-CSV and compressed=true and streams the answer to dest, never holding it in memory or caching it; it returns core's Downloaded (path, size, content type, Eurostat's file name, retrieval time). It is a bulk task: Python only, so the MCP server and the router skip it and no agent is handed a file path. key is Eurostat's series key, the dimensions but time in the dataset's order, dot-separated, empty for every code of a dimension, + between codes ("A...THS_T.AT+DE"); "" downloads the whole dataset. since, until and last_n_observations are Eurostat's startPeriod, endPeriod and lastNObservations. meta.vintage is the file's LAST UPDATE as printed and meta.published_at the same time, which Eurostat prints without a zone; both are None for a file without a row. A query Eurostat would answer asynchronously, or refuses as too large, raises InvalidRequestError naming how to narrow it. parse_sdmx_csv(path) reads the file, gzip-compressed or plain, row by row: each SdmxCsvRow has the dataflow, the last_update, the dimensions in column order, the time_period, the obs_value as a Decimal, or as the text printed where it is no number (Prodcom's "KG", ":E"), None when empty, obs_flag, conf_status and any other attributes of the dataset, as Eurostat prints them. A DS- dataset is downloaded from the Comext base, key in its own dimensions' order ("A.AT.10411200." for DS-059358); a Comext trade dataset is served filtered only, a Prodcom dataset whole as well.

from xippios.eurostat import download_trade

oil = download_trade(
    "15071090", reporters=["AT"], since="2023-01", until="2023-12", dest=Path("oil.csv.gz")
)
oil.meta.request["key"]  # "M.AT..15071090..": every partner, both flows, every indicator

download_trade(product=None, reporters=None, partners=None, flow=None, since=None, until=None, freq=Freq.M, indicators=None, *, dest) is the second bulk task, Python only as well: it builds DS-045409's series key from get_trade's arguments in the dataset's order, freq.reporter.partner.product.flow.indicators, + between codes and an empty position for an argument left None, checks every code as get_trade does, and downloads the file as download_dataset does; meta.request records the arguments and the key sent. product or reporters is required, since Eurostat serves no Comext trade dataset whole; a query too large for Eurostat to answer at once (500,000 cells, the product of the codes each position matches) raises InvalidRequestError naming how to narrow it. download_dataset("DS-045409", key) takes a key of your own.

MCP

{
  "mcpServers": {
    "eurostat": {
      "command": "uvx",
      "args": ["--from", "xippios-eurostat[mcp]", "xippios-eurostat-mcp"]
    }
  }
}

Tools are read-only and named eurostat_<verb>_<noun>. Results are capped, at 200 rows or 64 KB unless a tool has a cap of its own, with a note on how to see the rest. --http serves streamable HTTP instead of stdio.

Status

Upstream operation Task function MCP tool Status
getData (statistics/1.0/data/{datasetCode}) get_data(dataset, filters), a JSON-stat cube eurostat_get_data alpha
getData with sinceTimePeriod and untilTimePeriod get_series(dataset, filters, since, until), one series as observations in cube order, which runs oldest period first in every recorded cube eurostat_get_series alpha
getData with lastTimePeriod=1 get_latest_period(dataset, filters), the observations of the most recent period eurostat_get_latest_period alpha
getData with time get_cross_section(dataset, period, filters), the observations of one period eurostat_get_cross_section alpha
getTocXml (catalogue/toc/xml), packaged list_datasets(search), the datasets and tables of the table of contents eurostat_list_datasets alpha
codeListQuery (sdmx/2.1/codelist/ESTAT/{resourceID}), packaged list_codes(codelist, search), the codes of one of eighteen codelists, six of them the Comext base's eurostat_list_codes alpha
codeListQuery (sdmx/2.1/codelist/ESTAT/CXT_PRODCOM2_SOLD, Comext base), packaged list_products(search), the PRODCOM products of DS-059358 eurostat_list_products alpha
getData on DS-059358 (Comext base) get_sold_production(product, reporters, since, until, indicators), Prodcom's sold production, exports and imports of one product as observations eurostat_get_sold_production alpha
getData on DS-059359 (Comext base) get_total_production(product, reporters, since, until, indicators), Prodcom's total production of one product as observations eurostat_get_total_production alpha
dataQuery (sdmx/2.1/data/{flowRef}/{key}), SDMX-CSV download_dataset(dataset, key, dest), a gzip-compressed SDMX-CSV file on disk none: a bulk task, Python only, which the adapters skip alpha
codeListQuery (sdmx/2.1/codelist/ESTAT/CXT_NC, Comext base), packaged list_cn8(search), the eight-digit CN codes of the trade datasets eurostat_list_cn8 alpha
codeListQuery (sdmx/2.1/codelist/ESTAT/CXT_NC, Comext base), packaged list_hs(search), the HS chapters, headings and subheadings of the trade datasets eurostat_list_hs alpha
getData on DS-045409 (Comext base) get_trade(product, reporters, partners, flow, since, until, freq, indicators), EU trade in one CN8 or HS product as observations eurostat_get_trade alpha
getData on DS-059341 (Comext base) get_trade_hs(product, reporters, partners, flow, since, until, freq, indicators), trade of EU and non-EU countries in one HS product as observations eurostat_get_trade_hs alpha
dataQuery on DS-045409 (Comext base), SDMX-CSV download_trade(product, reporters, partners, flow, since, until, freq, indicators, dest), DS-045409's slice as a gzip-compressed SDMX-CSV file on disk none: a bulk task, Python only, which the adapters skip alpha

Five of these fifteen tasks choose the base URL by the dataset's code: get_data, the three slices and download_dataset request a dataset whose code starts with DS-, Eurostat's Comext and Prodcom datasets, on https://ec.europa.eu/eurostat/api/comext/dissemination, and every other on the main base URL, https://ec.europa.eu/eurostat/api/dissemination. The two production tasks, get_sold_production and get_total_production, and the three trade tasks, get_trade, get_trade_hs and download_trade, always request the Comext base, which serves Prodcom's DS-059358 and DS-059359 and Comext's DS-045409 and DS-059341. list_codes lists eighteen packaged codelists, twelve of the main base and six of the Comext base; list_products lists the Comext base's list of sold-production products, CXT_PRODCOM2_SOLD, and list_cn8 and list_hs the trade datasets' products, CXT_NC. list_datasets lists the main base's table of contents only, and does not list the Comext or Prodcom datasets: the Comext base answers catalogue/toc/xml with HTTP 404 (probed 2026-10-28), though its WADL lists it. Not covered: polling an asynchronous answer, which is refused with how to narrow the query; SDMX-ML and TSV; codelists other than the eighteen packaged ones, which list_codes refuses naming the closest.

Upstream terms and attribution

Data comes from Eurostat dissemination API (https://ec.europa.eu/eurostat/web/main/data/database) under its own terms of use; this package adds no rights to it. Documentation snapshot and its attribution, Eurostat's reuse and citation lines among them: docs/upstream/FETCHED.md.

Licence

Apache-2.0. See LICENSE.

Metadata

Release files for xippios-eurostat 0.2.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for xippios-eurostat 0.2.0
File Size Uploaded Provenance Actions
xippios_eurostat-0.2.0.tar.gz 1.2 MB With provenance Details for xippios_eurostat-0.2.0.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for xippios-eurostat 0.2.0
File Interpreter ABI Platform Actions
xippios_eurostat-0.2.0-py3-none-any.whl Python 3 none any Details for xippios_eurostat-0.2.0-py3-none-any.whl

Total release size: 2.4 MB

Release files / xippios_eurostat-0.2.0.tar.gz

Download URL xippios_eurostat-0.2.0.tar.gz
Size 1.2 MB
Tags Source
SHA-256 checksum
How to use checksums
977cf96fa4e963aba5b585322ed21a71f00d7f291351d07a2fe868a190b5850d
BLAKE2b-256 checksum
How to use checksums
cbd6ae71c8b1ef7acae1c04134077e0b0cc5792246ed7edbfcfab6e4bbfb583d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 28, 2026.

Transparency log

Release files / xippios_eurostat-0.2.0-py3-none-any.whl

Download URL xippios_eurostat-0.2.0-py3-none-any.whl
Size 1.2 MB
Tags Python 3
SHA-256 checksum
How to use checksums
3cabaeadef1606a47169c16db2448c1454b90035b75cf2375ce45c983938ac0c
BLAKE2b-256 checksum
How to use checksums
8042947d854cb251b9db3f74a772100775ebc4dd5b54dbb18fc8e1f5f7b44f20
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 28, 2026.

Transparency log

Security for xippios-eurostat 0.2.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

All 2 files in this release have been uploaded with provenance metadata.

Select from 2 files

Attestation for xippios_eurostat-0.2.0.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 28, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Release history Release notifications | RSS feed

This release

0.2.0 This release

2 release files Full provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page