Skip to main content
Version: devel View Markdown

Runtime API

REST API of the dltHub Runtime control plane: organizations, workspaces, deployments, configurations, jobs and job runs. The dlthub CLI, the Python SDK and the dltHub web app are built on it.

Base URL​

https://api.dlthub.com

Authentication​

Send an API key as a bearer token:

Authorization: Bearer <api key>

Create keys in the dltHub web app. The plaintext key is shown once, and deleting a key revokes it immediately. Keys expire after 90 days unless set otherwise when created (at most 365).

  • Personal keys (dlt_u_…), under account settings, act as you, with your roles in every organization and workspace you belong to.
  • Workspace keys (dlt_sa_…), under workspace settings, act for one workspace with a fixed role: DEVELOPER (deploy and run jobs) or VIEWER (read, and run jobs that use the read-only access profile, such as interactive jobs). Use them for CI and other automation. Workspace keys cannot call GET /api/v1/me.

Data plane​

Workspace variables, deployment and configuration files, run logs and telemetry are kept on the data plane of the workspace's region and served by the Dataplane, Logs and Telemetry APIs. GET /api/v1/workspaces/{workspace_id} returns its address as dataplane_url, and POST /api/v1/workspaces/{workspace_id}/-issue-dataplane-token the token to call it with.

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.

Configurations​

List configurations​

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

Lists the configurations of a workspace as a paginated list, newest version first unless sort is given.

Requires the viewer role (or higher) in the workspace.

Request

Path parameters

NameTypeDescription
workspace_idstring (uuid)ID of the workspace

Query parameters

NameTypeDescription
versioninteger or nullExact match on version.
sortarray of string or nullKeys to sort by, applied in the order given. Pairs positionally with order, which must have the same number of entries. One of: version, created_at.

Pagination: limit, offset, order, cursor, see Lists and pagination

Response (200, 4xx, 5xx)
{
"items": [
{
"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"
}
],
"limit": 0,
"next_cursor": "<next_cursor>",
"offset": 0,
"total": 0
}

Issue upload configuration​

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

Prepares the upload of a new configuration. Send a multipart POST with file (the package) to upload_url, with Authorization: Bearer <upload_token>, within 10 minutes. The configuration exists, under configuration_id, only after the upload succeeds.

Requires the developer role (or higher) in the workspace.

Request

Path parameters

NameTypeDescription
workspace_idstring (uuid)ID of the workspace
Response (200, 4xx, 5xx)
{
"configuration_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"upload_token": "<upload_token>",
"upload_url": "<upload_url>"
}

Get latest configuration​

GET /api/v1/workspaces/{workspace_id}/configurations/latest

Gets the latest and therefore active configuration for a workspace.

Requires the viewer role (or higher) in the workspace.

Request

Path parameters

NameTypeDescription
workspace_idstring (uuid)ID of the workspace
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"
}

Get configuration​

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

Gets a configuration for a workspace by its ID. Find one by version number with list_configurations.

Requires the viewer role (or higher) in the workspace.

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"
}

Dataplanes​

List dataplanes​

GET /api/v1/dataplanes

Lists the regions (data planes) an organization can choose with set_region_organization.

Request
curl "https://api.dlthub.com/api/v1/dataplanes" \
-H "Authorization: Bearer $DLTHUB_API_KEY"
Response (200, 4xx, 5xx)
{
"items": [
{
"description": "<description>",
"id": "<id>",
"name": "<name>",
"region": "<region>"
}
]
}

Deployments​

List deployments​

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

Lists the deployments of a workspace as a paginated list, newest version first unless sort is given.

Requires the viewer role (or higher) in the workspace.

Request

Path parameters

NameTypeDescription
workspace_idstring (uuid)ID of the workspace

Query parameters

NameTypeDescription
versioninteger or nullExact match on version.
sortarray of string or nullKeys to sort by, applied in the order given. Pairs positionally with order, which must have the same number of entries. One of: version, created_at.

Pagination: limit, offset, order, cursor, see Lists and pagination

Response (200, 4xx, 5xx)
{
"items": [
{
"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"
}
],
"limit": 0,
"next_cursor": "<next_cursor>",
"offset": 0,
"total": 0
}

Issue upload deployment​

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

Prepares the upload of a new deployment. Send a multipart POST with file (the package) and requirements_file to upload_url, with Authorization: Bearer <upload_token>, within 10 minutes. The deployment exists, under deployment_id, only after the upload succeeds.

Requires the developer role (or higher) in the workspace.

Request

Path parameters

NameTypeDescription
workspace_idstring (uuid)ID of the workspace
Response (200, 4xx, 5xx)
{
"deployment_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"upload_token": "<upload_token>",
"upload_url": "<upload_url>"
}

Get latest deployment​

GET /api/v1/workspaces/{workspace_id}/deployments/latest

Gets the latest and therefore active deployment for a workspace.

Requires the viewer role (or higher) in the workspace.

Request

Path parameters

NameTypeDescription
workspace_idstring (uuid)ID of the workspace
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"
}

Get deployment​

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

Gets a deployment for a workspace by its ID. Find one by version number with list_deployments.

Requires the viewer role (or higher) in the workspace.

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"
}

Job runs​

List job runs​

GET /api/v1/workspaces/{workspace_id}/job-runs

Gets the job runs of a workspace as a paginated list, newest first.

Search with q over the job name and the names of the pipelines a run reported; a number also matches the run number. Filter by status, attention reason, run number, job, job type, job category, trigger, trigger kind, who started the run (triggered_by), profile, duration, upstream run (previous_job_run_id, giving the runs one run triggered), or a created_at window; sort with paired sort and order lists.

trigger_kind matches the kind of trigger a run fired with, which for a run started through the API may be the job's default trigger, e.g. schedule:. Use triggered_by to find runs a person started.

System runs, such as the dashboard job, are excluded unless job_id or previous_job_run_id names one, or include_system_job_runs is set. Naming a category does not lift the exclusion.

Set downstream_job_runs_limit to attach, to each run, the runs its outcome triggered.

Requires the viewer role (or higher) in the workspace.

Request

Path parameters

NameTypeDescription
workspace_idstring (uuid)ID of the workspace

Query parameters

NameTypeDescription
qstring or nullCase-insensitive substring match on the job name and the pipeline names the run produced. A numeric value also matches the exact run number.
statusarray of string or nullExact match on status. Repeat the parameter to match any of several values. One of: pending, starting, running, completed, failed, cancelled, skipped, cancelling.
attention_reasonarray of string or nullMatch runs an operator has to look at, for any of the given reasons: failed, empty_run (completed but loaded no rows), long_running (completed after more than 5 hours). A run lists every reason that applies in attention_reasons. One of: failed, empty_run, long_running.
numberinteger or nullExact match on number.
job_idstring (uuid) or nullExact match on job_id.
previous_job_run_idstring (uuid) or nullExact match on previous_job_run_id.
job_typearray of string or nullExact match on job_type. Repeat the parameter to match any of several values. One of: batch, interactive, stream.
categoryarray of string or nullMatch runs of jobs declaring any of the given expose.category values. Most jobs declare none and match nothing here. One of: pipeline, mcp, dashboard, notebook, background_agent.
exclude_categoryarray of string or nullDrop runs of jobs declaring any of the given expose.category values. A run of a job declaring none is kept. One of: pipeline, mcp, dashboard, notebook, background_agent.
triggerarray of string or nullExact match on trigger. Repeat the parameter to match any of several values.
trigger_kindarray of string or nullMatch runs by the kind of trigger that fired them, whatever its expression. A run started through the API carries the trigger it was started with, which may be the job's default trigger; use triggered_by to find runs a person started. One of: schedule, every, once, webhook, http, job.success, job.fail, manual.
triggered_byarray of string (uuid) or nullExact match on the identity that started the run. Repeat the parameter to match any of several values.
profilearray of string or nullExact match on profile. Repeat the parameter to match any of several values.
min_duration_secondsnumber or nullInclusive range over duration_seconds, given as min_duration_seconds and max_duration_seconds. Either bound may stand alone.
max_duration_secondsnumber or nullInclusive range over duration_seconds, given as min_duration_seconds and max_duration_seconds. Either bound may stand alone.
startstring (date-time) or nullLower bound (inclusive) on created_at, as a naive local time read in timezone, e.g. 2026-03-01T00:00:00.
endstring (date-time) or nullUpper bound (exclusive) on created_at, as a naive local time read in timezone, e.g. 2026-03-11T00:00:00.
timezonestringIANA timezone in which start and end are read, e.g. Europe/Berlin. Default UTC.
sortarray of string or nullKeys to sort by, applied in the order given. Pairs positionally with order, which must have the same number of entries. One of: created_at, number, duration_seconds, started_at, finished_at.
include_system_job_runsbooleanInclude runs of system jobs such as the dashboard.
downstream_job_runs_limitinteger or nullAttach this many of the runs each run triggered, newest first. Only runs started by the run's outcome are linked.
downstream_job_runs_categorystring or nullAttach only downstream runs whose job declares this category, so the newest of that kind is found however many other runs came after it. One of: pipeline, mcp, dashboard, notebook, background_agent.

