SIPSymposium API

Programmatically submit SIP traces and PCAP files 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 Workspace under the API Keys tab. 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
PlanRequests per dayReset
Pro100Midnight UTC daily
Teams1,000Midnight UTC daily

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.

200 OK
Request succeeded
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
POST /v1/analyze

Submit a SIP trace or PCAP file URL for AI-powered analysis. Returns findings ranked by severity, actionable recommendations, and call quality metrics.

Request body

FieldTypeDescription
trace string Required* SIP trace as plain text. Paste raw SIP messages from your PBX log, sngrep output, or Wireshark SIP decode. Max 500KB.
pcap_url string Required* Publicly accessible URL to a PCAP file. Use instead of trace. * Either trace or pcap_url is required.
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 -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"] } }'

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 } }
GET /v1/keys

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"
POST /v1/keys/generate

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 Workspace → API Keys tab without needing an existing API key — just log in normally.

DELETE /v1/keys/revoke

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
FieldTypeDescription
severitystringOne of: critical, high, medium, low, info
categorystringFinding category: signaling, media, codec, security, compliance, nat, auth, routing, general
titlestringShort summary of the finding
detailstringFull explanation with specific values from the trace
recommendationstringActionable fix for the finding. May be empty for informational findings.
Severity levels
SeverityMeaningExamples
CriticalCall will definitely fail or major security issueNo codec match, TLS cert expired, 401 auth loop
HighCall likely to fail or significant quality impactRFC 1918 in SDP, RTP packet loss >5%, SIP 5xx error
MediumPotential issue that may cause intermittent failuresptime mismatch, SRTP not used, missing RTCP
LowBest practice violation or minor misconfigurationNon-standard ptime, missing SIP headers, deprecated codec
InfoInformational — no action requiredCodec 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 Workspace. Pro plan includes 100 API calls/day. Teams includes 1,000.

Get API key View plans