Introducing AdWords API version v201003 beta

Tuesday, May 25, 2010


Today we’re releasing a new version of the AdWords API: v201003 beta. This version contains many requested features, including: a ReportService beta, Ad Sitelinks, and bid simulator. We know many of you just migrated to v200909, so don’t worry, your v200909 code will continue to work normally – v200909 remains the latest out-of-beta release and is fully supported by our team.

Here’s the full list of what’s new in version v201003 beta:
  • ReportService beta: generate reports about the performance of your AdWords campaigns
  • Bid simulator: see estimated clicks, cost and impressions corresponding to various Max. CPC bids
  • Ad Sitelinks extensions: include up to four additional links in your ads to deeper content on your site
  • Phone extensions: add a phone number to your text ads that appear on mobile devices with full Internet browsers such as iPhone and Android ads
  • Sync for location extensions: synchronize your AdWords location extensions with Google Places (formerly Local Business Center) listings
  • MediaService: upload images and icons for location extensions
  • Position preference: specify in what position range you’d like your ads to appear
  • Target CPA: bid based on the average amount you’d like pay for a conversion
  • Carrier and device targeting: target ads to specific mobile carriers and devices
  • Category targeting: show placement targeted ads on a set of placements with the same theme
  • 1-per-click and many-per-click conversions: get both types of conversion metrics
  • A minimum size for bulk mutate jobs
ReportService is available in beta within v201003, however, TrafficEstimatorService and AccountService are only available within v13. We’ll announce on this blog when all three of these services are fully available within the new AdWords API. You’ll have four months from the date of that announcement to migrate your applications to the new services. You don’t need to migrate to the new ReportService beta at this time, but we encourage you to try it out.

The new AdWords API architecture makes it easier for us to enable new features available in AdWords, so look out for more updates like this one in the coming months. As always, please continue to post your questions and feedback to the developer forum.

–Jason Shafton, Product Marketing Manager

Sandbox Account Viewer Released

Monday, May 24, 2010


The Sandbox Account Viewer is a sample application that demonstrates how to use the AdWords API client library to display contents of an AdWords sandbox account. It can be used to visualize the effects of a request on your account and to retrieve information such as IDs that are needed when running examples. We are sharing this code as open source to provide a starting point for new developers and to demonstrate some of the core functionality in the API.

The Sandbox Account Viewer does not attempt to replicate the official AdWords web interface, but rather displays information exactly as it is returned by the API. The objects in the account are displayed in a tree on the left, and when selected their details are displayed in a table to the right.

Sandbox Account Viewer Screenshot

To get started, download the source code and open the project in Eclipse or your favorite Java IDE. Read through the README and javadoc comments to understand how the application works and use the Ant task "run" to launch it. We encourage you to modify the code and experiment with new functionality. If you develop a great feature let us know so we can upstream it in to the official source.

If you have Java enabled in your browser you can click here to launch a preview of the application. Bugs, feature requests, or contributions can be filed on the Java client library issue tracker and any questions can be posted to the AdWords API forum.

- Eric Koleda, AdWords API Team

AdWords Downtime: May 13th, 6:00pm - 6:30pm PDT

Thursday, May 13, 2010


We'll be performing routine system maintenance on Thursday, May 13th from approximately 6:00pm to 6:30pm PDT. You won't be able to access AdWords or the API during this time frame, but your ads will continue to run as normal.

While, AdWords system maintenance typically occurs on the second Saturday of each month, this update was delayed due to the Mother's Day holiday in the U.S. last weekend. We apologize for the late notice.

Best,
- Eric Koleda, AdWords API Team

New AdWords ID Data in Google Analytics API

Thursday, May 06, 2010


Cross posted from the Google Analytics Blog.

Google Analytics helps marketers measure the performance of their ad campaigns. By linking Google Analytics and AdWords accounts, advertisers get a detailed picture of the performance of their ad creatives and keywords. Manually optimizing campaigns works well for the top 100 or 1000 keywords, but can be a challenge for the 1000+ keywords in the long tail.
To help advertisers, we are releasing 5 new dimensions through the Google Analytics API that correlate to the AdWords API IDs.

  • ga:adwordsCustomerID
  • ga:adwordsCampaignID
  • ga:adwordsAdGroupID
  • ga:adwordsCriteriaID
  • ga:adwordsCreativeID

This allows advertisers to gain new insight by by combining data from Google Analytics and Google AdWords data sets.


