Meeting Room Management

This guide will show you how to:

Individual Room Retrieval

GET: https://api-eu.vonage.com/v1/meetings/rooms/:room_id

When you create a room, you will get a room id in the response. This id can be used for room retrieval using a GET request.

Example Request

curl -X GET 'https://api-eu.vonage.com/v1/meetings/rooms/9f6fe8ae-3458-4a72-b532-8276d5533e97' \ -H 'Authorization: Bearer '$JWT
const credentials = new Auth({
    privateKey: VONAGE_APPLICATION_PRIVATE_KEY_PATH,
    applicationId: VONAGE_APPLICATION_ID,
});
const options = {};

const meetingsClient = new Meetings(credentials, options);
const room = await meetingsClient.getRoom("9f6fe8ae-3458-4a72-b532-8276d5533e97");
var client = VonageClient.builder()
    .applicationId(VONAGE_APPLICATION_ID)
    .privateKeyPath(VONAGE_PRIVATE_KEY_PATH)
    .build();
var room = client.getMeetingsClient().getRoom(
    UUID.fromString("9f6fe8ae-3458-4a72-b532-8276d5533e97")
);
var credentials = Credentials.FromAppIdAndPrivateKeyPath(applicationId, privateKeyPath);
var client = new VonageClient(credentials);
var request = GetRoomRequest.Parse(new Guid("9f6fe8ae-3458-4a72-b532-8276d5533e97"));
var response = await client.MeetingsClient.GetRoomAsync(request);
$keypair = new Vonage\Client\Keypair(
    VONAGE_APPLICATION_PRIVATE_KEY_PATH
    VONAGE_APPLICATION_ID,
);

$client = new Vonage\Client($keypair);

$recording = $client->meetings()->getRoom('9f6fe8ae-3458-4a72-b532-8276d5533e97');
client = vonage.Client(
    application_id=VONAGE_APPLICATION_ID,
    private_key=VONAGE_APPLICATION_PRIVATE_KEY_PATH,
)

response = client.meetings.get_room('9f6fe8ae-3458-4a72-b532-8276d5533e97')
client = Vonage::Client.new(
  application_id: ENV["VONAGE_APPLICATION_ID"],
  private_key: File.read(ENV["VONAGE_APPLICATION_PRIVATE_KEY_PATH"])
)

room = client.meetings.rooms.info(room_id: "49d900c8-372b-4c9e-b682-5601cbdc1f7a")

This will return a generic Vonage::Response object.

The Vonage::Response object de-serializes the returned JSON data into Vonage::Entity objects, and provides getter methods for the top level properties of that JSON data, for example:

room.display_name # => "Room 1"
room.type # => "instant"

For properties in the JSON data where the value is a JSON object, this is itself de-serialized into a Vonage::Entity object, with its own getter methods. For example, the recording_options getter returns a Vonage::Entity object with auto_record and record_only_owner getters. You can chain these getter method invocations to get to the data you need:

room.recording_options.auto_record # => false

The response will be identical whether the room is long term or instant.

Example Response

{
   "id": "9f6fe8ae-3458-4a72-b532-8276d5533e97",
   "display_name": "My custom room",
   "metadata": "Welcome to my custom room",
   "type": "instant",
   "recording_options": {
      "auto_record": false,
      "record_only_owner": false
   },
   "meeting_code": "280674154",
   "is_available": true,
   "theme_id": "ef2b46f3-8ebb-437e-a671-272e4990fbc8",
   "created_at": "2023-06-06T06:45:07.135Z",
   "expires_at": "2023-06-06T06:55:07.134Z",
   "expire_after_use": true,
   "join_approval_level": "none",
   "initial_join_options": {
      "microphone_state": "on"
   },
   "callback_urls": {
      "rooms_callback_url": "https://example.com/rooms",
      "sessions_callback_url": "https://example.com/sessions",
      "recordings_callback_url": "https://example.com/recordings"
   },
   "available_features": {
      "is_recording_available": true,
      "is_chat_available": true,
      "is_whiteboard_available": true,
      "is_locale_switcher_available": true,
      "is_captions_available": false
   },
   "ui_settings": {
      "language": "es"
   },
   "_links": {
      "guest_url": {
         "href": "https://meetings.vonage.com/280674154"
      },
      "host_url": {
         "href": "https://meetings.vonage.com/?room_token=280674154&participant_token=eyJhbGciOiJIUzI1NiIsInR5cC"
      }
   }
}

