Stemmeagent med tjekkisk nummer i en Lovable-app
Lovable bygger apps på React med en Supabase-backend - kald til volai REST API hører derfor hjemme på serveren, i én Edge Function, ikke i appen i browseren.
1Gem API-nøglen som Supabase-secret
I det Supabase-projekt, som Lovable har oprettet til appen, tilføjes miljøvariablen VOLAI_API_KEY med nøglens værdi (portalen, afsnittet API og MCP). Læg den aldrig i frontend-koden eller i repositoriet - enhver, der så den, kunne bruge saldoen i ejerens navn.
2Kald volai fra en Edge Function
Opret en Edge Function, der modtager en forespørgsel fra appen, og først DEN kalder https://volai.cz/v1/messages med headeren Authorization: Bearer ${VOLAI_API_KEY}. Samme mønster kan bruges til POST /v1/calls (opkald via stemmeagenten).
// supabase/functions/send-sms/index.ts
Deno.serve(async (req) => {
const { to, body } = await req.json();
const res = await fetch("https://volai.cz/v1/messages", {
method: "POST",
headers: {
Authorization: `Bearer ${Deno.env.get("VOLAI_API_KEY")}`,
"Content-Type": "application/json",
},
body: JSON.stringify({ to, body }),
});
return new Response(await res.text(), { status: res.status });
});3Kald funktionen fra brugerfladen
Fra en komponent i appen kaldes Edge Function via supabase.functions.invoke(...) - nøglen bliver kun på serveren, appen sender blot to og beskedens tekst.
const { data, error } = await supabase.functions.invoke("send-sms", {
body: { to: "+420777123456", body: "Din bestilling er klar til afhentning." },
});4Opsæt en webhook, så appen får at vide, hvordan opkaldet gik
Opret en anden Edge Function, der modtager hændelsen (call.completed, call.failed, call.no_answer, call.missed, message.sent, message.received) og skriver den til en tabel i Supabase - derfra læser appen den via Realtime eller en almindelig forespørgsel. Adressen gemmes via PUT /v1/webhook; et tomt felt events ville betyde alle hændelser, så de ønskede bør angives eksplicit. Som standard lader Supabase kun forespørgsler med en nøgle i headeren Authorization komme ind i en Edge Function og svarer ellers med 401: slå verify_jwt fra for denne funktion, og verificér hændelsen med signaturen Volai-Signature, eller send nøglen i en egen header via feltet headers.
curl -X PUT https://volai.cz/v1/webhook \
-H "Authorization: Bearer vk_TVUJ_KLIC" \
-H "Content-Type: application/json" \
-d '{"url": "https://tvuj-projekt.supabase.co/functions/v1/volai-webhook", "events": ["call.completed", "message.sent"]}'5Valgfrit: lad Lovable AI tilføje volai selv
Lovable kan under opbygningen af appen række ud efter et eksternt værktøj via sin egen MCP-server (Custom MCP servers / Custom connectors i indstillingerne for integrationer). Serverens adresse er https://volai.cz/mcp, godkendelse sker med Authorization: Bearer vk_TVUJ_KLIC - de præcise knapper i Lovables brugerflade ændrer sig hurtigere, end denne side kan følge med, så den aktuelle fremgangsmåde findes på docs.lovable.dev/integrations.
Hvad den kan bruges til
Bekræftelses-SMS efter bestilling eller reservation
En webshop eller reservationsapp bygget i Lovable kalder efter betaling sin egen Edge Function, som sender en bekræftelses-SMS med bestillingens detaljer.
Stemmeagent, der tager telefonen for appen
Appen køber et telefonnummer og opretter en agent via REST (eller de opsættes manuelt i portalen) - appens kunder ringer så til et rigtigt tjekkisk nummer, ikke til en fremmed platform.
Lovable AI tilføjer selv opkald og SMS til appen
Under opbygningen af appen lader man Lovable AI række ud efter volai via Custom MCP - funktionen beskrives med ord ("tilføj en knap, der ringer til kunden"), og AI'en vælger selv det rigtige værktøj.
Ofte stillede spørgsmål
- Kan volai API'et kaldes direkte fra appens frontend-kode?
- Nej. En API-nøgle hører ikke hjemme i browseren - enhver, der åbner udviklerkonsollen, kunne se den og bruge saldoen. Gå altid via en Edge Function eller en anden server-route, der holder nøglen på backend.
- Findes der en indbygget Lovable-connector til volai?
- Ikke endnu - indbyggede connectors i Lovable er altid partnerskaber (sådan fungerer for eksempel den til ElevenLabs). I dag går vejen via REST fra en Edge Function eller via den generelle Custom MCP-server beskrevet ovenfor.
- Hvordan opdager appen, at et opkald er slut, uden konstant polling?
- Skriv webhooken
call.completedtil en Supabase-tabel fra en Edge Function, og læs ændringen i appen via Supabase Realtime - ingen polling. - Hvad koster driften?
- Samme takster som i prislisten, intet tillæg for Lovable: SMS 1,36 kr (≈ 0,43 DKK), udgående opkald 0,92 kr/min (≈ 0,29 DKK), stemmeagent oveni 2,50 kr/min (≈ 0,78 DKK). Den præcise prisliste findes på
/cenik.
Prøv det med det samme
Opret en konto, og de første 50 kr i saldo er på os.