NAV

Introduction

Welcome to the Pneumatic API! You can use our API to access Pneumatic public API endpoints, which can get information on templates and run workflows.

All the examples in the dark area are provided in Python code.

Authentication

import requests

api_key = 'api_key'
headers = { 'Authorization': f'Bearer {api_key}' }
response = requests.get('https://api.pneumatic.app/some-endpoint', headers=headers)

Pneumatic expects for the API key to be included in all API requests to the server in a header that looks like the following:

Authorization: Bearer api_key

Use bearer token authentication for each API request.

Templates

Get All Templates

import requests

api_key = 'your_api_key'
headers = {
  'Authorization': f'Bearer {api_key}'
}

r = requests.get('https://api.pneumatic.app/templates', headers=headers)

The above command returns JSON structured like this:

{
  "count": 10,
  "next": "str",
  "previous": "str",
  "results": [
    {
      "id": 1,
      "name": "Sample Template",
      "tasks_count": "int",
      "performers_count": "str",
      "template_owners": ["int"],
      "is_active": "bool",
      "is_public": "bool",
      "is_embedded": "bool",
      "description": "str",
      "kickoff": {
        "id": "int",
        "description": "str",
        "fields": [
          { 
            "name": "str", 
            "type": "str", 
            "order": "int",
            "is_required": "bool", 
            "description": "str", 
            "api_name": "str",
            "selections": [
              {
                'id': "int",
                'value': "str"
              }
            ]
          }
        ]
      }
    }
  ]

}

If request contains limit/offset parameters then response will have structure like this:

{
  "count": 123,
  "next": "next page link", // If this is the last page then "next" is null
  "previous": "prev page link", // If this is the first page then "previous" is null
  "results": [...] // list of templates
}

This endpoint retrieves all templates in your account.

HTTP Request

GET https://api.pneumatic.app/templates

Query Parameters

Parameter Default Description
ordering -date Available values: date, name, -date, -name.
limit 20 Use for pagination
offset 0 Use for pagination

Get a Specific Template

import requests

api_key = 'your_api_key'
headers = {
  'Authorization': f'Bearer {api_key}'
}
template_id = 1

r = requests.get(f'https://api.pneumatic.app/templates/{template_id}', headers=headers)

The above command returns JSON structured like this:

{
  "id": "int",
  "name": "str",
  "description": "str",
  "is_active": "bool",
  "is_public": "bool",
  "public_url": "str | null",
  "public_url": "str | null",
  "public_success_url": "str | null",
  "is_embedded": "?bool,     // default: false"
  "embed_url": "str | null",
  "finalizable": "bool",
  "date_updated": "str", //" ISO 8601 format: YYYY-MM-DDThh:mm:ss[.SSS]" 
  "updated_by": "int",
  "template_owners": ["int"],
  "tasks_count": "int",
  "performers_count": "int",
  "kickoff": {
    "id": "int", 
    "description": "str", 
    "fields": [
      { 
        "id": "int",
        "order": "int",
        "name": "str", 
        "type": "str", 
        "is_required": "bool", 
        "description": "str", 
        "default": "str",
        "api_name": "str",
        "selections": [ // these are only passed in for radio button checkbox and dropdown fields 
          { 
            "id": "int",
            "value": "str"
          }
        ] 
      }
    ] 
  },
  "tasks": [
    {
      "id": "int", 
      "number": "int",
      "name": "str",
      "description": "str",
       "delay": "str",       // null if the formal is not aset as: '[DD] [[hh:]mm:]ss'
      "require_completion_by_all": "bool",
      "raw_due_date": {   
          "api_name": "str",
          "duration": "str",
          "duration_months": "int, default 0",
          "rule": "str",
          "source_id": "?str | null"
      },
      "raw_performers": [
        {
          "id": "int", 
          "type": "user|field|workflow_starter", 
          "source_id": "?str", // id the id of a user, group or the api name of the field or null 
          "label": "str"       // this is a read only parameter: the user name, group name or field name  
        },
      ],
      "checklists": ?[
        {
          "api_name": "str",
          "selecions": [
            {
              "api_name": "str",
              "value": "str"
            }
          ]
        }
      ]
      "fields": ?[
        { 
          "id": "int",
            "order": "int", 
            "name": "str", 
            "type": "str", 
            "is_required": "bool", 
            "description": "str",
          "default": "str",
            "api_name": "str",
            "selections": [ // these are only passed in for radio button checkbox and dropdown fields 
              { 
                "id": "int",
                "value": "str"
              }
            ]  
        }
      ],
      "conditions": ?[
        {
          "id": "int",
          "action": "str", // end_process, skip_task, start_task
          "order": "int",
          "api_name": "str",
          "rules": [
            {
              "id": "int",
              "api_name": "str",
              "predicates": [
                {
                  "id": "int",
                  "field_type": "str",
                  "value": "Optional[str]",
                  "api_name": "str",
                  "field": "str", // the api_name of the field being used
                  "operator": "str" // equals, not_equals,  exists, not_exists, contains, not_contains, more_than, less_than
                }
              ]
            }
          ]
        }
      ]
    }
  ]
}

