BETA Det här är en intern beta från 46elks — inte lanserad ännu. Saker kan gå sönder, förändras eller försvinna.
Demo av 46elks röst-API

Ring och beställ pizza med AI

En AI-röstassistent tar din beställning, skickar SMS-bekräftelse och håller koll på din pizza. Byggt med 46elks API + OpenAI.

📞 076-686 77 77

Ring numret och se beställningen dyka upp nedan—live!

Se pizzaköket

Beställningar dyker upp här i realtid

Ring numret ovan och se din order dyka upp. Allt drivs av 46elks röst-API.

Meny

Beställningar

🦌Inga beställningar ännu
Ring och beställ!

Om demot

Vad är pizzanummer.se?

Pizzanummer.se är en teknisk demo som visar hur man kan bygga en komplett AI-driven telefonbeställning med 46elks röst-API. Ingen riktig pizza levereras — men tekniken bakom är verklig.

📞

Röstsamtal via 46elks

Ditt samtal kopplas via 46elks WebSocket-API direkt till en AI-röstassistent som förstår svenska.

🤖

AI som förstår dig

OpenAI Realtime API driver konversationen. Röstassistenten förstår naturligt tal och sammanfattar din order.

💬

SMS-bekräftelse

När beställningen är klar skickas ett SMS via 46elks med orderdetaljer och en spårningslänk.

💻

Pizzaköket — live

Pizzaköket ovan visar ordrar i realtid. Hantera meny, ingredienser och orderstatus direkt.


Så fungerar det

Från samtal till pizza

Hela flödet — från att du ringer till att pizzerian börjar baka — sker automatiskt.

1

Du ringer 076-686 77 77

Samtalet kopplas via 46elks till vår server över WebSocket. Ingen väntetid, ingen kö.

2

AI tar din beställning

Röstassistenten presenterar menyn, hjälper dig välja, och bekräftar din order på svenska.

3

SMS + spårning

Du får ett SMS med din order och en länk där du kan följa status i realtid.

4

Pizzerian hanterar ordern

Pizzaköket visar nya ordrar live. Pizzerian uppdaterar status — kunden ser det direkt.


Under huven

Byggt med 46elks

Hela demot kör på en enda server och använder tre 46elks-funktioner.

🎙

Röst via WebSocket

46elks kopplar samtal som rå PCM-ljud över WebSocket. Vi bridgar det till OpenAI Realtime API.

💬

SMS-API

Orderbekräftelse, statusuppdateringar och spårningslänkar skickas via 46elks SMS.

📞

Telefonnummer

Svenskt mobilnummer allokerat via 46elks. Konfigurerat att peka på vår WebSocket-server.

Exempel — Konfigurera nummer med 46elks API
# Peka ett 46elks-nummer mot din WebSocket-server
curl -X POST https://api.46elks.com/a1/numbers/<nr> \
  -u <api_user>:<api_pass> \
  -d voice_start=wss://din-server.se/ws

# Skicka SMS-bekräftelse
curl -X POST https://api.46elks.com/a1/sms \
  -u <api_user>:<api_pass> \
  -d from=Pizzerian \
  -d to=+46701234567 \
  -d message=Din pizza är beställd!

Steg-för-steg

Bygg ditt eget pizzanummer

Allt du behöver är ett 46elks-konto, en server och en OpenAI API-nyckel. Här är hela processen.

Skapa konto & allokera nummer

Registrera dig på 46elks.com. Allokera sedan ett svenskt telefonnummer via API:et:

curl -X POST https://api.46elks.com/a1/numbers \
  -u <api_user>:<api_pass> \
  -d country=se \
  -d sms_url=https://din-server.se/sms \
  -d voice_start=wss://din-server.se/ws

voice_start pekar på din WebSocket-server där samtalet kopplas.

Sätt upp WebSocket-servern

När någon ringer ditt nummer öppnar 46elks en WebSocket-anslutning till din server. Ljud skickas som rå PCM-data (8kHz, 16-bit, mono). Du behöver:

voice_agent.py

WebSocket-server som tar emot ljud från 46elks, skickar det till OpenAI Realtime API, och spelar upp svaret tillbaka.

web_app.py

Flask-app som tar emot beställningar från AI:n, lagrar i SQLite, skickar SMS via 46elks och visar pizzaköket.

menu.py

Menydata som Python-listor. AI:n får menyn som text i sitt systemprompt. Lätt att ändra och utöka.

.env

