Showing results for 
Search instead for 
Did you mean: 

Get / Send ICM data in a CVP Script


My objective is to translate a CCX Script in a Call Studio script and I'm not sure on the way to do with "Get/Send Enterprise Call Info" functionnality with Call Studio.

1) Get data from ICM

I'm working with an ICM script that calls a CVP Script. I want to use ICM variables like peripheral variables in Call Studio. As I read in Cisco documentation, the only way to do this is to create CVP session variable with ICM variable user.microapp.ToExtVXML.

ex : user.microapp.ToExtVXML[0] --> application=TestApplication;param1=Call.PeripheralVariable1

If I'm right, it means that I can only use 5 strings with a size of 210 characters to pass data from ICM to CVP.

2) Send data to ICM

I have to use a Subdialog Return (or a CVP Subdialog Return) object and set the parameters of this object.

Is there another way to do like setting ICM call var during the exceution of my CVP script ?

Same conclusion : I can only use 5 strings with a size of 210 characters to return data from CVP to ICM.

Does it exist other possibilities to exchange data between ICM and CVP ?

Thanks !

Frequent Contributor

See this thread regarding passing data to ICM via CVP

how to pass data from ICM to CVP

Rising star

Hi Olivier,

Yes you are correct.

1)A) The only data from ICM to VXML Server/Studio is in the ToExtVXML array (max size 5 rows by 210 chars each row). The 5 rows can contain multiple name=value pairs, separated by semi-colons.

1B) One of the name=value pairs passed must be application=AppName indicating the VXML Server app to run.

1C) Each name (other than application=AppName) becomes a Session variable (although you have to manually enter it into the Studio Substitution window).

1D) Example:   Set Variable node in ICM

Variable: Call.user.microapp.ToExtVXML

Index: 0

Value:  "application=MyApp;OpenFlag=true"


Runs the app named MyApp and creates the Session variable named OpenFlag)

1E) Cisco automatically passes the GUID, ANI, and DNIS to the app. They become session variables named called, _ani, _dnis. The ANI and DNIS are also available in the Studio app as CallData ANI and CallData DNIS.

2A) When returning call control from VXML Server to ICM, the only way to return data is in the CVP_Subdialog_Return element. This data will be copied into the ICM user.microapp.caller_input (max 210 chars) and user.microapp.FromExtVXML array (max 4 rows, 210 chars each).

These are strings, but the data can be returned in whatever format you want, as ICM will have to parse these variables.

So you will have to decide what works best for you regarding content of these returned values since you'll have to handle this information in the ICM script. They could be name=value pairs, they could just be values (in a specific order), it could be one value per line.

2B)It's important to return something indicating to ICM whether to Release the Call. If the caller is satisfied and you've said 'goodbye' in the VXML Server app, you need to let ICM know the call is done. I do this by including the word 'done' in the caller_input setting, and then checking if the user.microapp.caller_input contains "done".

2C) Another thing to be CAREFUL of when returning a lot of data from VxmlServer to ICM - if the data you return exceeds the size of ICM's user.microapp.caller_input or the row size of the user.microapp.FromExtVXML[n]  than then that entry in ICM will contain NO data at all. 

3) Note that there is a handy little element in Studio named ReqIcmLabel that allows you to send data to ICM into its PeripheralVariables1-10, caller_input, and FromExtVXML array. ICM can access these and return data by modifying the PVs, and the ToExtVXML array, and ends with a Label node. The returned data becomes Element data for the ReqIcmLabel element. However, there are caveats to using this element.... So most people don't use it. Let me know if you're interested in those caveats or workarounds.

Hope that helps.



Hi Janine,

Thanks for your answer (and thanks Dlender too). As you offer, I'm interested in tips to use ReqICMLabel.


The ReqIcmLabel element executes within the callflow of a Studio/VXML Server app.

It was originally designed to be used in a CVP Standalone environment, but can be 'leveraged' for use in a Comprehensive environment.

It lets VXML Server send a message (as an API call) to an ICM script and pass data into ICM's PV1-PV10.

It causes ICM to run an ICM script based on the CallData DNIS of the VXML Server app.

ICM can access the PV values passed in by VXML Server to determine what it should do.

ICM can also then modify the PV values and must end with a Label node (it could be a dynamic label). The PV values and the Label value are then available as Element Data to the ReqIcmLabel element.

This can be useful for things like letting ICM set call types, VXML Server requesting information about call center values or flags from ICM, determine if any agents logged into a skill group, get the est'd wait time, etc.  It can NOT be used to update something specific to the caller.

Note - there are some repercussions.  If you use the true DNIS, then the ICM script will 'appear' to run more times than there are true calls coming in.

Or, you could change the DNIS that ICM passes to VXML Server so that the ReqIcmLabel causes a different ICM script to run.



First thanks for your last answer ... but I didn't use ReqICMLabel Element because it distorts statistics.

So I'll use a mecanism with global data. 

1) I store in a global data on the VXML server the informations I can't return to ICM. The id of my variable is based on the callid.

2) I leave CVP by setting the FromExtVXML with the first part of data.

3) I call a script CVP that just gets global data linked to the call (and flushes it just after getting them).

4) I leave CVP by setting the FromExtVXML with the second part of data.

5) I add an adminsitrative script that flushes global data not used for a defined time.

I test my mecanisn by setting 8000 variables with string of 800 characters and it works.


Dear Janine!

Nice to know it!

As I am understand You right:

Using RecICMLabel assumes that ICM script will be running. CVP uses the DNIS value from calldata to run ICM script (for RecICMLabel),

so to prevent a loop, I need to change DNIS value before enetring CVP app and pass a new DNIS value from ICM to CVP via  toExtVXML and this value will rewrite session CallData in CVP.

How should I end such ICM script to return call control back to CVP?

My case is to keep some customer's activity in CVP Menu. I intend to use CV1-10, and store it to the TCD table,  before hang up event occurs. And according to written above I can do that by using RecICMLabel and dedicated ICM script.  RIght?

Content for Community-Ad
Cisco Community October 2020 Spotlight Award Winners