This endpoint retrieves a specific template.

HTTP Request

GET https://api.pneumatic.app/templates/<ID>

URL Parameters

Parameter Description
ID The ID of the template to retrieve

Empty field values:

Create a new template

import json
import requests

api_key = 'your_api_key'

headers = {
  'Authorization': f'Bearer {api_key}',
  'Content-Type': 'application/json'
}

template_info = {
  "name": "template name",
  "description": "template descrition optiona",   
  "template_owners": "[int]",
  "is_active": "bool optional, default false",    
  "is_public": "bool optional, default false",    
  "public_url": "str | null",
  "public_success_url": "string optional, defualt null",
  "is_embedded": "bool optional default false",     
  "embed_url": "str | null",
  "finalizable":"bool optional, default false",
  "kickoff": { 
    "description": "string optional",
    "fields": [
      {
        "api_name": "string optional", 
        "order": "int", 
        "name": "int", 
        "type": "int", 
        "is_required": "bool optional default false",
        "description": "string optional", 
        "default:": "string optional"
        "selections": [      #only passed in if there are radio button/checkbox fields 
          { 
            "value": "string"
          }
        ]  
      }
    ] 
  },
  "tasks": [
    {
      "number": "int",
      "name": "string",
      "description": "string optional",
      "require_completion_by_all": "bool",
      "delay": "string or null: [DD] [[hh:]mm:]ss",
      "raw_due_date": {   
          "api_name": "str",
          "duration": "str",
          "duration_months": "int, default 0",
          "rule": "str",
          "source_id": "?str | null"
      },
      "raw_performers": [
        {
          "id": "int", 
          "type": "user|field|workflow_starter", 
          "source_id": "?str - user or group id or the api_name or null" 
          "label": "str -  user/group/field name, read only" 
        },
      ],
      "checklists": [
        {
          "api_name": "string optional",
          "selecions": [
            {
              "api_name": "string optional",
              "value": "string"
            }
          ]
        }
      ],
      "fields": [#fields are optional
        { 
          "api_name": "string optional",
          "order": "int", 
          "name": "string", 
          "type": "string, 
          "is_required": "bool optional, default - false",
          "description": "string optiona", 
          "default": "string optional",
          "selections": [     #only passed in for radio buttons, checkboxes and dropdown lists
            { 
              "value": "string"
            }
          ] 
        }
      ],
      "conditions": [#an optional parameter
        {
          "action": "string end_process, skip_task, start_task",
          "order": "int",
          "api_name": "string",
          "rules": [
            {
              "api_name": "string",
              "predicates": [
                {
                  "field_type": "string",
                  "value": "string optional",
                  "api_name": "string optional",
                  "field": "string - api name",
                  "operator": "string equals, not_equals, exists, not_exists, contains, not_contains, more_than, less_than"
                }
              ]
            }
          ]
        }
      ]
    }
  ]
}

json_data = json.dumps(template_info)
r = requests.post(
    f'https://api.pneumatic.app/templates', 
    headers=headers,
    data=json_data,
)

The endpoint creates a new template as per the parametrs passed in the json.

HTTP Request

POST https://api.pneumatic.app/templates

Upload file for attachment

import json
import requests

api_key = 'your_api_key'
content_type = 'image/png'
headers = {
  'Authorization': f'Bearer {api_key}',
  'Content-Type': 'application/json',
}
file_info = json.dumps({
   'filename': 'pic.png',
   'thumbnail': True,
   'content_type': content_type,
   'size': 103613
})

attachment_info = requests.post(
    'https://api.pneumatic.app/workflows/attachments', 
    headers=headers,
    data=file_info,
).json()

payload = '<file contents here>'