Pagination: limit, offset, order, cursor, see Lists and pagination

Response (200, 4xx, 5xx)
{
"items": [
{
"attention_reasons": ["failed"],
"configuration_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"created_at": "2026-01-01T00:00:00Z",
"deployment_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"downstream_job_runs": [
{
"category": "pipeline",
"duration_seconds": 0,
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"job_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"job_ref": "<job_ref>",
"name": "<name>",
"number": 0,
"started_at": "2026-01-01T00:00:00Z",
"status": "pending",
"trigger": "<trigger>"
}
],
"duration_seconds": 0,
"finished_at": "2026-01-01T00:00:00Z",
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"interval_end": "2026-01-01T00:00:00Z",
"interval_start": "2026-01-01T00:00:00Z",
"job": {
"created_at": "2026-01-01T00:00:00Z",
"created_by": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"default_trigger": "<default_trigger>",
"deployment_module": "<deployment_module>",
"description": "<description>",
"freshness": ["<freshness>"],
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"interval_end": "2026-01-01T00:00:00Z",
"interval_start": "2026-01-01T00:00:00Z",
"is_archived": false,
"is_paused": false,
"job_definition": {},
"job_definition_engine_version": 0,
"job_definition_hash": "<job_definition_hash>",
"job_ref": "<job_ref>",
"job_type": "batch",
"job_url": "<job_url>",
"name": "<name>",
"next_scheduled_run_at": "2026-01-01T00:00:00Z",
"pipeline_name": "<pipeline_name>",
"profile": "<profile>",
"public_secret": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"public_url": "<public_url>",
"triggers": ["<triggers>"],
"updated_at": "2026-01-01T00:00:00Z",
"version": 0,
"workspace_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6"
},
"job_version": {
"created_at": "2026-01-01T00:00:00Z",
"created_by": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"default_trigger": "<default_trigger>",
"deployment_module": "<deployment_module>",
"description": "<description>",
"freshness": ["<freshness>"],
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"instance_size": "small",
"interval_end": "2026-01-01T00:00:00Z",
"interval_start": "2026-01-01T00:00:00Z",
"job_definition": {},
"job_definition_engine_version": 0,
"job_definition_hash": "<job_definition_hash>",
"job_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"job_ref": "<job_ref>",
"job_type": "batch",
"max_run_time_seconds": 0,
"memory_mib": 0,
"name": "<name>",
"pipeline_name": "<pipeline_name>",
"profile": "<profile>",
"provider": "tower",
"triggers": ["<triggers>"],
"updated_at": "2026-01-01T00:00:00Z",
"vcpu": 0,
"version": 0
},
"job_version_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"logs_url": "<logs_url>",
"number": 0,
"pipeline_run_summaries": [
{
"dataset_name": "<dataset_name>",
"destination_name": "<destination_name>",
"duration_ms": 0,
"finished_at": "2026-01-01T00:00:00Z",
"pipeline_name": "<pipeline_name>",
"pipeline_run_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"started_at": "2026-01-01T00:00:00Z",
"status": "succeeded",
"total_rows": 0,
"transaction_id": "<transaction_id>"
}
],
"previous_job_run_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"profile": "<profile>",
"started_at": "2026-01-01T00:00:00Z",
"status": "pending",
"trigger": "<trigger>",
"triggered_by": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"updated_at": "2026-01-01T00:00:00Z",
"workspace_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6"
}
],
"limit": 0,
"next_cursor": "<next_cursor>",
"offset": 0,
"total": 0
}

Create job run​

POST /api/v1/workspaces/{workspace_id}/job-runs

Starts a run of the job's latest version with the workspace's latest deployment and configuration, under profile or the job's own profile. A paused job still runs; pausing only stops scheduled runs.

mode controls run creation:

  • always (default): always creates a new run (201).
  • when_not_running: returns the job's pending, starting or running run (200) if it has one, otherwise creates a new one (201).

Answers 400 for an archived job, and 404 when the job has no version or the workspace has no deployment or configuration yet. A run the platform declines to start answers 409 or 403 with a code naming why and the reasons in extra: upstream_not_fresh, outside_job_interval, job_concurrency_limit, organization_concurrency_limit (409), trial_expired, compute_minutes_exhausted (403), or run_not_started for any other reason (409).

Requires the viewer role (or higher) in the workspace. Viewers may only run jobs that use the read-only access profile (by default interactive and agent jobs); any other profile needs the developer role and answers 403.

Request

Path parameters

NameTypeDescription
workspace_idstring (uuid)ID of the workspace
Response (200, 201, 4xx, 5xx)
{
"attention_reasons": ["failed"],
"configuration_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"created_at": "2026-01-01T00:00:00Z",
"deployment_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"downstream_job_runs": [
{
"category": "pipeline",
"duration_seconds": 0,
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"job_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"job_ref": "<job_ref>",
"name": "<name>",
"number": 0,
"started_at": "2026-01-01T00:00:00Z",
"status": "pending",
"trigger": "<trigger>"
}
],
"duration_seconds": 0,
"finished_at": "2026-01-01T00:00:00Z",
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"interval_end": "2026-01-01T00:00:00Z",
"interval_start": "2026-01-01T00:00:00Z",
"job": {
"created_at": "2026-01-01T00:00:00Z",
"created_by": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"default_trigger": "<default_trigger>",
"deployment_module": "<deployment_module>",
"description": "<description>",
"freshness": ["<freshness>"],
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"interval_end": "2026-01-01T00:00:00Z",
"interval_start": "2026-01-01T00:00:00Z",
"is_archived": false,
"is_paused": false,
"job_definition": {},
"job_definition_engine_version": 0,
"job_definition_hash": "<job_definition_hash>",
"job_ref": "<job_ref>",
"job_type": "batch",
"job_url": "<job_url>",
"name": "<name>",
"next_scheduled_run_at": "2026-01-01T00:00:00Z",
"pipeline_name": "<pipeline_name>",
"profile": "<profile>",
"public_secret": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"public_url": "<public_url>",
"triggers": ["<triggers>"],
"updated_at": "2026-01-01T00:00:00Z",
"version": 0,
"workspace_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6"
},
"job_version": {
"created_at": "2026-01-01T00:00:00Z",
"created_by": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"default_trigger": "<default_trigger>",
"deployment_module": "<deployment_module>",
"description": "<description>",
"freshness": ["<freshness>"],
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"instance_size": "small",
"interval_end": "2026-01-01T00:00:00Z",
"interval_start": "2026-01-01T00:00:00Z",
"job_definition": {},
"job_definition_engine_version": 0,
"job_definition_hash": "<job_definition_hash>",
"job_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"job_ref": "<job_ref>",
"job_type": "batch",
"max_run_time_seconds": 0,
"memory_mib": 0,
"name": "<name>",
"pipeline_name": "<pipeline_name>",
"profile": "<profile>",
"provider": "tower",
"triggers": ["<triggers>"],
"updated_at": "2026-01-01T00:00:00Z",
"vcpu": 0,
"version": 0
},
"job_version_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"logs_url": "<logs_url>",
"number": 0,
"pipeline_run_summaries": [
{
"dataset_name": "<dataset_name>",
"destination_name": "<destination_name>",
"duration_ms": 0,
"finished_at": "2026-01-01T00:00:00Z",
"pipeline_name": "<pipeline_name>",
"pipeline_run_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"started_at": "2026-01-01T00:00:00Z",
"status": "succeeded",
"total_rows": 0,
"transaction_id": "<transaction_id>"
}
],
"previous_job_run_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"profile": "<profile>",
"started_at": "2026-01-01T00:00:00Z",
"status": "pending",
"trigger": "<trigger>",
"triggered_by": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"updated_at": "2026-01-01T00:00:00Z",
"workspace_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6"
}

