Cursion DocsCursion Docs
Home
Dashboard
Home
Dashboard
  • Guides

    • Account
    • Billing
    • Selfhost
    • App
    • API
    • CLI
  • API

    • Site
    • Page
    • Scan
    • Test
    • Case
    • CaseRun
    • Flow
    • FlowRun
    • Issue
    • Schedule
    • Alert
    • Report
  • CLI

    • Site
    • Page
    • Scan
    • Test
    • Case
    • Flow

Flow

A Flow is used to store a list of steps, called nodes which are utilized by the FlowRun object during a run. There are two primary components for a flow: Each node contains data specific to the job for that step (i.e. Scan, Case, Slack Alert, etc)

ComponentDescription
nodesa list of objects with instructions specific to that step (i.e. Scan, Slack Alert, etc)
edgesa list of objects describing the flow's direction of operation and relationship between nodes

Flow object

{
    "id": "cc5a0ede-1aff-4eff-8040-9f4c0783f043",
    "user": "dev@example.com",
    "account": "8d4075a8-5ba0-48c9-9735-b989595edad5",
    "time_created": "2024-11-15T17:41:21.464269Z",
    "title": "Dual Step Flow",
    "nodes": [
        {
            "id": "1",
            "data": {
                "id": "1",
                "uri": "",
                "type": [
                    "html",
                    "logs",
                    "lighthouse",
                    "yellowlab",
                    "vrt"
                ],
                "email": "",
                "case_id": null,
                "configs": {
                    "device": "Windows 10 PC",
                    "browser": "chrome",
                    "timeout": 300,
                    "interval": 1,
                    "location": "us",
                    "mask_ids": "",
                    "auto_height": true,
                    "end_on_fail": true,
                    "window_size": "1920,1080",
                    "create_issue": true,
                    "max_wait_time": 30,
                    "min_wait_time": 3,
                    "disable_animations": false
                },
                "headers": "{}",
                "message": "",
                "payload": "{}",
                "subject": "",
                "updates": null,
                "maxConds": 4,
                "maxNodes": 12,
                "parentId": null,
                "position": {
                    "x": 0,
                    "y": 0
                },
                "start_if": null,
                "task_type": "scan",
                "threshold": 95,
                "conditions": null,
                "phone_number": "",
                "request_type": "GET"
            },
            "type": "basic",
            "measured": {
                "width": 272,
                "height": 48
            },
            "parentId": null,
            "position": {
                "x": 0,
                "y": 0
            }
        },
        {
            "id": "2",
            "position": {
                "x": 0,
                "y": 150
            },
            "type": "basic",
            "parentId": "1",
            "data": {
                "id": "2",
                "position": {
                    "x": 0,
                    "y": 150
                },
                "parentId": "1",
                "task_type": "slack",
                "configs": {
                    "device": "Windows 10 PC",
                    "browser": "chrome",
                    "timeout": 300,
                    "interval": 1,
                    "location": "us",
                    "mask_ids": null,
                    "auto_height": true,
                    "end_on_fail": true,
                    "window_size": "1920,1080",
                    "create_issue": true,
                    "max_wait_time": 30,
                    "min_wait_time": 3,
                    "disable_animations": false
                },
                "conditions": null,
                "start_if": null,
                "maxNodes": 12,
                "maxConds": 4,
                "type": [
                    "html",
                    "logs",
                    "lighthouse",
                    "yellowlab",
                    "vrt"
                ],
                "case_id": null,
                "updates": null,
                "threshold": 95,
                "phone_number": "",
                "email": "",
                "uri": "",
                "request_type": "GET",
                "subject": "",
                "message": "This is a test message",
                "payload": "{}",
                "headers": "{}"
            },
            "measured": {
                "width": 272,
                "height": 48
            }
        }
    ],
    "edges": [
        {
            "id": "1",
            "target": "2",
            "source": "1",
            "type": "smoothstep"
        }
    ],
    "time_last_run": null
}

Retrieve a Flow

This endpoint returns a single Flow object and is useful as a simple "detailed view" of the flow.

GET - /flow/<flow:id>

import requests, os

# import env vars
CURSION_API_BASE_URL = os.environ.get('CURSION_API_BASE_URL')
CURSION_API_TOKEN = os.environ.get('CURSION_API_TOKEN')