r = requests.put(
    attachment_info['file_upload_url'],
    data=payload, 
    headers={'Content-Type': content_type},
)

The above command returns JSON structured like this:

{
  "id": int,
  "file_upload_url": str, // URL to upload file
  "thumbnail_upload_url": str?, // URL to upload thumbnail 
}

HTTP Request

POST https://api.pneumatic.app/workflows/attachments

Body Parameters

Parameter Required Description
filename Yes
content_type Yes Header is used to indicate the media type of the resource (e.g. image/png)
size Yes Size of file (less than 104857600 bytes)
thumbnail No Boolean. Set true if you'd like to upload thumbnail image

Make a file public

import requests

api_key = 'your_api_key'
headers = {
  'Authorization': f'Bearer {api_key}',
}

attachment_id = 123

r = requests.post(
    f'https://api.pneumatic.app/workflows/attachments/{attachment_id}/publish', 
    headers=headers,
)

The above command returns JSON structured like this:

{
  "url": "str",
  "thumbnail_url": "str",
}

You have to make your file public. Otherwise, nobody can watch it.

HTTP Request

POST https://api.pneumatic.app/workflows/attachments/<ID>/publish

URL Parameters

Parameter Description
ID The ID of the attachment

Workflows

Launch a Workflow Based on Specific Template

import json
import requests

api_key = 'your_api_key'
headers = {
  'Authorization': f'Bearer {api_key}',
  'Content-Type': 'application/json'
}
template_id = 1
workflow_info = {
  "id": template_id,
  "name": "Workflow Name",
  "kickoff": { // nullable
    "string-field-1": "Value 1",
    "text-field-2": "Value 2",
    "dropdown-field-3": "selection ID",
    "checkbox-field-4":["selection ID", ...],
    "radio-field-5": "selection ID",
    "date-field-6": "date in ISO format",
    "file-field-7": ["attachment ID", ...], 
    "url-field-8": "https://grave.com/",
    "user-field-9": 1 // user id
  }
}

json_data = json.dumps(workflow_info)
r = requests.post(
    f'https://api.pneumatic.app/templates/{template_id}/run', 
    headers=headers,
    data=json_data,
)

The above command returns JSON structured like this:

{
  "workflow_id": 1
}

This endpoint launches a new workflow based on specific template.

HTTP Request

POST https://api.pneumatic.app/templates/<ID>/run

URL Parameters

Parameter Description
ID The ID of the template to launch

Body Parameters

Parameter Required Description
name Yes The name of the workflow you'd like to launch
tasks No Used if needed to overwrite some template's tasks properties designed by owner. For now, only url supported.
kickoff Yes if there are required fields in kickoff Dictionary where the keys are API names of kickoff fields. Checkbox and radio fields take as values IDs of selections. Retrieve a template to get these IDs.

Get Workflows fields data

import requests

api_key = 'your_api_key'
headers = {
  'Authorization': f'Bearer {api_key}',
}

r = requests.get(
    f'https://api.pneumatic.app/workflows/fields', 
    headers=headers,
    params={
      'template_id': 1,
      'status': 'done',
      'fields': 'field-1,field-2,field-3',
      'limit': 15,
      'offset': 0
    }
)

The above command returns JSON structured like this:

{
  "count": int,
  "next": str?, // link to the next page
  "previous": str?, // link to the previous page
  "results":[ 
    {
      "id": str, 
      "name": str, 
      "status": str, 
      "date_created": str, // format ISO 8601: YYYY-MM-DDThh:mm:ss[.SSS] 
      "date_completed": str, // format ISO 8601: YYYY-MM-DDThh:mm:ss[.SSS] 
      "fields": [
        {
          "id": int, 
          "task_id": int | null,
          "kickoff_id": int | null,
          "type": str, // string|text|radio|checkbox|date|url|dropdown|file|user
          "api_name": str, 
          "name": str,
          "value": str,
          "attachments": [
            {
              "id": int,
              "name": str,
              "url": str
            }
          ],
          "selections": [
            {
              "id": int,
              "api_name": str,
              "value": str,
              "is_selected": bool
            }
          ]
        }
      ]
    }
  ]
}

This endpoint returns workflows fields data based on specific template.

HTTP Request

GET https://api.pneumatic.app/workflows/fields

URL Parameters

