Using media proxy with the CUCM Call Recording leg - simplifies implementation.
The Alternative is to use a CUBE between CVP and CUCM with SIPREC / Media Forking to send a copy of the call to the transcription server - which would work for inbound calls to the agents. But if we do not want all agent calls to get transcribed this makes configuration more difficult.
A key advantage is not having to have a dedicated CUBE. However currently if early offer is used then SRTP (Secure RTP) is not sent and this would likely be a reqiurement.
If outbound calls and inter-agent calls are also needed to be transcribed (sent to the cloud transcription server), then the call flow is complex and adds complexity to call flows requiring all calls to route via a CUBE.
There are issues / design flaws with using the media proxy which hopefully Cisco will fix in future versions of this product.
CUCM sends 2 x SIP one way audio calls to the on prem call recording platform
CUCM sends 2 x SIP one way audio calls to the on Cisco CUBE Media Proxy
The Recording functionality of CUCM and it's phones allows a copy of the audio call to be sent to a Recorder.
Using the Media proxy - we can send calls to a CUBE instead or directly to a call recorder. The CUBE can then multiple copies of the call to a number of recorders (such as additional recorders or transcription services).
Example - send the call to the existing on prem call recording platform AND to a cloud recorder which could be used for transcription purposes.
With this example it would be typical that the call from CUCM to the CUBE (inbound dialpeer) as well as the outbound dial-peer to the on prem recorder would use SIP and RTP (non secure), while the dial-peer to the cloud recorder would typically require SIPS and SRTPS (secure).
How CUCM sends a call recordings from Agent's phone to an on prem Call recording platform such as Verint / Nice / Redbox etc.
Example of one of the two SIP INVITE's which CUCM would to the Recorder for each phone call
INVITE sip:[email protected]:5060 SIP/2.0 Via: SIP/2.0/TCP 123.123.123.100:5060;branch=z9hG4bKFBC714B7 Remote-Party-ID: "Telecoms_Agent_1 (Bob Bobster)" <sip:[email protected]>;party=calling;screen=yes;privacy=off From: "Agent_1 (Bob Bobster)" <sip:[email protected];x-nearend;x-refci=17687488;x-nearendclusterid=ACME-TST-UCCE-V11;x-nearenddevice=SEP000700000009;x-nearendaddr=61001;x-farendrefci=17687487;x-farendclusterid=ACME-TST-UCCE-V11;x-farenddevice=UCCE-CUBE-A;x-farendaddr=+353858712345;x-sessionid=059a1ef36a92e7f3a278d8ba17687488>;tag=4B2E4382-2704 To: <sip:[email protected]> Date: Mon, 20 Apr 2026 08:37:28 GMT Call-ID: [email protected] Supported: timer,resource-priority,replaces Min-SE: 1800 Cisco-Guid: 0681531776-0522279575-0000005268-0673060874 User-Agent: Cisco-SIPGateway/IOS-17.12.5a Allow: INVITE, OPTIONS, BYE, CANCEL, ACK, PRACK, UPDATE, REFER, SUBSCRIBE, NOTIFY, INFO, REGISTER CSeq: 101 INVITE Timestamp: 1776674248 Contact: <sip:[email protected]:5060;transport=tcp> Expires: 180 Allow-Events: telephone-event Max-Forwards: 69 Session-ID: a39b6d59450b50fca557a2cef4fae6ab;remote=00000000000000000000000000000000 Session-Expires: 1800 Content-Length: 0
The Recording platform uses the SIP FROM Meta data header in the SIP INVITE which contains data such as the CUCM Call ID, Agent extension and Customer phone number. It uses the CUCM Call ID to link the call recording to the CTI events (i.e. it uses the Call ID to link). This enabled the recorder to determine more information about the call such as when the call has been placed on hold, the Calling Party Names etc.
In the above example SIP trace 17687488 is the reference call id.
For each actual Agent phone call - there are two SIP one way audio calls sent to the recorder (or CUBE Media Proxy)
The Call ID used in the SIP From Header, i.e. x-refci=17687488 is the
Here is an example FROM header and a line from the corresponding CTI log showing bothe the GCH and CH IDs
From: "Telecoms_Agent_1 (Bob Bobster)" <sip:[email protected];x-nearend;x-refci=34446813;x-nearendclusterid=ACME-TST-UCCE-V11;x-nearenddevice=SEP0000000000F9;x-nearendaddr=61001;x-farendrefci=34446814;x-farendclusterid=ACME-TST-UCCE-V11;x-farenddevice=SIP-TRK-IPT-CUCM-AB;x-farendaddr=00851231234;x-sessionid=059a1ef36a92e7f3a278d8ba34446813>;tag=6246346~ca582c77-291a-4154-8668-282fb33b0cee-34446818
22887421.000 |09:40:04.921 |SdlSig-I |CtiNewCallNotify |ready |CTIDeviceLineMgr(1,200,13,1) |StationCdpc(2,100,198,487) |1,200,21,747.88107^10.123.123.6^SEP0000000000F9 |[R:N-H:0,N:1,L:0,V:0,Z:0,D:0] LH=1|1411 GCH=1|21278 CH=2|34446813 Held CH=0|0 State=4(CtiDialtoneState) Reason=1 Origin=4 DeviceName=SEP0000000000F9 CGPN=[ DN=61001 uDN=61001 NumPI=T Part=PH_STD_P VmBox= NumType=48 Name=Telecoms_Agent_1 (Bob Bobster) UniName=Telecoms_Agent_1 (Bob Bobster) NamePI=T Locale=33 PU=2 Device=SEP0000000000F9 GlblCgpn=] CDPN=[ DN= uDN= NumPI=F Part= VmBox= NumType=48 Name= UniName= NamePI=T Locale=1 PU=0 Device=] LRP=[ DN= uDN= NumPI=T Part= VmBox= NumType=0 Name= UniName= NamePI=T Locale=1] OCDPN=[ DN= uDN= NumPI=F Part= VmBox= NumType=48 Name= UniName= NamePI=T Locale=1] AuxData=F FarEndCMId=0 EndpointType=0 RIU=F Privacy=F CallPresent=T FeatPriority=1 Feature=0 AttrType=0 LineId [DN= Part=] IPAddrMode=3 IsConsCallDueToRollover=F UniqCallRef=000000000000531E020D9DDD00000000 CgpnIPv4Addr=0 CgpnIPv6Addr= CallingMultiMediaCap=0F0 CalledMultiMediaCap=0F0 CallingPartyMultiMediaMask=0 CalledPartyMultiMediaMask=0 Session-ID: Device= 059a1ef36a92e7f3a278d8ba34446813; Remote= AlwaysDisplayOrignalDialedNumber=F OCDPN=[ DN= uDN= NumPI=F Part= VmBox= NumType=0 Name= UniName= NamePI=F Locale=1]
So for this call we have a:
We can see that the ID used in the FROM header is the CH ID and this is how Verint or any other Call Recording platform can use a CTI feed from CUCM to gather more data about the call.
When an agent places a customer on hold - the customer hears hold music. From a recording point if view, CUCM ends (SIP BYE) then 2 x SIP calls to the recorder and when taken off hold new calls are re-established with the same IDs.
Likewise with Consults and Conferences. i.e. when an agent first starts a consult call - the customer goes on hold (so the recording stops) - and then when they connect to the the consulted party - a call recording initiates again the call ends and gets re-established with each new change, e.g. from consult to conference (the far end address is updated with the conference bride ID).
Note: The Call Reference IDs seem to stay the same (for the test call that I made) for the duration of the complete call. Even though there are numerous seperate calls.
No - it is not possible.
In Cisco Finesse we can have a unique Dialog ID for each call. The Dialog ID is the same ID as the ICM/CCE Peripheral Call Key which is based on a GCH Call ID from CUCM.
The Finesse Dialog ID can be calculated by: (CUCM Node ID x 2^24) + GCH
In our example the CUCM node used to make the call was
So the Finesse Dialog ID / ICM Peripheral Call Key is calculated as: (1 x 16777216) + 21279 = 16798494
However this means that it is not possible to link the Dialog ID to the audio recording using the reference ID in the SIP From header. The audio recording reference ID uses the CH (Call Handler ID ) and not the GCH ID (Global Call Handler ID).
This means that the only thing we can do to link the call to the agent is the Agent Extension number. A Finesse Gadget could be created to push relevant data at agent login. example:
{ "username" : "012345", "firstName": "Bob", "lastName" : "Bobster", "extension": "51001" "action" : "login" }
Another request could be sent at logout.
It would be technical possible to send other events about call using a Finesse gadget but it would not be possible to link using the dialog ID directly to the recording.
Only the extension number could be used.
For example we could send details on call is active when it becomes active, on hold etc. But whether this could be linked by the Transcription service is not clear.
voice class sip-profiles 8002 request INVITE sdp-header Audio-Attribute add "a=sendonly"
This example config - uses Early offer to the Secure Endpoint - to enforce SRTP - as otherwise the far end is defaulting to RTP (not ideal - the far end SHOULD have an option to require SRTP).
! voice class sip-profiles 8010 request INVITE sdp-header Audio-Attribute add "a=sendonly" ! voice class codec 8000 codec preference 1 g711alaw ! voice class sip-options-keepalive 8000 description ### Verint TCP SIP options PING ### down-interval 10 up-interval 5 retry 3 transport tcp ! voice class sip-options-keepalive 8010 description ###TLS SIP options PING### down-interval 10 up-interval 5 retry 3 transport tcp tls ! voice class srtp-crypto 8010 crypto 1 AES_CM_128_HMAC_SHA1_80 ! media profile recorder 8000 media-recording proxy secure 8011 media-recording proxy 8001 ! dial-peer voice 8000 voip description Inbound CCE CUCM Recording Profile session protocol sipv2 incoming called-number 70012 voice-class codec 8000 media-class 8000 ! dial-peer voice 8001 voip description Outbound Dial-peer to VerintRIS1 (On Prem Recorder) destination-pattern 70012 session protocol sipv2 session target ipv4:10.1.1.101 session transport tcp voice-class codec 8000 voice-class sip options-keepalive profile 8000 ! dial-peer voice 8011 voip description Outbound Dial-peer to Cloud Transcription SIP Server destination-pattern 70012 session protocol sipv2 session target ipv4:52.123.123.101 session transport tcp tls voice-class codec 8000 voice-class sip early-offer forced voice-class sip profiles 8010 voice-class sip srtp-crypto 100 voice-class sip options-keepalive profile 8010 srtp no vad !
EEM Script to needed to allow reslience since SIP Server Groups are not supported !!!! i.e. SIP Server groups seem to work on only work on first dial-peer. It is bonkers that we have to do this!
If and when dial-peer 8001 gets busied out - the backup dial-peer 8002 should be brought into service and vice versa. This means the backup server gets used until it is manually switched back or until the dial-peer 8002 goes out of service, where dial-peer 8001 should be re-enabled and 8002 is shutdown. Likewise with the secure dial-peers 8011 and 8012.
The following syslog occurs when dial-peer 8001 is busied out.
%SIP-5-DIALPEER_STATUS: VoIP dial-Peer <8001> is Busied Out
Here is the config - if we have a primary and a backup dial-peer - where only one is used at time.
! voice class sip-profiles 8010 request INVITE sdp-header Audio-Attribute add "a=sendonly" ! voice class codec 8000 codec preference 1 g711alaw ! voice class sip-options-keepalive 8000 description ### Verint TCP SIP options PING ### down-interval 10 up-interval 5 retry 3 transport tcp ! voice class sip-options-keepalive 8010 description ###TLS SIP options PING### down-interval 10 up-interval 5 retry 3 transport tcp tls ! voice class srtp-crypto 8010 crypto 1 AES_CM_128_HMAC_SHA1_80 ! media profile recorder 8000 media-recording proxy secure 8011 8012 media-recording proxy 8001 8002 ! dial-peer voice 8000 voip description Inbound CCE CUCM Recording Profile session protocol sipv2 incoming called-number 70012 voice-class codec 8000 media-class 8000 ! dial-peer voice 8001 voip description Outbound Dial-peer to VerintRIS1 (On Prem Recorder) destination-pattern 70012 session protocol sipv2 session target ipv4:10.1.1.101 session transport tcp voice-class codec 8000 voice-class sip options-keepalive profile 8000 ! dial-peer voice 8002 voip description Outbound Dial-peer to VerintRIS2 (On Prem Recorder) shutdown destination-pattern 70012 session protocol sipv2 session target ipv4:10.1.1.102 session transport tcp voice-class codec 8000 voice-class sip options-keepalive profile 8000 ! dial-peer voice 8011 voip description Outbound Dial-peer to Cloud Transcription SIP Server1 destination-pattern 70012 session protocol sipv2 session target ipv4:52.123.123.101 session transport tcp tls voice-class codec 8000 voice-class sip early-offer forced voice-class sip profiles 8010 voice-class sip srtp-crypto 100 voice-class sip options-keepalive profile 8010 srtp no vad ! dial-peer voice 8012 voip description Outbound Dial-peer to Cloud Transcription SIP Server2 shutdown destination-pattern 70012 session protocol sipv2 session target ipv4:52.123.123.102 session transport tcp tls voice-class codec 8000 voice-class sip early-offer forced voice-class sip profiles 8010 voice-class sip srtp-crypto 100 voice-class sip options-keepalive profile 8010 srtp no vad ! event manager applet DP8001_DOWN authorization bypass event syslog pattern "VoIP dial-Peer <8001> is Busied Out" action 10 cli command "enable" action 20 cli command "configure terminal" action 30 cli command "dial-peer voice 8002 voip" action 40 cli command "no shutdown" action 50 cli command "dial-peer voice 8001 voip" action 60 cli command "shutdown" action 70 cli command "end" action 80 syslog msg "EEM: Dial-peer 8001 is Busied Out. Enable dial-peer 8002 and disable 8001." event manager applet DP8002_DOWN authorization bypass event syslog pattern "VoIP dial-Peer <8002> is Busied Out" action 10 cli command "enable" action 20 cli command "configure terminal" action 30 cli command "dial-peer voice 8001 voip" action 40 cli command "no shutdown" action 50 cli command "dial-peer voice 8002 voip" action 60 cli command "shutdown" action 70 cli command "end" action 80 syslog msg "EEM: Dial-peer 8002 is Busied Out. Enable dial-peer 8001 and disable 8002." event manager applet DP8011_DOWN authorization bypass event syslog pattern "VoIP dial-Peer <8011> is Busied Out" action 10 cli command "enable" action 20 cli command "configure terminal" action 30 cli command "dial-peer voice 8012 voip" action 40 cli command "no shutdown" action 50 cli command "dial-peer voice 8011 voip" action 60 cli command "shutdown" action 70 cli command "end" action 80 syslog msg "EEM: Dial-peer 8011 is Busied Out. Enable dial-peer 8012 and disable 8011." event manager applet DP8012_DOWN authorization bypass event syslog pattern "VoIP dial-Peer <8012> is Busied Out" action 10 cli command "enable" action 20 cli command "configure terminal" action 30 cli command "dial-peer voice 8011 voip" action 40 cli command "no shutdown" action 50 cli command "dial-peer voice 8012 voip" action 60 cli command "shutdown" action 70 cli command "end" action 80 syslog msg "EEM: Dial-peer 8012 is Busied Out. Enable dial-peer 8011 and disable 8012." !
Note while the config below - uses the exact same dial-peer to send the call to the transcription server - it should be noted that we do NOT need to include the SIP profile for a=sendonly, as this is done by default when media forking. This isn't the case with the media proxy - as at call setup - it hasn't doesn't yet know the call will be one way (as no audio negotiations have yet started). We are sending the early offer for the transcription server ONLY because it doesn't yet support SRTP as a requiement.
i.e. if using media forking - this profile should be removed!
voice class codec 8000 codec preference 1 g711alaw ! ! voice class dpg 9000 dial-peer 9001 ! media profile recorder 9000 media-type audio media-recording 8011 ! ! media class 9000 recorder profile 9000 siprec ! ! voice class sip-profiles 8010 request INVITE sdp-header Audio-Attribute add "a=sendonly" ! dial-peer voice 8011 voip description Outbound Dial-peer to Servisbot1 destination-pattern 70012 session protocol sipv2 session target ipv4:52.123.123.101 session transport tcp tls voice-class codec 8000 voice-class sip early-offer forced voice-class sip profiles 8010 voice-class sip srtp-crypto 100 voice-class sip options-keepalive profile 8011 srtp no vad ! dial-peer voice 9000 voip description Inbound Call from CVP session protocol sipv2 destination dpg 9000 incoming called-number 5576111147 voice-class codec 8000 media-class 9000 ! dial-peer voice 9001 voip description Outbound Dial-peer to CUCM destination-pattern 5576111147 session protocol sipv2 session target ipv4:10.123.123.40 session transport tcp voice-class codec 8000 voice-class sip options-keepalive profile 8000 voice-class sip bind control source-interface GigabitEthernet0/0/0 voice-class sip bind media source-interface GigabitEthernet0/0/0 !
INVITE sip:[email protected]:5061 SIP/2.0 Via: SIP/2.0/TLS 10.123.123.106:5061;branch=z9hG4bK1B81D108E From: <sip:10.123.123.106>;tag=203F4E45-1E38 To: <sip:[email protected]> Date: Thu, 18 Jun 2026 16:09:03 GMT Call-ID: [email protected] Supported: timer,resource-priority,replaces Require: siprec Min-SE: 1800 Cisco-Guid: 3475675471-1785074161-2954342749-3082674470 User-Agent: Cisco-SIPGateway/IOS-17.12.7b Allow: INVITE, OPTIONS, BYE, CANCEL, ACK, PRACK, UPDATE, REFER, SUBSCRIBE, NOTIFY, INFO, REGISTER CSeq: 101 INVITE Max-Forwards: 70 Timestamp: 1781798943 Contact: <sip:10.123.123.106:5061;transport=tls>;+sip.src Expires: 180 Allow-Events: telephone-event Session-ID: ed2249fa849c51ed89319c9064588858;remote=00000000000000000000000000000000 Content-Type: multipart/mixed;boundary=uniqueBoundary Mime-Version: 1.0 Content-Length: 2427 --uniqueBoundary Content-Type: application/sdp Content-Disposition: session;handling=required v=0 o=CiscoSystemsSIP-GW-UserAgent 2874 94 IN IP4 10.123.123.106 s=SIP Call c=IN IP4 10.123.123.106 t=0 0 m=audio 17072 RTP/AVP 8 c=IN IP4 10.123.123.106 a=rtpmap:8 PCMA/8000 a=ptime:20 a=sendonly a=label:1 a=sendonly m=audio 17074 RTP/AVP 8 c=IN IP4 10.123.123.106 a=rtpmap:8 PCMA/8000 a=ptime:20 a=sendonly a=label:2 a=sendonly a=sendonly --uniqueBoundary Content-Type: application/rs-metadata+xml Content-Disposition: recording-session <?xml version="1.0" encoding="UTF-8"?> <recording xmlns="urn:ietf:params:xml:ns:recording:1"> <datamode>complete</datamode> <session session_id="27hAFmpmEfGm+eF0mpZLpA=="> <sipSessionID>059a1ef36a92e7f3a278d8ba17711571;remote=2481ca0a8afe5c32b93734e42a127372</sipSessionID> <start-time>2026-06-18T16:09:03.069Z</start-time> </session> <participant participant_id="27hAFmpmEfGm+uF0mpZLpA=="> <nameID aor="sip:[email protected]"> <name xml:lang="en">+353851231234 </name> </nameID> </participant> <participantsessionassoc participant_id="27hAFmpmEfGm+uF0mpZLpA==" session_id="27hAFmpmEfGm+eF0mpZLpA=="> <associate-time>2026-06-18T16:09:03.069Z</associate-time> </participantsessionassoc> <stream stream_id="27iOwmpmEfGm/+F0mpZLpA==" session_id="27hAFmpmEfGm+eF0mpZLpA=="> <label>1</label> </stream> <participant participant_id="27hAFmpmEfGm++F0mpZLpA=="> <nameID aor="sip:[email protected]"> <name xml:lang="en">Telecoms_Agent_1 (Bob Bobster)</name> </nameID> </participant> <participantsessionassoc participant_id="27hAFmpmEfGm++F0mpZLpA==" session_id="27hAFmpmEfGm+eF0mpZLpA=="> <associate-time>2026-06-18T16:09:03.069Z</associate-time> </participantsessionassoc> <stream stream_id="27iOwmpmEfGnAOF0mpZLpA==" session_id="27hAFmpmEfGm+eF0mpZLpA=="> <label>2</label> </stream> <participantstreamassoc participant_id="27hAFmpmEfGm+uF0mpZLpA=="> <send>27iOwmpmEfGm/+F0mpZLpA==</send> <recv>27iOwmpmEfGnAOF0mpZLpA==</recv> </participantstreamassoc> <participantstreamassoc participant_id="27hAFmpmEfGm++F0mpZLpA=="> <send>27iOwmpmEfGnAOF0mpZLpA==</send> <recv>27iOwmpmEfGm/+F0mpZLpA==</recv> </participantstreamassoc> </recording> --uniqueBoundary--
Note how above does NOT send a request for SRTP unlike the SIP invite below (an example SIP invite when using the Media Proxy) - which correctly sends request for SRTP. This is using the EXACT same dial-peer to send the audio to the transcription SIP server - so it not dial-peer configuration issue.
Why send Early offer? Current the Transcription SIP server - supports SRTP but does have an ability to require it. So if it sends it audio requirements (which would be typical - after a 100 trying, i.e. instead of 200 OK) - the audio is setup with RTP and not SRTP.
i.e.
INVITE sip:[email protected]:5061 SIP/2.0 Via: SIP/2.0/TLS 10.123.123.146:5061;branch=z9hG4bK108C43D Remote-Party-ID: "Telecoms_Agent_1 (Bob Bobster)" <sip:[email protected]>;party=calling;screen=yes;privacy=off From: "Telecoms_Agent_1 (Bob Bobster)" <sip:[email protected];x-nearend;x-refci=34446593;x-nearendclusterid=ACME-TST-UCCE-V11;x-nearenddevice=SEP000700000009;x-nearendaddr=6111147;x-farendrefci=34446594;x-farendclusterid=ACME-TST-UCCE-V11;x-farenddevice=SIP-TRK-IPT-CUCM-AB;x-farendaddr=00851231234;x-sessionid=059a1ef36a92e7f3a278d8ba34446593>;tag=142EAC40-1976 To: <sip:[email protected]> Date: Tue, 16 Jun 2026 07:55:26 GMT Call-ID: [email protected] Supported: timer,resource-priority,replaces Min-SE: 1800 Cisco-Guid: 3136319616-0522291035-0000010557-0673060874 User-Agent: Cisco-SIPGateway/IOS-17.12.7b Allow: INVITE, OPTIONS, BYE, CANCEL, ACK, PRACK, UPDATE, REFER, SUBSCRIBE, NOTIFY, INFO, REGISTER CSeq: 101 INVITE Timestamp: 1781596526 Contact: <sip:[email protected]:5061;transport=tls> Expires: 180 Allow-Events: telephone-event Max-Forwards: 69 Session-ID: d6d31ee87bb951adaf3f10a1b9bb7bfd;remote=00000000000000000000000000000000 Session-Expires: 1800 Content-Type: application/sdp Content-Disposition: session;handling=required Content-Length: 287 v=0 o=CiscoSystemsSIP-GW-UserAgent 3524 365 IN IP4 10.123.123.146 s=SIP Call c=IN IP4 10.123.123.146 t=0 0 m=audio 16458 RTP/SAVP 8 c=IN IP4 10.123.123.146 a=rtpmap:8 PCMA/8000 a=ptime:20 a=crypto:1 AES_CM_128_HMAC_SHA1_80 inline:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx a=sendonly