- 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
Introducing AdWords API version v201003 beta
Tuesday, May 25, 2010
Labels: AdWords API Blog, v201003
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.
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
Labels: AdWords API Blog, apps, sandbox
AdWords Downtime: May 13th, 6:00pm - 6:30pm PDT
Thursday, May 13, 2010
Labels: AdWords API Blog, downtime
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
Labels: AdWords API Blog, adwords ids, analytics, analytics api
AdWords Downtime: May 8th, 10am-2pm PDT
Tuesday, May 04, 2010
Labels: AdWords API Blog
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.
| Index | Ad | Destination Url | Error |
| 0 | New York Budget Hotel Clean and close to subway. Students save 20%! www.example.com/NewYork | http://www.example.com/NewYork | |
| 1 | Book 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 | |
| 2 | Hotels 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 |
| 3 | Manhattan 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. |
| 4 | New York City Hotels Discount Discounted Rooms in New York City. Get Lowest Rates Available Today. www.example.com/NewYork | http://www.example.com/NewYork | |
| 5 | New York City Hotels Stay Smart in New York NY. Free internet & breakfast bar. www.example.com/NewYork | http://www.example.com/NewYork | |
| 6 | 70% 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 | |
| 7 | Stylish New Hotel in NYC Enjoy Four-Star Amenities & Service Chelsea/Fashion District. Book Now! www.example.com/NewYork | http://www.example.com/NewYork | |
| 8 | Budget 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.
- Your company is a Google AdWords Certified Partner
- Your AdWords API-based tools remain in compliance with the AdWords API terms and conditions, including the required minimum functionality. During the preferred pricing application process, you'll be asked for detailed information about your tools. An in-depth review of your tools may also be necessary.
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
Labels: AdWords API Blog, preferred pricing
