Share via


Videos API

Warning

Deprecation Notice: The Marketing Version 202504 (Marketing April 2025) has been sunset. We recommend that you migrate to the latest versioned APIs to avoid disruptions. For information on all the supported versions, refer to the migrations documentation. 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 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's 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's another issue. No
    aspectRatioWidth float Aspect ratio width of the media. For media with a 16:9 ratio, it's 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's 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 be empty if the media asset isn't available, failed processing, or there's another issue. No
    downloadUrlExpiresAt Time optional Milliseconds since the epoch (1970-01-01 00:00 UTC) when the identifier expires. If it's 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's 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.linkbackContext string optional The necessary context to link back to this attribution. When missing either no linkback is needed or no additional context is required to link back to the attribution. Note: The initializeUploadRequest.linkbackContext field is only supported from API version 202602 onwards. No
    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.templateName string optional The template name (if any) used in the creation of this video using a third-party company, organization, tool, etc. Note: The initializeUploadRequest.templateName field is only supported from API version 202602 onwards. No
    initializeUploadRequest.uploadCaptions boolean default=false Specify whether you want to upload captions with the video. Each video can include only one caption file, and only English-language captions are supported. If this field is set to true for an Ads Video, caption processing must succeed for the video to be eligible for serving. For a feed video, the video can still be served even if caption processing fails. This field defaults to false, as captions are optional for all videos. No
    initializeUploadRequest.uploadThumbnail boolean default=false Whether you want to upload a thumbnail along with video. If the partner doesn't 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'll 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 shouldn't 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 doesn't 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": ""
      }
    }
    

    This example demonstrates uploading a video with media attribution using templateName and linkbackContext fields to deeplink back to a specific third-party template or tool used in video creation. The template name is optional, and is only needed if it needs to be displayed later in the attribution CTA.

    Sample Request

    POST 'https://api.linkedin.com/rest/videos?action=initializeUpload'
    
    {
      "initializeUploadRequest": {
        "owner": "urn:li:organization:2414183",
        "fileSizeBytes": 1055736,
        "uploadCaptions": false,
        "uploadThumbnail": false,
        "templateName": "Sunshine birthday wishes",
        "linkbackContext": "https://clipchamp.com/content/cc_ta0a5a7e7-sunshine-birthday/"
      }
    }
    

    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's 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 won't 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 1,000. 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"
                }
            ]
        }
    }
    

    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

    API Error Details

    HTTP STATUS CODE ERROR MESSAGE ERROR DESCRIPTION
    400 INVALID_VIDEO_ID This Video ID is invalid
    400 INVALID_CALL_TO_ACTION {cta} is an invalid Call To Action
    400 INVALID_URL {cta} is an invalid URL
    400 INVALID_URN_TYPE {field} value {value} must be a {urnType} URN
    400 EXPIRED_UPLOAD_URL The Video upload URL is expired
    400 INVALID_URN_ID This URN Id is invalid
    400 MEDIA_ASSET_PROCESSING_FAILED Media asset failed processing
    400 MEDIA_ASSET_WAITING_UPLOAD Media asset is waiting upload
    400 UPDATING_ASSET_FAILED Failed to update asset {URN} for the intended usecase. Please recreate the asset and try again.