logologo
Pricing
AppsPartnersAbout
Log inStart free trial

REST API Reference

The WEXTL REST v1 API — versioned, frozen-additive, and machine-readable via a single OpenAPI document.

Region*Select

Updates every sample URL on this page to your organization’s regional host. Match the shard in your API key (wextl_<shard>_…).

v1 overview

The REST API lets you create workflows, run them, and inspect run history from any HTTP client. Every route lives under a single versioned prefix and returns a consistent JSON envelope — see Errors & rate limits for the shape.

The full per-resource reference below — every endpoint, its parameters, request/response schemas, and a runnable curl + TypeScript SDK sample — renders directly from the machine-readable OpenAPI document at the path below, so it can never drift from what actually ships.

Machine-readable spec

The full contract is published as an OpenAPI document once the v1 surface ships, at the path below — unauthenticated, so your tooling (or an AI agent) can fetch it with no token.

text
GET /api/v1/openapi.json

Authenticating requests

Every v1 request carries a bearer Personal Access Token or an OAuth 2.1 access token. See the Authentication guide for the full scope model and a key-rotation recipe.

Workflows

11endpoints
GET/workflowsAuth required

List workflows (bounded, cursor-paginated).

Parameters
NameInTypeDescription
cursorquerystringOpaque continuation token from a previous response.
limitqueryintegerPage size. Default 50.
qquerystringFree-text search on name + description.
statusquerystring
folderIdquerystringRestrict to this folder and its descendants.
sortByquerystring
sortDirquerystring
tagIdsquerystringComma-separated tag ids.
tagMatchquerystring
Responses
200A page of workflow summaries.
401No valid bearer token.
403Missing workflow:read scope, or the plan lacks API access.
421Wrong regional endpoint — follow error.base_url.
429Rate limited — retry after error.retry_after_s seconds.
NameInTypeDescription
data*array<WorkflowSummary>
next_cursor*string | null
data[] item (WorkflowSummary)
NameInTypeDescription
id*string
name*string
active*boolean
folderIdstring | null
nodeCountinteger
tagIdsarray<string>
createdAtintegerEpoch milliseconds.
updatedAtintegerEpoch milliseconds.
Example response
json
{
  "data": [
    {
      "id": "abc123",
      "name": "My workflow",
      "active": true,
      "folderId": "fld_01HXEXAMPLE",
      "nodeCount": 3,
      "tagIds": [
        "..."
      ],
      "createdAt": 1719792000000,
      "updatedAt": 1719792000000
    }
  ],
  "next_cursor": null
}
Example request
bash
curl -X GET https://eu1.wextl.com/api/v1/workflows \
  -H "Authorization: Bearer wextl_..."
POST/workflowsAuth required

Create a new, empty (draft) workflow. Build its graph via POST .../ops afterwards.

Request body (required)
NameInTypeDescription
name*bodystring
folderIdbodystring | nullMust reference an accessible folder.
teamIdbodystring | nullMust belong to the caller's org. Omit to use the org's default team.
Responses
201The created (empty) draft workflow.
400Invalid body — missing/oversized name, or an unresolvable folderId/teamId.
401No valid bearer token.
403Missing workflow:write scope, or the plan lacks API access.
421Wrong regional endpoint — follow error.base_url.
429Rate limited — retry after error.retry_after_s seconds.
NameInTypeDescription
dataWorkflowCreateResult
data shape (WorkflowCreateResult)
NameInTypeDescription
id*string
name*string
teamId*string
folderIdstring | null
active*boolean
createdAt*integerEpoch milliseconds.
Example response
json
{
  "data": {
    "id": "abc123",
    "name": "My workflow",
    "teamId": "team_01HXEXAMPLE",
    "active": true,
    "createdAt": 1719792000000,
    "folderId": "fld_01HXEXAMPLE"
  }
}
Example request
bash
curl -X POST https://eu1.wextl.com/api/v1/workflows \
  -H "Authorization: Bearer wextl_..." \
  -H "Content-Type: application/json" \
  -d '{
  "name": "My workflow",
  "folderId": "fld_01HXEXAMPLE",
  "teamId": "team_01HXEXAMPLE"
}'
GET/workflows/{id}Auth required

Read a workflow's full DRAFT graph, or its deployed snapshot via ?view=deployed.

Parameters
NameInTypeDescription
id*pathstring
viewquerystringOmit for the current draft. `deployed` reads the last Go Live snapshot; 404 workflow_not_deployed if never published.
Responses
200The workflow (draft or deployed, per ?view).
401No valid bearer token.
403Missing workflow:read scope, or the plan lacks API access.
404Workflow not found (or, with ?view=deployed, never deployed — workflow_not_deployed).
421Wrong regional endpoint — follow error.base_url.
429Rate limited — retry after error.retry_after_s seconds.
NameInTypeDescription
dataone of 2 shapes
Example response
json
{
  "data": {
    "id": "abc123",
    "name": "My workflow",
    "active": true,
    "nodes": [
      {}
    ],
    "edges": [
      {}
    ],
    "description": "...",
    "folderId": "fld_01HXEXAMPLE",
    "teamId": "team_01HXEXAMPLE",
    "schedule": {},
    "createdAt": 1719792000000,
    "updatedAt": 1719792000000,
    "deployed": {
      "deployedAt": 1719792000000,
      "versionNo": 0,
      "contentHash": "..."
    }
  }
}
Example request
bash
curl -X GET https://eu1.wextl.com/api/v1/workflows/<id> \
  -H "Authorization: Bearer wextl_..."
PATCH/workflows/{id}Auth required

Curated update: name, active, schedule (recurrence), and/or folderId.

Parameters
NameInTypeDescription
id*pathstring
Request body (required)
NameInTypeDescription
namebodystring
activebodybooleanActivate or deactivate the workflow.
recurrencebodyanySchedule recurrence object, or null to clear. Setting a schedule does not activate.
folderIdbodystring | nullMove into folder; null to unassign.
Responses
200Fields that were updated.
400Invalid body.
401No valid bearer token.
403Missing workflow:write scope.
404Workflow not found.
409Conflict — re-read and retry.
421Wrong regional endpoint — follow error.base_url.
429Rate limited — retry after error.retry_after_s seconds.
NameInTypeDescription
data*object
data shape (object)
NameInTypeDescription
idstring
updatedarray<string>
namestring
activeboolean
folderIdstring | null
Example response
json
{
  "data": {
    "id": "abc123",
    "updated": [
      "..."
    ],
    "name": "My workflow",
    "active": true,
    "folderId": "fld_01HXEXAMPLE"
  }
}
Example request
bash
curl -X PATCH https://eu1.wextl.com/api/v1/workflows/<id> \
  -H "Authorization: Bearer wextl_..." \
  -H "Content-Type: application/json" \
  -d '{
  "name": "My workflow",
  "active": true,
  "recurrence": "...",
  "folderId": "fld_01HXEXAMPLE"
}'
DELETE/workflows/{id}Auth required

Permanently delete a workflow. Refused while active or deployed.

Parameters
NameInTypeDescription
id*pathstring
Responses
200Deleted.
401No valid bearer token.
403Missing workflow:write scope.
404Workflow not found.
409Workflow is active or deployed — deactivate/undeploy first.
421Wrong regional endpoint — follow error.base_url.
429Rate limited — retry after error.retry_after_s seconds.
NameInTypeDescription
dataobject
data shape (object)
NameInTypeDescription
okboolean
Example response
json
{
  "data": {
    "ok": true
  }
}
Example request
bash
curl -X DELETE https://eu1.wextl.com/api/v1/workflows/<id> \
  -H "Authorization: Bearer wextl_..."
POST/workflows/{id}/opsAuth required

Apply a batch of graph operations to a workflow.

