{
"errors": [
[
"id not provided",
"Account not found"
]
]
}
Asset
Upload an asset
To upload an asset, your first need to request for a direct upload URL
and only then actually upload the contents of the asset.
Once you created a upload link, you have 2 options, resumable or direct
upload. For a more reliable experience, you should use resumable uploads
which will work better for users with unreliable or slow network
connections. If you want a simpler implementation though, you should
just use a direct upload.
Direct Upload
For a direct upload, make a PUT request to the URL received in the url
field of the response above, with the raw video file as the request
body. response above:
Resumable Upload
Livepeer supports resumable uploads via Tus. This section provides a
simple example of how to use tus-js-client to upload a video file.
From the previous section, we generated a URL to upload a video file to
Livepeer on POST /api/asset/request-upload. You should use the
tusEndpoint field of the response to upload the video file and track the
progress:
# This assumes there is an `input` element of `type="file"` with id`fileInput` in the HTMLconst input = document.getElementById('fileInput');const file = input.files[0];const upload = new tus.Upload(file, { endpoint: tusEndpoint, // URL from `tusEndpoint` field in the`/request-upload` response metadata: { filename, filetype: 'video/mp4', }, uploadSize: file.size, onError(err) { console.error('Error uploading file:', err); }, onProgress(bytesUploaded, bytesTotal) { const percentage = ((bytesUploaded / bytesTotal) * 100).toFixed(2); console.log('Uploaded ' + percentage + '%'); }, onSuccess() { console.log('Upload finished:', upload.url); },});const previousUploads = await upload.findPreviousUploads();if (previousUploads.length > 0) { upload.resumeFromPreviousUpload(previousUploads[0]);}upload.start();
Note: If you are using tus from node.js, you need to add a custom URL
storage to enable resuming from previous uploads. On the browser, this
is enabled by default using local storage. In node.js, add urlStorage:
new tus.FileUrlStorage(“path/to/tmp/file”), to the UploadFile object
definition above.
{"docsConfig":{"theme":"palm","$schema":"https://mintlify.com/docs.json","name":"Livepeer Docs","colors":{"primary":"#3CB540","light":"#2b9a66","dark":"#3CB540"},"logo":{"light":"https://mintcdn.com/na-36-changelog-go-livepeer-2026-05-18/Wp7NVxMLScubv9qC/snippets/assets/logos/light.svg?fit=max\u0026auto=format\u0026n=Wp7NVxMLScubv9qC\u0026q=85\u0026s=84bd36738493ec40cffe6a83adf33424","dark":"https://mintcdn.com/na-36-changelog-go-livepeer-2026-05-18/Wp7NVxMLScubv9qC/snippets/assets/logos/dark.svg?fit=max\u0026auto=format\u0026n=Wp7NVxMLScubv9qC\u0026q=85\u0026s=b8ae4ca3e14caf1d2589ed0177c2aeb3"},"favicon":"https://mintcdn.com/na-36-changelog-go-livepeer-2026-05-18/Wp7NVxMLScubv9qC/snippets/assets/logos/favicon/favicon.png?fit=max\u0026auto=format\u0026n=Wp7NVxMLScubv9qC\u0026q=85\u0026s=96bf4dbce58bde004d13ddf40300d4e7","api":{"openapi":"api/openapi.yaml","mdx":{"server":"https://livepeer.studio/api"}},"appearance":{"default":"dark"},"navbar":{"links":[{"icon":"x-twitter","href":"https://twitter.com/Livepeer","label":""},{"icon":"github","href":"https://github.com/livepeer","label":""},{"icon":"discord","href":"https://discord.gg/livepeer","label":""}]},"footer":{"socials":{"website":"https://forum.livepeer.org","github":"https://github.com/livepeer","twitter":"https://twitter.com/livepeer","discord":"https://discord.gg/livepeer","linkedin":"https://www.linkedin.com/company/livepeer"}},"search":{"prompt":"Need help? Ask our AI"},"styling":{"codeblocks":{"theme":{"light":"github-light","dark":"dark-plus"}}},"integrations":{"ga4":{"measurementId":"G-P1Z15F6NX4"}},"errors":{"404":{"redirect":false,"title":"Ruh oh. This page doesn't exist.","description":"\u003cFrame>\u003cimg src=\"https://media0.giphy.com/media/v1.Y2lkPTc5MGI3NjExN2FteDJ4bno5MHU5Y3QxdGx3eWR2emdhejRhc2c1Y2d3ejY5ajlxMSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/Ju7l5y9osyymQ/giphy.gif\" alt=\"Rick Roll\" />\u003c/Frame>\u003cbr/>\u003cbr/>Sorry About That."}},"metadata":{"timestamp":true},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"na-36-changelog-go-livepeer-2026-05-18","hasAudioNarration":false,"actualSubdomain":"na-36-changelog-go-livepeer-2026-05-18","customDomains":[],"gitSource":{"type":"github","owner":"livepeer","repo":"docs","deployBranch":"changelog/go-livepeer-2026-05-18","contentDirectory":"","isPrivate":false,"mountPath":"","label":""},"feedback":{"thumbs":true,"edits":false,"issues":false},"entitlements":{"AI_CHAT":{"status":"ENABLED"}},"buildId":"6a0a59631b822466b6e1f072:success","clientVersion":"0.0.4076","preview":{"mainDeploymentId":"64ba6ae116af7b43c2e91ffc","changedFiles":[{"path":"v2/resources/changelog/go-livepeer.mdx","status":"modified"}],"mainDeployment":{"subdomain":"na-36","customDomains":["docs.livepeer.org"],"basePath":""}},"searchFilterCounts":[]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":true,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"rbac-expansion","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-metadata","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-serve","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"live-agents","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"comment-mode","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"preview":{"mainDeploymentId":"64ba6ae116af7b43c2e91ffc","changedFiles":[{"path":"v2/resources/changelog/go-livepeer","rawPath":"v2/resources/changelog/go-livepeer.mdx","status":"modified"}],"mainDeployment":{"subdomain":"na-36","customDomains":["docs.livepeer.org"],"basePath":""}},"editorBaseUrl":"https://app.mintlify.com/na-36/na-36/editor/changelog%2Fgo-livepeer-2026-05-18/~","googleFontsInlined":false},"customCss":[{"filePath":"style.css","content":"body{padding:0!important}:root{--lp-color-accent: #3cb540;--lp-color-accent-strong: #18794e;--lp-color-accent-soft: #6bbf59;--lp-color-accent-bright: #5dd662;--lp-color-accent-brightest: #a0f0a5;--lp-color-arbitrum: #3ea6f8;--lp-color-text-primary: #181c18;--lp-color-text-secondary: #717571;--lp-color-text-muted: #9ca3af;--lp-color-bg-page: #ffffff;--lp-color-bg-card: #f9fafb;--lp-color-bg-elevated: #f3f6f4;--lp-color-bg-subtle: rgba(24, 28, 24, 0.04);--lp-color-bg-overlay: rgba(12, 12, 12, 0.5);--lp-color-border-default: #e5e7eb;--lp-color-border-strong: rgba(24, 28, 24, 0.18);--lp-color-border-inverse: rgba(255, 255, 255, 0.5);--lp-color-on-accent: #ffffff;--lp-color-link: #18794e;--lp-color-link-hover: #004225;--lp-color-brand-discord: #5865f2;--lp-color-brand-forum: #00aeef;--lp-color-brand-github: #181c18;--lp-color-brand-x: #181c18;--lp-color-brand-globe: #00c0ff;--lp-color-brand-twitch: #9048ff;--lp-color-brand-youtube: #ff0034;--lp-color-brand-instagram: #dc2275;--lp-color-brand-linkedin: #0189df;--lp-color-brand-preview: #b636dd;--lp-color-brand-coming-soon: #ef1a73;--lp-color-brand-linux: #ff9a0e;--lp-color-brand-windows: #14bbf7;--lp-color-brand-macos: #60ba47;--lp-color-status-good: #22c55e;--lp-color-status-warn: #fbbf24;--lp-color-status-bad: #ef4444;--lp-spacing-1: 0.25rem;--lp-spacing-2: 0.5rem;--lp-spacing-3: 0.75rem;--lp-spacing-4: 1rem;--lp-spacing-6: 1.5rem;--lp-spacing-8: 2rem;--lp-spacing-px-3: 3px;--lp-spacing-px-4: 4px;--lp-spacing-px-6: 6px;--lp-spacing-px-8: 8px;--lp-spacing-px-12: 12px;--lp-font-sans: 'Inter', 'Segoe UI', sans-serif;--lp-font-mono: 'SFMono-Regular', 'SF Mono', 'Menlo', monospace;--lp-radius-sm: 0.25rem;--lp-radius-md: 0.5rem;--lp-radius-lg: 0.75rem;--lp-shadow-card: 0 8px 24px rgba(24, 28, 24, 0.08);--lp-z-base: 1;--lp-z-overlay: 10;--lp-z-modal: 50;--accent: var(--lp-color-accent);--accent-dark: var(--lp-color-accent-strong);--hero-text: var(--lp-color-text-primary);--text: var(--lp-color-text-secondary);--text-secondary: var(--lp-color-text-secondary);--muted-text: var(--lp-color-text-muted);--background: var(--lp-color-bg-page);--card-background: var(--lp-color-bg-card);--background-highlight: var(--lp-color-bg-subtle);--border: var(--lp-color-border-default);--button-text: var(--lp-color-on-accent);--page-header-description-color: var(--lp-color-text-secondary);--arbitrum: var(--lp-color-arbitrum)}.dark{--lp-color-accent: #2b9a66;--lp-color-accent-strong: #18794e;--lp-color-accent-soft: #3cb540;--lp-color-accent-bright: #5dd662;--lp-color-accent-brightest: #7fe584;--lp-color-text-primary: #e0e4e0;--lp-color-text-secondary: #a0a4a0;--lp-color-text-muted: #6b7280;--lp-color-bg-page: #0d0d0d;--lp-color-bg-card: #1a1a1a;--lp-color-bg-elevated: #141a16;--lp-color-bg-subtle: rgba(255, 255, 255, 0.1);--lp-color-bg-overlay: rgba(0, 0, 0, 0.5);--lp-color-border-default: #333333;--lp-color-border-strong: rgba(255, 255, 255, 0.3);--lp-color-border-inverse: rgba(255, 255, 255, 0.5);--lp-color-on-accent: #ffffff;--lp-color-link: #5dd662;--lp-color-link-hover: #a0f0a5;--lp-color-brand-github: #f0f0f0;--accent: var(--lp-color-accent);--accent-dark: var(--lp-color-accent-strong);--hero-text: var(--lp-color-text-primary);--text: var(--lp-color-text-secondary);--text-secondary: var(--lp-color-text-secondary);--muted-text: var(--lp-color-text-muted);--background: var(--lp-color-bg-page);--card-background: var(--lp-color-bg-card);--background-highlight: var(--lp-color-bg-subtle);--border: var(--lp-color-border-default);--button-text: var(--lp-color-on-accent);--page-header-description-color: var(--lp-color-text-secondary);--arbitrum: var(--lp-color-arbitrum)}.nav-tabs{width:100%;justify-content:flex-start}@media (min-width: 1024px){#content-container:not(:has(.frame-mode-hero-full)):not(:has(.frame-mode-container)){padding-left:3rem!important;padding-right:3rem!important}#content-container:not(:has(.frame-mode-hero-full)):not(:has(.frame-mode-container))>.max-w-5xl{max-width:72rem!important}#content-container:has(.frame-mode-hero-full),#content-container:has(.frame-mode-container){padding-left:2rem!important;padding-right:2rem!important}#content-container:has(.frame-mode-hero-full)>.max-w-5xl,#content-container:has(.frame-mode-container)>.max-w-5xl{max-width:80rem!important}}#navbar>div.z-10.mx-auto.relative>div.hidden.lg\\:flex.px-12.h-12>div{column-gap:2rem!important}a.nav-tabs-item[href*=\"/internal/\"]{margin-left:1rem;margin-right:-1rem;padding-right:0;border-bottom-color:transparent!important}a.nav-tabs-item[href$=\"/resources/redirect\"],a.nav-tabs-item[href$=\"/resources/portal\"],a.nav-tabs-item[href$=\"/07_resources/redirect\"],a.nav-tabs-item[href$=\"/07_resources/portal\"]{margin-left:auto;background-color:transparent;border:1px solid var(--accent)!important;padding:4px 8px;border-radius:4px;font-size:0.7rem;height:auto!important;align-self:center;margin-right:-2rem}a.nav-tabs-item[href$=\"/resources/redirect\"] svg,a.nav-tabs-item[href$=\"/resources/portal\"] svg,a.nav-tabs-item[href$=\"/07_resources/redirect\"] svg,a.nav-tabs-item[href$=\"/07_resources/portal\"] svg,a.nav-tabs-item[href$=\"/07_resources/resources_hub\"] svg{height:0.75rem;width:0.75rem}a.nav-tabs-item[href$=\"/resources/redirect\"]>div:last-child,a.nav-tabs-item[href$=\"/resources/portal\"]>div:last-child,a.nav-tabs-item[href$=\"/07_resources/redirect\"]>div:last-child,a.nav-tabs-item[href$=\"/07_resources/portal\"]>div:last-child,a.nav-tabs-item[href$=\"/07_resources/resources_hub\"]>div:last-child{display:none}#footer .flex-col .flex.gap-4{flex-direction:column!important;gap:0rem!important}#footer>div{padding-top:2rem!important;padding-bottom:1rem!important}#chat-assistant-sheet[aria-hidden=\"true\"]{display:none!important}button.text-left.text-gray-600.text-sm.font-medium{min-height:24px;padding-top:4px;padding-bottom:4px}[data-component-part=\"card-content-container\"]{padding-right:2.5rem}.code-block>div>div>svg{background-color:#18794e!important}#error-description>span>div>div{border:1px solid #18794e!important}body>div.relative.antialiased.text-gray-500.dark\\:text-gray-400>div.peer-\\[\\.is-not-custom\\]\\:lg\\:flex.peer-\\[\\.is-custom\\]\\:\\[\\\u0026\\>div\\:first-child\\]\\:\\!hidden.peer-\\[\\.is-custom\\]\\:\\[\\\u0026\\>div\\:first-child\\]\\:sm\\:\\!hidden.peer-\\[\\.is-custom\\]\\:\\[\\\u0026\\>div\\:first-child\\]\\:md\\:\\!hidden.peer-\\[\\.is-custom\\]\\:\\[\\\u0026\\>div\\:first-child\\]\\:lg\\:\\!hidden.peer-\\[\\.is-custom\\]\\:\\[\\\u0026\\>div\\:first-child\\]\\:xl\\:\\!hidden>div.flex.flex-col.items-center.justify-center.w-full.max-w-lg.overflow-x-hidden.mx-auto.py-48.px-5.text-center.\\*\\:text-center.gap-y-8.not-found-container>div{margin-top:-5rem}#error-description>span>div>div>div.relative.rounded-xl.overflow-hidden.flex.justify-center>img{width:500px;aspect-ratio:4 / 3;object-fit:cover}#content>div.steps.ml-3\\.5.mt-10.mb-6>div>div.w-full.overflow-hidden.pl-8.pr-px>p{color:#2b9a66!important}.dark .bg-white\\/\\[0\\.95\\].multi-view-dropdown-trigger{background-color:transparent!important;background:none!important}#table-of-contents-layout:empty,#content-side-layout:has(#table-of-contents-layout:empty){display:none}[data-docs-dynamic-table]{table-layout:fixed!important}[data-docs-styled-table-shell]>div{padding-top:0!important;padding-bottom:0!important;margin-top:0!important;margin-bottom:0!important}[data-docs-bordered-box]>:first-child{margin-top:0!important}[data-docs-bordered-box]>:last-child{margin-bottom:0!important}[data-docs-bordered-box][data-accent-bar]::before{content:\"\";position:absolute;top:0;bottom:0;left:0;width:4px;background-color:var(--accent-bar-color);border-radius:inherit;border-top-right-radius:0;border-bottom-right-radius:0}.frame-mode-container{width:calc(100% + 96px + 20px);margin-left:-96px;margin-right:-20px;margin-bottom:2rem;padding-left:15%;padding-right:15%;box-sizing:border-box}.frame-mode-hero-full .frame-mode-container{width:100%;margin-left:0;margin-right:0;padding-left:0%;padding-right:0%}[data-page-mode=\"frame\"] #pagination{width:calc(100% + 96px + 20px);margin-left:-96px;margin-right:-20px;padding-left:calc((100% + 96px + 20px) * 0.1 + 96px);padding-right:calc((100% + 96px + 20px) * 0.1 + 20px);box-sizing:border-box}.frame-mode-hero-full{width:calc(100% + 96px + 20px);margin-left:-96px;margin-right:-20px;position:relative}@media (max-width: 1023px){.frame-mode-container{width:100%;margin-left:0;margin-right:0;padding-left:1rem;padding-right:1rem}[data-page-mode=\"frame\"] #pagination{width:100%;margin-left:0;margin-right:0;padding-left:1rem;padding-right:1rem}.frame-mode-hero-full{width:100%;margin-left:0;margin-right:0}}#starfield{position:absolute;inset:0;width:100%;height:100%;pointer-events:none;z-index:0}.frame-mode-hero-full [data-component-part=\"card-content-container\"]{padding-top:0.5rem;padding-bottom:0.5rem;padding-left:1rem;padding-right:2.5rem}.frame-mode-hero-full #card-link-arrow-icon{top:0.75rem;right:0.75rem}input:focus-visible,select:focus-visible,textarea:focus-visible,button:focus-visible,a:focus-visible,[tabindex]:focus-visible{outline:2px solid var(--accent)!important;outline-offset:2px}@media (max-width: 767px){.frame-mode-hero-full{width:100%;max-width:100%;overflow-x:hidden}}@media (max-width: 480px){#content{padding-left:1rem;padding-right:1rem}}.lp-inline-flex{display:flex;align-items:center}.lp-text-muted{color:var(--lp-color-text-secondary)}.lp-text-italic-muted{font-style:italic;color:var(--lp-color-text-secondary)}.lp-inline-flex-gap{display:flex;align-items:center;gap:0.2rem}.lp-link-underline{border-bottom:1.5px solid var(--lp-color-text-primary);color:var(--lp-color-text-primary);padding-bottom:0.25rem}"}],"page":{"pagePath":"v1/api-reference/asset/upload","slug":"/v1/api-reference/asset/upload","pageMetadata":{"title":"Upload an asset","openapi":"POST /asset/request-upload","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","href":"/v1/api-reference/asset/upload"},"description":{"compiledSource":"\"use strict\";\nconst {Fragment: _Fragment, jsx: _jsx, jsxs: _jsxs} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n blockquote: \"blockquote\",\n br: \"br\",\n code: \"code\",\n h2: \"h2\",\n p: \"p\",\n pre: \"pre\",\n span: \"span\",\n ..._provideComponents(),\n ...props.components\n }, {CodeBlock} = _components;\n if (!CodeBlock) _missingMdxReference(\"CodeBlock\", true);\n return _jsxs(_Fragment, {\n children: [_jsxs(_components.p, {\n children: [\"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\", _jsx(_components.br, {}), \"\\n\", _jsx(_components.br, {}), \"\\n\", \"Once 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\", _jsx(_components.h2, {\n children: \"Direct Upload\"\n }), \"\\n\", _jsx(_components.p, {\n children: \"For 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\", _jsx(_components.h2, {\n children: \"Resumable Upload\"\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"Livepeer supports resumable uploads via Tus. This section provides a\\nsimple example of how to use tus-js-client to upload a video file.\\n\", _jsx(_components.br, {}), \"\\n\", _jsx(_components.br, {}), \"\\n\", \"From 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\", _jsx(CodeBlock, {\n numberOfLines: \"37\",\n language: \"text\",\n children: _jsx(_components.pre, {\n className: \"shiki shiki-themes github-light-default dark-plus\",\n style: {\n backgroundColor: \"#ffffff\",\n \"--shiki-dark-bg\": \"#0B0C0E\",\n color: \"#1f2328\",\n \"--shiki-dark\": \"#D4D4D4\"\n },\n language: \"text\",\n children: _jsxs(_components.code, {\n language: \"text\",\n numberOfLines: \"37\",\n children: [_jsx(_components.span, {\n className: \"line\",\n children: _jsx(_components.span, {\n children: \"# This assumes there is an `input` element of `type=\\\"file\\\"` with id\"\n })\n }), \"\\n\", _jsx(_components.span, {\n className: \"line\",\n children: _jsx(_components.span, {\n children: \"`fileInput` in the HTML\"\n })\n }), \"\\n\", _jsx(_components.span, {\n className: \"line\",\n children: _jsx(_components.span, {})\n }), \"\\n\", _jsx(_components.span, {\n className: \"line\",\n children: _jsx(_components.span, {})\n }), \"\\n\", _jsx(_components.span, {\n className: \"line\",\n children: _jsx(_components.span, {\n children: \"const input = document.getElementById('fileInput');\"\n })\n }), \"\\n\", _jsx(_components.span, {\n className: \"line\",\n children: _jsx(_components.span, {})\n }), \"\\n\", _jsx(_components.span, {\n className: \"line\",\n children: _jsx(_components.span, {\n children: \"const file = input.files[0];\"\n })\n }), \"\\n\", _jsx(_components.span, {\n className: \"line\",\n children: _jsx(_components.span, {})\n }), \"\\n\", _jsx(_components.span, {\n className: \"line\",\n children: _jsx(_components.span, {\n children: \"const upload = new tus.Upload(file, {\"\n })\n }), \"\\n\", _jsx(_components.span, {\n className: \"line\",\n children: _jsx(_components.span, {\n children: \" endpoint: tusEndpoint, // URL from `tusEndpoint` field in the\"\n })\n }), \"\\n\", _jsx(_components.span, {\n className: \"line\",\n children: _jsx(_components.span, {\n children: \"`/request-upload` response\"\n })\n }), \"\\n\", _jsx(_components.span, {\n className: \"line\",\n children: _jsx(_components.span, {\n children: \" metadata: {\"\n })\n }), \"\\n\", _jsx(_components.span, {\n className: \"line\",\n children: _jsx(_components.span, {\n children: \" filename,\"\n })\n }), \"\\n\", _jsx(_components.span, {\n className: \"line\",\n children: _jsx(_components.span, {\n children: \" filetype: 'video/mp4',\"\n })\n }), \"\\n\", _jsx(_components.span, {\n className: \"line\",\n children: _jsx(_components.span, {\n children: \" },\"\n })\n }), \"\\n\", _jsx(_components.span, {\n className: \"line\",\n children: _jsx(_components.span, {\n children: \" uploadSize: file.size,\"\n })\n }), \"\\n\", _jsx(_components.span, {\n className: \"line\",\n children: _jsx(_components.span, {\n children: \" onError(err) {\"\n })\n }), \"\\n\", _jsx(_components.span, {\n className: \"line\",\n children: _jsx(_components.span, {\n children: \" console.error('Error uploading file:', err);\"\n })\n }), \"\\n\", _jsx(_components.span, {\n className: \"line\",\n children: _jsx(_components.span, {\n children: \" },\"\n })\n }), \"\\n\", _jsx(_components.span, {\n className: \"line\",\n children: _jsx(_components.span, {\n children: \" onProgress(bytesUploaded, bytesTotal) {\"\n })\n }), \"\\n\", _jsx(_components.span, {\n className: \"line\",\n children: _jsx(_components.span, {\n children: \" const percentage = ((bytesUploaded / bytesTotal) * 100).toFixed(2);\"\n })\n }), \"\\n\", _jsx(_components.span, {\n className: \"line\",\n children: _jsx(_components.span, {\n children: \" console.log('Uploaded ' + percentage + '%');\"\n })\n }), \"\\n\", _jsx(_components.span, {\n className: \"line\",\n children: _jsx(_components.span, {\n children: \" },\"\n })\n }), \"\\n\", _jsx(_components.span, {\n className: \"line\",\n children: _jsx(_components.span, {\n children: \" onSuccess() {\"\n })\n }), \"\\n\", _jsx(_components.span, {\n className: \"line\",\n children: _jsx(_components.span, {\n children: \" console.log('Upload finished:', upload.url);\"\n })\n }), \"\\n\", _jsx(_components.span, {\n className: \"line\",\n children: _jsx(_components.span, {\n children: \" },\"\n })\n }), \"\\n\", _jsx(_components.span, {\n className: \"line\",\n children: _jsx(_components.span, {\n children: \"});\"\n })\n }), \"\\n\", _jsx(_components.span, {\n className: \"line\",\n children: _jsx(_components.span, {})\n }), \"\\n\", _jsx(_components.span, {\n className: \"line\",\n children: _jsx(_components.span, {\n children: \"const previousUploads = await upload.findPreviousUploads();\"\n })\n }), \"\\n\", _jsx(_components.span, {\n className: \"line\",\n children: _jsx(_components.span, {})\n }), \"\\n\", _jsx(_components.span, {\n className: \"line\",\n children: _jsx(_components.span, {\n children: \"if (previousUploads.length > 0) {\"\n })\n }), \"\\n\", _jsx(_components.span, {\n className: \"line\",\n children: _jsx(_components.span, {\n children: \" upload.resumeFromPreviousUpload(previousUploads[0]);\"\n })\n }), \"\\n\", _jsx(_components.span, {\n className: \"line\",\n children: _jsx(_components.span, {\n children: \"}\"\n })\n }), \"\\n\", _jsx(_components.span, {\n className: \"line\",\n children: _jsx(_components.span, {})\n }), \"\\n\", _jsx(_components.span, {\n className: \"line\",\n children: _jsx(_components.span, {\n children: \"upload.start();\"\n })\n }), \"\\n\", _jsx(_components.span, {\n className: \"line\",\n children: _jsx(_components.span, {})\n }), \"\\n\", _jsx(_components.span, {\n className: \"line\",\n children: _jsx(_components.span, {})\n })]\n })\n })\n }), \"\\n\", _jsxs(_components.blockquote, {\n children: [\"\\n\", _jsx(_components.p, {\n children: \"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 }), \"\\n\"]\n })]\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\nfunction _missingMdxReference(id, component) {\n throw new Error(\"Expected \" + (component ? \"component\" : \"object\") + \" `\" + id + \"` to be defined: you likely forgot to import, pass, or provide it.\");\n}\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){return _jsx(_Fragment,{})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent}","frontmatter":{},"scope":{"codeStyling":{"theme":{"light":"github-light","dark":"dark-plus"}},"config":{},"pageMetadata":{"title":"Upload an asset","openapi":"POST /asset/request-upload","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","href":"/v1/api-reference/asset/upload"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":["/_mintlify/custom/na-36-changelog-go-livepeer-2026-05-18/86044cb4146efff0/snippets/components/integrators/feeds/contractVerifierData.js","/_mintlify/custom/na-36-changelog-go-livepeer-2026-05-18/86044cb4146efff0/snippets/components/x-archive/integrators-feeds/contractVerifierData.js","/_mintlify/custom/na-36-changelog-go-livepeer-2026-05-18/943f25bb7ac7d121/snippets/data/contract-addresses/view-model.js","/_mintlify/custom/na-36-changelog-go-livepeer-2026-05-18/298086d7bf262a7f/snippets/data/gateways/configuration-flags.js","/_mintlify/custom/na-36-changelog-go-livepeer-2026-05-18/ce2de808f20bf288/snippets/data/social-feeds/transformers/filterVideos.js","/_mintlify/custom/na-36-changelog-go-livepeer-2026-05-18/cd0b73bc6b3814c0/v2/about/protocol/data/blockchain-contracts-addresses.js","/_mintlify/custom/na-36-changelog-go-livepeer-2026-05-18/15325830a8aed988/v2/about/protocol/data/blockchain-contracts-links.js","/_mintlify/custom/na-36-changelog-go-livepeer-2026-05-18/cd0b73bc6b3814c0/v2/about/protocol2/data/blockchain-contracts-addresses.js","/_mintlify/custom/na-36-changelog-go-livepeer-2026-05-18/15325830a8aed988/v2/about/protocol2/data/blockchain-contracts-links.js"],"openApiReferenceData":{"operation":{"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":"0b4deb68-4716-4370-ba7c-d050904ca257","responses":{"200":"497091f5-89b7-44ca-a12f-60da18ce24f4","default":"2ba28e70-b098-4922-a1c3-92a68113a6fa"},"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: \"\u003cYOUR_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(\"\u003cYOUR_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: \u0026components.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=\"\u003cYOUR_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"}],"method":"post","type":"path","servers":["504cf1d2-978e-481b-8c1a-e507b8d686a1"],"security":["80f86897-cacd-4caa-954a-ee2d2b7eb93b"],"path":"/asset/request-upload","baseUrlOptions":["https://livepeer.studio/api"],"title":"Upload an asset","codeSamples":[{"label":"requestUpload","lang":"typescript","source":"import { Livepeer } from \"livepeer\";\nimport { TranscodeProfileEncoder, TranscodeProfileProfile, Type } from \"livepeer/models/components\";\n\nconst livepeer = new Livepeer({\n apiKey: \"\u003cYOUR_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();"},{"label":"requestUpload","lang":"go","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(\"\u003cYOUR_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: \u0026components.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}"},{"label":"requestUpload","lang":"python","source":"from livepeer import Livepeer\nfrom livepeer.models import components\n\ns = Livepeer(\n api_key=\"\u003cYOUR_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"}],"requiredOnlyExamples":false,"requestExampleType":"codeSamples","responseExampleType":"generated"},"dependencies":{"parameters":{},"requestBody":{"required":true,"content":{"application/json":{"schema":{"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.\n","example":"filename.mp4","isRequired":true,"uniqueKey":"name","typeLabel":"string"},"staticMp4":{"type":"boolean","description":"Whether to generate MP4s for the asset.","example":true,"uniqueKey":"staticMp4","typeLabel":"boolean"},"playbackPolicy":{"oneOf":[{"type":"object","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","isRequired":true,"uniqueKey":"playbackPolicy.oneOf.0.type","typeLabel":"enum\u003cstring>"},"webhookId":{"type":"string","description":"ID of the webhook to use for playback policy","example":"1bde4o2i6xycudoy","uniqueKey":"playbackPolicy.oneOf.0.webhookId","typeLabel":"string"},"webhookContext":{"type":"object","description":"User-defined webhook context","additionalProperties":true,"example":{"streamerId":"my-custom-id"},"uniqueKey":"playbackPolicy.oneOf.0.webhookContext","typeLabel":"object"},"refreshInterval":{"type":"number","description":"Interval (in seconds) at which the playback policy should be\nrefreshed (default 600 seconds)\n","example":600,"uniqueKey":"playbackPolicy.oneOf.0.refreshInterval","typeLabel":"number"},"allowedOrigins":{"type":"array","description":"List of allowed origins for CORS playback (\u003cscheme>://\u003chostname>:\u003cport>, \u003cscheme>://\u003chostname>)","items":{"type":"string","uniqueKey":"playbackPolicy.oneOf.0.allowedOrigins.items.[INDEX]","typeLabel":"string"},"uniqueKey":"playbackPolicy.oneOf.0.allowedOrigins","typeLabel":"string[]"}},"uniqueKey":"playbackPolicy.oneOf.0","typeLabel":"object"},{"type":"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\nrefreshed (default 600 seconds)\n","example":600},"allowedOrigins":{"type":"array","description":"List of allowed origins for CORS playback (\u003cscheme>://\u003chostname>:\u003cport>, \u003cscheme>://\u003chostname>)","items":{"type":"string"}}},"uniqueKey":"playbackPolicy.oneOf.1","typeLabel":"null"}],"uniqueKey":"playbackPolicy","typeLabel":"object | null"},"creatorId":{"oneOf":[{"type":"object","required":["type","value"],"properties":{"type":{"type":"string","enum":["unverified"],"isRequired":true,"uniqueKey":"creatorId.oneOf.0.type","typeLabel":"enum\u003cstring>"},"value":{"type":"string","isRequired":true,"uniqueKey":"creatorId.oneOf.0.value","typeLabel":"string"}},"additionalProperties":false,"uniqueKey":"creatorId.oneOf.0","typeLabel":"object"},{"type":"string","description":"Helper syntax to specify an unverified creator ID, fully managed by the developer.","uniqueKey":"creatorId.oneOf.1","typeLabel":"string"}],"uniqueKey":"creatorId","typeLabel":"object | string"},"storage":{"type":"object","additionalProperties":false,"properties":{"ipfs":{"oneOf":[{"type":"object","description":"Set to true to make default export to IPFS. To customize the\npinned files, specify an object with a spec field. False or null\nmeans to unpin from IPFS, but it's unsupported right now.\n","properties":{"spec":{"oneOf":[{"type":"null","uniqueKey":"storage.ipfs.oneOf.0.spec.oneOf.0","typeLabel":"null"},{"type":"any","uniqueKey":"storage.ipfs.oneOf.0.spec.oneOf.1","typeLabel":"any"}],"uniqueKey":"storage.ipfs.oneOf.0.spec","typeLabel":"null | any"}},"additionalProperties":false,"uniqueKey":"storage.ipfs.oneOf.0","typeLabel":"object"},{"type":"boolean","description":"Set to true to make default export to IPFS. To customize the\npinned files, specify an object with a spec field. False or null\nmeans to unpin from IPFS, but it's unsupported right now.\n","uniqueKey":"storage.ipfs.oneOf.1","typeLabel":"boolean"},{"type":"null","description":"Set to true to make default export to IPFS. To customize the\npinned files, specify an object with a spec field. False or null\nmeans to unpin from IPFS, but it's unsupported right now.\n","uniqueKey":"storage.ipfs.oneOf.2","typeLabel":"null"}],"uniqueKey":"storage.ipfs","typeLabel":"object | boolean | null"}},"uniqueKey":"storage","typeLabel":"object"},"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.","isRequired":true,"uniqueKey":"encryption.encryptedKey","typeLabel":"string"}},"uniqueKey":"encryption","typeLabel":"object"},"c2pa":{"type":"boolean","description":"Decides if the output video should include C2PA signature","uniqueKey":"c2pa","typeLabel":"boolean"},"profiles":{"oneOf":[{"type":"array","items":{"type":"object","description":"Transcode API profile","additionalProperties":false,"required":["bitrate"],"properties":{"bitrate":{"type":"integer","minimum":400,"example":3000000,"isRequired":true,"uniqueKey":"profiles.oneOf.0.items.[INDEX].bitrate","typeLabel":"integer"},"width":{"type":"integer","minimum":128,"example":1280,"uniqueKey":"profiles.oneOf.0.items.[INDEX].width","typeLabel":"integer"},"name":{"type":"string","minLength":1,"maxLength":500,"example":"720p","uniqueKey":"profiles.oneOf.0.items.[INDEX].name","typeLabel":"string"},"height":{"type":"integer","minimum":128,"example":720,"uniqueKey":"profiles.oneOf.0.items.[INDEX].height","typeLabel":"integer"},"quality":{"type":"integer","description":"Restricts the size of the output video using the constant quality feature. Increasing this value will result in a lower quality video. Note that this parameter might not work if the transcoder lacks support for it.\n","minimum":0,"maximum":44,"example":23,"uniqueKey":"profiles.oneOf.0.items.[INDEX].quality","typeLabel":"integer"},"fps":{"type":"integer","minimum":0,"example":30,"uniqueKey":"profiles.oneOf.0.items.[INDEX].fps","typeLabel":"integer"},"fpsDen":{"type":"integer","minimum":1,"example":1,"uniqueKey":"profiles.oneOf.0.items.[INDEX].fpsDen","typeLabel":"integer"},"gop":{"type":"string","example":2,"uniqueKey":"profiles.oneOf.0.items.[INDEX].gop","typeLabel":"string"},"profile":{"type":"string","enum":["H264Baseline","H264Main","H264High","H264ConstrainedHigh"],"example":"H264Baseline","uniqueKey":"profiles.oneOf.0.items.[INDEX].profile","typeLabel":"enum\u003cstring>"},"encoder":{"type":"string","enum":["H.264","HEVC","VP8","VP9"],"example":"H.264","uniqueKey":"profiles.oneOf.0.items.[INDEX].encoder","typeLabel":"enum\u003cstring>"}},"uniqueKey":"profiles.oneOf.0.items.[INDEX]","typeLabel":"object"},"uniqueKey":"profiles.oneOf.0","typeLabel":"object[]"},{"type":"null","items":{"type":"object","description":"Transcode API profile","additionalProperties":false,"required":["bitrate"],"properties":{"width":{"type":"integer","minimum":128,"example":1280},"name":{"type":"string","minLength":1,"maxLength":500,"example":"720p"},"height":{"type":"integer","minimum":128,"example":720},"bitrate":{"type":"integer","minimum":400,"example":3000000},"quality":{"type":"integer","description":"Restricts the size of the output video using the constant quality feature. Increasing this value will result in a lower quality video. Note that this parameter might not work if the transcoder lacks support for it.\n","minimum":0,"maximum":44,"example":23},"fps":{"type":"integer","minimum":0,"example":30},"fpsDen":{"type":"integer","minimum":1,"example":1},"gop":{"type":"string","example":2},"profile":{"type":"string","enum":["H264Baseline","H264Main","H264High","H264ConstrainedHigh"],"example":"H264Baseline"},"encoder":{"type":"string","enum":["H.264","HEVC","VP8","VP9"],"example":"H.264"}}},"uniqueKey":"profiles.oneOf.1","typeLabel":"null"}],"uniqueKey":"profiles","typeLabel":"object[] | null"},"targetSegmentSizeSecs":{"type":"number","description":"How many seconds the duration of each output segment should be","uniqueKey":"targetSegmentSizeSecs","typeLabel":"number"}},"type":"object","uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"name":"filename.mp4","staticMp4":true,"playbackPolicy":{"type":"webhook","webhookId":"1bde4o2i6xycudoy","webhookContext":{"streamerId":"my-custom-id"},"refreshInterval":600,"allowedOrigins":["\u003cstring>"]},"creatorId":{"type":"unverified","value":"\u003cstring>"},"storage":{"ipfs":{"spec":"\u003cunknown>"}},"c2pa":true,"profiles":[{"bitrate":3000000,"width":1280,"name":"720p","height":720,"quality":23,"fps":30,"fpsDen":1,"gop":2,"profile":"H264Baseline","encoder":"H.264"}],"targetSegmentSizeSecs":123}}},"exampleType":"generated"}},"exampleType":"generated"},"responses":{"497091f5-89b7-44ca-a12f-60da18ce24f4":{"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","isRequired":true,"uniqueKey":"url","typeLabel":"string"},"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","isRequired":true,"uniqueKey":"tusEndpoint","typeLabel":"string"},"asset":{"type":"object","additionalProperties":false,"required":["id","name","source"],"properties":{"id":{"type":"string","readOnly":true,"example":"09F8B46C-61A0-4254-9875-F71F4C605BC7","isRequired":true,"uniqueKey":"asset.id","typeLabel":"string"},"source":{"oneOf":[{"type":"object","required":["type","url"],"properties":{"type":{"type":"string","enum":["url"],"isRequired":true,"uniqueKey":"asset.source.oneOf.0.type","typeLabel":"enum\u003cstring>"},"url":{"type":"string","description":"URL from which the asset was uploaded.","isRequired":true,"uniqueKey":"asset.source.oneOf.0.url","typeLabel":"string"},"gatewayUrl":{"type":"string","description":"Gateway URL from asset if parsed from provided URL on upload.","uniqueKey":"asset.source.oneOf.0.gatewayUrl","typeLabel":"string"},"encryption":{"type":"any","uniqueKey":"asset.source.oneOf.0.encryption","typeLabel":"any"}},"additionalProperties":false,"isRequired":true,"uniqueKey":"asset.source.oneOf.0","typeLabel":"object"},{"type":"object","required":["type","sessionId"],"properties":{"type":{"type":"string","enum":["recording"],"isRequired":true,"uniqueKey":"asset.source.oneOf.1.type","typeLabel":"enum\u003cstring>"},"sessionId":{"type":"string","description":"ID of the session from which this asset was created","isRequired":true,"uniqueKey":"asset.source.oneOf.1.sessionId","typeLabel":"string"}},"additionalProperties":false,"isRequired":true,"uniqueKey":"asset.source.oneOf.1","typeLabel":"object"},{"type":"object","required":["type"],"properties":{"type":{"type":"string","enum":["directUpload","clip"],"isRequired":true,"uniqueKey":"asset.source.oneOf.2.type","typeLabel":"enum\u003cstring>"},"encryption":{"type":"any","uniqueKey":"asset.source.oneOf.2.encryption","typeLabel":"any"},"sourceId":{"type":"string","description":"ID of the asset or stream from which this asset was created.","uniqueKey":"asset.source.oneOf.2.sourceId","typeLabel":"string"},"sessionId":{"type":"string","description":"ID of the session from which this asset was created.","uniqueKey":"asset.source.oneOf.2.sessionId","typeLabel":"string"},"playbackId":{"type":"string","description":"Playback ID of the asset or stream from which this asset was created.","uniqueKey":"asset.source.oneOf.2.playbackId","typeLabel":"string"},"requesterId":{"type":"string","description":"ID of the requester from which this asset was created.","uniqueKey":"asset.source.oneOf.2.requesterId","typeLabel":"string"},"assetId":{"type":"string","description":"ID of the asset from which this asset was created.","uniqueKey":"asset.source.oneOf.2.assetId","typeLabel":"string"}},"additionalProperties":false,"isRequired":true,"uniqueKey":"asset.source.oneOf.2","typeLabel":"object"}],"isRequired":true,"uniqueKey":"asset.source","typeLabel":"object"},"name":{"type":"string","description":"The name of the asset. This is not necessarily the filename - it can be a custom name or title.\n","example":"filename.mp4","isRequired":true,"uniqueKey":"asset.name","typeLabel":"string"},"type":{"type":"string","enum":["video","audio"],"description":"Type of the asset.","example":"video","uniqueKey":"asset.type","typeLabel":"enum\u003cstring>"},"playbackId":{"type":"string","example":"eaw4nk06ts2d0mzb","description":"The playback ID to use with the Playback Info endpoint to retrieve playback URLs.","uniqueKey":"asset.playbackId","typeLabel":"string"},"userId":{"type":"string","readOnly":true,"example":"66E2161C-7670-4D05-B71D-DA2D6979556F","deprecated":true,"uniqueKey":"asset.userId","typeLabel":"string"},"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).","uniqueKey":"asset.playbackUrl","typeLabel":"string"},"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.","uniqueKey":"asset.downloadUrl","typeLabel":"string"},"playbackPolicy":{"oneOf":[{"type":"object","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","isRequired":true,"uniqueKey":"asset.playbackPolicy.oneOf.0.type","typeLabel":"enum\u003cstring>"},"webhookId":{"type":"string","description":"ID of the webhook to use for playback policy","example":"1bde4o2i6xycudoy","uniqueKey":"asset.playbackPolicy.oneOf.0.webhookId","typeLabel":"string"},"webhookContext":{"type":"object","description":"User-defined webhook context","additionalProperties":true,"example":{"streamerId":"my-custom-id"},"uniqueKey":"asset.playbackPolicy.oneOf.0.webhookContext","typeLabel":"object"},"refreshInterval":{"type":"number","description":"Interval (in seconds) at which the playback policy should be\nrefreshed (default 600 seconds)\n","example":600,"uniqueKey":"asset.playbackPolicy.oneOf.0.refreshInterval","typeLabel":"number"},"allowedOrigins":{"type":"array","description":"List of allowed origins for CORS playback (\u003cscheme>://\u003chostname>:\u003cport>, \u003cscheme>://\u003chostname>)","items":{"type":"string","uniqueKey":"asset.playbackPolicy.oneOf.0.allowedOrigins.items.[INDEX]","typeLabel":"string"},"uniqueKey":"asset.playbackPolicy.oneOf.0.allowedOrigins","typeLabel":"string[]"}},"uniqueKey":"asset.playbackPolicy.oneOf.0","typeLabel":"object"},{"type":"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\nrefreshed (default 600 seconds)\n","example":600},"allowedOrigins":{"type":"array","description":"List of allowed origins for CORS playback (\u003cscheme>://\u003chostname>:\u003cport>, \u003cscheme>://\u003chostname>)","items":{"type":"string"}}},"uniqueKey":"asset.playbackPolicy.oneOf.1","typeLabel":"null"}],"uniqueKey":"asset.playbackPolicy","typeLabel":"object | null"},"creatorId":{"type":"object","required":["type","value"],"properties":{"type":{"type":"string","enum":["unverified"],"example":"unverified","isRequired":true,"uniqueKey":"asset.creatorId.type","typeLabel":"enum\u003cstring>"},"value":{"type":"string","description":"Developer-managed ID of the user who created the resource.","example":"user123","isRequired":true,"uniqueKey":"asset.creatorId.value","typeLabel":"string"}},"additionalProperties":false,"uniqueKey":"asset.creatorId","typeLabel":"object"},"profiles":{"type":"array","description":"Requested profiles for the asset to be transcoded into. Configured\non the upload APIs payload or through the `stream.recordingSpec`\nfield for recordings. If not specified, default profiles are derived\nbased on the source input. If this is a recording, the source will\nnot be present in this list but will be available for playback.\n","items":{"type":"object","description":"Transcode API profile","additionalProperties":false,"required":["bitrate"],"properties":{"bitrate":{"type":"integer","minimum":400,"example":3000000,"isRequired":true,"uniqueKey":"asset.profiles.items.[INDEX].bitrate","typeLabel":"integer"},"width":{"type":"integer","minimum":128,"example":1280,"uniqueKey":"asset.profiles.items.[INDEX].width","typeLabel":"integer"},"name":{"type":"string","minLength":1,"maxLength":500,"example":"720p","uniqueKey":"asset.profiles.items.[INDEX].name","typeLabel":"string"},"height":{"type":"integer","minimum":128,"example":720,"uniqueKey":"asset.profiles.items.[INDEX].height","typeLabel":"integer"},"quality":{"type":"integer","description":"Restricts the size of the output video using the constant quality feature. Increasing this value will result in a lower quality video. Note that this parameter might not work if the transcoder lacks support for it.\n","minimum":0,"maximum":44,"example":23,"uniqueKey":"asset.profiles.items.[INDEX].quality","typeLabel":"integer"},"fps":{"type":"integer","minimum":0,"example":30,"uniqueKey":"asset.profiles.items.[INDEX].fps","typeLabel":"integer"},"fpsDen":{"type":"integer","minimum":1,"example":1,"uniqueKey":"asset.profiles.items.[INDEX].fpsDen","typeLabel":"integer"},"gop":{"type":"string","example":2,"uniqueKey":"asset.profiles.items.[INDEX].gop","typeLabel":"string"},"profile":{"type":"string","enum":["H264Baseline","H264Main","H264High","H264ConstrainedHigh"],"example":"H264Baseline","uniqueKey":"asset.profiles.items.[INDEX].profile","typeLabel":"enum\u003cstring>"},"encoder":{"type":"string","enum":["H.264","HEVC","VP8","VP9"],"example":"H.264","uniqueKey":"asset.profiles.items.[INDEX].encoder","typeLabel":"enum\u003cstring>"}},"uniqueKey":"asset.profiles.items.[INDEX]","typeLabel":"object"},"uniqueKey":"asset.profiles","typeLabel":"object[]"},"storage":{"type":"object","additionalProperties":false,"properties":{"ipfs":{"type":"object","additionalProperties":false,"properties":{"spec":{"type":"object","additionalProperties":false,"default":{},"properties":{"nftMetadataTemplate":{"type":"string","enum":["file","player"],"default":"file","description":"Name of the NFT metadata template to export. 'player'\nwill embed the Livepeer Player on the NFT while 'file'\nwill reference only the immutable MP4 files.\n","uniqueKey":"asset.storage.ipfs.spec.nftMetadataTemplate","typeLabel":"enum\u003cstring>"},"nftMetadata":{"type":"object","description":"Additional data to add to the NFT metadata exported to\nIPFS. Will be deep merged with the default metadata\nexported.\n","uniqueKey":"asset.storage.ipfs.spec.nftMetadata","typeLabel":"object"}},"uniqueKey":"asset.storage.ipfs.spec","typeLabel":"object"},"nftMetadata":{"type":"object","required":["cid"],"additionalProperties":false,"properties":{"cid":{"type":"string","description":"CID of the file on IPFS","isRequired":true,"uniqueKey":"asset.storage.ipfs.nftMetadata.cid","typeLabel":"string"},"url":{"readOnly":true,"type":"string","description":"URL with IPFS scheme for the file","uniqueKey":"asset.storage.ipfs.nftMetadata.url","typeLabel":"string"},"gatewayUrl":{"readOnly":true,"type":"string","description":"URL to access file via HTTP through an IPFS gateway","uniqueKey":"asset.storage.ipfs.nftMetadata.gatewayUrl","typeLabel":"string"}},"uniqueKey":"asset.storage.ipfs.nftMetadata","typeLabel":"object"},"updatedAt":{"readOnly":true,"type":"number","description":"Timestamp (in milliseconds) at which IPFS export task was\nupdated\n","example":1587667174725,"uniqueKey":"asset.storage.ipfs.updatedAt","typeLabel":"number"}},"uniqueKey":"asset.storage.ipfs","typeLabel":"object"},"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","isRequired":true,"uniqueKey":"asset.storage.status.phase","typeLabel":"enum\u003cstring>"},"tasks":{"type":"object","additionalProperties":false,"properties":{"pending":{"type":"string","description":"ID of any currently running task that is exporting this\nasset to IPFS.\n","example":"09F8B46C-61A0-4254-9875-F71F4C605BC7","uniqueKey":"asset.storage.status.tasks.pending","typeLabel":"string"},"last":{"type":"string","description":"ID of the last task to run successfully, that created\nthe currently saved data.\n","example":"09F8B46C-61A0-4254-9875-F71F4C605BC7","uniqueKey":"asset.storage.status.tasks.last","typeLabel":"string"},"failed":{"type":"string","description":"ID of the last task to fail execution.","example":"09F8B46C-61A0-4254-9875-F71F4C605BC7","uniqueKey":"asset.storage.status.tasks.failed","typeLabel":"string"}},"isRequired":true,"uniqueKey":"asset.storage.status.tasks","typeLabel":"object"},"progress":{"type":"number","description":"Current progress of the task updating the storage.","example":0.5,"uniqueKey":"asset.storage.status.progress","typeLabel":"number"},"errorMessage":{"type":"string","description":"Error message if the last storage changed failed.","example":"Failed to update storage","uniqueKey":"asset.storage.status.errorMessage","typeLabel":"string"}},"type":"object","uniqueKey":"asset.storage.status","typeLabel":"object"}},"uniqueKey":"asset.storage","typeLabel":"object"},"status":{"readOnly":true,"type":"object","additionalProperties":false,"required":["phase","updatedAt"],"description":"Status of the asset","properties":{"phase":{"type":"string","description":"Phase of the asset","enum":["uploading","waiting","processing","ready","failed","deleting","deleted"],"isRequired":true,"uniqueKey":"asset.status.phase","typeLabel":"enum\u003cstring>"},"updatedAt":{"type":"number","description":"Timestamp (in milliseconds) at which the asset was last updated","example":1587667174725,"isRequired":true,"uniqueKey":"asset.status.updatedAt","typeLabel":"number"},"progress":{"type":"number","description":"Current progress of the task creating this asset.","uniqueKey":"asset.status.progress","typeLabel":"number"},"errorMessage":{"type":"string","description":"Error message if the asset creation failed.","uniqueKey":"asset.status.errorMessage","typeLabel":"string"}},"uniqueKey":"asset.status","typeLabel":"object"},"projectId":{"type":"string","description":"The ID of the project","example":"aac12556-4d65-4d34-9fb6-d1f0985eb0a9","uniqueKey":"asset.projectId","typeLabel":"string"},"createdAt":{"readOnly":true,"type":"number","description":"Timestamp (in milliseconds) at which asset was created","example":1587667174725,"uniqueKey":"asset.createdAt","typeLabel":"number"},"createdByTokenName":{"type":"string","readOnly":true,"description":"Name of the token used to create this object","uniqueKey":"asset.createdByTokenName","typeLabel":"string"},"size":{"readOnly":true,"type":"number","description":"Size of the asset in bytes","example":84934509,"uniqueKey":"asset.size","typeLabel":"number"},"hash":{"oneOf":[{"type":"array","description":"Hash of the asset","items":{"type":"object","additionalProperties":false,"properties":{"hash":{"type":"string","description":"Hash of the asset","example":"9b560b28b85378a5004117539196ab24e21bbd75b0e9eb1a8bc7c5fd80dc5b57","uniqueKey":"asset.hash.oneOf.0.items.[INDEX].hash","typeLabel":"string"},"algorithm":{"type":"string","description":"Hash algorithm used to compute the hash","example":"sha256","uniqueKey":"asset.hash.oneOf.0.items.[INDEX].algorithm","typeLabel":"string"}},"uniqueKey":"asset.hash.oneOf.0.items.[INDEX]","typeLabel":"object"},"uniqueKey":"asset.hash.oneOf.0","typeLabel":"object[]"},{"type":"null","description":"Hash of the asset","items":{"type":"object","additionalProperties":false,"properties":{"hash":{"type":"string","description":"Hash of the asset","example":"9b560b28b85378a5004117539196ab24e21bbd75b0e9eb1a8bc7c5fd80dc5b57"},"algorithm":{"type":"string","description":"Hash algorithm used to compute the hash","example":"sha256"}}},"uniqueKey":"asset.hash.oneOf.1","typeLabel":"null"}],"uniqueKey":"asset.hash","typeLabel":"object[] | null"},"videoSpec":{"readOnly":true,"type":"object","additionalProperties":false,"description":"Video metadata","properties":{"format":{"type":"string","description":"Format of the asset","example":"mp4","uniqueKey":"asset.videoSpec.format","typeLabel":"string"},"duration":{"type":"number","description":"Duration of the asset in seconds (float)","example":23.8328,"uniqueKey":"asset.videoSpec.duration","typeLabel":"number"},"bitrate":{"type":"number","description":"Bitrate of the video in bits per second","example":1000000,"uniqueKey":"asset.videoSpec.bitrate","typeLabel":"number"},"tracks":{"type":"array","description":"List of tracks associated with the asset when the format\ncontemplates them (e.g. mp4)\n","items":{"type":"object","additionalProperties":false,"required":["type","codec"],"properties":{"type":{"type":"string","description":"type of track","enum":["video","audio"],"example":"video","isRequired":true,"uniqueKey":"asset.videoSpec.tracks.items.[INDEX].type","typeLabel":"enum\u003cstring>"},"codec":{"type":"string","description":"Codec of the track","example":"aac","isRequired":true,"uniqueKey":"asset.videoSpec.tracks.items.[INDEX].codec","typeLabel":"string"},"startTime":{"type":"number","description":"Start time of the track in seconds","example":23.8238,"uniqueKey":"asset.videoSpec.tracks.items.[INDEX].startTime","typeLabel":"number"},"duration":{"type":"number","description":"Duration of the track in seconds","example":23.8238,"uniqueKey":"asset.videoSpec.tracks.items.[INDEX].duration","typeLabel":"number"},"bitrate":{"type":"number","description":"Bitrate of the track in bits per second","example":1000000,"uniqueKey":"asset.videoSpec.tracks.items.[INDEX].bitrate","typeLabel":"number"},"width":{"type":"number","description":"Width of the track - only for video tracks","example":1920,"uniqueKey":"asset.videoSpec.tracks.items.[INDEX].width","typeLabel":"number"},"height":{"type":"number","description":"Height of the track - only for video tracks","example":1080,"uniqueKey":"asset.videoSpec.tracks.items.[INDEX].height","typeLabel":"number"},"pixelFormat":{"type":"string","description":"Pixel format of the track - only for video tracks","example":"yuv420p","uniqueKey":"asset.videoSpec.tracks.items.[INDEX].pixelFormat","typeLabel":"string"},"fps":{"type":"number","description":"Frame rate of the track - only for video tracks","example":30,"uniqueKey":"asset.videoSpec.tracks.items.[INDEX].fps","typeLabel":"number"},"channels":{"type":"number","description":"Amount of audio channels in the track","example":2,"uniqueKey":"asset.videoSpec.tracks.items.[INDEX].channels","typeLabel":"number"},"sampleRate":{"type":"number","description":"Sample rate of the track in samples per second - only for\naudio tracks\n","example":44100,"uniqueKey":"asset.videoSpec.tracks.items.[INDEX].sampleRate","typeLabel":"number"},"bitDepth":{"type":"number","description":"Bit depth of the track - only for audio tracks","example":16,"uniqueKey":"asset.videoSpec.tracks.items.[INDEX].bitDepth","typeLabel":"number"}},"uniqueKey":"asset.videoSpec.tracks.items.[INDEX]","typeLabel":"object"},"uniqueKey":"asset.videoSpec.tracks","typeLabel":"object[]"}},"uniqueKey":"asset.videoSpec","typeLabel":"object"}},"isRequired":true,"uniqueKey":"asset","typeLabel":"object"},"task":{"type":"object","required":["id"],"additionalProperties":false,"properties":{"id":{"type":"string","example":"34d7618e-fd42-4798-acf5-19504616a11e","isRequired":true,"uniqueKey":"task.id","typeLabel":"string"}},"isRequired":true,"uniqueKey":"task","typeLabel":"object"}},"x-speakeasy-name-override":"data","uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"url":"https://origin.livepeer.com/api/asset/upload/direct?token=eyJhbGciOiJIUzI1NiJ9.eyJtc2ciOiJoZWxsbyBoYWNrZXIsIHRoZXJlJ3Mgbm90aGluZyBmb3IgeW91IGhlcmUg8J-YhiJ9.1YDjmXsqLcgNyMSzT4kXl_kIni46_EuGX_xfqmC7e0Q","tusEndpoint":"https://origin.livepeer.com/api/asset/upload/tus?token=eyJhbGciOiJIUzI1NiJ9.eyJtc2ciOiJoZWxsbyBoYWNrZXIsIHRoZXJlJ3Mgbm90aGluZyBmb3IgeW91IGhlcmUg8J-YhiJ9.1YDjmXsqLcgNyMSzT4kXl_kIni46_EuGX_xfqmC7e0Q","asset":{"id":"09F8B46C-61A0-4254-9875-F71F4C605BC7","source":{"type":"url","url":"\u003cstring>","gatewayUrl":"\u003cstring>","encryption":"\u003cunknown>"},"name":"filename.mp4","type":"video","playbackId":"eaw4nk06ts2d0mzb","userId":"66E2161C-7670-4D05-B71D-DA2D6979556F","playbackUrl":"https://livepeercdn.com/asset/ea03f37e-f861-4cdd-b495-0e60b6d753ad/index.m3u8","downloadUrl":"https://livepeercdn.com/asset/eaw4nk06ts2d0mzb/video/download.mp4","playbackPolicy":{"type":"webhook","webhookId":"1bde4o2i6xycudoy","webhookContext":{"streamerId":"my-custom-id"},"refreshInterval":600,"allowedOrigins":["\u003cstring>"]},"creatorId":{"type":"unverified","value":"user123"},"profiles":[{"bitrate":3000000,"width":1280,"name":"720p","height":720,"quality":23,"fps":30,"fpsDen":1,"gop":2,"profile":"H264Baseline","encoder":"H.264"}],"storage":{"ipfs":{"spec":{},"nftMetadata":{"cid":"\u003cstring>","url":"\u003cstring>","gatewayUrl":"\u003cstring>"},"updatedAt":1587667174725},"status":{"phase":"ready","tasks":{"pending":"09F8B46C-61A0-4254-9875-F71F4C605BC7","last":"09F8B46C-61A0-4254-9875-F71F4C605BC7","failed":"09F8B46C-61A0-4254-9875-F71F4C605BC7"},"progress":0.5,"errorMessage":"Failed to update storage"}},"status":{"phase":"uploading","updatedAt":1587667174725,"progress":123,"errorMessage":"\u003cstring>"},"projectId":"aac12556-4d65-4d34-9fb6-d1f0985eb0a9","createdAt":1587667174725,"createdByTokenName":"\u003cstring>","size":84934509,"hash":[{"hash":"9b560b28b85378a5004117539196ab24e21bbd75b0e9eb1a8bc7c5fd80dc5b57","algorithm":"sha256"}],"videoSpec":{"format":"mp4","duration":23.8328,"bitrate":1000000,"tracks":[{"type":"video","codec":"aac","startTime":23.8238,"duration":23.8238,"bitrate":1000000,"width":1920,"height":1080,"pixelFormat":"yuv420p","fps":30,"channels":2,"sampleRate":44100,"bitDepth":16}]}},"task":{"id":"34d7618e-fd42-4798-acf5-19504616a11e"}}}},"exampleType":"generated"}},"exampleType":"generated"},"2ba28e70-b098-4922-a1c3-92a68113a6fa":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"errors":{"type":"array","minItems":1,"items":{"type":"string","example":["id not provided","Account not found"],"uniqueKey":"errors.items.[INDEX]","typeLabel":"string"},"uniqueKey":"errors","typeLabel":"string[]"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"errors":[["id not provided","Account not found"]]}}},"exampleType":"generated"}},"exampleType":"generated"}},"security":{"80f86897-cacd-4caa-954a-ee2d2b7eb93b":{"apiKey":{"type":"http","scheme":"bearer","bearerFormat":"JWT","scopes":[]}}},"servers":{"504cf1d2-978e-481b-8c1a-e507b8d686a1":{"url":"https://livepeer.studio/api"}},"processedSecurityOptions":[{"schemes":[{"scheme":{"type":"http","scheme":"bearer","bearerFormat":"JWT","scopes":[]},"schema":{"title":"Bearer Auth","type":"string","isRequired":true,"description":"Bearer authentication header of the form `Bearer \u003ctoken>`, where `\u003ctoken>` is your auth token.","format":"bearer","typeLabel":"string\u003cbearer>","deprecated":false},"schemeName":"apiKey","name":"Authorization"}],"title":"apiKey"}]},"originalFileLocation":"api/studio.yaml"},"subdomain":"na-36-changelog-go-livepeer-2026-05-18","siteName":"Livepeer Docs","title":"Upload an asset - Livepeer Docs","navMaps":{"firstHrefInVersion":{"v1":{"href":"/v1/api-reference/asset/upload","matchLevel":0},"v2":{"href":"/v2/home/mission-control","matchLevel":4}},"firstHrefInLanguage":{"en":{"href":"/v1/api-reference/asset/upload","matchLevel":0}}},"lastModified":"2026-05-18T00:17:39.084Z","originalFileLocation":"v1/api-reference/asset/upload.mdx","locale":"en"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"dark\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"To upload an asset, your first need to request for a direct upload URL and only then actually upload the contents of the asset. \\ \\ Once you created a upload link, you have 2 options, resumable or direct upload. For a more reliable experience, you should use resumable uploads which will work better for users with unreliable or slow network connections. If you want a simpler implementation though, you should just use a direct upload. ## Direct Upload For a direct upload, make a PUT request to the URL received in the url field of the response above, with the raw video file as the request body. response above: ## Resumable Upload Livepeer supports resumable uploads via Tus. This section provides a simple example of how to use tus-js-client to upload a video file. \\ \\ From the previous section, we generated a URL to upload a video file to Livepeer on POST /api/asset/request-upload. You should use the tusEndpoint field of the response to upload the video file and track the progress: `` # This assumes there is an input element of type=\u0026quot;file\u0026quot; with id fileInput in the HTML const input = document.getElementById(\u0026#x27;fileInput\u0026#x27;); const file = input.files[0]; const upload = new tus.Upload(file, { endpoint: tusEndpoint, // URL from tusEndpoint field in the /request-upload response metadata: { filename, filetype: \u0026#x27;video/mp4\u0026#x27;, }, uploadSize: file.size, onError(err) { console.error(\u0026#x27;Error uploading file:\u0026#x27;, err); }, onProgress(bytesUploaded, bytesTotal) { const percentage = ((bytesUploaded / bytesTotal) * 100).toFixed(2); console.log(\u0026#x27;Uploaded \u0026#x27; + percentage + \u0026#x27;%\u0026#x27;); }, onSuccess() { console.log(\u0026#x27;Upload finished:\u0026#x27;, upload.url); }, }); const previousUploads = await upload.findPreviousUploads(); if (previousUploads.length \u0026gt; 0) { upload.resumeFromPreviousUpload(previousUploads[0]); } upload.start(); `` \u0026gt; Note: If you are using tus from node.js, you need to add a custom URL storage to enable resuming from previous uploads. On the browser, this is enabled by default using local storage. In node.js, add urlStorage: new tus.FileUrlStorage(\u0026quot;path/to/tmp/file\u0026quot;), to the UploadFile object definition above.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Livepeer Docs\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003cmeta data-mint-head name=\"robots\" content=\"noindex, nofollow\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/na-36-changelog-go-livepeer-2026-05-18/S5wLxYBeeSeMN6wg/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/na-36-changelog-go-livepeer-2026-05-18/S5wLxYBeeSeMN6wg/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/na-36-changelog-go-livepeer-2026-05-18/S5wLxYBeeSeMN6wg/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/na-36-changelog-go-livepeer-2026-05-18/S5wLxYBeeSeMN6wg/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/na-36-changelog-go-livepeer-2026-05-18/S5wLxYBeeSeMN6wg/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/na-36-changelog-go-livepeer-2026-05-18/S5wLxYBeeSeMN6wg/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/na-36-changelog-go-livepeer-2026-05-18/S5wLxYBeeSeMN6wg/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/na-36-changelog-go-livepeer-2026-05-18/S5wLxYBeeSeMN6wg/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/na-36-changelog-go-livepeer-2026-05-18/S5wLxYBeeSeMN6wg/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Upload an asset - Livepeer Docs\">\u003cmeta data-mint-head property=\"og:description\" content=\"To upload an asset, your first need to request for a direct upload URL and only then actually upload the contents of the asset. \\ \\ Once you created a upload link, you have 2 options, resumable or direct upload. For a more reliable experience, you should use resumable uploads which will work better for users with unreliable or slow network connections. If you want a simpler implementation though, you should just use a direct upload. ## Direct Upload For a direct upload, make a PUT request to the URL received in the url field of the response above, with the raw video file as the request body. response above: ## Resumable Upload Livepeer supports resumable uploads via Tus. This section provides a simple example of how to use tus-js-client to upload a video file. \\ \\ From the previous section, we generated a URL to upload a video file to Livepeer on POST /api/asset/request-upload. You should use the tusEndpoint field of the response to upload the video file and track the progress: `` # This assumes there is an input element of type=\u0026quot;file\u0026quot; with id fileInput in the HTML const input = document.getElementById(\u0026#x27;fileInput\u0026#x27;); const file = input.files[0]; const upload = new tus.Upload(file, { endpoint: tusEndpoint, // URL from tusEndpoint field in the /request-upload response metadata: { filename, filetype: \u0026#x27;video/mp4\u0026#x27;, }, uploadSize: file.size, onError(err) { console.error(\u0026#x27;Error uploading file:\u0026#x27;, err); }, onProgress(bytesUploaded, bytesTotal) { const percentage = ((bytesUploaded / bytesTotal) * 100).toFixed(2); console.log(\u0026#x27;Uploaded \u0026#x27; + percentage + \u0026#x27;%\u0026#x27;); }, onSuccess() { console.log(\u0026#x27;Upload finished:\u0026#x27;, upload.url); }, }); const previousUploads = await upload.findPreviousUploads(); if (previousUploads.length \u0026gt; 0) { upload.resumeFromPreviousUpload(previousUploads[0]); } upload.start(); `` \u0026gt; Note: If you are using tus from node.js, you need to add a custom URL storage to enable resuming from previous uploads. On the browser, this is enabled by default using local storage. In node.js, add urlStorage: new tus.FileUrlStorage(\u0026quot;path/to/tmp/file\u0026quot;), to the UploadFile object definition above.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Livepeer Docs\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://na-36-changelog-go-livepeer-2026-05-18.mintlify.app/v1/api-reference/asset/upload\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://na-36-changelog-go-livepeer-2026-05-18.mintlify.site/_mintlify/api/og/v2?division=Asset\u0026amp;title=Upload+an+asset\u0026amp;description=To+upload+an+asset%2C+your+first+need+to+request+for+a+direct+upload+URL%0Aand+only+then+actually+upload+the+contents+of+the+asset.%0A%5C%0A%5C%0AOnce+you+created+a+upload+li\u0026amp;theme=ac5fd739770349c42e913e7c\u0026amp;signature=f67f34cd8c7e63bb9985e97df5092130b945a44f22381ac3c1b3108a9542e663\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Upload an asset - Livepeer Docs\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"To upload an asset, your first need to request for a direct upload URL and only then actually upload the contents of the asset. \\ \\ Once you created a upload link, you have 2 options, resumable or direct upload. For a more reliable experience, you should use resumable uploads which will work better for users with unreliable or slow network connections. If you want a simpler implementation though, you should just use a direct upload. ## Direct Upload For a direct upload, make a PUT request to the URL received in the url field of the response above, with the raw video file as the request body. response above: ## Resumable Upload Livepeer supports resumable uploads via Tus. This section provides a simple example of how to use tus-js-client to upload a video file. \\ \\ From the previous section, we generated a URL to upload a video file to Livepeer on POST /api/asset/request-upload. You should use the tusEndpoint field of the response to upload the video file and track the progress: `` # This assumes there is an input element of type=\u0026quot;file\u0026quot; with id fileInput in the HTML const input = document.getElementById(\u0026#x27;fileInput\u0026#x27;); const file = input.files[0]; const upload = new tus.Upload(file, { endpoint: tusEndpoint, // URL from tusEndpoint field in the /request-upload response metadata: { filename, filetype: \u0026#x27;video/mp4\u0026#x27;, }, uploadSize: file.size, onError(err) { console.error(\u0026#x27;Error uploading file:\u0026#x27;, err); }, onProgress(bytesUploaded, bytesTotal) { const percentage = ((bytesUploaded / bytesTotal) * 100).toFixed(2); console.log(\u0026#x27;Uploaded \u0026#x27; + percentage + \u0026#x27;%\u0026#x27;); }, onSuccess() { console.log(\u0026#x27;Upload finished:\u0026#x27;, upload.url); }, }); const previousUploads = await upload.findPreviousUploads(); if (previousUploads.length \u0026gt; 0) { upload.resumeFromPreviousUpload(previousUploads[0]); } upload.start(); `` \u0026gt; Note: If you are using tus from node.js, you need to add a custom URL storage to enable resuming from previous uploads. On the browser, this is enabled by default using local storage. In node.js, add urlStorage: new tus.FileUrlStorage(\u0026quot;path/to/tmp/file\u0026quot;), to the UploadFile object definition above.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://na-36-changelog-go-livepeer-2026-05-18.mintlify.site/_mintlify/api/og/v2?division=Asset\u0026amp;title=Upload+an+asset\u0026amp;description=To+upload+an+asset%2C+your+first+need+to+request+for+a+direct+upload+URL%0Aand+only+then+actually+upload+the+contents+of+the+asset.%0A%5C%0A%5C%0AOnce+you+created+a+upload+li\u0026amp;theme=ac5fd739770349c42e913e7c\u0026amp;signature=f67f34cd8c7e63bb9985e97df5092130b945a44f22381ac3c1b3108a9542e663\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/na-36-changelog-go-livepeer-2026-05-18/S5wLxYBeeSeMN6wg/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Livepeer Docs\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#3CB540\">\u003clink data-mint-head rel=\"canonical\" href=\"https://na-36-changelog-go-livepeer-2026-05-18.mintlify.app/v1/api-reference/asset/upload\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/v1/api-reference/asset/upload.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Livepeer Docs\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Livepeer Docs","nav":{"global":null,"versions":[{"version":"v1","default":true,"languages":[{"language":"en","dropdowns":[{"dropdown":"Developers","icon":"code","anchors":[{"anchor":"Documentation","icon":"code","pages":[{"title":"Documentation","href":"/v1/developers/introduction"}]},{"anchor":"API Reference","icon":"rectangle-terminal","groups":[{"group":"Overview","pages":[{"title":"Introduction","icon":"hand-wave","href":"/v1/api-reference/overview/introduction"},{"title":"Authentication","icon":"lock","href":"/v1/api-reference/overview/authentication"}]},{"group":"APIs","pages":[{"group":"Asset","icon":"video","pages":[{"description":"The Assets API is used to create, retrieve, update, delete assets object from pipeline.","title":null,"href":"/v1/api-reference/asset/overview"},{"title":"Upload an asset","openapi":"POST /asset/request-upload","href":"/v1/api-reference/asset/upload"},{"title":"Upload asset via URL","openapi":"POST /asset/upload/url","description":null,"href":"/v1/api-reference/asset/upload-via-url"},{"title":"Retrieve an asset","openapi":"GET /asset/{assetId}","href":"/v1/api-reference/asset/get"},{"title":"Update an asset","openapi":"PATCH /asset/{assetId}","href":"/v1/api-reference/asset/update"},{"title":"Delete an asset","openapi":"DELETE /asset/{assetId}","href":"/v1/api-reference/asset/delete"},{"title":"Retrieve assets","openapi":"GET /asset","href":"/v1/api-reference/asset/get-all"}]},{"group":"Livestream","icon":"camera","pages":[{"title":null,"href":"/v1/api-reference/stream/overview"},{"title":"Create a livestream","openapi":"POST /stream","href":"/v1/api-reference/stream/create"},{"title":"Retrieve a livestream","openapi":"GET /stream/{id}","href":"/v1/api-reference/stream/get"},{"title":"Update a livestream","openapi":"PATCH /stream/{id}","href":"/v1/api-reference/stream/update"},{"title":"Terminates a livestream","openapi":"DELETE /stream/{id}/terminate","href":"/v1/api-reference/stream/terminate"},{"title":"Add a multistream target","openapi":"POST /stream/{id}/create-multistream-target","href":"/v1/api-reference/stream/add-multistream-target"},{"title":"Remove a multistream target","openapi":"DELETE /stream/{id}/multistream/{targetId}","href":"/v1/api-reference/stream/delete-multistream-target"},{"title":"Delete a livestream","openapi":"DELETE /stream/{id}","href":"/v1/api-reference/stream/delete"},{"title":"Retrieve all livestreams","openapi":"GET /stream","href":"/v1/api-reference/stream/get-all"},{"title":"Create a clip","openapi":"POST /clip","href":"/v1/api-reference/stream/create-clip"},{"title":"Retrieve clips of a livestream","openapi":"GET /stream/{id}/clips","href":"/v1/api-reference/stream/get-clip"}]},{"group":"Generate","icon":"microchip-ai","pages":[{"title":null,"href":"/v1/api-reference/generate/overview"},{"title":"Audio To Text","openapi":"POST /api/beta/generate/audio-to-text","href":"/v1/api-reference/generate/audio-to-text"},{"title":"Text To Image","openapi":"POST /api/beta/generate/text-to-image","href":"/v1/api-reference/generate/text-to-image"},{"title":"Image To Image","openapi":"POST /api/beta/generate/image-to-image","href":"/v1/api-reference/generate/image-to-image"},{"title":"Image To Video","openapi":"POST /api/beta/generate/image-to-video","href":"/v1/api-reference/generate/image-to-video"},{"title":"LLM","href":"/v1/api-reference/generate/llm"},{"title":"Segment Anything 2","openapi":"POST /api/beta/generate/segment-anything-2","href":"/v1/api-reference/generate/segment-anything-2"},{"title":"Upscale","openapi":"POST /api/beta/generate/upscale","href":"/v1/api-reference/generate/upscale"}]},{"group":"Multistream target","icon":"arrows-split-up-and-left","pages":[{"title":null,"href":"/v1/api-reference/multistream/overview"},{"title":"Create a multistream","openapi":"POST /multistream/target","href":"/v1/api-reference/multistream/create"},{"title":"Retrieve a multistream","openapi":"GET /multistream/target/{id}","href":"/v1/api-reference/multistream/get"},{"title":"Update a multistream","openapi":"PATCH /multistream/target/{id}","href":"/v1/api-reference/multistream/update"},{"title":"Delete a multistream","openapi":"DELETE /multistream/target/{id}","href":"/v1/api-reference/multistream/delete"},{"title":"Retrieve all multistreams","openapi":"GET /multistream/target","href":"/v1/api-reference/multistream/get-all"}]},{"group":"Session","icon":"film","pages":[{"title":null,"href":"/v1/api-reference/session/overview"},{"title":"Retrieve a session","openapi":"GET /session/{id}","href":"/v1/api-reference/session/get"},{"title":"Retrieve all sessions","openapi":"GET /session","href":"/v1/api-reference/session/get-all"},{"title":"Retrieve recorded sessions","openapi":"GET /stream/{parentId}/sessions","href":"/v1/api-reference/session/get-recording"},{"title":"Retrieve clips of a session","openapi":"GET /session/{id}/clips","href":"/v1/api-reference/session/get-clip"}]},{"group":"Access control","icon":"lock","pages":[{"title":null,"href":"/v1/api-reference/signing-key/overview"},{"title":"Create a signing key","openapi":"POST /access-control/signing-key","href":"/v1/api-reference/signing-key/create"},{"title":"Retrieve a signing key","openapi":"GET /access-control/signing-key/{keyId}","href":"/v1/api-reference/signing-key/get"},{"title":"Update a signing key","openapi":"PATCH /access-control/signing-key/{keyId}","href":"/v1/api-reference/signing-key/update"},{"title":"Delete a signing key","openapi":"DELETE /access-control/signing-key/{keyId}","href":"/v1/api-reference/signing-key/delete"},{"title":"Retrieve signing keys","openapi":"GET /access-control/signing-key","href":"/v1/api-reference/signing-key/get-all"}]},{"group":"Webhook","icon":"bell","pages":[{"title":null,"href":"/v1/api-reference/webhook/overview"},{"title":"Create a webhook","openapi":"POST /webhook","href":"/v1/api-reference/webhook/create"},{"title":"Retrieve a webhook","openapi":"GET /webhook/{id}","href":"/v1/api-reference/webhook/get"},{"title":"Update a webhook","openapi":"PUT /webhook/{id}","href":"/v1/api-reference/webhook/update"},{"title":"Delete a webhook","openapi":"DELETE /webhook/{id}","href":"/v1/api-reference/webhook/delete"},{"title":"Retrieve all webhooks","openapi":"GET /webhook","href":"/v1/api-reference/webhook/get-all"}]},{"group":"Task","icon":"gear","pages":[{"title":null,"href":"/v1/api-reference/task/overview"},{"title":"Retrieve tasks","openapi":"GET /task","href":"/v1/api-reference/task/get-all"},{"title":"Retrieve a task","openapi":"GET /task/{taskId}","href":"/v1/api-reference/task/get"}]},{"group":"Playback","icon":"play","pages":[{"title":null,"href":"/v1/api-reference/playback/overview"},{"title":"Retrieve Playback Info","openapi":"GET /playback/{id}","href":"/v1/api-reference/playback/get"}]},{"group":"Transcode","icon":"photo-film","pages":[{"title":null,"href":"/v1/api-reference/transcode/overview"},{"title":"Transcode a video","openapi":"POST /transcode","href":"/v1/api-reference/transcode/create"}]},{"group":"Viewership","icon":"chart-bar","pages":[{"title":"Query realtime viewership","openapi":"GET /data/views/now","href":"/v1/api-reference/viewership/get-realtime-viewership"},{"title":"Query viewership metrics","openapi":"GET /data/views/query","href":"/v1/api-reference/viewership/get-viewership-metrics"},{"title":"Query usage metrics","openapi":"GET /data/usage/query","href":"/v1/api-reference/viewership/get-usage-metrics"},{"title":"Query public total views metrics","openapi":"GET /data/views/query/total/{playbackId}","href":"/v1/api-reference/viewership/get-public-total-views"},{"title":"Query creator viewership metrics","openapi":"GET /data/views/query/creator","href":"/v1/api-reference/viewership/get-creators-metrics"}]}]}]},{"anchor":"SDKs","icon":"brackets-curly","pages":[{"title":"SDKs","href":"/v1/sdks/introduction"}]},{"anchor":"AI Video (Beta)","icon":{"style":"regular","name":"microchip-ai"},"pages":[{"title":"AI Video (Beta)","href":"/v1/ai/introduction"}]},{"anchor":" ","icon":"horizontal-rule"},{"anchor":"Livepeer Studio ➚","icon":"clapperboard-play","href":"https://livepeer.studio"},{"anchor":"What's New ➚","icon":"rocket","href":"https://livepeer.canny.io/changelog"},{"anchor":"Community ➚","icon":{"style":"brands","name":"discord"},"href":"https://discord.gg/livepeer"}]},{"dropdown":"Delegators","icon":"coins","anchors":[{"anchor":"Documentation","icon":"code","pages":[{"title":"Documentation","href":"/v1/delegators/introduction"}]},{"anchor":"API Reference","icon":"rectangle-terminal","groups":[{"group":"Overview","pages":[{"title":"Introduction","icon":"hand-wave","href":"/v1/api-reference/overview/introduction"},{"title":"Authentication","icon":"lock","href":"/v1/api-reference/overview/authentication"}]},{"group":"APIs","pages":[{"group":"Asset","icon":"video","pages":[{"description":"The Assets API is used to create, retrieve, update, delete assets object from pipeline.","title":null,"href":"/v1/api-reference/asset/overview"},{"title":"Upload an asset","openapi":"POST /asset/request-upload","href":"/v1/api-reference/asset/upload"},{"title":"Upload asset via URL","openapi":"POST /asset/upload/url","description":null,"href":"/v1/api-reference/asset/upload-via-url"},{"title":"Retrieve an asset","openapi":"GET /asset/{assetId}","href":"/v1/api-reference/asset/get"},{"title":"Update an asset","openapi":"PATCH /asset/{assetId}","href":"/v1/api-reference/asset/update"},{"title":"Delete an asset","openapi":"DELETE /asset/{assetId}","href":"/v1/api-reference/asset/delete"},{"title":"Retrieve assets","openapi":"GET /asset","href":"/v1/api-reference/asset/get-all"}]},{"group":"Livestream","icon":"camera","pages":[{"title":null,"href":"/v1/api-reference/stream/overview"},{"title":"Create a livestream","openapi":"POST /stream","href":"/v1/api-reference/stream/create"},{"title":"Retrieve a livestream","openapi":"GET /stream/{id}","href":"/v1/api-reference/stream/get"},{"title":"Update a livestream","openapi":"PATCH /stream/{id}","href":"/v1/api-reference/stream/update"},{"title":"Terminates a livestream","openapi":"DELETE /stream/{id}/terminate","href":"/v1/api-reference/stream/terminate"},{"title":"Add a multistream target","openapi":"POST /stream/{id}/create-multistream-target","href":"/v1/api-reference/stream/add-multistream-target"},{"title":"Remove a multistream target","openapi":"DELETE /stream/{id}/multistream/{targetId}","href":"/v1/api-reference/stream/delete-multistream-target"},{"title":"Delete a livestream","openapi":"DELETE /stream/{id}","href":"/v1/api-reference/stream/delete"},{"title":"Retrieve all livestreams","openapi":"GET /stream","href":"/v1/api-reference/stream/get-all"},{"title":"Create a clip","openapi":"POST /clip","href":"/v1/api-reference/stream/create-clip"},{"title":"Retrieve clips of a livestream","openapi":"GET /stream/{id}/clips","href":"/v1/api-reference/stream/get-clip"}]},{"group":"Generate","icon":"microchip-ai","pages":[{"title":null,"href":"/v1/api-reference/generate/overview"},{"title":"Audio To Text","openapi":"POST /api/beta/generate/audio-to-text","href":"/v1/api-reference/generate/audio-to-text"},{"title":"Text To Image","openapi":"POST /api/beta/generate/text-to-image","href":"/v1/api-reference/generate/text-to-image"},{"title":"Image To Image","openapi":"POST /api/beta/generate/image-to-image","href":"/v1/api-reference/generate/image-to-image"},{"title":"Image To Video","openapi":"POST /api/beta/generate/image-to-video","href":"/v1/api-reference/generate/image-to-video"},{"title":"LLM","href":"/v1/api-reference/generate/llm"},{"title":"Segment Anything 2","openapi":"POST /api/beta/generate/segment-anything-2","href":"/v1/api-reference/generate/segment-anything-2"},{"title":"Upscale","openapi":"POST /api/beta/generate/upscale","href":"/v1/api-reference/generate/upscale"}]},{"group":"Multistream target","icon":"arrows-split-up-and-left","pages":[{"title":null,"href":"/v1/api-reference/multistream/overview"},{"title":"Create a multistream","openapi":"POST /multistream/target","href":"/v1/api-reference/multistream/create"},{"title":"Retrieve a multistream","openapi":"GET /multistream/target/{id}","href":"/v1/api-reference/multistream/get"},{"title":"Update a multistream","openapi":"PATCH /multistream/target/{id}","href":"/v1/api-reference/multistream/update"},{"title":"Delete a multistream","openapi":"DELETE /multistream/target/{id}","href":"/v1/api-reference/multistream/delete"},{"title":"Retrieve all multistreams","openapi":"GET /multistream/target","href":"/v1/api-reference/multistream/get-all"}]},{"group":"Session","icon":"film","pages":[{"title":null,"href":"/v1/api-reference/session/overview"},{"title":"Retrieve a session","openapi":"GET /session/{id}","href":"/v1/api-reference/session/get"},{"title":"Retrieve all sessions","openapi":"GET /session","href":"/v1/api-reference/session/get-all"},{"title":"Retrieve recorded sessions","openapi":"GET /stream/{parentId}/sessions","href":"/v1/api-reference/session/get-recording"},{"title":"Retrieve clips of a session","openapi":"GET /session/{id}/clips","href":"/v1/api-reference/session/get-clip"}]},{"group":"Access control","icon":"lock","pages":[{"title":null,"href":"/v1/api-reference/signing-key/overview"},{"title":"Create a signing key","openapi":"POST /access-control/signing-key","href":"/v1/api-reference/signing-key/create"},{"title":"Retrieve a signing key","openapi":"GET /access-control/signing-key/{keyId}","href":"/v1/api-reference/signing-key/get"},{"title":"Update a signing key","openapi":"PATCH /access-control/signing-key/{keyId}","href":"/v1/api-reference/signing-key/update"},{"title":"Delete a signing key","openapi":"DELETE /access-control/signing-key/{keyId}","href":"/v1/api-reference/signing-key/delete"},{"title":"Retrieve signing keys","openapi":"GET /access-control/signing-key","href":"/v1/api-reference/signing-key/get-all"}]},{"group":"Webhook","icon":"bell","pages":[{"title":null,"href":"/v1/api-reference/webhook/overview"},{"title":"Create a webhook","openapi":"POST /webhook","href":"/v1/api-reference/webhook/create"},{"title":"Retrieve a webhook","openapi":"GET /webhook/{id}","href":"/v1/api-reference/webhook/get"},{"title":"Update a webhook","openapi":"PUT /webhook/{id}","href":"/v1/api-reference/webhook/update"},{"title":"Delete a webhook","openapi":"DELETE /webhook/{id}","href":"/v1/api-reference/webhook/delete"},{"title":"Retrieve all webhooks","openapi":"GET /webhook","href":"/v1/api-reference/webhook/get-all"}]},{"group":"Task","icon":"gear","pages":[{"title":null,"href":"/v1/api-reference/task/overview"},{"title":"Retrieve tasks","openapi":"GET /task","href":"/v1/api-reference/task/get-all"},{"title":"Retrieve a task","openapi":"GET /task/{taskId}","href":"/v1/api-reference/task/get"}]},{"group":"Playback","icon":"play","pages":[{"title":null,"href":"/v1/api-reference/playback/overview"},{"title":"Retrieve Playback Info","openapi":"GET /playback/{id}","href":"/v1/api-reference/playback/get"}]},{"group":"Transcode","icon":"photo-film","pages":[{"title":null,"href":"/v1/api-reference/transcode/overview"},{"title":"Transcode a video","openapi":"POST /transcode","href":"/v1/api-reference/transcode/create"}]},{"group":"Viewership","icon":"chart-bar","pages":[{"title":"Query realtime viewership","openapi":"GET /data/views/now","href":"/v1/api-reference/viewership/get-realtime-viewership"},{"title":"Query viewership metrics","openapi":"GET /data/views/query","href":"/v1/api-reference/viewership/get-viewership-metrics"},{"title":"Query usage metrics","openapi":"GET /data/usage/query","href":"/v1/api-reference/viewership/get-usage-metrics"},{"title":"Query public total views metrics","openapi":"GET /data/views/query/total/{playbackId}","href":"/v1/api-reference/viewership/get-public-total-views"},{"title":"Query creator viewership metrics","openapi":"GET /data/views/query/creator","href":"/v1/api-reference/viewership/get-creators-metrics"}]}]}]},{"anchor":"SDKs","icon":"brackets-curly","pages":[{"title":"SDKs","href":"/v1/sdks/introduction"}]},{"anchor":"AI Video (Beta)","icon":{"style":"regular","name":"microchip-ai"},"pages":[{"title":"AI Video (Beta)","href":"/v1/ai/introduction"}]},{"anchor":" ","icon":"horizontal-rule"},{"anchor":"Livepeer Studio ➚","icon":"clapperboard-play","href":"https://livepeer.studio"},{"anchor":"What's New ➚","icon":"rocket","href":"https://livepeer.canny.io/changelog"},{"anchor":"Community ➚","icon":{"style":"brands","name":"discord"},"href":"https://discord.gg/livepeer"}]},{"dropdown":"Orchestrators","icon":"microchip","anchors":[{"anchor":"Documentation","icon":"code","pages":[{"title":"Documentation","href":"/v1/orchestrators/introduction"}]},{"anchor":"API Reference","icon":"rectangle-terminal","groups":[{"group":"Overview","pages":[{"title":"Introduction","icon":"hand-wave","href":"/v1/api-reference/overview/introduction"},{"title":"Authentication","icon":"lock","href":"/v1/api-reference/overview/authentication"}]},{"group":"APIs","pages":[{"group":"Asset","icon":"video","pages":[{"description":"The Assets API is used to create, retrieve, update, delete assets object from pipeline.","title":null,"href":"/v1/api-reference/asset/overview"},{"title":"Upload an asset","openapi":"POST /asset/request-upload","href":"/v1/api-reference/asset/upload"},{"title":"Upload asset via URL","openapi":"POST /asset/upload/url","description":null,"href":"/v1/api-reference/asset/upload-via-url"},{"title":"Retrieve an asset","openapi":"GET /asset/{assetId}","href":"/v1/api-reference/asset/get"},{"title":"Update an asset","openapi":"PATCH /asset/{assetId}","href":"/v1/api-reference/asset/update"},{"title":"Delete an asset","openapi":"DELETE /asset/{assetId}","href":"/v1/api-reference/asset/delete"},{"title":"Retrieve assets","openapi":"GET /asset","href":"/v1/api-reference/asset/get-all"}]},{"group":"Livestream","icon":"camera","pages":[{"title":null,"href":"/v1/api-reference/stream/overview"},{"title":"Create a livestream","openapi":"POST /stream","href":"/v1/api-reference/stream/create"},{"title":"Retrieve a livestream","openapi":"GET /stream/{id}","href":"/v1/api-reference/stream/get"},{"title":"Update a livestream","openapi":"PATCH /stream/{id}","href":"/v1/api-reference/stream/update"},{"title":"Terminates a livestream","openapi":"DELETE /stream/{id}/terminate","href":"/v1/api-reference/stream/terminate"},{"title":"Add a multistream target","openapi":"POST /stream/{id}/create-multistream-target","href":"/v1/api-reference/stream/add-multistream-target"},{"title":"Remove a multistream target","openapi":"DELETE /stream/{id}/multistream/{targetId}","href":"/v1/api-reference/stream/delete-multistream-target"},{"title":"Delete a livestream","openapi":"DELETE /stream/{id}","href":"/v1/api-reference/stream/delete"},{"title":"Retrieve all livestreams","openapi":"GET /stream","href":"/v1/api-reference/stream/get-all"},{"title":"Create a clip","openapi":"POST /clip","href":"/v1/api-reference/stream/create-clip"},{"title":"Retrieve clips of a livestream","openapi":"GET /stream/{id}/clips","href":"/v1/api-reference/stream/get-clip"}]},{"group":"Generate","icon":"microchip-ai","pages":[{"title":null,"href":"/v1/api-reference/generate/overview"},{"title":"Audio To Text","openapi":"POST /api/beta/generate/audio-to-text","href":"/v1/api-reference/generate/audio-to-text"},{"title":"Text To Image","openapi":"POST /api/beta/generate/text-to-image","href":"/v1/api-reference/generate/text-to-image"},{"title":"Image To Image","openapi":"POST /api/beta/generate/image-to-image","href":"/v1/api-reference/generate/image-to-image"},{"title":"Image To Video","openapi":"POST /api/beta/generate/image-to-video","href":"/v1/api-reference/generate/image-to-video"},{"title":"LLM","href":"/v1/api-reference/generate/llm"},{"title":"Segment Anything 2","openapi":"POST /api/beta/generate/segment-anything-2","href":"/v1/api-reference/generate/segment-anything-2"},{"title":"Upscale","openapi":"POST /api/beta/generate/upscale","href":"/v1/api-reference/generate/upscale"}]},{"group":"Multistream target","icon":"arrows-split-up-and-left","pages":[{"title":null,"href":"/v1/api-reference/multistream/overview"},{"title":"Create a multistream","openapi":"POST /multistream/target","href":"/v1/api-reference/multistream/create"},{"title":"Retrieve a multistream","openapi":"GET /multistream/target/{id}","href":"/v1/api-reference/multistream/get"},{"title":"Update a multistream","openapi":"PATCH /multistream/target/{id}","href":"/v1/api-reference/multistream/update"},{"title":"Delete a multistream","openapi":"DELETE /multistream/target/{id}","href":"/v1/api-reference/multistream/delete"},{"title":"Retrieve all multistreams","openapi":"GET /multistream/target","href":"/v1/api-reference/multistream/get-all"}]},{"group":"Session","icon":"film","pages":[{"title":null,"href":"/v1/api-reference/session/overview"},{"title":"Retrieve a session","openapi":"GET /session/{id}","href":"/v1/api-reference/session/get"},{"title":"Retrieve all sessions","openapi":"GET /session","href":"/v1/api-reference/session/get-all"},{"title":"Retrieve recorded sessions","openapi":"GET /stream/{parentId}/sessions","href":"/v1/api-reference/session/get-recording"},{"title":"Retrieve clips of a session","openapi":"GET /session/{id}/clips","href":"/v1/api-reference/session/get-clip"}]},{"group":"Access control","icon":"lock","pages":[{"title":null,"href":"/v1/api-reference/signing-key/overview"},{"title":"Create a signing key","openapi":"POST /access-control/signing-key","href":"/v1/api-reference/signing-key/create"},{"title":"Retrieve a signing key","openapi":"GET /access-control/signing-key/{keyId}","href":"/v1/api-reference/signing-key/get"},{"title":"Update a signing key","openapi":"PATCH /access-control/signing-key/{keyId}","href":"/v1/api-reference/signing-key/update"},{"title":"Delete a signing key","openapi":"DELETE /access-control/signing-key/{keyId}","href":"/v1/api-reference/signing-key/delete"},{"title":"Retrieve signing keys","openapi":"GET /access-control/signing-key","href":"/v1/api-reference/signing-key/get-all"}]},{"group":"Webhook","icon":"bell","pages":[{"title":null,"href":"/v1/api-reference/webhook/overview"},{"title":"Create a webhook","openapi":"POST /webhook","href":"/v1/api-reference/webhook/create"},{"title":"Retrieve a webhook","openapi":"GET /webhook/{id}","href":"/v1/api-reference/webhook/get"},{"title":"Update a webhook","openapi":"PUT /webhook/{id}","href":"/v1/api-reference/webhook/update"},{"title":"Delete a webhook","openapi":"DELETE /webhook/{id}","href":"/v1/api-reference/webhook/delete"},{"title":"Retrieve all webhooks","openapi":"GET /webhook","href":"/v1/api-reference/webhook/get-all"}]},{"group":"Task","icon":"gear","pages":[{"title":null,"href":"/v1/api-reference/task/overview"},{"title":"Retrieve tasks","openapi":"GET /task","href":"/v1/api-reference/task/get-all"},{"title":"Retrieve a task","openapi":"GET /task/{taskId}","href":"/v1/api-reference/task/get"}]},{"group":"Playback","icon":"play","pages":[{"title":null,"href":"/v1/api-reference/playback/overview"},{"title":"Retrieve Playback Info","openapi":"GET /playback/{id}","href":"/v1/api-reference/playback/get"}]},{"group":"Transcode","icon":"photo-film","pages":[{"title":null,"href":"/v1/api-reference/transcode/overview"},{"title":"Transcode a video","openapi":"POST /transcode","href":"/v1/api-reference/transcode/create"}]},{"group":"Viewership","icon":"chart-bar","pages":[{"title":"Query realtime viewership","openapi":"GET /data/views/now","href":"/v1/api-reference/viewership/get-realtime-viewership"},{"title":"Query viewership metrics","openapi":"GET /data/views/query","href":"/v1/api-reference/viewership/get-viewership-metrics"},{"title":"Query usage metrics","openapi":"GET /data/usage/query","href":"/v1/api-reference/viewership/get-usage-metrics"},{"title":"Query public total views metrics","openapi":"GET /data/views/query/total/{playbackId}","href":"/v1/api-reference/viewership/get-public-total-views"},{"title":"Query creator viewership metrics","openapi":"GET /data/views/query/creator","href":"/v1/api-reference/viewership/get-creators-metrics"}]}]}]},{"anchor":"SDKs","icon":"brackets-curly","pages":[{"title":"SDKs","href":"/v1/sdks/introduction"}]},{"anchor":"AI Video (Beta)","icon":{"style":"regular","name":"microchip-ai"},"pages":[{"title":"AI Video (Beta)","href":"/v1/ai/introduction"}]},{"anchor":" ","icon":"horizontal-rule"},{"anchor":"Livepeer Studio ➚","icon":"clapperboard-play","href":"https://livepeer.studio"},{"anchor":"What's New ➚","icon":"rocket","href":"https://livepeer.canny.io/changelog"},{"anchor":"Community ➚","icon":{"style":"brands","name":"discord"},"href":"https://discord.gg/livepeer"}]},{"dropdown":"Gateways","icon":"torii-gate","anchors":[{"anchor":"Documentation","icon":"code","pages":[{"title":"Documentation","href":"/v1/gateways/introduction"}]},{"anchor":"API Reference","icon":"rectangle-terminal","groups":[{"group":"Overview","pages":[{"title":"Introduction","icon":"hand-wave","href":"/v1/api-reference/overview/introduction"},{"title":"Authentication","icon":"lock","href":"/v1/api-reference/overview/authentication"}]},{"group":"APIs","pages":[{"group":"Asset","icon":"video","pages":[{"description":"The Assets API is used to create, retrieve, update, delete assets object from pipeline.","title":null,"href":"/v1/api-reference/asset/overview"},{"title":"Upload an asset","openapi":"POST /asset/request-upload","href":"/v1/api-reference/asset/upload"},{"title":"Upload asset via URL","openapi":"POST /asset/upload/url","description":null,"href":"/v1/api-reference/asset/upload-via-url"},{"title":"Retrieve an asset","openapi":"GET /asset/{assetId}","href":"/v1/api-reference/asset/get"},{"title":"Update an asset","openapi":"PATCH /asset/{assetId}","href":"/v1/api-reference/asset/update"},{"title":"Delete an asset","openapi":"DELETE /asset/{assetId}","href":"/v1/api-reference/asset/delete"},{"title":"Retrieve assets","openapi":"GET /asset","href":"/v1/api-reference/asset/get-all"}]},{"group":"Livestream","icon":"camera","pages":[{"title":null,"href":"/v1/api-reference/stream/overview"},{"title":"Create a livestream","openapi":"POST /stream","href":"/v1/api-reference/stream/create"},{"title":"Retrieve a livestream","openapi":"GET /stream/{id}","href":"/v1/api-reference/stream/get"},{"title":"Update a livestream","openapi":"PATCH /stream/{id}","href":"/v1/api-reference/stream/update"},{"title":"Terminates a livestream","openapi":"DELETE /stream/{id}/terminate","href":"/v1/api-reference/stream/terminate"},{"title":"Add a multistream target","openapi":"POST /stream/{id}/create-multistream-target","href":"/v1/api-reference/stream/add-multistream-target"},{"title":"Remove a multistream target","openapi":"DELETE /stream/{id}/multistream/{targetId}","href":"/v1/api-reference/stream/delete-multistream-target"},{"title":"Delete a livestream","openapi":"DELETE /stream/{id}","href":"/v1/api-reference/stream/delete"},{"title":"Retrieve all livestreams","openapi":"GET /stream","href":"/v1/api-reference/stream/get-all"},{"title":"Create a clip","openapi":"POST /clip","href":"/v1/api-reference/stream/create-clip"},{"title":"Retrieve clips of a livestream","openapi":"GET /stream/{id}/clips","href":"/v1/api-reference/stream/get-clip"}]},{"group":"Generate","icon":"microchip-ai","pages":[{"title":null,"href":"/v1/api-reference/generate/overview"},{"title":"Audio To Text","openapi":"POST /api/beta/generate/audio-to-text","href":"/v1/api-reference/generate/audio-to-text"},{"title":"Text To Image","openapi":"POST /api/beta/generate/text-to-image","href":"/v1/api-reference/generate/text-to-image"},{"title":"Image To Image","openapi":"POST /api/beta/generate/image-to-image","href":"/v1/api-reference/generate/image-to-image"},{"title":"Image To Video","openapi":"POST /api/beta/generate/image-to-video","href":"/v1/api-reference/generate/image-to-video"},{"title":"LLM","href":"/v1/api-reference/generate/llm"},{"title":"Segment Anything 2","openapi":"POST /api/beta/generate/segment-anything-2","href":"/v1/api-reference/generate/segment-anything-2"},{"title":"Upscale","openapi":"POST /api/beta/generate/upscale","href":"/v1/api-reference/generate/upscale"}]},{"group":"Multistream target","icon":"arrows-split-up-and-left","pages":[{"title":null,"href":"/v1/api-reference/multistream/overview"},{"title":"Create a multistream","openapi":"POST /multistream/target","href":"/v1/api-reference/multistream/create"},{"title":"Retrieve a multistream","openapi":"GET /multistream/target/{id}","href":"/v1/api-reference/multistream/get"},{"title":"Update a multistream","openapi":"PATCH /multistream/target/{id}","href":"/v1/api-reference/multistream/update"},{"title":"Delete a multistream","openapi":"DELETE /multistream/target/{id}","href":"/v1/api-reference/multistream/delete"},{"title":"Retrieve all multistreams","openapi":"GET /multistream/target","href":"/v1/api-reference/multistream/get-all"}]},{"group":"Session","icon":"film","pages":[{"title":null,"href":"/v1/api-reference/session/overview"},{"title":"Retrieve a session","openapi":"GET /session/{id}","href":"/v1/api-reference/session/get"},{"title":"Retrieve all sessions","openapi":"GET /session","href":"/v1/api-reference/session/get-all"},{"title":"Retrieve recorded sessions","openapi":"GET /stream/{parentId}/sessions","href":"/v1/api-reference/session/get-recording"},{"title":"Retrieve clips of a session","openapi":"GET /session/{id}/clips","href":"/v1/api-reference/session/get-clip"}]},{"group":"Access control","icon":"lock","pages":[{"title":null,"href":"/v1/api-reference/signing-key/overview"},{"title":"Create a signing key","openapi":"POST /access-control/signing-key","href":"/v1/api-reference/signing-key/create"},{"title":"Retrieve a signing key","openapi":"GET /access-control/signing-key/{keyId}","href":"/v1/api-reference/signing-key/get"},{"title":"Update a signing key","openapi":"PATCH /access-control/signing-key/{keyId}","href":"/v1/api-reference/signing-key/update"},{"title":"Delete a signing key","openapi":"DELETE /access-control/signing-key/{keyId}","href":"/v1/api-reference/signing-key/delete"},{"title":"Retrieve signing keys","openapi":"GET /access-control/signing-key","href":"/v1/api-reference/signing-key/get-all"}]},{"group":"Webhook","icon":"bell","pages":[{"title":null,"href":"/v1/api-reference/webhook/overview"},{"title":"Create a webhook","openapi":"POST /webhook","href":"/v1/api-reference/webhook/create"},{"title":"Retrieve a webhook","openapi":"GET /webhook/{id}","href":"/v1/api-reference/webhook/get"},{"title":"Update a webhook","openapi":"PUT /webhook/{id}","href":"/v1/api-reference/webhook/update"},{"title":"Delete a webhook","openapi":"DELETE /webhook/{id}","href":"/v1/api-reference/webhook/delete"},{"title":"Retrieve all webhooks","openapi":"GET /webhook","href":"/v1/api-reference/webhook/get-all"}]},{"group":"Task","icon":"gear","pages":[{"title":null,"href":"/v1/api-reference/task/overview"},{"title":"Retrieve tasks","openapi":"GET /task","href":"/v1/api-reference/task/get-all"},{"title":"Retrieve a task","openapi":"GET /task/{taskId}","href":"/v1/api-reference/task/get"}]},{"group":"Playback","icon":"play","pages":[{"title":null,"href":"/v1/api-reference/playback/overview"},{"title":"Retrieve Playback Info","openapi":"GET /playback/{id}","href":"/v1/api-reference/playback/get"}]},{"group":"Transcode","icon":"photo-film","pages":[{"title":null,"href":"/v1/api-reference/transcode/overview"},{"title":"Transcode a video","openapi":"POST /transcode","href":"/v1/api-reference/transcode/create"}]},{"group":"Viewership","icon":"chart-bar","pages":[{"title":"Query realtime viewership","openapi":"GET /data/views/now","href":"/v1/api-reference/viewership/get-realtime-viewership"},{"title":"Query viewership metrics","openapi":"GET /data/views/query","href":"/v1/api-reference/viewership/get-viewership-metrics"},{"title":"Query usage metrics","openapi":"GET /data/usage/query","href":"/v1/api-reference/viewership/get-usage-metrics"},{"title":"Query public total views metrics","openapi":"GET /data/views/query/total/{playbackId}","href":"/v1/api-reference/viewership/get-public-total-views"},{"title":"Query creator viewership metrics","openapi":"GET /data/views/query/creator","href":"/v1/api-reference/viewership/get-creators-metrics"}]}]}]},{"anchor":"SDKs","icon":"brackets-curly","pages":[{"title":"SDKs","href":"/v1/sdks/introduction"}]},{"anchor":"AI Video (Beta)","icon":{"style":"regular","name":"microchip-ai"},"pages":[{"title":"AI Video (Beta)","href":"/v1/ai/introduction"}]},{"anchor":" ","icon":"horizontal-rule"},{"anchor":"Livepeer Studio ➚","icon":"clapperboard-play","href":"https://livepeer.studio"},{"anchor":"What's New ➚","icon":"rocket","href":"https://livepeer.canny.io/changelog"},{"anchor":"Community ➚","icon":{"style":"brands","name":"discord"},"href":"https://discord.gg/livepeer"}]}]}]},{"version":"v2","default":false,"pages":[{"title":"v2","href":"/v2/home/mission-control"}]}]},"basePath":"","title":"Upload an asset - Livepeer Docs","buildId":"dpl_8LJbrAiZvr1K98WQNZXCyY5AvT34","deploymentId":"dpl_8LJbrAiZvr1K98WQNZXCyY5AvT34","dynamics":["c2aa737661","6d89261695","2b790eda92","b0f84f53ff","a9bb46feb3"],"chunks":["OpenApiReferenceProvider-i2a3QZ8E.js","utils-ChLwp8m0.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-DRktVTDc.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema-CA2pEs4T.js","snippetPresets-ClQ6XrKD.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","preview-widget-Cr_yo8pa.js","ApiExamples-Ct_Lv36y.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-Cn2PYw9e.js","shallow-rkyymjXQ.js","getApiPlaygroundDisplay-BB9vkXtE.js","CodeSnippet-Bm5RU7m1.js","CodeSnippets-BgU9Deuz.js","Page-BUDYNlhG.js","getPastedJson-BD-6NNum.js","icon-8Z6tud2e.js","MethodPill-Tuzr4g3V.js","DuplicateIcon-0ceWFYhN.js","createIcon-FBXow_ST.js","DynamicMarkdown-CD8713Yy.js","SectionHeading-7zgzQbH-.js","axios-vUo_bRtp.js","Markdown-D7Ofw1oz.js","clsx-eKJ4rcii.js","lib-DuNMoZ05.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-CwjSCXIK.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink-9EK5IAXV.js"]}