{"name":"Symphony42 Call API","version":"1.0.0","description":"REST API for querying Symphony42 call/conversation data from Azure PostgreSQL","authentication":"Bearer token required in Authorization header for all /api/v1/* endpoints","endpoints":[{"method":"GET","path":"/api/v1/health","description":"Health check — no auth required","example":"GET /api/v1/health"},{"method":"GET","path":"/api/v1/campaigns","description":"List all campaigns","example":"GET /api/v1/campaigns"},{"method":"GET","path":"/api/v1/calls","description":"List conversations with optional filters","params":{"caller_id":"Filter by phone number (flexible matching)","campaign":"Filter by campaign name (case-insensitive partial match)","campaign_id":"Filter by exact campaign ID","date_from":"Start date YYYY-MM-DD (Eastern time)","date_to":"End date YYYY-MM-DD (Eastern time)","sentiment":"Filter by exact user sentiment","end_reason":"Filter by disconnection reason","limit":"Max results (default 100, max 500)"},"example":"GET /api/v1/calls?campaign=Endurance&date_from=2026-01-01&limit=50"},{"method":"GET","path":"/api/v1/calls/{call_id}","description":"Full detail for a single call including transcript","params":{"full":"If true, include raw retell_call_summary blob"},"example":"GET /api/v1/calls/1202?full=false"},{"method":"GET","path":"/api/v1/calls/{call_id}/transcript","description":"Transcript as plain text (optimized for LLM consumption)","example":"GET /api/v1/calls/1202/transcript"}]}