Универсальный REST API клиент для MikoPBX с автоматической аутентификацией и выполнением запросов внутри Docker контейнеров...
Universal skill for executing REST API requests to MikoPBX with automatic authentication, container detection, and response formatting. Eliminates manual token management and curl command construction.
Use this skill when you need to:
# Get list of extensions
./.claude/skills/api-client/scripts/api-request.sh GET extensions
# Get extensions with search
./.claude/skills/api-client/scripts/api-request.sh GET "extensions?search=201&limit=5"
# Get call records for specific date range
./.claude/skills/api-client/scripts/api-request.sh GET "cdr?dateFrom=2025-10-17&dateTo=2025-10-18%2023:59:59&limit=10"
# Search CDR by phone number
./.claude/skills/api-client/scripts/api-request.sh GET "cdr?search=79643442732&limit=5"
# Search CDR by name
./.claude/skills/api-client/scripts/api-request.sh GET "cdr?search=Ivan&dateFrom=2025-10-17&dateTo=2025-10-18%2023:59:59&limit=3"
# Create new extension
./.claude/skills/api-client/scripts/api-request.sh POST extensions \
--data "number=202&username=test_user&mobile=1234567890"
# Create with JSON payload
./.claude/skills/api-client/scripts/api-request.sh POST extensions \
--json '{"number":"203","username":"john","mobile":"9876543210"}'
# Update extension
./.claude/skills/api-client/scripts/api-request.sh PATCH "extensions/202" \
--data "mobile=5555555555&username=updated_user"
# Delete extension
./.claude/skills/api-client/scripts/api-request.sh DELETE "extensions/202"
# Delete CDR record
./.claude/skills/api-client/scripts/api-request.sh DELETE "cdr/12345"
# Use specific container
./.claude/skills/api-client/scripts/api-request.sh GET extensions --container mikopbx_php74
# Limit output to 50 lines
./.claude/skills/api-client/scripts/api-request.sh GET "cdr?limit=100" --lines 50
# Full output (no limit)
./.claude/skills/api-client/scripts/api-request.sh GET extensions --lines 0
┌─────────────────────────────────────────────────────────────┐
│ 1. User Request │
│ api-request.sh GET "cdr?search=Ivan&limit=5" │
└─────────────┬───────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ 2. Container Detection │
│ - Find running mikopbx-php83 or mikopbx_php74 │
│ - Get container ID │
└─────────────┬───────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ 3. Authentication (via auth-token-manager skill) │
│ - Execute get-auth-token.sh inside container │
│ - Obtain JWT Bearer token │
└─────────────┬───────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ 4. API Request Execution (inside container) │
│ curl -H "Authorization: Bearer $TOKEN" │
│ "http://127.0.0.1:8081/pbxcore/api/v3/cdr?..." │
└─────────────┬───────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ 5. Response Formatting │
│ - Parse JSON │
│ - Pretty-print with python3 -m json.tool │
│ - Apply line limit (default: 80) │
└─────────────┬───────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ 6. Output to User │
│ - Formatted JSON response │
│ - Error messages if failed │
└─────────────────────────────────────────────────────────────┘
IMPORTANT: Always use absolute path to the script from project root:
/Users/nb/PhpstormProjects/mikopbx/Core/.claude/skills/api-client/scripts/api-request.sh <METHOD> <ENDPOINT> [OPTIONS]
Or when working in project directory, use:
./.claude/skills/api-client/scripts/api-request.sh <METHOD> <ENDPOINT> [OPTIONS]
/pbxcore/api/v3 prefix)--data "key=value&key2=value2" - Form data for POST/PATCH--json '{"key":"value"}' - JSON payload for POST/PATCH--container NAME - Specific container name (default: auto-detect)--lines N - Limit output to N lines (default: 80, 0 = no limit)--debug - Show debug information# GET request
./.claude/skills/api-client/scripts/api-request.sh GET extensions
# GET with query parameters
./.claude/skills/api-client/scripts/api-request.sh GET "extensions?search=201"
# POST with form data
./.claude/skills/api-client/scripts/api-request.sh POST extensions --data "number=204&username=test"
# POST with JSON
./.claude/skills/api-client/scripts/api-request.sh POST extensions --json '{"number":"205","username":"jane"}'
# PATCH request
./.claude/skills/api-client/scripts/api-request.sh PATCH "extensions/204" --data "mobile=1111111111"
# DELETE request
./.claude/skills/api-client/scripts/api-request.sh DELETE "extensions/204"
# Custom container
./.claude/skills/api-client/scripts/api-request.sh GET extensions --container mikopbx_php74
# More output lines
./.claude/skills/api-client/scripts/api-request.sh GET "cdr?limit=100" --lines 200
# Debug mode
./.claude/skills/api-client/scripts/api-request.sh GET extensions --debug
# List all extensions
./.claude/skills/api-client/scripts/api-request.sh GET extensions
# Get specific extension
./.claude/skills/api-client/scripts/api-request.sh GET "extensions/201"
# Search extensions
./.claude/skills/api-client/scripts/api-request.sh GET "extensions?search=admin&limit=5"
# Create extension
./.claude/skills/api-client/scripts/api-request.sh POST extensions \
--data "number=206&username=newuser&mobile=1234567890"
# Update extension
./.claude/skills/api-client/scripts/api-request.sh PATCH "extensions/206" --data "mobile=9999999999"
# Delete extension
./.claude/skills/api-client/scripts/api-request.sh DELETE "extensions/206"
# Get recent CDR
./.claude/skills/api-client/scripts/api-request.sh GET "cdr?limit=10"
# CDR by date range
./.claude/skills/api-client/scripts/api-request.sh GET "cdr?dateFrom=2025-10-17&dateTo=2025-10-18%2023:59:59"
# Search by phone number
./.claude/skills/api-client/scripts/api-request.sh GET "cdr?search=79643442732&limit=5"
# Search by caller name
./.claude/skills/api-client/scripts/api-request.sh GET "cdr?search=Ivan&limit=3"
# Get CDR metadata
./.claude/skills/api-client/scripts/api-request.sh GET "cdr/metadata"
# Get playback URL (requires token or view parameter)
./.claude/skills/api-client/scripts/api-request.sh GET "cdr/12345:playback?view=inline"
# Delete CDR record
./.claude/skills/api-client/scripts/api-request.sh DELETE "cdr/12345"
# List providers
./.claude/skills/api-client/scripts/api-request.sh GET providers
# Get provider by ID
./.claude/skills/api-client/scripts/api-request.sh GET "providers/1"
# Create SIP provider
./.claude/skills/api-client/scripts/api-request.sh POST providers \
--json '{"type":"sip","description":"Test Provider","host":"sip.example.com"}'
# Update provider
./.claude/skills/api-client/scripts/api-request.sh PATCH "providers/1" --data "disabled=0"
# Delete provider
./.claude/skills/api-client/scripts/api-request.sh DELETE "providers/1"
# List incoming routes
./.claude/skills/api-client/scripts/api-request.sh GET incoming-routes
# Create route
./.claude/skills/api-client/scripts/api-request.sh POST incoming-routes \
--data "provider=1&number=201&priority=1"
# Update route
./.claude/skills/api-client/scripts/api-request.sh PATCH "incoming-routes/1" --data "priority=5"
# Delete route
./.claude/skills/api-client/scripts/api-request.sh DELETE "incoming-routes/1"
# System info
./.claude/skills/api-client/scripts/api-request.sh GET "system/info"
# Check for updates
./.claude/skills/api-client/scripts/api-request.sh GET "system:check-for-updates"
# Get system status
./.claude/skills/api-client/scripts/api-request.sh GET "system/status"
# Global search
./.claude/skills/api-client/scripts/api-request.sh GET "search?query=admin&limit=20"
# Search by category
./.claude/skills/api-client/scripts/api-request.sh GET "search?query=201&category=extensions"
The script respects these environment variables:
# API credentials (passed to auth-token-manager)
MIKOPBX_LOGIN="admin" # Default username
MIKOPBX_PASSWORD="123456789MikoPBX#1" # Default password
# Container selection
MIKOPBX_CONTAINER="mikopbx-php83" # Default container name
Successful responses are formatted as JSON:
{
"result": true,
"data": {
"items": [...],
"totalCount": 42
},
"messages": {}
}
Error responses:
{
"result": false,
"data": {},
"messages": {
"error": ["Validation failed: number is required"]
}
}
# After modifying Extensions API
./.claude/skills/api-client/scripts/api-request.sh GET extensions
./.claude/skills/api-client/scripts/api-request.sh POST extensions --data "number=999&username=test"
./.claude/skills/api-client/scripts/api-request.sh DELETE "extensions/999"
# Test search with various parameters
./.claude/skills/api-client/scripts/api-request.sh GET "extensions?search=admin"
./.claude/skills/api-client/scripts/api-request.sh GET "extensions?search=201&limit=1"
./.claude/skills/api-client/scripts/api-request.sh GET "cdr?search=Ivan&dateFrom=2025-10-17"
# Check if CDR records exist
./.claude/skills/api-client/scripts/api-request.sh GET "cdr?limit=5" --lines 100
# Verify specific call
./.claude/skills/api-client/scripts/api-request.sh GET "cdr?search=79643442732"
# Create extension and verify in database
./.claude/skills/api-client/scripts/api-request.sh POST extensions --data "number=777&username=validation_test"
# Then check with sqlite-inspector skill
# docker exec <container> sqlite3 /cf/conf/mikopbx.db "SELECT * FROM Extensions WHERE number='777'"
❌ ERROR: No running MikoPBX containers found
Available containers:
docker ps --filter "name=mikopbx"
Solution: Start container or specify correct name
❌ ERROR: Failed to obtain authentication token
Solution: Check credentials in environment variables
{
"result": false,
"messages": {
"error": ["Endpoint not found"]
}
}
Solution: Verify endpoint path, check openapi-analyzer skill for valid endpoints
curl: (7) Failed to connect to 127.0.0.1 port 8081
Solution: Verify container is running and web service is started
--lines for large datasets# Create multiple extensions
for i in {301..305}; do
./.claude/skills/api-client/scripts/api-request.sh POST extensions \
--data "number=$i&username=user_$i&mobile=555000$i"
done
# Verify all created
./.claude/skills/api-client/scripts/api-request.sh GET "extensions?search=user_" --lines 200
# Extract specific field from response
RESPONSE=$(./.claude/skills/api-client/scripts/api-request.sh GET extensions --lines 0)
TOTAL=$(echo "$RESPONSE" | python3 -c "import sys,json; print(json.load(sys.stdin)['data']['totalCount'])")
echo "Total extensions: $TOTAL"
# Enable debug mode
./.claude/skills/api-client/scripts/api-request.sh GET extensions --debug
# Shows:
# - Container ID
# - Token (first 50 chars)
# - Full curl command
# - Raw response
Cause: Container not running
Solution: docker ps --filter "name=mikopbx" and start if needed
Cause: Wrong credentials Solution: Check MIKOPBX_LOGIN and MIKOPBX_PASSWORD env vars
Cause: Python not in container (unlikely)
Solution: Container should have python3, check with docker exec <container> which python3
Cause: API returned non-JSON (HTML error page)
Solution: Check endpoint path, use --debug to see raw response
scripts/api-request.sh - Main API request execution scriptSKILL.md - This documentationreference/http-methods.md - HTTP methods referencereference/common-endpoints.md - Common endpoint patternsexamples/crud-examples.md - CRUD operation examplesREADME.md - Quick reference