Retrieve all Rooms

GET: https://api-eu.vonage.com/v1/meetings/rooms/

To retrieve all rooms, send a GET request without a the room id:

Example Request

curl -X GET 'https://api-eu.vonage.com/v1/meetings/rooms/' \ -H 'Authorization: Bearer '$JWT
const credentials = new Auth({
    privateKey: VONAGE_APPLICATION_PRIVATE_KEY_PATH,
    applicationId: VONAGE_APPLICATION_ID,
});
const options = {};

const meetingsClient = new Meetings(credentials, options);
const rooms =  meetingsClient.getRooms();
var client = VonageClient.builder()
    .applicationId(VONAGE_APPLICATION_ID)
    .privateKeyPath(VONAGE_PRIVATE_KEY_PATH)
    .build();
var rooms = client.getMeetingsClient().listRooms();
var credentials = Credentials.FromAppIdAndPrivateKeyPath(applicationId, privateKeyPath);
var client = new VonageClient(credentials);
var request = GetRoomsRequest.Build().Create();
var response = await client.MeetingsClient.GetRoomsAsync(request);
$keypair = new Vonage\Client\Keypair(
    VONAGE_APPLICATION_PRIVATE_KEY_PATH
    VONAGE_APPLICATION_ID,
);

$client = new Vonage\Client($keypair);

$recordings = $client->meetings()->getAllListedRooms();
client = vonage.Client(
    application_id=VONAGE_APPLICATION_ID,
    private_key=VONAGE_APPLICATION_PRIVATE_KEY_PATH,
)

response = client.meetings.list_rooms()
client = Vonage::Client.new(
  application_id: ENV["VONAGE_APPLICATION_ID"],
  private_key: File.read(ENV["VONAGE_APPLICATION_PRIVATE_KEY_PATH"])
)

rooms_list = client.meetings.rooms.list

This will return an object of the Vonage::Meetings::Rooms::ListResponse class.

This class defines an each method, allowing you to iterate through the _embedded array returned in ther response. For example:

rooms_list.each {|room| puts room.display_name}
# => "Room One"
# => "Room Two"

The class also includes Enumerable, so you can call any instance method from that module on the object. For example:

instant_rooms = rooms_list.select {|room| room.type == "instant"}

Example Response

{
   "page_size": 25,
   "total_items": 30,
   "_embedded": [
      {
         "id": "9f6fe8ae-3458-4a72-b532-8276d5533e97",
         "display_name": "My custom room",
         "metadata": "Welcome to my custom room",
         "type": "instant",
         "recording_options": {
            "auto_record": false,
            "record_only_owner": false
         },
         "meeting_code": "280674154",
         "is_available": true,
         "theme_id": "ef2b46f3-8ebb-437e-a671-272e4990fbc8",
         "created_at": "2023-06-06T06:45:07.135Z",
         "expires_at": "2023-06-06T06:55:07.134Z",
         "expire_after_use": true,
         "join_approval_level": "none",
         "initial_join_options": {
            "microphone_state": "on"
         },
         "callback_urls": {
            "rooms_callback_url": "https://example.com/rooms",
            "sessions_callback_url": "https://example.com/sessions",
            "recordings_callback_url": "https://example.com/recordings"
         },
         "available_features": {
            "is_recording_available": true,
            "is_chat_available": true,
            "is_whiteboard_available": true,
            "is_locale_switcher_available": true,
            "is_captions_available": false
         },
         "ui_settings": {
            "language": "es"
         },
         "_links": {
            "guest_url": {
               "href": "https://meetings.vonage.com/280674154"
            },
            "host_url": {
               "href": "https://meetings.vonage.com/?room_token=280674154&participant_token=eyJhbGciOiJIUzI1NiIsInR5cC"
            }
         }
      }
   ],
   "_links": {
      "first": {
         "href": "https://api-eu.vonage.com/v1/meetings/rooms?page_size=50"
      },
      "self": {
         "href": "https://api-eu.vonage.com/v1/meetings/rooms?page_size=50&start_id=2293905"
      },
      "next": {
         "href": "https://api-eu.vonage.com/v1/meetings/rooms?page_size=50&start_id=2293906"
      },
      "prev": {
         "href": "https://api-eu.vonage.com/v1/meetings/rooms?page_size=50&start_id=2293904"
      }
   }
}

