vrl

Returns the recommended best CDN or resource to deliver video to each viewer.

Updated 2026-08-03 vrl

vrl

Gets the recommended the best CDN or Resource to deliver Video for each and every viewer.

Important: All CDN Resources (aliases or URLs) must be configured in the Precision Policy Engine before Precision is deployed to production.

Resource URI:

vrl.m.conviva.com/a.ism/Manifest

Method:

GET

Query Parameters

Example Query String:

?c3.vr={{version}}&c3.rt={{responseType}}&
c3.im={{integrationMode}}&c3.um={{urlMode}}&
c3.ck={{customerKey}}&c3.vp={{videoProtocol}}&
c3.ip={{ipAddress}}&c3.r1={{primaryCDN}}&
c3.r2={{otherCDN}}&c3.r3={{otherCDN}}&
c3.vi={{viewerID}}&c3.at={{assetType}}&
c3.ext.DEVICE_TYPE={{customerSpecific}}&
c3.ext.PLATFORM={{customerSpecific}}&
c3.ext.SERVICE_KEY={{customerSpecific}}&
c3.ext.CONTENT_ID={{customerSpecific}}

Required:

  • c3.vr={{version}} - Specifies the version of Precision. Currently, version '2'.
  • c3.ck={{customerKey}} - Specifies the customer key, a 40-character alphanumeric account identifier assigned by Conviva Customer Support.
  • c3.rt={{responseType}} - Defines the response type as 'p' for a priority list of ranked video startup parameters.
  • c3.im={{integrationMode}} - Specifies the integration mode as 'p' for CMS integration and 'd' for player integration.
  • c3.um={{urlMode}} - Indicates whether the asset’s URL paths are identical 'i' or different 'd' on the various CDNs..
  • c3.r1={{primaryCDN}} - Specifies the primary or default CDN resource used as a fallback if Precision does not have enough information to make a decision. When CDN paths are different, this must be a valid and complete CDN URL for the primary CDN. It must include hostname, path, and any query parameters. When CDN paths are identical, but PFX.r1 is required, PFX.r1 must at least have the scheme and hostname of the CDN URL (e.g. https://custA.fplive.net). PFX.r1 should correspond to a resource in the Precision Policy Engine. The latter is usually a prefix-match of PFX.r1.
  • c3.ip={{ipAddress}} - Specifies the end viewer's IPv4 address (dotted-decimal), used for geolocation. Required because the CMS/headend invokes the VRL on behalf of the viewer.

Optional:

  • c3.vp={{videoProtocol}} - Specifies the video protocol as:
    • p: Progressive Download
    • l: Apple HLS (lowercase L)
    • s: MS Smooth Streaming
    • d: Adobe HDS
    • m: MPEG DASH
    • w: MS Windows Media
    • o: Other
  • c3.cs={{customString}} - Enables the VRL request/device to be associated with a specific Precision policy, for example c3.cs=’mss’
  • c3.r2-r9={{otherCDN}} - Specifies other CDN resources. For multi-CDN selection, at least c3.r2 is required. You can specify up to a maximum of 9 resources.
  • c3.os={{operatingSystem}} - Specifies the string representing the Operating System of the video device. For example, MAC, WIN, IOS, AND, XBOX, PS3, ROKU, OTHER.
  • c3.ov={{operatingSystemVersion}} - Specifies the Full version number of the device's operating system.
  • c3.ua={{assetName}} - Specifies the user-agent of the video device, with appropriate URL-encoding. Although optional, this value is strongly recommended.
  • c3.an={{assetName}} - Specifies the name of the video asset, for example its title. We recommend that you include both a unique video ID and a human readable string.
  • c3.dt={{deviceType}} - Specifies the type of the video device. Use only one of device type at a time:
    • SETTOP: Streaming device, such as cable set-top boxes, Roku, or AppleTV.
    • TV: Connected TV used to watch the video in a browser or dedicated application.
    • MOBILE: Smartphone or feature phone used to watch the video in a browser or dedicated application.
    • CONSOLE: Game consoles, such as Xbox, Wii, etc.
    • TABLET: Tablet devices, such as Apple iPad or Amazon's Kindle Fire.
    • PC: Desktop computer or laptop.
    • BLURAY: Devices that can be used as both a Blu-ray player and a settop box, such as Samsung Blu-ray player.
    • OTHER: Any other unspecified type of device.
  • c3.db={{deviceBrand}} - Specifies a short string that identifies the device platform manufacturer. For example: 'Apple' or 'Samsung'.
  • c3.dm={{deviceModel}} - Specifies a short string that identifies the model version of the device. For example: 'iPhone4,1' or ‘GalaxyTab2'.
  • c3.dv={{deviceVersion}} - Specifies a short string that identifies the firmware version of the device.
  • c3.dc={{deviceConnection}} - Specifies a pre-defined string that identifies the device’s last-mile connection. Typically G, 4G, LTE, WWAN, WIFI, SAT, CABLE, ISDN, DIALUP, DSL, ETH, TX, FR, OCX, FIXWL, MOBWL, or OTHER. Definitions of the less common connection types are.
    • TX: T1, T3
    • FR: Frame Relay
    • FIXWL: Fixed Wireless
    • MOBWL: Mobile Wireless
  • c3.di={{deviceID}} - Specifies a short string that uniquely identifies a device, in case device-specific policies are needed.
  • c3.vi={{viewerID}} - Specifies a unique string that corresponds to a subscriber/viewer. Typically, this should be an obfuscated value of a service subscriber ID. This field is strongly recommended, if Viewer module is used.
  • c3.at={{assetType}} - Specifies a pre-defined string for the type of video content. Values include ON_DEMAND, LIVE_EVENT, LINEAR_LIVE, EVENT_REPLAY, DOWNLOAD, or OTHER.
  • c3.ext/key=value={{customerSpecific}} - Specifies customer-specific metadata to be used for policy control or analytics. All customer-specific keys must be prefixed with ‘ext’ to distinguish them from Conviva keys. The key and value are limited to 64 bytes of valid UTF-8 characters each. For example: c3.ext.serviceType=premium.

Example Request

Copy
curl
  'https://vrl.m.conviva.com/a.ism/Manifest?c3.vr=2&c3.rt=p&c3.im=p&c3.um=d&c3.ck=2d140fe495d9f8e824faa884f68ddb8141a42ddb&c3.vp=l&c3.ip=90.216.134.196&c3.r1=CDN_A&c3.r2=CDN_B&c3.r3=CDN_C&c3.vi=12345&c3.at=ON_DEMAND&c3.ext.DEVICE_TYPE=MOBILE&c3.ext.PLATFORM=iOS&c3.ext.SERVICE_KEY=432213&c3.ext.CONTENT_ID=123' \

Copy
import base64
import http.client

conn = http.client.HTTPSConnection("vrl.m.conviva.com")

headers = {
    'Cache-Control': 'no-cache',
    }

api = "/a.ism/Manifest?"
query = "c3.vr=2&c3.rt=p&c3.im=p&c3.um=d&c3.ck=2d140fe495d9f8e824faa884f68ddb8141a42ddb&c3.vp=l&c3.ip=90.216.134.196&c3.r1=CDN_A&c3.r2=CDN_B&c3.r3=CDN_C&c3.vi=12345&c3.at=ON_DEMAND&c3.ext.DEVICE_TYPE=MOBILE&c3.ext.PLATFORM=iOS&c3.ext.SERVICE_KEY=432213&c3.ext.CONTENT_ID=123"
path = api + query
conn.request("GET", path, headers=headers)

res = conn.getresponse()
data = res.read()

print(data.decode("utf-8"))

Copy
var data = null;

var xhr = new XMLHttpRequest();

xhr.addEventListener("readystatechange", function () {
  if (this.readyState === 4) {
    console.log(this.responseText);
  }
});

xhr.open("GET", "https://vrl.m.conviva.com/a.ism/Manifest?c3.vr=2&c3.rt=p&c3.im=p&c3.um=d&c3.ck=2d140fe495d9f8e824faa884f68ddb8141a42ddb&c3.vp=l&c3.ip=90.216.134.196&c3.r1=CDN_A&c3.r2=CDN_B&c3.r3=CDN_C&c3.vi=12345&c3.at=ON_DEMAND&c3.ext.DEVICE_TYPE=MOBILE&c3.ext.PLATFORM=iOS&c3.ext.SERVICE_KEY=432213&c3.ext.CONTENT_ID=123");
xhr.setRequestHeader("cache-control", "no-cache");

xhr.send(data);

<?php

$request = new HttpRequest();
$request->setUrl('https://vrl.m.conviva.com/a.ism/Manifest?c3.vr=2&c3.rt=p&c3.im=p&c3.um=d&c3.ck=2d140fe495d9f8e824faa884f68ddb8141a42ddb&c3.vp=l&c3.ip=90.216.134.196&c3.r1=CDN_A&c3.r2=CDN_B&c3.r3=CDN_C&c3.vi=12345&c3.at=ON_DEMAND&c3.ext.DEVICE_TYPE=MOBILE&c3.ext.PLATFORM=iOS&c3.ext.SERVICE_KEY=432213&c3.ext.CONTENT_ID=123');
$request->setMethod(HTTP_METH_GET);

$request->setQueryData(array(
  'account' => 'c3.Demo'
));

$request->setHeaders(array(
  'cache-control' => 'no-cache'
));

try {
  $response = $request->send();

  echo $response->getBody();
} catch (HttpException $ex) {
  echo $ex;
}

Copy
OkHttpClient client = new OkHttpClient();

Request request = new Request.Builder()
  .url("https://vrl.m.conviva.com/a.ism/Manifest?c3.vr=2&c3.rt=p&c3.im=p&c3.um=d&c3.ck=2d140fe495d9f8e824faa884f68ddb8141a42ddb&c3.vp=l&c3.ip=90.216.134.196&c3.r1=CDN_A&c3.r2=CDN_B&c3.r3=CDN_C&c3.vi=12345&c3.at=ON_DEMAND&c3.ext.DEVICE_TYPE=MOBILE&c3.ext.PLATFORM=iOS&c3.ext.SERVICE_KEY=432213&c3.ext.CONTENT_ID=123")
  .get(null)
  .addHeader("cache-control", "no-cache")
  .build();

Response response = client.newCall(request).execute();

Success Response

Note: Note: The metadata settings configured during the player integration determine the fields that appear in the viewer response.

Response Code:

200

Response Type:

application/json

Response Description:

For a successful Priority List response, Precision responds with a list of resources. The list includes the selected resource, the CDN name, and the priority of this resource. Resource with highest priority should be used. The response also includes a request identifier (c3.ri).

key Parameter Description
is_error --- If true, 'error_code' and 'error_message' (see below) may also be present. If false, the resource list may be present.
error_code --- An error code that maps to a specific problem.
error_message --- A description of the error.
warning_message --- A warning message that might be generated along with an otherwise successful response.
resource_list --- List of CDN resources. Each resource is assigned a priority. Resource with highest priority is expected to provide the best video quality for the requesting video session.
--- resource Resource for the selected CDN. Typically this is one of the resources passed in the VRL request, or configured in the Policy Engine, and follows the format (scheme://hostname).
--- priority Priority of the specified resource. The proxy is expected to point the video playback device to the top priority (p = 1) resource from the list. It may fail back to lower priority resources only when the higher priority resources are not available.
vrl --- The VRL that generated the response. Repeating the VRL in the response allows for easy debugging in case of errors.
cdn --- Name of the selected CDN from Conviva’s published list of CDN canonical names (e.g. “AKAMAI”, “LEVEL3”, “LIMELIGHT”, etc.).

Important: Key and value of c3.ri MUST be appended as an additional query parameter, as-is, to the end of all of the CDN URLs that are generated and sent to the video player. This parameter allows for the Conviva Conviva VSI session to be correlated with the respective Precision response. As this happens, the Conviva platform adds the tags from the VRL request to the Conviva VSI session, which enables optimization by any parameter included in the VRL request.

Example JSON Response

{"c3.ri":"5688238005746815660",
"is_error":false,
"resource_list":[
{
  "cdn":"CDN_A",
"priority":1,
"resource":"CDN A"
},
{
"cdn":"CDN_B",
"priority":2,
"resource":"CDN B"
},
{
"cdn":"CDN_C",
"priority":3,
"resource":"CDN C"
}
],
"vrl":
"https://vrl.m.conviva.com/a.ism/Manifest?c3.vr=2&c3.rt=p&c3.im=p&c3.um=d&c3.ck=2d140fe495d9f8e824faa884f68ddb8141a42ddb&c3.vp=l&c3.ip=90.216.134.196&c3.r1=CDN_A&c3.r2=CDN_B&c3.r3=CDN_C&c3.vi=12345&c3.at=ON_DEMAND&c3.ext.DEVICE_TYPE=MOBILE&c3.ext.PLATFORM=iOS&c3.ext.SERVICE_KEY=432213&c3.ext.CONTENT_ID=123"}

Common Error Responses

If an error occurs while processing a VRL request, an appropriate HTTP Status code is returned with a message body that contains a JSON-format message string that describes the error scenario.

Code: 200 Required resources do not match those in the Precision Policy Engine
Code: 200 Missing parameter "c3.ip"
Code: 400 Invalid VRL version
Code: 400 VRL query-parameters can not be parsed successfully.
Code: 400 Required resources are not available in the VRL and CDN URL paths are different
Code: 500 Server Processing Error

More Information

See Precision API User Guide.