PostgreSQL Python API Docs | dltHub

Build a PostgreSQL-to-database pipeline in Python using dlt with AI Workbench support for Claude Code, Cursor, and Codex.

Last updated:

PostgREST is a standalone web server that turns your PostgreSQL database directly into a RESTful API. The REST API base URL is The base URL for PostgREST is server-specific (e.g., http://localhost:3000/<table> for default PostgREST), while for Supabase REST API, it is https://<project_ref>.supabase.co/rest/v1/. and Requests use JWT bearer authentication for PostgREST, while Supabase REST API requires both an API key and a Bearer token..

dlt is an open-source Python library that handles authentication, pagination, and schema evolution automatically. dlthub provides AI context files that enable code assistants to generate production-ready pipelines. Install with uv pip install "dlt[workspace]" and start loading PostgreSQL data in under 10 minutes.


What data can I load from PostgreSQL?

Here are some of the endpoints you can load from PostgreSQL:

ResourceEndpointMethodData selectorDescription
table (generic)/<table_name>GET(top-level array)Fetch rows from a table or view (filtering via query params)
rpc_functions/rpc/<function_name>POST (some read-only functions can be called GET via query clients)(function-dependent — typically top-level array or object)Call stored procedures/functions exposed by Postgres
openapi/ (or /openapi.json depending on config)GET(OpenAPI JSON object)Auto-generated OpenAPI schema for the API
health/admin/ (root) or /? (server-specific health endpoint)GET(depends)Health / root endpoint often used to confirm server running
metadata (PostgREST)/ (OpenAPI & headers)GET(OpenAPI object)API self-documentation via OpenAPI generated from DB schema

How do I authenticate with the PostgreSQL API?

PostgREST commonly validates JWTs (HS256) provided in the Authorization: Bearer header. Supabase REST requires both an apikey header and Authorization: Bearer <access_token> for authenticated requests.

1. Get your credentials

  1. For PostgREST self-hosted: generate a JWT signing secret (HS256) and configure postgrest with JWT_SECRET; create roles and RLS policies in Postgres. 2) For Supabase: in Dashboard -> Settings -> API copy Project URL (base) and anon/public or service_role keys; use anon key for client reads and service_role for server operations.

2. Add them to .dlt/secrets.toml

[sources.postgres_data_source] api_key = "YOUR_API_KEY_OR_JWT"

dlt reads this automatically at runtime — never hardcode tokens in your pipeline script. For production environments, see setting up credentials with dlt for environment variable and vault-based options.


How do I set up and run the pipeline?

Set up a virtual environment and install dlt:

uv venv && source .venv/bin/activate uv pip install "dlt[workspace]"

1. Install the dlt AI Workbench:

dlt ai init --agent <your-agent> # <agent>: claude | cursor | codex

This installs project rules, a secrets management skill, appropriate ignore files, and configures the dlt MCP server for your agent. Learn more →

2. Install the rest-api-pipeline toolkit:

dlt ai toolkit rest-api-pipeline install

This loads the skills and context about dlt the agent uses to build the pipeline iteratively, efficiently, and safely. The agent uses MCP tools to inspect credentials — it never needs to read your secrets.toml directly. Learn more →

3. Start LLM-assisted coding:

Use /find-source to load data from the PostgreSQL API into DuckDB.

The rest-api-pipeline toolkit takes over from here — it reads relevant API documentation, presents you with options for which endpoints to load, and follows a structured workflow to scaffold, debug, and validate the pipeline step by step.

4. Run the pipeline:

python postgres_data_pipeline.py

If everything is configured correctly, you'll see output like this:

Pipeline postgres_data_pipeline load step completed in 0.26 seconds 1 load package(s) were loaded to destination duckdb and into dataset postgres_data_data The duckdb destination used duckdb:/postgres_data.duckdb location to store data Load package 1749667187.541553 is LOADED and contains no failed jobs