API-nycklar: ELKS_API_USER, ELKS_API_PASS, OPENAI_API_KEY och PIZZA_PHONE.

Bridga 46elks ↔ OpenAI

Koppla samman två WebSockets: en från 46elks (inkommande ljud) och en till OpenAI Realtime API (AI-svar). Ljudet måste konverteras:

46elks → OpenAI: PCM 8kHz → base64-encode → skicka som input_audio_buffer.append

OpenAI → 46elks: Ta emot response.audio.delta → base64-decode → resampla till 8kHz → skicka tillbaka

Definiera AI-verktyg (function calling)

OpenAI Realtime API stöder function calling. Definiera en submit_order-funktion som AI:n anropar när kunden är klar:

# Verktygsdefinition för OpenAI
{
  "name": "submit_order",
  "description": "Skicka in beställningen",
  "parameters": {
    "customer_name": { "type": "string" },
    "items": [{
      "pizza_nr": "integer",
      "qty": "integer",
      "modifications": "string"
    }]
  }
}

När AI:n anropar funktionen, posta beställningen till din Flask-app och skicka SMS via 46elks.

Skriv AI-promptet

Promptet är nyckeln — det bestämmer hur AI:n beter sig på telefon. Här är ett förenklat exempel baserat på vårt riktiga prompt:

AI-prompt — Systeminstruktioner för röstassistenten
Du är en trevlig receptionist på [Din Pizzeria].
Du svarar på svenska. Du tar emot pizzabeställningar via telefon.

Här är menyn:
--- Klassiska pizzor ---
1. Margherita (95 kr) — Mozzarella, tomat, basilika
2. Vesuvio (105 kr) — Skinka
3. Capricciosa (115 kr) — Skinka, champinjoner
... (hela din meny här)

--- Drycker ---
Coca-Cola 33cl (25 kr)
Fanta 33cl (25 kr)

Så här gör du:
1. Hälsa kunden välkommen
2. Fråga vad de vill beställa
3. Om kunden säger ett pizzanummer eller namn, bekräfta valet
4. Fråga om de vill ha något att dricka
5. Fråga om de vill ha fler pizzor
6. Fråga kundens namn
7. Sammanfatta beställningen med totalpris
8. Anropa submit_order med beställningen
9. Avsluta samtalet artigt

Var trevlig och naturlig, som en riktig pizzeria-receptionist.
Håll svaren korta — det är ett telefonsamtal.

# Tips: Lägg till regler för ändringar, tillval, och ej tillgängliga rätter dynamiskt.
Tips för bra prompts: Ge AI:n en tydlig personlighet och konkreta steg. Inkludera hela menyn med priser i promptet — AI:n behöver det för att räkna rätt. Använd VERSALER för viktiga regler. Håll instruktionerna till max ~2000 ord för bäst prestanda.
Dynamiskt prompt: Bygg promptet vid varje samtalsstart. Hämta listan över ej tillgängliga rätter från databasen och lägg till i promptet — då kan personalen styra menyn i realtid utan att starta om servern.
Komplett flöde — Python-pseudokod
# 1. 46elks ringer din WebSocket-server
async def handle_call(elks_ws):
    # 2. Öppna anslutning till OpenAI Realtime API
    openai_ws = await connect("wss://api.openai.com/v1/realtime")

    # 3. Skicka konfiguration + prompt
    await openai_ws.send({
        "type": "session.update",
        "session": {
            "instructions": build_prompt(),
            "voice": "alloy",
            "tools": [submit_order_tool],
        }
    })

    # 4. Bridga ljud i båda riktningarna
    async for msg in elks_ws:
        # PCM från 46elks → base64 → OpenAI
        await openai_ws.send({
            "type": "input_audio_buffer.append",
            "audio": base64_encode(msg)
        })

    # 5. När AI anropar submit_order → spara + skicka SMS
    def on_function_call(name, args):
        requests.post("http://localhost:5000/api/orders", json=args)
        send_sms_via_46elks(args["customer_phone"], "Din pizza är beställd!")

Från idé till produktion

Björns tips till dig som vill bygga

Björn Skyttberg
Hej! Jag heter Björn och jag byggde pizzanummer.se på en eftermiddag. Hela projektet — från tom server till fungerande AI-pizzeria — gjordes med Claude Code (Anthropics CLI-verktyg) och en billig Hetzner-server. Här är exakt hur jag gick tillväga.

⚙ Steg 1: Hetzner-server för 5 EUR/mån