# setup configs
url = f'{BASE_URL}/flow/<flow:id>'
headers = {
    "content-type": "application/json",
    "Authorization" : CURSION_API_TOKEN
}

# send the request
res = requests.get(
    url=url,
    headers=headers,
)

# retrieve response data
json_response = res.json()
print(json_response)

View Full Output
{
    "id": "cc5a0ede-1aff-4eff-8040-9f4c0783f043",
    "user": "dev@example.com",
    "account": "8d4075a8-5ba0-48c9-9735-b989595edad5",
    "time_created": "2024-11-15T17:41:21.464269Z",
    "title": "Dual Step Flow",
    "nodes": [
        {
            "id": "1",
            "data": {
                "id": "1",
                "uri": "",
                "type": [
                    "html",
                    "logs",
                    "lighthouse",
                    "yellowlab",
                    "vrt"
                ],
                "email": "",
                "case_id": null,
                "configs": {
                    "device": "Windows 10 PC",
                    "browser": "chrome",
                    "timeout": 300,
                    "interval": 1,
                    "location": "us",
                    "mask_ids": "",
                    "auto_height": true,
                    "end_on_fail": true,
                    "window_size": "1920,1080",
                    "create_issue": true,
                    "max_wait_time": 30,
                    "min_wait_time": 3,
                    "disable_animations": false
                },
                "headers": "{}",
                "message": "",
                "payload": "{}",
                "subject": "",
                "updates": null,
                "maxConds": 4,
                "maxNodes": 12,
                "parentId": null,
                "position": {
                    "x": 0,
                    "y": 0
                },
                "start_if": null,
                "task_type": "scan",
                "threshold": 95,
                "conditions": null,
                "phone_number": "",
                "request_type": "GET"
            },
            "type": "basic",
            "measured": {
                "width": 272,
                "height": 48
            },
            "parentId": null,
            "position": {
                "x": 0,
                "y": 0
            }
        },
        {
            "id": "2",
            "position": {
                "x": 0,
                "y": 150
            },
            "type": "basic",
            "parentId": "1",
            "data": {
                "id": "2",
                "position": {
                    "x": 0,
                    "y": 150
                },
                "parentId": "1",
                "task_type": "slack",
                "configs": {
                    "device": "Windows 10 PC",
                    "browser": "chrome",
                    "timeout": 300,
                    "interval": 1,
                    "location": "us",
                    "mask_ids": null,
                    "auto_height": true,
                    "end_on_fail": true,
                    "window_size": "1920,1080",
                    "create_issue": true,
                    "max_wait_time": 30,
                    "min_wait_time": 3,
                    "disable_animations": false
                },
                "conditions": null,
                "start_if": null,
                "maxNodes": 12,
                "maxConds": 4,
                "type": [
                    "html",
                    "logs",
                    "lighthouse",
                    "yellowlab",
                    "vrt"
                ],
                "case_id": null,
                "updates": null,
                "threshold": 95,
                "phone_number": "",
                "email": "",
                "uri": "",
                "request_type": "GET",
                "subject": "",
                "message": "This is a test message",
                "payload": "{}",
                "headers": "{}"
            },
            "measured": {
                "width": 272,
                "height": 48
            }
        }
    ],
    "edges": [
        {
            "id": "1",
            "target": "2",
            "source": "1",
            "type": "smoothstep"
        }
    ],
    "time_last_run": null
}

Retrieve many Flows

This endpoint returns a paginated response with all Flows objects filtered by your account and ordered by time_created. This endpoint is useful when needing to displaying your flows in a table view for example. The limit parameter specifies the total number of objects you want returned per "group" (we recommend keeping this under 10 for best performance). The offset parameter specfies which "group" to return. For example, limit=10&offset=10 in a total dataset of 30 objects would return 10 flows in range flow #10 - flow #20.

GET - /flow?limit=10&offset=0

import requests, os

# import env vars
CURSION_API_BASE_URL = os.environ.get('CURSION_API_BASE_URL')
CURSION_API_TOKEN = os.environ.get('CURSION_API_TOKEN')

# setup configs
url = f'{BASE_URL}/flow?limit=10&offset=0'
headers = {
    "content-type": "application/json",
    "Authorization" : CURSION_API_TOKEN
}

# send the request
res = requests.get(
    url=url,
    headers=headers,
)

# retrieve response data
json_response = res.json()
print(json_response)

