Video-v3 API Reference
Video Streaming API
The video streaming API is used by customers to:
- Retrieve the schedule of upcoming streams.
- Retrieve the streaming parameters for a particular fixture.
- Retrieve the full list of supported regions for playback.
This API does not deliver the video stream itself, it only tells what are the specific parameters for streaming a given
fixture. It is up to the users of this API to configure a video player with the streaming parameters.
This API must never be called from end-user browser/client code. Instead, the API should be integrated into server-side
systems.
Domain model
The diagram below illustrates the main objects exposed in the API and their relationships:
Fixtures
Fixtures are the main objects in the API. They encapsulate video streaming information for a given GeniusSports fixture.
One fixture contains basic information such as the Genius fixture ID, name, start time and phase (see below), as well as
a list of available LiveStreams to get video from.
The phase of a fixture is defined by the state-machine:
where:
- PRE_MATCH: indicates a fixture has not started yet.
-
IN_PLAY: this phase starts when the current UTC time is greater or equal to the startAt date reported for the
fixture. - RESULTED: indicates that a fixture has been completed.
Live streams and deliveries
A
LiveStream represents one video feed for a given fixture. Tipically, a fixture will only have one stream
available, however the API is designed to support several streams for the same fixture. Within each live stream, video
can be delivered on several transport protocols (HLS, DASH, etc), described by the
StreamDeliveries object.
The
StreamDeliveries object defines the sources for delivering the stream on a given transport protocol. Currently,
HLS and DASH are supported. For each protocol, there can be several sources serving the video content (e.g., primary and
backup CDN).
Each transport protocol defines its own {Protocol}Delivery
object containing protocol-specific information.
Currently, the liveStreams
capability is offered while a given fixture is in the IN_PLAY
phase. After that,
the liveStreams
becomes empty.
VOD streams and delivery
A
VodStream represents the recording of a successfully completed fixture. The recording occurs after the fixture is
completed and transitions to the RESULTED
phase. Internally, the recording is processed and becomes available to the
API after some period of time. During this processing, the API will return an empty vodStreams
array. Currently,
only HLS
recordings are supported, and shares the HLSDelivery
type definition.
Permissions
Each live and VOD stream includes a list of permissions. These permissions encapsulates the licensing conditions to
stream content. In order to play a stream, viewers must fully comply with at least one permission.
Each permission object is defined by three attributes:
region
: indicates a geographic zone in the world where the streaming of the fixture is allowed. A region can be a
country or a specific region/state/province inside a country. Example: GB (United Kingdom), US_CA (United states -
California), ES (Spain).device
: the current device types are:MOBILE
: devices whose diagonal screen size is 7 inches or less.TABLET
: portable devices (e.g. Android tablets or iPad) whose diagonal screen size is greater than 7 inches.DESKTOP
: laptop and desktop machines.OTT
: (Over The Top) devices such as game consoles, AndroidTV or AppleTV.maxPlayerSizePercentage
: the maximum size, in percentage units in the range [0, 100], of the video player along the
horizontal axis of the display screen. This attribute is intended to be used by websites to show the player with a
permitted size in the screen.
The JSON example below illustrates a list of permissions:
- License is granted for the United Kingdom
GB
, forDESKTOP
devices, with a maximum player size of 40% of the screen
size. - License is granted for streaming the fixture in Italy (
IT
) forMOBILE
devices at 100% screen size, and
forTABLET
devices at 50% screen size.
{
"permissions": [
{
"device": "DESKTOP",
"maxPlayerSizePercentage": 40,
"region": "GB"
},
{
"device": "MOBILE",
"maxPlayerSizePercentage": 100,
"region": "IT"
},
{
"device": "TABLET",
"maxPlayerSizePercentage": 50,
"region": "IT"
}
]
}
DMAs
Each live and VOD stream includes a list of dmas. This list encapsulates the licensing conditions to stream content
in some DMAs (Designated Market Area) inside the United States. In order to play a stream, the viewer must be in one of
the alllowed areas.
Each DmaPermission object is defined by just one attribute:
dma
: Defines the DMA code inside United States where the content can be consumed. Example:
501
refers to the New York City DMA code, which contains some areas in the states of Connecticut (CT), New Jersey
(NJ), New York (NY) and Pensilvania (PA).
The JSON example below illustrates a list of dmas:
- License is granted for the DMAs
501
and811
which refers to the cities of New York and Reno in the United states,
The list of dmas is associated to the list of permissions, i.e. you will only see DMAs that are available in the
regions to which you have a license.
{
"dmas": [
{
"dma": "501"
},
{
"dma": "811"
}
]
}
Backend integration
Base url
The base URL for the API is https://api.geniussports.com/Video-v3/{STAGE}. where {STAGE}
can be one of:
UAT
PRODPRM
Authentication
Authentication must be performed using
GenisSports
Authentication API.
For UAT
and PRODPRM
stages, one should authenticate using the PROD
stage, as:
curl -H ‘Content-Type: application/json’ -X POST -d ‘{"user":"USERNAME","password":"YOUR_NEW_PASS"}’ https://api.geniussports.com/Auth-v1/PROD/login
On the first usage of the login API, either for the video API or any other GeniusSports API, it is required to change
the password, as:
curl -H ‘Content-Type: application/json’ -X POST -d ‘{"user":"USERNAME","password":"PASSWORD", "newpass":"SET_YOUR_PASS"}’ https://api.geniussports.com/Auth-v1/PROD/login
Upon sucessful authentication, the JSON response will contain an IdToken
attribute. The value of this attribute must
be passed on every call to the video API as an Authorization
header.
Authorization
Each API call requires two headers to for authentication and authorization:
Header | Value |
---|---|
Authorization | IdToken obtained in the authentication call |
x-api-key | A unique API key. A GeniusSports account manager should provide this during the onbarding process. Use the apropriate key according to the target environment (UAT, PRODPRM) |
Fixture schedule
The endpoints:
GET /fixtures
GET /fixtures/{id}
can be used to get the full schedule of available fixtures or just one of them, provided its Genius fixture ID.
The full schedule endpoint offers several query parameters to filter the returned fixtures, examples include:
- Return
BOOKED
fixtures only:
bash
curl -X GET https://api.geniussports.com/Video-v3/UAT/fixtures?bookingStatus=BOOKED \
-H "accept: application/json" \
-H "x-api-key: environment_token" \
-H "Authorization: `IdToken`”
- Return
UNBOOKED
fixtures only:
bash
curl -X GET https://api.geniussports.com/Video-v3/UAT/fixtures?bookingStatus=UNBOOKED \
-H "accept: application/json" \
-H "x-api-key: environment_token" \
-H "Authorization: `IdToken`”
- Return
BOOKED
fixtures within a time window,fromDate=2021-07-02T07:00:00Z
totoDate=2021-07-10T09:00:00Z
:
bash
curl -X GET https://api.geniussports.com/Video-v3/UAT/fixtures?bookingStatus=BOOKED&fromDate=2021-07-02T07:00:00Z&toDate=2021-07-10T09:00:00Z \
-H "accept: application/json" \
-H "x-api-key: environment_token" \
-H "Authorization: `IdToken`”
The JSON below is an example of the response for the /fixtures/
endpoint. It contains the details of the
fixture 1300290721
, which has one liveStream
avaliable in HLS
delivered through Akamai:
{
"data": [
{
"id": 1300290721,
"name": "Team A v Team B",
"phase": "PRE_MATCH",
"bookingStatus": "BOOKED",
"startAt": "2021-07-29T13:00:00Z",
"competitionId": "9530",
"competitionName": "Test Comp",
"sportId": 10,
"sportName": "Football",
"liveStreams": [
{
"id": "c8ed9f88",
"permissions": [],
"dmas": [],
"deliveries": {
"hls": [
{
"id": "AKAMAI"
}
],
"dash": []
}
}
]
}
]
}
Request the region list
Call this resource:
GET /regions
This endpoint can be used to get all the territories used by the video API. The response contains a list of continents,
a list of regions and a list of the DMAs (Designated Market Areas) inside the United States.
Example of a valid request:
curl -X GET https://api.geniussports.com/Video-v3/UAT/regions \
-H "accept: application/json" \
-H "x-api-key: environment_token" \
-H "Authorization: `IdToken`”
The following example response contains a subset of each of the components of the real response:
{
"continents": [
{
"code": "AF",
"name": "Africa"
},
{
"code": "AS",
"name": "Asia"
}
...
],
"regions": [
{
"code": "AD",
"name": "Andorra",
"continent": "EU"
},
{
"code": "AE",
"name": "United Arab Emirates",
"continent": "AS"
},
...,
{
"code": "US_AL",
"name": "United States - Alabama",
"continent": "NA"
},
{
"code": "US_AK",
"name": "United States - Alaska",
"continent": "NA"
},
...
],
"dmas": [
{
"code": "500",
"cities": [
"Portland",
"Auburn"
],
"regions": [
"US_ME",
"US_NH"
]
},
{
"code": "501",
"cities": [
"New York"
],
"regions": [
"US_CT",
"US_NJ",
"US_NY",
"US_PA"
]
},
...
]
}
Request streaming parameters
Live stream
The figure below illustrates the process to obtain streaming parameters to play a given fixture:
The request is checked against the permissions for the particular fixture to see if streaming is allowed. If the check
is successful, the response will contain a plaback URL, a CDN access token, and, optionally, some DRM configuration.
This data must the used to configure the video player of the end-user willing to watch the stream.
The endpoints:
POST /fixtures/{id}/live-streams/{streamId}/deliveries/hls/{deliveryId}
POST /fixtures/{id}/live-streams/{streamId}/deliveries/dash/{deliveryId}
can be used to get live streaming parameters for HLS or DASH for a given GeniusSports fixture. The {id}
, {streamId}
,
and {deliveryId}
correspond to the fixture, live-stream and delivery ID provided by the Fixture object in any of
the /fixtures
endpoints.
The request body has the form:
{
"endUserSessionId": "<some unique end-user identifier>",
"region": "CO",
"device": "DESKTOP"
}
where region
must be one of the region codes returned by the /regions/
endpoint; device
must be one of the allowed
device types, and endUserSessionId
is a unique, non personally identifiable ID, representing the end-user.
Example of a valid request:
curl --location --request POST 'https://api.geniussports.com/Video-v3/UAT/fixtures/1630290721/live-streams/c8ed9f88/deliveries/hls/AKAMAI' \
--header 'accept: application/json' \
--header 'Content-Type: application/json' \
--header 'x-api-key: environment_token ' \
--header 'Authorization: `IdToken` ' \
--data-raw '{
"endUserSessionId": "1d34aacd-f0ab-4d72-b9ce-14a80233de23",
"region": "CO",
"device": "DESKTOP"
}'
And the response could be like this:
{
"url": "https://dummy-live-secure.akamaized.net/hls/live/2030959/uat_CONTINUOUS_TEST_1630290721/playlist.m3u8",
"expiresAt": "2021-12-12T09:12:00",
"token": "st=1627648558~exp=1627649158~acl=*~id=1d34aacd-f0ab-4d72-b9ce-14a80233de23~data=reg:CO~hmac=498c6a4842a4176dfe65b067b636a857eb9aab25700f78a13b44e5d510517ebd",
"drm": {
"fairplay": "http://...",
"fairplayCertificate": "https://...",
"playready": "https://...",
"widevine": "https://..."
}
}
This sample response includes a URL, an expiration date and a token. The received token should be appended to the URL as
a query string parameter when the player makes the request for content to the CDN. In this example the DRM object is not
null, so DRM is required for streaming.
Viewer Information Endpoint
Viewer location and device are important pieces of data for selecting the right Livestream for a given end-user.
The Video-API validates that the permissions for each Livestream are met and hence, correct data passing to the API is
crucial. To this end, there is an HTTP endpoint that returns the location and device type when called from end-users’
devices.
GET https://viewer-data.production.geniuslive.geniussports.com
Example of the response from a Desktop computer located in New York(USA)
{
"region": "US_NY",
"dma": "501",
"device": "DESKTOP"
}
This endpoint return information such as the region
, the dma
and the user device
from which the
request is made. The region
and device
are used in the livestream
permissions and the
dma
field is mentioned in the list of valid dmas for each livestream. This information will be useful to choose the correct
livestream and, to send the necessary fields in the request of the streaming parameters.
Use case example
Consider two users of your website, using the endpoint https://viewer-data.production.geniuslive.geniussports.com
we obtain that:
- User_1 is located in
US_CA
(USA California - DMA803
Los Angeles) usingDESKTOP
as device.
{
"region": "US_CA",
"dma": "803",
"device": "DESKTOP"
}
- User_2 is located in JP (Japan) using a
MOBILE
device.
{
"region": "JP",
"dma": "",
"device": "MOBILE"
}
Consider the response for fixture 1234 that looks like:
{
"id": 1234,
"name": "A v B ON DEMAND TEST On Demand",
"phase": "IN_PLAY",
"bookingStatus": "BOOKED",
"startAt": "2023-08-30T17:50:00Z",
"competitionId": "9530",
"competitionName": "TEST COMPETITION",
"sportId": 10,
"sportName": "Football",
"liveStreams": [
{
"id": "Livestream1",
"permissions": [
{
"device": "DESKTOP",
"maxPlayerSizePercentage": 100,
"region": "US_CA"
},
{
"device": "DESKTOP",
"maxPlayerSizePercentage": 100,
"region": "US_NY"
}
],
"dmas": [
{
"dma": "500"
},
{
"dma": "803"
}
],
"deliveries": {
"hls": [
{
"id": "Akamai"
}
],
"dash": [
{
"id": "Akamai"
}
]
}
},
{
"id": "Livestream2",
"permissions": [
{
"device": "MOBILE",
"maxPlayerSizePercentage": 100,
"region": "JP"
},
{
"device": "DESKTOP",
"maxPlayerSizePercentage": 100,
"region": "GB"
}
],
"dmas": [ ],
"deliveries": {
"hls": [
{
"id": "Akamai"
}
],
"dash": [
{
"id": "Akamai"
}
]
}
}
],
"vodStreams": []
}
For this fixture we have 2 livestreams, Livestream1
is for users within US_CA
and US_NY
that are
using a DESKTOP
computer, the livestream is available only if the users are also located in the DMAs 500
and 803
.
Then, Livestream2
is for users located in Japan(JP
) using MOBILE
devices, and for the nited Kingdom(GB
) for
DESKTOP
computers.
For user_1 the livestream that should be used is the livestream1
since it complies with the permission to be in US_CA
using a DESKTOP
computer and it is also in one of the DMAs allowed for this livestream, dma 803
.
It is important to send the correct region and device values for user_1 when obtaining the streaming parameters for the
livestream1
.
POST /fixtures/1234/vod-streams/livestream1/deliveries/hls/Akamai
The request body should contain the exact information already extracted from the viewer-data
endpoint:
{
"endUserSessionId": "<some unique end-user identifier>",
"region": "US_CA",
"device": "DESKTOP"
}
For the user_2 the livestream that should be used is the livestream2
since it complies with the permission to be in
Japan JP
using a MOBILE
device, in this case there are no DMAs because we only support and validate DMAs inside
the US
It is important to send the correct region and device values for user_1 when obtaining the streaming parameters for the
livestream2
.
POST /fixtures/1234/vod-streams/livestream2/deliveries/hls/Akamai
The request body should contain the exact information already extracted from the viewer-data
endpoint:
{
"endUserSessionId": "<some unique end-user identifier>",
"region": "JP",
"device": "MOBILE"
}
NOTE: if any of the 2 users send an erroneous field in the body of the request such as the region or the device, it is
possible that the video-api responds with a (403 access denied) mentioning that they do not have permissions to view
that livestream.
VOD stream
Accessing VOD stream parameters follows the same process as live stream:
Currently, only HLS is supported through the endpoint:
POST /fixtures/{id}/vod-streams/{streamId}/deliveries/hls/{deliveryId}
where {id}
, {streamId}
, and {deliveryId}
correspond to the fixture, live-stream and delivery ID provided by the
Fixture object in any of the /fixtures
endpoints.
The request body has the same structure as the one used for live streaming:
{
"endUserSessionId": "<some unique end-user identifier>",
"region": "CO",
"device": "DESKTOP"
}
where region
must be one of the region codes returned by the /regions/
endpoint, device must be one of the allowed
device types, and endUserSessionId
is a unique, non personally identifiable ID, representing the end-user.
This data is checked against the permissions for the particular fixture to see if streaming is allowed. If the check is
completed successfully, the response will contain the data needed for configuring a video-player to stream the content.
Example of a valid request:
curl --location --request POST 'https://api.geniussports.com/Video-v3/UAT/fixtures/1630290721/vod-streams/c8ed9f88/deliveries/hls/AKAMAI' \
--header 'accept: application/json' \
--header 'Content-Type: application/json' \
--header 'x-api-key: environment_token ' \
--header 'Authorization: `IdToken` ' \
--data-raw '{
"endUserSessionId": "1d34aacd-f0ab-4d72-b9ce-14a80233de23",
"region": "CO",
"device": "DESKTOP"
}'
And the response could be like this:
{
"url": "https://dummy-live-secure.akamaized.net/hls/vod/2030959/uat_CONTINUOUS_TEST_1630290721/playlist.m3u8",
"expiresAt": "2021-12-12T09:12:00",
"token": "st=1627648558~exp=1627649158~acl=*~id=1d34aacd-f0ab-4d72-b9ce-14a80233de23~data=reg:CO~hmac=498c6a4842a4176dfe65b067b636a857eb9aab25700f78a13b44e5d510517ebd",
"drm": null
}
In this case, the response includes the playback URL, an expiration date and a token. The received token should be
appended to the URL as a query string parameter when the player makes the request for content to the CDN. The DRM object
is null, indicating no DRM is required for this stream.
Video Player integration
Using the CDN access token
The access token returned by the streaming parameters endpoint of the Video API should be attached as a query string
parameter to the URL for the manifest/index file. Consider a response from
the /fixtures/{id}/live-streams/{streamId}/deliveries/hls/{deliveryId}
endpoint:
{
"url": "https://dummy-live-secure.akamaized.net/hls/live/2030959/uat_CONTINUOUS_TEST_1630290721/playlist.m3u8",
"expiresAt": "2021-12-12T09:12:00",
"token": "st=1627648558~exp=1627649158~acl=*~id=1d34aacd-f0ab-4d72-b9ce-14a80233de23~data=reg:CO~hmac=498c6a4842a4176dfe65b067b636a857eb9aab25700f78a13b44e5d510517ebd",
"drm": {
"fairplay": "http://...",
"fairplayCertificate": "https://...",
"playready": "https://...",
"widevine": "https://..."
}
}
The final URL to request the manifest to the CDN will be:
https://dummy-live-secure.akamaized.net/hls/live/2030959/uat_CONTINUOUS_TEST_1630290721/playlist.m3u8?st=1627648558~exp=1627649158~acl=*~id=1d34aacd-f0ab-4d72-b9ce-14a80233de23~data=reg:CO~hmac=498c6a4842a4176dfe65b067b636a857eb9aab25700f78a13b44e5d510517ebd
Using the CDN session token
Session tokens are created by the CDN and are exchanged with the player during the streaming. For HLS, this session
token comes embedded in the master manifest. For DASH, the session token comes in a cookie, therefore the player must be
configured to send cookies in the request. However, some devices and browsers might not be configured to support
cookies, so it is important to validate this before selecting the stream delivery to play.
Using DRM
DRM (Digital Rights Management) is a method for adding security to digital content and prevent unauthorized use and
piracy. Some competitions require DRM for playback. For those cases, the video will be encrypted and the video player
must retrieve extra data to decrypt it.
Upon a call to the streaming parameters endpoint, the response might include a drm
object. If this object is null
or
not present, then DRM is not required for that delivery. Otherwise the DRM object contains a list of URLs for the
decryption keys, one url for each supported technology. The player needs to select the technology that better suits the
client platform, then get the key using the URL, and finally use that key to decrypt the content during the session.
Consider the following response:
{
"url": "https://dummy-live-secure.akamaized.net/hls/live/2030959/uat_CONTINUOUS_TEST_1630290721/playlist.m3u8",
"expiresAt": "2021-12-12T09:12:00",
"token": "st=1627648558~exp=1627649158~acl=*~id=1d34aacd-f0ab-4d72-b9ce-14a80233de23~data=reg:CO~hmac=498c6a4842a4176dfe65b067b636a857eb9aab25700f78a13b44e5d510517ebd",
"drm": {
"fairplay": "http://...",
"fairplayCertificate": "https://...",
"playready": "https://...",
"widevine": "https://..."
}
}
There are three technologies supported for DRM:
-
Google Widevine: the content can be played in Chrome and Firefox web browsers, as well as Android and Chromecast
devices. -
Apple FairPlay: content can be played in Safari on OS X, as well as iPhone, iPad, and AppleTV. This DRM protection
scheme requires both thefairplay
andfairplayCertificate
values returned in the response. -
Microsoft PlayReady: content can be played in Internet Explorer and Edge browsers, Windows Phone, Xbox, and other
platforms via SDKs.
If the selected video player library supports DRM, then it is quite probable that users of the library only have to pass
it the urls of decryption keys, and the player library will take the decision of which to use according to the platform.
Otherwise, it is possible to create such logic based on
this table.
API Endpoint
https://api.geniussports.com/Video-v3/PRODPRM
Contact: videointegrationgroup@geniussports.com
Schemes: https
Version: 3.2.2
Authentication
CognitoPool
api_key
fixtures
The fixtures API
GET /fixtures
Returns the list of available fixtures for streaming.
End date of the window where the fixtures retreived will be filtered, this is inclusive.
The booking status to filter by. If not present, it will display all available fixtures. The value must be one of: {BOOKED, UNBOOKED}.
This is the maximum number of objects that may be returned. A query may return fewer than the value of limit due to filtering. Do not depend on the number of results being fewer than the limit value to indicate that your query reached the end of the list of data, use the absence of next instead. For example, if you set limit to 10 and 9 results are returned, there may be more data available, but one item was removed due to filtering. In all cases, the API returns the correct pagination links.
This is the cursor that points to the start of the page.
Start date of the window where the fixtures retrieved will be filtered, this is inclusive and the difference between the start date and the end date should not be more than 10 days.
This is the cursor after which to start returning data.
A page of fixtures.
Response Content-Types: application/json, application/problem+json
Response Example (200 OK)
{
"data": [
{
"id": "integer (int64)",
"name": "string",
"phase": "string",
"bookingStatus": "string",
"startAt": "string (date-time)",
"competitionId": "string",
"competitionName": "string",
"sportId": "integer (int32)",
"sportName": "string",
"liveStreams": [
{
"id": "string",
"permissions": [
{
"device": "string",
"maxPlayerSizePercentage": "integer (int32)",
"region": "string"
}
],
"dmas": [
{
"dma": "string"
}
],
"deliveries": {
"hls": [
{
"id": "string"
}
],
"dash": [
{
"id": "string"
}
]
}
}
],
"vodStreams": [
{
"id": "string",
"permissions": [
{
"device": "string",
"maxPlayerSizePercentage": "integer (int32)",
"region": "string"
}
],
"dmas": [
{
"dma": "string"
}
],
"deliveries": {
"dash": [
{
"id": "string"
}
],
"hls": [
{
"id": "string"
}
]
}
}
]
}
],
"paging": {
"cursors": {
"after": "string",
"before": "string"
},
"previous": "string",
"next": "string"
}
}
Response Example (400 Bad Request)
{
"type": "string (uri)",
"title": "string",
"status": "integer (int32)",
"detail": "string",
"instance": "string (uri)"
}
Response Example (401 Unauthorized)
{
"type": "string (uri)",
"title": "string",
"status": "integer (int32)",
"detail": "string",
"instance": "string (uri)"
}
Response Example (403 Forbidden)
{
"type": "string (uri)",
"title": "string",
"status": "integer (int32)",
"detail": "string",
"instance": "string (uri)"
}
GET /fixtures/{id}
Returns the information of a given fixture.
The Genius Sports fixture ID
A fixture.
Response Content-Types: application/problem+json, application/json
Response Example (200 OK)
{
"id": "integer (int64)",
"name": "string",
"phase": "string",
"bookingStatus": "string",
"startAt": "string (date-time)",
"competitionId": "string",
"competitionName": "string",
"sportId": "integer (int32)",
"sportName": "string",
"liveStreams": [
{
"id": "string",
"permissions": [
{
"device": "string",
"maxPlayerSizePercentage": "integer (int32)",
"region": "string"
}
],
"dmas": [
{
"dma": "string"
}
],
"deliveries": {
"hls": [
{
"id": "string"
}
],
"dash": [
{
"id": "string"
}
]
}
}
],
"vodStreams": [
{
"id": "string",
"permissions": [
{
"device": "string",
"maxPlayerSizePercentage": "integer (int32)",
"region": "string"
}
],
"dmas": [
{
"dma": "string"
}
],
"deliveries": {
"dash": [
{
"id": "string"
}
],
"hls": [
{
"id": "string"
}
]
}
}
]
}
Response Example (400 Bad Request)
{
"type": "string (uri)",
"title": "string",
"status": "integer (int32)",
"detail": "string",
"instance": "string (uri)"
}
Response Example (401 Unauthorized)
{
"type": "string (uri)",
"title": "string",
"status": "integer (int32)",
"detail": "string",
"instance": "string (uri)"
}
Response Example (403 Forbidden)
{
"type": "string (uri)",
"title": "string",
"status": "integer (int32)",
"detail": "string",
"instance": "string (uri)"
}
Response Example (404 Not Found)
{
"type": "string (uri)",
"title": "string",
"status": "integer (int32)",
"detail": "string",
"instance": "string (uri)"
}
POST /fixtures/{id}/live-streams/{streamId}/deliveries/dash/{deliveryId}
Creates the DASH streaming data for a given fixture, stream and delivery. For this, data about the end-user is required to compute whether or not it is authorized for streaming based on the licensing rules for this stream.
undefined
The source ID
The Genius Sports fixture ID
The stream ID
Request Content-Types: application/json
Request Example
{
"endUserSessionId": "string",
"device": "string",
"region": "string"
}
DASH streaming parameters.
Response Content-Types: application/problem+json, application/json
Response Example (200 OK)
{
"expiresAt": "string (date-time)",
"url": "string",
"token": "string",
"drm": {
"widevine": "string",
"playready": "string",
"fairplay": "string",
"fairplayCertificate": "string"
}
}
Response Example (400 Bad Request)
{
"type": "string (uri)",
"title": "string",
"status": "integer (int32)",
"detail": "string",
"instance": "string (uri)"
}
Response Example (401 Unauthorized)
{
"type": "string (uri)",
"title": "string",
"status": "integer (int32)",
"detail": "string",
"instance": "string (uri)"
}
Response Example (403 Forbidden)
{
"type": "string (uri)",
"title": "string",
"status": "integer (int32)",
"detail": "string",
"instance": "string (uri)"
}
Response Example (404 Not Found)
{
"type": "string (uri)",
"title": "string",
"status": "integer (int32)",
"detail": "string",
"instance": "string (uri)"
}
POST /fixtures/{id}/live-streams/{streamId}/deliveries/hls/{deliveryId}
Creates the HLS streaming data for a given fixture, stream and delivery. For this, data about the end-user is required to compute whether or not it is authorized for streaming based on the licensing rules for this stream.
undefined
The source ID
The Genius Sports fixture ID
The stream ID
Request Content-Types: application/json
Request Example
{
"endUserSessionId": "string",
"device": "string",
"region": "string"
}
HLS streaming parameters.
Response Content-Types: application/problem+json, application/json
Response Example (200 OK)
{
"expiresAt": "string (date-time)",
"url": "string",
"token": "string",
"drm": {
"widevine": "string",
"playready": "string",
"fairplay": "string",
"fairplayCertificate": "string"
}
}
Response Example (400 Bad Request)
{
"type": "string (uri)",
"title": "string",
"status": "integer (int32)",
"detail": "string",
"instance": "string (uri)"
}
Response Example (401 Unauthorized)
{
"type": "string (uri)",
"title": "string",
"status": "integer (int32)",
"detail": "string",
"instance": "string (uri)"
}
Response Example (403 Forbidden)
{
"type": "string (uri)",
"title": "string",
"status": "integer (int32)",
"detail": "string",
"instance": "string (uri)"
}
Response Example (404 Not Found)
{
"type": "string (uri)",
"title": "string",
"status": "integer (int32)",
"detail": "string",
"instance": "string (uri)"
}
POST /fixtures/{id}/vod-streams/{streamId}/deliveries/hls/{deliveryId}
Returns the VOD URLs for a stream
undefined
The source ID
The Genius Sports fixture ID
The stream ID
Request Content-Types: application/json
Request Example
{
"endUserSessionId": "string",
"device": "string",
"region": "string"
}
HLS streaming parameters.
Response Content-Types: application/problem+json, application/json
Response Example (200 OK)
{
"expiresAt": "string (date-time)",
"url": "string",
"token": "string",
"drm": {
"widevine": "string",
"playready": "string",
"fairplay": "string",
"fairplayCertificate": "string"
}
}
Response Example (400 Bad Request)
{
"type": "string (uri)",
"title": "string",
"status": "integer (int32)",
"detail": "string",
"instance": "string (uri)"
}
Response Example (401 Unauthorized)
{
"type": "string (uri)",
"title": "string",
"status": "integer (int32)",
"detail": "string",
"instance": "string (uri)"
}
Response Example (403 Forbidden)
{
"type": "string (uri)",
"title": "string",
"status": "integer (int32)",
"detail": "string",
"instance": "string (uri)"
}
Response Example (404 Not Found)
{
"type": "string (uri)",
"title": "string",
"status": "integer (int32)",
"detail": "string",
"instance": "string (uri)"
}
regions
The regions API
GET /regions
Returns the list of all available geographic regions considered in this API.
The regions response.
Response Content-Types: application/json, application/problem+json
Response Example (200 OK)
{
"continents": [
{
"code": "string",
"name": "string"
}
],
"regions": [
{
"code": "string",
"name": "string",
"continent": "string"
}
],
"dmas": [
{
"code": "string",
"cities": [
"string"
],
"regions": [
"string"
]
}
]
}
Response Example (400 Bad Request)
{
"type": "string (uri)",
"title": "string",
"status": "integer (int32)",
"detail": "string",
"instance": "string (uri)"
}
Response Example (401 Unauthorized)
{
"type": "string (uri)",
"title": "string",
"status": "integer (int32)",
"detail": "string",
"instance": "string (uri)"
}
Response Example (403 Forbidden)
{
"type": "string (uri)",
"title": "string",
"status": "integer (int32)",
"detail": "string",
"instance": "string (uri)"
}
Schema Definitions
VodStream: object
List of deliveries that contains the VOD URLs of the requested stream
- id: string
-
The ID of this stream.
- permissions: Permission
-
Permissions granted over this VOD-stream.
-
Permission - dmas: DmaPermission
-
Allowed DMAs over this VOD-stream.
-
DmaPermission - deliveries: object
-
Contains the deliveries for each transport protocol supported by this stream.
-
- dash: DASHDelivery
-
DASHDelivery - hls: HLSDelivery
-
HLSDelivery
Example
{
"id": "string",
"permissions": [
{
"device": "string",
"maxPlayerSizePercentage": "integer (int32)",
"region": "string"
}
],
"dmas": [
{
"dma": "string"
}
],
"deliveries": {
"dash": [
{
"id": "string"
}
],
"hls": [
{
"id": "string"
}
]
}
}
RegionsResponse: object
Example
{
"continents": [
{
"code": "string",
"name": "string"
}
],
"regions": [
{
"code": "string",
"name": "string",
"continent": "string"
}
],
"dmas": [
{
"code": "string",
"cities": [
"string"
],
"regions": [
"string"
]
}
]
}
Device: string
The type of device making a request to play the content. It must be one of: {MOBILE, TABLET, DESKTOP, OTT}.
Paging: object
Paging structure.
- cursors: object
-
Contains the pointers for the first and last items of this page.
-
- after: string
-
This is the cursor that points to the end of the page of data that has been returned.
- before: string
-
This is the cursor that points to the start of the page of data that has been returned.
- previous: string
-
The API endpoint that will return the previous page of data. If not included, this is the first page of data.
- next: string
-
The API endpoint that will return the next page of data. If not included, this is the last page of data.
Example
{
"cursors": {
"after": "string",
"before": "string"
},
"previous": "string",
"next": "string"
}
FixturesPage: object
Example
{
"data": [
{
"id": "integer (int64)",
"name": "string",
"phase": "string",
"bookingStatus": "string",
"startAt": "string (date-time)",
"competitionId": "string",
"competitionName": "string",
"sportId": "integer (int32)",
"sportName": "string",
"liveStreams": [
{
"id": "string",
"permissions": [
{
"device": "string",
"maxPlayerSizePercentage": "integer (int32)",
"region": "string"
}
],
"dmas": [
{
"dma": "string"
}
],
"deliveries": {
"hls": [
{
"id": "string"
}
],
"dash": [
{
"id": "string"
}
]
}
}
],
"vodStreams": [
{
"id": "string",
"permissions": [
{
"device": "string",
"maxPlayerSizePercentage": "integer (int32)",
"region": "string"
}
],
"dmas": [
{
"dma": "string"
}
],
"deliveries": {
"dash": [
{
"id": "string"
}
],
"hls": [
{
"id": "string"
}
]
}
}
]
}
],
"paging": {
"cursors": {
"after": "string",
"before": "string"
},
"previous": "string",
"next": "string"
}
}
HLSStreamResponse: object
- expiresAt: string (date-time)
-
The expiration date of this token, expressed in UTC.
- url: string
-
The live stream playback URL.
- token: string
-
Token data to add to the user's session.
- drm: DRM
Example
{
"expiresAt": "string (date-time)",
"url": "string",
"token": "string",
"drm": {
"widevine": "string",
"playready": "string",
"fairplay": "string",
"fairplayCertificate": "string"
}
}
DASHStreamRequest: object
- endUserSessionId: string (up to 1024 chars)
-
Not personally identifiable ID, depicting a single end user session on the customer side. Must be consistent for the length of a single end user (the viewer of the content), meaning each user viewing the content should have a single uuid for the duration of their being logged in on the customer side
- device: Device
- region: string
-
The geographic region from where the end-user is attemping to receive the video stream. This value must correspond to one of the regions returned by the
/regions
endpoint.
Example
{
"endUserSessionId": "string",
"device": "string",
"region": "string"
}
Continent: object
- code: string
-
The continent code
- name: string
-
The continent name
Example
{
"code": "string",
"name": "string"
}
HLSStreamRequest: object
- endUserSessionId: string (up to 1024 chars)
-
Not personally identifiable ID, depicting a single end user session on the customer side. Must be consistent for the length of a single end user (the viewer of the content), meaning each user viewing the content should have a single ID for the duration of their being logged in on the customer side.
- device: Device
- region: string
-
The geographic region from where the end-user is attemping to receive the video stream. This value must correspond to one of the regions returned by the
/regions
endpoint.
Example
{
"endUserSessionId": "string",
"device": "string",
"region": "string"
}
LiveStream: object
TODO
- id: string
-
The ID of this stream.
- permissions: Permission
-
Permissions granted over this live-stream.
-
Permission - dmas: DmaPermission
-
Allowed DMAs over this live-stream.
-
DmaPermission - deliveries: object
-
Contains the deliveries for each transport protocol supported by this stream.
-
- hls: HLSDelivery
-
HLSDelivery - dash: DASHDelivery
-
DASHDelivery
Example
{
"id": "string",
"permissions": [
{
"device": "string",
"maxPlayerSizePercentage": "integer (int32)",
"region": "string"
}
],
"dmas": [
{
"dma": "string"
}
],
"deliveries": {
"hls": [
{
"id": "string"
}
],
"dash": [
{
"id": "string"
}
]
}
}
DmaPermission: object
Defines a Designated Market Area (DMA) Permission only in USA
- dma: string
-
The id of a Designated Market Area (DMA)
Example
{
"dma": "string"
}
Permission: object
Defines a permission for streaming content.
- device: Device
- maxPlayerSizePercentage: integer (int32) 0 ≤ x ≤ 100
-
The maximum player size, in percentage units, along the screen's horizontal axis.
- region: string
-
The geographic region where this permission applies. Each coutry is identified by its alpha-2 code.
Example
{
"device": "string",
"maxPlayerSizePercentage": "integer (int32)",
"region": "string"
}
Dma: object
- code: string
-
The code of the Designated Market Area (DMA)
- cities: string[]
-
The cities located in the DMA
-
string - regions: string[]
-
The regions located in the DMA
-
string
Example
{
"code": "string",
"cities": [
"string"
],
"regions": [
"string"
]
}
Region: object
- code: string
-
The region code
- name: string
-
The region name
- continent: string
-
The region continent
Example
{
"code": "string",
"name": "string",
"continent": "string"
}
Problem: object
A Problem object according to https://datatracker.ietf.org/doc/html/rfc7807
- type: string (uri)
-
An absolute URI that identifies the problem type. When dereferenced, it SHOULD provide human-readable documentation for the problem type (e.g., using HTML).
- title: string
-
A short, summary of the problem type. Written in english and readable for engineers (usually not suited for non technical stakeholders and not localized); example: Service Unavailable
- status: integer (int32) 100 ≤ x ≤ 600
-
The HTTP status code generated by the origin server for this occurrence of the problem.
- detail: string
-
A human readable explanation specific to this occurrence of the problem.
- instance: string (uri)
-
An absolute URI that identifies the specific occurrence of the problem. It may or may not yield further information if dereferenced.
Example
{
"type": "string (uri)",
"title": "string",
"status": "integer (int32)",
"detail": "string",
"instance": "string (uri)"
}
DASHStreamResponse: object
- expiresAt: string (date-time)
-
The expiration date of this token, expressed in UTC.
- url: string
-
The live stream playback URL.
- token: string
-
Token data to add to the user's session.
- drm: DRM
Example
{
"expiresAt": "string (date-time)",
"url": "string",
"token": "string",
"drm": {
"widevine": "string",
"playready": "string",
"fairplay": "string",
"fairplayCertificate": "string"
}
}
Fixture: object
A live stream encapsulates video streaming information for a given GeniusSports fixture. It contains basic information such as Genius fixture ID, team names and sate, as well as a list of available Stream objects to get video from.
- id: integer (int64)
-
The Genius Sports ID of this fixture
- name: string
-
The name of the fixture
- phase: FixturePhase
- bookingStatus: BookingStatus
- startAt: string (date-time)
- competitionId: string
-
The competition ID. It is a string to keep consistency with the type returned by Fixtures API.
- competitionName: string
-
The competition name
- sportId: integer (int32)
-
The sport ID
- sportName: string
-
The sport name
- liveStreams: LiveStream
-
LiveStream - vodStreams: VodStream
-
VodStream
Example
{
"id": "integer (int64)",
"name": "string",
"phase": "string",
"bookingStatus": "string",
"startAt": "string (date-time)",
"competitionId": "string",
"competitionName": "string",
"sportId": "integer (int32)",
"sportName": "string",
"liveStreams": [
{
"id": "string",
"permissions": [
{
"device": "string",
"maxPlayerSizePercentage": "integer (int32)",
"region": "string"
}
],
"dmas": [
{
"dma": "string"
}
],
"deliveries": {
"hls": [
{
"id": "string"
}
],
"dash": [
{
"id": "string"
}
]
}
}
],
"vodStreams": [
{
"id": "string",
"permissions": [
{
"device": "string",
"maxPlayerSizePercentage": "integer (int32)",
"region": "string"
}
],
"dmas": [
{
"dma": "string"
}
],
"deliveries": {
"dash": [
{
"id": "string"
}
],
"hls": [
{
"id": "string"
}
]
}
}
]
}
DRM: object
DRM configuration.
- widevine: string
-
The Widevine URL.
- playready: string
-
The Playready URL.
- fairplay: string
-
The Fairplay URL.
- fairplayCertificate: string
-
The Fairplay certificate URL.
Example
{
"widevine": "string",
"playready": "string",
"fairplay": "string",
"fairplayCertificate": "string"
}