Inspect your pipeline and data:

dlt pipeline postgres_data_pipeline show

This opens the Pipeline Dashboard where you can verify pipeline state, load metrics, schema (tables, columns, types), and query the loaded data directly.


Python pipeline example

This example loads table_name and rpc_function from the PostgreSQL API into DuckDB. It mirrors the endpoint and data selector configuration from the table above:

import dlt from dlt.sources.rest_api import RESTAPIConfig, rest_api_resources @dlt.source def postgres_data_source(api_key=dlt.secrets.value): config: RESTAPIConfig = { "client": { "base_url": "The base URL for PostgREST is server-specific (e.g., http://localhost:3000/<table> for default PostgREST), while for Supabase REST API, it is https://<project_ref>.supabase.co/rest/v1/.", "auth": { "type": "bearer", "token": api_key, }, }, "resources": [ {"name": "table_name", "endpoint": {"path": "rest/v1/<table_name>"}}, {"name": "rpc_function", "endpoint": {"path": "rpc/<function_name>"}} ], } yield from rest_api_resources(config) def get_data() -> None: pipeline = dlt.pipeline( pipeline_name="postgres_data_pipeline", destination="duckdb", dataset_name="postgres_data_data", ) load_info = pipeline.run(postgres_data_source()) print(load_info)

To add more endpoints, append entries from the resource table to the "resources" list using the same name, path, and data_selector pattern.


How do I query the loaded data?

Once the pipeline runs, dlt creates one table per resource. You can query with Python or SQL.

Python (pandas DataFrame):

import dlt data = dlt.pipeline("postgres_data_pipeline").dataset() sessions_df = data.table_name.df() print(sessions_df.head())

SQL (DuckDB example):

SELECT * FROM postgres_data_data.table_name LIMIT 10;

In a marimo or Jupyter notebook:

import dlt data = dlt.pipeline("postgres_data_pipeline").dataset() data.table_name.df().head()

See how to explore your data in marimo Notebooks and how to query your data in Python with dataset.


What destinations can I load PostgreSQL data to?

dlt supports loading into any of these destinations — only the destination parameter changes:

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

Change the destination in dlt.pipeline(destination="snowflake") and add credentials in .dlt/secrets.toml. See the full destinations list.


Troubleshooting

Authentication failures

If you receive 401/403, verify Authorization: Bearer header, JWT signing secret on server matches issuer, and PostgreSQL role/RLS policies permit access. For Supabase ensure both apikey and Authorization headers are provided.

Pagination and large result sets

PostgREST uses Range and Content-Range headers for paging/counts; very large responses may require limiting with ?limit and using Range to request subsets.

OpenAPI / metadata not available

If OpenAPI JSON is missing, confirm PostgREST was started with the correct db schema exposed and that OpenAPI generation is enabled in configuration.

Common API errors: 401 Unauthorized, 403 Forbidden (RLS/permissions), 404 Not Found (missing table/endpoint), 406/415 (content negotiation), 416/206 when using Range headers; use 400 for invalid queries.

Notes: Exact base URL and available table endpoints depend on your PostgREST host and DB schema. Table GET responses are returned as a top-level JSON array (no wrapper key). Supabase REST URL pattern: https://<project_ref>.supabase.co/rest/v1/ and requires apikey + Authorization headers.

Ensure that the API key is valid to avoid 401 Unauthorized errors. Also, verify endpoint paths and parameters to avoid 404 Not Found errors.


Next steps

Continue your data engineering journey with the other toolkits of the dltHub AI Workbench:

  • data-exploration — Build custom notebooks, charts, and dashboards for deeper analysis with marimo notebooks.
  • dlthub-runtime — Deploy, schedule, and monitor your pipeline in production.
dlt ai toolkit data-exploration install dlt ai toolkit dlthub-runtime install

Was this page helpful?

Community Hub

Need more dlt context for PostgreSQL?

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