Så här integrerar du 46elks i din applikation.
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.")
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"}
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', ...}
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)
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...