Serve a recording's transcript as timed turns
The recording metadata the Media Player and the Call Log read now carries transcriptTurns (each turn's start, end, text and speaker: one of our members by id, t...
A Call Log for the member and their reporting line
GET /api/voip/calls/log reads PHONE_CALL_LOG by the indexed time range of the members in view (self + everyone below on the manager field, the owner sees all, t...
Let MANAGE_SAVED_TEXTS read and change saved texts
/api/voip/sms/text-templates accepts the narrow MANAGE_SAVED_TEXTS right beside MANAGE_VOIP_SETTINGS for its writes, and beside ACCESS_VOIP for its reads, so a ...
A provider's voice agent answers to the SI's call gate, by the SI's own name
A stream no longer reaches JustCall's voice agent directly. kamoai-service decides a call, and only an SI with no line of its own takes this path, to the voice ...
A landed call, text or email tells open screens
The contact tracker now announces each communication on the floor's domains, so a call the phone system reports reaches the board at once instead of on the next...
A lead calling back a shared number tells the member a stream worked for
The call rings on JustCall's side, where Kamo can't move it, so the live call signal goes to the routed member.
Streams text from the member's own number, place SI calls, and hear every reply
/internal/voip/automation sends a stream's text from the member's sole number, else the org's main line with a reply route back to the member, and places an SI ...
Feed a lead's last contact from real calls, honestly
Two capabilities say what a provider really reports: whether calls connected and how long they ran. Call evidence is built from those, so a limited provider rec...
A re-hired SI gets its old extension back when it is still free (TPSIREHIRE)
Re-provisioning a RETIRED line on the same phone server prefers the line's previous extension when nobody has taken it since; otherwise the next free one in the...
A practice's patient chart hears a patient's replies, STOP/START and delivery receipts
PatientSmsRelay posts (X-Internal-Auth, off the carrier's thread, bounded queue, never throws) to SecurityService **************** - every inbound text after de...
Refuse a phone extension past the organization's licenses
Owner rule 2026-10-22: per-user add-ons bill the licenses purchased; how many extensions may be in use is limited only by them. Before an extension is put into ...
Keep the pictures and files people text in, for every provider (SITP MMS)
VOIPService stored only the words of an inbound MMS, so nobody (person or SI) could see what was texted in. Now every inbound rail reads its media and VOIPServi...
The softphone's own surfaces check ACCESS_VOIP, and members get a session door to text templates (SITP TP11)
- CallController (call history, own voicemail list/read/archive, queues, agent state), missed-calls-seen, the do-not-contact check and SMS send now check ACCE...
Settings β Phone β Do not block β the API, the suggestions, and STOP texts that skip the company's own lines
Owner 2026-10-15: "remove it and add it to a do-not-block list". The allowlist beside the do-not-contact list, for the organization's own numbers and staff line...
The organization's do-not-contact list β VOIPService owns it, texts check it, STOP and START write it
Owner 2026-10-15: one company-wide do-not-contact list per organization, scoped per channel ("Only that channel"). - DDL **************** (DO_NOT_CONTACT, DO_N...
Ai-lines names the number a missed call can be returned to
Each line of /ai-lines?orgId= carries callbackNumber: the SI's own line, else a number assigned to it, else its phone server's main number, else the org's only ...
Decision 4 on every recording read β participants, their chain, VIEW_CALL_LOGS, a linked lead's readers, in every org (KamoCollab CP05 Task 21)
RecordingController now runs tenancy (404), then the PHI capability (403), then CallRecordingAccess through access/RecordingAccessService (403 RECORDING_NOT_PER...
The CP05 DDL for Confidential markers on calls
KamoCollab CP05 Task 5 (spec 5.1, D8, D27): recordings and phone_call_log each gain is_confidential, confidential_set_by_member_id and confidential_set_at. Hand...
V7 β which colleague is calling from an internal extension (SP92 calls)
GET **************** (KAMOAI_INTERNAL_SECRET) answers the active member of the phone server's org that the extension is ACTIVE-ly assigned to, or 404 NO_MEMBER....
Shared voicemail boxes, and FreePBX voicemail audio from the message itself
Shared boxes (SP98-N-2). A mailbox on the PBX that no Kamo extension is (K1M1's 8100, "KamoCRM Main Line") was never synced. The sweep's single AMI session now ...
The PBX's managed policy carries the toll-fraud block list (SP93 T7)
/internal/voip/pbx-config answers blockedPatterns, the phone server's guards as Asterisk patterns **************** for kamo-asterisk-support's [kamo-toll-fraud-...
The phone server's toll-fraud guards for KamoAI's pre-flight check (SP93 T6)
GET **************** answers {blockInternational, blockPremiumRate, blockHighRiskAreaCodes, blockedPrefixes} for one phone server, read by its id; a server that...
New extensions start as the phone server's outbound setting says (SP93 T5)
A new extension, a person's or an AI member's line, now starts allowed to dial outside only when its phone server's newExtensionsOutboundAllowed setting is on. ...
The phone server's outbound policy in the AI voice settings (SP93 T4)
GET and PUT **************** carry SP93's five fields: newExtensionsOutboundAllowed, blockInternational, blockPremiumRate, blockHighRiskAreaCodes and blockedPre...
The DDL file for the phone server's outbound policy
SP93 Task 1. Five NOT NULL DEFAULT columns on AI_VOICE_INSTANCE_SETTINGS: **************** BLOCK_INTERNATIONAL, BLOCK_PREMIUM_RATE, BLOCK_HIGH_RISK_AREA_CODES a...
The phone server's team line for an AI member's unnamed transfer
SP95 D10: the AI voice settings take defaultTransferExtension (digits, like the fallback; blank clears it) and echo it. The new internal route GET *************...
The DDL file for the phone server's team line
SP95 Task 2. **************** a nullable VARCHAR(20) that holds the extension an AI's unnamed transfer rings (the team line, 8200 on the k1m1 FreePBX). Hand-app...
Teams calling connects send the api.kamouniverse.com redirect
The owner has added **************** to the platform Microsoft app, keeping the api.kamocrm.com one. Both hosts serve the path. Completes aa7b608, which moved R...
RingCentral connects send the api.kamouniverse.com redirect
The owner added **************** to the platform RingCentral app and kept the api.kamocrm.com one; both hosts serve the path. Teams calling uses the same path o...
PBX policy feed and AI voice admin endpoints
V7 GET /internal/voip/pbx-config (cluster secret) answers kamo-asterisk-support's policy pull through APIService and records the helper's heartbeat; a Redis fai...
Provision, retire and resolve AI voice lines
Retire deletes the PBX extension only when it is still there, and a phone server in use that refuses the delete keeps the line and answers 502, so the minute SI...
AI voice lines on FreePBX, KamoPBX and Telnyx
A refused FreePBX addExtension (status false, no GraphQL error) now fails the AI line instead of recording one that rings nothing. Telnyx number lookups send th...
KamoAI internal surface guarded by its own secret
/api/voip/internal/** (SP13: AI lines, SIP credentials for LiveKit) takes KAMOAI_INTERNAL_SECRET, not the cluster secret; the cluster prefixes keep theirs. The ...
AI voice lines, per-server AI voice settings, outbound allow-list as data
Announce new voicemails β live panel, phone push and a card
A voicemail the sweep writes for the first time, on an extension with an assigned member and received in the last 24 hours (spec D17), now publishes voip.voicem...
Pre-assign JustCall phone server id for callback URL
The new-phone form generates a UUID before create so the member can paste the webhook callback URL into JustCall while requesting API credentials. Create accept...
Serve JustCall callback URL for phone server setup
Adds GET /api/voip/setup so the settings UI can show the exact per-instance webhook URL without hardcoding the deployment host.
A number can be shared by several members, and one of them receives it
A single OWNER_MEMBER_ID could say "this number belongs to Sarah" and nothing else. Real desks are not shaped like that: a support line is answered by four peop...
Serve the inbound webhook URL, from one definition
An administrator adding a text provider has to paste Kamo's inbound URL into the carrier's own console, and nothing told them what it was. Missing that step has...
Actually create the Telnyx account setup, carry MMS, and let a carrier-only org hold threads
Three gaps, and the first was the feature not working at all. TELNYX PROVISIONING WAS DEFINED AND CALLED BY NOTHING TelnyxProvider.provision(), ensureMemberCr...
Route texts by NUMBER, and add Telnyx on both sides of it
An organization can buy its DIDs and its texting from one company and answer the calls with another. Kamo could not express that: a member's texting was a prope...
Like what you see shipping?
All of it arrives in your workspace on its own. Start on the free plan and read this page again in a month.