View Full Output
{
   "count":30,
   "next":"https://api.cursion.dev/v1/ops/flow?limit=10&offset=20",
   "previous":"https://api.cursion.dev/v1/ops/flow?limit=10&offset=10", 
   "results":[
         {
            "id": "cc5a0ede-1aff-4eff-8040-9f4c0783f043",
            "user": "dev@example.com",
            "account": "8d4075a8-5ba0-48c9-9735-b989595edad5",
            "time_created": "2024-11-15T17:41:21.464269Z",
            "title": "Dual Step Flow",
            "nodes": [
               {
                     "id": "1",
                     "data": {
                        "id": "1",
                        "uri": "",
                        "type": [
                           "html",
                           "logs",
                           "lighthouse",
                           "yellowlab",
                           "vrt"
                        ],
                        "email": "",
                        "case_id": null,
                        "configs": {
                           "device": "Windows 10 PC",
                           "browser": "chrome",
                           "timeout": 300,
                           "interval": 1,
                           "location": "us",
                           "mask_ids": "",
                           "auto_height": true,
                           "end_on_fail": true,
                           "window_size": "1920,1080",
                           "create_issue": true,
                           "max_wait_time": 30,
                           "min_wait_time": 3,
                           "disable_animations": false
                        },
                        "headers": "{}",
                        "message": "",
                        "payload": "{}",
                        "subject": "",
                        "updates": null,
                        "maxConds": 4,
                        "maxNodes": 12,
                        "parentId": null,
                        "position": {
                           "x": 0,
                           "y": 0
                        },
                        "start_if": null,
                        "task_type": "scan",
                        "threshold": 95,
                        "conditions": null,
                        "phone_number": "",
                        "request_type": "GET"
                     },
                     "type": "basic",
                     "measured": {
                        "width": 272,
                        "height": 48
                     },
                     "parentId": null,
                     "position": {
                        "x": 0,
                        "y": 0
                     }
               },
               {
                     "id": "2",
                     "position": {
                        "x": 0,
                        "y": 150
                     },
                     "type": "basic",
                     "parentId": "1",
                     "data": {
                        "id": "2",
                        "position": {
                           "x": 0,
                           "y": 150
                        },
                        "parentId": "1",
                        "task_type": "slack",
                        "configs": {
                           "device": "Windows 10 PC",
                           "browser": "chrome",
                           "timeout": 300,
                           "interval": 1,
                           "location": "us",
                           "mask_ids": null,
                           "auto_height": true,
                           "end_on_fail": true,
                           "window_size": "1920,1080",
                           "create_issue": true,
                           "max_wait_time": 30,
                           "min_wait_time": 3,
                           "disable_animations": false
                        },
                        "conditions": null,
                        "start_if": null,
                        "maxNodes": 12,
                        "maxConds": 4,
                        "type": [
                           "html",
                           "logs",
                           "lighthouse",
                           "yellowlab",
                           "vrt"
                        ],
                        "case_id": null,
                        "updates": null,
                        "threshold": 95,
                        "phone_number": "",
                        "email": "",
                        "uri": "",
                        "request_type": "GET",
                        "subject": "",
                        "message": "This is a test message",
                        "payload": "{}",
                        "headers": "{}"
                     },
                     "measured": {
                        "width": 272,
                        "height": 48
                     }
               }
            ],
            "edges": [
               {
                     "id": "1",
                     "target": "2",
                     "source": "1",
                     "type": "smoothstep"
               }
            ],
            "time_last_run": null
         },
            
      ### SHORTENED FOR DISPLAY PURPOSES ###
      
   ]
}

Delete a Flow

Caution

Please use caution with this endpoint as it is irreversible.

DELETE - /flow/<flow:id>

import requests, os

# import env vars
CURSION_API_BASE_URL = os.environ.get('CURSION_API_BASE_URL')
CURSION_API_TOKEN = os.environ.get('CURSION_API_TOKEN')

# setup configs
url = f'{BASE_URL}/flow/<flow:id>'
headers = {
    "content-type": "application/json",
    "Authorization" : CURSION_API_TOKEN
}

# send the request
res = requests.delete(
    url=url, 
    headers=headers, 
)

# retrieve response data
json_response = res.json()
print(json_response)

View Full Output
{
   "message": "flow deleted successfully"
}

Last Updated:
Contributors: Landon
Prev
CaseRun
Next
FlowRun