Parameters
NameInTypeDescription
id*pathstring
Request body (required)
NameInTypeDescription
ops*bodyarray<object>Batch of GraphOp objects. One of: add_node, update_params, update_config, connect, disconnect, remove_node, rename_node, set_credential, set_edge_filter.
expectedUpdatedAtbodyintegerOptimistic-concurrency precondition — the workflow updatedAt this batch was computed against. Mismatch → 409 workflow_modified.
Responses
200The batch result — best-effort; a non-empty errors[] does not mean the whole batch was rejected.
400Invalid body, or the resulting graph fails the topology gate.
401No valid bearer token.
403Missing workflow:write scope, or the plan lacks API access.
404Workflow not found.
409workflow_modified — expectedUpdatedAt no longer matches; reload and retry.
421Wrong regional endpoint — follow error.base_url.
429Rate limited — retry after error.retry_after_s seconds.
NameInTypeDescription
dataGraphOpsResult
data shape (GraphOpsResult)
NameInTypeDescription
applied*objecttempId → real node id, for every add_node that landed.
errors*array<string>Best-effort per-op failures — the rest of the batch still applies.
touched*array<integer>Node ids added or param/config-updated by this batch, including hub-scaffolded satellite/placeholder ids.
updatedAtintegerThe workflow's new updatedAt — pass it as expectedUpdatedAt on the next ops call to avoid conflicts.
Example response
json
{
  "data": {
    "applied": {},
    "errors": [
      "..."
    ],
    "touched": [
      0
    ],
    "updatedAt": 1719792000000
  }
}
Example request
bash
curl -X POST https://eu1.wextl.com/api/v1/workflows/<id>/ops \
  -H "Authorization: Bearer wextl_..." \
  -H "Content-Type: application/json" \
  -d '{
  "ops": [
    {
      "op": "..."
    }
  ],
  "expectedUpdatedAt": 1719792000000
}'
POST/workflows/{id}/deployAuth required

Go Live — publish the current draft as the deployed snapshot (idempotent).

Parameters
NameInTypeDescription
id*pathstring
Request body
NameInTypeDescription
expectedUpdatedAtbodyintegerOptimistic-concurrency precondition — the draft updatedAt this deploy was computed against. Mismatch → 409 workflow_modified.
Responses
200The new deployed snapshot summary.
401No valid bearer token.
403Missing workflow:write scope, or the plan lacks API access.
404Workflow not found.
409workflow_modified — expectedUpdatedAt no longer matches; reload and retry.
421Wrong regional endpoint — follow error.base_url.
429Rate limited — retry after error.retry_after_s seconds.
NameInTypeDescription
dataDeployResult
data shape (DeployResult)
NameInTypeDescription
workflowId*string
contentHash*string
versionNo*integer
deployedAt*integerEpoch milliseconds.
Example response
json
{
  "data": {
    "workflowId": "wf_01HXEXAMPLE",
    "contentHash": "...",
    "versionNo": 0,
    "deployedAt": 1719792000000
  }
}
Example request
bash
curl -X POST https://eu1.wextl.com/api/v1/workflows/<id>/deploy \
  -H "Authorization: Bearer wextl_..." \
  -H "Content-Type: application/json" \
  -d '{
  "expectedUpdatedAt": 1719792000000
}'
POST/workflows/{id}/webhookAuth required

Mint (or return the existing) inbound webhook URL for a workflow trigger node.

Parameters
NameInTypeDescription
id*pathstring
Request body (required)
NameInTypeDescription
nodeId*bodystringThe webhook trigger node id (numeric id as a string).
Responses
200The webhook URL (idempotent — alreadyBound:true when a live one already existed).
400Missing nodeId, or the node is not a webhook trigger node.
401No valid bearer token.
403Missing webhook:write scope, or the plan lacks API access.
404Workflow or node not found.
409The node already has a DISABLED webhook record bound to it.
421Wrong regional endpoint — follow error.base_url.
429Rate limited — retry after error.retry_after_s seconds.
NameInTypeDescription
dataWebhook
data shape (Webhook)
NameInTypeDescription
webhookId*string
url*stringThe inbound URL to POST trigger payloads to.
alreadyBoundboolean
Example response
json
{
  "data": {
    "webhookId": "wh_01HXEXAMPLE",
    "url": "https://eu1.wextl.com/hooks/wh_01HXEXAMPLE",
    "alreadyBound": true
  }
}
Example request
bash
curl -X POST https://eu1.wextl.com/api/v1/workflows/<id>/webhook \
  -H "Authorization: Bearer wextl_..." \
  -H "Content-Type: application/json" \
  -d '{
  "nodeId": "abc123"
}'
POST/workflows/{id}/runsAuth required

Start a run of the workflow's current draft (billing and structure checks apply).

Parameters
NameInTypeDescription
id*pathstring
Request body
NameInTypeDescription
nodeIdbodystringOptional node id (numeric id as a string) to run from — a scoped run. Omit for a full-graph run.
upstreamOutputsbodyobjectOptional nodeId→payload map to seed as upstream inputs. Mutually exclusive with seedFromRun.
seedFromRunbodyobjectSeed from a past run node output (server-resolved). Mutually exclusive with upstreamOutputs.
Responses
201The run was created and enqueued.
400Invalid nodeId/inputs, or the workflow fails the topology gate (e.g. no runnable path).
401No valid bearer token.
402Payment required — billing problem blocking runs.
403Missing workflow:write scope, no active plan, or out of credits (PLAN_LIMIT_EXCEEDED).
404Workflow not found.
421Wrong regional endpoint — follow error.base_url.
429Rate limited — retry after error.retry_after_s seconds.
NameInTypeDescription
dataStartRunResult
data shape (StartRunResult)
NameInTypeDescription
runId*string
Example response
json
{
  "data": {
    "runId": "run_01HXEXAMPLE"
  }
}
Example request
bash
curl -X POST https://eu1.wextl.com/api/v1/workflows/<id>/runs \
  -H "Authorization: Bearer wextl_..." \
  -H "Content-Type: application/json" \
  -d '{
  "nodeId": "abc123",
  "upstreamOutputs": {},
  "seedFromRun": {
    "runId": "run_01HXEXAMPLE",
    "nodeId": 0
  }
}'
PUT/workflows/{id}/tagsAuth required

Replace the full tag set on a workflow.

Parameters
NameInTypeDescription
id*pathstring
Request body (required)
NameInTypeDescription
tagIds*bodyarray<string>
Responses
200Tags assigned.
400Invalid body.
401No valid bearer token.
403Missing workflow:write scope.
404Workflow not found.
421Wrong regional endpoint — follow error.base_url.
429Rate limited — retry after error.retry_after_s seconds.
NameInTypeDescription
dataobject
Example response
json
{
  "data": {}
}
Example request
bash
curl -X PUT https://eu1.wextl.com/api/v1/workflows/<id>/tags \
  -H "Authorization: Bearer wextl_..." \
  -H "Content-Type: application/json" \
  -d '{
  "tagIds": [
    "..."
  ]
}'
POST/workflows/{id}/test-moduleAuth required

Execute a single app node with its current parameters (module test).

Parameters
NameInTypeDescription
id*pathstring
Request body (required)
NameInTypeDescription
nodeId*bodyone of 2 shapes
Responses
200Module test result.
400Invalid body or non-app node.
401No valid bearer token.
403Missing workflow:write scope.
421Wrong regional endpoint — follow error.base_url.
429Rate limited — retry after error.retry_after_s seconds.
NameInTypeDescription
dataobject
Example response
json
{
  "data": {}
}
Example request
bash
curl -X POST https://eu1.wextl.com/api/v1/workflows/<id>/test-module \
  -H "Authorization: Bearer wextl_..." \
  -H "Content-Type: application/json" \
  -d '{
  "nodeId": "abc123"
}'