Cancel job runs​

POST /api/v1/workspaces/{workspace_id}/job-runs/-cancel

Requests cancellation of the given runs in a single transaction. Each run moves to cancelling and then to cancelled once stopped.

Answers a receipt: succeeded runs were moved to cancelling, skipped runs were already finished or already being cancelled, and failed lists ids that name no run in the workspace. Use dry_run=true to preview without cancelling.

Requires the developer role (or higher) in the workspace.

Request

Path parameters

NameTypeDescription
workspace_idstring (uuid)ID of the workspace
Response (200, 4xx, 5xx)
{
"failed": [
{
"detail": "<detail>",
"ref": "<ref>"
}
],
"skipped": [
{
"job_ref": "<job_ref>",
"job_run_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"job_run_number": 0,
"previous_status": "pending"
}
],
"succeeded": [
{
"job_ref": "<job_ref>",
"job_run_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"job_run_number": 0,
"previous_status": "pending"
}
]
}

Get job run​

GET /api/v1/workspaces/{workspace_id}/job-runs/{job_run_id}

Gets a run for a workspace by ID.

Requires the viewer role (or higher) in the workspace.

Request

Path parameters

NameTypeDescription
workspace_idstring (uuid)ID of the workspace
job_run_idstring (uuid)ID of the job run
Response (200, 4xx, 5xx)
{
"attention_reasons": ["failed"],
"configuration_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"created_at": "2026-01-01T00:00:00Z",
"deployment_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"downstream_job_runs": [
{
"category": "pipeline",
"duration_seconds": 0,
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"job_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"job_ref": "<job_ref>",
"name": "<name>",
"number": 0,
"started_at": "2026-01-01T00:00:00Z",
"status": "pending",
"trigger": "<trigger>"
}
],
"duration_seconds": 0,
"finished_at": "2026-01-01T00:00:00Z",
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"interval_end": "2026-01-01T00:00:00Z",
"interval_start": "2026-01-01T00:00:00Z",
"job": {
"created_at": "2026-01-01T00:00:00Z",
"created_by": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"default_trigger": "<default_trigger>",
"deployment_module": "<deployment_module>",
"description": "<description>",
"freshness": ["<freshness>"],
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"interval_end": "2026-01-01T00:00:00Z",
"interval_start": "2026-01-01T00:00:00Z",
"is_archived": false,
"is_paused": false,
"job_definition": {},
"job_definition_engine_version": 0,
"job_definition_hash": "<job_definition_hash>",
"job_ref": "<job_ref>",
"job_type": "batch",
"job_url": "<job_url>",
"name": "<name>",
"next_scheduled_run_at": "2026-01-01T00:00:00Z",
"pipeline_name": "<pipeline_name>",
"profile": "<profile>",
"public_secret": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"public_url": "<public_url>",
"triggers": ["<triggers>"],
"updated_at": "2026-01-01T00:00:00Z",
"version": 0,
"workspace_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6"
},
"job_version": {
"created_at": "2026-01-01T00:00:00Z",
"created_by": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"default_trigger": "<default_trigger>",
"deployment_module": "<deployment_module>",
"description": "<description>",
"freshness": ["<freshness>"],
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"instance_size": "small",
"interval_end": "2026-01-01T00:00:00Z",
"interval_start": "2026-01-01T00:00:00Z",
"job_definition": {},
"job_definition_engine_version": 0,
"job_definition_hash": "<job_definition_hash>",
"job_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"job_ref": "<job_ref>",
"job_type": "batch",
"max_run_time_seconds": 0,
"memory_mib": 0,
"name": "<name>",
"pipeline_name": "<pipeline_name>",
"profile": "<profile>",
"provider": "tower",
"triggers": ["<triggers>"],
"updated_at": "2026-01-01T00:00:00Z",
"vcpu": 0,
"version": 0
},
"job_version_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"logs_url": "<logs_url>",
"number": 0,
"pipeline_run_summaries": [
{
"dataset_name": "<dataset_name>",
"destination_name": "<destination_name>",
"duration_ms": 0,
"finished_at": "2026-01-01T00:00:00Z",
"pipeline_name": "<pipeline_name>",
"pipeline_run_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"started_at": "2026-01-01T00:00:00Z",
"status": "succeeded",
"total_rows": 0,
"transaction_id": "<transaction_id>"
}
],
"previous_job_run_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"profile": "<profile>",
"started_at": "2026-01-01T00:00:00Z",
"status": "pending",
"trigger": "<trigger>",
"triggered_by": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"updated_at": "2026-01-01T00:00:00Z",
"workspace_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6"
}

Cancel job run​

POST /api/v1/workspaces/{workspace_id}/job-runs/{job_run_id}/-cancel

Requests cancellation of a run. The run moves to cancelling and then to cancelled once stopped. A run that is already finished or cancelling answers 400.

Requires the developer role (or higher) in the workspace.

Request

Path parameters

