n8n Code Python Skill
Expert guidance for writing Python code in n8n Code nodes.
⚠️ Important: JavaScript First
Use JavaScript for 95% of use cases.
Python in n8n has NO external libraries (no requests, pandas, numpy).
When to use Python:
- You have complex Python-specific logic
- You need Python's standard library features
- You're more comfortable with Python than JavaScript
When to use JavaScript (recommended):
- HTTP requests ($helpers.httpRequest available)
- Date/time operations (Luxon library included)
- Most data transformations
- When in doubt
What This Skill Teaches
Core Concepts
- Critical Limitation: No external libraries
- Data Access:
_input.all(),_input.first(),_input.item - Webhook Gotcha: Data is under
_json["body"] - Return Format: Must return
[{"json": {...}}] - Standard Library: json, datetime, re, base64, hashlib, etc.
Top 5 Error Prevention
This skill emphasizes error prevention:
- ModuleNotFoundError (trying to import external libraries)
- Empty code / missing return
- KeyError (dictionary access without .get())
- IndexError (list access without bounds checking)
- Incorrect return format
These 5 errors are the most common in Python Code nodes.
Skill Activation
This skill activates when you:
- Write Python in Code nodes
- Ask about Python limitations
- Need to know available standard library
- Troubleshoot Python Code node errors
- Work with Python data structures
Example queries:
- "Can I use pandas in Python Code node?"
- "How do I access webhook data in Python?"
- "What Python libraries are available?"
- "Write Python code to process JSON"
- "Why is requests module not found?"
File Structure
SKILL.md (719 lines)
Quick start and overview
- When to use Python vs JavaScript
- Critical limitation (no external libraries)
- Mode selection (All Items vs Each Item)
- Data access overview
- Return format requirements
- Standard library overview
DATA_ACCESS.md (703 lines)
Complete data access patterns
_input.all()- Process all items_input.first()- Get first item_input.item- Current item (Each Item mode)_node["Name"]- Reference other nodes- Webhook body structure (critical gotcha!)
- Pattern selection guide
STANDARD_LIBRARY.md (850 lines)
Available Python modules
- json - JSON parsing
- datetime - Date/time operations
- re - Regular expressions
- base64 - Encoding/decoding
- hashlib - Hashing
- urllib.parse - URL operations
- math, random, statistics
- What's NOT available (requests, pandas, numpy)
- Workarounds for missing libraries
COMMON_PATTERNS.md (895 lines)
10 production-tested patterns
- Multi-source data aggregation
- Regex-based filtering
- Markdown to structured data
- JSON object comparison
- CRM data transformation
- Release notes processing
- Array transformation
- Dictionary lookup
- Top N filtering
- String aggregation
ERROR_PATTERNS.md (730 lines)
Top 5 errors with solutions
- ModuleNotFoundError (external libraries)
- Empty code / missing return
- KeyError (dictionary access)
- IndexError (list access)
- Incorrect return format
- Error prevention checklist
- Quick fix reference
- Testing patterns
Integration with Other Skills
This skill works with:
n8n Expression Syntax
- Python uses code syntax, not {{}} expressions
- Data access patterns differ ($ vs _)
n8n MCP Tools Expert
- Use MCP tools to validate Code node configurations
- Check node setup with
get_node_essentials
n8n Workflow Patterns
- Code nodes fit into larger workflow patterns
- Often used after HTTP Request or Webhook nodes
n8n Code JavaScript
- Compare Python vs JavaScript approaches
- Understand when to use which language
- JavaScript recommended for 95% of cases
n8n Node Configuration
- Configure Code node mode (All Items vs Each Item)
- Set up proper connections
Success Metrics
After using this skill, you should be able to:
- Know the limitation: Python has NO external libraries
- Choose language: JavaScript for 95% of cases, Python when needed
- Access data: Use
_input.all(),_input.first(),_input.item - Handle webhooks: Access data via
_json["body"] - Return properly: Always return
[{"json": {...}}] - Avoid KeyError: Use
.get()for dictionary access - Use standard library: Know what's available (json, datetime, re, etc.)
- Prevent errors: Avoid top 5 common errors
- Choose alternatives: Use n8n nodes when libraries needed
- Write production code: Use proven patterns
Quick Reference
Data Access
all_items = _input.all()
first_item = _input.first()
current_item = _input.item # Each Item mode only
other_node = _node["NodeName"]
Webhook Data
webhook = _input.first()["json"]
body = webhook.get("body", {})
name = body.get("name")
Safe Dictionary Access
# ✅ Use .get() with defaults
value = data.get("field", "default")
# ❌ Risky - may raise KeyError
value = data["field"]
Return Format
# ✅ Correct format
return [{"json": {"result": "success"}}]
# ❌ Wrong - plain dict
return {"result": "success"}
Standard Library
# ✅ Available
import json
import datetime
import re
import base64
import hashlib
# ❌ NOT available
import requests # ModuleNotFoundError!
import pandas # ModuleNotFoundError!
import numpy # ModuleNotFoundError!
Common Use Cases
Use Case 1: Process Webhook Data
webhook = _input.first()["json"]
body = webhook.get("body", {})
return [{
"json": {
"name": body.get("name"),
"email": body.get("email"),
"processed": True
}
}]
Use Case 2: Filter and Transform
all_items = _input.all()
active = [
{"json": {**item["json"], "filtered": True}}
for item in all_items
if item["json"].get("status") == "active"
]
return active
Use Case 3: Aggregate Statistics
import statistics
all_items = _input.all()
amounts = [item["json"].get("amount", 0) for item in all_items]
return [{
"json": {
"total": sum(amounts),
"average": statistics.mean(amounts) if amounts else 0,
"count": len(amounts)
}
}]
Use Case 4: Parse JSON String
import json
data = _input.first()["json"]["body"]
json_string = data.get("payload", "{}")
try:
parsed = json.loads(json_string)
return [{"json": parsed}]
except json.JSONDecodeError:
return [{"json": {"error": "Invalid JSON"}}]
Limitations and Workarounds
Limitation 1: No HTTP Requests Library
Problem: No requests library
Workaround: Use HTTP Request node or JavaScript
Limitation 2: No Data Analysis Library
Problem: No pandas or numpy
Workaround: Use list comprehensions and standard library
Limitation 3: No Database Drivers
Problem: No psycopg2, pymongo, etc.
Workaround: Use n8n database nodes (Postgres, MySQL, MongoDB)
Limitation 4: No Web Scraping
Problem: No beautifulsoup4 or selenium
Workaround: Use HTML Extract node
Best Practices
- Use JavaScript for most cases (95% recommendation)
- Use .get() for dictionaries (avoid KeyError)
- Check lengths before indexing (avoid IndexError)
- Always return proper format:
[{"json": {...}}] - Access webhook data via ["body"]
- Use standard library only (no external imports)
- Handle empty input (check
if items:) - Test both modes (All Items and Each Item)
When Python is the Right Choice
Use Python when:
- Complex text processing (re module)
- Mathematical calculations (math, statistics)
- Date/time manipulation (datetime)
- Cryptographic operations (hashlib)
- You have existing Python logic to reuse
- Team is more comfortable with Python
Use JavaScript instead when:
- Making HTTP requests
- Working with dates (Luxon included)
- Most data transformations
- When in doubt
Learning Path
Beginner:
- Read SKILL.md - Understand the limitation
- Try DATA_ACCESS.md examples - Learn
_inputpatterns - Practice safe dictionary access with
.get()
Intermediate: 4. Study STANDARD_LIBRARY.md - Know what's available 5. Try COMMON_PATTERNS.md examples - Use proven patterns 6. Learn ERROR_PATTERNS.md - Avoid common mistakes
Advanced: 7. Combine multiple patterns 8. Use standard library effectively 9. Know when to switch to JavaScript 10. Write production-ready code
Support
Questions?
- Check ERROR_PATTERNS.md for common issues
- Review COMMON_PATTERNS.md for examples
- Consider using JavaScript instead
Related Skills:
- n8n Code JavaScript - Alternative (recommended for 95% of cases)
- n8n Expression Syntax - For {{}} expressions in other nodes
- n8n Workflow Patterns - Bigger picture workflow design
Version
Version: 1.0.0 Status: Production Ready Compatibility: n8n Code node (Python mode)
Credits
Part of the n8n-skills project.
Conceived by Romuald Członkowski
- Website: www.aiadvisors.pl/en
- Part of n8n-mcp project
Remember: JavaScript is recommended for 95% of use cases. Use Python only when you specifically need Python's standard library features.