Internal use only!
A workflow is a series of steps executed in a specific order to complete a task. The steps in a workflow are of different types, from user messages to AI prompts and app integration actions. A workflow is a blueprint of steps to be taken. To perform useful work, a workflow must be executed. The execution of a workflow may take up to a year to reach completion.
Use Cases
- Workflows are foundational to an AI agent's ability to think and plan. When an AI agent thinks or plans, it is creating a workflow to help it achieve the task at hand.
- Workflow makes agent-human collaboration possible by including steps that require human intervention. For instance, human confirmation may be needed to complete an AI-driven checkout process on an e-commerce platform.
- The transition of a workflow from one step to another is autonomous. Consequently, businesses can leverage workflows to automate business processes. For instance, a business may leverage a workflow to automate the generation of monthly reports or the dispatching of reminders every morning.
- Todo apps and similar apps can also leverage workflows to transform from dumb lists to smart personal assistants.
Create Workflow
POST /api/workflowscurl https://management-api.useproteus.ai/api/workflows \
-X POST \
-H "Authorization: Bearer user-3a4d80a9c3cca7ffd1bc341f.ede04d00e4b168bed35d9fcde8c2f92f.00d7fecf89201691f94b01e5b294da65.e7ea4c191b2c9a059ce5658deb7349c26a931ed8b7a04bf0" \
-d '{
"name": "Onboarding Checklist",
"description": "This workflow runs during the onboarding of a user",
"inputsSchema": {
"type": "object",
"properties": {
"assignee": {
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "The name of the assignee"
},
"email": {
"type": "string",
"description": "The email of the assignee"
}
}
},
"created_by": {
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "The name of the user who created the checklist"
},
"email": {
"type": "string",
"description": "The email of the user who created the checklist"
}
}
}
},
"required": [ "assignee" ]
},
"orgId": "6816330b6f46b5afc080fbf7"
}'You can also create workflows via the orgs API POST: /api/orgs/:orgId/workflows. You will not be able to supply an orgId field in the request body.
curl https://management-api.useproteus.ai/api/orgs/6816330b6f46b5afc080fbf7/workflows \
-X POST \
-H "Authorization: Bearer user-3a4d80a9c3cca7ffd1bc341f.ede04d00e4b168bed35d9fcde8c2f92f.00d7fecf89201691f94b01e5b294da65.e7ea4c191b2c9a059ce5658deb7349c26a931ed8b7a04bf0" \
-d '{
"name": "Onboarding Checklist",
"description": "This workflow runs during the onboarding of a user",
"inputsSchema": {
"type": "object",
"properties": {
"assignee": {
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "The name of the assignee"
},
"email": {
"type": "string",
"description": "The email of the assignee"
}
}
},
"created_by": {
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "The name of the user who created the checklist"
},
"email": {
"type": "string",
"description": "The email of the user who created the checklist"
}
}
}
},
"required": [ "assignee" ]
}
}'Get Workflow
GET /api/workflows/:workflowIdThis endpoint returns a workflow.
curl https://management-api.useproteus.ai/api/workflows/686fe2f7e793712ff1dd876d \
-H "Authorization: Bearer user-3a4d80a9c3cca7ffd1bc341f.ede04d00e4b168bed35d9fcde8c2f92f.00d7fecf89201691f94b01e5b294da65.e7ea4c191b2c9a059ce5658deb7349c26a931ed8b7a04bf0"You have to be a member of an organization to view a workflow in that organization.
Edit Workflow
PUT /api/workflows/:workflowIdThis endpoint updates a workflow. The current user must be a member of the org with a role of MEMBER or OWNER, or the request must be made with a token having WORKFLOW_WRITE permission.
curl https://management-api.useproteus.ai/api/workflows/686fe2f7e793712ff1dd876d \
-X PUT \
-H "Authorization: Bearer user-3a4d80a9c3cca7ffd1bc341f.ede04d00e4b168bed35d9fcde8c2f92f.00d7fecf89201691f94b01e5b294da65.e7ea4c191b2c9a059ce5658deb7349c26a931ed8b7a04bf0" \
-d '{
"name": "Employee Onboarding Workflow",
"description": "Updated workflow for onboarding new employees"
}'List Org Workflows
GET /api/orgs/:orgId/workflowsThis endpoint fetches the workflows in an organization.
curl https://management-api.useproteus.ai/api/orgs/6816330b6f46b5afc080fbf7/workflows \
-H "Authorization: Bearer user-3a4d80a9c3cca7ffd1bc341f.ede04d00e4b168bed35d9fcde8c2f92f.00d7fecf89201691f94b01e5b294da65.e7ea4c191b2c9a059ce5658deb7349c26a931ed8b7a04bf0"If the current user is not a member of this organization, an error response is returned.
curl https://management-api.useproteus.ai/api/orgs/6816330b6f46b5afc080fbf7/workflows \
-H "Authorization: Bearer user-73dd22b0c07a542d080d48a2.9e0ac60c1472a5f2949f8978e82d2582.dfbaf5a25782b0608e173d295e977259.2a52f18cf2ce3d84872ae7fc73c60822ad6fe0ad7dc21f58"Add Event Handler to Workflow
POST /api/workflows/:workflowId/event-handlersThis endpoint adds a plugin instance as an event handler for a workflow. The response of the API is the plugin instance.
An event handler is a plugin instance that listens for workflow events. These event handlers may also receive tokens that allow them to read or update the workflows to which they are attached.
Let's create a event handler plugin for our use cases.
curl https://management-api.useproteus.ai/api/orgs/6816330b6f46b5afc080fbf7/plugins \
-X POST \
-H "Authorization: Bearer user-3a4d80a9c3cca7ffd1bc341f.ede04d00e4b168bed35d9fcde8c2f92f.00d7fecf89201691f94b01e5b294da65.e7ea4c191b2c9a059ce5658deb7349c26a931ed8b7a04bf0" \
-d '{
"name": "Workflow Events Processor",
"description": "This plugin processes workflow events",
"events": [
"WORKFLOW_EXECUTION_STARTED",
"WORKFLOW_EXECUTION_COMPLETED",
"WORKFLOW_STEP_CREATED",
"WORKFLOW_STEP_EXECUTION_SCHEDULED",
"WORKFLOW_STEP_EXECUTION_STARTED",
"WORKFLOW_STEP_EXECUTION_COMPLETED",
"WORKFLOW_STEP_EXECUTION_REMINDER"
],
"isPublic": true,
"scopes": ["WORKFLOW_WRITE"],
"tags": ["workflow", "checklist", "task", "reminders"],
"type": "WORKFLOW_EVENT_HANDLER",
"webhookUrl": "https://myplugins.com/workflow-event-handlers/default-handler/webhook"
}'Remember to verify your plugin's webhook.
curl https://management-api.useproteus.ai/api/plugins/68720400d3b7d6b2ea45fd69/verify-webhook \
-X POST \
-H "Authorization: Bearer user-3a4d80a9c3cca7ffd1bc341f.ede04d00e4b168bed35d9fcde8c2f92f.00d7fecf89201691f94b01e5b294da65.e7ea4c191b2c9a059ce5658deb7349c26a931ed8b7a04bf0"Now, we add the plugin as an event handler for the workflow.
curl https://management-api.useproteus.ai/api/workflows/686fe2f7e793712ff1dd876d/event-handlers \
-X POST \
-H "Authorization: Bearer user-3a4d80a9c3cca7ffd1bc341f.ede04d00e4b168bed35d9fcde8c2f92f.00d7fecf89201691f94b01e5b294da65.e7ea4c191b2c9a059ce5658deb7349c26a931ed8b7a04bf0" \
-d '{
"name": "Workflow Event Handler",
"pluginId": "68720400d3b7d6b2ea45fd69",
"events": [
"WORKFLOW_EXECUTION_STARTED",
"WORKFLOW_EXECUTION_COMPLETED",
"WORKFLOW_STEP_CREATED",
"WORKFLOW_STEP_EXECUTION_SCHEDULED",
"WORKFLOW_STEP_EXECUTION_STARTED",
"WORKFLOW_STEP_EXECUTION_COMPLETED",
"WORKFLOW_STEP_EXECUTION_REMINDER"
],
"scopes": ["WORKFLOW_WRITE"]
}'This API call dispatches the PLUGIN_INSTALLED event to the webhook of the plugin as a HTTP POST request.
Execute a Workflow
POST /api/workflows/:workflowId/executionsThis endpoint executes a workflow. This creates an object of type WorkflowExecution which represents a specific execution of a workflow.
Creating a workflow is like defining a function in typical programming languages. Executing a workflow is like calling a function at runtime.
Continuing with that analogy, workflows can be created with inputsSchema just like functions can be defined with input parameters. To execute a
workflow with inputsSchema, you need to supply an inputs field that can be validated against the inputsSchema.
Executing a workflow without the expected inputs field results in an error response.
curl https://management-api.useproteus.ai/api/workflows/686fe2f7e793712ff1dd876d/executions \
-X POST \
-H "Authorization: Bearer user-3a4d80a9c3cca7ffd1bc341f.ede04d00e4b168bed35d9fcde8c2f92f.00d7fecf89201691f94b01e5b294da65.e7ea4c191b2c9a059ce5658deb7349c26a931ed8b7a04bf0"curl https://management-api.useproteus.ai/api/workflows/686fe2f7e793712ff1dd876d/executions \
-X POST \
-H "Authorization: Bearer user-3a4d80a9c3cca7ffd1bc341f.ede04d00e4b168bed35d9fcde8c2f92f.00d7fecf89201691f94b01e5b294da65.e7ea4c191b2c9a059ce5658deb7349c26a931ed8b7a04bf0" \
-d '{
"inputs": {
"created_by": {
"name": "Jane Doe",
"email": "jane.doe@email.com"
}
}
}'Executing a workflow with the expected inputs field results in a WorkflowExecution being created.
curl https://management-api.useproteus.ai/api/workflows/686fe2f7e793712ff1dd876d/executions \
-X POST \
-H "Authorization: Bearer user-3a4d80a9c3cca7ffd1bc341f.ede04d00e4b168bed35d9fcde8c2f92f.00d7fecf89201691f94b01e5b294da65.e7ea4c191b2c9a059ce5658deb7349c26a931ed8b7a04bf0" \
-d '{
"inputs": {
"assignee": {
"name": "John Doe",
"email": "john.doe@email.com"
},
"created_by": {
"name": "Jane Doe",
"email": "jane.doe@email.com"
}
}
}'From the response above, certain things are worth noting.
- Every workflow execution has a
contextobject which contains, amongst other things, theinputswith which the workflow execution was created. Thiscontextobject can be accessed programmatically, as will be shown later in this document. - The
statusof the workflow execution isCOMPLETED. This is because the workflow that was executed has nosteps. Consequently, the execution is completed shortly after it is started.
When a workflow is successfully executed, the WORKFLOW_EXECUTION_STARTED event is dispatched. The status of the
workflow execution is RUNNING at this time.
If the workflow has no steps, the workflow execution terminates. The WORKFLOW_EXECUTION_COMPLETED event is dispatched. The status of the
workflow execution becomes COMPLETED.
Workflow events are dispatched to the webhooks of the plugins installed as the workflow event handlers and to agents that are attached to the workflow.
Add Step to Workflow
POST /api/workflows/:workflowId/stepsA workflow without steps is like an empty function; it's not very useful. A typical workflow has at least one step, with a step clearly marked as the starting point or first step.
A step represents a unit of work that needs to be done. There are different types of steps.
It's possible to create a workflow's steps at the same time the workflow is being created.
curl https://management-api.useproteus.ai/api/workflows \
-X POST \
-H "Authorization: Bearer user-3a4d80a9c3cca7ffd1bc341f.ede04d00e4b168bed35d9fcde8c2f92f.00d7fecf89201691f94b01e5b294da65.e7ea4c191b2c9a059ce5658deb7349c26a931ed8b7a04bf0" \
-d '{
"name": "Onboarding Checklist",
"description": "This workflow runs during the onboarding of a user",
"inputsSchema": {
"type": "object",
"properties": {
"assignee": {
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "The name of the assignee"
},
"email": {
"type": "string",
"description": "The email of the assignee"
}
}
},
"created_by": {
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "The name of the user who created the checklist"
},
"email": {
"type": "string",
"description": "The email of the user who created the checklist"
}
}
}
},
"required": [ "assignee" ]
},
"orgId": "6816330b6f46b5afc080fbf7",
"steps": [{
"name": "introduction",
"description": "The assignee introduces themselves",
"type": "USER_MESSAGE",
"inputsTemplate": {
"message": "Hi {{inputs.assignee.name}}, please introduce yourself in the #general channel on Slack"
}
}, {
"name": "signature",
"description": "The assignee signs the relevant docs",
"type": "USER_MESSAGE",
"inputsTemplate": {
"message": "Hi {{inputs.assignee.name}}, please sign all the relevant docs"
}
}]
}'A step can also be added to an existing workflow.
curl https://management-api.useproteus.ai/api/workflows/686fe2f7e793712ff1dd876d/steps \
-X POST \
-H "Authorization: Bearer user-3a4d80a9c3cca7ffd1bc341f.ede04d00e4b168bed35d9fcde8c2f92f.00d7fecf89201691f94b01e5b294da65.e7ea4c191b2c9a059ce5658deb7349c26a931ed8b7a04bf0" \
-d '{
"name": "worktools",
"description": "The assignee collects their work tools",
"type": "USER_MESSAGE",
"inputsTemplate": {
"message": "Hi {{inputs.assignee.name}}, reach out to the Ops team for your official work tools"
}
}'Adding a step to a workflow dispatches the WORKFLOW_STEP_CREATED event.
List Steps in Workflow
GET /api/workflows/:workflowId/stepsThis endpoint fetches the steps in a workflow.
curl https://management-api.useproteus.ai/api/workflows/686fe2f7e793712ff1dd876d/steps \
-H "Authorization: Bearer user-3a4d80a9c3cca7ffd1bc341f.ede04d00e4b168bed35d9fcde8c2f92f.00d7fecf89201691f94b01e5b294da65.e7ea4c191b2c9a059ce5658deb7349c26a931ed8b7a04bf0"From the response above, certain things are worth noting.
- Only the first step added to the workflow has the field
isFirstStepset to true. - The
nextIdof each step tells you the next step to be executed. - There is no need to explicitly specify
isFirstStepornextIdwhen creating a step.
Edit Workflow Step by ID
PUT /api/workflows/steps/:workflowStepIdThis endpoint updates a workflow step using its unique step ID. The current user must be a member of the org with a role of MEMBER or OWNER, or the request must be made with a token having WORKFLOW_WRITE permission.
curl https://management-api.useproteus.ai/api/workflows/steps/6872d4307a58be780bfc9bd8 \
-X PUT \
-H "Authorization: Bearer user-3a4d80a9c3cca7ffd1bc341f.ede04d00e4b168bed35d9fcde8c2f92f.00d7fecf89201691f94b01e5b294da65.e7ea4c191b2c9a059ce5658deb7349c26a931ed8b7a04bf0" \
-d '{
"description": "Updated: The assignee introduces themselves to the team",
"inputsTemplate": {
"message": "Hi {{inputs.assignee.name}}, please introduce yourself in the #general channel on Slack and share your background"
}
}'Edit Workflow Step by Name
PUT /api/workflows/:workflowId/steps?stepName=<stepName>This endpoint updates a workflow step using its name within a specific workflow. The current user must be a member of the org with a role of MEMBER or OWNER, or the request must be made with a token having WORKFLOW_WRITE permission.
curl "https://management-api.useproteus.ai/api/workflows/686fe2f7e793712ff1dd876d/steps?stepName=introduction" \
-X PUT \
-H "Authorization: Bearer user-3a4d80a9c3cca7ffd1bc341f.ede04d00e4b168bed35d9fcde8c2f92f.00d7fecf89201691f94b01e5b294da65.e7ea4c191b2c9a059ce5658deb7349c26a931ed8b7a04bf0" \
-d '{
"description": "Updated: The assignee introduces themselves to the team",
"startDate": "2025-07-15T09:00:00.000Z",
"endDate": "2025-07-15T17:00:00.000Z"
}'Both edit endpoints support updating the following fields:
- Basic properties:
name,description,type,target - Execution details:
inputsTemplate,outputsSchema - Scheduling:
startDate,endDate - Flow control:
nextId,secondaryNextId,tertiaryNextId,errorNextId,isFirstStep
Execute a Workflow with Steps
POST /api/workflows/:workflowId/executionsNow that the workflow has some steps, it can be executed in order to observe how it transitions from one step to another.
curl https://management-api.useproteus.ai/api/workflows/686fe2f7e793712ff1dd876d/executions \
-X POST \
-H "Authorization: Bearer user-3a4d80a9c3cca7ffd1bc341f.ede04d00e4b168bed35d9fcde8c2f92f.00d7fecf89201691f94b01e5b294da65.e7ea4c191b2c9a059ce5658deb7349c26a931ed8b7a04bf0" \
-d '{
"inputs": {
"assignee": {
"name": "John Doe",
"email": "john.doe@email.com"
},
"created_by": {
"name": "Jane Doe",
"email": "jane.doe@email.com"
}
}
}'The status of the workflow execution is RUNNING. This is because the workflow that was executed has some steps that need to be processed before the workflow execution can be completed.
When a workflow is successfully executed, the WORKFLOW_EXECUTION_STARTED event is dispatched.
When the execution of a step is started, the WORKFLOW_STEP_EXECUTION_STARTED event is dispatched.
Get Workflow Execution
GET /api/workflows/executions/:workflowExecutionIdThis endpoint returns a workflow execution.
curl https://management-api.useproteus.ai/api/workflows/executions/687371ff828ee21b2bfafec2 \
-H "Authorization: Bearer user-3a4d80a9c3cca7ffd1bc341f.ede04d00e4b168bed35d9fcde8c2f92f.00d7fecf89201691f94b01e5b294da65.e7ea4c191b2c9a059ce5658deb7349c26a931ed8b7a04bf0"From the response above, notice how context.steps now contains the inputs with which the step name introduction was executed.
Also, the pointer points to the id of the current workflow step being processed.
A workflow execution may take as long as a year to reach completion. However, it is advised that workflow executions reach completion in less than a year. Workflow executions may be automatically deleted one year after they are created.
Get Workflow Execution Stack
GET /api/workflows/executions/:workflowExecutionId/stackThis endpoint returns the stack of a workflow execution. The stack is an array of WorkflowStepExecution objects showing the flow of execution.
curl https://management-api.useproteus.ai/api/workflows/executions/687371ff828ee21b2bfafec2/stack \
-H "Authorization: Bearer user-3a4d80a9c3cca7ffd1bc341f.ede04d00e4b168bed35d9fcde8c2f92f.00d7fecf89201691f94b01e5b294da65.e7ea4c191b2c9a059ce5658deb7349c26a931ed8b7a04bf0"Get Workflow Execution Logs
GET /api/workflows/executions/:workflowExecutionId/logsThis endpoint returns the logs of a workflow execution. This is an array of WorkflowLog objects for the current workflow execution.
curl https://management-api.useproteus.ai/api/workflows/executions/687371ff828ee21b2bfafec2/logs \
-H "Authorization: Bearer user-3a4d80a9c3cca7ffd1bc341f.ede04d00e4b168bed35d9fcde8c2f92f.00d7fecf89201691f94b01e5b294da65.e7ea4c191b2c9a059ce5658deb7349c26a931ed8b7a04bf0"Complete a Step Execution
POST /api/workflows/executions/:workflowExecutionId/complete-stepThis endpoint completes the execution of a workflow step. This operation advances the workflow execution to the next step or completes it if there is no subsequent step.
curl https://management-api.useproteus.ai/api/workflows/executions/687371ff828ee21b2bfafec2/complete-step \
-X POST \
-H "Authorization: Bearer user-3a4d80a9c3cca7ffd1bc341f.ede04d00e4b168bed35d9fcde8c2f92f.00d7fecf89201691f94b01e5b294da65.e7ea4c191b2c9a059ce5658deb7349c26a931ed8b7a04bf0" \
-d '{
"stepName": "introduction"
}'When the execution of a step is completed, the WORKFLOW_STEP_EXECUTION_COMPLETED event is dispatched.
If there is a next step, the execution of that step is started and the WORKFLOW_STEP_EXECUTION_STARTED event is dispatched.
If you were to query the workflow execution, you'd see that its pointer has moved from the introduction step (with ID 6872d4307a58be780bfc9bd8) to the signature step (with ID 6872d4807a58be780bfc9bd9).
curl https://management-api.useproteus.ai/api/workflows/executions/687371ff828ee21b2bfafec2 \
-H "Authorization: Bearer user-3a4d80a9c3cca7ffd1bc341f.ede04d00e4b168bed35d9fcde8c2f92f.00d7fecf89201691f94b01e5b294da65.e7ea4c191b2c9a059ce5658deb7349c26a931ed8b7a04bf0"You can also take a look at the stack of the workflow execution to see the progression from the introduction step to the signature step.
curl https://management-api.useproteus.ai/api/workflows/executions/687371ff828ee21b2bfafec2/stack \
-H "Authorization: Bearer user-3a4d80a9c3cca7ffd1bc341f.ede04d00e4b168bed35d9fcde8c2f92f.00d7fecf89201691f94b01e5b294da65.e7ea4c191b2c9a059ce5658deb7349c26a931ed8b7a04bf0"Let's proceed with completing the remaining two steps in the workflow.
curl https://management-api.useproteus.ai/api/workflows/executions/687371ff828ee21b2bfafec2/complete-step \
-X POST \
-H "Authorization: Bearer user-3a4d80a9c3cca7ffd1bc341f.ede04d00e4b168bed35d9fcde8c2f92f.00d7fecf89201691f94b01e5b294da65.e7ea4c191b2c9a059ce5658deb7349c26a931ed8b7a04bf0" \
-d '{
"stepName": "signature"
}'curl https://management-api.useproteus.ai/api/workflows/executions/687371ff828ee21b2bfafec2/complete-step \
-X POST \
-H "Authorization: Bearer user-3a4d80a9c3cca7ffd1bc341f.ede04d00e4b168bed35d9fcde8c2f92f.00d7fecf89201691f94b01e5b294da65.e7ea4c191b2c9a059ce5658deb7349c26a931ed8b7a04bf0" \
-d '{
"stepName": "worktools"
}'When the execution of the last step is completed, the WORKFLOW_STEP_EXECUTION_COMPLETED event is dispatched.
Seeing that there is no next step, the execution of that workflow is completed and the WORKFLOW_EXECUTION_COMPLETED event is dispatched.
If you were to query the workflow execution, you'd see that its pointer is now null and the status of the workflow execution is now COMPLETED.
curl https://management-api.useproteus.ai/api/workflows/executions/687371ff828ee21b2bfafec2 \
-H "Authorization: Bearer user-3a4d80a9c3cca7ffd1bc341f.ede04d00e4b168bed35d9fcde8c2f92f.00d7fecf89201691f94b01e5b294da65.e7ea4c191b2c9a059ce5658deb7349c26a931ed8b7a04bf0"Workflow Triggers
Step Types
USER_MESSAGE
This step represents a message or prompt to be sent to a user. The workflow is stuck on this step until the step is explicitly marked as completed (or cancelled).
APP_INTEGRATION_ACTION
This step represents an action to be performed through an app integration plugin. App integration actions allow workflows to interact with external systems and services by invoking actions defined in app integration plugins.
Step Configuration:
target: The ID of the app integration whose action is to be called (required)inputsTemplate: Template object containing:name: The action name to be calledargs: Object containing the arguments for the action execution
Execution Flow:
- When a workflow reaches an APP_INTEGRATION_ACTION step, an
APP_INTEGRATION_ACTION_CALLevent is dispatched to the target app integration - The event includes the workflow, execution, step, and app integration data
- The app integration processes the action and calls the complete step execution endpoint
- Only the app integration that received the event can complete the step execution
Example Step:
{
"name": "send_slack_message",
"type": "APP_INTEGRATION_ACTION",
"target": "6825a9f67306f72d65708b74",
"inputsTemplate": {
"name": "send_message",
"args": {
"channel": "{{inputs.channelId}}",
"text": "Task completed: {{steps.previous_step.outputs.result}}"
}
}
}