SIPSymposium API
Programmatically submit SIP traces for AI-powered diagnostic analysis. Integrate SIP troubleshooting directly into your monitoring pipelines, CI/CD workflows, and voice infrastructure tooling.
v1
Pro & Teams
Base URL: https://sipsymposium.com
Authentication
All API requests require a Bearer token in the Authorization header. Generate API keys from your API Keys page . API access is available on Pro and Teams plans.
Request header
Authorization: Bearer sips_a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6
API keys are prefixed with sips_. Keys are shown once at creation and cannot be retrieved again — store them securely.
Rate limits
Plan Requests per day Reset
Pro 100 per user Midnight UTC daily
Teams 100 per user, 300 per team Midnight UTC daily
API calls share the same daily budget as the web analyzer — one quota per user across all interfaces. Teams plans have an additional team-wide pooled cap so a single member can't monopolize the team's daily quota.
Rate limit headers are returned on every response:
X-RateLimit-Limit: 100
X-RateLimit-Remaining: 87
X-RateLimit-Reset: 1713571200
Error handling
Errors return a JSON object with an error field. HTTP status codes follow standard conventions.
400 Bad Request
Missing or invalid parameters — check the error message
401 Unauthorized
Missing, invalid, or revoked API key
403 Forbidden
Plan does not include API access — upgrade to Pro or Teams
413 Payload Too Large
Trace exceeds 500KB limit
429 Too Many Requests
Rate limit exceeded — check X-RateLimit-Reset for reset time
503 Service Unavailable
Analysis service temporarily unavailable — retry with backoff
Submit a SIP trace for AI-powered analysis. Returns findings ranked by severity, actionable recommendations, and call quality metrics.
Request body
Field Type Description
trace
string
Required
SIP trace as plain text. Paste raw SIP messages from your PBX log, sngrep output, or Wireshark SIP decode. Max 500KB.
context.issue
string
Optional
Hint about the symptom you are investigating. E.g. "one-way-audio", "registration-failing", "calls-dropping"
context.endpoints
string[]
Optional
Labels for each SIP endpoint in the trace. E.g. ["SBC", "Carrier", "PBX"]
Example request
cURL
JavaScript
Python
curl -X POST https://sipsymposium.com/v1/analyze \
-H "Authorization: Bearer sips_your_api_key_here" \
-H "Content-Type: application/json" \
-d '{
"trace": "INVITE sip:bob@biloxi.com SIP/2.0\nVia: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bK776\n...",
"context": {
"issue": "one-way-audio",
"endpoints": ["Softphone", "Carrier"]
}
}'
const response = await fetch('https://sipsymposium.com/v1/analyze', {
method: 'POST',
headers: {
'Authorization': 'Bearer sips_your_api_key_here',
'Content-Type': 'application/json',
},
body: JSON.stringify({
trace: sipTraceText,
context: {
issue: 'registration-failing',
},
}),
});
const { findings, severity_counts, recommendations, meta } = await response.json();
console.log(`Found ${findings.length} issues`);
console.log(`Critical: ${severity_counts.critical}, High: ${severity_counts.high}`);
recommendations.forEach(r => console.log(' -', r));
import requests
response = requests.post(
'https://sipsymposium.com/v1/analyze',
headers={
'Authorization': 'Bearer sips_your_api_key_here',
'Content-Type': 'application/json',
},
json={
'trace': sip_trace_text,
'context': {
'issue': 'calls-dropping',
'endpoints': ['Asterisk', 'Telnyx'],
},
}
)
data = response.json()
for finding in data['findings']:
print(f"[{finding['severity'].upper()}] {finding['title']}")
print(f" {finding['recommendation']}")
Response
{
"findings": [
{
"severity": "high",
"category": "media",
"title": "RFC 1918 private IP in SDP c= line",
"detail": "The SDP contains c=IN IP4 192.168.1.100 which is not routable over the internet. The remote endpoint cannot send RTP to this address.",
"recommendation": "Configure external_media_address in your PJSIP transport or set ext-rtp-ip in FreeSWITCH vars.xml to your public IP."
},
{
"severity": "medium",
"category": "codec",
"title": "ptime mismatch between offer and answer",
"detail": "Offerer set a=ptime:30, answerer set a=ptime:20. Mismatched ptime causes jitter buffer issues.",
"recommendation": "Set ptime to 20ms on both endpoints to match standard packetization."
}
],
"severity_counts": {
"critical": 0,
"high": 1,
"medium": 1,
"low": 0,
"info": 2
},
"recommendations": [
"Configure external_media_address in your PJSIP transport...",
"Set ptime to 20ms on both endpoints..."
],
"meta": {
"analyzed_at": "2026-04-16T18:30:00.000Z",
"elapsed_ms": 1240,
"plan": "pro",
"calls_today": 3,
"calls_remaining": 97,
"calls_limit": 100
}
}
List all API keys for the authenticated user. Returns key metadata — prefix, name, usage — but never the full key value.
curl https://sipsymposium.com/v1/keys \
-H "Authorization: Bearer sips_your_api_key_here"
Generate a new API key. The full key is returned once only — it cannot be retrieved again. Store it securely immediately.
curl -X POST https://sipsymposium.com/v1/keys/generate \
-H "Authorization: Bearer sips_existing_key_or_session_token" \
-H "Content-Type: application/json" \
-d '{"name": "Production monitoring"}'
Note: You can also generate keys from the API Keys page without needing an existing API key — just sign in and click Generate.
Revoke an API key immediately. Revoked keys cannot be restored — generate a new key if needed.
curl -X DELETE https://sipsymposium.com/v1/keys/revoke \
-H "Authorization: Bearer sips_your_api_key_here" \
-H "Content-Type: application/json" \
-d '{"key_id": "uuid-of-key-to-revoke"}'
Findings schema
Field Type Description
severity string One of: critical, high, medium, low, info
category string Finding category: signaling, media, codec, security, compliance, nat, auth, routing, general
title string Short summary of the finding
detail string Full explanation with specific values from the trace
recommendation string Actionable fix for the finding. May be empty for informational findings.
Severity levels
Severity Meaning Examples
Critical Call will definitely fail or major security issue No codec match, TLS cert expired, 401 auth loop
High Call likely to fail or significant quality impact RFC 1918 in SDP, RTP packet loss >5%, SIP 5xx error
Medium Potential issue that may cause intermittent failures ptime mismatch, SRTP not used, missing RTCP
Low Best practice violation or minor misconfiguration Non-standard ptime, missing SIP headers, deprecated codec
Info Informational — no action required Codec list, call duration, endpoint identification
Code examples
Automated monitoring pipeline
// Auto-analyze calls that end with short duration (quality issue signal)
// Using Asterisk AMI + SIPSymposium API
const AsteriskAmi = require('asterisk-manager');
const fs = require('fs');
const ami = new AsteriskAmi(5038, 'localhost', 'admin', 'secret', true);
ami.on('hangup', async (event) => {
const duration = parseInt(event.duration || '0');
const cause = event.cause;
// Analyze short or failed calls
if (duration < 10 || cause !== '16') {
const logPath = `/var/log/asterisk/sip_${event.uniqueid}.log`;
if (fs.existsSync(logPath)) {
const trace = fs.readFileSync(logPath, 'utf8');
const result = await analyzeSIPTrace(trace, cause);
if (result.severity_counts.critical + result.severity_counts.high > 0) {
alertOncall(event, result);
}
}
}
});
async function analyzeSIPTrace(trace, issue) {
const r = await fetch('https://sipsymposium.com/v1/analyze', {
method: 'POST',
headers: {
'Authorization': `Bearer ${process.env.SIPSYMPOSIUM_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({ trace, context: { issue } }),
});
return r.json();
}
AI voice agent quality monitoring
// After each AI voice agent call, analyze the SIP trace
// Works with Vapi, Bland.ai, Retell, or custom stacks
async function onCallEnded(callSid, sipTrace) {
const analysis = await fetch('https://sipsymposium.com/v1/analyze', {
method: 'POST',
headers: {
'Authorization': `Bearer ${process.env.SIPSYMPOSIUM_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
trace: sipTrace,
context: {
issue: 'ai-voice-agent-call',
endpoints: ['AI Platform', 'SIP Carrier'],
},
}),
}).then(r => r.json());
// Log findings to your monitoring dashboard
await db.insertCallAnalysis({
call_sid: callSid,
severity_counts: analysis.severity_counts,
findings_count: analysis.findings.length,
top_issue: analysis.findings[0]?.title,
analyzed_at: analysis.meta.analyzed_at,
});
// Alert on critical media issues that affect STT accuracy
const mediaIssues = analysis.findings.filter(
f => f.category === 'media' && ['critical','high'].includes(f.severity)
);
if (mediaIssues.length > 0) {
notifyDevTeam(callSid, mediaIssues);
}
}
Ready to integrate?
Generate your API key from the API Keys page. Pro and Teams plans include 100 API calls per user per day, shared with the web analyzer.