Kodexempel

Så här integrerar du 46elks i din applikation.

Skicka SMS

Skicka ett SMS via 46elks REST API

import httpx

async def send_sms(to: str, message: str) -> dict:
    """Skicka SMS via 46elks."""
    async with httpx.AsyncClient() as client:
        resp = await client.post(
            "https://api.46elks.com/a1/sms",
            auth=(ELKS_USER, ELKS_PASS),
            data={
                "from": ELKS_NUMBER,
                "to": to,
                "message": message,
            }
        )
        resp.raise_for_status()
        return resp.json()

# Användning
await send_sms("+46701234567", "Hej! Dags att byta till sommardäck.")

SMS Webhook

Ta emot inkommande SMS från 46elks

from fastapi import Request
from database import get_customer_by_phone, log_sms

@app.post("/webhooks/sms")
async def sms_webhook(request: Request):
    """Ta emot inkommande SMS från 46elks."""
    form = await request.form()
    from_number = form.get("from")
    message = form.get("message", "").strip().upper()
    elks_id = form.get("id")

    # Hitta kund
    customer = get_customer_by_phone(from_number)
    customer_id = customer["id"] if customer else None

    # Logga SMS
    log_sms(
        customer_id=customer_id,
        direction="in",
        from_number=from_number,
        to_number=ELKS_NUMBER,
        message=form.get("message"),
        elks_id=elks_id,
        sms_type="svar",
    )

    # Hantera svar
    if message == "JA" and customer:
        await send_sms(from_number, f"Toppen! Boka din tid: {BASE_URL}/book/{customer['booking_token']}")

    return {"status": "ok"}

Nummeruppslag

Hämta info om ett telefonnummer

import httpx

async def lookup_number(phone: str) -> dict:
    """Slå upp telefonnummer via 46elks."""
    async with httpx.AsyncClient() as client:
        resp = await client.get(
            f"https://api.46elks.com/a1/lookup/{phone}",
            auth=(ELKS_USER, ELKS_PASS),
        )
        if resp.status_code == 404:
            return {"error": "Numret hittades inte"}
        resp.raise_for_status()
        data = resp.json()
        return {
            "name": data.get("name"),
            "address": data.get("address"),
            "city": data.get("city"),
            "operator": data.get("operator"),
        }

# Användning
info = await lookup_number("+46701234567")
print(info)  # {'name': 'Anna Lindberg', 'city': 'Stockholm', ...}

WebSocket Röst

Bridga 46elks WebSocket till ElevenLabs AI

import asyncio, websockets, json, base64

async def handle_call(elks_ws):
    """Bridga 46elks WebSocket till ElevenLabs Conversational AI."""
    uri = f"wss://api.elevenlabs.io/v1/convai/conversation?agent_id={ELEVENLABS_AGENT_ID}"
    headers = {"xi-api-key": ELEVENLABS_API_KEY}

    async with websockets.connect(uri, additional_headers=headers) as el_ws:
        async def elks_to_elevenlabs():
            async for msg in elks_ws:
                data = json.loads(msg)
                if data.get("event") == "media":
                    audio = data["media"]["payload"]  # base64 mulaw 8kHz
                    await el_ws.send(json.dumps({
                        "user_audio_chunk": audio
                    }))

        async def elevenlabs_to_elks():
            async for msg in el_ws:
                data = json.loads(msg)
                if data.get("type") == "audio":
                    audio = data["audio"]["chunk"]  # base64 PCM
                    await elks_ws.send(json.dumps({
                        "event": "media",
                        "media": {"payload": audio}
                    }))

        await asyncio.gather(elks_to_elevenlabs(), elevenlabs_to_elks())

@app.websocket("/ws/call")
async def ws_call(websocket: WebSocket):
    await websocket.accept()
    await handle_call(websocket)

Click-to-call

Koppla ihop två parter med ett API-anrop

import httpx

async def click_to_call(staff_phone: str, customer_phone: str) -> dict:
    """Ring upp personal, koppla sedan vidare till kund.

    46elks ringer staff_phone först. När de svarar,
    kopplas de automatiskt till customer_phone.
    """
    async with httpx.AsyncClient() as client:
        resp = await client.post(
            "https://api.46elks.com/a1/calls",
            auth=(ELKS_USER, ELKS_PASS),
            data={
                "from": ELKS_NUMBER,
                "to": staff_phone,
                "voice_start": json.dumps({
                    "connect": customer_phone
                }),
            }
        )
        resp.raise_for_status()
        return resp.json()

# Användning: personal ringer kund via 46elks-nummer
result = await click_to_call(
    staff_phone="+46701234567",
    customer_phone="+46709876543"
)
print(result["id"])  # call_abc123...