Variables

4endpoints
GET/variablesAuth required

List variable names and metadata for the organization (up to 500). Secret values are always returned as null.

Responses
200Every variable visible to this key.
401No valid bearer token.
403Missing variable:read scope, or the plan lacks API access.
421Wrong regional endpoint — follow error.base_url.
429Rate limited — retry after error.retry_after_s seconds.
NameInTypeDescription
data*array<Variable>
data[] item (Variable)
NameInTypeDescription
id*string
name*string
isSecret*boolean
value*string | null
teamId*string | null
createdAt*integerEpoch milliseconds.
updatedAt*integerEpoch milliseconds.
Example response
json
{
  "data": [
    {
      "id": "abc123",
      "name": "My workflow",
      "isSecret": false,
      "value": null,
      "teamId": "team_01HXEXAMPLE",
      "createdAt": 1719792000000,
      "updatedAt": 1719792000000
    }
  ]
}
Example request
bash
curl -X GET https://eu1.wextl.com/api/v1/variables \
  -H "Authorization: Bearer wextl_..."
GET/variables/{id}Auth required

Read one variable by id. A secret variable's value is always returned as null.

Parameters
NameInTypeDescription
id*pathstring
Responses
200The variable (value is null when isSecret is true).
401No valid bearer token.
403Missing variable:read scope, or the plan lacks API access.
404Variable not found.
421Wrong regional endpoint — follow error.base_url.
429Rate limited — retry after error.retry_after_s seconds.
NameInTypeDescription
dataVariable
data shape (Variable)
NameInTypeDescription
id*string
name*string
isSecret*boolean
value*string | null
teamId*string | null
createdAt*integerEpoch milliseconds.
updatedAt*integerEpoch milliseconds.
Example response
json
{
  "data": {
    "id": "abc123",
    "name": "My workflow",
    "isSecret": false,
    "value": null,
    "teamId": "team_01HXEXAMPLE",
    "createdAt": 1719792000000,
    "updatedAt": 1719792000000
  }
}
Example request
bash
curl -X GET https://eu1.wextl.com/api/v1/variables/<id> \
  -H "Authorization: Bearer wextl_..."
PUT/variables/{id}Auth required

Create or update a variable by name (upsert) — the {id} path segment IS the variable name, not a database id. Secrets are write-only.

Parameters
NameInTypeDescription
id*pathstringThe variable name (letters/numbers/underscores, must start with a letter or underscore) — this call upserts by name.
Request body (required)
NameInTypeDescription
value*bodystringRequired for a new non-secret variable. For an existing secret, a blank value keeps the current stored value.
isSecretbodybooleanWhether this variable is a secret. Only takes effect on create — updating an existing variable never changes its stored secret status.
teamIdbodystring | nullMust belong to the caller's org. Omit for an org-level variable.
Responses
200An existing variable was updated.
201A new variable was created.
400Invalid body — bad name, missing value, a secret shorter than 6 characters, or an unresolvable teamId.
401No valid bearer token.
403Missing variable:write scope, or the plan lacks API access.
421Wrong regional endpoint — follow error.base_url.
429Rate limited — retry after error.retry_after_s seconds.
NameInTypeDescription
dataSetVariableResult
data shape (SetVariableResult)
NameInTypeDescription
id*string
name*string
isSecret*boolean
teamId*string | null
updatedAt*integerEpoch milliseconds.
created*booleantrue when this call created a new variable, false when it updated an existing one.
Example response
json
{
  "data": {
    "id": "abc123",
    "name": "My workflow",
    "isSecret": false,
    "teamId": "team_01HXEXAMPLE",
    "updatedAt": 1719792000000,
    "created": true
  }
}
Example request
bash
curl -X PUT https://eu1.wextl.com/api/v1/variables/<id> \
  -H "Authorization: Bearer wextl_..." \
  -H "Content-Type: application/json" \
  -d '{
  "value": null,
  "isSecret": false,
  "teamId": "team_01HXEXAMPLE"
}'
DELETE/variables/{id}Auth required

Soft-delete a variable by database id (not name).

Parameters
NameInTypeDescription
id*pathstringThe variable database id from list_variables / get_variable.
Responses
200Deleted.
401No valid bearer token.
403Missing variable:write scope.
404Variable not found.
421Wrong regional endpoint — follow error.base_url.
429Rate limited — retry after error.retry_after_s seconds.
NameInTypeDescription
dataobject
data shape (object)
NameInTypeDescription
okboolean
Example response
json
{
  "data": {
    "ok": true
  }
}
Example request
bash
curl -X DELETE https://eu1.wextl.com/api/v1/variables/<id> \
  -H "Authorization: Bearer wextl_..."

Runs

6endpoints
GET/runsAuth required

List runs of a workflow (bounded, cursor-paginated). workflowId is REQUIRED in v1 — org-wide listing is out of scope.

Parameters
NameInTypeDescription
workflowId*querystringREQUIRED — scope the listing to this workflow.
cursorquerystring
limitqueryintegerPage size. Default 50.
qquerystringFree-text search over status + id.
Responses
200A page of run summaries.
400workflowId query parameter is required.
401No valid bearer token.
403Missing workflow:read scope, or the plan lacks API access.
421Wrong regional endpoint — follow error.base_url.
429Rate limited — retry after error.retry_after_s seconds.
NameInTypeDescription
data*array<RunSummary>
next_cursor*string | null
data[] item (RunSummary)
NameInTypeDescription
id*string
workflowId*string | null
status*string
createdAt*string | nullISO-8601 timestamp.
finishedAtstring | nullISO-8601 timestamp; null while the run is non-terminal.
creditsUsed*number
Example response
json
{
  "data": [
    {
      "id": "abc123",
      "workflowId": "wf_01HXEXAMPLE",
      "status": "succeeded",
      "createdAt": "2024-07-01T12:00:00.000Z",
      "creditsUsed": 50,
      "finishedAt": null
    }
  ],
  "next_cursor": null
}
Example request
bash
curl -X GET https://eu1.wextl.com/api/v1/runs \
  -H "Authorization: Bearer wextl_..."
GET/runs/{id}Auth required

Get a run report: status, timestamps, error, and per-node status/error/output.

Parameters
NameInTypeDescription
id*pathstring
Responses
200The run report.
401No valid bearer token.
403Missing workflow:read scope, or the plan lacks API access.
404Run not found.
421Wrong regional endpoint — follow error.base_url.
429Rate limited — retry after error.retry_after_s seconds.
NameInTypeDescription
dataRunReport
data shape (RunReport)
NameInTypeDescription
id*string
workflowIdstring
status*string
createdAtstring | null
finishedAtstring | null
errorstring | null
nodesarray<object>
Example response
json
{
  "data": {
    "id": "abc123",
    "status": "succeeded",
    "workflowId": "wf_01HXEXAMPLE",
    "createdAt": "2024-07-01T12:00:00.000Z",
    "finishedAt": null,
    "error": null,
    "nodes": [
      {}
    ]
  }
}
Example request
bash
curl -X GET https://eu1.wextl.com/api/v1/runs/<id> \
  -H "Authorization: Bearer wextl_..."
POST/runs/{id}/cancelAuth required

Cancel an in-flight workflow run.

Parameters
NameInTypeDescription
id*pathstring
Responses
200The run was cancelled.
400The run is already in a terminal state.
401No valid bearer token.
403Missing workflow:write scope, or the plan lacks API access.
404Run not found.
421Wrong regional endpoint — follow error.base_url.
429Rate limited — retry after error.retry_after_s seconds.
NameInTypeDescription
dataCancelRunResult
data shape (CancelRunResult)
NameInTypeDescription
ok*boolean
Example response
json
{
  "data": {
    "ok": true
  }
}
Example request
bash
curl -X POST https://eu1.wextl.com/api/v1/runs/<id>/cancel \
  -H "Authorization: Bearer wextl_..."
