Vevo accepts feed delivery via S3 in both DDEX and XML formats.
Examples of both of these formats can be found at the bottom of this support page.
Feed Submission GuideVevo Feed 101
Video File Size Limit
The current upper limit for video files is 128GB.
Metadata Validator
Validate DDEX or vevoxml metadata at: https://cs-lingest.vevoprd.com/
This does not store or submit the metadata and can be used as often as needed to validate manifest metadata for correctness.
Response receipt
A receipt system is in place for feed deliveries. In the submission directory,
- a file called
failure-$ISRC.json
will be created if the feed system was able to read the submission but failed to successfully ingest it- the file may not be present if the system fails to process the submission, such as in case of severely malformed manifest files or if a
BatchComplete_
file is used - the failure file may contain failure cause(such as missing assets for example) but not always
- the file may not be present if the system fails to process the submission, such as in case of severely malformed manifest files or if a
- a file called
success-$ISRC.json
will always be created if the submission was successfully ingested into the catalog
As general rule of thumb, there will always be a success file if the submission was successful. Absence of the success file indicates unsuccessful feed ingestion.
A note on timing: the feed ingestion system is asynchronous. Every few minutes a check is made for new submissions and any new submissions are processed. Thus ingestion result will be available fairly quickly but there is a delay between delivery and results.
Submission Fields
Depending on the submission purpose(Insert
/Update
/Delete
) the list of fields varies slightly, with a core set of always required fields.
Other fields supported by the DDEX format and not listed below may be included, however they will not be ingested by the vevo systems.
Required
The following fields are required and should always be included in the submission manifest.
- Isrc
- Title
- Label / RepetoireOwner
- Genres
- MainArtists
- YouTubeChannelName
Optional
- Language
- DurationMs
- MadeForKids
- YouTubeUnlisted
- FeaturedArtists
- Directors
- Producers
- Editors
- Composers
- IsExplicit
- CopyRightYear
- CopyRightLine
- CustomId
- GRid
- UpcCode
- AudioIsrc
- YouTubeDescription
- Keywords
- VideoVersionTitle
Insert
When performing an Insert
an additional set of fields are possible.
Required
- VideoAsset
- Availability
- TerritorialPolicy
- StartDate
Optional
- ImageAsset
- CaptionAsset
- EndDate
Update
Required
- Availability
- TerritorialPolicy
- StartDate
Optional
- ImageAsset
- CaptionAsset
- EndDate
Delete
Note: No-Deal takedown is supported. PurgeReleaseMessage is not supported.
Optional
- EndDate
DDEX & Dates
A fully qualified <StartDateTime>
and/or <EndDateTime>
(a Date + Time + Timezone, ex: 2024-10-28T09:00:00Z) is strongly recommended. Dates without a time or timezone component are subject to interpretation(because Youtube publishing requires an absolute date) and can cause confusion.
Background
Video availability(where the video is available) and Video Start Time(when it is available) are calculated based on the Deals sent to us, then distilled to a single date for the video to send to YouTube. Iff we don't have time or timezone information explicitly provided on the submission, that information is inferred:
- for territorial availability,
- territory specific timezone is applied per-ddex rules(defined as Eastern most timezone)
- if Time is not provided then time is resolved as:
- for StartTime, Time is 00:00:00
- for EndTime, Time is 23:59:59
- "territorial availability" is a Territorial Policy of when the video is available in a given territory
- for video Start Time,
- Time is resolved as indicated above
- per-historic rules a ContentProvider dependent timezone is applied
- UMG & orch => America/New_York
- everyone else => America/Los_Angeles
- earliest StartDateTime is then selected as video Start Time
- for video End Time,
- video Start Time rules apply, with the exception of time selection
.SRT Captions format
Historically Vevo has only supported .ttml
caption format. Vevo is adding support for .srt
caption format(this feature is not live. Deployment date TBD).
Overall rules governing captions are not changing(only 1 captions file is supported per-submission), only the supported captions formats is being expanded.
One important note is that it is highly recommended to provide .srt
caption language
in the submission(since .srt
files do not embed the language
code unlike .ttml
). If caption language is not explicitly specified then vevo will default .srt
caption language to video's language(if available) and fallback to en
if video language is not specified. The language
code format is the same for.ttml
and .srt
(en
for .ttml
will be en
for .srt
)
see format specific implementation notes:
- DDEX 4.X - .SRT Captions Language
- DDEX 3.X - .SRT Captions Language
- VEVOXML - .SRT Captions Language
DDEX ERN 4.3
Preliminary support for parsing ern 4 has been added to the feed parser and is available through the metadata validator referenced above.
Note that implementation is not final and as-is supports parity with ern 3 parsing, with ern 4 specific features such as ReleaseAdmin still TBD.
Youtube Channel
The convention established with partners submitting ddex ern 4.x is to specify the YoutubeChannel of the video in the ProprietaryId
field with a Namespace of Channel
on the TrackRelease
corresponding to the video.
Example:
<TrackRelease>
<ReleaseReference>R1</ReleaseReference>
<ReleaseId>
...
<ProprietaryId Namespace="ISRC">USRV80200058</ProprietaryId>
<ProprietaryId Namespace="Channel">testVevo</ProprietaryId>
</ReleaseId>
<ReleaseResourceReference>A1</ReleaseResourceReference>
...
</TrackRelease>
.SRT Captions Language
Submissions using .srt
captions format should explicitly specify captions language using <LanguageOfText>
.
Example:
<Text>
<ResourceReference>A3</ResourceReference>
<Type>Caption</Type>
<TechnicalDetails>
<TechnicalResourceDetailsReference>T3</TechnicalResourceDetailsReference>
<TextCodecType>SRT</TextCodecType>
<File>
<URI>resources/00602465536775_T4_vidtrk.srt</URI>
</File>
</TechnicalDetails>
<LanguageOfText>en</LanguageOfText>
</Text>
DDEX (ERN 3.8)
Vevo supports the DDEX ERN standard for release deliveries. However, this standard still allows for some flexibility and the Vevo parser looks for certain release metadata in specific places.
Upload Structure
To make a submission via feed upload the xml manifest and media assets to vevo-ingestion
S3 bucket.
General guidelines:
- Create a unique folder per-submission. For example:
s3://vevo-ingestion/feed/sony/A10301A0000007246L_20211108214519818/
- All media assets(video, thumbnail, captions) must be uploaded first
- Upload the manifest file last. Delivery of the manifest is the signal to vevo ingestion to start processing the submission
-
NOTE:
- "BatchComplete" files are not supported by the ingestion system at this time
- Do not send a
delivery.complete
file for DDEX submissions, it is not supported. Submission processing will stat as soon as the manifest is uploaded
General Rules
Mark Up One Release: R0
You can actually mark up any release you like without doing any harm, but Vevo's parser only looks at a single release, the release in /ernm:NewReleaseMessage/ReleaseList
where /ernm:NewReleaseMessage/ReleaseList/Release/ReleaseReference
is R0
. There are cases where the parser will fail over to other releases in the release list if a piece of metadata is missing, but it will always prefer R0
.
Use 'Worldwide' territory code to provide general release details
Some release details need to be provided under the ReleaseDealsByTerritory
. When we discuss those cases below, we are specifically refering to the path /ernm:NewReleaseMessage/ReleaseList/Release/ReleaseDetailsByTerritory
where the release is R0
and .
Things To Be Aware Of™️
UMG Title
rules
UMG has special title rule: if present, SubTitle is enclosed in parenthesis and appended to Title to create final video Title. (aka: videoTitle = $Title ($SubTitle)
)
This can cause a display anomaly if the Title is already decorated as desired. Submit an undecorated Title or do not submit SubTitle to correct .
Youtube Channel
/ernm:NewReleaseMessage/ReleaseList/Release/ArtistProfilePage/PageName
The element text should be the name of the Youtube channel:
<PageName>lesinconnusVEVO</PageName>
The channel name is case-insensitive, but we should encourage the content provider to provide the channel exactly as it exists on youtube for readability.
PageName
should be in the Main(<ReleaseType>VideoSingle</ReleaseType>
aka R0) Release.
abridged <Release>
example:
<Release IsMainRelease="true">
<ReleaseId>
<ICPN>886444169684</ICPN>
...
</ReleaseId>
<ReleaseReference>R0</ReleaseReference>
<ReferenceTitle LanguageAndScriptCode="fr">
<TitleText>...</TitleText>
</ReferenceTitle>
<ReleaseResourceReferenceList>
...
</ReleaseResourceReferenceList>
<ReleaseType>VideoSingle</ReleaseType>
<ReleaseDetailsByTerritory>
<TerritoryCode>Worldwide</TerritoryCode>
...
<Synopsis>...</Synopsis>
</ReleaseDetailsByTerritory>
<Duration>...</Duration>
<CLine>
<Year>...</Year>
...
</CLine>
<ArtistProfilePage>
<PageName>lesinconnusVEVO</PageName>
</ArtistProfilePage>
</Release>
Thumbnail Image
Thumbnail is optional.
If present, thumbnail Image
should be specified in the ResourceList
and linked to the Video
via ResourceGroup
in the Main(<ReleaseType>VideoSingle</ReleaseType>
aka R0) Release.
Image Resource
The main spec for the thumbnail image should be located at the following path:
/ernm:NewReleaseMessage/ResourceList/Image
see the abridged example below:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ernm:NewReleaseMessage LanguageAndScriptCode="en" MessageSchemaVersionId="/ern/381" xmlns:ernm="http://ddex.net/xml/ern/381" xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" xs:schemaLocation="http://ddex.net/xml/ern/381 http://ddex.net/xml/ern/381/release-notification.xsd">
<ResourceList>
<Image>
<ImageType>VideoScreenCapture</ImageType>
<ImageId>
<ProprietaryId Namespace="DPID:PADPIDA2007040502I">G010004278282M</ProprietaryId>
</ImageId>
<ResourceReference>A2</ResourceReference>
<ImageDetailsByTerritory>
<TerritoryCode>Worldwide</TerritoryCode>
<TechnicalImageDetails>
<TechnicalResourceDetailsReference>T2</TechnicalResourceDetailsReference>
<ImageCodecType>JPEG</ImageCodecType>
<ImageHeight>1080</ImageHeight>
<ImageWidth>1920</ImageWidth>
<ImageResolution>72</ImageResolution>
<IsPreview>false</IsPreview>
<File>
<FileName>A10301A0004278282M_T-3300515145112_Image_001-001.jpg</FileName>
<FilePath>resources/</FilePath>
<HashSum>
<HashSum>e1164a55f3a5ed7948bda2d7551b6103</HashSum>
<HashSumAlgorithmType>MD5</HashSumAlgorithmType>
</HashSum>
</File>
</TechnicalImageDetails>
</ImageDetailsByTerritory>
</Image>
</ResourceList>
</ernm:NewReleaseMe
Image → Video link
In R0 Release
link the Image resource(ResourceReference ID A2) to the Video(ResourceReference ID A1) via LinkedReleaseResourceReference
tag:
<LinkedReleaseResourceReference LinkDescription="VideoScreenCapture">A2</LinkedReleaseResourceReference>
abridged <Release>
example:
<Release IsMainRelease="true">
<ReleaseId>
...
<ReleaseReference>R0</ReleaseReference>
<ReferenceTitle LanguageAndScriptCode="en">
...
<ReleaseResourceReferenceList>
<ReleaseResourceReference ReleaseResourceType="PrimaryResource">A1</ReleaseResourceReference>
<ReleaseResourceReference ReleaseResourceType="SecondaryResource">A2</ReleaseResourceReference>
</ReleaseResourceReferenceList>
<ReleaseType>VideoSingle</ReleaseType>
<ReleaseDetailsByTerritory>
<TerritoryCode>Worldwide</TerritoryCode>
<DisplayArtistName>...</DisplayArtistName>
<LabelName LabelNameType="DisplayLabelName">...</LabelName>
<Title LanguageAndScriptCode="en" TitleType="DisplayTitle">
...
<DisplayArtist SequenceNumber="2">
...
<ResourceGroup>
<ResourceGroup>
<Title TitleType="GroupingTitle">
...
<SequenceNumber>1</SequenceNumber>
<ResourceGroupContentItem>
<SequenceNumber>1</SequenceNumber>
<ResourceType>Video</ResourceType>
<ReleaseResourceReference ReleaseResourceType="PrimaryResource">A1</ReleaseResourceReference>
<LinkedReleaseResourceReference LinkDescription="VideoScreenCapture">A2</LinkedReleaseResourceReference>
</ResourceGroupContentItem>
</ResourceGroup>
</ResourceGroup>
<Genre>
...
<Keywords>...</Keywords>
</ReleaseDetailsByTerritory>
<Duration>...</Duration>
<PLine>
...
<CLine>
...
<ArtistProfilePage>
...
</Release>
.SRT Captions Language
Submissions using .srt
captions format should explicitly specify captions language using <SubTitleLanguage>
.
Example:
<ReferenceTitle>
<TitleText>Caballero (Official Video)</TitleText>
</ReferenceTitle>
<LanguageOfPerformance>es</LanguageOfPerformance>
<SubTitleLanguage>es</SubTitleLanguage>
<Duration>PT3M2S</Duration>
Video Version
/ernm:NewReleaseMessage/ResourceList/Video/VideoDetailsByTerritory/Title/SubTitle
- We use the first
VideoDetailsByTerritory
element. As far as we're concerned it doesn't matter what territory that is, we just look at the first one. - Conventionally by https://kb.ddex.net/display/HBK/Titles+and+SubTitles+in+ERN-3, this would be the
Title
element withTitleType="FormalTitle"
, but we look for the lastTitle
element with a childSubTitle
element that comes before theTitle
element withTitleType="DisplayTitle"
. In this case the order matters. See the abridged example below.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ernm:NewReleaseMessage LanguageAndScriptCode="en" MessageSchemaVersionId="/ern/381" xmlns:ernm="http://ddex.net/xml/ern/381" xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" xs:schemaLocation="http://ddex.net/xml/ern/381 http://ddex.net/xml/ern/381/release-notification.xsd">
<ResourceList>
<Video>
<VideoType>ShortFormMusicalWorkVideo</VideoType>
<VideoId>
<ISRC>IT5082000070</ISRC>
</VideoId>
<ResourceReference>A1</ResourceReference>
<!-- Not the ReferenceTitle -->
<ReferenceTitle LanguageAndScriptCode="it">
<TitleText>All'asilo - La mia classe - Gioca con gli indovinelli e il dizionario</TitleText>
<SubTitle>Official Video</SubTitle>
</ReferenceTitle>
<VideoDetailsByTerritory>
<TerritoryCode>Worldwide</TerritoryCode>
<!-- This one. We find the Title that has a SubTitle. It must come before the DisplayTitle -->
<Title LanguageAndScriptCode="it" TitleType="FormalTitle">
<TitleText>All'asilo - La mia classe - Gioca con gli indovinelli e il dizionario</TitleText>
<SubTitle>Official Video</SubTitle>
</Title>
<Title LanguageAndScriptCode="it" TitleType="DisplayTitle">
<TitleText>All'asilo - La mia classe - Gioca con gli indovinelli e il dizionario (Official Video)</TitleText>
</Title>
...
</VideoDetailsByTerritory>
</Video>
...
</ResourceList>
...
</ernm:NewReleaseMessage>
Proprietary fields
YouTube Unlisted
To submit a video to be unlisted on just YouTube, the content provider can add a ProprietaryId to the ResourceList:
<ResourceList>
<Video>
<VideoType>ShortFormMusicalWorkVideo</VideoType>
<VideoId>
<ISRC>GBUV12345678</ISRC>
<ProprietaryId Namespace="VEVO:YouTubeUnlisted">true</ProprietaryId>
...
An example manifest can be found in cs-lingest here.
Vevoxml
.SRT Captions Language
Submissions using .srt
captions format should explicitly specify captions language using <ClosedCaptionLanguage>
.
Example:
<?xml version="1.0" encoding="utf-8"?>
<video version="1.0">
...
<ClosedCaptionUrl>file://QZNCS2101475.srt</ClosedCaptionUrl>
<ClosedCaptionLanguage>es</ClosedCaptionLanguage>
...
</video>
Upload Structure
Submission procedure for vevoxml is largely similar to making DDEX submissions with a few important differences.
- Use a unique folder per-submission. The exact folder name is up to the user, including isrc and/or current timestamp can be helpful
- Example:
s3://vevo-ingestion/feed/sony/QZNCS2101475_1632243025134/
- Example:
- All media assets(video, thumbnail, captions) must be uploaded first
- The manifest file should be named
manifest.xml
- When the submission is ready for processing, trigger submission processing by uploading a 0-byte file named
delivery.complete
- This acts as a signal to vevo ingestion to start processing the contents of the submission folder
YouTube Unlisted
To submit a video to be unlisted on just YouTube, the content provider can add this field to the manifest:
<YouTubeUnlisted>True</YouTubeUnlisted>
An example manifest can be found in cs-lingest here.