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
- Base URL
- Getting started — creating an API key
- Authentication
- Common parameters
- Task types reference
- Endpoints
- Error reference
- 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/workspacesNote 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
- Sign in to the TDP web application.
- Click your name or avatar in the bottom-left corner of the navigation and select User Preferences, or navigate directly to
/all/preferences. - Select the API Keys tab.
- Click Create.
- Enter a description that identifies what this key will be used for (e.g.
Azure DevOps pipeline,Grafana dashboard). Maximum 100 characters. - Click Create in the dialog.
- The full API key is displayed once. Copy it immediately — it cannot be retrieved again.
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_ABCDEFGHIJKLMNOPQRSTUWXYZ1234567890After 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:
- Go to Preferences → API Keys.
- Select the key in the list.
- 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:
- Go to Settings → API Keys.
- The grid shows all active keys with the owner's name and email, description, creation date, and last-used date.
- 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_ABCDEFGHIJKLMNOPQRSTUWXYZ1234567890The 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 |
|---|---|
|
|
|
|
| The user account associated with the key has been deactivated |
|
| 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 environment (default) |
|
| Development environment |
|
| Test environment |
If omitted, Production is used. Passing an unrecognised value returns 400 Bad Request.
GET /api/v0/orchestration/finance/tasks?uat=DevelopmentPagination — limit and offset
All list endpoints support offset-based pagination.
| Parameter | Default | Minimum | Description |
|---|---|---|---|
|
|
| 1 | Maximum items to return per page |
|
|
| 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=100Task 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 |
|---|---|
|
| Data quality query |
|
| Compare query — validates data between two datasets |
|
| Data quality rule |
|
| Execution package |
|
| Object group |
|
| Process |
|
| Schedule group |
|
| Test group |
|
| Orchestration map (process map overview) |
|
| Link task |
|
| Email summary task |
Note:
taskIdis only unique within ataskType. Always use both together —taskType=Package&taskId=42andtaskType=Query&taskId=42refer 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 |
|---|---|---|
|
| string | Unique workspace identifier — use this value in all other endpoints |
|
| string | Display name |
|
| 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 |
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 |
|---|---|---|
|
| int | Unique process map ID |
|
| string | Display name |
|
| string | Workspace key |
|
| datetime | null | When the process map last ran (local time) |
|
| int | Number of tasks that finished successfully |
|
| int | Number of tasks that failed |
|
| int | Number of tasks currently running |
|
| int | Number of tasks waiting to run |
|
| 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 key |
|
| Process map ID |
Query parameters: uat
Response 200 OK — array of task objects.
Error responses
| Status | Cause |
|---|---|
|
| 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 key |
|
| Process map ID |
Request body
{
"uat": "Production"
}| Field | Type | Description |
|---|---|---|
|
| string | Environment to run against. Defaults to |
Response 202 Accepted — empty body.
Error responses
| Status | Cause |
|---|---|
|
| User does not have Contributor access on the workspace |
|
| Process map does not exist or user has no access |
|
| 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 key or |
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 key |
|
| Task type — see Task types reference |
|
| Task ID |
Query parameters: uat
Response 200 OK — a single task object.
Error responses
| Status | Cause |
|---|---|
|
|
|
|
| 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 key |
|
| Task type — must be a value from Task types reference |
|
| Task ID |
Request body
{
"uat": "Production"
}Response 202 Accepted — empty body.
Error responses
| Status | Cause |
|---|---|
|
|
|
|
| User does not have Contributor access on the workspace |
|
| Task not found in any accessible process map |
|
| 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 |
|---|---|---|
|
| int | Task ID — unique within a task type |
|
| string | Display name |
|
| string | |
|
| string |
|
|
| int | null | ID of the containing process map. |
|
| string | null | Name of the containing process map |
|
| datetime | null | When the task last started (local time) |
|
| datetime | null | When the task last finished (local time). |
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 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 |
|---|---|---|
|
| int | null | Task ID |
|
| string | Display name |
|
| string | |
|
| string |
|
|
| datetime | null | When the last execution started (local time) |
|
| datetime | null | When the last execution ended (local time). |
|
| string | Human-readable duration of the last completed run (e.g. |
Error responses
| Status | Cause |
|---|---|
|
| 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 key |
|
| Task type |
|
| 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 |
|---|---|---|
|
| int | Unique execution ID — use this to retrieve logs |
|
| datetime | When the execution started (local time) |
|
| datetime | null | When it finished (local time). |
|
| string |
|
|
| int | null | Duration in whole seconds. |
Error responses
| Status | Cause |
|---|---|
|
|
|
|
| User does not have access to the workspace |
|
| 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 key |
|
| Task type |
|
| Task ID |
|
| Execution ID — from the |
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 |
|---|---|---|
|
| datetime | When this log entry was written |
|
| 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 |
|---|---|
|
|
|
|
| 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 |
|---|---|
|
| Request succeeded |
|
| Trigger accepted — execution started asynchronously |
|
| Invalid parameter value (see response body) |
|
| Missing or invalid API key |
|
| API key is valid but lacks sufficient access to the requested resource |
|
| Resource does not exist or is not visible to the authenticated user |
|
| 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)- Open the Swagger UI.
- Click Authorize (top right).
- Enter your API key in the
X-API-Keyfield. - Click Authorize, then Close.
- 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/97105/log" \
-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"