POST/runs/{id}/rerunAuth required

Re-queue a finished run as a new attempt.

Parameters
NameInTypeDescription
id*pathstring
Responses
201New attempt enqueued.
401No valid bearer token.
403Missing workflow:write scope.
404Run not found.
421Wrong regional endpoint — follow error.base_url.
429Rate limited — retry after error.retry_after_s seconds.
NameInTypeDescription
dataobject
Example response
json
{
  "data": {}
}
Example request
bash
curl -X POST https://eu1.wextl.com/api/v1/runs/<id>/rerun \
  -H "Authorization: Bearer wextl_..."
POST/runs/{id}/retry-nodeAuth required

Resume a run from one failed node (same attempt).

Parameters
NameInTypeDescription
id*pathstring
Request body (required)
NameInTypeDescription
nodeId*bodyinteger
attemptNumberbodyinteger
Responses
200Resume enqueued.
400Invalid body.
401No valid bearer token.
403Missing workflow:write scope.
404Run not found.
421Wrong regional endpoint — follow error.base_url.
429Rate limited — retry after error.retry_after_s seconds.
NameInTypeDescription
dataobject
Example response
json
{
  "data": {}
}
Example request
bash
curl -X POST https://eu1.wextl.com/api/v1/runs/<id>/retry-node \
  -H "Authorization: Bearer wextl_..." \
  -H "Content-Type: application/json" \
  -d '{
  "nodeId": 0,
  "attemptNumber": 0
}'
POST/runs/{id}/nodes/{nodeId}/respondAuth required

Submit a human-in-the-loop response and resume (or complete) the run.

Parameters
NameInTypeDescription
id*pathstring
nodeId*pathstring
Request body (required)
NameInTypeDescription
response*bodyobject
attemptNumberbodyinteger
Responses
200Response recorded.
400Invalid body.
401No valid bearer token.
402Payment required for mid-flow resume.
403Missing workflow:write scope.
404Run not found.
409Conflict — resume already in flight or run terminal.
421Wrong regional endpoint — follow error.base_url.
429Rate limited — retry after error.retry_after_s seconds.
NameInTypeDescription
dataobject
Example response
json
{
  "data": {}
}
Example request
bash
curl -X POST https://eu1.wextl.com/api/v1/runs/<id>/nodes/<nodeId>/respond \
  -H "Authorization: Bearer wextl_..." \
  -H "Content-Type: application/json" \
  -d '{
  "response": {},
  "attemptNumber": 0
}'

Credentials

6endpoints
GET/credentialsAuth required

List the organization's stored credentials (names and metadata only; secret payloads are never returned).

Parameters
NameInTypeDescription
cursorquerystring
limitqueryintegerPage size. Default 50.
appIdquerystringOptional app id to filter by.
Responses
200A page of credential summaries.
401No valid bearer token.
403Missing credential:read scope, or the plan lacks API access.
421Wrong regional endpoint — follow error.base_url.
429Rate limited — retry after error.retry_after_s seconds.
NameInTypeDescription
data*array<Credential>
next_cursor*string | null
data[] item (Credential)
NameInTypeDescription
id*string
name*string
appId*string
type*stringThe connection type id.
status*string
folderIdstring | null
createdAt*integerEpoch milliseconds.
updatedAt*integerEpoch milliseconds.
Example response
json
{
  "data": [
    {
      "id": "abc123",
      "name": "My workflow",
      "appId": "slack",
      "type": "oauth2",
      "status": "succeeded",
      "createdAt": 1719792000000,
      "updatedAt": 1719792000000,
      "folderId": "fld_01HXEXAMPLE"
    }
  ],
  "next_cursor": null
}
Example request
bash
curl -X GET https://eu1.wextl.com/api/v1/credentials \
  -H "Authorization: Bearer wextl_..."
POST/credentialsAuth required

Create a credential when safe (no-auth or secrets already supplied). OAuth or missing secrets return status credential_required with a connect_url for a logged-in human.

Request body (required)
NameInTypeDescription
appId*bodystring
connectionId*bodystring
name*bodystring
databodyobjectSecret field values when the caller already has them. Never invent placeholders.
teamIdbodystring | null
Responses
200Created credential or credential_required handoff.
400Invalid body.
401No valid bearer token.
403Missing credential:write scope, or the plan lacks API access.
421Wrong regional endpoint — follow error.base_url.
429Rate limited — retry after error.retry_after_s seconds.
NameInTypeDescription
dataCredentialCreateResult
data shape (CredentialCreateResult)
NameInTypeDescription
credentialIdstring
statusstring
appIdstring
connectionIdstring
connect_urlstring
Example response
json
{
  "data": {
    "credentialId": "abc123",
    "status": "succeeded",
    "appId": "slack",
    "connectionId": "abc123",
    "connect_url": "..."
  }
}
Example request
bash
curl -X POST https://eu1.wextl.com/api/v1/credentials \
  -H "Authorization: Bearer wextl_..." \
  -H "Content-Type: application/json" \
  -d '{
  "appId": "slack",
  "connectionId": "abc123",
  "name": "My workflow",
  "data": {},
  "teamId": "team_01HXEXAMPLE"
}'
PATCH/credentials/{id}Auth required

Rename a credential or move its folder (never returns secrets).

Parameters
NameInTypeDescription
id*pathstring
Request body (required)
NameInTypeDescription
namebodystring
folderIdbodystring | null
Responses
200Updated credential summary.
400Invalid body.
401No valid bearer token.
403Missing credential:write scope.
404Credential not found.
421Wrong regional endpoint — follow error.base_url.
429Rate limited — retry after error.retry_after_s seconds.
NameInTypeDescription
dataCredential
data shape (Credential)
NameInTypeDescription
id*string
name*string
appId*string
type*stringThe connection type id.
status*string
folderIdstring | null
createdAt*integerEpoch milliseconds.
updatedAt*integerEpoch milliseconds.
Example response
json
{
  "data": {
    "id": "abc123",
    "name": "My workflow",
    "appId": "slack",
    "type": "oauth2",
    "status": "succeeded",
    "createdAt": 1719792000000,
    "updatedAt": 1719792000000,
    "folderId": "fld_01HXEXAMPLE"
  }
}
Example request
bash
curl -X PATCH https://eu1.wextl.com/api/v1/credentials/<id> \
  -H "Authorization: Bearer wextl_..." \
  -H "Content-Type: application/json" \
  -d '{
  "name": "My workflow",
  "folderId": "fld_01HXEXAMPLE"
}'
DELETE/credentials/{id}Auth required

Soft-delete a credential.

Parameters
NameInTypeDescription
id*pathstring
Responses
200Deleted.
401No valid bearer token.
403Missing credential:write scope.
404Credential not found.
421Wrong regional endpoint — follow error.base_url.
429Rate limited — retry after error.retry_after_s seconds.
NameInTypeDescription
dataobject
data shape (object)
NameInTypeDescription
okboolean
Example response
json
{
  "data": {
    "ok": true
  }
}
Example request
bash
curl -X DELETE https://eu1.wextl.com/api/v1/credentials/<id> \
  -H "Authorization: Bearer wextl_..."
POST/credentials/{id}/verifyAuth required

Test whether a stored credential is accepted by the third-party service (never returns the secret).

Parameters
NameInTypeDescription
id*pathstring
Responses
200Verification outcome.
401No valid bearer token.
403Missing credential:use scope.
421Wrong regional endpoint — follow error.base_url.
429Rate limited — retry after error.retry_after_s seconds.
NameInTypeDescription
dataobject
Example response
json
{
  "data": {}
}
Example request
bash
curl -X POST https://eu1.wextl.com/api/v1/credentials/<id>/verify \
  -H "Authorization: Bearer wextl_..."
