diff --git a/app/api/voice-token/route.ts b/app/api/voice-token/route.ts new file mode 100644 index 0000000..49dc220 --- /dev/null +++ b/app/api/voice-token/route.ts @@ -0,0 +1,47 @@ +import { NextRequest, NextResponse } from 'next/server'; +import { createClient } from '@deepgram/sdk'; + +/** + * This API route generates a short-lived, temporary API key + * for a client to connect directly to Deepgram's WebSocket. + * This avoids exposing our main API key and bypasses + * serverless WebSocket limitations. + */ +export async function POST(request: NextRequest) { + const deepgramApiKey = process.env.DEEPGRAM_API_KEY; + + if (!deepgramApiKey) { + return NextResponse.json( + { error: 'Deepgram API key not configured' }, + { status: 500 } + ); + } + + const deepgram = createClient(deepgramApiKey); + + try { + // Create a new, temporary key with 'member' permissions + // that expires in 1 minute (60 seconds). + const response = await deepgram.manage.createProjectKey( + process.env.DEEPGRAM_PROJECT_ID || '', + { + comment: 'Temporary key for Ponderants user', + scopes: ['member'], + time_to_live_in_seconds: 60, + } + ); + + if (!response || !response.key) { + throw new Error('Failed to create temporary key'); + } + + // Send the temporary key back to the client + return NextResponse.json({ key: response.key }); + } catch (error) { + console.error('Error creating Deepgram key:', error); + return NextResponse.json( + { error: 'Failed to generate voice token' }, + { status: 500 } + ); + } +}