Before you can get the key, you need a project container.
<?xml version="1.0" encoding="UTF-8"?>
<youtube_top_videos generated="2026-04-12T12:00:00">
<video>
<id>dQw4w9WgXcQ</id>
<title>Top Trending Video</title>
<channel>ExampleChannel</channel>
<views>10456789</views>
<likes>890123</likes>
</video>
</youtube_top_videos>
Use the API’s videos endpoint with chart=mostPopular.
Example request (JSON format by default): youtube api keyxml download top
https://www.googleapis.com/youtube/v3/videos?part=snippet,statistics&chart=mostPopular®ionCode=US&key=YOUR_API_KEY
API_KEY = "YOUR_API_KEY_HERE" # Replace with your KeyXML string BASE_URL = "https://www.googleapis.com/youtube/v3/videos" REGION_CODE = "US" # Top videos in the United States MAX_RESULTS = 20 # Max is 50 per page
def fetch_top_videos(): """Fetch the most popular videos from YouTube API""" params = 'part': 'snippet,statistics', 'chart': 'mostPopular', # This gives you the "TOP" videos 'regionCode': REGION_CODE, 'maxResults': MAX_RESULTS, 'key': API_KEY Before you can get the key, you need a project container
response = requests.get(BASE_URL, params=params)
if response.status_code == 200:
return response.json()
else:
print(f"Error: response.status_code - response.text")
return None
def json_to_xml(json_data): """Convert JSON response to XML format (KeyXML structure)""" root = ET.Element("feed") root.set("xmlns", "http://www.w3.org/2005/Atom") root.set("xmlns:yt", "http://www.youtube.com/xml/schemas/2015")
# Add metadata
title = ET.SubElement(root, "title")
title.text = f"YouTube Top Videos - REGION_CODE"
updated = ET.SubElement(root, "updated")
updated.text = datetime.datetime.now().isoformat()
# Add each video as an entry
for item in json_data.get('items', []):
entry = ET.SubElement(root, "entry")
# Video ID
vid_id = ET.SubElement(entry, "id")
vid_id.text = f"yt:video:item['id']"
# Title
title_elem = ET.SubElement(entry, "title")
title_elem.text = item['snippet']['title']
# Channel Info
channel = ET.SubElement(entry, "author")
name = ET.SubElement(channel, "name")
name.text = item['snippet']['channelTitle']
# Statistics (Views, Likes)
stats = ET.SubElement(entry, "yt:statistics")
stats.set("viewCount", item['statistics'].get('viewCount', '0'))
stats.set("likeCount", item['statistics'].get('likeCount', '0'))
stats.set("commentCount", item['statistics'].get('commentCount', '0'))
# Published Date
published = ET.SubElement(entry, "published")
published.text = item['snippet']['publishedAt']
# Thumbnail Link
thumb = ET.SubElement(entry, "link")
thumb.set("rel", "enclosure")
thumb.set("href", item['snippet']['thumbnails']['high']['url'])
# Pretty print XML
xml_str = minidom.parseString(ET.tostring(root)).toprettyxml(indent=" ")
return xml_str
def download_xml(xml_content, filename="youtube_top_videos.xml"): """Save the XML file locally""" with open(filename, 'w', encoding='utf-8') as f: f.write(xml_content) print(f"✅ Successfully downloaded: filename") Use the API’s videos endpoint with chart=mostPopular
| Problem | Solution |
|---------|----------|
| Quota exceeded (10k units/day) | Use caching; reduce maxResults |
| Missing viewCount for search results | Fetch video stats in second API call |
| XML encoding errors | Force UTF-8 output |
| “API key not enabled” | Enable YouTube Data API in Google Cloud |