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 request 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 request 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 request 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 request 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 = {
  "name":"workflow_name - optional",
  "due_date_tsp":"timestamp due date(optional)",
  "ancestor_task_id":"int|nill - the id of the parent task if launching as an embedded workflow",
  "is_urgent":"bool - set to true if the new workflow is to be marked as urgent",
  "kickoff": { // nullable
    "string-field-1": "Value 1",
    "text-field-2": "Value 2",
    "dropdown-field-3": "selection api_name",
    "checkbox-field-4":["selection api_name", ...],
    "radio-field-5": "selection api_name",
    "date-field-6": "date in the DD/MM/YYYY 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 request returns JSON structured like this:

{
  "workflow_id": 1,
  "first_task_performers":[int]
}

This endpoint launches a new workflow based on specific template. The first_task_performers response parameter contains the ids of the performers assigned to the first task.

HTTP Request

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

URL Parameters

Parameter Description
ID The ID of the template to launch the workflow from

Body Parameters

Parameter Required Description
name No The name of the workflow you'd like to launch. If no name is supplied the default name 'current date - template name' will be used
is_urgent No The default value is false, the parameter determines whether the new workflow will be marked as urgent.
ancestor_task_id No Supply this parameter if you want the new workflow to be embedded in an existing task.
due_date_tsp No Supply this parameter if you want to set the due date for the workflow as a timestamp.
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 request 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 request 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 request 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 request returns JSON structured as follows:

{
  "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
ordering the field to order by.
type filter by user type.
status user status.
groups filter by group.
limit Use for pagination.
offset Use for pagination.

Odering specifies the field the results are ordered by, several values can be passed in separated by a comma. Use a '-' to invert the order. Possible fields users can be ordered by:

The type parameter lets you filter users by user type. Several comma separated values can be passed in to get several types of users in the response. The available values are:

The status parameter filters users by status. Several comma separated values can be passed in to get users with severeal different statuses. The available values are:

The groups parameter lets you to only select users that belong to a specific group identified by its id. Several group ids can be passed in as a comma separated list.

The limit parameter limits the number of user records returned per page. The offset parameter tells the API which page to start with.

Response options

200 means the reqeuest has been processed successfully return a response in the format show above.

400 means there was a validation error

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 request 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 request 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 request 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 request will ubsubscibe you from the event_name event: If successfuly request 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 request will subscribe you to all events at once: The request 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 request will cancel all your subscriptions at once. All the urls for all the events will have been wiped. The request 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