NameTypeDescription
workspace_idstring (uuid)ID of the workspace
job_run_idstring (uuid)ID of the job run
Response (200, 4xx, 5xx)
{
"attention_reasons": ["failed"],
"configuration_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"created_at": "2026-01-01T00:00:00Z",
"deployment_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"downstream_job_runs": [
{
"category": "pipeline",
"duration_seconds": 0,
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"job_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"job_ref": "<job_ref>",
"name": "<name>",
"number": 0,
"started_at": "2026-01-01T00:00:00Z",
"status": "pending",
"trigger": "<trigger>"
}
],
"duration_seconds": 0,
"finished_at": "2026-01-01T00:00:00Z",
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"interval_end": "2026-01-01T00:00:00Z",
"interval_start": "2026-01-01T00:00:00Z",
"job": {
"created_at": "2026-01-01T00:00:00Z",
"created_by": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"default_trigger": "<default_trigger>",
"deployment_module": "<deployment_module>",
"description": "<description>",
"freshness": ["<freshness>"],
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"interval_end": "2026-01-01T00:00:00Z",
"interval_start": "2026-01-01T00:00:00Z",
"is_archived": false,
"is_paused": false,
"job_definition": {},
"job_definition_engine_version": 0,
"job_definition_hash": "<job_definition_hash>",
"job_ref": "<job_ref>",
"job_type": "batch",
"job_url": "<job_url>",
"name": "<name>",
"next_scheduled_run_at": "2026-01-01T00:00:00Z",
"pipeline_name": "<pipeline_name>",
"profile": "<profile>",
"public_secret": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"public_url": "<public_url>",
"triggers": ["<triggers>"],
"updated_at": "2026-01-01T00:00:00Z",
"version": 0,
"workspace_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6"
},
"job_version": {
"created_at": "2026-01-01T00:00:00Z",
"created_by": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"default_trigger": "<default_trigger>",
"deployment_module": "<deployment_module>",
"description": "<description>",
"freshness": ["<freshness>"],
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"instance_size": "small",
"interval_end": "2026-01-01T00:00:00Z",
"interval_start": "2026-01-01T00:00:00Z",
"job_definition": {},
"job_definition_engine_version": 0,
"job_definition_hash": "<job_definition_hash>",
"job_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"job_ref": "<job_ref>",
"job_type": "batch",
"max_run_time_seconds": 0,
"memory_mib": 0,
"name": "<name>",
"pipeline_name": "<pipeline_name>",
"profile": "<profile>",
"provider": "tower",
"triggers": ["<triggers>"],
"updated_at": "2026-01-01T00:00:00Z",
"vcpu": 0,
"version": 0
},
"job_version_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"logs_url": "<logs_url>",
"number": 0,
"pipeline_run_summaries": [
{
"dataset_name": "<dataset_name>",
"destination_name": "<destination_name>",
"duration_ms": 0,
"finished_at": "2026-01-01T00:00:00Z",
"pipeline_name": "<pipeline_name>",
"pipeline_run_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"started_at": "2026-01-01T00:00:00Z",
"status": "succeeded",
"total_rows": 0,
"transaction_id": "<transaction_id>"
}
],
"previous_job_run_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"profile": "<profile>",
"started_at": "2026-01-01T00:00:00Z",
"status": "pending",
"trigger": "<trigger>",
"triggered_by": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"updated_at": "2026-01-01T00:00:00Z",
"workspace_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6"
}

Jobs​

List jobs​

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

Gets the jobs of a workspace as a paginated list, most recent run first; jobs that never ran come last.

Search with q over the job name; filter by ref, type, archived or paused state, profile, pipeline, the status of the latest run, trigger kind, category, tags (given without the tag: prefix) or a created_at window; sort with paired sort and order lists.

Archived and live jobs are both listed unless is_archived says which to keep.

Requires the viewer role (or higher) in the workspace.

Request

Path parameters

NameTypeDescription
workspace_idstring (uuid)ID of the workspace

Query parameters

NameTypeDescription
qstring or nullCase-insensitive substring match on name.
refstring or nullExact match on job_ref.
job_typearray of string or nullExact match on job_type. Repeat the parameter to match any of several values. One of: batch, interactive, stream.
is_archivedboolean or nullMatch is_archived. Omit to list both.
is_pausedboolean or nullMatch is_paused. Omit to list both.
profilearray of string or nullExact match on profile. Repeat the parameter to match any of several values.
pipeline_namearray of string or nullExact match on pipeline_name. Repeat the parameter to match any of several values.
statusarray of string or nullExact match on the status of the job's most recent run. Repeat the parameter to match any of several values. One of: pending, starting, running, completed, failed, cancelled, skipped, cancelling.
trigger_kindarray of string or nullMatch jobs declaring a trigger of any given kind. A job may declare several kinds at once; manual reflects the job's expose.manual setting, which is on by default. One of: schedule, every, once, webhook, http, job.success, job.fail, manual.
is_self_firingboolean or nullMatch jobs by whether they declare a trigger that starts them with no person involved: a schedule, an interval, a one-off time, a webhook, an HTTP endpoint, or another job's outcome.
categoryarray of string or nullMatch jobs declaring any of the given expose.category values. Most jobs declare none and match nothing here. One of: pipeline, mcp, dashboard, notebook, background_agent.
exclude_categoryarray of string or nullDrop jobs declaring any of the given expose.category values. A job declaring none is kept. One of: pipeline, mcp, dashboard, notebook, background_agent.
tagsarray of string or nullMatch jobs carrying any of the given tags.
startstring (date-time) or nullLower bound (inclusive) on created_at, as a naive local time read in timezone, e.g. 2026-03-01T00:00:00.
endstring (date-time) or nullUpper bound (exclusive) on created_at, as a naive local time read in timezone, e.g. 2026-03-11T00:00:00.
timezonestringIANA timezone in which start and end are read, e.g. Europe/Berlin. Default UTC.
sortarray of string or nullKeys to sort by, applied in the order given. Pairs positionally with order, which must have the same number of entries. One of: last_run_at, last_run_ended_at, name, next_scheduled_run_at, created_at.
recent_job_runs_limitinteger or nullAttach this many of the job's most recent runs.
downstream_job_runs_limitinteger or nullAttach this many of the runs each run triggered, newest first. Only runs started by the run's outcome are linked.
downstream_job_runs_categorystring or nullAttach only downstream runs whose job declares this category, so the newest of that kind is found however many other runs came after it. One of: pipeline, mcp, dashboard, notebook, background_agent.

Pagination: limit, offset, order, cursor, see Lists and pagination

Response (200, 4xx, 5xx)
{
"items": [
{
"created_at": "2026-01-01T00:00:00Z",
"created_by": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"current_version": {
"created_at": "2026-01-01T00:00:00Z",
"created_by": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"default_trigger": "<default_trigger>",
"deployment_module": "<deployment_module>",
"description": "<description>",
"freshness": ["<freshness>"],
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"instance_size": "small",
"interval_end": "2026-01-01T00:00:00Z",
"interval_start": "2026-01-01T00:00:00Z",
"job_definition": {},
"job_definition_engine_version": 0,
"job_definition_hash": "<job_definition_hash>",
"job_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"job_ref": "<job_ref>",
"job_type": "batch",
"max_run_time_seconds": 0,
"memory_mib": 0,
"name": "<name>",
"pipeline_name": "<pipeline_name>",
"profile": "<profile>",
"provider": "tower",
"triggers": ["<triggers>"],
"updated_at": "2026-01-01T00:00:00Z",
"vcpu": 0,
"version": 0
},
"default_trigger": "<default_trigger>",
"deployment_module": "<deployment_module>",
"description": "<description>",
"downstream_job_runs": [
{
"category": "pipeline",
"duration_seconds": 0,
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"job_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"job_ref": "<job_ref>",
"name": "<name>",
"number": 0,
"started_at": "2026-01-01T00:00:00Z",
"status": "pending",
"trigger": "<trigger>"
}
],
"freshness": ["<freshness>"],
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"interval_end": "2026-01-01T00:00:00Z",
"interval_start": "2026-01-01T00:00:00Z",
"is_archived": false,
"is_paused": false,
"job_definition": {},
"job_definition_engine_version": 0,
"job_definition_hash": "<job_definition_hash>",
"job_ref": "<job_ref>",
"job_type": "batch",
"job_url": "<job_url>",
"latest_job_run": {
"configuration_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"created_at": "2026-01-01T00:00:00Z",
"deployment_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"duration_seconds": 0,
"finished_at": "2026-01-01T00:00:00Z",
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"interval_end": "2026-01-01T00:00:00Z",
"interval_start": "2026-01-01T00:00:00Z",
"job_version_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"logs_url": "<logs_url>",
"number": 0,
"pipeline_run_summaries": [],
"previous_job_run_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"profile": "<profile>",
"started_at": "2026-01-01T00:00:00Z",
"status": "pending",
"trigger": "<trigger>",
"triggered_by": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"updated_at": "2026-01-01T00:00:00Z",
"workspace_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6"
},
"name": "<name>",
"next_scheduled_run_at": "2026-01-01T00:00:00Z",
"pipeline_name": "<pipeline_name>",
"profile": "<profile>",
"public_secret": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"public_url": "<public_url>",
"recent_job_runs": [
{
"duration_seconds": 0,
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"rows_loaded": 0,
"started_at": "2026-01-01T00:00:00Z",
"status": "pending"
}
],
"triggers": ["<triggers>"],
"updated_at": "2026-01-01T00:00:00Z",
"version": 0,
"workspace_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6"
}
],
"limit": 0,
"next_cursor": "<next_cursor>",
"offset": 0,
"total": 0
}

