
N8n
- 13 installs
- 638 repo stars
- Updated March 7, 2026
- sundial-org/awesome-openclaw-skills
Helps with ai & agent building tasks during AI-assisted development.
About
n8n is a Claude Code skill for ai & agent building. It helps solo builders move faster with AI-assisted coding.
- n8n
- AI & Agent Building
- AI-coding skill
N8n by the numbers
- 13 all-time installs (skills.sh)
- Ranked #11,406 of 16,546 AI & Agent Building skills by installs in the Skillselion catalog
- Data as of Aug 5, 2026 (Skillselion catalog sync)
npx skills add https://github.com/sundial-org/awesome-openclaw-skills --skill n8nAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 13 |
|---|---|
| repo stars | ★ 638 |
| Last updated | March 7, 2026 |
| Repository | sundial-org/awesome-openclaw-skills ↗ |
What it does
Helps with ai & agent building tasks during AI-assisted development.
Files
n8n Workflow Management
Interact with n8n automation platform via REST API.
Setup
First-time setup:
1. API key must be stored in environment:
export N8N_API_KEY="your-api-key-here"2. Verify connection:
python3 scripts/n8n_api.py list-workflows --prettyFor persistent storage, add to ~/.bashrc or ~/.zshrc:
echo 'export N8N_API_KEY="your-key"' >> ~/.bashrcQuick Reference
List Workflows
python3 scripts/n8n_api.py list-workflows --pretty
python3 scripts/n8n_api.py list-workflows --active true --prettyGet Workflow Details
python3 scripts/n8n_api.py get-workflow --id <workflow-id> --prettyActivate/Deactivate
python3 scripts/n8n_api.py activate --id <workflow-id>
python3 scripts/n8n_api.py deactivate --id <workflow-id>Executions
# List recent executions
python3 scripts/n8n_api.py list-executions --limit 10 --pretty
# Get execution details
python3 scripts/n8n_api.py get-execution --id <execution-id> --pretty
# Filter by workflow
python3 scripts/n8n_api.py list-executions --id <workflow-id> --limit 20 --prettyManual Execution
# Trigger workflow
python3 scripts/n8n_api.py execute --id <workflow-id>
# With data
python3 scripts/n8n_api.py execute --id <workflow-id> --data '{"key": "value"}'Python API
For programmatic access:
from scripts.n8n_api import N8nClient
client = N8nClient()
# List workflows
workflows = client.list_workflows(active=True)
# Get workflow
workflow = client.get_workflow('workflow-id')
# Activate/deactivate
client.activate_workflow('workflow-id')
client.deactivate_workflow('workflow-id')
# Executions
executions = client.list_executions(workflow_id='workflow-id', limit=10)
execution = client.get_execution('execution-id')
# Execute workflow
result = client.execute_workflow('workflow-id', data={'key': 'value'})Common Tasks
Debug Failed Workflows
1. List recent executions with failures 2. Get execution details to see error 3. Check workflow configuration 4. Deactivate if needed
Monitor Workflow Health
1. List active workflows 2. Check recent execution status 3. Review error patterns
Workflow Management
1. List all workflows 2. Review active/inactive status 3. Activate/deactivate as needed 4. Delete old workflows
API Reference
For detailed API documentation, see references/api.md.
Troubleshooting
Authentication error:
- Verify N8N_API_KEY is set:
echo $N8N_API_KEY - Check API key is valid in n8n UI
Connection error:
- Check N8N_BASE_URL if using custom URL
Command errors:
- Use
--prettyflag for readable output - Check
--idis provided when required - Validate JSON format for
--dataparameter
n8n API Reference
Authentication
The n8n API uses API key authentication via the X-N8N-API-KEY header.
API keys are managed in the n8n UI:
- Settings → API
- User profile → API
Base URL
N8N_BASE_URL
Default: ${N8N_BASE_URL}$/api/v1
Endpoints
Workflows
List Workflows
GET /workflows
Query params: ?active=true|falseResponse:
{
"data": [
{
"id": "123",
"name": "My Workflow",
"active": true,
"createdAt": "2026-01-14T10:00:00.000Z",
"updatedAt": "2026-01-14T12:00:00.000Z"
}
]
}Get Workflow
GET /workflows/{id}Create Workflow
POST /workflows
Body: workflow JSONUpdate Workflow
PATCH /workflows/{id}
Body: partial workflow JSONActivate/Deactivate
PATCH /workflows/{id}
Body: {"active": true|false}Delete Workflow
DELETE /workflows/{id}Executions
List Executions
GET /executions?limit=20&workflowId={id}Response:
{
"data": [
{
"id": "456",
"finished": true,
"mode": "trigger",
"startedAt": "2026-01-14T12:00:00.000Z",
"stoppedAt": "2026-01-14T12:00:05.000Z",
"workflowId": "123",
"status": "success"
}
]
}Get Execution
GET /executions/{id}Delete Execution
DELETE /executions/{id}Manual Execution
POST /workflows/{id}/execute
Body: {"data": {...}}Common Patterns
List Active Workflows
python3 scripts/n8n_api.py list-workflows --active true --prettyGet Workflow Details
python3 scripts/n8n_api.py get-workflow --id <workflow-id> --prettyActivate/Deactivate Workflow
python3 scripts/n8n_api.py activate --id <workflow-id>
python3 scripts/n8n_api.py deactivate --id <workflow-id>List Recent Executions
python3 scripts/n8n_api.py list-executions --limit 10 --prettyManually Execute Workflow
python3 scripts/n8n_api.py execute --id <workflow-id>With data:
python3 scripts/n8n_api.py execute --id <workflow-id> --data '{"key": "value"}'Error Handling
HTTP status codes:
200- Success400- Bad request401- Unauthorized (invalid API key)404- Not found500- Server error
Environment Variables
Required:
N8N_API_KEY- n8n API keyN8N_BASE_URL- Base URL
#!/usr/bin/env python3
"""
n8n API client for Clawdbot
Manages workflows, executions, and credentials via n8n REST API
"""
import os
import sys
import json
import argparse
import requests
from pathlib import Path
from typing import Optional, Dict, Any, List
class N8nClient:
"""n8n API client"""
def __init__(self, base_url: str = None, api_key: str = None):
self.base_url = base_url or os.getenv('N8N_BASE_URL')
self.api_key = api_key or os.getenv('N8N_API_KEY')
if not self.api_key:
raise ValueError("N8N_API_KEY not found in environment")
self.session = requests.Session()
self.session.headers.update({
'X-N8N-API-KEY': self.api_key,
'Accept': 'application/json',
'Content-Type': 'application/json'
})
def _request(self, method: str, endpoint: str, **kwargs) -> Dict[str, Any]:
"""Make API request"""
url = f"{self.base_url}/api/v1/{endpoint.lstrip('/')}"
response = self.session.request(method, url, **kwargs)
try:
response.raise_for_status()
return response.json() if response.content else {}
except requests.exceptions.HTTPError as e:
error_msg = f"HTTP {response.status_code}: {response.text}"
raise Exception(error_msg) from e
# Workflows
def list_workflows(self, active: bool = None) -> List[Dict]:
"""List all workflows"""
params = {}
if active is not None:
params['active'] = str(active).lower()
return self._request('GET', 'workflows', params=params)
def get_workflow(self, workflow_id: str) -> Dict:
"""Get workflow details"""
return self._request('GET', f'workflows/{workflow_id}')
def create_workflow(self, workflow_data: Dict) -> Dict:
"""Create new workflow"""
return self._request('POST', 'workflows', json=workflow_data)
def update_workflow(self, workflow_id: str, workflow_data: Dict) -> Dict:
"""Update existing workflow"""
return self._request('PATCH', f'workflows/{workflow_id}', json=workflow_data)
def delete_workflow(self, workflow_id: str) -> Dict:
"""Delete workflow"""
return self._request('DELETE', f'workflows/{workflow_id}')
def activate_workflow(self, workflow_id: str) -> Dict:
"""Activate workflow"""
return self._request('PATCH', f'workflows/{workflow_id}', json={'active': True})
def deactivate_workflow(self, workflow_id: str) -> Dict:
"""Deactivate workflow"""
return self._request('PATCH', f'workflows/{workflow_id}', json={'active': False})
# Executions
def list_executions(self, workflow_id: str = None, limit: int = 20) -> List[Dict]:
"""List workflow executions"""
params = {'limit': limit}
if workflow_id:
params['workflowId'] = workflow_id
return self._request('GET', 'executions', params=params)
def get_execution(self, execution_id: str) -> Dict:
"""Get execution details"""
return self._request('GET', f'executions/{execution_id}')
def delete_execution(self, execution_id: str) -> Dict:
"""Delete execution"""
return self._request('DELETE', f'executions/{execution_id}')
# Manual execution
def execute_workflow(self, workflow_id: str, data: Dict = None) -> Dict:
"""Manually trigger workflow execution"""
payload = {'workflowId': workflow_id}
if data:
payload['data'] = data
return self._request('POST', f'workflows/{workflow_id}/execute', json=payload)
def main():
parser = argparse.ArgumentParser(description='n8n API Client')
parser.add_argument('action', choices=[
'list-workflows', 'get-workflow', 'activate', 'deactivate',
'list-executions', 'get-execution', 'execute'
])
parser.add_argument('--id', help='Workflow or execution ID')
parser.add_argument('--active', type=lambda x: x.lower() == 'true', help='Filter by active status')
parser.add_argument('--limit', type=int, default=20, help='Limit results')
parser.add_argument('--data', help='JSON data for execution')
parser.add_argument('--pretty', action='store_true', help='Pretty print JSON output')
args = parser.parse_args()
try:
client = N8nClient()
result = None
if args.action == 'list-workflows':
result = client.list_workflows(active=args.active)
elif args.action == 'get-workflow':
if not args.id:
raise ValueError("--id required for get-workflow")
result = client.get_workflow(args.id)
elif args.action == 'activate':
if not args.id:
raise ValueError("--id required for activate")
result = client.activate_workflow(args.id)
elif args.action == 'deactivate':
if not args.id:
raise ValueError("--id required for deactivate")
result = client.deactivate_workflow(args.id)
elif args.action == 'list-executions':
result = client.list_executions(workflow_id=args.id, limit=args.limit)
elif args.action == 'get-execution':
if not args.id:
raise ValueError("--id required for get-execution")
result = client.get_execution(args.id)
elif args.action == 'execute':
if not args.id:
raise ValueError("--id required for execute")
data = json.loads(args.data) if args.data else None
result = client.execute_workflow(args.id, data=data)
# Output
if args.pretty:
print(json.dumps(result, indent=2))
else:
print(json.dumps(result))
except Exception as e:
print(f"Error: {e}", file=sys.stderr)
sys.exit(1)
if __name__ == '__main__':
main()