Image of table showing new AdWords IDs

Likewise, clients can increase their efficiency by automating reporting using applications. For example, a developer could write an application that ranks all the ad and keyword combinations by bounce rate for the top 50 landing pages, making it easy to identify which ad creatives could be optimized. Running such a report at night would allow an analyst to spend their day focused on optimizing ad creatives to yield real outcomes.

To help you get started quickly, we wrote an article that walks through the steps of joining data from both sources. We also provided the sample application that produces the table above. Here's a sample Java code snippet that shows exactly how to insert the IDs from Google Analytics into a Google AdWords API filter:


public AdGroupCriterionIdFilter[] getCriterionFilters(DataFeed
analyticsData) {

int numFilters = analyticsData.getEntries().size();
AdGroupCriterionIdFilter[] critFilters = new
AdGroupCriterionIdFilter[numFilters];

for (int i = 0; i < numFilters; i++) {

DataEntry entry = analyticsData.getEntries().get(i);
Long groupID =
Long.parseLong(entry.stringValueOf("ga:adwordsAdGroupID"));
Long critID =
Long.parseLong(entry.stringValueOf("ga:adwordsCriteriaID"));

AdGroupCriterionIdFilter critFilter = new AdGroupCriterionIdFilter();
critFilter.setAdGroupId(groupID);
critFilter.setCriterionId(critID);
critFilters[i] = critFilter;
}
return critFilters;
}

Please keep in mind that all applications that combine data with the AdWords API must follow the AdWords API terms and conditions.

We're really excited about the new possibilities this data allows. We look forward to hearing how you use it to improve your ad campaigns!

Thanks!
Alex Lucas, Google Analytics API Team

AdWords Downtime: May 8th, 10am-2pm PDT

Tuesday, May 04, 2010


We'll be performing routine system maintenance on Saturday, May 8th from approximately 10:00am to 2:00pm PDT. You won't be able to access AdWords or the API during this time frame, but your ads will continue to run as normal.

Best,
- Eric Koleda, AdWords API Team

Discover v2009: Error handling in BulkMutateJobService.

Wednesday, April 28, 2010


In our previous blog post, we discussed how v2009 error handling works in synchronous APIs. In this blog post, we cover asynchronous error handling in BulkMutateJobService. If you are new to BulkMutateJobService, check out our introductory blog post and code.google.com article.

Due to its asynchronous nature, error handling in BulkMutateJobService is slightly different than in other services. Instead of throwing an ApiError object, BulkMutateJobService returns FailureResult or BatchFailureResult objects as its operation results. These objects in turn contain the relevant ApiErrors. BulkMutateJobService processes the operations within an operation stream in multiple atomic batches. If there is even one faulty operation in a batch, it causes the other non-faulty operations in the batch to fail as well. When a batch of n operations fails, you will get one FailureResult and n - 1 BatchFailureResults as results for the failed batch of operations. The FailureResult object will always be first in the batch, and will contain one ApiException object. The ApiException contains all the errors for the entire batch of operations, just like for other services. This will be followed by n - 1 BatchFailureResults, which can be viewed as placeholders, one for each operation in the batch.

For instance, assume that you are trying to create the following 9 text ads in a single OperationStream. For the purposes of this example, assume that the system processes operations in batches of 3. The errors are highlighted in red.



































































IndexAdDestination UrlError
0New York Budget Hotel
Clean and close to subway.
Students save 20%!
www.example.com/NewYork
http://www.example.com/NewYork

1Book New York Hotel Deals
Research your New York Stay. Deals
up to 70% from example.com.
www.example.com/NewYork
http://www.example.com/NewYork

2Hotels In New York
Book your hotel room online at a
lower price via example.com!!
www.example.com/NewYork
http://www.example.com/NewYork
Excessive punctuation in description2
3Manhattan Best Hotel
Experience the Best of Manhattan
For Rates As Low As $239/Night.
www.example.com/NewYork
www.example.com/NewYork
Missing schema in destination url.
4New York City Hotels Discount
Discounted Rooms in New York City.
Get Lowest Rates Available Today.
www.example.com/NewYork
http://www.example.com/NewYork

5New York City Hotels
Stay Smart in New York NY.
Free internet & breakfast bar.
www.example.com/NewYork
http://www.example.com/NewYork

