New to Kestra?
Use blueprints to kickstart your first workflows.
Run a Python ELT pipeline with dlt and Kestra. Extract Chess.com API data on schedule and load it into DuckDB for automated analysis.
Build a lightweight ELT pipeline in Python that pulls player profiles from the Chess.com public REST API and loads them into DuckDB using dltHub (dlt), all orchestrated by Kestra. This blueprint solves a common ingestion problem: extracting semi-structured JSON from a web API, normalizing nested fields into clean relational tables, and landing them in a fast analytical store without hand-writing schema or transformation code. It is a ready-to-run pattern for API-to-warehouse ELT, prototyping, and local analytics.
chess_api_to_duckdb task of type io.kestra.plugin.scripts.python.Script runs the pipeline inside a python:slim container using the io.kestra.plugin.scripts.runner.docker.Docker task runner.dependencies (dlt[duckdb] and requests), so the runtime installs dlt and the DuckDB extra automatically.dlt.pipeline() with pipeline_name='chess_pipeline', destination='duckdb', and dataset_name='player_data'.magnuscarlsen, rpragchess), calls the Chess.com endpoint with requests.get(), and raises on HTTP errors via response.raise_for_status().pipeline.run(data, table_name='player'), where dlt infers the schema, normalizes the JSON, and loads records into the player table in DuckDB.daily trigger of type io.kestra.plugin.core.trigger.Schedule is included with cron: "0 9 * * *", shipped disabled: true so you can enable it when ready.player_data) ready for fast SQL querying.dlt and DuckDB have no native scheduler, retry engine, or cross-pipeline lineage. Kestra adds event and schedule triggers, automatic retries, execution history, and observability around the run. You declare the whole pipeline in version-controlled YAML, run it in an isolated Docker container, and chain it with downstream tasks (dbt, notifications, loads to other systems) that a standalone Python script cannot coordinate on its own.
api.chess.com.secret() values.player table.daily trigger disabled: false to run it every day at 09:00.dlt.pipeline().