POST/credentials/dynamic-optionsAuth required

Fetch live RPC-backed field options (tables, channels, sheets, …).

Request body (required)
NameInTypeDescription
appId*bodystring
rpcId*bodystring
credentialIdbodystring
paramsbodyobject
Responses
200Option items.
400Invalid body.
401No valid bearer token.
403Missing credential:use scope.
421Wrong regional endpoint — follow error.base_url.
429Rate limited — retry after error.retry_after_s seconds.
NameInTypeDescription
dataobject
Example response
json
{
  "data": {}
}
Example request
bash
curl -X POST https://eu1.wextl.com/api/v1/credentials/dynamic-options \
  -H "Authorization: Bearer wextl_..." \
  -H "Content-Type: application/json" \
  -d '{
  "appId": "slack",
  "rpcId": "abc123",
  "credentialId": "abc123",
  "params": {}
}'

Databases

6endpoints
GET/databasesAuth required

List the organization's built-in database tables.

Parameters
NameInTypeDescription
limitqueryinteger
Responses
200Database table summaries.
401No valid bearer token.
403Missing database:read scope, or the plan lacks API access.
421Wrong regional endpoint — follow error.base_url.
429Rate limited — retry after error.retry_after_s seconds.
NameInTypeDescription
data*array<DatabaseSummary>
truncated*boolean
data[] item (DatabaseSummary)
NameInTypeDescription
id*string
name*string
columnCount*integer
rowCount*integer
Example response
json
{
  "data": [
    {
      "id": "abc123",
      "name": "My workflow",
      "columnCount": 3,
      "rowCount": 3
    }
  ],
  "truncated": true
}
Example request
bash
curl -X GET https://eu1.wextl.com/api/v1/databases \
  -H "Authorization: Bearer wextl_..."
POST/databasesAuth required

Create a built-in database table (DDL). Row writes are not available on the public API.

Request body (required)
NameInTypeDescription
name*bodystring
descriptionbodystring
columns*bodyarray<object>
teamIdbodystring | null
Responses
201Created table with generated column ids.
400Invalid body.
401No valid bearer token.
403Missing database:write scope, or the plan lacks API access.
421Wrong regional endpoint — follow error.base_url.
429Rate limited — retry after error.retry_after_s seconds.
NameInTypeDescription
dataDatabaseSchema
data shape (DatabaseSchema)
NameInTypeDescription
id*string
name*string
columns*array<object>
rowCount*integer
uniqueKeyColumnIdstring
Example response
json
{
  "data": {
    "id": "abc123",
    "name": "My workflow",
    "columns": [
      {
        "id": "abc123",
        "name": "My workflow",
        "type": "action",
        "required": true,
        "indexed": true
      }
    ],
    "rowCount": 3,
    "uniqueKeyColumnId": "abc123"
  }
}
Example request
bash
curl -X POST https://eu1.wextl.com/api/v1/databases \
  -H "Authorization: Bearer wextl_..." \
  -H "Content-Type: application/json" \
  -d '{
  "name": "My workflow",
  "columns": [
    {}
  ],
  "description": "...",
  "teamId": "team_01HXEXAMPLE"
}'
GET/databases/{id}Auth required

Read one database table's column schema.

Parameters
NameInTypeDescription
id*pathstring
Responses
200Schema projection.
401No valid bearer token.
403Missing database:read scope, or the plan lacks API access.
404Database not found.
421Wrong regional endpoint — follow error.base_url.
429Rate limited — retry after error.retry_after_s seconds.
NameInTypeDescription
dataDatabaseSchema
data shape (DatabaseSchema)
NameInTypeDescription
id*string
name*string
columns*array<object>
rowCount*integer
uniqueKeyColumnIdstring
Example response
json
{
  "data": {
    "id": "abc123",
    "name": "My workflow",
    "columns": [
      {
        "id": "abc123",
        "name": "My workflow",
        "type": "action",
        "required": true,
        "indexed": true
      }
    ],
    "rowCount": 3,
    "uniqueKeyColumnId": "abc123"
  }
}
Example request
bash
curl -X GET https://eu1.wextl.com/api/v1/databases/<id> \
  -H "Authorization: Bearer wextl_..."
PATCH/databases/{id}Auth required

Replace a table's column definitions with the full desired list (declarative).

Parameters
NameInTypeDescription
id*pathstring
Request body (required)
NameInTypeDescription
columns*bodyarray<object>
Responses
200Updated schema.
400Invalid body.
401No valid bearer token.
403Missing database:write scope, or the plan lacks API access.
404Database not found.
421Wrong regional endpoint — follow error.base_url.
429Rate limited — retry after error.retry_after_s seconds.
NameInTypeDescription
dataDatabaseSchema
data shape (DatabaseSchema)
NameInTypeDescription
id*string
name*string
columns*array<object>
rowCount*integer
uniqueKeyColumnIdstring
Example response
json
{
  "data": {
    "id": "abc123",
    "name": "My workflow",
    "columns": [
      {
        "id": "abc123",
        "name": "My workflow",
        "type": "action",
        "required": true,
        "indexed": true
      }
    ],
    "rowCount": 3,
    "uniqueKeyColumnId": "abc123"
  }
}
Example request
bash
curl -X PATCH https://eu1.wextl.com/api/v1/databases/<id> \
  -H "Authorization: Bearer wextl_..." \
  -H "Content-Type: application/json" \
  -d '{
  "columns": [
    {}
  ]
}'
DELETE/databases/{id}Auth required

Soft-delete a built-in database table.

Parameters
NameInTypeDescription
id*pathstring
Responses
200Deleted.
401No valid bearer token.
403Missing database:write scope.
404Database not found.
421Wrong regional endpoint — follow error.base_url.
429Rate limited — retry after error.retry_after_s seconds.
NameInTypeDescription
dataobject
data shape (object)
NameInTypeDescription
okboolean
Example response
json
{
  "data": {
    "ok": true
  }
}
Example request
bash
curl -X DELETE https://eu1.wextl.com/api/v1/databases/<id> \
  -H "Authorization: Bearer wextl_..."
GET/databases/{id}/rowsAuth required

Read rows from a built-in database table (bounded). No public DML row writes.

Parameters
NameInTypeDescription
id*pathstring
filtersquerystringJSON-encoded filter array.
sortColumnIdquerystring
sortDirquerystring
limitqueryinteger
cursorquerystring
Responses
200A page of rows keyed by column name.
400Invalid filters or query shape.
401No valid bearer token.
403Missing database:read scope, or the plan lacks API access.
404Database not found.
421Wrong regional endpoint — follow error.base_url.
429Rate limited — retry after error.retry_after_s seconds.
NameInTypeDescription
data*array<object>
count*integer
next_cursor*string | null
Example response
json
{
  "data": [
    {}
  ],
  "count": 3,
  "next_cursor": null
}
Example request
bash
curl -X GET https://eu1.wextl.com/api/v1/databases/<id>/rows \
  -H "Authorization: Bearer wextl_..."

Structures

4endpoints
GET/structuresAuth required

List the organization's structures.

Parameters
NameInTypeDescription
limitqueryinteger
Responses
200Structure summaries.
401No valid bearer token.
403Missing structure:read scope, or the plan lacks API access.
421Wrong regional endpoint — follow error.base_url.
429Rate limited — retry after error.retry_after_s seconds.
NameInTypeDescription
data*array<StructureSummary>
truncated*boolean
data[] item (StructureSummary)
NameInTypeDescription
id*string
name*string
fieldCount*integer
Example response
json
{
  "data": [
    {
      "id": "abc123",
      "name": "My workflow",
      "fieldCount": 3
    }
  ],
  "truncated": true
}
Example request
bash
curl -X GET https://eu1.wextl.com/api/v1/structures \
  -H "Authorization: Bearer wextl_..."
