Virtual agents (non-Zoom) messaging protocol reference

View as Markdown

HTTP protocol reference for integrating virtual agents (non-Zoom) with Zoom Contact Center. This protocol defines the message format and endpoints that virtual agent providers implement to support action and trigger mode integration.

The integration enables virtual agents (non-Zoom) to act as AI agents within Zoom Contact Center, handling conversation messages, rich media content, and handover to live agents.

For the full integration workflow and Marketplace app setup, see Integrate virtual agents (non-Zoom) with actions and triggers.

Send messages to the virtual agent

To send messages from Zoom Contact Center to your virtual agent endpoint, Zoom sends HTTP requests with the following payload structure.

Request payload

{
    "id": "xxx",
    "sessionId": "xxx",
    "conversationMode": "START_CONVERSATION",
    "message": {
        "type": "text",
        "value": "hi"
    },
    "conversationVariables": {
        "global_system.Engagement.timezone": "America/New_York",
        "global_system.Engagement.regionCode": "GA",
        "global_system.Consumer.email": "a@q.com",
        "global_system.Engagement.latLong": "34.0409, -84.0237",
        "global_custom.CustomerVariableGroup.QueueOpenHours": "1698872160000",
        "global_custom.CustomerVariableGroup.CVariable001": "this is default value",
        "global_system.Engagement.locale": "en-us",
        "global_custom.Website_Data_Value.GJavescriptVariable_hostname": "localhost",
        "global_system.Engagement.regionName": "Georgia",
        "global_system.Engagement.cityName": "Suwanee"
    },
    "languageCode": "en-US",
    "additionalPayload": null,
    "timestamp": 111,
    "userId": "xxx",
    "customData": {
        "trackingId": "xxx",
        "engagmentId": "xxx"
    }
}

Request parameters

Parameter NameTypeRequiredDescriptionPossible Values
idStringYesUnique identifier for this request.
sessionIdStringYesUnique identifier for the virtual agent conversations.
conversationModeStringYesParameter to define whether to start a new conversion, continue with the existing, or close the conversation.

START_CONVERSATION: starts a session

KEEP_CONVERSATION: keeps the current session.

END_CONVERSATION: ends the current session
START_CONVERSATION, KEEP_CONVERSATION, END_CONVERSATION
conversationVariablesObjectNoWill be sent only once when conversationMode is START_CONVERSATION.

Include both system-defined and customer-defined values.

Virtual agent providers should store these variables within the conversation context so that customers can reference within the virtual agent's flow.
additionalPayloadObjectNoFor submissions of forms, cards, action cards, or quick replies, the data will be placed in the additionalPayload field.

Note: additionalPayload may be null if the consumer's input is not related to any of these rich media selections.
languageCodeStringYesRequired when conversationMode is START_CONVERSATION or KEEP_CONVERSATION.en-US
messageObjectYesDetails of the message to be sent.

Required when conversationMode is START_CONVERSATION or KEEP_CONVERSATION.
timestampLongYesUnix epoch time when the message was sent from the end-user of the chat client.
userIdStringYesUnique user identifier.

This is the identifier of the end-user who is interacting with the virtual agent.
customDataObjectYesPass-through JSON-formatted name-value pairs that are sent back in the response. These values are not processed by the endpoint, but can be used to keep specific customer information attached to the conversation.

Message input types

Text

To handle plain text messages from consumers, parse the message object.

{
    "type": "text",
    "value": "Hi, I need some help!"
}
FieldRequiredValueDescriptionLimitation
valueYesStringPlain textn/a

Receive messages from the virtual agent

To respond with messages from your virtual agent to Zoom Contact Center, return HTTP responses with the following payload structure.

Response payload

Basic response example.

{
    "id": "xxx",
    "sessionId": "xxx",
    "body": [
        {
            "type": "text",
            "value": "Hi, I'm your virtual agent!"
        }
    ],
    "timestamp": 111,
    "userId": "xxx",
    "completed": false,
    "customData": {
        "trackingId": "xxx",
        "engagmentId": "xxx"
    }
}

Response parameters

Parameter NameTypeRequiredDescriptionPossible Values
idStringYesUnique identifier for this request.
sessionIdStringNoUnique identifier for the virtual agent conversations.
bodyArrayYesList of objects that describe the elements of the response message body.
timestampLongYesUnix epoch time when the message was sent from the end-user of the chat client.
userIdStringYesUnique user identifier. This is the identifier of the end-user who is interacting with the virtual agent.
completedBooleanNoFlag that indicates whether the virtual agent has successfully completed the conversation.

true means conversation has been successfully completed.

false means conversation is not complete and this parameter is not returned in the response.
true, false
customDataObjectYesPass-through JSON-formatted name-value pairs that are sent back in the response.