Expiration Update

PATCH: https://api-eu.vonage.com/v1/meetings/rooms/

The expiration date of a long term room can be updated by using a PATCH action and the room id. The new date should be included in an object called update_details:

Example Request

curl -X PATCH 'https://api-eu.vonage.com/v1/meetings/rooms/9f6fe8ae-3458-4a72-b532-8276d5533e97' \ -H 'Content-Type: application/json' \ -H 'Authorization: Bearer '$JWT \ -d '{ "update_details": { "expires_at": "2022-11-11T16:00:00.000Z" } }'
const credentials = new Auth({
    privateKey: VONAGE_APPLICATION_PRIVATE_KEY_PATH,
    applicationId: VONAGE_APPLICATION_ID,
});
const options = {};

const meetingsClient = new Meetings(credentials, options);
const room = await meetingsClient.getRoom("9f6fe8ae-3458-4a72-b532-8276d5533e97");
room.expiresAt = '2022-11-11T16:00:00.000Z';
await meetingsClient.updateRoom("9f6fe8ae-3458-4a72-b532-8276d5533e97", room);
var client = VonageClient.builder()
    .applicationId(VONAGE_APPLICATION_ID)
    .privateKeyPath(VONAGE_PRIVATE_KEY_PATH)
    .build();
var room = client.getMeetingsClient().updateRoom(
    UUID.fromString("9f6fe8ae-3458-4a72-b532-8276d5533e97"),
    UpdateRoomRequest.builder()
        .expiresAt(Instant.parse("2022-11-11T16:00:00.000Z"))
        .build()
);
var credentials = Credentials.FromAppIdAndPrivateKeyPath(applicationId, privateKeyPath);
var client = new VonageClient(credentials);
var request = UpdateRoomRequest.Build()
    .WithRoomId(new Guid("9f6fe8ae-3458-4a72-b532-8276d5533e97"))
    .WithExpiresAt(DateTime.Parse("2022-11-11T16:00:00.000Z"))
    .Create();
var response = await client.MeetingsClient.UpdateRoomAsync(request);
$keypair = new Vonage\Client\Keypair(
    VONAGE_APPLICATION_PRIVATE_KEY_PATH
    VONAGE_APPLICATION_ID,
);

$client = new Vonage\Client($keypair);

$applicationTheme = $client->meetings()->updateRoom('9f6fe8ae-3458-4a72-b532-8276d5533e97' [
    'update_details' => [
        'expires_at' => '2023-11-11T16:00:00.000Z',
    ]
]);
client = vonage.Client(
    application_id=VONAGE_APPLICATION_ID,
    private_key=VONAGE_APPLICATION_PRIVATE_KEY_PATH,
)

response = client.meetings.update_room(
    '9f6fe8ae-3458-4a72-b532-8276d5533e97', 
    {'update_details': {'expires_at': '2023-11-11T16:00:00.000Z'}},
)
client = Vonage::Client.new(
  application_id: ENV["VONAGE_APPLICATION_ID"],
  private_key: File.read(ENV["VONAGE_APPLICATION_PRIVATE_KEY_PATH"])
)

room = client.meetings.rooms.update(
  room_id: "9f6fe8ae-3458-4a72-b532-8276d5533e97",
  expires_at: "2023-11-11T16:00:00.000Z"
)

Please note that only long term rooms can be updated.