# Calls Recording

Recording capabilities are provided by server component called VidyoReplay. Your VidyoPlatform tenant should contain VidyoReplay component configured in advance in order to make calls recording. All the API methods are SOAP based, and you can find entire API reference guide document here: <https://www.vidyo.com/help/VidyoPlatform/4_Server-API/VidyoPlatform-Web-Services-API-Guide.pdf>

In this article we will cover how to start and stop recording, how to ensure the recording process has been started successfully, and how to search and download recording file.

## Start Recording

At first, in order to record the conference, you need to have a room created, and at least one participant connected to that room.

### Create a Room

We will be using Scheduled type of rooms onwards. So let's create one using **VidyoPortalUserService** and **CreateScheduledRoom** API:

```xml
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:v1="http://portal.vidyo.com/user/v1_1">
   <soapenv:Header/>
   <soapenv:Body>
      <v1:CreateScheduledRoomRequest>       
      </v1:CreateScheduledRoomRequest>
   </soapenv:Body>
</soapenv:Envelope>
```

You will receive a response containing various fields as showed in [Getting Started](/vidyoplatform/getting-started.md#obtain-and-understand-the-response), but here we will need only **roomURL** response field value:

```xml
<ns1:roomURL>https://test.platform.vidyo.io/join/Nf5kaN9tWo</ns1:roomURL>
```

And even not entire room link, but **RoomKey** specifically: <mark style="color:green;">Nf5kaN9tWo</mark>

### Get ConferenceID (EntityID)

For this we will use **GetEntityByRoomKey** API, passing in above **RoomKey** value:

```xml
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:v1="http://portal.vidyo.com/user/v1_1">
   <soapenv:Header/>
   <soapenv:Body>
      <v1:GetEntityByRoomKeyRequest>
         <v1:roomKey>Nf5kaN9tWo</v1:roomKey>
      </v1:GetEntityByRoomKeyRequest>
   </soapenv:Body>
</soapenv:Envelope>
```

Response object will contain a lot of fields about the room you just created, but you will need the first one - **entityID**, that in this case is <mark style="background-color:green;">4092486</mark>**:**

```xml
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
   <soapenv:Header/>
   <soapenv:Body>
      <ns1:GetEntityByRoomKeyResponse xmlns:ns1="http://portal.vidyo.com/user/v1_1">
         <ns1:Entity>
            <ns1:entityID>4092486</ns1:entityID>
            <ns1:EntityType>Room</ns1:EntityType>
            <ns1:ownerID>156418</ns1:ownerID>
            <ns1:displayName>230301302</ns1:displayName>
            .....
```

### Select Recorder Prefix

There is a **Recording Profile** - it basically specifies what and how to record - video tiles and content share, content share only or preferably, etc. So it's a mode that you select based on your needs.&#x20;

Recording profiles are configured on a Tenant level, so in reality you will not need to retrieve the list of available recording profiles each time you start the recording. However, you can use **GetRecordingProfiles** API to be sure of available recording profiles configured on your system:

```xml
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:v1="http://portal.vidyo.com/user/v1_1">
   <soapenv:Header/>
   <soapenv:Body>
      <v1:GetRecordingProfilesRequest/>
   </soapenv:Body>
</soapenv:Envelope>
```

Here is the typical response, and we will need **recorderPrefix** field value, let's take <mark style="background-color:green;">000</mark> that means APPLICATION-AND-CONFERENCE recording mode.&#x20;

### Start Recording

At this point we have all necessary information required to start the recording:

* [ ] ConferenceID = <mark style="background-color:green;">4092486</mark>
* [ ] RecorderPrefix =  <mark style="background-color:green;">000</mark>&#x20;

So, let's use **StartRecording** API to actually start the recording process:

```xml
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:v1="http://portal.vidyo.com/user/v1_1">
   <soapenv:Header/>
   <soapenv:Body>
      <v1:StartRecordingRequest>
         <v1:conferenceID>4092486</v1:conferenceID>
         <v1:recorderPrefix>000</v1:recorderPrefix>
         <v1:webcast>false</v1:webcast>
      </v1:StartRecordingRequest>
   </soapenv:Body>
</soapenv:Envelope>
```

After sending above request you should expect an HTTP200-OK response.&#x20;

{% hint style="info" %}
**StartRecordingResponse** of HTTP200 doesn't necessarily mean that VidyoReplay actually started recording the conference. How to ensure the recording has been indeed started is covered later in this article.
{% endhint %}

## Stop Recording

For stopping ongoing recording we will need to know **ConferenceID** and **RecorderID** values.

### Get RecorderID

When the conference is being recorded by VidyoReplay it technically means that VidyoReplay has also joined the call, and you can think of it as of another participant in the call. Therefore, at this step we will get information about participants in the conference that is being recorded, and extract RecorderID. For this we will use GetParticipants API, passing in **ConferenceID** value:

```xml
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:v1="http://portal.vidyo.com/user/v1_1">
   <soapenv:Header/>
   <soapenv:Body>
      <v1:GetParticipantsRequest>
         <v1:conferenceID>4092486</v1:conferenceID>
      </v1:GetParticipantsRequest>
   </soapenv:Body>
</soapenv:Envelope>
```

Below is a chunk of the typical response you will receive, that contains **recorderID** field: <mark style="background-color:green;">1109054</mark>

```xml
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
   <soapenv:Header/>
   <soapenv:Body>
      <ns1:GetParticipantsResponse xmlns:ns1="http://portal.vidyo.com/user/v1_1">
         <ns1:total>1</ns1:total>
         <ns1:recorderID>1109054</ns1:recorderID>
         <ns1:recorderName>APPLICATION-AND-CONFERENCE</ns1:recorderName>
         <ns1:paused>false</ns1:paused>
         <ns1:webcast>false</ns1:webcast>
         <ns1:Entity>
            <ns1:entityID>0</ns1:entityID>
            <ns1:participantID>6611572</ns1:participantID>
            ...
```

{% hint style="info" %}
Note that if **recorderID** is not present in the response, that it means that the conference is not being recorded.
{% endhint %}

So, at this stage we have all we need for stopping the recording:

* [ ] ConferenceID = <mark style="background-color:green;">4092486</mark>
* [ ] RecorderID = <mark style="background-color:green;">1109054</mark>

### Stop recording

For this we will use **StopRecording** API:

```xml
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:v1="http://portal.vidyo.com/user/v1_1">
   <soapenv:Header/>
   <soapenv:Body>
      <v1:StopRecordingRequest>
         <v1:conferenceID>4092486</v1:conferenceID>
         <v1:recorderID>1109054</v1:recorderID>
      </v1:StopRecordingRequest>
   </soapenv:Body>
</soapenv:Envelope>
```

## Pause and Resume Recording

For pausing and resuming ongoing recording you can use **PauseRecording** and **ResumeRecording** APIs accordingly. Each of these requires the same **ConferenceID** and **RecorderID** parameters.

## Search Recordings

Once the call has ended and recording has been completed, you typically may need to find this or any other recording file. All the recording are being stored on the **VidyoReplay** server, and it has its own set of APIs the allow search, update, and delete recordings. In cloud Vidyo environments the wsdl URI will look as the following:

<mark style="color:blue;">https\://{TenantName}.replay.platform.vidyo.io/replay/services/VidyoReplayContentManagementService?wsdl</mark>

To search for recording you will have to use **RecordsSearch** API. Example:

```xml
<s11:Envelope xmlns:s11='http://schemas.xmlsoap.org/soap/envelope/'>
  <s11:Body>
    <ns1:RecordsSearchRequest xmlns:ns1='http://replay.vidyo.com/apiservice'>
      <ns1:tenantName>test</ns1:tenantName>
      <ns1:roomFilter></ns1:roomFilter>
      <ns1:usernameFilter>vova</ns1:usernameFilter>
      <ns1:query></ns1:query>
      <ns1:recordScope></ns1:recordScope>
      <ns1:sortBy>date</ns1:sortBy>
      <ns1:dir>ASC</ns1:dir>
      <ns1:limit>100</ns1:limit>
      <ns1:start></ns1:start>
      <ns1:webcast></ns1:webcast>
    </ns1:RecordsSearchRequest>
  </s11:Body>
</s11:Envelope>
```

The above request filters recordings on VidyoReplay and returns those which are made on the tenant with name containing "test", recorded by user "vova", then sorts results by date in ascending order, and finally limits results number to 100.

As you can see, there are more filters to apply in request body that allows you to construct your search really precisely if needed.

Here what the response chunk looks like:

```xml
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
    <soapenv:Body>
        <ns1:RecordsSearchResponse xmlns:ns1="http://replay.vidyo.com/apiservice">
            <ns1:allVideosCount>37</ns1:allVideosCount>
            <ns1:searchCount>9</ns1:searchCount>
            <ns1:myVideosCount>37</ns1:myVideosCount>
            <ns1:webcastCount>0</ns1:webcastCount>
            <ns1:newCount>37</ns1:newCount>
            <ns1:privateCount>0</ns1:privateCount>
            <ns1:organizationalCount>0</ns1:organizationalCount>
            <ns1:publicCount>0</ns1:publicCount>
            <ns1:records>
                <ns1:id>4908</ns1:id>
                <ns1:guid>bce75e5c-e850-5c4c-8f1e-c9b705eff420</ns1:guid>
                <ns1:tenantName>VidyoTest</ns1:tenantName>
                <ns1:userName>vova</ns1:userName>
                <ns1:userFullName>Vova Tareiev</ns1:userFullName>
                <ns1:dateCreated>2022-08-08T09:48:44.000+00:00</ns1:dateCreated>
                <ns1:dateCreatedString>Mon August 8 2022 09:48:44</ns1:dateCreatedString>
                <ns1:endTime>2022-08-08T09:50:32.000+00:00</ns1:endTime>
                <ns1:duration>01:48</ns1:duration>
                <ns1:resolution>HD</ns1:resolution>
                <ns1:framerate>30</ns1:framerate>
                <ns1:pin></ns1:pin>
                <ns1:recordScope>New</ns1:recordScope>
                <ns1:title>vova conference recording.</ns1:title>
                <ns1:roomName>vova</ns1:roomName>
                <ns1:fileLink>https://test.replay.platform.vidyo.io/replay/downloadRecording.do?file=bce75e5c-e850-5c4c-8f1e-c9b705eff420</ns1:fileLink>
                <ns1:recorderId>421aa0067</ns1:recorderId>
                <ns1:webcast>false</ns1:webcast>
                <ns1:tags></ns1:tags>
                <ns1:comments></ns1:comments>
                <ns1:locked>false</ns1:locked>
                <ns1:externalPlaybackLink>https://test.replay.platform.vidyo.io/replay/showRecordingExternal.html?key=IG3bxGBxhaiknT8</ns1:externalPlaybackLink>
                <ns1:fileSize>1493016</ns1:fileSize>
            </ns1:records>
            <ns1:records>
                <ns1:id>5748</ns1:id>
                <ns1:guid>37b8355d-e84c-53bc-8a53-478c15384f13</ns1:guid>
                <ns1:tenantName>VidyoTest</ns1:tenantName>
                <ns1:userName>vova</ns1:userName>
                <ns1:userFullName>Vova Tareiev</ns1:userFullName>
                <ns1:dateCreated>2022-09-22T10:46:04.000+00:00</ns1:dateCreated>
                <ns1:dateCreatedString>Thu September 22 2022 10:46:04</ns1:dateCreatedString>
                <ns1:endTime>2022-09-22T10:50:03.000+00:00</ns1:endTime>
                <ns1:duration>03:59</ns1:duration>
                <ns1:resolution>HD</ns1:resolution>
                <ns1:framerate>30</ns1:framerate>
                <ns1:pin></ns1:pin>
                <ns1:recordScope>New</ns1:recordScope>
                <ns1:title>vova conference recording.</ns1:title>
                <ns1:roomName>vova</ns1:roomName>
                <ns1:fileLink>https://test.replay.platform.vidyo.io/replay/downloadRecording.do?file=37b8355d-e84c-53bc-8a53-478c15384f13</ns1:fileLink>
                <ns1:recorderId>421aa0067</ns1:recorderId>
                <ns1:webcast>false</ns1:webcast>
                <ns1:tags></ns1:tags>
                <ns1:comments></ns1:comments>
                <ns1:locked>false</ns1:locked>
                <ns1:externalPlaybackLink>https://test.replay.platform.vidyo.io/replay/showRecordingExternal.html?key=b09ExKntmYcd9h9</ns1:externalPlaybackLink>
                <ns1:fileSize>3258210</ns1:fileSize>
            </ns1:records>
            [...]
        </ns1:RecordsSearchResponse>
    </soapenv:Body>
</soapenv:Envelope>
```

As you can see, the response contains some general information about total recording such as overall count and found number, as well as list of nodes - each for specific found recording.

## Download Recording

There are two options of how you can download the recording. First is manual - you simply go to your **VidyoReplay** server Admin Manager ([https://{TenantName}.replay.platform.vidyo.io/replay](https://test.replay.platform.vidyo.io/replay/)) and click a  button to download.

Another options that you definitely will like better is to do this programmatically by simply using common tools such as **wget** or **curl:**

```bash
curl  -H "Authorization: Basic dGFyYXM6cXrlcjA2MjI=" "https://{TenantName}.replay.platform.vidyo.io/replay/downloadRecording.do?file=2ffdffd7-c66d-5ba0-9ff4-2810c54fc968" --output recording.mp4
```

where first argument is a header with your Base64-encoded auth, second is <mark style="color:blue;">fileLink</mark> field from the <mark style="color:blue;">RecordsSearch</mark> response above, and finally an output file name.<br>


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://enghouse-vidyo.gitbook.io/vidyoplatform/use-cases/calls-recording.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
