🗡️ Raxodus
"Neither demon nor machine, but something altogether different" - Ultima III
Raxodus - Escape from Rackspace ticket hell. A minimal CLI for managing Rackspace support tickets, built specifically for automation and n8n workflow integration.
🎯 Why Raxodus?
The Rackspace ticket API is broken in numerous ways (30+ second response times, inconsistent field names, "demo" endpoints in production). This tool works around those issues to give you reliable ticket access.
✨ Features
- 🎫 Read-Only Ticket Access - List and view Rackspace support tickets
- 📊 Multiple Output Formats - JSON, table, or CSV output
- 🚀 Fast & Lightweight - Minimal dependencies, quick responses (when API allows)
- 🔐 Secure by Design - No CLI credential flags, environment variables only
- ⏱️ Debug Mode - Track API performance with timing metadata
- 🔄 n8n Ready - JSON output perfect for workflow automation
- 🐚 Shell Completions - Bash, Zsh, and Fish support
- 💾 Smart Caching - Work around slow API responses
- 🛡️ Type Safe - Pydantic models handle API inconsistencies
📦 Installation
# Quick run without installation (recommended)
uvx raxodus --version
# Install with pip
pip install raxodus
# Install with uv
uv pip install raxodus
🚀 Quick Start
1. Set Credentials
# Required environment variables
export RACKSPACE_USERNAME="your-username"
export RACKSPACE_API_KEY="your-api-key"
export RACKSPACE_ACCOUNT="123456" # Optional default account
⚠️ Security Note: Never pass credentials as command-line arguments. This is by design for security.
2. Test Authentication
# Verify your credentials work
raxodus auth test
3. List Tickets
# List all tickets (table format)
raxodus tickets list --format table
# List open tickets from last 7 days
raxodus tickets list --status open --days 7
# JSON output for automation
raxodus tickets list --format json
# CSV for spreadsheets
raxodus tickets list --format csv > tickets.csv
# With debug timing info
raxodus tickets list --debug --format json
4. Get Specific Ticket
# View single ticket
raxodus tickets get 250625-02866
# As JSON
raxodus tickets get 250625-02866 --format json
📚 Complete Command Reference
Main Commands
raxodus --help # Show help
raxodus --version # Show version info
Authentication Commands
# Test credentials
raxodus auth test
# Example output:
# ✓ Authentication successful
# ✓ Token expires: 2025-01-07 15:30:00
Ticket Commands
# List tickets with ALL options
raxodus tickets list \
--account 123456 \ # Specific account (overrides env)
--status open \ # Filter: open, closed, pending
--days 30 \ # Tickets from last N days
--page 1 \ # Pagination
--per-page 100 \ # Results per page (max 100)
--format json \ # Output: json, table, csv
--debug # Include timing metadata
# Get single ticket
raxodus tickets get TICKET-ID \
--format json \ # Output: json, table
--debug # Include timing metadata
Shell Completions
# Install completions for your shell
raxodus completion install
# Or manually add to your shell config
raxodus completion show >> ~/.bashrc # Bash
raxodus completion show >> ~/.zshrc # Zsh
🔧 Configuration
Environment Variables
# Required
RACKSPACE_USERNAME="your-username" # Your Rackspace username
RACKSPACE_API_KEY="your-api-key" # Your API key
# Optional
RACKSPACE_ACCOUNT="123456" # Default account number
RACKSPACE_REGION="us" # API region (default: us)
RAXODUS_CACHE_DIR="~/.cache/raxodus" # Cache directory
RAXODUS_CACHE_TTL="300" # Cache TTL in seconds
🤖 n8n Integration
Execute Command Node
{
"nodes": [{
"name": "List Tickets",
"type": "n8n-nodes-base.executeCommand",
"parameters": {
"command": "raxodus tickets list --format json --debug",
"env": {
"RACKSPACE_USERNAME": "={{ $credentials.rackspace.username }}",
"RACKSPACE_API_KEY": "={{ $credentials.rackspace.apiKey }}",
"RACKSPACE_ACCOUNT": "={{ $credentials.rackspace.account }}"
}
}
}]
}
Process JSON Output
// Code node to process tickets
const output = JSON.parse($input.item.json.stdout);
const openTickets = output.tickets.filter(t => t.status === 'open');
// Check performance
if (output.elapsed_seconds > 30) {
console.warn(`Slow API response: ${output.elapsed_seconds}s`);
}
return openTickets;
Complete n8n Workflow Example
{
"name": "Monitor Rackspace Tickets",
"nodes": [
{
"name": "Every 15 minutes",
"type": "n8n-nodes-base.scheduleTrigger",
"parameters": {
"rule": {
"interval": [{"field": "minutes", "value": 15}]
}
}
},
{
"name": "Get Open Tickets",
"type": "n8n-nodes-base.executeCommand",
"parameters": {
"command": "uvx raxodus tickets list --status open --format json",
"env": {
"RACKSPACE_USERNAME": "={{ $credentials.rackspace.username }}",
"RACKSPACE_API_KEY": "={{ $credentials.rackspace.apiKey }}"
}
}
},
{
"name": "Parse and Filter",
"type": "n8n-nodes-base.code",
"parameters": {
"code": "const data = JSON.parse($input.item.json.stdout);\nreturn data.tickets.filter(t => t.severity === 'urgent');"
}
},
{
"name": "Send Alert",
"type": "n8n-nodes-base.slack",
"parameters": {
"channel": "#alerts",
"text": "Urgent ticket: {{ $json.subject }}"
}
}
]
}
📊 Output Format Examples
JSON Format
{
"tickets": [
{
"ticketId": "250625-02866",
"subject": "Server connectivity issue",
"status": "open",
"severity": "normal",
"created": "2025-06-25T14:30:00Z",
"modified": "2025-06-26T09:15:00Z"
}
],
"elapsed_seconds": 31.5,
"from_cache": false
}
Table Format
┏━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━━━┓
┃ Ticket ID ┃ Subject ┃ Status┃ Severity ┃ Modified ┃
┡━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━━━┩
│ 250625-02866 │ Server connectivity... │ open │ normal │ 2025-06-26 │
└──────────────┴─────────────────────────┴───────┴──────────┴────────────┘
CSV Format
ticketId,subject,status,severity,created,modified
250625-02866,Server connectivity issue,open,normal,2025-06-25T14:30:00Z,2025-06-26T09:15:00Z
⚠️ Known Issues & Workarounds
Rackspace API Problems
- 30+ Second Response Times - Use
--debugto track performance - Invalid Dates in Responses - Pydantic models handle gracefully
- Inconsistent Field Names - Abstracted in our models
- No Write Access - API claims to support updates but returns 404
Workarounds
# Use debug flag to track slow responses
raxodus tickets list --debug --format json
# Cache results to avoid repeated slow calls
export RAXODUS_CACHE_TTL=600 # 10 minute cache
# Use pagination for large result sets
raxodus tickets list --page 1 --per-page 50
🛠️ Development
# Clone repository
git clone https://github.com/bdmorin/raxodus
cd raxodus
# Install for development
uv pip install -e ".[dev]"
# Run tests
pytest
# Check linting
ruff check src/
# Build package
uv build
🎮 Why "Raxodus"?
Like the villain Exodus from Ultima III - neither demon nor machine, but something altogether different - Rackspace tickets exist in a frustrating limbo between automated systems and human support. This tool helps you escape that hell.
Each release is named after an Ultima III character:
- v0.1.x - "Mondain" (The dark wizard)
- v0.2.x - "Minax" (The enchantress)
- v0.3.x - "Exodus" (Neither demon nor machine)
📝 License
MIT - See LICENSE file
🤝 Contributing
Pull requests welcome! Please ensure:
- All tests pass
- Code follows existing style
- New features include tests
- API workarounds are documented
⚖️ Disclaimer
This is an unofficial tool and is not affiliated with or supported by Rackspace Technology. Use at your own risk.
🐛 Issues & Support
- Bug Reports: GitHub Issues
- Feature Requests: GitHub Issues
- Security Issues: Please email privately
📈 Project Status
Current Version: v0.1.2 (Mondain)
The tool is functional but limited by Rackspace API issues. We maintain 0.x versioning to indicate these limitations. Version 1.0 will only be released when Rackspace fixes their API.
See CLAUDE.md for v1.0 release criteria.
Metadata
Release files for raxodus 0.1.3
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| raxodus-0.1.3.tar.gz | 44.1 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| raxodus-0.1.3-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 60.1 kB
Release files / raxodus-0.1.3.tar.gz
| Download URL | raxodus-0.1.3.tar.gz |
|---|---|
| Size | 44.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
ccc124344c05cea470ba5bdd6e1836714ea90e662545a2d7720dbc12024f4a2f
|
|
BLAKE2b-256 checksum How to use checksums |
d115e293c5afc1b5f330e4c35d2f10e1d3ee08187c9c08bf9826ebfc8288f6d3
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.12.11
|
Release files / raxodus-0.1.3-py3-none-any.whl
| Download URL | raxodus-0.1.3-py3-none-any.whl |
|---|---|
| Size | 16.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
5148238cdf9b18c5c1b6e232b940a979134c533b06f7baa4b15bc00ed6ea7c71
|
|
BLAKE2b-256 checksum How to use checksums |
7055b48c5284e8a521de2fdb4ed9302bd97620223e09276a8c4f3b1951e62a73
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.12.11
|