An AI receptionist that actually picks up.
Point a phone number at CodeB and a real-time voice AI answers it. It speaks any language, follows the script you wrote, takes messages, transfers to a human softphone when the caller asks for one, and emails you a transcript when it hangs up. No call centre, no IVR tree, no “press 1 for reservations”. Pluggable real-time voice backend, dispatched per virtual number, runs inside your own deployment.
One click opens a browser call to our public demo line. Say hello in any language — the model picks up, replies in sub-second latency, and follows the script. No sign-in, no install.
Already shipping — configure on the virtual numbers page. Pick a real-time voice Mode on any number you own, paste a system prompt, save. The next inbound call is answered by the AI.
What it does
Real-time, not record-and-respond
Full-duplex audio over the same SIP leg the caller dialled. The model hears the caller as they speak, can be interrupted mid-sentence, and replies with sub-second latency. No “please wait while I think”.
Real-time voiceAny language, on the fly
The model detects the caller’s language and replies in kind. Switches mid-call if the caller switches. Your script can pin a default (“always greet in German, switch only if asked”) or let the model choose.
MultilingualOne persona per number
Each virtual number gets its own system prompt, voice, opening line, and warm-up delay. A hotel can run +356 ... 100 as the front desk, ... 101 as the restaurant, ... 102 as the spa — same AI engine, three personalities.
Per-number configTransfer to a human
The receptionist decides when to transfer using a structured tool call — not a brittle phrase match. It can transfer to any registered SoftPhone (internal extension) and, when the operator has added the number to the per-tenant whitelist, to any external phone. Off-list numbers are refused fail-closed. The AI says it’s connecting you and drops out.
Whitelisted hand-offKnows when to hang up
A second tool lets the receptionist end the call itself once the caller is done. The reason it gives (“caller said goodbye”, “rude / abusive”, “voicemail loop detected”) lands in the transcript and the CDR so you can see why each call ended.
Self-terminateOne room per caller
Set the room to random and every browser call mints a fresh isolated room name. Two visitors landing on the same dial-in URL never end up in the same room, so the AI never accidentally hears the previous caller’s conversation.
Transcript + summary by email
Every call ends with a full transcript and a one-paragraph summary in your inbox. Recipients are configured per virtual number; the format reads like a human took notes. Nothing else is retained on the server by default.
No silent recordingsDrops into your existing PBX
CodeB doesn’t replace your phone system — it complements it. Route a single DID (or a single internal extension) to the bridge and the AI receptionist is online; the rest of your numbers stay on whatever you already have.
SIP-friendlyWorks for office and softphone too
Inbound from the PSTN, inbound from a registered SIP softphone, inbound from a CodeB Webphone web user — all three reach the same AI. Same script, same voice, same transcript.
Three answer pathsTenant-isolated
Each tenant points at its own appsettings file, brings its own provider credentials, gets its own transcripts. A hotel chain running on a shared CodeB host keeps each property’s receptionist separate.
Multi-tenantFall-back to TTS
If the configured provider credentials are missing or the model is unreachable, the bridge falls back to a server-side TTS auto-reply so the caller never hits dead silence. The transcript records the fallback so you know it happened.
Always answersSample industry: hospitality
Hotels, restaurants, spas, vacation rentals, B&Bs — anywhere a small team has to answer the phone in any language at any hour. The AI receptionist takes the obvious calls so the human team handles the ones that matter.
Three numbers at a Mediterranean hotel
| Number | Persona | What it handles |
|---|---|---|
| +356 ... 100 | Front desk | Room availability, check-in / check-out times, late arrival, lost keys, “is the pool open?”. Books from the rate sheet you paste into the prompt. Anything booking-system-related — transfer to the duty manager. |
| +356 ... 101 | Restaurant | Table reservations, menu questions, dietary restrictions, opening hours. Reads back the booking, emails the maître d’ the transcript. |
| +356 ... 102 | Spa & concierge | Treatment availability, prices, taxi bookings, “where’s the nearest pharmacy?”. Transfers to concierge for anything off-script. |
All three personas live in the same deployment, share the same staff softphones for transfers, and roll up into one transcript folder. No per-seat licensing, no per-minute AI billing surcharge from a third party — the bridge talks directly to the provider with your own credentials.
Configuring a number
Open virtual numbers in the admin, add a row, pick the real-time voice mode, paste your prompt. Save and dial it. That’s the whole setup.
How it’s wired
Six moving parts; each is replaceable.
| Component | What it does |
|---|---|
| Virtual number | Admin record that says “when this number is dialled, dispatch the call to handler X with config Y”. Stored per-tenant in App_Data/<tenant>/appsettings.json. |
| InboundDispatcher | Routes the inbound INVITE to the right handler based on the virtual-number record. Same dispatcher handles AI mode, TTS auto-reply, room join, and softphone fan-out — one place to add new modes. |
| VoiceHandler | Owns the call for its lifetime. Answers the SIP leg, opens a websocket to the configured real-time voice provider, streams audio both directions, watches for transfer intent, writes the transcript when the call ends. |
| Audio pipeline | G.711 µ-law on the SIP side (RFC 3551 baseline, every carrier supports it), PCM 16 kHz on the model side, with proper resampling so the caller doesn’t get chipmunked. |
| Transcript writer | Per-call JSONL in App_Data/<tenant>/transcripts/, optional email via your existing SMTP pickup directory. Nothing is sent to a third party. |
| CDR | Same call detail record as any other CodeB call — disposition (answered / transferred / fallback-tts), duration, language detected, transfer target if any. Visible on cdr.html. |
Privacy posture
Two facts to know:
- Audio streams to whichever real-time voice provider you configure. That provider is the only third party in the loop — everything else stays on your server. Choose the model and region that suit your jurisdiction; CodeB just forwards.
- Transcripts live in
App_Data/<tenant>/transcripts/on your machine, plus the inbox(es) you nominated. Nothing is stored on the provider’s side beyond the live session (subject to that provider’s own terms). No silent recordings of the call audio are kept anywhere by default.
What’s in scope, what’s not
| In scope today | Not (yet) |
|---|---|
| Live voice answering with sub-second latency | Outbound autonomous calling — AI initiates calls to customers |
| Multilingual on-the-fly | Real-time integration with third-party PMS / booking engines (planned) |
| Per-number persona, voice, warm-up | Voice cloning of a specific staff member |
| Transfer to staff softphone on intent | Multi-party conferencing the AI into an existing call |
| Per-call transcript + email summary | Long-term call memory across separate sessions (next phase) |
Other industries it fits
Dental & medical clinics
Appointment reschedules, opening hours, “is Dr X in today?”, prescription pickup status. Transfer to reception on intent.
Property management
After-hours maintenance triage. Asks for property, issue, urgency, transfers to the on-call agent or takes a message.
Legal / accounting
New-client intake. Takes name, matter type, callback number; emails the partner a summary; books a 15-minute slot.
Trades & services
Plumber, electrician, locksmith. Captures address, problem, urgency. Sends an SMS-style summary to the technician’s WhatsApp via your usual integration.
FAQ
| Whose API key does it use? | Yours. The bridge reads provider credentials from per-tenant settings; you bill the provider directly, no markup. Invalid credentials fall back to the TTS auto-reply path so the caller still gets a useful response. |
| What happens if the voice provider is down? | The bridge auto-falls back to the per-virtual-number TTS auto-reply. The caller still gets a useful response and your transcript records the fallback. |
| Can I A/B two prompts? | Yes — run them on two different virtual numbers and compare transcripts. The bridge tracks each prompt’s call count + duration + transfer rate in the CDR. |
| What audio quality? | G.711 µ-law (8 kHz, PCMU payload 0) on the SIP leg — the safest baseline that every carrier and softphone accepts. The configured model receives 16-bit PCM at the rate it expects, with proper resampling; chipmunk effects from earlier builds have been eliminated. |
| Will it disconnect after 32 seconds like cheap SIP gateways? | No. We removed the early 180 Ringing that triggered the carrier-side Timer C 32-second drop. Sessions stay up for as long as the caller and the AI want to talk. |
| How do transfers work? | The model uses a structured transfer_to_user tool. The bridge looks up the username against the SIP registrar first — if it’s a registered SoftPhone, the AI’s SIP leg gets a SIP REFER to that contact and drops out. If the username looks like a phone number, the bridge checks the per-tenant whitelist and (if allowed) loops the call back through the public listener for outbound PSTN dialling. Non-allow-listed numbers are refused; the receptionist tells the caller and offers to take a message. |
| How does it know when to hang up? | A second hangup tool gives the model an explicit way to end the call with a reason (e.g. caller said goodbye, abusive, voicemail loop). The reason lands in the transcript and the CDR so you can spot patterns later. |
| What stops the receptionist dialling +1-900 premium-rate numbers? | Two gates. (1) The per-tenant whitelist — only numbers an admin explicitly added can be reached. (2) The bridge’s FraudGuard runs independently on the loopback INVITE, so even if the model somehow asked for an off-list number, the trunk would refuse it. |
| Can the caller tell it’s an AI? | If they listen carefully, eventually yes. Many won’t. The honest answer in your script is the right one; we recommend disclosing on first contact (“Casa Mediterraneo, our virtual assistant speaking”) — this is what callers prefer and what the EU AI Act will require by 2026 anyway. |
Set up on a virtual number → virtual-numbers.html · Browse the live directory → virtual-numbers-overview.html · want the rest? All features →