Workflows API Reference
All API endpoints require authentication and tenant context unless otherwise noted.
Base URL: /api/v1
Workflows
List Workflows
GET /api/v1/workflows
Query Parameters:
| Parameter | Type | Description |
|---|---|---|
status |
string | Filter by status: draft, active, paused, archived |
trigger_type |
string | Filter by trigger: manual, schedule, webhook, event |
search |
string | Search by name or description |
tag |
string | Filter by tag |
sort_by |
string | Sort field (default: created_at) |
sort_dir |
string | Sort direction: asc, desc (default: desc) |
per_page |
integer | Items per page (default: 15) |
all |
boolean | Return all without pagination |
Response:
{
"success": true,
"data": [
{
"id": "uuid",
"name": "Order Confirmation",
"description": "Send confirmation email when order is created",
"status": "active",
"trigger_type": "event",
"trigger_config": {},
"settings": {},
"tags": ["orders", "email"],
"execution_count": 150,
"success_count": 145,
"failure_count": 5,
"last_executed_at": "2025-01-16T10:00:00Z",
"created_at": "2025-01-01T00:00:00Z",
"updated_at": "2025-01-15T00:00:00Z",
"nodes": [...],
"connections": [...]
}
],
"meta": {
"current_page": 1,
"last_page": 5,
"per_page": 15,
"total": 72
}
}
Create Workflow
POST /api/v1/workflows
Request Body:
{
"name": "Order Confirmation",
"description": "Send confirmation email when order is created",
"status": "draft",
"trigger_type": "event",
"trigger_config": {
"event": "order.created"
},
"settings": {
"retry_on_failure": true
},
"tags": ["orders", "email"],
"nodes": [
{
"node_type": "orders:order-created",
"node_category": "trigger",
"label": "Order Created",
"config": {},
"position": { "x": 100, "y": 100 }
},
{
"node_type": "workflows:send-email",
"node_category": "action",
"label": "Send Confirmation",
"config": {
"to": "{{customer.email}}",
"subject": "Order {{order.id}} Confirmed",
"body": "Thank you for your order!"
},
"position": { "x": 100, "y": 250 }
}
],
"connections": [
{
"source_node_index": 0,
"target_node_index": 1
}
]
}
Response:
{
"success": true,
"message": "Workflow created successfully",
"data": {
"id": "uuid",
"name": "Order Confirmation",
...
}
}
Get Workflow
GET /api/v1/workflows/{id}
Response:
{
"success": true,
"data": {
"id": "uuid",
"name": "Order Confirmation",
"description": "...",
"status": "active",
"trigger_type": "event",
"nodes": [
{
"id": "node-uuid",
"workflow_id": "uuid",
"node_type": "orders:order-created",
"node_category": "trigger",
"label": "Order Created",
"config": {},
"position": { "x": 100, "y": 100 },
"is_entry_point": true,
"retry_count": 0,
"retry_delay_seconds": 0,
"timeout_seconds": 0
}
],
"connections": [
{
"id": "conn-uuid",
"workflow_id": "uuid",
"source_node_id": "node-1-uuid",
"target_node_id": "node-2-uuid",
"source_handle": "output",
"target_handle": "input",
"condition_path": null
}
]
}
}
Update Workflow
PUT /api/v1/workflows/{id}
Request Body:
{
"name": "Updated Name",
"description": "Updated description",
"status": "active",
"nodes": [...],
"connections": [...]
}
Response:
{
"success": true,
"message": "Workflow updated successfully",
"data": { ... }
}
Delete Workflow
DELETE /api/v1/workflows/{id}
Response:
{
"success": true,
"message": "Workflow deleted successfully"
}
Activate Workflow
POST /api/v1/workflows/{id}/activate
Validates and activates a workflow. Returns validation errors if invalid.
Response (Success):
{
"success": true,
"message": "Workflow activated successfully",
"data": { ... }
}
Response (Validation Failed):
{
"success": false,
"message": "Workflow validation failed",
"errors": [
"Workflow must have at least one trigger node",
"Node 'Send Email' has no incoming connection"
]
}
Deactivate Workflow
POST /api/v1/workflows/{id}/deactivate
Pauses a workflow, preventing automatic execution.
Response:
{
"success": true,
"message": "Workflow paused successfully",
"data": { ... }
}
Duplicate Workflow
POST /api/v1/workflows/{id}/duplicate
Request Body:
{
"name": "Order Confirmation (Copy)"
}
Response:
{
"success": true,
"message": "Workflow duplicated successfully",
"data": {
"id": "new-uuid",
"name": "Order Confirmation (Copy)",
"status": "draft",
...
}
}
Execute Workflow
POST /api/v1/workflows/{id}/execute
Manually triggers workflow execution.
Request Body:
{
"data": {
"order_id": "123",
"customer_email": "john@example.com"
}
}
Response:
{
"success": true,
"message": "Workflow execution started",
"data": {
"execution_id": "exec-uuid",
"status": "pending"
}
}
Test Run Workflow
POST /api/v1/workflows/{id}/test
Executes workflow in test mode. Validates first.
Request Body:
{
"data": {
"sample": "data"
}
}
Response:
{
"success": true,
"message": "Test run completed",
"data": {
"execution_id": "exec-uuid",
"status": "completed",
"result": { ... }
}
}
Validate Workflow
GET /api/v1/workflows/{id}/validate
Response:
{
"success": true,
"valid": true,
"errors": []
}
Or with errors:
{
"success": false,
"valid": false,
"errors": [
"Workflow must have at least one trigger node",
"Node 'HTTP Request' is missing required config: url"
]
}
Export Workflow
GET /api/v1/workflows/{id}/export
Response:
{
"success": true,
"data": {
"name": "Order Confirmation",
"description": "...",
"trigger_type": "event",
"nodes": [...],
"connections": [...],
"exported_at": "2025-01-16T10:00:00Z",
"version": "1.0"
}
}
Import Workflow
POST /api/v1/workflows/import
Request Body:
{
"workflow": {
"name": "Imported Workflow",
"nodes": [...],
"connections": [...]
}
}
Response:
{
"success": true,
"message": "Workflow imported successfully",
"data": { ... }
}
Get Statistics
GET /api/v1/workflows/stats
Response:
{
"success": true,
"data": {
"total_workflows": 25,
"active_workflows": 18,
"paused_workflows": 5,
"draft_workflows": 2,
"executions_today": 150,
"executions_this_week": 1050,
"executions_this_month": 4200,
"success_rate": 96.5,
"average_duration_ms": 2340,
"most_executed": [
{ "id": "uuid", "name": "Order Confirmation", "count": 500 }
],
"recent_failures": [
{ "id": "exec-uuid", "workflow_name": "...", "error": "..." }
]
}
}
Workflow Nodes (Registry)
List All Nodes
GET /api/v1/workflow-nodes
Response:
{
"success": true,
"data": [
{
"identifier": "workflows:manual-trigger",
"name": "Manual Trigger",
"category": "trigger",
"description": "Start workflow manually",
"icon": "Play",
"color": "#22C55E",
"module": "workflows",
"inputs": [],
"outputs": [
{ "name": "output", "label": "Output", "type": "any" }
],
"configSchema": { ... },
"defaultConfig": { ... }
},
...
]
}
Get Nodes Grouped by Category
GET /api/v1/workflow-nodes/grouped
Response:
{
"success": true,
"data": [
{
"category": "trigger",
"label": "Triggers",
"icon": "Zap",
"color": "#22C55E",
"description": "Start your workflow with these events",
"nodes": [
{ "identifier": "workflows:manual-trigger", ... },
{ "identifier": "workflows:schedule-trigger", ... },
{ "identifier": "orders:order-created", ... }
]
},
{
"category": "action",
"label": "Actions",
"icon": "Play",
"color": "#3B82F6",
"nodes": [...]
}
]
}
Get Categories
GET /api/v1/workflow-nodes/categories
Response:
{
"success": true,
"data": {
"trigger": {
"label": "Triggers",
"icon": "Zap",
"color": "#22C55E",
"description": "Start your workflow with these events"
},
"action": { ... },
"condition": { ... },
"transformer": { ... }
}
}
Get Single Node
GET /api/v1/workflow-nodes/{identifier}
Example: GET /api/v1/workflow-nodes/workflows:send-email
Response:
{
"success": true,
"data": {
"identifier": "workflows:send-email",
"name": "Send Email",
"category": "action",
"description": "Send an email to recipients",
"icon": "Mail",
"color": "#3B82F6",
"module": "workflows",
"inputs": [
{ "name": "input", "label": "Input", "type": "any", "required": true }
],
"outputs": [
{ "name": "output", "label": "Output", "type": "object" }
],
"configSchema": {
"type": "object",
"properties": {
"to": { "type": "string", "title": "To" },
"subject": { "type": "string", "title": "Subject" },
"body": { "type": "string", "title": "Body", "format": "textarea" },
"bodyType": { "type": "string", "enum": ["text", "html"] }
},
"required": ["to", "subject", "body"]
},
"defaultConfig": {
"bodyType": "text"
}
}
}
Validate Node Config
POST /api/v1/workflow-nodes/{identifier}/validate
Request Body:
{
"config": {
"to": "{{customer.email}}",
"subject": "Order Confirmation"
}
}
Response:
{
"success": false,
"valid": false,
"errors": [
"Body is required"
]
}
Check Node Connection
POST /api/v1/workflow-nodes/can-connect
Request Body:
{
"source": "workflows:send-email",
"target": "workflows:if-else"
}
Response:
{
"success": true,
"can_connect": true
}
Executions
List Executions
GET /api/v1/workflow-executions
Query Parameters:
| Parameter | Type | Description |
|---|---|---|
workflow_id |
uuid | Filter by workflow |
status |
string | Filter by status |
trigger_type |
string | Filter by trigger type |
from |
date | From date |
to |
date | To date |
per_page |
integer | Items per page |
Response:
{
"success": true,
"data": [
{
"id": "exec-uuid",
"workflow_id": "uuid",
"workflow_name": "Order Confirmation",
"status": "completed",
"trigger_type": "event",
"trigger_data": { ... },
"triggered_by": "user-uuid",
"result": { ... },
"error_message": null,
"nodes_total": 5,
"nodes_executed": 5,
"nodes_failed": 0,
"started_at": "2025-01-16T10:00:00Z",
"completed_at": "2025-01-16T10:00:02Z",
"duration_ms": 2340
}
],
"meta": { ... }
}
Get Workflow Executions
GET /api/v1/workflows/{workflow}/executions
Returns executions for a specific workflow.
Get Execution Detail
GET /api/v1/workflow-executions/{execution}
Response:
{
"success": true,
"data": {
"id": "exec-uuid",
"workflow": { ... },
"status": "completed",
"trigger_type": "manual",
"trigger_data": { "order_id": "123" },
"context": {
"variables": { "discount": 10 }
},
"result": { ... },
"nodes_total": 5,
"nodes_executed": 5,
"started_at": "...",
"completed_at": "...",
"logs": [
{
"id": "log-uuid",
"node_id": "node-uuid",
"node_type": "workflows:manual-trigger",
"node_label": "Manual Trigger",
"status": "completed",
"input_data": { ... },
"output_data": { ... },
"started_at": "...",
"completed_at": "...",
"duration_ms": 5
}
]
}
}
Get Execution Logs
GET /api/v1/workflow-executions/{execution}/logs
Response:
{
"success": true,
"data": [
{
"id": "log-uuid",
"node_id": "node-uuid",
"node_type": "workflows:send-email",
"node_label": "Send Confirmation",
"status": "completed",
"input_data": {
"order_id": "123",
"customer_email": "john@example.com"
},
"output_data": {
"order_id": "123",
"customer_email": "john@example.com",
"_email_sent": true,
"_sent_at": "2025-01-16T10:00:01Z"
},
"error_message": null,
"retry_attempt": 0,
"started_at": "2025-01-16T10:00:00.500Z",
"completed_at": "2025-01-16T10:00:01.234Z",
"duration_ms": 734
}
]
}
Cancel Execution
POST /api/v1/workflow-executions/{execution}/cancel
Only works for pending or running executions.
Response:
{
"success": true,
"message": "Execution cancelled"
}
Retry Execution
POST /api/v1/workflow-executions/{execution}/retry
Creates a new execution with the same trigger data.
Response:
{
"success": true,
"message": "Execution retry started",
"data": {
"execution_id": "new-exec-uuid"
}
}
Webhooks
Get Webhook URL
GET /api/v1/workflows/{workflow}/webhook-url
Response:
{
"success": true,
"data": {
"url": "https://your-domain.com/api/webhooks/workflows/abc123token",
"method": "POST",
"token": "abc123token"
}
}
Trigger Webhook (Public)
POST /api/webhooks/workflows/{token}
No authentication required - uses token for identification.
Request Body:
{
"event": "order.created",
"data": {
"order_id": "123"
}
}
Headers (if signature required):
X-Webhook-Signature: sha256=abc123...
Response:
{
"success": true,
"message": "Workflow triggered",
"data": {
"execution_id": "exec-uuid"
}
}
Error Responses
All endpoints may return these error responses:
400 Bad Request
{
"success": false,
"message": "Invalid request",
"errors": { ... }
}
401 Unauthorized
{
"success": false,
"message": "Unauthenticated"
}
403 Forbidden
{
"success": false,
"message": "Insufficient permissions"
}
404 Not Found
{
"success": false,
"message": "Workflow not found"
}
422 Validation Failed
{
"success": false,
"message": "Validation failed",
"errors": {
"name": ["The name field is required"]
}
}
500 Server Error
{
"success": false,
"message": "An error occurred",
"error": "Error details (in debug mode)"
}
Rate Limiting
API endpoints are rate limited:
- Standard endpoints: 60 requests/minute
- Webhook endpoints: 120 requests/minute
- Execute endpoints: 30 requests/minute
Rate limit headers:
X-RateLimit-Limit: 60
X-RateLimit-Remaining: 45
X-RateLimit-Reset: 1705398000
Next Steps
- Execution Engine - How execution works
- Extending Workflows - Create custom endpoints
- Examples - API usage examples