Trigger jobs​

POST /api/v1/workspaces/{workspace_id}/jobs/-trigger

Triggers jobs by job_ids and/or by selectors. A job named in job_ids fires its default_trigger, or manual:<job_ref> if it has none. A selector is matched against each job's triggers with shell-style wildcards, e.g. tag:backfill, schedule:*, manual:jobs.my_module.*; a bare trigger type like schedule means schedule:*, and batch (or job), interactive and stream select every trigger of jobs of that type. A job matched by a selector fires the trigger it matched. When a job is matched both by id and by selector, it fires its default_trigger if that is among the matched triggers, otherwise one of the matched triggers. Archived jobs are never matched.

Jobs start upstream first, and each must pass the freshness check: a job whose upstream is also triggered in this request is skipped with skipped_upstream_pending, and a job whose upstream is not fresh is skipped with skipped_fresh. To start a single job regardless of its upstreams, use create_job_run with skip_freshness=true.

Runs start one by one; a failure part-way through leaves the runs created before it.

Answers a receipt: succeeded jobs started a run, skipped jobs did not (their status and reasons say why), and failed lists requested ids that name no job or an archived job. dry_run previews which jobs match and pass the freshness check, without creating runs.

Requires the viewer role (or higher) in the workspace. Viewers may only run jobs that use the read-only access profile (by default interactive and agent jobs); any other profile needs the developer role, and a single such job rejects the whole request with 403.

Request

Path parameters

NameTypeDescription
workspace_idstring (uuid)ID of the workspace
Response (200, 4xx, 5xx)
{
"failed": [
{
"detail": "<detail>",
"ref": "<ref>"
}
],
"skipped": [
{
"job_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"job_ref": "<job_ref>",
"job_run": {
"configuration_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"created_at": "2026-01-01T00:00:00Z",
"deployment_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"duration_seconds": 0,
"finished_at": "2026-01-01T00:00:00Z",
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"interval_end": "2026-01-01T00:00:00Z",
"interval_start": "2026-01-01T00:00:00Z",
"job_version_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"logs_url": "<logs_url>",
"number": 0,
"pipeline_run_summaries": [],
"previous_job_run_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"profile": "<profile>",
"started_at": "2026-01-01T00:00:00Z",
"status": "pending",
"trigger": "<trigger>",
"triggered_by": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"updated_at": "2026-01-01T00:00:00Z",
"workspace_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6"
},
"job_run_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"matched_triggers": ["<matched_triggers>"],
"reasons": ["<reasons>"],
"status": "triggered",
"trigger": "<trigger>"
}
],
"succeeded": [
{
"job_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"job_ref": "<job_ref>",
"job_run": {
"configuration_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"created_at": "2026-01-01T00:00:00Z",
"deployment_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"duration_seconds": 0,
"finished_at": "2026-01-01T00:00:00Z",
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"interval_end": "2026-01-01T00:00:00Z",
"interval_start": "2026-01-01T00:00:00Z",
"job_version_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"logs_url": "<logs_url>",
"number": 0,
"pipeline_run_summaries": [],
"previous_job_run_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"profile": "<profile>",
"started_at": "2026-01-01T00:00:00Z",
"status": "pending",
"trigger": "<trigger>",
"triggered_by": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"updated_at": "2026-01-01T00:00:00Z",
"workspace_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6"
},
"job_run_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"matched_triggers": ["<matched_triggers>"],
"reasons": ["<reasons>"],
"status": "triggered",
"trigger": "<trigger>"
}
]
}

Get job​

GET /api/v1/workspaces/{workspace_id}/jobs/{job_id}

Gets a job for a workspace by its ID. Find a job by its ref with list_jobs.

Requires the viewer role (or higher) in the workspace.

Request

Path parameters

NameTypeDescription
workspace_idstring (uuid)ID of the workspace
job_idstring (uuid)ID of the job

Query parameters

NameTypeDescription
recent_job_runs_limitinteger or nullAttach this many of the job's most recent runs.
Response (200, 4xx, 5xx)
{
"created_at": "2026-01-01T00:00:00Z",
"created_by": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"current_version": {
"created_at": "2026-01-01T00:00:00Z",
"created_by": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"default_trigger": "<default_trigger>",
"deployment_module": "<deployment_module>",
"description": "<description>",
"freshness": ["<freshness>"],
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"instance_size": "small",
"interval_end": "2026-01-01T00:00:00Z",
"interval_start": "2026-01-01T00:00:00Z",
"job_definition": {},
"job_definition_engine_version": 0,
"job_definition_hash": "<job_definition_hash>",
"job_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"job_ref": "<job_ref>",
"job_type": "batch",
"max_run_time_seconds": 0,
"memory_mib": 0,
"name": "<name>",
"pipeline_name": "<pipeline_name>",
"profile": "<profile>",
"provider": "tower",
"triggers": ["<triggers>"],
"updated_at": "2026-01-01T00:00:00Z",
"vcpu": 0,
"version": 0
},
"default_trigger": "<default_trigger>",
"deployment_module": "<deployment_module>",
"description": "<description>",
"downstream_job_runs": [
{
"category": "pipeline",
"duration_seconds": 0,
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"job_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"job_ref": "<job_ref>",
"name": "<name>",
"number": 0,
"started_at": "2026-01-01T00:00:00Z",
"status": "pending",
"trigger": "<trigger>"
}
],
"freshness": ["<freshness>"],
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"interval_end": "2026-01-01T00:00:00Z",
"interval_start": "2026-01-01T00:00:00Z",
"is_archived": false,
"is_paused": false,
"job_definition": {},
"job_definition_engine_version": 0,
"job_definition_hash": "<job_definition_hash>",
"job_ref": "<job_ref>",
"job_type": "batch",
"job_url": "<job_url>",
"latest_job_run": {
"configuration_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"created_at": "2026-01-01T00:00:00Z",
"deployment_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"duration_seconds": 0,
"finished_at": "2026-01-01T00:00:00Z",
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"interval_end": "2026-01-01T00:00:00Z",
"interval_start": "2026-01-01T00:00:00Z",
"job_version_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"logs_url": "<logs_url>",
"number": 0,
"pipeline_run_summaries": [
{
"dataset_name": "<dataset_name>",
"destination_name": "<destination_name>",
"duration_ms": 0,
"finished_at": "2026-01-01T00:00:00Z",
"pipeline_name": "<pipeline_name>",
"pipeline_run_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"started_at": "2026-01-01T00:00:00Z",
"status": "succeeded",
"total_rows": 0,
"transaction_id": "<transaction_id>"
}
],
"previous_job_run_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"profile": "<profile>",
"started_at": "2026-01-01T00:00:00Z",
"status": "pending",
"trigger": "<trigger>",
"triggered_by": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"updated_at": "2026-01-01T00:00:00Z",
"workspace_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6"
},
"name": "<name>",
"next_scheduled_run_at": "2026-01-01T00:00:00Z",
"pipeline_name": "<pipeline_name>",
"profile": "<profile>",
"public_secret": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"public_url": "<public_url>",
"recent_job_runs": [
{
"duration_seconds": 0,
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"rows_loaded": 0,
"started_at": "2026-01-01T00:00:00Z",
"status": "pending"
}
],
"triggers": ["<triggers>"],
"updated_at": "2026-01-01T00:00:00Z",
"version": 0,
"workspace_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6"
}

