Watermarks: set

Uploads a watermark image to YouTube and sets it for a channel.

This method supports media upload. Uploaded files must conform to these constraints:

  • Maximum file size: 10MB
  • Accepted Media MIME types: image/jpeg, image/png, application/octet-stream

Quota impact: A call to this method has a quota cost of approximately 50 units.


HTTP request

POST https://www.googleapis.com/upload/youtube/v3/watermarks/set


This request requires authorization with at least one of the following scopes (read more about authentication and authorization).



The following table lists the parameters that this query supports. All of the parameters listed are query parameters.

Required parameters
channelId string
The channelId parameter specifies the YouTube channel ID for which the watermark is being provided.
Optional parameters
onBehalfOfContentOwner string
Note: This parameter is intended exclusively for YouTube content partners.

The onBehalfOfContentOwner parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The CMS account that the user authenticates with must be linked to the specified YouTube content owner.

Request body

Provide a watermark resource in the request body.


If successful, this method returns an HTTP 204 response code (No Content).


Note: The following code samples may not represent all supported programming languages. See the client libraries documentation for a list of supported languages.


This sample calls the API's watermarks.set method to upload an image and set it as the watermark image for a channel. The request must be authorized by the channel that owns the video.

This example uses the Python client library.


# Usage example:
# python set_watermark.py --channelid='<channel_id>' --file='<file_name>'
#  --metadata='{ "position": { "type": "corner", "cornerPosition": "topRight" },
#                "timing": { "type": "offsetFromStart", "offsetMs": 42 } }'

import json
import os
import sys
import httplib2

from apiclient.discovery import build
from apiclient.errors import HttpError
from oauth2client.file import Storage
from oauth2client.client import flow_from_clientsecrets
from oauth2client.tools import argparser, run_flow

# The CLIENT_SECRETS_FILE variable specifies the name of a file that contains

# the OAuth 2.0 information for this application, including its client_id and
# client_secret. You can acquire an OAuth 2.0 client ID and client secret from
# the Google Developers Console at
#   https://console.developers.google.com/project/_/apiui/credential
# Please ensure that you have enabled the YouTube Data API for your project.
# For more information about using OAuth2 to access the YouTube Data API, see:
#   https://developers.google.com/youtube/v3/guides/authentication
# For more information about the client_secrets.json file format, see:
#   https://developers.google.com/api-client-library/python/guide/aaa_client_secrets
CLIENT_SECRETS_FILE = "client_secrets.json"

# This OAuth 2.0 access scope allows for full read/write access to the
# authenticated user's account.
YOUTUBE_READ_WRITE_SCOPE = "https://www.googleapis.com/auth/youtube"

# This variable defines a message to display if the CLIENT_SECRETS_FILE is
# missing.
WARNING: Please configure OAuth 2.0

To make this sample run you will need to populate the client_secrets.json file
found at:
with information from the Developers Console

For more information about the client_secrets.json file format, please visit:
""" % os.path.abspath(os.path.join(os.path.dirname(__file__),

# Authorize the request and store authorization credentials.
def get_authenticated_service(args):
  flow = flow_from_clientsecrets(CLIENT_SECRETS_FILE,

  storage = Storage("%s-oauth2.json" % sys.argv[0])
  credentials = storage.get()

  if credentials is None or credentials.invalid:
    credentials = run_flow(flow, storage, args)


# Call the API's watermarks.set method to upload the watermark image and
# associate it with the proper channel.
def set_watermark(youtube, channel_id, file, metadata):
  except HttpError as e:
    print "Error while setting watermark: %s" % e.content
    raise e

if __name__ == "__main__":
  # The "channelid" option specifies the YouTube channel ID that uniquely
  # identifies the channel for which the watermark image is being updated.
  argparser.add_argument("--channelid", dest="channelid",
    help="Required; ID for channel that is having its watermark updated.")
  # The "file" option specifies the path to the image being uploaded.
  argparser.add_argument("--file", dest="file",
    help="Required; path to watermark image file.")
  # The "metadata" option specifies the JSON for the watermark resource
  # provided with the request.
  argparser.add_argument("--metadata", dest="metadata",
    help="Required; watermark metadata in JSON format.")
  args = argparser.parse_args()

  if not args.channelid:

  youtube = get_authenticated_service(args)

  if not args.file or not os.path.exists(args.file):
    exit("Please specify a valid file using the --file= parameter.")
  if not args.metadata:
    exit("Please specify watermark metadata using the --metadata= parameter.")
  set_watermark(youtube, args.channelid, args.file,
  print "The watermark was successfully set."


The following table identifies error messages that the API could return in response to a call to this method. Please see the error message documentation for more detail.

Error type Error detail Description
badRequest (400) imageFormatUnsupported The image you provided is in an unsupported format.
badRequest (400) imageTooTall The image you provided is too tall.
badRequest (400) imageTooWide The image you provided is too wide.
badRequest (400) mediaBodyRequired The request does not include the image content.
forbidden (403) forbidden The watermark can't be set for the specified channel. The request may not be properly authorized, or the channelId parameter is set to an invalid value.

Send feedback about...

YouTube Data API
YouTube Data API