These values are not processed by the endpoint, but can be used to keep specific customer information attached to the conversation.

Message body structure

Each message in the body array contains a type and value.

FieldRequiredValueDescriptionPossible Values
typeYesStringMessage content type.action, text, html, markdown, quickReplies, card, carousel, article, image, audio, video, link, form, attachment
valueYesObjectRefer to the message content types below.
fallbackTextNoStringWhen a virtual agent is integrated with social channels such as Facebook or WhatsApp, these platforms may not fully support rich text messages.

Setting a fallbackText helps ensure that users can still see a message instead of receiving no prompt at all.

Message content types

Action | Article | Attachment | Audio | Card | Carousel | Form | HTML | Image | Link | Markdown | Quick replies | Text | Video

Action

To trigger actions in the conversation, use action messages.

Set variables

To dynamically route to queues, set variables in the conversation context.

{
    "type": "action",
    "value": {
        "action": "setVariables",
        "data": {
            "variables": [
                {
                    "name": "global_custom.dynamic routing.dynamical_queue",
                    "value": "Main Team Queue"
                }
            ]
        }
    }
}

Typing indicator

To display a typing indicator, send a typing action.

{
    "type": "action",
    "value": {
        "action": "typing",
        "data": {
            "typingTime": 1000
        }
    }
}
FieldRequiredValueDescriptionLimitation
typingTimeNolongTyping indicator display duration in milliseconds. If not specified, the default maximum display time is 5 seconds.n/a

Transfer to live agent

To transfer the conversation to a live agent, send a transfer action.

{
    "type": "action",
    "value": "TransferToLiveAgent"
}

Article

To send an article with content and sources, use the article type.

{
    "type": "article",
    "value": {
        "title": "How Zoom can help you stay safe in cyberspace",
        "content": "<!DOCTYPE html><html><head><style>body {background-color: powderblue;}h1   {color: blue;}p    {color: red;}</style></head><body><h1>This is a heading</h1><p>This is a paragraph.</p></body></html>",
        "style": "multi-sources",
        "sources": [
            {
                "label": "reference 1",
                "title": "this is reference 1",
                "content": "<!DOCTYPE html><html><head><style>body {background-color: powderblue;}h1   {color: blue;}p    {color: red;}</style></head><body><h1>This is a heading</h1><p>This is a paragraph.</p></body></html>",
                "contentType": "markdown",
                "url": "https://www.zoom.com/en/blog/how-zoom-can-help-you-stay-safe-in-cyberspace/"
            },
            {
                "label": "reference 2",
                "title": "this is reference 2",
                "contentType": "html",
                "content": "<!DOCTYPE html><html><head><style>body {background-color: powderblue;}h1   {color: blue;}p    {color: red;}</style></head><body><h1>This is a heading</h1><p>This is a paragraph.</p></body></html>",
                "url": "https://www.zoom.com/en/blog/how-zoom-can-help-you-stay-safe-in-cyberspace/"
            }
        ]
    }
}
FieldRequiredValueDescriptionLimitation
titleYesStringArticle title256 Bytes
contentYesStringStandard HTML format or plain textn/a
sourcesYesListList of article sources20
styleNoStringSource display style: single-source, multi-sourcesn/a

Article source

To add source references to an article, include source objects.

FieldRequiredValueDescriptionLimitation
labelYesStringThe button or label name128 Bytes
titleYesStringThe title in the details256 Bytes
contentYesStringStandard HTML format or plain textn/a
contentTypeNoStringContent format type: markdown or htmln/a
urlNoStringThe article linkn/a
openNewTabNoBooleanThe URL will open in new tabn/a

Attachment

To send a file attachment, use the attachment type.

{
    "type": "attachment",
    "value": {
        "title": "attachment pdf title",
        "name": "attachment pdf name.pdf",
        "url": "https://file-examples.com/storage/fe091522ae6912e509be331/2017/10/file-sample_150kB.pdf"
    }
}
FieldRequiredValue TypeDescription
titleYesStringAttachment title
urlYesStringAttachment URL
nameYesStringAttachment filename

Audio

To send an audio file, use the audio type.

{
    "type": "audio",
    "value": {
        "title": "This is a title",
        "name": "audio name",
        "url": "https://youtube.com/123456"
    }
}
FieldRequiredValueDescriptionLimitation
urlYesStringAudio URLn/a
titleNoStringAudio title128 Bytes
nameNoStringAudio name128 Bytes

Card

To send a card with an image, description, and action buttons, use the card type.