Parameter Required Description
template_id yes The ID of the template
status no Workflows status.
Possible values: running, delayed, done
fields no List of api_name task/kickoff fields separated by ,.
For example: field-1,field-2
You can take api_names from Get a Specific Template API
limit no Size of page. Default value is 15
offset no Number of page. Default value is 0

Tasks

Get a list of tasks

import requests

api_key = 'your_api_key'
headers = {
  'Authorization': f'Bearer {api_key}',
}

r = requests.get(
    f'https://api.pneumatic.app/v3/tasks?assigned_to=<user_id>', 
    headers=headers,
)

The above command returns JSON structured like this:

{
  "count": int,
  "next": str?, // link to the next page
  "previous": str?, // link to the previous page
  "results":[
    {
      "id": str,
      "name": str,
      "workflow_name": str,
      "due_date": null|str?, // null if task doesn't have a due date. Format ISO 8601: YYYY-MM-DDThh:mm:ss[.SSS] 
      "template_id": int,
      "template_task_id": int,
      "is_urgent": bool
    }
  ]
}

This endpoint returns running tasks assigned to a specified user.

HTTP Request

GET https://api.pneumatic.app/v3/tasks

URL Parameters

Parameter Required Description
assigned_to no User id assigned to tasks
limit no Size of page
offset no Number of page

Get a single task

import requests

api_key = 'your_api_key'
headers = {
  'Authorization': f'Bearer {api_key}',
}

r = requests.get(
    f'https://api.pneumatic.app/v2/tasks/<id>', 
    headers=headers,
)

The above command returns JSON structured like this:

{
   "id": int,
   "name": str,
   "description": str,
   "date_started": str,
   "date_completed": null | str,
   "due_date": null | str,
   "is_completed": bool,
   "is_urgent": bool,
   "require_completion_by_all": bool,
   "performers": [int], // users ids
   "delay": null | {
     "id": int,
     "duration": str,
     "start_date": str,
     "end_date": str,
     "estimated_end_date": str
   },
   "output": [
     {
      "id": int, 
      "task_id": int | null,
      "kickoff_id": int | null,
      "type": str, // string|text|radio|checkbox|date|url|dropdown|file|user
      "api_name": str, 
      "name": str,
      "value": str,
      "attachments": [
        {
          "id": int,
          "name": str,
          "url": str
        }
      ],
      "selections": [
        {
          "id": int,
          "api_name": str,
          "value": str,
          "is_selected": bool
        }
      ]
    }
   ]
}

This endpoint returns a specific task.

HTTP Request

GET https://api.pneumatic.app/v2/tasks/<id>

Complete a task

import requests

api_key = 'your_api_key'
headers = {
  'Authorization': f'Bearer {api_key}',
}

workflow_id ='the id of the workflow you want to complete the curren task in'
workflow = requests.get(f"https://api.pneumatic.app/workflows/{workflow_id}", headers=headers).json()

task_id =workflow['current_task']['id'] 
user_id='the id of the user who will be completing the task(optiona)'

headers = {
  'Authorization': f'Bearer {api_key}',
  'Content-Type':'application/json'
}

data_and_outputs ={
  'task_id':task_id,
  'user_id':user_id,
  'output': {
    'output-field-1':'value',
    'output-field-2:['selection-id-1', 'selection-id-2' ...],
    'output-field-3: 'selection-id',
  }
}
json_data = json.dumps(data_and_outputs)
r = requests.post(
  f'https://api.pneumatic.app/workflows/{workflow_id}/task-complete',
  headers=headers,
  data = json_data
)

if successful the above request returns a success code otherwise a json describing the nature of the error will be returned

The endpoint completes the current task in a workflow

HTTP Request

POST https://api.pneumatic.app/<workflow-id>/task-complete

Only the currently active task in a workflow can be completed. To do so you need to pass in the task-id along with data for the output fields you want filled out before the task is completed.

These are passed in as a json of the form shown in the code example on the right where it is assigned to the data_and_outputs variable.

Thus, to complete a task, you need to know:

Users

Get user list

import requests

api_key = 'your_api_key'
headers = {
  'Authorization': f'Bearer {api_key}'
}

r = requests.get(
  'https://api.pneumatic.app/accounts/users?offset=0&limit=20', 
  headers=headers,
)

The above command returns JSON structured like this:

{
  "count": int,
  "next": str, // nullable
  "previous": str, // nullable
  "results": [
    {
      "id": int,
      "email": str,
      "first_name": str,
      "last_name": str,
      "phone": str, // nullable
      "photo": str, // nullable
      "status": UserStatusEnum,
      "is_staff": bool,
      "is_admin": bool,
      "is_account_owner": bool,
      "invite": {
        "id": str,
        "by_username": str,
        "date_created": str, // format ISO 8601: YYYY-MM-DDThh:mm:ss[.SSS]
        "invited_by": int,
        "invited_from": InvitedFromEnum
      }
    }
  ]
}

HTTP Request

GET https://api.pneumatic.app/accounts/users

URL Parameters

Parameter Description
limit Use for pagination.
offset Use for pagination.
order asc\desc

UserStatusEnum:

InvitedFromEnum:

Webhooks

Events

import requests

api_key = 'your_api_key'
headers = {
  'Authorization': f'Bearer {api_key}'
}
end_point = 'https://api.pneumatic.app/webhooks/events'
r = requests.get(end_point, headers=headers)

The command returns a list of events with the current state of the subscription for each one of them:

[
  {
     "event": 'workflow_completed',
     "url": str | null
  },
  {
     "event": 'workflow_started',
     "url": str | null
  },
    {
     "event": 'task_completed_v2',
     "url": str | null
  },
  {
     "event": 'task_returned',
     "url": str | null
  }
]

The endpoint returns a list of events with their subscriptions

HTTP Request

GET https://api.pneumatic.app/webhooks/events

For each event in the returned list you get:

Pneumatic has four basic events you can subscribe to via webhooks:

Get a Specific Event

import requests

api_key = 'your_api_key'
headers = {
  'Authorization': f'Bearer {api_key}'
}
end_point = 'https://api.pneumatic.app/webhooks/events/event_name'

r = requests.get(
  end_point, 
  headers=headers,
)

If successful the above command returns a jason with the url subscribed to the event or null

{
   "url": str | null
}

The endpoint returns the url subscribed to a specific event or nill

HTTP Request

GET https://api.pneumatic.app/webhooks/events/event_name

Available event names

Event name Description
workflow_completed an entire workflow is completed
workflow_started a new workflow is started
task_completed_v2 a task is completed
task_returned a task is returned

Subscribe to an event

import requests

api_key = 'your_api_key'
headers = {
  'Authorization': f'Bearer {api_key}'
}
end_point = 'https://api.pneumatic.app/webhooks/events/event_name/subscribe'
payload = {
  'url': subscription_url
}

r = requests.post(end_point, headers=headers, data = payload)

if successful, the commande will subscribe subscription_url to event_name: If executed successfully, the request returns an ampty body

{}

This endpoint subscribes you to the event_name event.

HTTP Request

POST https://api.pneumatic.app/webhooks/events/event_name/subscribe

Available event names

Event name Description
workflow_completed an entire workflow is completed
workflow_started a new workflow is started
task_completed_v2 a task is completed
task_returned a task is returned

Unsubscribe from an event

import requests

api_key = 'your_api_key'
headers = {
  'Authorization': f'Bearer {api_key}'
}
end_point = 'https://api.pneumatic.app/webhooks/events/event_name/unsubscribe'

r = requests.post(end_point, headers=headers)

if successful, the command will ubsubscibe you from the event_name event: If successfuly command returns 204 and an empty body

{}

This endpoint unsubscribes you from the event_name event.

HTTP Request

POST https://api.pneumatic.app/webhooks/events/event_name/unsubscribe

Available event names

Event name Description
workflow_completed an entire workflow is completed
workflow_started a new workflow is started
task_completed_v2 a task is completed
task_returned a task is returned

There is no need to supply a specific url, the webhook url for the specified event will simply be deleted.

Subscribe to all events at once

import requests

api_key = 'your_api_key'
headers = {
  'Authorization': f'Bearer {api_key}'
}
end_point = 'https://api.pneumatic.app/webhooks/subscribe'

r = requests.post(end_point, headers=headers)

if successful, the command will subscribe you to all events at once: The command returns the subscription url that will be set for all events:

{
  'url': str
}

This endpoint subscribes you to all events at once.

HTTP Request

POST https://api.pneumatic.app/webhooks/subscribe

Unsubscribe from all events at once

import requests

api_key = 'your_api_key'
headers = {
  'Authorization': f'Bearer {api_key}'
}
end_point = 'https://api.pneumatic.app/webhooks/unsubscribe'

r = requests.post(end_point, headers=headers)

if successful, the command will cancel all your subscriptions at once. All the urls for all the events will have been wiped. The command returns an empty body

