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.
.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.
PromptRunuvx dlthub-init@latestto 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 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) |
| Example endpoint | GET rest/data/{flowRef}/{key}/{providerRef} |
| Authentication | all secure requests require a Bearer token in the Authorization header — sent in the Authorization header, prefixed Bearer |
| Pagination | Offset-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 reference | https://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:
| Resource | Endpoint | Method | Data selector | Description |
|---|---|---|---|---|
| data | /rest/data/{flowRef}/{key}/{providerRef} | GET | Retrieves SDMX data. | |
| available_constraint | /rest/availableconstraint/{flowRef}/{key}/{providerRef}/{componentIds} | GET | Returns available constraint metadata. | |
| data_post | /rest/data | POST | Retrieves SDMX data (alternative to GET). | |
| available_constraint_post | /rest/availableconstraint | POST | Returns available constraint metadata (alternative to GET). | |
| transfer_dataflow | /transfer/dataflow | POST | Copies 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.
What other destinations can I load .Stat Suite data to?
dlt loads into any of these — only the destination argument changes:
| Destination | Example 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.