Archive job​

POST /api/v1/workspaces/{workspace_id}/jobs/{job_id}/-archive

Archives a job. An archived job cannot be run (neither manually nor by schedule); listings include it unless is_archived filters it out. Archiving clears the job's schedule and pause, and its public URL stops working until it is unarchived. Idempotent.

Requires the developer role (or higher) in the workspace.

Request

Path parameters

NameTypeDescription
workspace_idstring (uuid)ID of the workspace
job_idstring (uuid)ID of the job
Response (200, 4xx, 5xx)
{
"created_at": "2026-01-01T00:00:00Z",
"created_by": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"default_trigger": "<default_trigger>",
"deployment_module": "<deployment_module>",
"description": "<description>",
"freshness": ["<freshness>"],
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"interval_end": "2026-01-01T00:00:00Z",
"interval_start": "2026-01-01T00:00:00Z",
"is_archived": false,
"is_paused": false,
"job_definition": {},
"job_definition_engine_version": 0,
"job_definition_hash": "<job_definition_hash>",
"job_ref": "<job_ref>",
"job_type": "batch",
"job_url": "<job_url>",
"name": "<name>",
"next_scheduled_run_at": "2026-01-01T00:00:00Z",
"pipeline_name": "<pipeline_name>",
"profile": "<profile>",
"public_secret": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"public_url": "<public_url>",
"triggers": ["<triggers>"],
"updated_at": "2026-01-01T00:00:00Z",
"version": 0,
"workspace_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6"
}

Pause job​

POST /api/v1/workspaces/{workspace_id}/jobs/{job_id}/-pause

Pauses a job's scheduled runs. The scheduler stops starting it, including a scheduled run that was waiting for its upstream jobs. Manual runs, trigger_jobs and runs started by another job's success or failure still run.

Only a job with next_scheduled_run_at can be paused; an archived job or one without a schedule answers 400.

next_scheduled_run_at keeps advancing while the job is paused, so resuming produces one run covering the whole period. A deploy that removes the schedule also removes the pause; otherwise a deploy leaves it alone. The public URL is untouched. Idempotent.

Requires the developer role (or higher) in the workspace.

Request

Path parameters

NameTypeDescription
workspace_idstring (uuid)ID of the workspace
job_idstring (uuid)ID of the job
Response (200, 4xx, 5xx)
{
"created_at": "2026-01-01T00:00:00Z",
"created_by": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"default_trigger": "<default_trigger>",
"deployment_module": "<deployment_module>",
"description": "<description>",
"freshness": ["<freshness>"],
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"interval_end": "2026-01-01T00:00:00Z",
"interval_start": "2026-01-01T00:00:00Z",
"is_archived": false,
"is_paused": false,
"job_definition": {},
"job_definition_engine_version": 0,
"job_definition_hash": "<job_definition_hash>",
"job_ref": "<job_ref>",
"job_type": "batch",
"job_url": "<job_url>",
"name": "<name>",
"next_scheduled_run_at": "2026-01-01T00:00:00Z",
"pipeline_name": "<pipeline_name>",
"profile": "<profile>",
"public_secret": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"public_url": "<public_url>",
"triggers": ["<triggers>"],
"updated_at": "2026-01-01T00:00:00Z",
"version": 0,
"workspace_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6"
}

Publish job​

POST /api/v1/workspaces/{workspace_id}/jobs/{job_id}/-publish

Enables or regenerates the public URL for a job. This creates a new public_secret that gives access to the job without authentication. Calling it again generates a new public_secret, invalidating any previous public URL. The URL does not work while the job is archived.

Requires the developer role (or higher) in the workspace.

Request

Path parameters

NameTypeDescription
workspace_idstring (uuid)ID of the workspace
job_idstring (uuid)ID of the job
Response (200, 4xx, 5xx)
{
"created_at": "2026-01-01T00:00:00Z",
"created_by": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"default_trigger": "<default_trigger>",
"deployment_module": "<deployment_module>",
"description": "<description>",
"freshness": ["<freshness>"],
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"interval_end": "2026-01-01T00:00:00Z",
"interval_start": "2026-01-01T00:00:00Z",
"is_archived": false,
"is_paused": false,
"job_definition": {},
"job_definition_engine_version": 0,
"job_definition_hash": "<job_definition_hash>",
"job_ref": "<job_ref>",
"job_type": "batch",
"job_url": "<job_url>",
"name": "<name>",
"next_scheduled_run_at": "2026-01-01T00:00:00Z",
"pipeline_name": "<pipeline_name>",
"profile": "<profile>",
"public_secret": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"public_url": "<public_url>",
"triggers": ["<triggers>"],
"updated_at": "2026-01-01T00:00:00Z",
"version": 0,
"workspace_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6"
}

Resume job​

POST /api/v1/workspaces/{workspace_id}/jobs/{job_id}/-resume

Resumes a paused job, so the scheduler starts it again. The first run after resuming covers the whole period the job was paused for. Idempotent.

Requires the developer role (or higher) in the workspace.

Request

Path parameters

NameTypeDescription
workspace_idstring (uuid)ID of the workspace
job_idstring (uuid)ID of the job
Response (200, 4xx, 5xx)
{
"created_at": "2026-01-01T00:00:00Z",
"created_by": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"default_trigger": "<default_trigger>",
"deployment_module": "<deployment_module>",
"description": "<description>",
"freshness": ["<freshness>"],
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"interval_end": "2026-01-01T00:00:00Z",
"interval_start": "2026-01-01T00:00:00Z",
"is_archived": false,
"is_paused": false,
"job_definition": {},
"job_definition_engine_version": 0,
"job_definition_hash": "<job_definition_hash>",
"job_ref": "<job_ref>",
"job_type": "batch",
"job_url": "<job_url>",
"name": "<name>",
"next_scheduled_run_at": "2026-01-01T00:00:00Z",
"pipeline_name": "<pipeline_name>",
"profile": "<profile>",
"public_secret": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"public_url": "<public_url>",
"triggers": ["<triggers>"],
"updated_at": "2026-01-01T00:00:00Z",
"version": 0,
"workspace_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6"
}

Unarchive job​

POST /api/v1/workspaces/{workspace_id}/jobs/{job_id}/-unarchive

Unarchives a job so it can run again, restoring the schedule and default trigger from its definition; a pause is not restored. Idempotent.

Requires the developer role (or higher) in the workspace.

Request

Path parameters

NameTypeDescription
workspace_idstring (uuid)ID of the workspace
job_idstring (uuid)ID of the job
Response (200, 4xx, 5xx)
{
"created_at": "2026-01-01T00:00:00Z",
"created_by": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"default_trigger": "<default_trigger>",
"deployment_module": "<deployment_module>",
"description": "<description>",
"freshness": ["<freshness>"],
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"interval_end": "2026-01-01T00:00:00Z",
"interval_start": "2026-01-01T00:00:00Z",
"is_archived": false,
"is_paused": false,
"job_definition": {},
"job_definition_engine_version": 0,
"job_definition_hash": "<job_definition_hash>",
"job_ref": "<job_ref>",
"job_type": "batch",
"job_url": "<job_url>",
"name": "<name>",
"next_scheduled_run_at": "2026-01-01T00:00:00Z",
"pipeline_name": "<pipeline_name>",
"profile": "<profile>",
"public_secret": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"public_url": "<public_url>",
"triggers": ["<triggers>"],
"updated_at": "2026-01-01T00:00:00Z",
"version": 0,
"workspace_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6"
}

Unpublish job​

POST /api/v1/workspaces/{workspace_id}/jobs/{job_id}/-unpublish

