Captions can greatly enhance the experience of viewing a YouTube video, and the YouTube API has offered developers ways to upload and retrieve caption data in authorized requests for a while now. However, the various YouTube API client libraries don’t natively support interacting with captions at this time, and writing your own code for uploading or retrieving captions can be challenging.

With that in mind, we're happy to announce the YouTube Captions Uploader open source project on Google Code, which provides real-world code for uploading captions to YouTube. The code is written for the Java App Engine environment, and it uses some nifty new App Engine features like the Channel API, the Blobstore Service, and Task Queues. And even if you're not an App Engine developer, we hope that the code that interacts with the YouTube API's captions service will provide a good starting point for writing your own code.

In addition to open sourcing the code for this project, we’re also running the code itself on a public App Engine instance, So, even if you're not a developer, you can still use the application to upload captions for videos in your YouTube account.

Please share your comments or feedback via the project’s issue tracker. We hope that you find it useful both as a standalone web application and as a starting point for writing your own code!

—Jeff Posnick, YouTube API Team

Update (July 2012): The onYouTubePlayerAPIReady callback has been superseded by  onYouTubeIframeAPIReady and the URL for loading the IFrame Player API code has changed to http(s):// The API is now fully supported.

If you have been enjoying our <iframe> embed announced back in July we have some good news for you. Starting today, the <iframe> embed code is the default way to share videos on We are also introducing an initial beta version of the <iframe> embed JavaScript Player API, making it a viable alternative for developers who previously used the API exposed by the ActionScript players. Let’s look at an example of the API usage:

<div id="player"></div>
    //Load player api asynchronously.
    var tag = document.createElement('script');
    tag.src = "";
    var firstScriptTag = document.getElementsByTagName('script')[0];
    firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
    var done = false;
    var player;
    function onYouTubeIframeAPIReady() {
        player = new YT.Player('player', {
          height: '390',
          width: '640',
          videoId: 'JW5meKfy3fY',
          events: {
            'onReady': onPlayerReady,
            'onStateChange': onPlayerStateChange
    function onPlayerReady(evt) {;
    function onPlayerStateChange(evt) {
        if ( == YT.PlayerState.PLAYING && !done) {
            setTimeout(stopVideo, 6000);
            done = true;
    function stopVideo() {

This example will play a video for several seconds and then stop playback. An instance of YT.Player is used to control the player, defined by script loaded from http(s)://  For more information about the API usage, as always, please consult our Player API documentation and let us know what you think on our Developer Forum.

-Jarek Wilkiewicz, on behalf of the YouTube Player Team