Browse documentation

Automation

Current release · Updated October 2, 2026

DryKraft automation API: methods, permissions, request fields, response shapes, examples and current limits. Read authentication and error handling first.

GET/api/automation/workflows

List general workflows

Access: Workspace member · Success: 200

Managed outreach workflows are excluded. Returns execution counts.

No request body is required.

Response

Workflow[].

Request shape (illustrative)
curl --request GET \
  --url 'https://app.drykraft.com/api/automation/workflows' \
  --cookie 'drykraft_session=<YOUR_SESSION_TOKEN>'
POST/api/automation/workflows

Create workflow draft

Access: Owner, admin or member · Success: 201

Starts with a manual trigger.

JSON request

FieldTypeRequiredDetails
namestringYesName Max 100 characters.
descriptionstringNoDefault empty Max 1000 characters.

Response

Use Workflow.

Request shape (illustrative)
curl --request POST \
  --url 'https://app.drykraft.com/api/automation/workflows' \
  --cookie 'drykraft_session=<YOUR_SESSION_TOKEN>' \
  --header 'Content-Type: application/json' \
  --data '{
  "name": "<Name>"
}'
PUT/api/automation/workflows/{id}

Save workflow draft

Access: Owner, admin or member · Success: 200

Draft shape validated here; publish performs graph validation. Managed outreach workflows cannot be changed here.

JSON request

FieldTypeRequiredDetails
namestringYesName Max 100 characters.
descriptionstringNoDefault empty Max 1000 characters.
draftGraphYes

Response

Use Workflow.

Request shape (illustrative)
curl --request PUT \
  --url 'https://app.drykraft.com/api/automation/workflows/00000000-0000-4000-8000-000000000001' \
  --cookie 'drykraft_session=<YOUR_SESSION_TOKEN>' \
  --header 'Content-Type: application/json' \
  --data '{
  "name": "<Name>",
  "draft": {
    "nodes": [
      {
        "id": "<Unique nonempty node ID>",
        "type": "workflow",
        "position": {
          "x": 1,
          "y": 1
        },
        "data": {
          "kind": "trigger.manual",
          "label": "<Nonempty node label>"
        }
      }
    ],
    "edges": []
  }
}'
POST/api/automation/workflows/{id}/publish

Publish immutable version

Access: Owner or admin · Success: 200

Exactly one trigger, unique nodes, connected acyclic graph. Only condition branches, unique true/false handles. Activates workflow; future runs use this version.

No request body is required.

Response

object. id, workflow_id, version, graph, created_at

Request shape (illustrative)
curl --request POST \
  --url 'https://app.drykraft.com/api/automation/workflows/00000000-0000-4000-8000-000000000001/publish' \
  --cookie 'drykraft_session=<YOUR_SESSION_TOKEN>'
POST/api/automation/workflows/{id}/status

Activate or pause workflow

Access: Owner or admin · Success: 200

Must already be published.

JSON request

FieldTypeRequiredDetails
statusactive | pausedYesWorkflow status

Response

Use Workflow.

Request shape (illustrative)
curl --request POST \
  --url 'https://app.drykraft.com/api/automation/workflows/00000000-0000-4000-8000-000000000001/status' \
  --cookie 'drykraft_session=<YOUR_SESSION_TOKEN>' \
  --header 'Content-Type: application/json' \
  --data '{
  "status": "active"
}'
GET/api/automation/workflows/{id}/versions

Read published versions

Access: Workspace member · Success: 200

Latest version first.

No request body is required.

Response

object[]. id, workflow_id, version, graph, created_at

Request shape (illustrative)
curl --request GET \
  --url 'https://app.drykraft.com/api/automation/workflows/00000000-0000-4000-8000-000000000001/versions' \
  --cookie 'drykraft_session=<YOUR_SESSION_TOKEN>'
GET/api/automation/workflows/{id}/webhook

Read workflow hook URL

Access: Owner or admin · Success: 200

URL is a secret capability; null before creation. Never expose in public docs/logs.

No request body is required.

Response

FieldTypeRequiredDetails
urlstring or nullNo
Request shape (illustrative)
curl --request GET \
  --url 'https://app.drykraft.com/api/automation/workflows/00000000-0000-4000-8000-000000000001/webhook' \
  --cookie 'drykraft_session=<YOUR_SESSION_TOKEN>'
POST/api/automation/workflows/{id}/webhook

Create or rotate hook URL

Access: Owner or admin · Success: 200

Old token immediately stops working. Publish an active webhook trigger before receiving runs.

No request body is required.

