Load .Stat Suite data to DuckDB

Build a .Stat Suite to DuckDB pipeline with your coding agent. One prompt scaffolds it with the dltHub AI harness, plus the .Stat Suite API base URL, auth, endpoints, and incremental loading.

Source
.Stat Suite
.Stat Suite API Documentation
Destination
DuckDB
In-process analytical database. The default local destination for dlt pipelines — browse all sources you can load into DuckDB.

.Stat Suite is an open-source SDMX-based platform for the dissemination of statistical data and metadata across organizational boundaries. Everything needed to build a working .Stat Suite → DuckDB pipeline is on this page: the API's base URL, authentication, endpoints, pagination and incremental field — plus a prompt that hands the whole job to your coding agent.


Build your .Stat Suite to DuckDB pipeline

Paste this prompt into Claude, Codex, or Cursor. The agent does the rest.

Prompt
Run uvx dlthub-init@latest to build a pipeline from .Stat Suite to DuckDB and run it on dltHub

That scaffolds a dltHub workspace and installs the dltHub AI harness — the project rules, the secrets-management skill, and the dlt MCP server your agent needs to work safely. From there it reads the .Stat Suite API, proposes the endpoints to load, then writes, runs and validates the pipeline while you review rather than type. Credentials are inspected through MCP tools, so your agent never reads secrets.toml itself. How the LLM-native workflow works →

Prefer to write it yourself? Every fact the agent uses is below.


.Stat Suite API at a glance

