Overview
This article will guide you on how to quickly join a meeting in VCaaS through the Open API. In simple terms, if you just want to quickly start a meeting without any document presentation, you only need to complete the following two steps:
- Create a meeting
- Join a meeting
If you need to do a document presentation in the meeting, you need to complete the step of linking the meeting with the documents before joining the meeting. The process becomes the following three steps:
- Create a meeting
- Link meeting with files
- Join a meeting
The detailed steps in the following text will explain the operations that need to be performed in each step. At the same time, it will introduce how to query the data of the meeting and how to manage the organization's documents after the meeting ends.
Step-by-Step Guide
Create a Meeting
To create a meeting, you need to use the Create Meeting API /v2/meeting-center/meetings
. After successfully creating the meeting, you will get the meeting ID meetingId
and the meeting URL meetingUrl
. In the next step, Join a Meeting, we will use the meeting ID meetingId
and the meeting URL meetingUrl
to create the final meeting link. Next, we will briefly explain the request parameters and response of the Create Meeting API. For more details about the Create Meeting API, please refer to the VCaaS API reference.
Key Parameters
startTime & endTime: Time is in Unixtime format, accurate to the second. Start time cannot be earlier than the current time, and end time cannot be earlier than the start time.
timerStartTime & timerEndTime: These parameters are used to control the start and end time of the timer shown to teachers within the classroom. Time is in Unixtime format, accurate to the second. timerStartTime cannot be earlier than startTime, and timerEndTime cannot be earlier than timerEndTime or later than endTime.
timerCountdown: This parameter is the countdown start time. This parameter is used to control how long before the timerEndTime the countdown should start displaying.
callbackUrl: If you provide a link for this parameter when creating a meeting, we will actively push attendance data to your link at 1 minute, 5 minutes, 10 minutes, and at the end of the meeting.
redirectUrl: If you provide a link for this parameter, it will automatically redirect to the page specified by the link after the meeting ends. If you do not provide this link, it will redirect to our default page.
realTimeCallbackUrl: If you provide links for the parameters in this object, we will automatically push live session data such as users joining/leaving as well as sessions starting/ending to the Callback URLs.
config: The parameters in this object represent whether you want to support functions such as chat, recording, poll, quiz, etc. during the meeting. Setting to True means to support this function, and setting to false means to not support this function. When this function is not supported, the entry button will be hidden or disabled in the meeting.
docIds: This object represents the documents (courseware) uploaded in the classroom. You need to upload the file first and obtain the document ID. You can also create a meeting first and then upload documents to this meeting through other interfaces.
quizIds: This object represents the pre-filled quizzes in the classroom. You need to create a quiz first and obtain the quiz ID. You can also create a meeting first and then upload quizzes to this meeting through other interfaces.
Example Request Body for Creating Meeting API
{
"meetingExternalId": "500000",
"meetingTitle": "Tech meeting",
"startTime": 1673062042,
"endTime": 1673753242,
"timerCountdown": 5,
"callbackUrl": "<https://www.hilink.co/>",
"redirectUrl": "<https://www.hilink.co/>",
"config": {
},
"docIds": [
]
}
Example Response for Creating a Meeting API
{
"meetingExternalId": "500000",
"meetingTitle": "Tech meeting",
"meetingId": "109391932341489664",
"meetingUrl": "<https://dev.vcaas.hilinkdemo.com/meeting>",
"startTime": 1673062042,
"endTime": 1673755042,
"timerStartTime": 1673062042,
"timerEndTime": 1673755042,
"meetingStatus": "CREATED"
}
Link meeting with files
If you want to perform document presentation during a meeting, you need to first upload the file and link it to the meeting before joining. The specific steps are as follows:
- Upload the file.
- Link the file to the meeting.
- Join the meeting.
Get the url to upload files
To get the url for uploading files, you need to use the Create Document Upload URL API /v1/document-center/upload-urls
. After successfully requesting the Create Document Upload URL API, you will get the file ID docId
and the file upload url url
. For more details about the Create Document Upload URL API, please refer to the VCaaS API reference. The following is an example of the API response:
{
"docId": "96397990553587712",
"url": "<https://dev.file.vcaas.hilinkdemo.com/91232529172008960%2Ftest.doc?Expires=1672991509&Signature=OE-hM31AmLFnquWi8BVvtiim0aP~4c~e2EewkA6h5GT0sYw0ejYQUD9fYmz5ScI00tkL8mCaTnbnkHoWGaLZqSt24h-SYotmkbeFAaLVJTS8MdTZkPvkgThYd39AsJiE2KReLA35cdwjyx5mzyQCnuiCHue-uV6~mJ3MAJcFIA75j39s~u0qCDEjBM2Ez-MqtUKYu-xSSWvb3Hwu8Ztg8srV40zoM3hPtC2KjQ7lgCYUK1xTPJa97xS6U4i5FZsiGu~HvSotdZ-ETeTLu6ebbY~Gu6qFef1ajBUqc8jACkI~UBhoE4Az8drc5NzmsyYUTAt4I958DFrmc671TbNM-Q__&Key-Pair-Id=K21VT8DFTV93QE>"
}
Upload the Document to the Server
Once we have obtained the upload URL for the file in Step I, we can upload the document to the server using either a network request client or encoding. Below, we will introduce both methods:
Test document upload using a network request client
Use a network request client such as Postman to test document upload
In the request address bar, fill in the URL obtained in step 2
The request method must be specified as PUT
The file to be uploaded is selected as parameter type binary through setting the request body (Body)
CURL document upload example
curl --location --request PUT '<https://dev.file.vcaas.hilinkdemo.com/91232529172008960%2Ftest.doc?Expires=1672991509&Signature=OE-hM31AmLFnquWi8BVvtiim0aP~4c~e2EewkA6h5GT0sYw0ejYQUD9fYmz5ScI00tkL8mCaTnbnkHoWGaLZqSt24h-SYotmkbeFAaLVJTS8MdTZkPvkgThYd39AsJiE2KReLA35cdwjyx5mzyQCnuiCHue-uV6~mJ3MAJcFIA75j39s~u0qCDEjBM2Ez-MqtUKYu-xSSWvb3Hwu8Ztg8srV40zoM3hPtC2KjQ7lgCYUK1xTPJa97xS6U4i5FZsiGu~HvSotdZ-ETeTLu6ebbY~Gu6qFef1ajBUqc8jACkI~UBhoE4Az8drc5NzmsyYUTAt4I958DFrmc671TbNM-Q__&Key-Pair-Id=K21VT8DFTV93QE>' \
--header 'Content-Type: application/octet-stream' \
--data-binary '@/path/to/test.doc'
Sample code for uploading documents
package org.example.s3;
import java.io.*;
import java.net.*;
/**
* Example of uploading a document using code
*/
public class UploadDemo {
public static void main(String[] args) throws Exception {
// uploadUrl is the address obtained from the get file upload URL API (/v1/document-management/upload-url)
String uploadUrl = "https://dev.file.vcaas.hilinkdemo.com/90972391106285568/test.doc?Expires=1668583421&Signature=inz-umy8E76cgZM60hLmVpKtD~vjOHeZx-xASrHPqxNTL~zbOy9mY13~5m6-nk81DvMUJutrXq2jSY8eQ478239Kq5CKSwH2pjIfOdRr~Cxts~aaKkTPgs5oHuZCiFFUYnPrl1vqVwOeBPn-OIga4Js6RtAx1tNhWPQ2jEcbXtLRsMgOhWH3x6WlJfT7JA9bwM0odrRm~ybqwtdlFnDy~8CMGfP-9Ef7YH2EpMzypk25s0YoUzHil5QDW8g~npCjjgJ2s5vXCgCXikEFsMjxmgfITPI-7Dfen1CJaui4uCyLR-9VUxAaz5pGr5DcjGv74XTLUmz~cJB-s4dhX6z6Yw__&Key-Pair-Id=K21VT8DFTV93QE";
URL url = new URL(uploadUrl);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setDoOutput(true);
connection.setRequestProperty("Content-Type", "application/octet-stream");
// The request method must be set to PUT
connection.setRequestMethod("PUT");
OutputStream out = connection.getOutputStream();
// The path of the file to be uploaded
FileInputStream in = new FileInputStream("/path/to/test.doc");
int bytes = 0;
byte[] bufferOut = new byte[2048];
while ((bytes = in.read(bufferOut)) != -1) {
out.write(bufferOut, 0, bytes);
}
in.close();
out.flush();
out.close();
connection.getResponseCode();
// Code 200 means the file upload was successful. Code 403 means the upload request was rejected due to an expired file upload link, and a new upload address needs to be obtained.
System.out.println("HTTP response code is " + connection.getResponseCode());
}
}
Associate Meetings with Documents
After successfully uploading a document, we can use the Add Meeting Document API /v1/meeting-center/meetings/{id}/documents
to associate the meeting with the document. The uploaded document can be reused, and when creating a new meeting, simply add the document ID docId
to the request parameter docIds of the Create Meeting API. For more details on the Add Meeting Document API, please refer to the VCaaS API Reference.
Join a meeting
To join a meeting, we will use the meeting ID (meetingId) and meeting URL meetingUrl
returned by the create meeting interface. The meeting ID meetingId
will be used as a parameter to generate the JoinToken, while the meeting URL meetingUrl
will be used to concatenate the meeting link JoinUrl.
Generate JoinToken
We will explain how to generate JoinToken from three parts: parameter description, signature, and encryption. Finally, we will provide a code example for generating JoinToken.
Parameter Description
Param | Type | Mandatory | Description |
---|---|---|---|
meetingUid | String(20) | true | Meeting ID |
externalRole | String | true | Role of participant,possible values [HOST 、ATTENDEE 、SUPERVISOR ] |
externalId | String(64) | true | External Id,unique identifier |
externalName | String(64) | false | Name of the participant |
externalEmail | String(64) | false | Email of the participant |
externalAvatarUrl | String(500) | false | Avatar link of the participant |
Signature
signature = hmac_sha256([meetingUid, externalRole, externalId, externalName,externalEmail, externalAvatarUrl].filter(field -> field.isEmpty()).sort().join(''), secretKey)
- Filter out invalid parameters (null or ''), so that the values of all parameters are represented as strings and sorted in dictionary order.
- Concatenate the sorted strings.
- Use
sha256(secretKey)
as thesecretKey
for hmac_sha256, and use thehmac_sha256
algorithm to calculate the result string in step 2, which is thesignature
.
Encryption
- Filter out invalid parameters (null or ''), encapsulate all parameters and the
signature
calculated by signature (excludingaccessKey
andsecretKey
) into a JSON object as follows:
{
"externalRole": "HOST",
"externalEmail": "hello@hilink.co",
"externalAvatarUrl": "<http://dummyimage.com/100x100>",
"signature": "69e7de2b4d21ff922e8d82596a5c420e75214b79277f894dd92e1c549dcc5d44",
"externalName": "Lucy",
"externalId": "1",
"meetingUid": "109391932341489664"
}
- Convert the json object to a string, use
secretKey
as the secret for the AES algorithm,accessKey
as the iv (vector) for the AES algorithm, AES padding mode:AES/CBC/PKCS5Padding
, character set isUTF-8
. - Use AES256 to encrypt the parameter's json string, then convert it to a Base64 string (must use a URL-safe encoder, RFC 4648: The Base16, Base32, and Base64 Data Encodings (rfc-editor.org)), and the result is the
joinToken
.
Code example for generating JoinToken
package org.example;
import com.fasterxml.jackson.databind.ObjectMapper;
import javax.crypto.Cipher;
import javax.crypto.Mac;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import javax.xml.bind.annotation.adapters.HexBinaryAdapter;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.util.Base64;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* Example code for generating a JoinToken
*/
public class JoinTokenExample {
// Constants
private static final String DOT = ".";
private static final String CHARSET = "UTF-8";
private static final String SHA_256 = "SHA-256";
private static final String HMAC_256 = "HmacSHA256";
private static final String AES = "AES";
/**
* Encryption/decryption algorithm, encryption mode, and padding scheme
*/
private static final String CIPHER_ALGORITHM = "AES/CBC/PKCS5Padding";
private static final Base64.Encoder BASE64_ENCODER = Base64.getUrlEncoder();
private static final Base64.Decoder BASE64_DECODER = Base64.getUrlDecoder();
public static void main(String[] args) throws Exception {
// Access and secret keys
String accessKey = "4mBmzWmNt9Dy5een";
String secretKey = "ef8d8fec05064779b3e0243cdae744e8";
// Parameter list
Map<String, String> parameter = new HashMap<>();
parameter.put("meetingUid", "109391932341489664");
parameter.put("externalRole", "HOST");
parameter.put("externalId", "1");
parameter.put("externalName", "Lucy");
parameter.put("externalEmail", "hello@hilink.co");
parameter.put("externalAvatarUrl", "<http://dummyimage.com/100x100>");
// Filter out null or empty values
parameter.entrySet().removeIf(entry -> entry.getValue() == null || "".equals(entry.getValue()));
// Sort the parameters
List<String> sortedParameter = parameter.values().stream()
.sorted()
.collect(Collectors.toList());
// Merge sorted parameters into a single string
String mergeString = sortedParameter.stream().reduce((p1, p2) -> p1 + p2).orElse(null);
assert mergeString != null;
// Generate the signature
String signature = hmac256(mergeString, sha256(secretKey));
// Add the signature parameter
parameter.put("signature", signature);
// Convert parameters to JSON
ObjectMapper objectMapper = new ObjectMapper();
String json = objectMapper.writeValueAsString(parameter);
// Create the token
String token = accessKey + DOT + aes(json, secretKey, accessKey);
// Print the token
System.out.println(token);
}
public static String aes(String plainText, String secret, String ivStr) {
try {
SecretKey secretKey = new SecretKeySpec(secret.getBytes(StandardCharsets.UTF_8), AES);
Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
cipher.init(Cipher.ENCRYPT_MODE, secretKey, new IvParameterSpec(ivStr.getBytes(StandardCharsets.UTF_8)));
byte[] byteEncode = plainText.getBytes(StandardCharsets.UTF_8);
return BASE64_ENCODER.encodeToString(cipher.doFinal(byteEncode));
} catch (Exception e) {
throw new RuntimeException("AES encrypt fail,plainText=" + plainText + ",secret=" + secret.length() + "。" + e.getMessage(), e);
}
}
private static String hmac256(String content, String secretKey) throws Exception {
SecretKeySpec secretKeySpec = new SecretKeySpec(new HexBinaryAdapter().unmarshal(secretKey), HMAC_256);
Mac mac = Mac.getInstance(secretKeySpec.getAlgorithm());
mac.init(secretKeySpec);
byte[] bytes = mac.doFinal(content.getBytes(CHARSET));
return new HexBinaryAdapter().marshal(bytes).toLowerCase();
}
private static String sha256(String input) throws Exception {
byte[] bytes = MessageDigest.getInstance(SHA_256).digest(input.getBytes(CHARSET));
return new HexBinaryAdapter().marshal(bytes).toLowerCase();
}
}
JoinToken will be output in the console as follows:
JoinToken:4mBmzWmNt9Dy5een.4QO0DeFy-jJBGYP2NucR--By3YrTI5GRsxP0I47Njhcp8pUvyG9WTZ1Nz4O7quI5Rt5OMhsZoRd5Is3yFfE9j6tY1mjFhrEgGf8oAgcP6EdHCkneGUhdQW9qn5Ka3EHQSI_SsAvviwVf10FAseNN6_NwdcC5Qa-vMYuLjn42EnfZXsz4baSpVQfEUxvE2qAIy1l5-G4spR56q_opRnvpqgHQ7VjKSt1wRa2Zhl2Exz96_0452Y3qgLMQQJRbVVBDNjbyMzPbmaW6BJkvyRFpJLtfnJtmbinqt-1Yd341xb983fIN_JgySlDTyg3d98HD4HTNJ_lx_6HNI-3-8r04__jQh_BX0ItijEcwRuR3Dmo=
Combine JoinUrl
Combine the meeting URL meetingUrl
with the generated JoinToken to create the final meeting link.
meetingUrl:https://dev.vcaas.hilinkdemo.com/meeting
JoinToken:4mBmzWmNt9Dy5een.4QO0DeFy-jJBGYP2NucR--By3YrTI5GRsxP0I47Njhcp8pUvyG9WTZ1Nz4O7quI5Rt5OMhsZoRd5Is3yFfE9j6tY1mjFhrEgGf8oAgcP6EdHCkneGUhdQW9qn5Ka3EHQSI_SsAvviwVf10FAseNN6_NwdcC5Qa-vMYuLjn42EnfZXsz4baSpVQfEUxvE2qAIy1l5-G4spR56q_opRnvpqgHQ7VjKSt1wRa2Zhl2Exz96_0452Y3qgLMQQJRbVVBDNjbyMzPbmaW6BJkvyRFpJLtfnJtmbinqt-1Yd341xb983fIN_JgySlDTyg3d98HD4HTNJ_lx_6HNI-3-8r04__jQh_BX0ItijEcwRuR3Dmo=
JoinUrl:https://dev.vcaas.hilinkdemo.com/meeting?joinToken=4mBmzWmNt9Dy5een.4QO0DeFy-jJBGYP2NucR--By3YrTI5GRsxP0I47Njhcp8pUvyG9WTZ1Nz4O7quI5Rt5OMhsZoRd5Is3yFfE9j6tY1mjFhrEgGf8oAgcP6EdHCkneGUhdQW9qn5Ka3EHQSI_SsAvviwVf10FAseNN6_NwdcC5Qa-vMYuLjn42EnfZXsz4baSpVQfEUxvE2qAIy1l5-G4spR56q_opRnvpqgHQ7VjKSt1wRa2Zhl2Exz96_0452Y3qgLMQQJRbVVBDNjbyMzPbmaW6BJkvyRFpJLtfnJtmbinqt-1Yd341xb983fIN_JgySlDTyg3d98HD4HTNJ_lx_6HNI-3-8r04__jQh_BX0ItijEcwRuR3Dmo=
Get Meeting Data
After the meeting is over, corresponding meeting duration, attendance of participants, meeting recording (if recording was enabled during the meeting), POLL, QUIZ and other data will be generated. VCaaS platform provides two ways to obtain meeting data: push and query meeting data interface. The meeting duration and attendance data provided by VCaaS platform are based on client connection event generation, and there may be event delays. Therefore, the meeting data will be first proactively pushed five minutes after the meeting ends. For more details on querying meeting duration data interface /v1/meeting-center/meetings/{id}/data
, please refer to the VCaaS API reference.
Meeting Data Response
{
// Meeting duration data
"meetingData": {
// Meeting ID
"meetingUid": "",
// External meeting ID
"meetingExternalId": "",
// Original scheduled meeting start time
"scheduledStartTime": "",
// Original scheduled meeting end time
"scheduledEndTime": "",
// Actual meeting start time
"startTime": "",
// Actual meeting end time
"endTime": "",
// Meeting duration, in seconds
"duration": ""
},
// Attendee attendance data
"attendeeDatas": [
{
// Meeting ID
"meetingUid": "",
// External meeting ID
"meetingExternalId": "",
// Attendee ID
"attendeeUid": "",
// External attendee ID
"externalId": "",
// Attendee's first entry time
"timeIn": "",
// Attendee's last exit time
"timeOut": "",
// Total attendance duration, in seconds
"totalTime": "",
// Device
"device": "",
// Attendee attendance detail data
"details": [
{
// Attendance type, AttendeeJoined: enter the meeting; AttendeeLeft: leave the meeting; AttendeeDropped: attendee disconnected;
"type": "",
// Timestamp, in milliseconds
"timestamp": 0
}
]
}
],
// Meeting video data
"meetingVideoData": {
// Meeting ID
"meetingUid": "",
// External meeting ID
"meetingExternalId": "",
// Meeting video download address
"videoUrls": [
""
]
},
// Meeting interaction data
"meetingInteractiveData": {
// Meeting ID
"meetingUid": "",
// External meeting ID
"meetingExternalId": "",
// Quiz data
"quizData": {
// Total number of quiz attempts
"totalCount": 0,
// Quiz detail data
"detailDatas": [
{
// Question ID
"id": "",
// Question content and options
"content": {
// Options
"options": [
{
"value": "",
"label": ""
}
],
// Question content
"content": ""
},
// Average accuracy
"averageAccuracy": "",
// Correct answer
"correctAnswer": ""
}
]
},
// Poll data
"pollData": {
// Total number of polls
"totalCount": 0,
// Poll detail data
"detailDatas": [
{
// Poll ID
"id": "",
// Poll content and options
"content": {
// Options
"options": [
{
"value": "",
"label": ""
}
],
// Content
"content": ""
}
}
]
}
},
// Attendee interaction data
"attendeeInteractiveDatas": [
{
// Meeting ID
"meetingUid": "",
// External meeting ID
"meetingExternalId": "",
// Attendee ID
"attendeeUid": "",
// External attendee ID
"externalId": "",
// Attendee quiz data
"attendeeQuizData": {
// Number of quiz attempts
"count": 0,
// Quiz results
"answers": [
{
// Question ID
"id": "",
// Attendee username
"username": "",
// Question type
"questionType": "",
// Selection
"selection": ""
}
]
},
// Attendee poll data
"attendeePollData": {
// Number of poll attempts
"count": 0,
// Poll results
"answers": [
{
// Poll ID
"id": "",
// Attendee username
"username": "",
// Poll type
"pollType": "",
// Poll option
"pollOption": {
"value": "",
"label": ""
}
}
]
}
}
],
// After-class evaluation data
"evaluationData": [
{
// Attendee ID
"attendeeUid": "222883139968741376",
// External attendee ID
"externalId": "3f4cf897028313443fcf93e48a5fda60",
// Attendee role type
"attendeeType": "HOST",
// score
"score": 4,
// feedback
"feedback": [],
// review
"review": ""
}
]
}
Example of Meeting Data
{
"meetingData": {
"meetingUid": "103288082375249920",
"meetingExternalId": "123",
"scheduledStartTime": "1671519598",
"scheduledEndTime": "1692196976",
"startTime": "1672132286",
"endTime": "1672201926",
"duration": "2024"
},
"attendeeDatas": [
{
"meetingUid": "103288082375249920",
"meetingExternalId": "123",
"attendeeUid": "105859080664518656",
"externalId": "Q8NnQKOaWhax8cD195wB7Q==",
"timeIn": "1672132517",
"timeOut": "1672133011",
"device": "",
"details": [
{
"type": "AttendeeJoined",
"timestamp": 1672132517822
},
{
"type": "AttendeeLeft",
"timestamp": 1672132700326
},
{
"type": "AttendeeJoined",
"timestamp": 1672132952680
},
{
"type": "AttendeeLeft",
"timestamp": 1672133011815
}
]
}
],
"meetingVideoData": {
"meetingUid": "103288082375249920",
"meetingExternalId": "123",
"videoUrls": [
"<https://hilink-agora-record-dev.s3.amazonaws.com/31/11e35f12a24b170324e9b38307ee9011_VCaaS31104936_0.mp4?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Date=20230113T105238Z&X-Amz-SignedHeaders=host&X-Amz-Expires=3600&X-Amz-Credential=AKIA5MC3STOBSQDRGF7M%2F20230113%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Signature=f08aa8d30c2e12ef4a909824413a13e489d409f673013414cd4b444cb48b03b6>"
]
},
"meetingInteractiveData": {
"meetingUid": "103288082375249920",
"meetingExternalId": "123",
"quizData": {
"totalCount": 1,
"detailDatas": [
{
"id": "f8d836e56fb030b893e0f3a05bc487a9",
"content": {
"options": [
{
"value": "A",
"label": "ff"
},
{
"value": "B",
"label": "ffff"
}
],
"content": "jjjf"
},
"averageAccuracy": "",
"correctAnswer": "A"
}
]
},
"pollData": {
"totalCount": 1,
"detailDatas": [
{
"id": "65155160d48337ee47bcd634bd67bc66",
"content": {
"options": [
{
"value": "A",
"label": "fff"
},
{
"value": "B",
"label": "ffffff"
}
],
"content": "nihaoy"
}
}
]
}
},
"attendeeInteractiveDatas": [
{
"meetingUid": "103288082375249920",
"meetingExternalId": "123",
"attendeeUid": "106838452825362432",
"externalId": "FWhhpuTn1rUif3UM70gq7Q==",
"attendeeQuizData": {
"count": 1,
"answers": [
{
"id": "ef84a2b4634bd53dee901b59076a5d5d",
"username": "106838452825362432",
"questionType": "MULTIPLE_CHOICE",
"selection": "A"
}
]
},
"attendeePollData": {
"count": 1,
"answers": [
{
"id": "6f3d5e11338c834b667940f85e0da317",
"username": "106838452825362432",
"pollType": "MULTIPLE_CHOICE",
"pollOption": {
"value": "A",
"label": "hoa"
}
}
]
}
}
],
"evaluationData": [
{
"attendeeUid": "222883139968741376",
"externalId": "3f4cf897028313443fcf93e48a5fda60",
"attendeeType": "HOST",
"score": 4,
"feedback": [],
"review": ""
}
]
}
Manage Document
Users can use the VCaaS file interface to manage documents under their own organization. For more details, please refer to the content in the VCaaS API reference.
- get document lists: /v1/document-center/documents
- get one document: /v1/document-center/documents/{id}
- deleting documents: /v1/document-center/documents/{id}