POST/structuresAuth required

Create a structure. Honours the structures_created plan limit (no bypass).

Request body (required)
NameInTypeDescription
name*bodystring
descriptionbodystring
fieldsbodyarray<object>
folderIdbodystring | null
teamIdbodystring | null
Responses
201Created structure.
400Invalid body.
401No valid bearer token.
403Missing structure:write scope, or plan structure limit reached.
421Wrong regional endpoint — follow error.base_url.
429Rate limited — retry after error.retry_after_s seconds.
NameInTypeDescription
dataStructure
data shape (Structure)
NameInTypeDescription
id*string
name*string
fields*array<object>
Example response
json
{
  "data": {
    "id": "abc123",
    "name": "My workflow",
    "fields": [
      {
        "name": "My workflow",
        "type": "action",
        "required": true
      }
    ]
  }
}
Example request
bash
curl -X POST https://eu1.wextl.com/api/v1/structures \
  -H "Authorization: Bearer wextl_..." \
  -H "Content-Type: application/json" \
  -d '{
  "name": "My workflow",
  "description": "...",
  "fields": [
    {}
  ],
  "folderId": "fld_01HXEXAMPLE",
  "teamId": "team_01HXEXAMPLE"
}'
GET/structures/{id}Auth required

Read one structure's field list.

Parameters
NameInTypeDescription
id*pathstring
Responses
200Structure fields.
401No valid bearer token.
403Missing structure:read scope, or the plan lacks API access.
404Structure not found.
421Wrong regional endpoint — follow error.base_url.
429Rate limited — retry after error.retry_after_s seconds.
NameInTypeDescription
dataStructure
data shape (Structure)
NameInTypeDescription
id*string
name*string
fields*array<object>
Example response
json
{
  "data": {
    "id": "abc123",
    "name": "My workflow",
    "fields": [
      {
        "name": "My workflow",
        "type": "action",
        "required": true
      }
    ]
  }
}
Example request
bash
curl -X GET https://eu1.wextl.com/api/v1/structures/<id> \
  -H "Authorization: Bearer wextl_..."
PATCH/structures/{id}Auth required

Update a structure name, description, fields, or folderId.

Parameters
NameInTypeDescription
id*pathstring
Request body (required)
NameInTypeDescription
namebodystring
descriptionbodystring
fieldsbodyarray<object>
folderIdbodystring | null
Responses
200Updated structure.
400Invalid body.
401No valid bearer token.
403Missing structure:write scope.
404Structure not found.
421Wrong regional endpoint — follow error.base_url.
429Rate limited — retry after error.retry_after_s seconds.
NameInTypeDescription
dataStructure
data shape (Structure)
NameInTypeDescription
id*string
name*string
fields*array<object>
Example response
json
{
  "data": {
    "id": "abc123",
    "name": "My workflow",
    "fields": [
      {
        "name": "My workflow",
        "type": "action",
        "required": true
      }
    ]
  }
}
Example request
bash
curl -X PATCH https://eu1.wextl.com/api/v1/structures/<id> \
  -H "Authorization: Bearer wextl_..." \
  -H "Content-Type: application/json" \
  -d '{
  "name": "My workflow",
  "description": "...",
  "fields": [
    {}
  ],
  "folderId": "fld_01HXEXAMPLE"
}'

Functions

4endpoints
GET/functionsAuth required

List the organization's custom functions (metadata only).

Parameters
NameInTypeDescription
cursorquerystring
limitqueryinteger
qquerystring
Responses
200Function summaries.
401No valid bearer token.
403Missing function:read scope, or the plan lacks API access.
421Wrong regional endpoint — follow error.base_url.
429Rate limited — retry after error.retry_after_s seconds.
NameInTypeDescription
data*array<FunctionSummary>
next_cursor*string | null
data[] item (FunctionSummary)
NameInTypeDescription
id*string
name*string
descriptionstring | null
Example response
json
{
  "data": [
    {
      "id": "abc123",
      "name": "My workflow",
      "description": "..."
    }
  ],
  "next_cursor": null
}
Example request
bash
curl -X GET https://eu1.wextl.com/api/v1/functions \
  -H "Authorization: Bearer wextl_..."
POST/functionsAuth required

Create a custom function. Requires the custom_functions plan feature (no bypass).

Request body (required)
NameInTypeDescription
name*bodystringcamelCase name.
code*bodystring
descriptionbodystring
parametersbodyarray<object>
folderIdbodystring | null
teamIdbodystring | null
Responses
201Created function.
400Invalid body.
401No valid bearer token.
403Missing function:write scope, or custom_functions not on plan.
421Wrong regional endpoint — follow error.base_url.
429Rate limited — retry after error.retry_after_s seconds.
NameInTypeDescription
dataFunction
data shape (Function)
NameInTypeDescription
id*string
name*string
descriptionstring | null
code*string
Example response
json
{
  "data": {
    "id": "abc123",
    "name": "My workflow",
    "code": "...",
    "description": "..."
  }
}
Example request
bash
curl -X POST https://eu1.wextl.com/api/v1/functions \
  -H "Authorization: Bearer wextl_..." \
  -H "Content-Type: application/json" \
  -d '{
  "name": "My workflow",
  "code": "...",
  "description": "...",
  "parameters": [
    {}
  ],
  "folderId": "fld_01HXEXAMPLE",
  "teamId": "team_01HXEXAMPLE"
}'
GET/functions/{id}Auth required

Read one custom function including user-owned code.

Parameters
NameInTypeDescription
id*pathstring
Responses
200Function with code.
401No valid bearer token.
403Missing function:read scope, or the plan lacks API access.
404Function not found.
421Wrong regional endpoint — follow error.base_url.
429Rate limited — retry after error.retry_after_s seconds.
NameInTypeDescription
dataFunction
data shape (Function)
NameInTypeDescription
id*string
name*string
descriptionstring | null
code*string
Example response
json
{
  "data": {
    "id": "abc123",
    "name": "My workflow",
    "code": "...",
    "description": "..."
  }
}
Example request
bash
curl -X GET https://eu1.wextl.com/api/v1/functions/<id> \
  -H "Authorization: Bearer wextl_..."
PATCH/functions/{id}Auth required

Update a custom function. Requires the custom_functions plan feature (no bypass).

Parameters
NameInTypeDescription
id*pathstring
Request body (required)
NameInTypeDescription
namebodystring
codebodystring
descriptionbodystring
parametersbodyarray<object>
folderIdbodystring | null
Responses
200Updated function.
400Invalid body.
401No valid bearer token.
403Missing function:write scope, or custom_functions not on plan.
404Function not found.
421Wrong regional endpoint — follow error.base_url.
429Rate limited — retry after error.retry_after_s seconds.
NameInTypeDescription
dataFunction
data shape (Function)
NameInTypeDescription
id*string
name*string
descriptionstring | null
code*string
Example response
json
{
  "data": {
    "id": "abc123",
    "name": "My workflow",
    "code": "...",
    "description": "..."
  }
}
Example request
bash
curl -X PATCH https://eu1.wextl.com/api/v1/functions/<id> \
  -H "Authorization: Bearer wextl_..." \
  -H "Content-Type: application/json" \
  -d '{
  "name": "My workflow",
  "code": "...",
  "description": "...",
  "parameters": [
    {}
  ],
  "folderId": "fld_01HXEXAMPLE"
}'

Teams

1endpoint
GET/teamsAuth required

List the organization's teams (discovery for create_workflow; requires workflow:read).

