Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
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. |
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. |
No |
| status | String | 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. |
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:
- Initialize Upload for Video
- Split the file into 4 MB each (
split -b 4194303). - Upload the Video
- 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": ""
}
}
Video with Deeplink to Media Attribution
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
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. |