Response

FieldTypeRequiredDetails
urluriNo
Request shape (illustrative)
curl --request POST \
  --url 'https://app.drykraft.com/api/automation/workflows/00000000-0000-4000-8000-000000000001/webhook' \
  --cookie 'drykraft_session=<YOUR_SESSION_TOKEN>'
POST/api/automation/workflows/{id}/run

Run published version

Access: Owner, admin or member · Success: 202

Returns an accepted execution; inspect history for outcome. Published version required. Worker enforces billing access.

JSON request

FieldTypeRequiredDetails
inputobjectNoObject field values. Only keys in the workspace object definition are allowed; required fields and field types are validated.

Response

Use Execution.

Request shape (illustrative)
curl --request POST \
  --url 'https://app.drykraft.com/api/automation/workflows/00000000-0000-4000-8000-000000000001/run' \
  --cookie 'drykraft_session=<YOUR_SESSION_TOKEN>' \
  --header 'Content-Type: application/json' \
  --data '{}'
GET/api/automation/executions

List recent executions

Access: Workspace member · Success: 200

Latest 100, with workflow_name.

No request body is required.

Response

Execution[].

Request shape (illustrative)
curl --request GET \
  --url 'https://app.drykraft.com/api/automation/executions' \
  --cookie 'drykraft_session=<YOUR_SESSION_TOKEN>'
GET/api/automation/executions/{id}

Inspect execution

Access: Workspace member · Success: 200

Includes ordered node execution attempts and their input/output/error/timestamps.

No request body is required.

Response

Use Execution.

FieldTypeRequiredDetails
nodesobject[]No
Request shape (illustrative)
curl --request GET \
  --url 'https://app.drykraft.com/api/automation/executions/00000000-0000-4000-8000-000000000001' \
  --cookie 'drykraft_session=<YOUR_SESSION_TOKEN>'
POST/api/automation/executions/{id}/cancel

Cancel unfinished execution

Access: Owner, admin or member · Success: 200

Queued/running/waiting/retrying only. Cannot recall an external side effect already accepted.

No request body is required.

Response

Use Execution.

Request shape (illustrative)
curl --request POST \
  --url 'https://app.drykraft.com/api/automation/executions/00000000-0000-4000-8000-000000000001/cancel' \
  --cookie 'drykraft_session=<YOUR_SESSION_TOKEN>'
POST/api/automation/executions/{id}/retry

Retry failed execution

Access: Owner, admin or member · Success: 200

Only failed executions. Review external side effects before retrying. Outreach reservations prevent automatic ambiguous resend.

No request body is required.

Response

Use Execution.

Request shape (illustrative)
curl --request POST \
  --url 'https://app.drykraft.com/api/automation/executions/00000000-0000-4000-8000-000000000001/retry' \
  --cookie 'drykraft_session=<YOUR_SESSION_TOKEN>'
GET/api/automation/credentials

List HTTP credentials

Access: Owner or admin · Success: 200

Only id, name, provider and created_at are returned; value remains private.

No request body is required.

Response

object[]. id, name, provider, created_at

Request shape (illustrative)
curl --request GET \
  --url 'https://app.drykraft.com/api/automation/credentials' \
  --cookie 'drykraft_session=<YOUR_SESSION_TOKEN>'
POST/api/automation/credentials

Save HTTP credential

Access: Owner or admin · Success: 201

Encrypted per workspace; header is required when provider=header.

JSON request

FieldTypeRequiredDetails
namestringYesName Max 100 characters.
providerbearer | basic | headerYesOutbound HTTP authorization, not DryKraft API authentication
valuestringYesPrivate value Max 5000 characters.
headerstringNo Pattern: ^[a-zA-Z0-9-]+$.

Response

object. id, name, provider, created_at

Request shape (illustrative)
curl --request POST \
  --url 'https://app.drykraft.com/api/automation/credentials' \
  --cookie 'drykraft_session=<YOUR_SESSION_TOKEN>' \
  --header 'Content-Type: application/json' \
  --data '{
  "name": "<Name>",
  "provider": "bearer",
  "value": "<Private value>"
}'
DELETE/api/automation/credentials/{id}

Delete HTTP credential

Access: Owner or admin · Success: 200

Existing workflows using it will need another credential.

No request body is required.

Response

Use OK.

Request shape (illustrative)
curl --request DELETE \
  --url 'https://app.drykraft.com/api/automation/credentials/00000000-0000-4000-8000-000000000001' \
  --cookie 'drykraft_session=<YOUR_SESSION_TOKEN>'