Responses
200Team summaries.
401No valid bearer token.
403Missing workflow:read scope, or the plan lacks API access.
421Wrong regional endpoint — follow error.base_url.
429Rate limited — retry after error.retry_after_s seconds.
NameInTypeDescription
data*array<Team>
data[] item (Team)
NameInTypeDescription
id*string
name*string
createdAt*integerEpoch milliseconds.
Example response
json
{
  "data": [
    {
      "id": "abc123",
      "name": "My workflow",
      "createdAt": 1719792000000
    }
  ]
}
Example request
bash
curl -X GET https://eu1.wextl.com/api/v1/teams \
  -H "Authorization: Bearer wextl_..."

Folders

4endpoints
GET/foldersAuth required

List the organization's folder tree (discovery for create_workflow; requires workflow:read).

Responses
200Folder summaries.
401No valid bearer token.
403Missing workflow:read scope, or the plan lacks API access.
421Wrong regional endpoint — follow error.base_url.
429Rate limited — retry after error.retry_after_s seconds.
NameInTypeDescription
data*array<Folder>
data[] item (Folder)
NameInTypeDescription
id*string
name*string
parentId*string | null
Example response
json
{
  "data": [
    {
      "id": "abc123",
      "name": "My workflow",
      "parentId": "abc123"
    }
  ]
}
Example request
bash
curl -X GET https://eu1.wextl.com/api/v1/folders \
  -H "Authorization: Bearer wextl_..."
POST/foldersAuth required

Create a folder (requires workflow:write).

Request body (required)
NameInTypeDescription
name*bodystring
parentIdbodystring | null
Responses
201Created folder.
400Invalid name or parentId.
401No valid bearer token.
403Missing workflow:write scope.
421Wrong regional endpoint — follow error.base_url.
429Rate limited — retry after error.retry_after_s seconds.
NameInTypeDescription
data*Folder
data shape (Folder)
NameInTypeDescription
id*string
name*string
parentId*string | null
Example response
json
{
  "data": {
    "id": "abc123",
    "name": "My workflow",
    "parentId": "abc123"
  }
}
Example request
bash
curl -X POST https://eu1.wextl.com/api/v1/folders \
  -H "Authorization: Bearer wextl_..." \
  -H "Content-Type: application/json" \
  -d '{
  "name": "My workflow",
  "parentId": "abc123"
}'
PATCH/folders/{id}Auth required

Rename or reparent a folder (requires workflow:write).

Parameters
NameInTypeDescription
id*pathstring
Request body (required)
NameInTypeDescription
namebodystring
parentIdbodystring | null
Responses
200Updated folder.
400Invalid name or parentId.
401No valid bearer token.
403Missing workflow:write scope.
404Folder not found.
421Wrong regional endpoint — follow error.base_url.
429Rate limited — retry after error.retry_after_s seconds.
NameInTypeDescription
data*Folder
data shape (Folder)
NameInTypeDescription
id*string
name*string
parentId*string | null
Example response
json
{
  "data": {
    "id": "abc123",
    "name": "My workflow",
    "parentId": "abc123"
  }
}
Example request
bash
curl -X PATCH https://eu1.wextl.com/api/v1/folders/<id> \
  -H "Authorization: Bearer wextl_..." \
  -H "Content-Type: application/json" \
  -d '{
  "name": "My workflow",
  "parentId": "abc123"
}'
DELETE/folders/{id}Auth required

Delete a folder (requires workflow:write). Contents are not cascade-deleted.

Parameters
NameInTypeDescription
id*pathstring
Responses
200Deleted.
401No valid bearer token.
403Missing workflow:write scope.
404Folder not found.
421Wrong regional endpoint — follow error.base_url.
429Rate limited — retry after error.retry_after_s seconds.
NameInTypeDescription
data*object
data shape (object)
NameInTypeDescription
okboolean
Example response
json
{
  "data": {
    "ok": true
  }
}
Example request
bash
curl -X DELETE https://eu1.wextl.com/api/v1/folders/<id> \
  -H "Authorization: Bearer wextl_..."

Activity

1endpoint
GET/activityAuth required

List the organization's activity feed (audit log). Requires activity:read (owner/admin).

Parameters
NameInTypeDescription
targetTypequerystring
targetIdquerystring
actorUserIdquerystring
actionquerystring
sincequeryintegerEpoch ms lower bound.
untilqueryintegerEpoch ms upper bound (exclusive).
limitqueryinteger
cursorquerystringOpaque "{ts}_{id}" from a previous page.
Responses
200Activity page with labeled events and actor map.
401No valid bearer token.
403Missing activity:read scope, or not an org admin.
421Wrong regional endpoint — follow error.base_url.
429Rate limited — retry after error.retry_after_s seconds.
NameInTypeDescription
data*ActivityPage
data shape (ActivityPage)
NameInTypeDescription
events*array<object>
actors*object
next_cursor*string | null
Example response
json
{
  "data": {
    "events": [
      {
        "id": "abc123",
        "ts": 0,
        "action": "...",
        "label": "My workflow",
        "targetType": "...",
        "targetId": "abc123",
        "actorUserId": "abc123",
        "metadata": "..."
      }
    ],
    "actors": {},
    "next_cursor": null
  }
}
Example request
bash
curl -X GET https://eu1.wextl.com/api/v1/activity \
  -H "Authorization: Bearer wextl_..."

Invitations

3endpoints
GET/invitationsAuth required

List organization invitations. Requires invitation:read (owner/admin).

Parameters
NameInTypeDescription
statusquerystring
limitqueryinteger
Responses
200Invitation summaries (includes invite_url).
401No valid bearer token.
403Missing invitation:read scope, or not an org admin.
421Wrong regional endpoint — follow error.base_url.
429Rate limited — retry after error.retry_after_s seconds.
NameInTypeDescription
data*array<Invitation>
data[] item (Invitation)
NameInTypeDescription
id*string
email*string
rolestring | null
teamIdstring | null
status*string
expiresAt*integerEpoch milliseconds.
createdAt*integerEpoch milliseconds.
inviterId*string
invite_url*stringAbsolute URL for the invitee; relay if email delivery fails.
Example response
json
{
  "data": [
    {
      "id": "abc123",
      "email": "...",
      "status": "succeeded",
      "expiresAt": 1719792000000,
      "createdAt": 1719792000000,
      "inviterId": "abc123",
      "invite_url": "...",
      "role": "...",
      "teamId": "team_01HXEXAMPLE"
    }
  ]
}
Example request
bash
curl -X GET https://eu1.wextl.com/api/v1/invitations \
  -H "Authorization: Bearer wextl_..."
POST/invitationsAuth required

Create an invitation. Requires invitation:write. Returns invite_url for headless relay.

Request body (required)
NameInTypeDescription
email*bodystring
role*bodystring
teamIdbodystring | null
Responses
201Created invitation.
401No valid bearer token.
403Missing invitation:write, seat cap, or role escalation denied.
409Pending invitation already exists for this email.
421Wrong regional endpoint — follow error.base_url.
429Rate limited — retry after error.retry_after_s seconds.
NameInTypeDescription
data*Invitation
data shape (Invitation)
NameInTypeDescription
id*string
email*string
rolestring | null
teamIdstring | null
status*string
expiresAt*integerEpoch milliseconds.
createdAt*integerEpoch milliseconds.
inviterId*string
invite_url*stringAbsolute URL for the invitee; relay if email delivery fails.
Example response
json
{
  "data": {
    "id": "abc123",
    "email": "...",
    "status": "succeeded",
    "expiresAt": 1719792000000,
    "createdAt": 1719792000000,
    "inviterId": "abc123",
    "invite_url": "...",
    "role": "...",
    "teamId": "team_01HXEXAMPLE"
  }
}
Example request
bash
curl -X POST https://eu1.wextl.com/api/v1/invitations \
  -H "Authorization: Bearer wextl_..." \
  -H "Content-Type: application/json" \
  -d '{
  "email": "...",
  "role": "...",
  "teamId": "team_01HXEXAMPLE"
}'
DELETE/invitations/{id}Auth required

