Dialpad Python API Docs | dltHub
Build a Dialpad-to-database pipeline in Python using dlt with AI Workbench support for Claude Code, Cursor, and Codex.
Last updated:
Dialpad is a cloud communications platform providing voice, video, messaging, and programmatic access to call, message, user and account data via a REST API. The REST API base URL is https://dialpad.com/api/v2 and All requests require a Bearer token (Dialpad API key or OAuth access token) in the Authorization header..
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 Dialpad data in under 10 minutes.
What data can I load from Dialpad?
Here are some of the endpoints you can load from Dialpad:
| Resource | Endpoint | Method | Data selector | Description |
|---|---|---|---|---|
| users | /api/v2/users | GET | users | List users for the company or a scoped user (supports GET /api/v2/users/{id} for single user) |
| calls | /api/v2/calls | GET | calls | List call records for the account |
| messages | /api/v2/messages | GET | messages | List messages / SMS records |
| rooms | /api/v2/rooms | GET | rooms | List chat rooms (conversations) |
| contacts | /api/v2/contacts | GET | contacts | List contacts for the account |
| users_get | /api/v2/users/{id} | GET | Retrieve a single user by ID | |
| calls_get | /api/v2/calls/{id} | GET | Retrieve a single call by ID |
How do I authenticate with the Dialpad API?
Dialpad supports API keys and OAuth 2.0. API keys and OAuth access tokens are used as Bearer tokens. Include header: Authorization: Bearer <access_token>.
1. Get your credentials
- Register an application in the Dialpad admin console (OAuth app form) to receive a client_id and client_secret.
- Direct users to https://dialpad.com/oauth2/authorize to obtain an authorization code.
- POST the code to https://dialpad.com/oauth2/token with client_id, client_secret, grant_type=authorization_code (and optional code_verifier) to receive an access_token.
- Use the access_token as a Bearer token in the Authorization header.
- For internal/server-to-server usage, create an API key in the Dialpad admin UI and use it directly as the Bearer token.
2. Add them to .dlt/secrets.toml
[sources.dialpad_source] api_key = "your_dialpad_api_key_or_oauth_access_token"
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 Dialpad 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 dialpad_pipeline.py
If everything is configured correctly, you'll see output like this:
Pipeline dialpad_pipeline load step completed in 0.26 seconds 1 load package(s) were loaded to destination duckdb and into dataset dialpad_data The duckdb destination used duckdb:/dialpad.duckdb location to store data Load package 1749667187.541553 is LOADED and contains no failed jobs
Inspect your pipeline and data:
dlt pipeline dialpad_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 users and calls from the Dialpad 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 dialpad_source(api_key=dlt.secrets.value): config: RESTAPIConfig = { "client": { "base_url": "https://dialpad.com/api/v2", "auth": { "type": "bearer", "token": api_key, }, }, "resources": [ {"name": "users", "endpoint": {"path": "api/v2/users", "data_selector": "users"}}, {"name": "calls", "endpoint": {"path": "api/v2/calls", "data_selector": "calls"}} ], } yield from rest_api_resources(config) def get_data() -> None: pipeline = dlt.pipeline( pipeline_name="dialpad_pipeline", destination="duckdb", dataset_name="dialpad_data", ) load_info = pipeline.run(dialpad_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("dialpad_pipeline").dataset() sessions_df = data.users.df() print(sessions_df.head())
SQL (DuckDB example):
SELECT * FROM dialpad_data.users LIMIT 10;
In a marimo or Jupyter notebook:
import dlt data = dlt.pipeline("dialpad_pipeline").dataset() data.users.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 Dialpad data to?
dlt supports loading into any of these destinations — only the destination parameter changes:
| Destination | Example 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 Unauthorized, verify that the Authorization: Bearer <token> header is present and that the token has not expired. For OAuth flows, ensure the token was obtained from https://dialpad.com/oauth2/token and that the client_id/client_secret and redirect_uri match the registered application.
Rate limits and throttling
Dialpad may return 429 Too Many Requests when usage exceeds account limits. Respect the Retry-After header or implement exponential backoff. Review account‑level quota documentation for specific limits.
Pagination
List endpoints return paginated results using cursor or offset fields in the response. Use the provided next cursor or offset value to request subsequent pages until no further cursor is returned.
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 Dialpad?
Request dlt skills, commands, AGENT.md files, and AI-native context.