Looks like you may have done your nesting incorrectly; you are running the request.execute call outside the gapi.client.load function's callback, so the actual request itself isn't created when it tries to run (the gapi client loads the APIs asynchronously). If instead you tried this:
function makeApiCall() {
// Step 4: Load the Google+ API
gapi.client.load('youtube', 'v3', function() {
console.log('youtube API loaded...');
// Step 5: Assemble the API request
var qVar = "Kanye West Amazing"
// changed. added: type
var request = gapi.client.youtube.search.list({
type: 'video',
part: 'id',
q: qVar
});
// Step 6: Execute the API request
request.execute(function(resp) {
document.getElementById('vid').value = resp.items[1].id.videoId;
console.log('saved video id successfully');
});
});
}
Then it should wait and do the request only after the API code is loaded. This also assumes, of course, that you have an element with id "vid" (which your sample code didn't have).
As far as the scopes go, you don't need them for this particular call, as it's not one that needs to be authenticated (i.e. you can just run MakeApiCall() without authorization). However, if you'll be doing other things later that need authorization, it is functioning properly so you could just as easily leave it in.