Videos API

Warning

Deprecation Notice
The Marketing Version 202311 (Marketing November 2023) and earlier versions (excluding 202306 and 202307) have been sunset. Additionally, the unversioned APIs will be sunset soon. We recommend that you migrate to the versioned APIs as well as migrate to the new Content and Community Management APIs to avoid disruptions. See the Migration page for more details. If you haven’t yet migrated and have questions, submit a request on the LinkedIn Developer Support Portal.

The Videos API is a new offering from LinkedIn that features the ability to upload a captions file as well as thumbnail video functionality.

The request and response schema is simplified for uploading videos to the LinkedIn platform. These media uploads can then be referenced in a User-Generated Content (UGC) Post or various sponsored content and campaign ads. LinkedIn partners can create and upload rich and engaging personal or organization content for surfacing on select feeds within the LinkedIn ecosystem.

Note

The Videos API replaces the Assets API. See Migration Guide for more details.

Permissions

Permission Description
w_organization_social Post, comment, and like posts on behalf of an organization. Restricted to the company admin, DSC poster, or content admin
w_member_social Post, comment, and like posts on behalf of authenticated member
rw_ads Create ads and creatives for a sponsored account
r_ads Read an authenticated member's Ad Account. Restricted to Ad Accounts in which the authenticated member has one of the following Ad Account roles.
  • ACCOUNT_BILLING_ADMIN
  • ACCOUNT_MANAGER
  • CAMPAIGN_MANAGER
  • CREATIVE_MANAGER
  • VIEWER
  • Additionally, the following permission checks are performed when uploading a video:

    • For videos with company URN owners, the caller needs to have have ADMIN or DSC permissions for the company page
    • For videos with member URN owners, the caller needs to match the video owner

    Invalid permissions results in the following API response:

    {
        "message": "Accessing this video resource is forbidden. Please check your permissions for this resource",
        "status": 403
    }
    

    Video File Size Specifications

    The following are the high-level specifications for non-connected-television video file sizing. For connected television video specification, refer to Connected Television Video Ads Specifications for more information.

    • Length: Three seconds to 30 minutes
    • File size: Between 75kb and 500MB
    • File format: MP4

    Refer to Video Ads Advertising Specifications for more information.

    Schema

    Note

    All APIs require the request headers LinkedIn-Version: {Version in YYYYMM format} and X-Restli-Protocol-Version: 2.0.0. Refer to the Protocol Versions page to learn more about Rest.li Protocol 2.0.0.

    Field Name Type Description Required
    aspectRatioHeight float Media aspect ratio height. For media with a 16:9 ratio, it is a 9. There might be decimal values for high density displays for a greater degree of precision. aspectRatioHeight and aspectRatioWidth would either both be present or both be null. It is empty if the media asset isn't available, failed processing, or there is another issue. No
    aspectRatioWidth float Aspect ratio width of the media. For media with a 16:9 ratio, it is 16. There might be decimal values for high density displays for a greater degree of precision. aspectRatioHeight and aspectRatioWidth would either both be present or both be null. It is empty if the media asset isn't available, failed processing, or there is another issue. No
    captions URL File identifier to retrieve the caption file. Present if initializeUploadRequest.uploadCaptions was true and a caption was successfully uploaded and processed. No
    downloadUrl URL Public URL to download/view the media asset. It will be empty if the media asset isn't available, failed processing, or there is another issue. No
    downloadUrlExpiresAt Time optional Milliseconds since the epoch (1970-01-01 00:00 UTC) when the identifier expires. If it is not present, it may never expire. Unless the use case has a security and legal exception, all URLs have an expiration time. If they don't, they can still expire because URLs are signed, and the sign keys may be rotated. If a non expiring URL was signed with a key that gets invalidated, it expires. No
    duration long The length of the video in milliseconds. It is empty if the media asset isn't available, failed processing, or there is another issue. No
    id Video URN The unique video URN. This field is read only. No
    mediaLibraryMetadata MediaLibraryMetadata Metadata for assets stored in the media library. Metadata is tied to a specific account which must be specified in queries / requests. No
    mediaLibraryMetadata.associatedAccount URN The associated account that owns the media library (e.g. urn:li:sponsoredAccount:123). The media library specific metadata fields will be filled with the data from this account's library. Yes
    mediaLibraryMetadata.assetName String The name of the asset in the associatedAccount's library. Yes
    mediaLibraryMetadata.mediaLibraryStatus MediaLibraryStatus Status of the asset's entry in the media library. Defaults to "ACTIVE" on creation.
  • ACTIVE Owner considers asset available and usable.
  • ARCHIVED Owner considers asset archived.
  • No
    status String
  • PROCESSING Asset is processing to generate missing artifacts.
  • PROCESSING_FAILED Processing failed due to client error such as file size too large, unsupported file format, internal error (e.g., performance issue, database error, network failure), or other issue.
  • AVAILABLE All of the recipe's required artifacts are ready. The asset is available to be served.
  • WAITING_UPLOAD Waiting for client to upload source file or uploading process to be completed.
  • No
    processingFailureReason String Reason for video processing failure. This field will only be present if video.status is PROCESSING_FAILED. No
    thumbnail URL optional File identifier to retrieve the thumbnail file. Present in one of the following cases: a) initializeUploadRequest.uploadThumbnail was true and a thumbnail was successfully uploaded and processed. b) initializeUploadRequest.uploadThumbnail was false but a system generated default thumbnail is present. No
    initializeUploadRequest.fileSizeBytes long File size in bytes. This determines how many parts the video upload will be broken into. Maximum allowed Videos size is 5GB. Yes
    initializeUploadRequest.mediaLibraryMetadata MediaLibraryMetadata Metadata for assets stored in the media library. Metadata is tied to a specific account which must be specified in queries / requests. When this field is present, the uploaded asset will also be registered in the account's media library. No
    initializeUploadRequest.owner URN URN of the entity that owns this asset. Can be a person(urn:li:person:123), or organization(urn:li:organization:123) URN Yes
    initializeUploadRequest.uploadCaptions boolean default=false TBD No
    initializeUploadRequest.uploadThumbnail boolean default=false Whether you want to upload a thumbnail along with video. If the partner does not upload a thumbnail, a system generated thumbnail may be added to the video. If this field is set to true for an Ads Video, the processing of thumbnail must succeed for video to be servable. A feed video can serve even with failed captions. The value defaults to false as a thumbnail is optional for all videos. No
    initializeVideoUploadResponse.captionsUploadUrl URL optional URL for uploading captions. Present only if initializeUploadRequest.uploadCaptions was true. No
    initializeVideoUploadResponse.thumbnailUploadUrl URL optional URL for uploading thumbnail. This value is present only if initializeUploadRequest.uploadThumbnail is true. No
    initializeVideoUploadResponse.uploadInstructions VideoPartUploadInstruction array Instructions for parts of multi-part video upload. Each entry in the array represents one part of the multi-part upload. It is never be empty. Parts are sorted by non-overlapping byte-range. The first entry is byte range: 0 - 4194303, the next one with 4194304 - 8388607 and so on.
  • firstByte long First byte (inclusive) in the byte range to upload in this part.
  • lastByte long The last byte (inclusive) in the range to upload in this part.
  • uploadUrl URL HTTP upload URL that you will use to make HTTP PUT request.
  • No
    initializeVideoUploadResponse.uploadToken String Identifier for an upload session. You need to pass this in the finalize step to link video parts together. No
    initializeVideoUploadResponse.uploadUrlsExpireAt Time Milliseconds since the epoch (1970-01-01 00:00 UTC) when the upload URLs expire. All upload URLs expire at the same time. Trying to upload to expired URLs would throw a 401 error. Typically URLs expire 30 days from the time an upload is initialized. No
    initializeVideoUploadResponse.video Video URN Video URN that the uploaded Video is associated with
    uploadToken String upload token No
    finalizeUploadRequest.uploadToken String Identifier for an upload session. This is from the initialize video upload step. Partners should not try to interpret it.
    finalizeUploadRequest.uploadedPartIds String array IDs for each uploaded video part in the multipart upload. The order needs to be the same as the order of parts in the upload instructions. Callers are should get the IDs as ETags from the response headers when they upload the videos. ETag: "e4383924336106965d6cd2a111beaceb" ETag: "24259a14365734f1f1b4abcdb5e55d01e" corresponds to uploadedPartIds: ["e4383924336106965d6cd2a111beaceb", "24259a14365734f1f1b4abcdb5e55d01e"] No
    finalizeUploadRequest.video Video URN Video URN that the uploaded Video is associated with No

    How to Upload Videos

    With Videos API, you can upload captions and thumbnails independent of the file size with multipart upload functionality by default.

    Steps to upload a video:

    1. Initialize Upload for Video
    2. Split the file into 4 MB each (split -b 4194303).
    3. Upload the Video
    4. Finalize Video Upload

    Initialize Video Upload

    Use the initializeUpload action to register the upload. When you initialize, you declare the upcoming upload. Use the upload URL from the uploadInstructions to upload the video.

    Note

    Initialize upload action is same irrespective of the file size, based on the file size, the response may have one or multiple upload URLs.

    Sample Request

    Video without Captions or Thumbnails

    POST 'https://api.linkedin.com/rest/videos?action=initializeUpload'
    
    { "initializeUploadRequest": {
           "owner": "urn:li:organization:2414183",
           "fileSizeBytes": 1055736 ,
           "uploadCaptions": false,
           "uploadThumbnail": false
        }
    }
    

    Sample Response

    A successful response returns a 200 OK status code with the uploadUrl to upload the video.

    {
      "value": {
        "uploadUrlsExpireAt": 1633234498985,
        "video": "urn:li:video:C5505AQH-oV1qvnFtKA",
        "uploadInstructions": [
          {
            "uploadUrl": "https://www.linkedin.com/dms-uploads/C5505AQH-oV1qvnFtKA/uploadedVideo?sau=aHR0cHM6Ly93d3cubGlua2VkaW4tZWkuY29tL2FtYnJ5L2FtYnJ5LXZpZGVvZWkvP3gtbGktYW1icnktZXA9QVFHVkdRS0FtS05oM2dBQUFYd19ObG1uZzVYcllXajEzZjIybXh4LW55SGVBclVKcE8y",
            "lastByte": 4194303,
            "firstByte": 0
          }
        ],
        "uploadToken": ""
      }
    }
    

    Note

    Videos uploaded with the Video Ads API can now be reused across different video post formats. For example, a video uploaded and posted to the feed can also be used in a sponsored video ad and does not require a separate video upload.

    Sample Request

    Video with Captions but no Thumbnails

    POST 'https://api.linkedin.com/rest/videos?action=initializeUpload'
    
    { "initializeUploadRequest": {
           "owner": "urn:li:organization:2414183",
           "fileSizeBytes": 1055736 ,
           "uploadCaptions": true,
           "uploadThumbnail": false
        }
    }
    

    Sample Response

    A successful response returns a 200 OK status code with the uploadUrl to upload the video.

    {
      "value": {
        "uploadUrlsExpireAt": 1633234498985,
        "video": "urn:li:video:C5505AQH-oV1qvnFtKA",
        "uploadInstructions": [
          {
            "uploadUrl": "https://www.linkedin.com/dms-uploads/C5505AQH-oV1qvnFtKA/uploadedVideo?sau=aHR0cHM6Ly93d3cubGlua2VkaW4tZWkuY29tL2FtYnJ5L2FtYnJ5LXZpZGVvZWkvP3gtbGktYW1icnktZXA9QVFHVkdRS0FtS05oM2dBQUFYd19ObG1uZzVYcllXajEzZjIybXh4LW55SGVBclVKcE8y",
            "lastByte": 4194303,
            "firstByte": 0
          }
        ],
        "uploadToken": ""
      }
    }
    

    Sample Request

    Video with Thumbnails but no Captions

    Make sure you set the Content-Type header to application/json.

    POST 'https://api.linkedin.com/rest/videos?action=initializeUpload'
    
    { "initializeUploadRequest": {
           "owner": "urn:li:organization:2414183",
           "fileSizeBytes": 1055736 ,
           "uploadCaptions": false,
           "uploadThumbnail": true
    }
    }
    

    Sample Response

    A successful response returns a 200 OK status code with the uploadUrl to upload the video.

    {
      "value": {
        "uploadUrlsExpireAt": 1633234498985,
        "video": "urn:li:video:C5505AQH-oV1qvnFtKA",
        "uploadInstructions": [
          {
            "uploadUrl": "https://www.linkedin.com/dms-uploads/C5505AQH-oV1qvnFtKA/uploadedVideo?sau=aHR0cHM6Ly93d3cubGlua2VkaW4tZWkuY29tL2FtYnJ5L2FtYnJ5LXZpZGVvZWkvP3gtbGktYW1icnktZXA9QVFHVkdRS0FtS05oM2dBQUFYd19ObG1uZzVYcllXajEzZjIybXh4LW55SGVBclVKcE8y",
            "lastByte": 4194303,
            "firstByte": 0
          }
        ],
        "uploadToken": ""
      }
    }
    

    Sample Request

    Video with MediaLibraryMetadata for media library registration

    Note that the mediaLibraryMetadata.mediaLibraryStatus defaults to "ACTIVE" on creation.

    POST 'https://api.linkedin.com/rest/videos?action=initializeUpload'
    
    { "initializeUploadRequest": {
           "owner": "urn:li:organization:2414183",
           "fileSizeBytes": 1055736 ,
           "uploadCaptions": false,
           "uploadThumbnail": false,
           "mediaLibraryMetadata": {
                "associatedAccount": "urn:li:sponsoredAccount:123456789",
                "assetName": "My media library asset"
          }
        }
    }
    

    Sample Response

    A successful response returns a 200 OK status code with the uploadUrl to upload the video.

    {
      "value": {
        "uploadUrlsExpireAt": 1633234498985,
        "video": "urn:li:video:C5505AQH-oV1qvnFtKA",
        "uploadInstructions": [
          {
            "uploadUrl": "https://www.linkedin.com/dms-uploads/C5505AQH-oV1qvnFtKA/uploadedVideo?sau=aHR0cHM6Ly93d3cubGlua2VkaW4tZWkuY29tL2FtYnJ5L2FtYnJ5LXZpZGVvZWkvP3gtbGktYW1icnktZXA9QVFHVkdRS0FtS05oM2dBQUFYd19ObG1uZzVYcllXajEzZjIybXh4LW55SGVBclVKcE8y",
            "lastByte": 4194303,
            "firstByte": 0
          }
        ],
        "uploadToken": ""
      }
    }
    

    Upload the Video

    Sample Request

    curl -v \
     -H "Content-Type:application/octet-stream" \
     --upload-file ~/Downloads/sample.mp4 \
    "https://www.linkedin.com/dms-uploads/C5505AQH-oV1qvnFtKA/uploadedVideo?sau=aHR0cHM6Ly93d3cubGlua2VkaW4tZWkuY29tL2FtYnJ5L2FtYnJ5LXZpZGVvZWkvP3gtbGktYW1icnktZXA9QVFHVkdRS0FtS05oM2dBQUFYd19ObG1uZzVYcllXajEzZjIybXh4LW55SGVBclVKcE8y"
    

    The headers in the response return an ETag as shown below. Ensure that you save eTag for future use.

    Sample Response

    A successful response returns a 200 OK status code.

    HTTP/1.1 200 OK
    Content-Length: 0
    Connection: keep-alive
    etag: /ambry-videoei/signedId/AQHX97-zKFZrewAAAXx7Kf1h4pHEr_EVJ2_BGyigpJdmMfO9DreqqynKhTXcMMtKmFtM_JL07JFHXfzHoegWPUsBw9ofV7Z3KWfKRvB41FtIXq9pmvQtkDNrw_nPX4QjsDktxxzFq2gMlC9e3H4x8U_y0QQFQO0pMvtdwaBoFZ_eq_hGZRQCG-zTcYD0J_Nqsf1bApcZ_KGM3Zdc62eATjUTAV7zH4f--18-PLbhQMkKl4g9tjzgRVVv3jp3EPwRidBb7bk0RSI.bin
    

    Upload Captions

    curl -v -H 'Content-Type:multipart/form-data' -F metadata='{ "format": "SRT", "formattedForEasyReader": true, "largeText": true, "source": "USER_PROVIDED", "locale": { "variant": "AMERICAN", "country": "US", "language": "EN"}, "transcriptType": "CLOSED_CAPTION" }' -F 'file=@/Downloads/vector4/sample.srt;type=text/plain'
    "https://www.linkedin.com/dms-mpf-uploads/C5510AQFcJm7vFh0-GQ/userUploadedCustomCaptions/YBIDwEuGcAA-/0?sync=0&v=beta&ut=1dpApVoV7zLac1'
    

    Important

    In the above call, The "@" in 'file=@/Downloads/vector4/sample.srt;type=text/plain' is mandatory to avoid any errors.

    Sample Response

    A successful response returns a 201 Created status code.

    POST /dms-mpf-uploads/C5510AQHwJl8JK7pBbw/userUploadedCustomCaptions/X9xZTedGYAA-/0?sync=0&v=beta&ut=2xCgsvCrxHQG81 HTTP/2
    Host: www.linkedin.com
    Content-Length: 962
    Content-Type: multipart/form-data; boundary=------------------------f04e0be9b719964e 
    Connection state changed (MAX_CONCURRENT_STREAMS == 100)!
    [962 bytes data]
    We are completely uploaded and fine
    HTTP/2 201
    

    Upload Thumbnail

    curl -v -H 'media-type-family:STILLIMAGE' -H 'Content-Type:application/octet-stream' --upload-file '~/Downloads/vector4/kiki.jpg' 'https://www.linkedin.com/dms-uploads/C5510AQHHRzI0nYgcuw/ads-video-userUploadedThumbnail/0?ca=vector_ads&cn=uploads_secure&ccn=ambry-video&sync=0&v=beta&ut=0LIRxJwkoZQG81
    

    Sample Response

    A successful response returns a 201 Created status code.

    PUT /dms-uploads/C5510AQHHRzI0nYgcuw/ads-video-userUploadedThumbnail/0?ca=vector_ads&cn=uploads_secure&ccn=ambry-video&sync=0&v=beta&ut=0LIRxJwkoZQG81 HTTP/2
    Host: www.linkedin-ei.com
    User-Agent: curl/7.64.1
    media-type-family:STILLIMAGE
    Content-Type:application/octet-stream
    X-LI-R2-W-MsgType: REST
    Accept: application/json
    Content-Length: 256600
    Connection state changed (MAX_CONCURRENT_STREAMS == 100)!
    [65536 bytes data]
    We are completely uploaded and fine
    HTTP/2 201
    

    Finalize Video Upload

    Sample Request

    POST https://api.linkedin.com/rest/videos?action=finalizeUpload
    
    {
      "finalizeUploadRequest": {
        "video": "urn:li:video:C5505AQHErI8lGthkfA",
        "uploadToken": "",
        "uploadedPartIds": [
        "/ambry-videoei/signedId/AQHR565FaYkDgAAAAXw_UJ1CyIkbTA1fh0JAC2dLx1lklVp7hflbaQTu7F3n736vqZ0oF16jNYfdQeiw_Rqoo8oB0foqB3qpWwFYWoDt0lu3GYMvDOfoB4jKCgLHeP-bBsagclZ0aVGC-8QPxiq9iC7JAcWESNdAooTqS40jVEK2kqcXBumDWLGQrMpfNSJ1qHrY4UqflpL3ibwa7BVev5VfUjkdK6CPfEhfVHbDEaE-93-2dio20_XUee5o2ZSYxMz4Txx8I3Y.bin"
        ]
      }
    }
    

    A successful response returns the 200 OK status code.

    Get a Video

    Sample Request

    GET https://api.linkedin.com/rest/videos/urn%3Ali%3Avideo%3AC4E10AQGUkQY7trgh-Q
    

    Sample Response

    {
       "duration": 32066,
       "aspectRatioWidth": 16,
       "owner": "urn:li:organization:18799005",
       "thumbnail": "https://media-exp1.licdn.com/dms/image/C4E10AQGUkQY7trgh-Q/ads-video-thumbnail_720_1280/0/1635274077531?e=2147483647&v=beta&t=_HxpoaXestMGYSqDyziZjUtzDvsp9zOgZvAy9HtVJZw",
       "downloadUrlExpiresAt": 1650549600000,
       "downloadUrl": "https://dms.licdn.com/playlist/C4E10AQGUkQY7trgh-Q/mp4-720p-30fp-crf28/0/1635274088269?e=2147483647&v=beta&t=tsv3E_sgOT1e7VPGpmrxk6ED7C0W3vwTh9Ui-8mlFZk",
       "id": "urn:li:video:C4E10AQGUkQY7trgh-Q",
       "aspectRatioHeight": 9,
       "captions": "https://www.linkedin.com/dms-mpf-uploads/C5510AQHHRzI0nYgcuw/ads-video-userUploadedThumbnail/0?ca=vector_ads&cn=uploads_secure&ccn=ambry-video&sync=0&v=beta&ut=0LIRxJwkoZQG81",
       "status": "AVAILABLE"
    }
    

    Note

    https://www.linkedin.com/dms-mpf-uploads/C5510AQHHRzI0nYgcuw/ads-video-userUploadedThumbnail/0?ca=vector_ads&cn=uploads_secure&ccn=ambry-video&sync=0&v=beta&ut=0LIRxJwkoZQG81 is the upload URL provided in response during the initializing video step.

    Batch Get a Video

    Sample Request

    GET https://api.linkedin.com/rest/videos?ids=List(urn%3Ali%3Avideo%3AC4D10AQE9WE5n4uJKUg,urn%3Ali%3Avideo%3AC5F10AQElP1fVH1Ke6g)
    

    Sample Response

    {
       "results": {
           "urn:li:video:C4D10AQE9WE5n4uJKUg": {
               "owner": "urn:li:organization:2414183",
               "status": "WAITING_UPLOAD",
               "id": "urn:li:video:C4D10AQE9WE5n4uJKUg"
           }
       },
       "statuses": {
           "urn:li:video:C4D10AQE9WE5n4uJKUg": 200,
           "urn:li:video:C5F10AQElP1fVH1Ke6g": 404
       },
       "errors": {
           "urn:li:video:C5F10AQElP1fVH1Ke6g": {
               "message": "Could not find entity",
               "status": 404,
               "code": "NOT_FOUND"
           }
       }
    }
    

    Partial Update on a Video

    Only supports updates on the media library metadata and only for the specified account. As such, the associatedAccount parameter is mandatory. Silently ignores any other patch data.

    When updating the mediaLibraryMetadata.mediaLibraryStatus field, an asset can go from ACTIVE to ARCHIVED only if it is not currently in processing (i.e. is done processing or processing failed). An asset can only go from ARCHIVED to ACTIVE if it succeeded processing. Updating the mediaLibraryMetadata.mediaLibraryStatus field will not update the last modified time of the asset.

    Sample Request

    POST https://api.linkedin.com/rest/videos/urn%3Ali%3Avideo%3AC5510AQEB1AGuxQ1NEA?associatedAccount=urn%3Ali%3AsponsoredAccount%3A123456789
    
    {
       "patch":{
          "mediaLibraryMetadata":{
             "$set":{
                "assetName":"updated name",
                "mediaLibraryStatus":"ARCHIVED"
             }
          }
       }
    }
    

    Sample Response

    A successful response returns a 204 status code.

    Find by Associated Account

    Get the Videos associated with the specified account, by descending order of last modified time.

    Parameters

    Parameter Required Possible Values
    q Yes Must be associatedAccount
    mediaLibraryStatus No Optional filter on the media library status. When omitted, all videos will be returned.
    start No The index at which the returned elements should begin. Defaults to 0.
    count No The number of elements to return, up to 1000. Defaults to 10.

    Sample Request

    GET https://api.linkedin.com/rest/videos?start=0&count=1&associatedAccount=urn%3Ali%3AsponsoredAccount%3A123456789&mediaLibraryStatus=ACTIVE&q=associatedAccount \
    

    Sample Response

    {
        "elements": [
           {
                "owner": "urn:li:organization:2414183",
                "aspectRatioWidth": 9.0,
                "duration": 6827,
                "thumbnail": "https://media.licdn-ei.com/dms/image/C5510AQEB1AGuxQ1NEA/ads-video-thumbnail_720_1280/0/1674575147547/customthumbnail?e=1676390400&v=beta&t=t8j6ysV2yIGB0pBJz63N-X0AB0bMn_L8vqbl7A32B00",
                "downloadUrlExpiresAt": 1676390400000,
                "downloadUrl": "https://dms.licdn-ei.com/playlist/C5510AQEB1AGuxQ1NEA/mp4-640p-30fp-crf28/0/1674575155048/customthumbnail?e=1676390400&v=beta&t=wbhPr3X9gQ-b7q36KMrSHXRiSqPXSaab-Q-B_oQ9AiI",
                "id": "urn:li:video:C5510AQEB1AGuxQ1NEA",
                "aspectRatioHeight": 16.0,
                "mediaLibraryMetadata": {
                    "associatedAccount": "urn:li:sponsoredAccount:123456789",
                    "mediaLibraryStatus": "ACTIVE",
                    "assetName": "custom thumbnail"
                },
                "status": "AVAILABLE"
            },
        ]
        "paging": {
            "count": 1,
            "start": 0,
            "links": [
                {
                    "rel": "next",
                    "type": "application/json",
                    "href": "https://api.linkedin.com/rest/videos?associatedAccount=urn%3Ali%3AsponsoredAccount%3A521498108&q=associatedAccount&start=1&count=1"
                }
            ]
        }
    }
    

    Error Messages

    Code HTTP Status Code Error Message Template
    INVALID_VIDEO_ID 400 This Video ID is invalid
    INVALID_CALL_TO_ACTION 400 {cta} is an invalid Call To Action
    INVALID_URL 400 {cta} is an invalid Url
    INVALID_URN_TYPE 400 {field} value {value} must be a {urnType} URN
    EXPIRED_UPLOAD_URL 400 The Video upload Url is expired
    INVALID_URN_ID 400 This URN Id is invalid
    NOT_FOUND 404 Could not find entity
    MEDIA_ASSET_PROCESSING_FAILED 400 Media asset failed processing
    MEDIA_ASSET_WAITING_UPLOAD 400 Media asset is waiting upload
    UPDATING_ASSET_FAILED 400 Failed to update asset {urn} for the intended usecase. Please recreate the asset and try again.

    Migration from Assets API to Videos API

    LinkedIn recommends migrating to the Videos API for your video uploads. The following sections describe some of the key benefits.

    Response Schema Enhancement

    Assets API Videos API Benefit
    Returns generic digitalMediaAsset URN for all content Returns specific URN (e.g., video:C4E05AQEw_VQIt69CrA) Purpose-built response URN rather than generic asset URN
    Returns mediaArtifact field with superfluous details Does not return mediaArtifact field Simplified response structure
    Headers for AWS S3 Upload for backward compatibility (LinkedIn has storage capability) No unnecessary headers Simplified response structure
    urlExpiresAt param present in multi-part even with consistent value urlExpiresAt param outside nested structure for a single value Simplified response structure
    Nested field relationships Plain schema Simplified response structure

    Improvements with Request Schema to complete Upload

    Assets API Videos API Benefit
    Nested field relationships required in the request schema Plain schema Simplified Request structure
    Metadata, mediaArtifact, ETags, status fields required in request schema Requires only ETags and upload token (previously metadata) Simplified request structure
    Action Purpose Assets API Action Name Videos API Name
    ---- ----- ---
    Init Upload registerUpload initializeUpload
    Complete Upload completeMultiPartUpload finalizeUpload