{
    "type": "card",
    "value": {
        "title": "card title",
        "description": "This text is **bold**.",
        "imageUrl": "https://static-st1.zoomdev.us/static/6.3.34762/image/new/topNav/Zoom_logo.svg",
        "options": [
            {
                "type": "option",
                "label": "Select case 1",
                "value": "case1"
            },
            {
                "type": "link",
                "label": "More",
                "value": "https://example.com/link"
            }
        ]
    }
}
FieldRequiredValueDescriptionLimitation
titleNoStringCard title256 Bytes
descriptionNoStringStandard Markdown format4096 Bytes
imageUrlYesStringImage URLn/a
optionsYesListList of card options20
mandatoryNoBooleanIf true, and the options list contains at least one option type item (button), the live chat client will disable the input box if the button is not clicked.

Default: false
n/a

Card option types

Option button

To add an option button to a card, use type option.

FieldRequiredValueDescriptionLimitation
typeYesStringoption
labelYesStringDisplay name128 Bytes
valueYesStringThe identified valuen/a

Link button

To add a link button to a card, use type link.

FieldRequiredValueDescriptionLimitation
typeYesStringlink
labelYesStringDisplay name128 Bytes
valueYesStringURLn/a

To send multiple cards in a carousel, use the carousel type.

{
    "type": "carousel",
    "value": {
        "cards": [
            {
                "title": "carousel title 1",
                "description": "This is the first item.",
                "imageUrl": "https://images.unsplash.com/photo-1682685794304-99d3d07c57d2?ixlib=rb-4.0.3&ixid=M3wxMjA3fDF8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=772&q=80",
                "options": [
                    {
                        "type": "option",
                        "label": "Select case 1",
                        "value": "case1"
                    },
                    {
                        "type": "link",
                        "label": "More",
                        "value": "https://example.com/link"
                    }
                ]
            },
            {
                "title": "carousel title 2",
                "description": "This is the second item.",
                "imageUrl": "https://plus.unsplash.com/premium_photo-1691852519415-0df4c22e49e1?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=774&q=80",
                "options": [
                    {
                        "type": "option",
                        "label": "Select case 1",
                        "value": "case1"
                    },
                    {
                        "type": "link",
                        "label": "More",
                        "value": "https://example.com/link"
                    }
                ]
            }
        ]
    }
}
FieldRequiredValueDescriptionLimitation
cardsYesListList of card objects with the same structure as the card type10

Form

To collect information from consumers through a form, use the form type.

{
    "type": "form",
    "value": {
        "name": "form name",
        "title": "form title",
        "subtitle": "I really like it ",
        "fields": [
            {
                "type": "text",
                "label": "Name",
                "key": "name",
                "required": true,
                "defaultValue": "name"
            },
            {
                "type": "single-select",
                "label": "Education",
                "key": "education",
                "required": true,
                "options": [
                    {
                        "label": "High School Diploma",
                        "value": "high_school"
                    },
                    {
                        "label": "Other",
                        "value": "other"
                    }
                ],
                "defaultValue": "high_school"
            },
            {
                "type": "multi-select",
                "label": "Make you chocie",
                "key": "option",
                "required": true,
                "options": [
                    {
                        "label": "Option1",
                        "value": "1"
                    },
                    {
                        "label": "Option2",
                        "value": "2"
                    },
                    {
                        "label": "Option3",
                        "value": "3"
                    }
                ],
                "defaultValue": ["1", "2"]
            }
        ]
    }
}
FieldRequiredValueDescriptionLimitation
nameNoStringForm name
titleNoStringForm title256 Bytes
subtitleNoStringForm subtitle1024 Bytes
mandatoryNoBooleanIf true, and the field list contains at least one field element, the live chat client will disable the input box before the form has been submitted.

Default: false.

Note: Works with livechat SDK only.
fieldsYesListList of form fields

Text input field

To add a text input field to a form, use the text field type.

{
    "type": "text",
    "label": "Name",
    "key": "name",
    "required": true,
    "defaultValue": "",
    "pattern": "text"
}
FieldRequiredValueDescriptionLimitation
labelYesStringField label128 Bytes
keyYesStringField key64 Bytes
requiredNoBooleanWhether field is required
defaultValueNoStringDefault value256 Bytes
patternNoStringValidation pattern:

text (no rule)

email (must be in email address format)

integer (require input of positive integers)

decimal (require decimal input)

custom (use the regex set in field customRegex to do the validation).

Default: text
customRegexNoStringRegular expression for custom pattern validation128 characters
errorLabelNoStringThe error message to show while the data is invalid128 characters

Select field

To add a single-select dropdown to a form, use the single-select field type.