670% Off New York Hostels
Why Pay More? From $10 We Guarantee
Lowest Prices - From 1 Night
www.example.com/NewYork
http://www.example.com/NewYork

7Stylish New Hotel in NYC
Enjoy Four-Star Amenities & Service
Chelsea/Fashion District. Book Now!
www.example.com/NewYork
http://www.example.com/NewYork

8Budget Lodging in NYC
Comfortable, Clean Modern Economy
Hotel.Great Downtown Location!
www.example.com/NewYork
http://www.example.com/NewYork





When BulkMutateJobService processes these operations, it will return the following results:


Result[0]: FailureResult.
ApiException.errors has one ApiError
PolicyViolationError @ operations[2].operand.ad.description2
Result[1]: BatchFailureResult, operationIndexInBatch = 1
Result[2]: BatchFailureResult, operationIndexInBatch = 2

Result[3]: FailureResult.
ApiException.errors have 1 ApiError
AdError.URL_NO_SCHEME @ operations[0].operand.ad.url
Result[4]: BatchFailureResult, operationIndexInBatch = 1
Result[5]: BatchFailureResult, operationIndexInBatch = 2

Result[6]: ReturnValueResult, successfully created Ad.
Result[7]: ReturnValueResult, successfully created Ad.
Result[8]: ReturnValueResult, successfully created Ad.

As shown in the results above, there is a 1:1 correspondence between the number of operations and number of results. You can get the successful operations by scanning the return value for results which are not FailureResult or BatchFailureResult (operations 6, 7 and 8 in this case). Then, scan through the results to locate FailureResult objects (which always appear at the beginning of the failed batch) to get the operation that actually failed (operations 2 and 3 in this case). You can now pick the failed operations that do not correspond to the ones obtained from FailureResult, and make a new job for them (0, 1, 4, 5). Note that the OGNL path in FailureResult is relative to the batch and not the operationstream, so you have to offset it by the index of FailureResult to get the failed operation (e.g. Results[3] is a FailureResult and its OGNL path is operations[0].operand.ad.url, so the failing operator in the original list is 3 + 0 = operations[3]).

A BulkMutateJob may also return the following error results, even though they're not common:

LostResult: This happens when BMJS has lost results for some of a job's operations. You can recover from this error by checking numFailedOperations and numUnprocessedOperations for the job. If both are zero, or if the number of errors in ApiError matches numFailedOperations, then the operations were successful, but the results are missing. In any other case, you have to retrieve the entities that were targeted by the operations and see if the operation actually succeeded or not.

UnprocessedResult: This indicates that the mutate operation was not processed. This could happen because the workflow implementation prevented the operation from being processed (e.g. the operations exceed API quota). You can recover from this issue by checking the job status, making sure that you have sufficient API quota left, and simply retrying the operations in a new job.

In an upcoming blog post, we will cover the most common errors you may get in v2009, and how to address them. We've included support for error handling in all of our client libraries to help get you started, so please try it out and share your feedback with us on the forum or the projects' issue trackers.

-- Anash P. Oommen, AdWords API Team

Introducing preferred AdWords API pricing for agencies

Monday, April 26, 2010


Today, we're announcing preferred AdWords API pricing for agencies and developers of search engine marketing (SEM) tools. With preferred pricing, this important group of developers will get free API units based on managed client spend.

As an agency or a developer of SEM tools, you are eligible to apply for preferred pricing if:
We'll start accepting your applications for preferred pricing on May 26, 2010 and will respond with the status of your application starting July 1, 2010.

Along with this change, we have updated the AdWords API terms and conditions and the required minimum functionality (RMF). We've made a couple of changes to the RMF, based on the feedback you shared with us after we first published the RMF.

First, we're clarifying that the RMF does not apply to Internal-only AdWords API Clients. This means that you're not required to implement the RMF features within internal tools that are solely used by employees of your company. Please review the terms and conditions to determine which tools might qualify as Internal-only AdWords API Clients. Second, in this round of updates to the RMF, we are making some features optional. For example, demographic targeting, which was previously a required feature, is now optional.

We hope that the changes we're making with preferred pricing will encourage you to experiment with new strategies, expand the functionality of your tools, and build more comprehensive client campaigns, without worrying about API costs. Please review the preferred pricing web site and the FAQs for more information on the requirements and the application process. If you have questions or feedback on these changes, please don't hesitate to contact your Google representative.

– Shreyas Doshi, Product Manager