New to Kestra?
Use blueprints to kickstart your first workflows.
Extract JSON from a REST API with Kestra, enrich each row with a timestamp, and load it in parallel into a PostgreSQL table and an Amazon S3 bucket.
Build a complete ETL pipeline that pulls JSON from a public REST API, enriches each record with a timestamp, and loads the result in parallel into a PostgreSQL table and an Amazon S3 bucket. This blueprint solves the common integration problem of moving API data into a relational warehouse and an object store at the same time, without writing glue scripts or wiring up a standalone scheduler, using declarative YAML and Kestra's built-in serializers for JSON, ION, and CSV.
download uses io.kestra.plugin.core.http.Download to fetch the user
payload over HTTP GET and store it in Kestra internal storage.ion converts the raw response to Kestra's ION format with
io.kestra.plugin.serdes.json.JsonToIon, then json round-trips it back
with io.kestra.plugin.serdes.json.IonToJson.add_column runs io.kestra.plugin.graalvm.python.FileTransform to
enrich every row with an inserted_at UTC timestamp.parallel (io.kestra.plugin.core.flow.Parallel) fans out into two
io.kestra.plugin.core.flow.Sequential branches that run at once.io.kestra.plugin.serdes.csv.IonToCsv, creates public.raw_users via
io.kestra.plugin.jdbc.postgresql.Query, then bulk loads it with
io.kestra.plugin.jdbc.postgresql.CopyIn.users.json to the
kestraio bucket with io.kestra.plugin.aws.s3.Upload.Postgres and S3 have no native scheduler that can fetch an API, branch into
parallel loads, and retry each step independently. Kestra adds event and
schedule triggers, per-task retries, full execution lineage across the
extract and both load branches, and a declarative YAML definition you can
version and review. The Parallel task runs the Postgres and S3 loads
concurrently, something a plain SQL scheduler or a bucket lifecycle rule
cannot coordinate on its own.
host.docker.internal:5432).kestraio).FileTransform enrichment step.AWS_DEFAULT_REGIONAWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEYurl, username, and password at your database and
confirm the kestraio bucket and region.public.raw_users plus users.json in S3.download for your own endpoint.add_column Python to derive more fields or clean data.Sequential branches under Parallel for extra destinations.