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¶
- Base URL
- Getting started — creating an API key
- Authentication
- Common parameters
- Task types reference
- Endpoints - Workspaces - Process Maps - Tasks - Executions
- 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:
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¶
- 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.
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:
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:
- 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_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.
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
| 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
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:
- 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?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.