Skip to content
Ask the community about this page

Timextender Orchestration API

The Public Orchestration API lets external systems, CI/CD pipelines, and third-party tools read orchestration status, trigger executions, and retrieve logs — using the same access controls as the web application.

This API was introduced in Timextender Data Platform 26.2

Contents

  1. Base URL
  2. Getting started — creating an API key
  3. Authentication
  4. Common parameters
  5. Task types reference
  6. Endpoints - Workspaces - Process Maps - Tasks - Executions
  7. Error reference
  8. Quick-start examples

Base URL

https://{tenant}.odq.timextender.com

Replace {tenant} with your customer subdomain (e.g. acme → https://acme.odq.timextender.com).

All endpoint paths in this document are relative to the base URL. A full request URL looks like:

https://acme.odq.timextender.com/api/v0/orchestration/workspaces

Note that the endpoint will change later this year to https://acme.timextender.com/api/...

Getting started — creating an API key

API keys are managed inside the TDP web application. A key inherits the exact same permissions as the user who created it — workspace access, process map visibility, and everything else. Think of a key as a password for your account that can be used by a script or external system.

Creating a key

  1. Sign in to the TDP web application.
  2. Click your name or avatar in the bottom-left corner of the navigation and select User Preferences, or navigate directly to /all/preferences.
  3. Select the API Keys tab.
  4. Click Create.
  5. Enter a description that identifies what this key will be used for (e.g. Azure DevOps pipeline, Grafana dashboard). Maximum 100 characters.
  6. Click Create in the dialog.
  7. The full API key is displayed once. Copy it immediately — it cannot be retrieved again.

Quote

Security note: Treat your API key like a password. Store it in a secrets manager, environment variable, or CI/CD secret — never in source code or configuration files committed to version control.

The key has the format txk_ followed by 32 alphanumeric characters:

txk_ABCDEFGHIJKLMNOPQRSTUWXYZ1234567890

After creation, only a masked preview is shown in the UI (e.g. txk_••••••••j2frD).

Limits: Each user can have a maximum of 3 active keys at the same time. The Create button is disabled when you reach the limit.

Deleting a key

To delete one of your own keys:

  1. Go to Preferences → API Keys.
  2. Select the key in the list.
  3. Click Delete and confirm.

Deletion is immediate and permanent. Any request using the deleted key will receive 401 Unauthorized.

Admin: viewing and deleting all keys

Administrators can see every active key in the workspace and delete any of them:

  1. Go to Settings → API Keys.
  2. The grid shows all active keys with the owner's name and email, description, creation date, and last-used date.
  3. Select a key and click Delete to invalidate it immediately.

This is useful for offboarding users or responding to a suspected key compromise.

Authentication

Pass your API key in every request using the X-API-Key header:

GET /api/v0/orchestration/workspaces HTTP/1.1
Host: acme.odq.timextender.com
X-API-Key: txk_ABCDEFGHIJKLMNOPQRSTUWXYZ1234567890

The API key is validated on every request. The last_used timestamp on the key is updated automatically.

Authorization

A key carries the same permissions as the user who created it:

  • Only workspaces the user has access to are returned.
  • Process maps and tasks the user cannot see are excluded.
  • Trigger endpoints require Contributor access on the workspace; read endpoints require Viewer access.

Authentication errors

Status Cause
401 Unauthorized X-API-Key header missing or key not recognised
401 Unauthorized The user account associated with the key has been deactivated
403 Forbidden Key is valid but the user does not have sufficient access to the requested workspace

Common parameters

uat — Environment

Most endpoints accept a uat query parameter to target a specific data environment within the workspace.

Value Meaning
Production or PROD Production environment (default)
Development or DEV Development environment
Test or TEST Test environment

If omitted, Production is used. Passing an unrecognised value returns 400 Bad Request.

GET /api/v0/orchestration/finance/tasks?uat=Development

Pagination — limit and offset

All list endpoints support offset-based pagination.

Parameter Default Minimum Description
limit 100 (execution history: 50) 1 Maximum items to return per page
offset 0 0 Number of items to skip

limit must be greater than 0 and offset must be 0 or greater — otherwise the request returns 400 Bad Request.

When the number of items returned is less than limit, you are on the last page.

# Page 1
GET /api/v0/orchestration/finance/tasks?limit=50&offset=0

# Page 2
GET /api/v0/orchestration/finance/tasks?limit=50&offset=50

# Page 3
GET /api/v0/orchestration/finance/tasks?limit=50&offset=100

Task types reference

The API uses stable PascalCase names for task types. Always use the taskType value returned by a list endpoint when constructing trigger or detail requests.

API name Description
Query Data quality query
CompareQuery Compare query — validates data between two datasets
Rule Data quality rule
Package Execution package
ObjectGroup Object group
Process Process
ScheduleGroup Schedule group
TestGroup Test group
OrchestrationMap Orchestration map (process map overview)
Link Link task
EmailSummary Email summary task

Note

taskId is only unique within a taskType. Always use both together — taskType=Package&taskId=42 and taskType=Query&taskId=42 refer to different tasks.

Endpoints

Workspaces

GET /api/v0/orchestration/workspaces

Returns all workspaces the authenticated user has Viewer or higher access to.

Response 200 OK

[
  {
    "key": "finance",
    "name": "Finance",
    "description": "Finance data governance workspace"
  },
  {
    "key": "sales",
    "name": "Sales",
    "description": null
  }
]
Field Type Description
key string Unique workspace identifier — use this value in all other endpoints
name string Display name
description string | null Optional description

Process Maps

GET /api/v0/orchestration/{workspace}/process-maps

Returns process maps in the given workspace.

Pass all as {workspace} to retrieve process maps across every workspace the user can access.

Path parameters

Parameter Description
workspace Workspace key from the workspaces endpoint, or all

Query parameters: uat, limit, offset

Response 200 OK

[
  {
    "processMapId": 42,
    "name": "Daily Finance Load",
    "workspace": "finance",
    "lastExecutionDate": "2026-03-14T22:00:00",
    "successfulTasks": 18,
    "failedTasks": 0,
    "runningTasks": 0,
    "queuedTasks": 0,
    "disabledTasks": 2
  }
]
Field Type Description
processMapId int Unique process map ID
name string Display name
workspace string Workspace key
lastExecutionDate datetime | null When the process map last ran (local time)
successfulTasks int Number of tasks that finished successfully
failedTasks int Number of tasks that failed
runningTasks int Number of tasks currently running
queuedTasks int Number of tasks waiting to run
disabledTasks int Number of disabled tasks

GET /api/v0/orchestration/{workspace}/process-maps/{processMapId}/tasks

Returns all tasks belonging to a specific process map.

Path parameters

Parameter Description
workspace Workspace key
processMapId Process map ID

Query parameters: uat

Response 200 OK — array of task objects.

Error responses

Status Cause
404 Not Found Process map does not exist or user has no access

POST /api/v0/orchestration/{workspace}/process-maps/{processMapId}/trigger

Triggers a process map to run. Returns immediately; execution is asynchronous. Requires Contributor access on the workspace.

Path parameters

Parameter Description
workspace Workspace key
processMapId Process map ID

Request body

{
  "uat": "Production"
}
Field Type Description
uat string Environment to run against. Defaults to Production if omitted.

Response 202 Accepted — empty body.

Error responses

Status Cause
403 Forbidden User does not have Contributor access on the workspace
404 Not Found Process map does not exist or user has no access
409 Conflict Process map is already running

Tasks

GET /api/v0/orchestration/{workspace}/tasks

Returns all tasks in the workspace, grouped across all process maps.

Pass all as {workspace} to retrieve tasks from every accessible workspace.

Path parameters

Parameter Description
workspace Workspace key or all

Query parameters: uat, limit, offset

Response 200 OK — array of task objects.

GET /api/v0/orchestration/{workspace}/tasks/{taskType}/{taskId}

Returns details for a single task.

Path parameters

Parameter Description
workspace Workspace key
taskType Task type — see Task types reference
taskId Task ID

Query parameters: uat

Response 200 OK — a single task object.

Error responses

Status Cause
400 Bad Request taskType is not a recognised value
404 Not Found Task not found in any accessible process map

POST /api/v0/orchestration/{workspace}/tasks/{taskType}/{taskId}/trigger

Triggers a single task to run. Returns immediately; execution is asynchronous. Requires Contributor access on the workspace.

Path parameters

Parameter Description
workspace Workspace key
taskType Task type — must be a value from Task types reference
taskId Task ID

Request body

{
  "uat": "Production"
}

Response 202 Accepted — empty body.

Error responses

Status Cause
400 Bad Request taskType is not a recognised value
403 Forbidden User does not have Contributor access on the workspace
404 Not Found Task not found in any accessible process map
409 Conflict Task is already running or queued

Task object

Used in both the workspace task list and the process-map task list.

{
  "taskId": 1005,
  "taskName": "Load Customer Dim",
  "taskType": "Package",
  "status": "Finished",
  "processMapId": 42,
  "processMapName": "Daily Finance Load",
  "lastExecutionStartTime": "2026-03-14T22:00:05",
  "lastExecutionEndTime": "2026-03-14T22:01:32"
}
Field Type Description
taskId int Task ID — unique within a task type
taskName string Display name
taskType string See Task types reference
status string Finished, Failed, Running, Queued, Outdated, Disabled
processMapId int | null ID of the containing process map. null for tasks not belonging to a specific map.
processMapName string | null Name of the containing process map
lastExecutionStartTime datetime | null When the task last started (local time)
lastExecutionEndTime datetime | null When the task last finished (local time). null if currently running.

Executions

These endpoints provide visibility into when tasks ran, how long they took, and what output they produced.

GET /api/v0/orchestration/{workspace}/executions

Returns the latest execution state for every task in the workspace — one entry per task. Use this to build a status dashboard or health check.

Path parameters

Parameter Description
workspace Workspace key

Query parameters: uat, limit, offset

Response 200 OK

[
  {
    "taskId": 1005,
    "taskName": "Load Customer Dim",
    "taskType": "Package",
    "status": "Finished",
    "lastStartTime": "2026-03-14T22:00:05",
    "lastEndTime": "2026-03-14T22:01:32",
    "duration": "01m 27s"
  },
  {
    "taskId": 2010,
    "taskName": "Validate Customer Count",
    "taskType": "Query",
    "status": "Failed",
    "lastStartTime": "2026-03-14T22:02:00",
    "lastEndTime": "2026-03-14T22:02:03",
    "duration": "03s"
  },
  {
    "taskId": 3001,
    "taskName": "Send Summary Email",
    "taskType": "EmailSummary",
    "status": "Running",
    "lastStartTime": "2026-03-15T08:30:00",
    "lastEndTime": null,
    "duration": ""
  }
]
Field Type Description
taskId int | null Task ID
taskName string Display name
taskType string See Task types reference
status string Finished, Failed, Running, Queued, Outdated, Disabled
lastStartTime datetime | null When the last execution started (local time)
lastEndTime datetime | null When the last execution ended (local time). null if currently running.
duration string Human-readable duration of the last completed run (e.g. 1h 02m 15s). Empty if no completed run yet.

Error responses

Status Cause
403 Forbidden User does not have access to the requested workspace

GET /api/v0/orchestration/{workspace}/tasks/{taskType}/{taskId}/executions

Returns the execution history for a specific task, newest first.

Path parameters

Parameter Description
workspace Workspace key
taskType Task type
taskId Task ID

Query parameters: uat, limit (default 50), offset

Response 200 OK

[
  {
    "executionId": 98231,
    "startTime": "2026-03-14T22:00:05",
    "endTime": "2026-03-14T22:01:32",
    "status": "Finished",
    "durationSeconds": 87
  },
  {
    "executionId": 97105,
    "startTime": "2026-03-13T22:00:07",
    "endTime": "2026-03-13T22:00:09",
    "status": "Failed",
    "durationSeconds": 2
  },
  {
    "executionId": 97210,
    "startTime": "2026-03-15T08:30:00",
    "endTime": null,
    "status": "Running",
    "durationSeconds": null
  }
]
Field Type Description
executionId int Unique execution ID — use this to retrieve logs
startTime datetime When the execution started (local time)
endTime datetime | null When it finished (local time). null if still running.
status string Finished, Failed, or Running
durationSeconds int | null Duration in whole seconds. null if still running.

Error responses

Status Cause
400 Bad Request taskType is not a recognised value, or limit/offset out of range
403 Forbidden User does not have access to the workspace
404 Not Found Task not found in any accessible process map

GET /api/v0/orchestration/{workspace}/tasks/{taskType}/{taskId}/executions/{execId}/log

Returns the log output recorded during a specific execution.

Log entries contain the output and error messages written by the execution engine during the run. For Query and CompareQuery task types, logs are not stored in this format and an empty array is always returned.

Path parameters

Parameter Description
workspace Workspace key
taskType Task type
taskId Task ID
execId Execution ID — from the /executions list

Response 200 OK

[
  {
    "logTime": "2026-03-13T22:00:07",
    "log": "Starting package execution: Load Customer Dim"
  },
  {
    "logTime": "2026-03-13T22:00:08",
    "log": "Connecting to source: dw-prod.database.windows.net"
  },
  {
    "logTime": "2026-03-13T22:00:09",
    "log": "ERROR: Connection timeout after 30s. The remote server did not respond."
  }
]
Field Type Description
logTime datetime When this log entry was written
log string Log message (may include error details, stack traces, or informational output)

Returns [] (empty array) for Query and CompareQuery task types.

Error responses

Status Cause
400 Bad Request taskType is not a recognised value
403 Forbidden User does not have access to the workspace

Error reference

All error responses return JSON in the following format:

{
  "type": "https://tools.ietf.org/html/rfc9110#section-15.5.5",
  "title": "Not Found",
  "status": 404,
  "traceId": "00-abc123def456..."
}

400 Bad Request responses for an unrecognised taskType return a plain-text message listing the valid values:

Unknown taskType 'Pkg'. Valid values: Query, CompareQuery, Package, ObjectGroup,
Process, ScheduleGroup, TestGroup, OrchestrationMap, Link, EmailSummary, Rule.

Status code summary

Code Meaning
200 OK Request succeeded
202 Accepted Trigger accepted — execution started asynchronously
400 Bad Request Invalid parameter value (see response body)
401 Unauthorized Missing or invalid API key
403 Forbidden API key is valid but lacks sufficient access to the requested resource
404 Not Found Resource does not exist or is not visible to the authenticated user
409 Conflict Trigger rejected — process map or task is already running

Interactive API explorer

A Swagger UI is available where you can browse all endpoints and test them directly in the browser:

https://{tenant}.odq.timextender.com/swagger          (production)
  1. Open the Swagger UI.
  2. Click Authorize (top right).
  3. Enter your API key in the X-API-Key field.
  4. Click Authorize, then Close.
  5. Expand any endpoint and click Try it out.

Quick-start examples

Discover available workspaces

curl https://acme.odq.timextender.com/api/v0/orchestration/workspaces \
  -H "X-API-Key: txk_your_key_here"

List all tasks in a workspace

curl "https://acme.odq.timextender.com/api/v0/orchestration/finance/tasks?limit=50" \
  -H "X-API-Key: txk_your_key_here"

Get the current status of every task (dashboard)

curl "https://acme.odq.timextender.com/api/v0/orchestration/finance/executions" \
  -H "X-API-Key: txk_your_key_here"

Find failed executions for a task

curl "https://acme.odq.timextender.com/api/v0/orchestration/finance/tasks/Package/1005/executions?limit=10" \
  -H "X-API-Key: txk_your_key_here"

Read the log for a specific failed run

curl "https://acme.odq.timextender.com/api/v0/orchestration/finance/tasks/Package/1005/executions?limit=10" \
  -H "X-API-Key: txk_your_key_here"

Trigger a task

curl -X POST "https://acme.odq.timextender.com/api/v0/orchestration/finance/tasks/Package/1005/trigger" \
  -H "X-API-Key: txk_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{"uat": "Production"}'

Trigger an entire process map

curl -X POST "https://acme.odq.timextender.com/api/v0/orchestration/finance/process-maps/42/trigger" \
  -H "X-API-Key: txk_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{"uat": "Production"}'

Page through a large task list

# Fetch in batches of 25
curl "https://acme.odq.timextender.com/api/v0/orchestration/finance/tasks?limit=25&offset=0"  -H "X-API-Key: txk_your_key_here"
curl "https://acme.odq.timextender.com/api/v0/orchestration/finance/tasks?limit=25&offset=25" -H "X-API-Key: txk_your_key_here"
curl "https://acme.odq.timextender.com/api/v0/orchestration/finance/tasks?limit=25&offset=50" -H "X-API-Key: txk_your_key_here"

Discussed in the community

Looking for related questions…

Didn't find your answer? Ask the community about this page — questions are answered by Timextender experts, partners and other users.