openapi: 3.1.0
info:
title: Livepeer API Reference accessControl asset API
description: 'Welcome to the Livepeer API reference docs. Here you will find all the
endpoints exposed on the standard Livepeer API, learn how to use them and
what they return.
'
version: 1.0.0
servers:
- url: https://livepeer.studio/api
security:
- apiKey: []
tags:
- name: asset
description: Operations related to asset/vod api
paths:
/asset:
get:
operationId: getAssets
x-speakeasy-name-override: getAll
tags:
- asset
summary: Retrieve assets
responses:
default:
description: Error
content:
application/json:
schema:
$ref: '#/components/schemas/error'
'200':
description: Success
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/asset'
x-speakeasy-name-override: data
x-codeSamples:
- lang: typescript
label: getAssets
source: "import { Livepeer } from \"livepeer\";\n\nconst livepeer = new Livepeer({\n apiKey: \"<YOUR_BEARER_TOKEN_HERE>\",\n});\n\nasync function run() {\n const result = await livepeer.asset.getAll();\n\n // Handle the result\n console.log(result);\n}\n\nrun();"
- lang: go
label: getAssets
source: "package main\n\nimport(\n\tlivepeergo \"github.com/livepeer/livepeer-go\"\n\t\"context\"\n\t\"log\"\n)\n\nfunc main() {\n s := livepeergo.New(\n livepeergo.WithSecurity(\"<YOUR_BEARER_TOKEN_HERE>\"),\n )\n\n ctx := context.Background()\n res, err := s.Asset.GetAll(ctx)\n if err != nil {\n log.Fatal(err)\n }\n if res.Data != nil {\n // handle response\n }\n}"
- lang: python
label: getAssets
source: "from livepeer import Livepeer\n\ns = Livepeer(\n api_key=\"<YOUR_BEARER_TOKEN_HERE>\",\n)\n\nres = s.asset.get_all()\n\nif res.data is not None:\n # handle response\n pass"
/asset/request-upload:
post:
operationId: requestUpload
x-speakeasy-name-override: create
tags:
- asset
summary: Upload an asset
description: "To upload an asset, your first need to request for a direct upload URL\nand only then actually upload the contents of the asset.\n\\\n\\\nOnce you created a upload link, you have 2 options, resumable or direct\nupload. For a more reliable experience, you should use resumable uploads\nwhich will work better for users with unreliable or slow network\nconnections. If you want a simpler implementation though, you should\njust use a direct upload.\n\n\n## Direct Upload\nFor a direct upload, make a PUT request to the URL received in the url\nfield of the response above, with the raw video file as the request\nbody. response above:\n\n\n## Resumable Upload\nLivepeer supports resumable uploads via Tus. This section provides a\nsimple example of how to use tus-js-client to upload a video file.\n\\\n\\\nFrom the previous section, we generated a URL to upload a video file to\nLivepeer on POST /api/asset/request-upload. You should use the\ntusEndpoint field of the response to upload the video file and track the\nprogress:\n\n```\n# This assumes there is an `input` element of `type=\"file\"` with id\n`fileInput` in the HTML\n\n\nconst input = document.getElementById('fileInput');\n\nconst file = input.files[0];\n\nconst upload = new tus.Upload(file, {\n endpoint: tusEndpoint, // URL from `tusEndpoint` field in the\n`/request-upload` response\n metadata: {\n filename,\n filetype: 'video/mp4',\n },\n uploadSize: file.size,\n onError(err) {\n console.error('Error uploading file:', err);\n },\n onProgress(bytesUploaded, bytesTotal) {\n const percentage = ((bytesUploaded / bytesTotal) * 100).toFixed(2);\n console.log('Uploaded ' + percentage + '%');\n },\n onSuccess() {\n console.log('Upload finished:', upload.url);\n },\n});\n\nconst previousUploads = await upload.findPreviousUploads();\n\nif (previousUploads.length > 0) {\n upload.resumeFromPreviousUpload(previousUploads[0]);\n}\n\nupload.start();\n\n```\n\n> Note: If you are using tus from node.js, you need to add a custom URL\nstorage to enable resuming from previous uploads. On the browser, this\nis enabled by default using local storage. In node.js, add urlStorage:\nnew tus.FileUrlStorage(\"path/to/tmp/file\"), to the UploadFile object\ndefinition above.\n"
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/new-asset-payload'
responses:
default:
description: Error
content:
application/json:
schema:
$ref: '#/components/schemas/error'
'200':
description: Success
content:
application/json:
schema:
type: object
additionalProperties: false
required:
- url
- tusEndpoint
- asset
- task
properties:
url:
type: string
description: The direct upload endpoint for which supports PUT requests. **It is recommended to use the Tus endpoint for a better upload experience.**
example: https://origin.livepeer.com/api/asset/upload/direct?token=eyJhbGciOiJIUzI1NiJ9.eyJtc2ciOiJoZWxsbyBoYWNrZXIsIHRoZXJlJ3Mgbm90aGluZyBmb3IgeW91IGhlcmUg8J-YhiJ9.1YDjmXsqLcgNyMSzT4kXl_kIni46_EuGX_xfqmC7e0Q
tusEndpoint:
type: string
description: The [Tus-compatible](https://tus.io/) endpoint for resumable uploads. **This is the recommended way to upload assets.** See the [Tus-js](https://github.com/tus/tus-js-client) client for more information.
example: https://origin.livepeer.com/api/asset/upload/tus?token=eyJhbGciOiJIUzI1NiJ9.eyJtc2ciOiJoZWxsbyBoYWNrZXIsIHRoZXJlJ3Mgbm90aGluZyBmb3IgeW91IGhlcmUg8J-YhiJ9.1YDjmXsqLcgNyMSzT4kXl_kIni46_EuGX_xfqmC7e0Q
asset:
$ref: '#/components/schemas/asset'
task:
type: object
required:
- id
additionalProperties: false
properties:
id:
type: string
example: 34d7618e-fd42-4798-acf5-19504616a11e
x-speakeasy-name-override: data
x-codeSamples:
- lang: typescript
label: requestUpload
source: "import { Livepeer } from \"livepeer\";\nimport { TranscodeProfileEncoder, TranscodeProfileProfile, Type } from \"livepeer/models/components\";\n\nconst livepeer = new Livepeer({\n apiKey: \"<YOUR_BEARER_TOKEN_HERE>\",\n});\n\nasync function run() {\n const result = await livepeer.asset.create({\n name: \"filename.mp4\",\n staticMp4: true,\n playbackPolicy: {\n type: Type.Webhook,\n webhookId: \"1bde4o2i6xycudoy\",\n webhookContext: {\n \"streamerId\": \"my-custom-id\",\n },\n refreshInterval: 600,\n },\n profiles: [\n {\n width: 1280,\n name: \"720p\",\n height: 720,\n bitrate: 3000000,\n quality: 23,\n fps: 30,\n fpsDen: 1,\n gop: \"2\",\n profile: TranscodeProfileProfile.H264Baseline,\n encoder: TranscodeProfileEncoder.H264,\n },\n ],\n });\n\n // Handle the result\n console.log(result);\n}\n\nrun();"
- lang: go
label: requestUpload
source: "package main\n\nimport(\n\tlivepeergo \"github.com/livepeer/livepeer-go\"\n\t\"context\"\n\t\"github.com/livepeer/livepeer-go/models/components\"\n\t\"log\"\n)\n\nfunc main() {\n s := livepeergo.New(\n livepeergo.WithSecurity(\"<YOUR_BEARER_TOKEN_HERE>\"),\n )\n\n ctx := context.Background()\n res, err := s.Asset.Create(ctx, components.NewAssetPayload{\n Name: \"filename.mp4\",\n StaticMp4: livepeergo.Bool(true),\n PlaybackPolicy: &components.PlaybackPolicy{\n Type: components.TypeWebhook,\n WebhookID: livepeergo.String(\"1bde4o2i6xycudoy\"),\n WebhookContext: map[string]any{\n \"streamerId\": \"my-custom-id\",\n },\n RefreshInterval: livepeergo.Float64(600),\n },\n Profiles: []components.TranscodeProfile{\n components.TranscodeProfile{\n Width: livepeergo.Int64(1280),\n Name: livepeergo.String(\"720p\"),\n Height: livepeergo.Int64(720),\n Bitrate: 3000000,\n Quality: livepeergo.Int64(23),\n Fps: livepeergo.Int64(30),\n FpsDen: livepeergo.Int64(1),\n Gop: livepeergo.String(\"2\"),\n Profile: components.TranscodeProfileProfileH264Baseline.ToPointer(),\n Encoder: components.TranscodeProfileEncoderH264.ToPointer(),\n },\n },\n })\n if err != nil {\n log.Fatal(err)\n }\n if res.Data != nil {\n // handle response\n }\n}"
- lang: python
label: requestUpload
source: "from livepeer import Livepeer\nfrom livepeer.models import components\n\ns = Livepeer(\n api_key=\"<YOUR_BEARER_TOKEN_HERE>\",\n)\n\nres = s.asset.create(request={\n \"name\": \"filename.mp4\",\n \"static_mp4\": True,\n \"playback_policy\": {\n \"type\": components.Type.WEBHOOK,\n \"webhook_id\": \"1bde4o2i6xycudoy\",\n \"webhook_context\": {\n \"streamerId\": \"my-custom-id\",\n },\n \"refresh_interval\": 600,\n },\n \"profiles\": [\n {\n \"width\": 1280,\n \"name\": \"720p\",\n \"height\": 720,\n \"bitrate\": 3000000,\n \"quality\": 23,\n \"fps\": 30,\n \"fps_den\": 1,\n \"gop\": \"2\",\n \"profile\": components.TranscodeProfileProfile.H264_BASELINE,\n \"encoder\": components.TranscodeProfileEncoder.H_264,\n },\n ],\n})\n\nif res.data is not None:\n # handle response\n pass"
/asset/upload/url:
post:
operationId: uploadAsset
x-speakeasy-name-override: createViaUrl
summary: Upload asset via URL
tags:
- asset
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/new-asset-from-url-payload'
responses:
default:
description: Error
content:
application/json:
schema:
$ref: '#/components/schemas/error'
'200':
description: Upload in progress
content:
application/json:
schema:
type: object
additionalProperties: false
required:
- asset
- task
properties:
asset:
$ref: '#/components/schemas/asset'
task:
type: object
required:
- id
additionalProperties: false
properties:
id:
type: string
example: 34d7618e-fd42-4798-acf5-19504616a11e
x-speakeasy-name-override: data
'201':
description: Upload started
content:
application/json:
schema:
type: object
additionalProperties: false
required:
- asset
- task
properties:
asset:
$ref: '#/components/schemas/asset'
task:
type: object
required:
- id
additionalProperties: false
properties:
id:
type: string
example: 34d7618e-fd42-4798-acf5-19504616a11e
x-speakeasy-name-override: data
x-codeSamples:
- lang: typescript
label: uploadAsset
source: "import { Livepeer } from \"livepeer\";\nimport { TranscodeProfileEncoder, TranscodeProfileProfile, Type } from \"livepeer/models/components\";\n\nconst livepeer = new Livepeer({\n apiKey: \"<YOUR_BEARER_TOKEN_HERE>\",\n});\n\nasync function run() {\n const result = await livepeer.asset.createViaUrl({\n name: \"filename.mp4\",\n staticMp4: true,\n playbackPolicy: {\n type: Type.Webhook,\n webhookId: \"1bde4o2i6xycudoy\",\n webhookContext: {\n \"streamerId\": \"my-custom-id\",\n },\n refreshInterval: 600,\n },\n url: \"https://s3.amazonaws.com/my-bucket/path/filename.mp4\",\n profiles: [\n {\n width: 1280,\n name: \"720p\",\n height: 720,\n bitrate: 3000000,\n quality: 23,\n fps: 30,\n fpsDen: 1,\n gop: \"2\",\n profile: TranscodeProfileProfile.H264Baseline,\n encoder: TranscodeProfileEncoder.H264,\n },\n {\n width: 1280,\n name: \"720p\",\n height: 720,\n bitrate: 3000000,\n quality: 23,\n fps: 30,\n fpsDen: 1,\n gop: \"2\",\n profile: TranscodeProfileProfile.H264Baseline,\n encoder: TranscodeProfileEncoder.H264,\n },\n ],\n });\n\n // Handle the result\n console.log(result);\n}\n\nrun();"
- lang: go
label: uploadAsset
source: "package main\n\nimport(\n\tlivepeergo \"github.com/livepeer/livepeer-go\"\n\t\"context\"\n\t\"github.com/livepeer/livepeer-go/models/components\"\n\t\"log\"\n)\n\nfunc main() {\n s := livepeergo.New(\n livepeergo.WithSecurity(\"<YOUR_BEARER_TOKEN_HERE>\"),\n )\n\n ctx := context.Background()\n res, err := s.Asset.CreateViaURL(ctx, components.NewAssetFromURLPayload{\n Name: \"filename.mp4\",\n StaticMp4: livepeergo.Bool(true),\n PlaybackPolicy: &components.PlaybackPolicy{\n Type: components.TypeWebhook,\n WebhookID: livepeergo.String(\"1bde4o2i6xycudoy\"),\n WebhookContext: map[string]any{\n \"streamerId\": \"my-custom-id\",\n },\n RefreshInterval: livepeergo.Float64(600),\n },\n URL: \"https://s3.amazonaws.com/my-bucket/path/filename.mp4\",\n Profiles: []components.TranscodeProfile{\n components.TranscodeProfile{\n Width: livepeergo.Int64(1280),\n Name: livepeergo.String(\"720p\"),\n Height: livepeergo.Int64(720),\n Bitrate: 3000000,\n Quality: livepeergo.Int64(23),\n Fps: livepeergo.Int64(30),\n FpsDen: livepeergo.Int64(1),\n Gop: livepeergo.String(\"2\"),\n Profile: components.TranscodeProfileProfileH264Baseline.ToPointer(),\n Encoder: components.TranscodeProfileEncoderH264.ToPointer(),\n },\n },\n })\n if err != nil {\n log.Fatal(err)\n }\n if res.TwoHundredApplicationJSONData != nil {\n // handle response\n }\n}"
- lang: python
label: uploadAsset
source: "from livepeer import Livepeer\nfrom livepeer.models import components\n\ns = Livepeer(\n api_key=\"<YOUR_BEARER_TOKEN_HERE>\",\n)\n\nres = s.asset.create_via_url(request={\n \"name\": \"filename.mp4\",\n \"static_mp4\": True,\n \"playback_policy\": {\n \"type\": components.Type.WEBHOOK,\n \"webhook_id\": \"1bde4o2i6xycudoy\",\n \"webhook_context\": {\n \"streamerId\": \"my-custom-id\",\n },\n \"refresh_interval\": 600,\n },\n \"url\": \"https://s3.amazonaws.com/my-bucket/path/filename.mp4\",\n \"profiles\": [\n {\n \"width\": 1280,\n \"name\": \"720p\",\n \"height\": 720,\n \"bitrate\": 3000000,\n \"quality\": 23,\n \"fps\": 30,\n \"fps_den\": 1,\n \"gop\": \"2\",\n \"profile\": components.TranscodeProfileProfile.H264_BASELINE,\n \"encoder\": components.TranscodeProfileEncoder.H_264,\n },\n ],\n})\n\nif res.two_hundred_application_json_data is not None:\n # handle response\n pass"
/asset/{assetId}:
get:
operationId: getAsset
x-speakeasy-name-override: get
tags:
- asset
summary: Retrieves an asset
parameters:
- in: path
name: assetId
schema:
type: string
description: ID of the asset
required: true
responses:
default:
description: Error
content:
application/json:
schema:
$ref: '#/components/schemas/error'
'200':
description: Success
content:
application/json:
schema:
$ref: '#/components/schemas/asset'
x-speakeasy-name-override: data
x-codeSamples:
- lang: typescript
label: getAsset
source: "import { Livepeer } from \"livepeer\";\n\nconst livepeer = new Livepeer({\n apiKey: \"<YOUR_BEARER_TOKEN_HERE>\",\n});\n\nasync function run() {\n const result = await livepeer.asset.get(\"<id>\");\n\n // Handle the result\n console.log(result);\n}\n\nrun();"
- lang: go
label: getAsset
source: "package main\n\nimport(\n\tlivepeergo \"github.com/livepeer/livepeer-go\"\n\t\"context\"\n\t\"log\"\n)\n\nfunc main() {\n s := livepeergo.New(\n livepeergo.WithSecurity(\"<YOUR_BEARER_TOKEN_HERE>\"),\n )\n\n ctx := context.Background()\n res, err := s.Asset.Get(ctx, \"<value>\")\n if err != nil {\n log.Fatal(err)\n }\n if res.Asset != nil {\n // handle response\n }\n}"
- lang: python
label: getAsset
source: "from livepeer import Livepeer\n\ns = Livepeer(\n api_key=\"<YOUR_BEARER_TOKEN_HERE>\",\n)\n\nres = s.asset.get(asset_id=\"<value>\")\n\nif res.asset is not None:\n # handle response\n pass"
patch:
operationId: updateAsset
x-speakeasy-name-override: update
summary: Patch an asset
tags:
- asset
parameters:
- in: path
name: assetId
schema:
type: string
description: ID of the asset
required: true
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/asset-patch-payload'
responses:
default:
description: Error
content:
application/json:
schema:
$ref: '#/components/schemas/error'
'200':
description: Success
content:
application/json:
schema:
$ref: '#/components/schemas/asset'
x-speakeasy-name-override: data
x-codeSamples:
- lang: typescript
label: updateAsset
source: "import { Livepeer } from \"livepeer\";\nimport { Type } from \"livepeer/models/components\";\n\nconst livepeer = new Livepeer({\n apiKey: \"<YOUR_BEARER_TOKEN_HERE>\",\n});\n\nasync function run() {\n const result = await livepeer.asset.update({\n name: \"filename.mp4\",\n playbackPolicy: {\n type: Type.Webhook,\n webhookId: \"1bde4o2i6xycudoy\",\n webhookContext: {\n \"streamerId\": \"my-custom-id\",\n },\n refreshInterval: 600,\n },\n }, \"<id>\");\n\n // Handle the result\n console.log(result);\n}\n\nrun();"
- lang: go
label: updateAsset
source: "package main\n\nimport(\n\tlivepeergo \"github.com/livepeer/livepeer-go\"\n\t\"context\"\n\t\"github.com/livepeer/livepeer-go/models/components\"\n\t\"log\"\n)\n\nfunc main() {\n s := livepeergo.New(\n livepeergo.WithSecurity(\"<YOUR_BEARER_TOKEN_HERE>\"),\n )\n\n ctx := context.Background()\n res, err := s.Asset.Update(ctx, \"<value>\", components.AssetPatchPayload{\n Name: livepeergo.String(\"filename.mp4\"),\n PlaybackPolicy: &components.PlaybackPolicy{\n Type: components.TypeWebhook,\n WebhookID: livepeergo.String(\"1bde4o2i6xycudoy\"),\n WebhookContext: map[string]any{\n \"streamerId\": \"my-custom-id\",\n },\n RefreshInterval: livepeergo.Float64(600),\n },\n })\n if err != nil {\n log.Fatal(err)\n }\n if res.Asset != nil {\n // handle response\n }\n}"
- lang: python
label: updateAsset
source: "from livepeer import Livepeer\nfrom livepeer.models import components\n\ns = Livepeer(\n api_key=\"<YOUR_BEARER_TOKEN_HERE>\",\n)\n\nres = s.asset.update(asset_id=\"<value>\", asset_patch_payload={\n \"name\": \"filename.mp4\",\n \"playback_policy\": {\n \"type\": components.Type.WEBHOOK,\n \"webhook_id\": \"1bde4o2i6xycudoy\",\n \"webhook_context\": {\n \"streamerId\": \"my-custom-id\",\n },\n \"refresh_interval\": 600,\n },\n})\n\nif res.asset is not None:\n # handle response\n pass"
delete:
operationId: deleteAsset
x-speakeasy-name-override: delete
summary: Delete an asset
tags:
- asset
parameters:
- in: path
name: assetId
schema:
type: string
description: ID of the asset
required: true
responses:
default:
description: Error
content:
application/json:
schema:
$ref: '#/components/schemas/error'
'204':
description: Success (No content)
x-codeSamples:
- lang: typescript
label: deleteAsset
source: "import { Livepeer } from \"livepeer\";\n\nconst livepeer = new Livepeer({\n apiKey: \"<YOUR_BEARER_TOKEN_HERE>\",\n});\n\nasync function run() {\n const result = await livepeer.asset.delete(\"<id>\");\n\n // Handle the result\n console.log(result);\n}\n\nrun();"
- lang: go
label: deleteAsset
source: "package main\n\nimport(\n\tlivepeergo \"github.com/livepeer/livepeer-go\"\n\t\"context\"\n\t\"log\"\n)\n\nfunc main() {\n s := livepeergo.New(\n livepeergo.WithSecurity(\"<YOUR_BEARER_TOKEN_HERE>\"),\n )\n\n ctx := context.Background()\n res, err := s.Asset.Delete(ctx, \"<value>\")\n if err != nil {\n log.Fatal(err)\n }\n if res != nil {\n // handle response\n }\n}"
- lang: python
label: deleteAsset
source: "from livepeer import Livepeer\n\ns = Livepeer(\n api_key=\"<YOUR_BEARER_TOKEN_HERE>\",\n)\n\nres = s.asset.delete(asset_id=\"<value>\")\n\nif res is not None:\n # handle response\n pass"
components:
schemas:
playback-policy:
type:
- object
- 'null'
description: Whether the playback policy for an asset or stream is public or signed
additionalProperties: false
required:
- type
properties:
type:
type: string
enum:
- public
- jwt
- webhook
example: webhook
webhookId:
type: string
description: ID of the webhook to use for playback policy
example: 1bde4o2i6xycudoy
webhookContext:
type: object
description: User-defined webhook context
additionalProperties: true
example:
streamerId: my-custom-id
refreshInterval:
type: number
description: 'Interval (in seconds) at which the playback policy should be
refreshed (default 600 seconds)
'
example: 600
allowedOrigins:
type: array
description: List of allowed origins for CORS playback (<scheme>://<hostname>:<port>, <scheme>://<hostname>)
items:
type: string
new-asset-payload:
additionalProperties: false
required:
- name
properties:
name:
type: string
description: 'The name of the asset. This is not necessarily the filename - it can be a custom name or title.
'
example: filename.mp4
staticMp4:
type: boolean
description: Whether to generate MP4s for the asset.
example: true
playbackPolicy:
$ref: '#/components/schemas/playback-policy'
creatorId:
$ref: '#/components/schemas/input-creator-id'
storage:
type: object
additionalProperties: false
properties:
ipfs:
description: 'Set to true to make default export to IPFS. To customize the
pinned files, specify an object with a spec field. False or null
means to unpin from IPFS, but it''s unsupported right now.
'
oneOf:
- type: object
additionalProperties: false
properties:
spec:
oneOf:
- type: 'null'
- $ref: '#/components/schemas/asset/properties/storage/properties/ipfs/properties/spec'
- type: boolean
- type: 'null'
encryption:
type: object
additionalProperties: false
required:
- encryptedKey
properties:
encryptedKey:
type: string
writeOnly: true
description: Encryption key used to encrypt the asset. Only writable in the upload asset endpoints and cannot be retrieved back.
c2pa:
type: boolean
description: Decides if the output video should include C2PA signature
profiles:
type:
- array
- 'null'
items:
$ref: '#/components/schemas/transcode-profile'
targetSegmentSizeSecs:
type: number
description: How many seconds the duration of each output segment should be
storage-status:
readOnly: true
additionalProperties: false
required:
- phase
- tasks
properties:
phase:
type: string
description: Phase of the asset storage
enum:
- waiting
- processing
- ready
- failed
- reverted
example: ready
progress:
type: number
description: Current progress of the task updating the storage.
example: 0.5
errorMessage:
type: string
description: Error message if the last storage changed failed.
example: Failed to update storage
tasks:
type: object
additionalProperties: false
properties:
pending:
type: string
description: 'ID of any currently running task that is exporting this
asset to IPFS.
'
example: 09F8B46C-61A0-4254-9875-F71F4C605BC7
last:
type: string
description: 'ID of the last task to run successfully, that created
the currently saved data.
'
example: 09F8B46C-61A0-4254-9875-F71F4C605BC7
failed:
type: string
description: ID of the last task to fail execution.
example: 09F8B46C-61A0-4254-9875-F71F4C605BC7
asset:
type: object
additionalProperties: false
required:
- id
- name
- source
properties:
id:
type: string
readOnly: true
example: 09F8B46C-61A0-4254-9875-F71F4C605BC7
type:
type: string
enum:
- video
- audio
description: Type of the asset.
example: video
playbackId:
type: string
example: eaw4nk06ts2d0mzb
description: The playback ID to use with the Playback Info endpoint to retrieve playback URLs.
userId:
type: string
readOnly: true
example: 66E2161C-7670-4D05-B71D-DA2D6979556F
deprecated: true
staticMp4:
type: boolean
writeOnly: true
description: Whether to generate MP4s for the asset.
playbackUrl:
readOnly: true
type: string
example: https://livepeercdn.com/asset/ea03f37e-f861-4cdd-b495-0e60b6d753ad/index.m3u8
description: URL for HLS playback. **It is recommended to not use this URL**, and instead use playback IDs with the Playback Info endpoint to retrieve the playback URLs - this URL format is subject to change (e.g. https://livepeercdn.com/asset/ea03f37e-f861-4cdd-b495-0e60b6d753ad/index.m3u8).
downloadUrl:
readOnly: true
type: string
example: https://livepeercdn.com/asset/eaw4nk06ts2d0mzb/video/download.mp4
description: The URL to directly download the asset, e.g. `https://livepeercdn.com/asset/eawrrk06ts2d0mzb/video`. It is not recommended to use this for playback.
playbackPolicy:
$ref: '#/components/schemas/playback-policy'
source:
oneOf:
- additionalProperties: false
required:
- type
- url
properties:
type:
type: string
enum:
- url
url:
type: string
description: URL from which the asset was uploaded.
gatewayUrl:
type: string
description: Gateway URL from asset if parsed from provided URL on upload.
encryption:
$ref: '#/components/schemas/new-asset-payload/properties/encryption'
- additionalProperties: false
required:
- type
- sessionId
properties:
type:
type: string
enum:
- recording
sessionId:
type: string
description: ID of the session from which this asset was created
- additionalProperties: false
required:
- type
properties:
type:
type: string
enum:
- directUpload
- clip
encryption:
$ref: '#/components/schemas/new-asset-payload/properties/encryption'
sourceId:
type: string
description: ID of the asset or stream from which this asset was created.
sessionId:
type: string
description: ID of the session from which this asset was created.
playbackId:
type: string
description: Playback ID of the asset or stream from which this asset was created.
requesterId:
type: string
description: ID of the requester from which this asset was created.
assetId:
type: string
description: ID of the asset from which this asset was created.
creatorId:
$ref: '#/components/schemas/creator-id'
profiles:
type: array
description: 'Requested profiles for the asset to be transcoded into. Configured
on the upload APIs payload or through the `stream.recordingSpec`
field for recordings. If not specified, default profiles are derived
based on the source input. If this is a recording, the source will
not be present in this list but will be available for playback.
'
items:
$ref: '#/components/schemas/transcode-profile'
storage:
type: object
additionalProperties: false
properties:
ipfs:
type: object
additionalProperties: false
properties:
spec:
type: object
additionalProperties: false
default: {}
properties:
# --- truncated at 32 KB (43 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/livepeer/refs/heads/main/openapi/livepeer-asset-api-openapi.yml