ERROR 409: Requested entity already exists

13,219

I just tested your code and... It's working completely fine.
The job name must be unique for within a reportTypeId, so that error means that you used the name Playlist user activity for another job of the same type already.

That is not clear in the documentation. You can open an issue about the docs on their issue tracker here

Share:
13,219
Key Jun
Author by

Key Jun

Updated on June 04, 2022

Comments

  • Key Jun
    Key Jun almost 2 years

    I am using the sample code in this site https://developers.google.com/youtube/reporting/v1/reference/rest/v1/reportTypes/list After setting-up successfully libraries and importing CLIENT_SECRETS_FILE into the code. When I run the code. It returned

    Report type id: playlist_playback_location_a1
     name: Playlist playback locations
    Report type id: playlist_province_a1
     name: Playlist province
    Report type id: playlist_traffic_source_a1
     name: Playlist traffic sources
    

    I want to get playlist users in playlist_basic_a1 table so I entered the reportTypeId for the job: playlist_basic_a1 and set a name for the job: Playlist user activity Then It returned an error like this:

    An HTTP error 409 occurred:
    {
      "error": {
        "code": 409,
        "message": "Requested entity already exists",
        "errors": [
          {
            "message": "Requested entity already exists",
            "domain": "global",
            "reason": "alreadyExists"
          }
        ],
        "status": "ALREADY_EXISTS"
      }
    }
    

    This is my code:

    #!/usr/bin/python
    
    # Usage example:
    # python create_reporting_job.py --name='<name>'
    
    import httplib2
    import os
    import sys
    
    from apiclient.discovery import build
    from apiclient.errors import HttpError
    from oauth2client.client import flow_from_clientsecrets
    from oauth2client.file import Storage
    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 API Console at
    # https://console.developers.google.com/.
    # 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 read access to the YouTube Analytics monetary reports for
    # authenticated user's account. Any request that retrieves earnings or ad performance metrics must
    # use this scope.
    YOUTUBE_ANALYTICS_MONETARY_READ_SCOPE = (
      "https://www.googleapis.com/auth/yt-analytics-monetary.readonly")
    YOUTUBE_REPORTING_API_SERVICE_NAME = "youtubereporting"
    YOUTUBE_REPORTING_API_VERSION = "v1"
    
    # This variable defines a message to display if the CLIENT_SECRETS_FILE is
    # missing.
    MISSING_CLIENT_SECRETS_MESSAGE = """
    WARNING: Please configure OAuth 2.0
    
    To make this sample run you will need to populate the client_secrets.json file
    found at:
       %s
    with information from the APIs Console
    https://console.developers.google.com
    
    For more information about the client_secrets.json file format, please visit:
    https://developers.google.com/api-client-library/python/guide/aaa_client_secrets
    """ % os.path.abspath(os.path.join(os.path.dirname(__file__),
                                       CLIENT_SECRETS_FILE))
    
    # Authorize the request and store authorization credentials.
    def get_authenticated_service(args):
      flow = flow_from_clientsecrets(CLIENT_SECRETS_FILE, scope=YOUTUBE_ANALYTICS_MONETARY_READ_SCOPE,
        message=MISSING_CLIENT_SECRETS_MESSAGE)
    
      storage = Storage("%s-oauth2.json" % sys.argv[0])
      credentials = storage.get()
    
      if credentials is None or credentials.invalid:
        credentials = run_flow(flow, storage, args)
    
      return build(YOUTUBE_REPORTING_API_SERVICE_NAME, YOUTUBE_REPORTING_API_VERSION,
        http=credentials.authorize(httplib2.Http()))
    
    
    # Call the YouTube Reporting API's reportTypes.list method to retrieve report types.
    def list_report_types(youtube_reporting):
      results = youtube_reporting.reportTypes().list().execute()
      reportTypes = results["reportTypes"]
    
      if "reportTypes" in results and results["reportTypes"]:
        reportTypes = results["reportTypes"]
        for reportType in reportTypes:
          print "Report type id: %s\n name: %s\n" % (reportType["id"], reportType["name"])
      else:
        print "No report types found"
        return False
    
      return True
    
    
    # Call the YouTube Reporting API's jobs.create method to create a job.
    def create_reporting_job(youtube_reporting, report_type_id, name):
      reporting_job = youtube_reporting.jobs().create(
        body=dict(
          reportTypeId=report_type_id,
          name=name
        )
      ).execute()
    
      print ("Reporting job '%s' created for reporting type '%s' at '%s'"
             % (reporting_job["name"], reporting_job["reportTypeId"],
                 reporting_job["createTime"]))
    
    
    # Prompt the user to enter a report type id for the job. Then return the id.
    def get_report_type_id_from_user():
      report_type_id = raw_input("Please enter the reportTypeId for the job: ")
      print ("You chose '%s' as the report type Id for the job." % report_type_id)
      return report_type_id
    
    
    if __name__ == "__main__":
      # The "name" option specifies the name that will be used for the reporting job.
      argparser.add_argument("--name",
        help="Required; name for the reporting job.")
      args = argparser.parse_args()
    
      if not args.name:
        exit("Please specify name using the --name= parameter.")
    
      youtube_reporting = get_authenticated_service(args)
      try:
        if list_report_types(youtube_reporting):
          create_reporting_job(youtube_reporting, get_report_type_id_from_user(), args.name)
      except HttpError, e:
        print "An HTTP error %d occurred:\n%s" % (e.resp.status, e.content)
      else:
        print "Created reporting job."
    

    Why I got this error? And how to fix this error