{}

This endpoint cancels all your webhook subscriptions at once.

HTTP Request

POST https://api.pneumatic.app/webhooks/unsubscribe

Task Completed Webhook Event Schema

{
  "hook": {
    "id": 1,
    "event": "task_completed_v2",
    "target": "your_webhook_listener_url"
  },
  "task": {
    "id": 1,
    "name": "Task name",
    "description": "Task description",
    "number": 1,
    "date_started": "2020-10-12T16:25:00.062Z",
    "date_completed": "2020-10-12T16:25:58.675Z",
    "output": [
      {
        "id": 1,
        "name": "Performer",
        "type": "user",
        "api_name": "field-shdgkk",
        "value": "1",
        "is_required": true,
        "selections": [],
        "attachments": []
      },
      {
        "id": 2,
        "name": "Label",
        "type": "radiobutton",
        "api_name": "field-asdsfd",
        "value": null,
        "is_required": true,
        "selections": [
          {
            "id": 1,
            "value": "First Selection",
            "is_selected": false
          },
          {
            "id": 2,
            "value": "Second Selection",
            "is_selected": true
          }
        ],
        "attachments": []
      },
      {
        "id": 3,
        "name": "File",
        "type": "file",
        "api_name": "field-cvkjbk",
        "value": null,
        "is_required": true,
        "selections": [],
        "attachments": [
          {
            "id": 1,
            "name": "filename.png",
            "url": "https://fake-url.com"
          }
        ]
      }
    ],
    "performers": [
      {
        "id": 1,
        "first_name": "John",
        "last_name": "Doe"
      }
    ],
    "workflow": {
      "id": 1,
      "name": "Workflow Name",
      "status": 1,
      "date_created": "2020-10-12T16:12:10.099Z",
      "template": {
        "id": 1,
        "name": "Template name"
      },
      "kickoff": {
        "id": 1,
        "description": "Kickoff description",
        "output": []
      },
      "current_task": {
        "id": 2,
        "name": "Second task",
        "description": "Task description",
        "number": 2,
        "date_started": "2020-10-12T16:25:00.062Z",
        "date_completed": "2020-10-12T16:25:58.675Z",
        "performers": [
          {
            "id": 2,
            "first_name": "John Jr.",
            "last_name": "Doe"
          }
        ]
      }
    }
  }
}

event: task_completed_v2

Task Returned Webhook Event Schema

event: task_returned

See Task Completed Webhook Event Schema

Workflow Started Webhook Event Schema

{
  "hook": {
    "id": 1,
    "event": "workflow_started",
    "target": "your_webhook_listener_url"
  },
  "workflow": {
    "id": 1,
    "name": "Workflow Name",
    "status": 1,
    "date_created": "2020-10-12T16:12:10.099Z",
    "template": {
      "id": 1,
      "name": "Template name"
    },
    "kickoff": {
      "id": 1,
      "description": "Kickoff description",
      "output": [
        {
          "id": 1,
          "name": "Performer",
          "type": "user",
          "api_name": "field-shdgkk",
          "value": "1",
          "is_required": true,
          "selections": [],
          "attachments": []
        },
        {
          "id": 2,
          "name": "Label",
          "type": "radiobutton",
          "api_name": "field-asdsfd",
          "value": null,
          "is_required": true,
          "selections": [
            {
              "id": 1,
              "value": "First Selection",
              "is_selected": false
            },
            {
              "id": 2,
              "value": "Second Selection",
              "is_selected": true
            }
          ],
          "attachments": []
        },
        {
          "id": 3,
          "name": "File",
          "type": "file",
          "api_name": "field-cvkjbk",
          "value": null,
          "is_required": true,
          "selections": [],
          "attachments": [
            {
              "id": 1,
              "name": "filename.png",
              "url": "https://fake-url.com"
            }
          ]
        }
      ]
    },
    "current_task": {
      "id": 2,
      "name": "Second task",
      "description": "Task description",
      "number": 2,
      "date_started": "2020-10-12T16:25:00.062Z",
      "date_completed": "2020-10-12T16:25:58.675Z",
      "performers": [
        {
          "id": 2,
          "first_name": "John Jr.",
          "last_name": "Doe"
        }
      ]
    }
  }
}

event: workflow_started

Available workflow statuses:

Workflow Completed Webhook Event Schema

event: workflow_completed

See Workflow Started Webhook Event Schema