Jag använder en Hetzner Cloud CX22 (2 vCPU, 4 GB RAM, Ubuntu 24.04). Det räcker gött för det här. Så här sätter du upp den:

# SSH in på din nya server ssh root@din-server.se # Installera det du behöver apt update && apt install python3-pip python3-venv nginx certbot python3-certbot-nginx # Skapa projektmapp mkdir /home/pizza && cd /home/pizza python3 -m venv venv source venv/bin/activate pip install flask websockets requests python-dotenv

🚀 Steg 2: DNS + SSL

Peka din domän mot serverns IP (A-record). Sen fixar Certbot SSL åt dig:

# Hämta SSL-certifikat certbot --nginx -d pizzanummer.se -d www.pizzanummer.se

Nginx behöver proxy:a både HTTP (Flask-appen) och WebSocket (röstagenten). Lägg till proxy_pass och Upgrade-headers för /ws-pathen.

🤖 Steg 3: Claude Code gör jobbet

Här är det magiska. Istället för att skriva all kod själv promptade jag Claude Code att bygga hela projektet. Jag beskrev vad jag ville ha och Claude skrev koden, skapade filerna och laddade upp dem till servern via SSH.

Det här är ungefär prompten jag började med:

Min prompt till Claude Code
Björn:
Jag vill bygga en demo för 46elks som visar röst-API:et.
Konceptet: en fejkad pizzeria där man ringer ett nummer
och en AI tar ens beställning.

Jag behöver:
1. En WebSocket-server (Python) som tar emot samtal från
   46elks och bridgar till OpenAI Realtime API
2. En Flask-app med pizzakök där pizzerian ser ordrar
3. SMS-bekräftelse via 46elks när ordern är klar
4. En tracking-sida som kunden får i SMSet

Servern är på root@din-server.hetzner.com
46elks API-credentials och OpenAI-nyckel lägger jag i .env

Bygg allt och deploya på servern.

Claude:
Jag börjar med att sätta upp projektstrukturen...
[Claude skapar menu.py, voice_agent.py, web_app.py,
 templates, systemd-services, nginx-config
 — och laddar upp allt via SSH]

💡 Steg 4: Iterera med Claude Code

Det fina med Claude Code är att du itererar snabbt. När grunderna var på plats fortsatte jag prompta:

Varje ändring: beskriv vad du vill → Claude skriver koden → laddar upp via SSH → startar om tjänsten. Hela loopen tar några minuter.

🔌 Steg 5: Koppla ihop allt

När koden är på plats behöver du:

# Skapa systemd-services cat > /etc/systemd/system/pizza-voice.service << EOF [Unit] Description=Pizza Voice Agent After=network.target [Service] WorkingDirectory=/home/pizza ExecStart=/home/pizza/venv/bin/python voice_agent.py Restart=always [Install] WantedBy=multi-user.target EOF systemctl enable pizza-voice pizza-web systemctl start pizza-voice pizza-web

🎯 Mina viktigaste lärdomar

Total kostnad: Hetzner-server ~50 kr/mån + 46elks-samtal & SMS (betala per användning) + OpenAI Realtime API (~2 kr per samtal). Ingen fast avgift för 46elks.

Vanliga frågor

FAQ

Nej! Pizzanummer.se är en teknisk demo. Ingen pizza levereras. Syftet är att visa vad man kan bygga med 46elks röst-API och OpenAI.

46elks är ett svenskt API för telefoni och SMS. Med några rader kod kan du ringa samtal, skicka SMS och bygga avancerade röstapplikationer. Över 4000 företag använder 46elks.

Absolut! Skapa ett gratis konto på 46elks.com, allokera ett telefonnummer och koppla det till din WebSocket-server. Kombinera med OpenAI för AI-driven rösthantering.

Det är gratis att skapa ett 46elks-konto och testa. Du betalar bara för faktisk användning — samtal och SMS. Inga bindningstider eller fast avgift.

Röstassistenten i denna demo pratar svenska. Men 46elks röst-API är språkneutralt — det vidarebefordrar ljud. AI-modellen (OpenAI) stöder 50+ språk.

46elks skickar samtalets ljud som rå PCM-data över en WebSocket-anslutning till din server. Du kan processa, spela upp eller bridga ljudet i realtid — perfekt för AI-röstassistenter.

Bygg din egen röstlösning

Skapa ett gratis 46elks-konto och börja bygga. Telefonnummer, röst-API och SMS — allt via ett enkelt API.

Skapa konto gratis → Läs dokumentationen
Relaterade demos

Fler demos från 46elks