Disables the public URL for a job by clearing its public_secret. Afterwards the job is no longer reachable through its public URL, and public_url is null.

Requires the developer role (or higher) in the workspace.

Request

Path parameters

NameTypeDescription
workspace_idstring (uuid)ID of the workspace
job_idstring (uuid)ID of the job
Response (200, 4xx, 5xx)
{
"created_at": "2026-01-01T00:00:00Z",
"created_by": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"default_trigger": "<default_trigger>",
"deployment_module": "<deployment_module>",
"description": "<description>",
"freshness": ["<freshness>"],
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"interval_end": "2026-01-01T00:00:00Z",
"interval_start": "2026-01-01T00:00:00Z",
"is_archived": false,
"is_paused": false,
"job_definition": {},
"job_definition_engine_version": 0,
"job_definition_hash": "<job_definition_hash>",
"job_ref": "<job_ref>",
"job_type": "batch",
"job_url": "<job_url>",
"name": "<name>",
"next_scheduled_run_at": "2026-01-01T00:00:00Z",
"pipeline_name": "<pipeline_name>",
"profile": "<profile>",
"public_secret": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"public_url": "<public_url>",
"triggers": ["<triggers>"],
"updated_at": "2026-01-01T00:00:00Z",
"version": 0,
"workspace_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6"
}

Me​

Get me​

GET /api/v1/me

Gets your user profile and organization memberships. primary_organization is where new workspaces are created by default; latest_organization and latest_workspace are the ones you used last. Workspaces are listed per organization by get_organization_me.

Each call also accepts your pending invites and creates your playground workspace in any organization that lacks one. On the first call for a user who has no organization yet, it creates a personal organization and a playground workspace, so a freshly authenticated user always gets a 200.

Requires a personal API key or a user login; a workspace API key answers 403.

Request
curl "https://api.dlthub.com/api/v1/me" \
-H "Authorization: Bearer $DLTHUB_API_KEY"
Response (200, 4xx, 5xx)
{
"email": "<email>",
"latest_organization": {
"created_at": "2026-01-01T00:00:00Z",
"dataplane_id": "<dataplane_id>",
"description": "<description>",
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"name": "<name>",
"updated_at": "2026-01-01T00:00:00Z"
},
"latest_workspace": {
"archived_at": "2026-01-01T00:00:00Z",
"created_at": "2026-01-01T00:00:00Z",
"dataplane_id": "<dataplane_id>",
"dataplane_url": "<dataplane_url>",
"description": "<description>",
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"is_playground": false,
"name": "<name>",
"organization_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"predefined_profiles": {},
"updated_at": "2026-01-01T00:00:00Z"
},
"name": "<name>",
"organization_membership_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"organization_memberships": [
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"is_active": false,
"organization": {
"created_at": "2026-01-01T00:00:00Z",
"dataplane_id": "<dataplane_id>",
"description": "<description>",
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"name": "<name>",
"updated_at": "2026-01-01T00:00:00Z"
},
"role": "owner"
}
],
"primary_organization": {
"created_at": "2026-01-01T00:00:00Z",
"dataplane_id": "<dataplane_id>",
"description": "<description>",
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"name": "<name>",
"updated_at": "2026-01-01T00:00:00Z"
},
"user_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6"
}

Organization me​

GET /api/v1/organizations/{organization_id}/me

Gets your context in an organization: the organization, your role and membership id there, and the workspaces you can access in it with your role in each.

Any organization member, including collaborators.

Request

Path parameters

NameTypeDescription
organization_idstring (uuid)ID of the organization
Response (200, 4xx, 5xx)
{
"email": "<email>",
"organization": {
"created_at": "2026-01-01T00:00:00Z",
"dataplane_id": "<dataplane_id>",
"description": "<description>",
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"name": "<name>",
"updated_at": "2026-01-01T00:00:00Z"
},
"organization_membership_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"role": "owner",
"user_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"workspace_memberships": [
{
"role": "owner",
"workspace": {
"archived_at": "2026-01-01T00:00:00Z",
"created_at": "2026-01-01T00:00:00Z",
"dataplane_id": "<dataplane_id>",
"dataplane_url": "<dataplane_url>",
"description": "<description>",
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"is_playground": false,
"name": "<name>",
"organization_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"predefined_profiles": {},
"updated_at": "2026-01-01T00:00:00Z"
}
}
]
}

Workspace me​

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

Gets your context in a workspace: the workspace, your role in it, its organization and your role and membership id there.

Also records this workspace as your latest, which get_me returns in latest_workspace.

Requires the viewer role (or higher) in the workspace.

Request

Path parameters

NameTypeDescription
workspace_idstring (uuid)ID of the workspace
Response (200, 4xx, 5xx)
{
"email": "<email>",
"organization": {
"created_at": "2026-01-01T00:00:00Z",
"dataplane_id": "<dataplane_id>",
"description": "<description>",
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"name": "<name>",
"updated_at": "2026-01-01T00:00:00Z"
},
"organization_membership_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"organization_role": "owner",
"user_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"workspace": {
"archived_at": "2026-01-01T00:00:00Z",
"created_at": "2026-01-01T00:00:00Z",
"dataplane_id": "<dataplane_id>",
"dataplane_url": "<dataplane_url>",
"description": "<description>",
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"is_playground": false,
"name": "<name>",
"organization_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"predefined_profiles": {},
"updated_at": "2026-01-01T00:00:00Z"
},
"workspace_role": "owner"
}

Organizations​

List organizations​

GET /api/v1/organizations

Lists all organizations the current user is a member of, as a paginated list.

Requires any valid credential; no particular role is needed.

Request

Query parameters

NameTypeDescription
sortarray of string or nullKeys to sort by, applied in the order given. Pairs positionally with order, which must have the same number of entries. One of: created_at, name.

Pagination: limit, offset, order, cursor, see Lists and pagination

Response (200, 4xx, 5xx)
{
"items": [
{
"created_at": "2026-01-01T00:00:00Z",
"dataplane_id": "<dataplane_id>",
"description": "<description>",
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"name": "<name>",
"updated_at": "2026-01-01T00:00:00Z"
}
],
"limit": 0,
"next_cursor": "<next_cursor>",
"offset": 0,
"total": 0
}

Get organization​

GET /api/v1/organizations/{organization_id}

Gets information about an organization.

Any organization member, including collaborators.

Request

Path parameters

NameTypeDescription
organization_idstring (uuid)ID of the organization
Response (200, 4xx, 5xx)
{
"created_at": "2026-01-01T00:00:00Z",
"dataplane_id": "<dataplane_id>",
"description": "<description>",
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"name": "<name>",
"updated_at": "2026-01-01T00:00:00Z"
}

Set organization region​

POST /api/v1/organizations/{organization_id}/-set-region

Sets the organization's region, its data plane. This is one-time and irreversible: a second attempt returns 409. An unknown dataplane_id returns 400. List the available data planes with list_dataplanes.

Requires the organization owner role.

Request

Path parameters

NameTypeDescription
organization_idstring (uuid)ID of the organization
Response (200, 4xx, 5xx)
{
"created_at": "2026-01-01T00:00:00Z",
"dataplane_id": "<dataplane_id>",
"description": "<description>",
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"name": "<name>",
"updated_at": "2026-01-01T00:00:00Z"
}

Workspaces​

List workspaces​

GET /api/v1/organizations/{organization_id}/workspaces

Lists the workspaces under an organization visible to the caller, as a paginated list, oldest first by default. Organization owners see every workspace; members see the workspaces they belong to or reach through a workspace's default member role; collaborators see only the workspaces they belong to.

Each workspace includes member stats: its owners and the count of active members.

Playground workspaces of other members are not included; the caller only sees their own.

Archived workspaces are excluded by default; pass include_archived=true to list them.

