Skip to main content
Version: devel View Markdown

Dataplane API

Workspace data kept on the data plane: workspace variables and the files of uploaded deployments and configurations.

Base URL and authentication​

Each workspace keeps its data on the data plane of its region. Its services are not on api.dlthub.com and do not accept API keys. To call them:

  1. Read dataplane_url from GET https://api.dlthub.com/api/v1/workspaces/{workspace_id}. This is the base URL of every data plane service: Dataplane, Logs and Telemetry API.
  2. Exchange your API key for a data plane token with POST https://api.dlthub.com/api/v1/workspaces/{workspace_id}/-issue-dataplane-token. The token is valid for one workspace until expires_at, currently 10 minutes after it was issued; request a new one before then.
  3. Call the service at dataplane_url with Authorization: Bearer <token>.

Every workspace member can read logs, telemetry and file lists. Only workspace owners can read or change variables, so workspace API keys, which are DEVELOPER or VIEWER, cannot. Uploads use a separate token: POST .../deployments/-issue-upload (or /configurations/-issue-upload) returns an upload_token and the upload_url to send the files to, both valid for one upload and 10 minutes.

The data planes today:

Regiondataplane_url
Europe (eu1, europe-west4)https://eu1.dlthub.com
US East (us1, us-east4)https://us1.dlthub.com

Versioning​

The API version is part of the path. Endpoints under /v1 are stable: breaking changes ship only under a new version prefix. New endpoints, optional parameters and response fields can be added to /v1 at any time, so ignore fields and enum values you do not know.

Files​

Get configuration files manifest​

GET /api/v1/workspaces/{workspace_id}/configurations/{configuration_id}/files

Lists every file in an uploaded configuration: path, size and SHA3-256 digest. Any workspace member can call it. Answers 404 when the workspace has no configuration with this id. To get the latest configuration's id, call GET https://api.dlthub.com/api/v1/workspaces/{workspace_id}/configurations/latest.

Request

Path parameters

NameTypeDescription
workspace_idstring (uuid)ID of the workspace
configuration_idstring (uuid)ID of the configuration
Response (200, 4xx, 5xx)
{
"engine_version": 0,
"files": [
{
"linkname": "<linkname>",
"relative_path": "<relative_path>",
"sha3_256": "<sha3_256>",
"size_bytes": 0
}
]
}

Get deployment files manifest​

GET /api/v1/workspaces/{workspace_id}/deployments/{deployment_id}/files

Lists every file in an uploaded deployment: path, size and SHA3-256 digest. Any workspace member can call it. Answers 404 when the workspace has no deployment with this id. To get the latest deployment's id, call GET https://api.dlthub.com/api/v1/workspaces/{workspace_id}/deployments/latest.

Request

Path parameters

NameTypeDescription
workspace_idstring (uuid)ID of the workspace
deployment_idstring (uuid)ID of the deployment
Response (200, 4xx, 5xx)
{
"engine_version": 0,
"files": [
{
"linkname": "<linkname>",
"relative_path": "<relative_path>",
"sha3_256": "<sha3_256>",
"size_bytes": 0
}
]
}

Uploads​

Upload configuration bytes​

POST /api/v1/workspaces/{workspace_id}/configurations/{configuration_id}/-upload

Uploads the configuration package for the id you got from configurations/-issue-upload, using that call's upload_token. Profiles are read from <profile>.config.toml and <profile>.secrets.toml file names. On success the configuration is created and returned. A package that cannot be read answers 400; a request body over 10 MB answers 413.

Request

Path parameters

NameTypeDescription
workspace_idstring (uuid)ID of the workspace
configuration_idstring (uuid)ID of the configuration
Response (200, 4xx, 5xx)
{
"content_hash": "<content_hash>",
"created_at": "2026-01-01T00:00:00Z",
"created_by": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"file_count": 0,
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"profiles": ["<profiles>"],
"size_bytes": 0,
"updated_at": "2026-01-01T00:00:00Z",
"version": 0,
"workspace_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6"
}

Upload deployment bytes​

POST /api/v1/workspaces/{workspace_id}/deployments/{deployment_id}/-upload

Uploads the package for the deployment id you got from deployments/-issue-upload, using that call's upload_token. file is the tar.gz package built by dlt (it must contain manifest.yaml). requirements_file is the workspace requirements manifest. On success the deployment is created and returned. A package that cannot be read answers 400; a request body over 10 MB answers 413.

Request

Path parameters

NameTypeDescription
workspace_idstring (uuid)ID of the workspace
deployment_idstring (uuid)ID of the deployment
Response (200, 4xx, 5xx)
{
"content_hash": "<content_hash>",
"created_at": "2026-01-01T00:00:00Z",
"created_by": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"file_count": 0,
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"requirements_size_bytes": 0,
"size_bytes": 0,
"updated_at": "2026-01-01T00:00:00Z",
"version": 0,
"workspace_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6"
}

Variables​

List workspace variables​

GET /api/v1/workspaces/{workspace_id}/variables

Lists workspace variables: the workspace-wide scope first, then each profile scope that holds variables, sorted by profile name. Pass scope_profile or is_workspace_scope=true to read one scope; an empty scope returns an empty list. Secret values are always null. Only workspace owners, and job runs in the workspace, can call this.

Request

Path parameters

NameTypeDescription
workspace_idstring (uuid)ID of the workspace

Query parameters

NameTypeDescription
scope_profilestring or nullRead only this profile's scope.
is_workspace_scopeboolean or nulltrue reads only the workspace-wide scope. Cannot be combined with scope_profile; false is rejected.
Response (200, 4xx, 5xx)
{
"scopes": [
{
"profile": "<profile>",
"variables": [
{
"created_at": "2026-01-01T00:00:00Z",
"created_by": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"name": "<name>",
"type": "plain",
"updated_at": "2026-01-01T00:00:00Z",
"updated_by": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"value": "<value>"
}
]
}
]
}

Change workspace variables​

PATCH /api/v1/workspaces/{workspace_id}/variables

Create, update and delete variables in one scope, applied atomically. profile null targets the workspace-wide scope. Upserts create or replace by name. Deleting a name that was not set is reported as not_found rather than failing the request. Results list upserts first, then deletes. At most 200 variables per scope (400 variables_cap_exceeded). Reserved names are rejected case-insensitively (400 reserved_variable_names). A concurrent change answers 409 variables_scope_locked; retry. In a run, profile values override workspace-wide values with the same name. Only workspace owners can call this.

Request

Path parameters

NameTypeDescription
workspace_idstring (uuid)ID of the workspace
Response (200, 4xx, 5xx)
{
"results": [
{
"name": "<name>",
"status": "upserted"
}
]
}

This demo works on codespaces. Codespaces is a development environment available for free to anyone with a Github account. You'll be asked to fork the demo repository and from there the README guides you with further steps.
The demo uses the Continue VSCode extension.

Off to codespaces!

DHelp

Ask a question

Welcome to "Codex Central", your next-gen help center, driven by OpenAI's GPT-4 model. It's more than just a forum or a FAQ hub – it's a dynamic knowledge base where coders can find AI-assisted solutions to their pressing problems. With GPT-4's powerful comprehension and predictive abilities, Codex Central provides instantaneous issue resolution, insightful debugging, and personalized guidance. Get your code running smoothly with the unparalleled support at Codex Central - coding help reimagined with AI prowess.