Base URLThe base URL varies by implementation as it depends on the specific .Stat Suite space/service entry point (e.g., https://nsi-demo-stable.siscc.org/rest)
Example endpointGET rest/data/{flowRef}/{key}/{providerRef}
Authenticationall secure requests require a Bearer token in the Authorization header — sent in the Authorization header, prefixed Bearer
PaginationOffset-based via offset, page size via limit. The .Stat Suite REST API supports two primary methods for pagination: query parameters 'limit' and 'offset', and the 'X-Range' HTTP header. Query parameters have precedence over the 'X-Range' header. No next page token or max results per page parameter exists; clients manage pagination by incrementing the offset.
API referencehttps://sis-cc.gitlab.io/dotstatsuite-documentation/using-api/programmatic-auth/

These values come from the .Stat Suite API reference — the authoritative source if anything here looks out of date.


How do I authenticate with the .Stat Suite API?

The API uses OpenID Connect and expects a JWT (JSON Web Token) to be sent as a Bearer token in the HTTP Authorization header. The token is obtained from an independent identity provider service (e.g., Keycloak).

1. Get your credentials

The .Stat Suite does not typically use static 'API keys' for core services. Instead, authentication is performed via an OpenID-Connect compliant identity provider (such as Keycloak). To obtain programmatic access: 1. Ensure your account is configured in the identity provider. 2. If using an unattended process, configure 'Direct Access Grants' in the identity provider (e.g., Keycloak) to allow username/password token retrieval, or use a dedicated service account. 3. Use the OauthToken.exe tool provided by .Stat Suite or perform a secure (HTTPS) POST request to the identity provider's token endpoint with your credentials to retrieve a JWT Bearer token. 4. Include the retrieved token in the 'Authorization: Bearer ' header of your API requests.

2. Add them to .dlt/secrets.toml

[sources.stat_suite_source] api_key = "your_api_key_id_here" # Note: Only applicable if your specific .Stat instance uses an API Gateway that requires an X-API-KEY-ID header. For standard core services, use Authorization: Bearer <JWT_token>.

dlt reads this file automatically at runtime. With the harness, the setup-secrets skill prompts you for the values and never handles the raw credential in chat. For production, see setting up credentials with dlt.


What .Stat Suite data can I load into DuckDB?

These are the .Stat Suite endpoints dlt can load into DuckDB:

ResourceEndpointMethodData selectorDescription
data/rest/data/{flowRef}/{key}/{providerRef}GETRetrieves SDMX data.
available_constraint/rest/availableconstraint/{flowRef}/{key}/{providerRef}/{componentIds}GETReturns available constraint metadata.
data_post/rest/dataPOSTRetrieves SDMX data (alternative to GET).
available_constraint_post/rest/availableconstraintPOSTReturns available constraint metadata (alternative to GET).
transfer_dataflow/transfer/dataflowPOSTCopies data between data spaces.

How do I load only new .Stat Suite records?

The .Stat Suite API reference does not document a timestamp or sequence field for these endpoints, so there is nothing to advertise here as verified. Pick a field from the endpoints table above that increases with every write, then set it as the cursor_path.

{"name": "data", "endpoint": { "path": "rest/data/{flowRef}/{key}/{providerRef}", # Replace with a field that increases on every write. "incremental": {"cursor_path": "REPLACE_ME", "initial_value": "2024-01-01T00:00:00Z"}, }}

On the first run dlt loads everything from initial_value; on every run after that it requests only what changed and appends with write_disposition="merge" if you set a primary key. See incremental loading.


What does the generated .Stat Suite pipeline look like?

A standard dlt REST API pipeline — the same code you would write by hand, loading /rest (for SDMX data retrieval) and /transfer (for data uploads and management). from the .Stat Suite API into DuckDB:

import dlt from dlt.sources.rest_api import RESTAPIConfig, rest_api_resources @dlt.source def stat_suite_source(access_token=dlt.secrets.value): config: RESTAPIConfig = { "client": { "base_url": "The base URL varies by implementation as it depends on the specific .Stat Suite space/service entry point (e.g., https://nsi-demo-stable.siscc.org/rest)", "auth": {"type": "bearer", "token": access_token}, }, "resources": [ {"name": "data", "endpoint": {"path": "rest/data/{flowRef}/{key}/{providerRef}"}}, {"name": "available_constraint", "endpoint": {"path": "rest/availableconstraint/{flowRef}/{key}/{providerRef}/{componentIds}"}} ], } yield from rest_api_resources(config) def load_stat_suite_to_duckdb() -> None: pipeline = dlt.pipeline( pipeline_name="stat_suite_pipeline", destination="duckdb", dataset_name="stat_suite_data", ) load_info = pipeline.run(stat_suite_source()) print(load_info) if __name__ == "__main__": load_stat_suite_to_duckdb()

Run it with python stat_suite_pipeline.py. The agent iterates on this until it loads cleanly — you review and approve, rather than write it from scratch.


How do I query .Stat Suite data in DuckDB?

dlt creates one table per resource. Query the loaded data with Python or SQL — or ask your agent to, through the MCP server's execute_sql_query tool.

Python (pandas DataFrame):

import dlt data = dlt.pipeline("stat_suite_pipeline").dataset() df = data.data.df() print(df.head())

SQL:

SELECT * FROM stat_suite_data.data LIMIT 10;

See querying your data with dataset and exploring it in marimo notebooks.


How do I deploy the .Stat Suite to DuckDB pipeline in production?

The pipeline runs locally, which is ideal for prototyping and one-off analysis. When you need it on a schedule, monitored on every load, and shared with your team, deploy the same dlt code on the dltHub platform — no infrastructure to maintain. The prompt above already ends with "run it on dltHub", so your agent can take it there directly.

  • Deploy & schedule — run the pipeline as a managed job with automatic retries.
  • Monitor — observable job queues, alerting, and load metrics for every run.
  • Transform — promote raw .Stat Suite loads into governed, documented models.
  • Visualize & share — explore data in notebooks and publish live dashboards instead of static screenshots.

Book a demo →


What other destinations can I load .Stat Suite data to?

dlt loads into any of these — only the destination argument changes:

DestinationExample value
PostgreSQL"postgres"
BigQuery"bigquery"
Snowflake"snowflake"
Redshift"redshift"
Databricks"databricks"
Filesystem (S3, GCS, Azure)"filesystem"

Set dlt.pipeline(destination="snowflake") and add credentials in .dlt/secrets.toml. On the dltHub platform the same pipeline runs against a managed Iceberg lakehouse. See the full destinations list.


Next steps

Was this page helpful?

Community Hub

Need more dlt context for .Stat Suite to DuckDB?

Request dlt skills, commands, AGENT.md files, and AI-native context.