Any organization member, including collaborators.

Request

Path parameters

NameTypeDescription
organization_idstring (uuid)ID of the organization

Query parameters

NameTypeDescription
sortarray of string or nullKeys to sort by, applied in the order given. Pairs positionally with order, which must have the same number of entries. One of: created_at, name.
include_archivedbooleanInclude archived workspaces. They are excluded unless set.

Pagination: limit, offset, order, cursor, see Lists and pagination

Response (200, 4xx, 5xx)
{
"items": [
{
"archived_at": "2026-01-01T00:00:00Z",
"created_at": "2026-01-01T00:00:00Z",
"dataplane_id": "<dataplane_id>",
"dataplane_url": "<dataplane_url>",
"description": "<description>",
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"is_playground": false,
"member_count": 0,
"name": "<name>",
"organization_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"owner_members": [
{
"email": "<email>",
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"name": "<name>",
"organization_membership_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"role": "owner",
"user_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6"
}
],
"predefined_profiles": {},
"updated_at": "2026-01-01T00:00:00Z"
}
],
"limit": 0,
"next_cursor": "<next_cursor>",
"offset": 0,
"total": 0
}

Create workspace​

POST /api/v1/organizations/{organization_id}/workspaces

Creates a workspace in the organization; the caller becomes its owner. Send both name and description (description may be null). Answers 409 until the organization's region is set with set_region_organization.

Requires the organization member or owner role.

Request

Path parameters

NameTypeDescription
organization_idstring (uuid)ID of the organization
Response (201, 4xx, 5xx)
{
"archived_at": "2026-01-01T00:00:00Z",
"created_at": "2026-01-01T00:00:00Z",
"dataplane_id": "<dataplane_id>",
"dataplane_url": "<dataplane_url>",
"description": "<description>",
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"is_playground": false,
"name": "<name>",
"organization_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"predefined_profiles": {},
"updated_at": "2026-01-01T00:00:00Z"
}

Get workspace​

GET /api/v1/workspaces/{workspace_id}

Gets information about a workspace.

Requires the viewer role (or higher) in the workspace.

Request

Path parameters

NameTypeDescription
workspace_idstring (uuid)ID of the workspace
Response (200, 4xx, 5xx)
{
"archived_at": "2026-01-01T00:00:00Z",
"created_at": "2026-01-01T00:00:00Z",
"dataplane_id": "<dataplane_id>",
"dataplane_url": "<dataplane_url>",
"description": "<description>",
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"is_playground": false,
"name": "<name>",
"organization_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"predefined_profiles": {},
"updated_at": "2026-01-01T00:00:00Z"
}

Update workspace​

PATCH /api/v1/workspaces/{workspace_id}

Updates the information for a workspace.

Answers 400 for a playground workspace and 409 for an archived one.

Requires the workspace owner role.

Request

Path parameters

NameTypeDescription
workspace_idstring (uuid)ID of the workspace
Response (200, 4xx, 5xx)
{
"archived_at": "2026-01-01T00:00:00Z",
"created_at": "2026-01-01T00:00:00Z",
"dataplane_id": "<dataplane_id>",
"dataplane_url": "<dataplane_url>",
"description": "<description>",
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"is_playground": false,
"name": "<name>",
"organization_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"predefined_profiles": {},
"updated_at": "2026-01-01T00:00:00Z"
}

Archive workspace​

POST /api/v1/workspaces/{workspace_id}/-archive

Archives a workspace: clears schedules and rejects further changes until unarchived. Answers 409 if the workspace is already archived or any run is still active, 400 for a playground.

Requires the workspace owner role.

Request

Path parameters

NameTypeDescription
workspace_idstring (uuid)ID of the workspace
Response (200, 4xx, 5xx)
{
"archived_at": "2026-01-01T00:00:00Z",
"created_at": "2026-01-01T00:00:00Z",
"dataplane_id": "<dataplane_id>",
"dataplane_url": "<dataplane_url>",
"description": "<description>",
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"is_playground": false,
"name": "<name>",
"organization_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"predefined_profiles": {},
"updated_at": "2026-01-01T00:00:00Z"
}

Deploy​

POST /api/v1/workspaces/{workspace_id}/-deploy

Deploys a set of job definitions from a deployment manifest. Creates new jobs, updates existing ones, and archives orphaned jobs (those previously deployed from the same deployment_module but no longer present in the manifest).

Answers with one receipt per kind the manifest declares. Under job_receipt, succeeded lists each job created, updated or archived with its outcome and skipped the unchanged ones; a deploy is all or nothing, so failed is always empty.

When deployment_module is null, this is an ad-hoc deploy: jobs are only added or updated, never archived. When deployment_module is __deployment__, the workspace description is also updated from the manifest.

With dry_run, the changes are previewed without being saved; created and updated jobs then carry the zero UUID as id and version 0.

Requires the developer role (or higher) in the workspace.

Request

Path parameters

NameTypeDescription
workspace_idstring (uuid)ID of the workspace
Response (200, 4xx, 5xx)
{
"deployment_module": "<deployment_module>",
"job_receipt": {
"failed": [
{
"detail": "<detail>",
"ref": "<ref>"
}
],
"skipped": [
{
"job": {},
"outcome": "created",
"previous_version": {}
}
],
"succeeded": [
{
"job": {},
"outcome": "created",
"previous_version": {}
}
]
},
"warnings": ["<warnings>"]
}

Issue dataplane token​

POST /api/v1/workspaces/{workspace_id}/-issue-dataplane-token

Issues a data plane token for this workspace, valid for 10 minutes. Send it as Authorization: Bearer <token> to the services at the workspace's dataplane_url.

Viewers and developers can read files, logs and telemetry; owners can also read and change workspace variables, even on an archived workspace. Cache the token and request a new one before expires_at.

Requires the viewer role (or higher) in the workspace.

Request

Path parameters

NameTypeDescription
workspace_idstring (uuid)ID of the workspace
Response (200, 4xx, 5xx)
{
"expires_at": 0,
"token": "<token>"
}

Unarchive workspace​

POST /api/v1/workspaces/{workspace_id}/-unarchive

Unarchives a workspace, restoring write access and recomputing schedules. Answers 409 if the workspace is not archived.

Requires the workspace owner role.

Request

Path parameters

NameTypeDescription
workspace_idstring (uuid)ID of the workspace
Response (200, 4xx, 5xx)
{
"archived_at": "2026-01-01T00:00:00Z",
"created_at": "2026-01-01T00:00:00Z",
"dataplane_id": "<dataplane_id>",
"dataplane_url": "<dataplane_url>",
"description": "<description>",
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"is_playground": false,
"name": "<name>",
"organization_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"predefined_profiles": {},
"updated_at": "2026-01-01T00:00:00Z"
}

List workspace members​

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

Lists a workspace's direct members as a paginated list, oldest first. Workspace API keys are listed too, with kind=service_account; pass one or more kind values to filter. Organization owners and members who reach the workspace only through its default member role are not listed.

Requires the viewer role (or higher) in the workspace.

Request

Path parameters

NameTypeDescription
workspace_idstring (uuid)ID of the workspace

Query parameters

NameTypeDescription
kindarray of string or nullExact match on kind. Repeat the parameter to match any of several values. One of: human, service_account, managed.
sortarray of string or nullKeys to sort by, applied in the order given. Pairs positionally with order, which must have the same number of entries. One of: created_at, email.

Pagination: limit, offset, order, cursor, see Lists and pagination

Response (200, 4xx, 5xx)
{
"items": [
{
"email": "<email>",
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"name": "<name>",
"organization_membership_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"role": "owner",
"user_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6"
}
],
"limit": 0,
"next_cursor": "<next_cursor>",
"offset": 0,
"total": 0
}

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.