{
    "type": "single-select",
    "label": "Education",
    "key": "education",
    "required": true,
    "options": [
        {
            "label": "High School Diploma",
            "value": "high_school"
        },
        {
            "label": "Associate Degree",
            "value": "associate"
        },
        {
            "label": "Bachelor's Degree",
            "value": "bachelor"
        },
        {
            "label": "Doctoral Degree (Ph.D.)",
            "value": "doctor"
        },
        {
            "label": "Other",
            "value": "other"
        }
    ],
    "defaultValue": ""
}
FieldRequiredValueDescriptionLimitation
labelYesStringField label128 Bytes
keyYesStringField key128 Bytes
requiredNoBooleanWhether field is required
defaultValueNoStringDefault option value
optionsYesListList of select options

Select option

Each option in a select field has the following structure.

{
    "label": "Male",
    "value": "male"
}
FieldRequiredValueDescriptionLimitation
labelYesStringDisplay name128 Bytes
valueYesStringThe identify value128 Bytes

Multi-select field

To add a multi-select dropdown to a form, use the multi-select field type.

{
    "type": "multi-select",
    "label": "Make you chocie",
    "key": "option",
    "required": true,
    "options": [
        {
            "label": "Option1",
            "value": "1"
        },
        {
            "label": "Option2",
            "value": "2"
        },
        {
            "label": "Option3",
            "value": "3"
        }
    ],
    "defaultValues": ["1", "2"]
}
FieldRequiredValueDescriptionLimitation
labelYesStringField label128 Bytes
keyYesStringField key64 Bytes
requiredNoBooleanWhether field is required
defaultValueNoListDefault option values
optionsYesListList of select options

Multi-select option

Each option in a multi-select field has the following structure.

{
    "label": "Male",
    "value": "male"
}
FieldRequiredValueDescriptionLimitation
labelYesStringDisplay name128 Bytes
valueYesStringThe identify value. Only strings consisting of a-z and 0-9 are allowed.64 Bytes

HTML

To send HTML-formatted messages, use the html type.

{
    "type": "html",
    "value": "<!DOCTYPE html><html><head><title>Page Title</title></head><body><h1>HTML message</h1><a href=\"https://zoom.com\">Zoom</a><p><b>Please type your query below</b></p></body></html>"
}
FieldRequiredValueDescriptionLimitation
valueYesStringStandard HTML formatn/a

Image

To send an image, use the image type.

{
    "type": "image",
    "value": {
        "title": "image title",
        "width": 300,
        "height": 200,
        "name": "zoom_logo",
        "altText": "This is a logo",
        "url": "https://zoom.us/logo.jpeg"
    }
}
FieldRequiredValue TypeDescriptionLimitation
urlYesStringImage URLn/a
widthNoNumberImage widthn/a
heightNoNumberImage heightn/a
nameNoStringImage name128 Bytes
altTextNoStringText displayed when hovering the mouse128 Bytes

To send a link, use the link type.

{
    "type": "link",
    "value": {
        "label": "link name",
        "url": "https://zoom.us"
    }
}
FieldRequiredValueDescriptionLimitation
urlYesStringLink URLn/a
labelNoStringLink label128 Bytes

Markdown

To send Markdown-formatted messages, use the markdown type.

{
    "type": "markdown",
    "value": "## This text is **bold**."
}
FieldRequiredValueDescriptionLimitation
valueYesStringStandard Markdown formatn/a

Quick replies

To provide quick reply buttons for consumer responses, use the quickReplies type.

{
    "type": "quickReplies",
    "value": {
        "title": "Please make your choice",
        "options": [
            {
                "label": "Yes",
                "type": "postback",
                "value": "yes"
            },
            {
                "label": "No",
                "type": "postback",
                "value": "no"
            }
        ],
        "mandatory": true
    }
}
FieldRequiredValueDescriptionLimitation
titleYesStringTitle text1024 Bytes
optionsYesListList of quick reply options20
options.labelYesStringDisplay name128 Bytes
options.typeYesStringOption type: postback, phone_number, web_url, trigger_intent
options.valueYesStringThe identified valuen/a
mandatoryNoBooleanIf true, the live chat client will disable the input box when the quick reply button is not clicked.

Default: false
n/a

Text

To send plain text messages, use the text type.

{
    "type": "text",
    "value": "Hi, I'm your virtual agent!"
}
FieldRequiredValueDescriptionLimitation
valueYesStringPlain textn/a

Video

To send a video (YouTube), use the video type.

{
    "type": "video",
    "value": {
        "title": "This is a title",
        "name": "video name",
        "url": "https://youtube.com/123456"
    }
}
FieldRequiredValueDescriptionLimitation
urlYesStringVideo URLn/a
titleNoStringVideo title128 Bytes
nameNoStringVideo name128 Bytes