Cancel a pending invitation. Requires invitation:write.

Parameters
NameInTypeDescription
id*pathstring
Responses
200Cancelled.
401No valid bearer token.
403Missing invitation:write scope, or not an org admin.
404Invitation not found.
409Invitation is not pending.
421Wrong regional endpoint — follow error.base_url.
429Rate limited — retry after error.retry_after_s seconds.
NameInTypeDescription
data*object
data shape (object)
NameInTypeDescription
okboolean
Example response
json
{
  "data": {
    "ok": true
  }
}
Example request
bash
curl -X DELETE https://eu1.wextl.com/api/v1/invitations/<id> \
  -H "Authorization: Bearer wextl_..."

Tags

4endpoints
GET/tagsAuth required

List workflow tags (requires workflow:read).

Responses
200Tag list.
401No valid bearer token.
403Missing workflow:read scope.
421Wrong regional endpoint — follow error.base_url.
429Rate limited — retry after error.retry_after_s seconds.
NameInTypeDescription
dataarray<object>
Example response
json
{
  "data": [
    {}
  ]
}
Example request
bash
curl -X GET https://eu1.wextl.com/api/v1/tags \
  -H "Authorization: Bearer wextl_..."
POST/tagsAuth required

Create a workflow tag.

Request body (required)
NameInTypeDescription
name*bodystring
color*bodystring
Responses
201Created tag.
400Invalid body.
401No valid bearer token.
403Missing workflow:write scope.
421Wrong regional endpoint — follow error.base_url.
429Rate limited — retry after error.retry_after_s seconds.
NameInTypeDescription
dataobject
Example response
json
{
  "data": {}
}
Example request
bash
curl -X POST https://eu1.wextl.com/api/v1/tags \
  -H "Authorization: Bearer wextl_..." \
  -H "Content-Type: application/json" \
  -d '{
  "name": "My workflow",
  "color": "..."
}'
PATCH/tags/{id}Auth required

Rename or recolour a tag.

Parameters
NameInTypeDescription
id*pathstring
Request body (required)
NameInTypeDescription
namebodystring
colorbodystring
Responses
200Updated tag.
400Invalid body.
401No valid bearer token.
403Missing workflow:write scope.
404Tag not found.
421Wrong regional endpoint — follow error.base_url.
429Rate limited — retry after error.retry_after_s seconds.
NameInTypeDescription
dataobject
Example response
json
{
  "data": {}
}
Example request
bash
curl -X PATCH https://eu1.wextl.com/api/v1/tags/<id> \
  -H "Authorization: Bearer wextl_..." \
  -H "Content-Type: application/json" \
  -d '{
  "name": "My workflow",
  "color": "..."
}'
DELETE/tags/{id}Auth required

Delete a tag and its assignments.

Parameters
NameInTypeDescription
id*pathstring
Responses
200Deleted.
401No valid bearer token.
403Missing workflow:write scope.
404Tag not found.
421Wrong regional endpoint — follow error.base_url.
429Rate limited — retry after error.retry_after_s seconds.
NameInTypeDescription
dataobject
data shape (object)
NameInTypeDescription
okboolean
Example response
json
{
  "data": {
    "ok": true
  }
}
Example request
bash
curl -X DELETE https://eu1.wextl.com/api/v1/tags/<id> \
  -H "Authorization: Bearer wextl_..."

Webhooks

2endpoints
GET/webhooksAuth required

List inbound webhooks (requires workflow:read).

Parameters
NameInTypeDescription
cursorquerystring
limitqueryinteger
qquerystring
Responses
200Webhook page.
401No valid bearer token.
403Missing workflow:read scope.
421Wrong regional endpoint — follow error.base_url.
429Rate limited — retry after error.retry_after_s seconds.
NameInTypeDescription
data*array<object>
next_cursor*string | null
Example response
json
{
  "data": [
    {}
  ],
  "next_cursor": null
}
Example request
bash
curl -X GET https://eu1.wextl.com/api/v1/webhooks \
  -H "Authorization: Bearer wextl_..."
DELETE/webhooks/{id}Auth required

Delete a webhook. Pass force=1 if still bound to a workflow.

Parameters
NameInTypeDescription
id*pathstring
forcequerystring
Responses
204Deleted.
401No valid bearer token.
403Missing workflow:write scope.
404Webhook not found.
409Webhook in use — pass force=1.
421Wrong regional endpoint — follow error.base_url.
429Rate limited — retry after error.retry_after_s seconds.
Example request
bash
curl -X DELETE https://eu1.wextl.com/api/v1/webhooks/<id> \
  -H "Authorization: Bearer wextl_..."

Members

1endpoint
GET/membersAuth required

List organization members (requires invitation:read / owner-admin).

Responses
200Member roster.
401No valid bearer token.
403Missing invitation:read scope, or not an org admin.
421Wrong regional endpoint — follow error.base_url.
429Rate limited — retry after error.retry_after_s seconds.
NameInTypeDescription
dataarray<object>
Example response
json
{
  "data": [
    {}
  ]
}
Example request
bash
curl -X GET https://eu1.wextl.com/api/v1/members \
  -H "Authorization: Bearer wextl_..."

Catalog

2endpoints
GET/catalog/appsAuth required

Search the app and module catalog by keyword. Use the returned app and module ids when creating or updating workflow nodes.

Parameters
NameInTypeDescription
query*querystringSearch keywords (app or capability name).
limitqueryintegerMax apps to return. Default 10.
Responses
200Matching apps with their modules.
400query is required.
401No valid bearer token.
403Missing workflow:read scope, or the plan lacks API access.
421Wrong regional endpoint — follow error.base_url.
429Rate limited — retry after error.retry_after_s seconds.
NameInTypeDescription
dataarray<CatalogApp>
data[] item (CatalogApp)
NameInTypeDescription
appId*string
name*string
descriptionstring | null
modules*array<object>
Example response
json
{
  "data": [
    {
      "appId": "slack",
      "name": "My workflow",
      "modules": [
        {
          "id": "abc123",
          "label": "My workflow",
          "type": "action"
        }
      ],
      "description": "..."
    }
  ]
}
Example request
bash
curl -X GET https://eu1.wextl.com/api/v1/catalog/apps \
  -H "Authorization: Bearer wextl_..."
GET/catalog/apps/{appId}/modules/{moduleId}Auth required

Read a module's parameter schema and metadata. Does not expose internal request implementation details.

Parameters
NameInTypeDescription
appId*pathstring
moduleId*pathstring
Responses
200The module spec (lean projection — meta + mappable/static fields).
400appId and moduleId are required, or the module cannot be projected for the public API.
401No valid bearer token.
403Missing workflow:read scope, or the plan lacks API access.
404Module not found.
421Wrong regional endpoint — follow error.base_url.
429Rate limited — retry after error.retry_after_s seconds.
NameInTypeDescription
dataModuleSpec
data shape (ModuleSpec)
NameInTypeDescription
meta*object
mappableFields*array<object>
staticFields*array<object>
emitsMultipleBundlesboolean
requiresConnectionboolean
Example response
json
{
  "data": {
    "meta": {},
    "mappableFields": [
      {}
    ],
    "staticFields": [
      {}
    ],
    "emitsMultipleBundles": true,
    "requiresConnection": true
  }
}
Example request
bash
curl -X GET https://eu1.wextl.com/api/v1/catalog/apps/<appId>/modules/<moduleId> \
  -H "Authorization: Bearer wextl_..."