Hello, The Adwords API does not have the ability to roll back successful operations or create nested operations. However, the AdWords API does support a feature called Partial Failure <https://developers.google.com/adwords/api/docs/guides/partial-failure> where you can submit a collection of operations and do error handling on only the failed operations. The successful operations will commit, but the failed operations will come back to you with an explanation. You can then determine what to do. For example, if one of your campaigns operations fail, you can avoid any operations that rely on that campaign operation. Here's a snippet of the Java code example <https://github.com/googleads/googleads-java-lib/blob/master/examples/adwords_axis/src/main/java/adwords/axis/v201502/errorhandling/HandlePartialFailures.java> :
// Enable partial failure. session <https://codesearch.corp.google.com/#piper///depot/google3/third_party/java_src/adsapi/opensource/examples/adwords_axis/src/main/java/adwords/axis/v201502/errorhandling/HandlePartialFailures.java&ct=xref_jump_to_def&cl=GROK&l=75&gsn=session>.setPartialFailure <https://codesearch.corp.google.com/#piper///depot/google3/third_party/java_src/adsapi/java/com/google/api/ads/adwords/lib/client/AdWordsSession.java&ct=xref_jump_to_def&cl=GROK&l=170&gsn=setPartialFailure>(true); // Do some operations here. // Iterate through the result to see if any of the operations failed. for (ApiError <https://codesearch.corp.google.com/#piper///depot/google3/blaze-out/gcc-4.X.Y-crosstool-v18-hybrid-grtev4-k8-fastbuild/genfiles/third_party/java_src/adsapi/java/com/google/api/ads/adwords/axis/libadwords_axis_generated.srcjar.files/com/google/api/ads/adwords/axis/v201502/cm/ApiError.java&ct=xref_jump_to_def&cl=GROK&l=20&gsn=ApiError> apiError <https://codesearch.corp.google.com/#piper///depot/google3/third_party/java_src/adsapi/opensource/examples/adwords_axis/src/main/java/adwords/axis/v201502/errorhandling/HandlePartialFailures.java&ct=xref_usages&gs=java:adwords.axis.v201502.errorhandling.HandlePartialFailures.runExample(com.google.api.ads.adwords.axis.factory.AdWordsServices,com.google.api.ads.adwords.lib.client.AdWordsSession,java.lang.Long).%257B%257D4%23apiError&l=121&gsn=apiError> : result <https://codesearch.corp.google.com/#piper///depot/google3/third_party/java_src/adsapi/opensource/examples/adwords_axis/src/main/java/adwords/axis/v201502/errorhandling/HandlePartialFailures.java&ct=xref_jump_to_def&cl=GROK&l=108&gsn=result>.getPartialFailureErrors <https://codesearch.corp.google.com/#piper///depot/google3/blaze-out/gcc-4.X.Y-crosstool-v18-hybrid-grtev4-k8-fastbuild/genfiles/third_party/java_src/adsapi/java/com/google/api/ads/adwords/axis/libadwords_axis_generated.srcjar.files/com/google/api/ads/adwords/axis/v201502/cm/AdGroupCriterionReturnValue.java&ct=xref_jump_to_def&cl=GROK&l=68&gsn=getPartialFailureErrors>()) { Matcher <https://codesearch.corp.google.com/#piper///depot/depot2/google_vendor_src_branch/openjdk7/releases/v6/trunk/jdk/src/share/classes/java/util/regex/Matcher.java&ct=xref_jump_to_def&cl=GROK&l=105&gsn=Matcher> matcher <https://codesearch.corp.google.com/#piper///depot/google3/third_party/java_src/adsapi/opensource/examples/adwords_axis/src/main/java/adwords/axis/v201502/errorhandling/HandlePartialFailures.java&ct=xref_usages&gs=java:adwords.axis.v201502.errorhandling.HandlePartialFailures.runExample(com.google.api.ads.adwords.axis.factory.AdWordsServices,com.google.api.ads.adwords.lib.client.AdWordsSession,java.lang.Long).%257B%257D4%23matcher&l=122&gsn=matcher> = operationIndexPattern <https://codesearch.corp.google.com/#piper///depot/google3/third_party/java_src/adsapi/opensource/examples/adwords_axis/src/main/java/adwords/axis/v201502/errorhandling/HandlePartialFailures.java&ct=xref_jump_to_def&cl=GROK&l=51&gsn=operationIndexPattern>.matcher <https://codesearch.corp.google.com/#piper///depot/depot2/google_vendor_src_branch/openjdk7/releases/v6/trunk/jdk/src/share/classes/java/util/regex/Pattern.java&ct=xref_jump_to_def&cl=GROK&l=1081&gsn=matcher>(apiError <https://codesearch.corp.google.com/#piper///depot/google3/third_party/java_src/adsapi/opensource/examples/adwords_axis/src/main/java/adwords/axis/v201502/errorhandling/HandlePartialFailures.java&ct=xref_jump_to_def&cl=GROK&l=121&gsn=apiError>.getFieldPath <https://codesearch.corp.google.com/#piper///depot/google3/blaze-out/gcc-4.X.Y-crosstool-v18-hybrid-grtev4-k8-fastbuild/genfiles/third_party/java_src/adsapi/java/com/google/api/ads/adwords/axis/libadwords_axis_generated.srcjar.files/com/google/api/ads/adwords/axis/v201502/cm/ApiError.java&ct=xref_jump_to_def&cl=GROK&l=56&gsn=getFieldPath>()); if (matcher <https://codesearch.corp.google.com/#piper///depot/google3/third_party/java_src/adsapi/opensource/examples/adwords_axis/src/main/java/adwords/axis/v201502/errorhandling/HandlePartialFailures.java&ct=xref_jump_to_def&cl=GROK&l=122&gsn=matcher>.matches <https://codesearch.corp.google.com/#piper///depot/depot2/google_vendor_src_branch/openjdk7/releases/v6/trunk/jdk/src/share/classes/java/util/regex/Matcher.java&ct=xref_jump_to_def&cl=GROK&l=559&gsn=matches>()) { int operationIndex <https://codesearch.corp.google.com/#piper///depot/google3/third_party/java_src/adsapi/opensource/examples/adwords_axis/src/main/java/adwords/axis/v201502/errorhandling/HandlePartialFailures.java&ct=xref_usages&gs=java:adwords.axis.v201502.errorhandling.HandlePartialFailures.runExample(com.google.api.ads.adwords.axis.factory.AdWordsServices,com.google.api.ads.adwords.lib.client.AdWordsSession,java.lang.Long).%257B%257D5%23operationIndex&l=124&gsn=operationIndex> = Integer <https://codesearch.corp.google.com/#piper///depot/depot2/google_vendor_src_branch/openjdk7/releases/v6/trunk/jdk/src/share/classes/java/lang/Integer.java&ct=xref_jump_to_def&cl=GROK&l=52&gsn=Integer>.parseInt <https://codesearch.corp.google.com/#piper///depot/depot2/google_vendor_src_branch/openjdk7/releases/v6/trunk/jdk/src/share/classes/java/lang/Integer.java&ct=xref_jump_to_def&cl=GROK&l=526&gsn=parseInt>(matcher <https://codesearch.corp.google.com/#piper///depot/google3/third_party/java_src/adsapi/opensource/examples/adwords_axis/src/main/java/adwords/axis/v201502/errorhandling/HandlePartialFailures.java&ct=xref_jump_to_def&cl=GROK&l=122&gsn=matcher>.group <https://codesearch.corp.google.com/#piper///depot/depot2/google_vendor_src_branch/openjdk7/releases/v6/trunk/jdk/src/share/classes/java/util/regex/Matcher.java&ct=xref_jump_to_def&cl=GROK&l=484&gsn=group>(1)); AdGroupCriterion <https://codesearch.corp.google.com/#piper///depot/google3/blaze-out/gcc-4.X.Y-crosstool-v18-hybrid-grtev4-k8-fastbuild/genfiles/third_party/java_src/adsapi/java/com/google/api/ads/adwords/axis/libadwords_axis_generated.srcjar.files/com/google/api/ads/adwords/axis/v201502/cm/AdGroupCriterion.java&ct=xref_jump_to_def&cl=GROK&l=14&gsn=AdGroupCriterion> adGroupCriterion <https://codesearch.corp.google.com/#piper///depot/google3/third_party/java_src/adsapi/opensource/examples/adwords_axis/src/main/java/adwords/axis/v201502/errorhandling/HandlePartialFailures.java&ct=xref_usages&gs=java:adwords.axis.v201502.errorhandling.HandlePartialFailures.runExample(com.google.api.ads.adwords.axis.factory.AdWordsServices,com.google.api.ads.adwords.lib.client.AdWordsSession,java.lang.Long).%257B%257D5%23adGroupCriterion&l=125&gsn=adGroupCriterion> = operations <https://codesearch.corp.google.com/#piper///depot/google3/third_party/java_src/adsapi/opensource/examples/adwords_axis/src/main/java/adwords/axis/v201502/errorhandling/HandlePartialFailures.java&ct=xref_jump_to_def&cl=GROK&l=83&gsn=operations>.get <https://codesearch.corp.google.com/#piper///depot/depot2/google_vendor_src_branch/openjdk7/releases/v6/trunk/jdk/src/share/classes/java/util/List.java&ct=xref_jump_to_def&cl=GROK&l=435&gsn=get>(operationIndex <https://codesearch.corp.google.com/#piper///depot/google3/third_party/java_src/adsapi/opensource/examples/adwords_axis/src/main/java/adwords/axis/v201502/errorhandling/HandlePartialFailures.java&ct=xref_jump_to_def&cl=GROK&l=124&gsn=operationIndex>).getOperand <https://codesearch.corp.google.com/#piper///depot/google3/blaze-out/gcc-4.X.Y-crosstool-v18-hybrid-grtev4-k8-fastbuild/genfiles/third_party/java_src/adsapi/java/com/google/api/ads/adwords/axis/libadwords_axis_generated.srcjar.files/com/google/api/ads/adwords/axis/v201502/cm/AdGroupCriterionOperation.java&ct=xref_jump_to_def&cl=GROK&l=51&gsn=getOperand>(); System <https://codesearch.corp.google.com/#piper///depot/depot2/google_vendor_src_branch/openjdk7/releases/v6/trunk/jdk/src/share/classes/java/lang/System.java&ct=xref_jump_to_def&cl=GROK&l=56&gsn=System>.out <https://codesearch.corp.google.com/#piper///depot/depot2/google_vendor_src_branch/openjdk7/releases/v6/trunk/jdk/src/share/classes/java/lang/System.java&ct=xref_jump_to_def&cl=GROK&l=107&gsn=out>.printf <https://codesearch.corp.google.com/#piper///depot/depot2/google_vendor_src_branch/openjdk7/releases/v6/trunk/jdk/src/share/classes/java/io/PrintStream.java&ct=xref_jump_to_def&cl=GROK&l=870&gsn=printf>("Ad group criterion with ad group id '%d <https://codesearch.corp.google.com/#piper///depot/google3/third_party/java_src/adsapi/opensource/examples/adwords_axis/src/main/java/adwords/axis/v201502/errorhandling/HandlePartialFailures.java&ct=xref_usages&gs=java:third_party/java_src/adsapi/opensource/examples/adwords_axis/src/main/java/adwords/axis/v201502/errorhandling/HandlePartialFailures.java:(%2525d):5356&l=126&gsn=%25d>' and keyword '%s <https://codesearch.corp.google.com/#piper///depot/google3/third_party/java_src/adsapi/opensource/examples/adwords_axis/src/main/java/adwords/axis/v201502/errorhandling/HandlePartialFailures.java&ct=xref_usages&gs=java:third_party/java_src/adsapi/opensource/examples/adwords_axis/src/main/java/adwords/axis/v201502/errorhandling/HandlePartialFailures.java:(%2525s):5373&l=126&gsn=%25s>' " + "triggered a failure for the foll <https://codesearch.corp.google.com/#piper///depot/google3/third_party/java_src/adsapi/opensource/examples/adwords_axis/src/main/java/adwords/axis/v201502/errorhandling/HandlePartialFailures.java&ct=xref_usages&gs=java:third_party/java_src/adsapi/opensource/examples/adwords_axis/src/main/java/adwords/axis/v201502/errorhandling/HandlePartialFailures.java:(%2525s):5424&l=127&gsn=ll>owing reason: '%s'.\n", adGroupCriterion <https://codesearch.corp.google.com/#piper///depot/google3/third_party/java_src/adsapi/opensource/examples/adwords_axis/src/main/java/adwords/axis/v201502/errorhandling/HandlePartialFailures.java&ct=xref_jump_to_def&cl=GROK&l=125&gsn=adGroupCriterion>.getAdGroupId <https://codesearch.corp.google.com/#piper///depot/google3/blaze-out/gcc-4.X.Y-crosstool-v18-hybrid-grtev4-k8-fastbuild/genfiles/third_party/java_src/adsapi/java/com/google/api/ads/adwords/axis/libadwords_axis_generated.srcjar.files/com/google/api/ads/adwords/axis/v201502/cm/AdGroupCriterion.java&ct=xref_jump_to_def&cl=GROK&l=87&gsn=getAdGroupId>(), ((Keyword <https://codesearch.corp.google.com/#piper///depot/google3/blaze-out/gcc-4.X.Y-crosstool-v18-hybrid-grtev4-k8-fastbuild/genfiles/third_party/java_src/adsapi/java/com/google/api/ads/adwords/axis/libadwords_axis_generated.srcjar.files/com/google/api/ads/adwords/axis/v201502/cm/Keyword.java&ct=xref_jump_to_def&cl=GROK&l=16&gsn=Keyword>) adGroupCriterion <https://codesearch.corp.google.com/#piper///depot/google3/third_party/java_src/adsapi/opensource/examples/adwords_axis/src/main/java/adwords/axis/v201502/errorhandling/HandlePartialFailures.java&ct=xref_jump_to_def&cl=GROK&l=125&gsn=adGroupCriterion>.getCriterion <https://codesearch.corp.google.com/#piper///depot/google3/blaze-out/gcc-4.X.Y-crosstool-v18-hybrid-grtev4-k8-fastbuild/genfiles/third_party/java_src/adsapi/java/com/google/api/ads/adwords/axis/libadwords_axis_generated.srcjar.files/com/google/api/ads/adwords/axis/v201502/cm/AdGroupCriterion.java&ct=xref_jump_to_def&cl=GROK&l=133&gsn=getCriterion>()).getText <https://codesearch.corp.google.com/#piper///depot/google3/blaze-out/gcc-4.X.Y-crosstool-v18-hybrid-grtev4-k8-fastbuild/genfiles/third_party/java_src/adsapi/java/com/google/api/ads/adwords/axis/libadwords_axis_generated.srcjar.files/com/google/api/ads/adwords/axis/v201502/cm/Keyword.java&ct=xref_jump_to_def&cl=GROK&l=70&gsn=getText>(), apiError <https://codesearch.corp.google.com/#piper///depot/google3/third_party/java_src/adsapi/opensource/examples/adwords_axis/src/main/java/adwords/axis/v201502/errorhandling/HandlePartialFailures.java&ct=xref_jump_to_def&cl=GROK&l=121&gsn=apiError>.getErrorString <https://codesearch.corp.google.com/#piper///depot/google3/blaze-out/gcc-4.X.Y-crosstool-v18-hybrid-grtev4-k8-fastbuild/genfiles/third_party/java_src/adsapi/java/com/google/api/ads/adwords/axis/libadwords_axis_generated.srcjar.files/com/google/api/ads/adwords/axis/v201502/cm/ApiError.java&ct=xref_jump_to_def&cl=GROK&l=96&gsn=getErrorString>()); } else { System <https://codesearch.corp.google.com/#piper///depot/depot2/google_vendor_src_branch/openjdk7/releases/v6/trunk/jdk/src/share/classes/java/lang/System.java&ct=xref_jump_to_def&cl=GROK&l=56&gsn=System>.out <https://codesearch.corp.google.com/#piper///depot/depot2/google_vendor_src_branch/openjdk7/releases/v6/trunk/jdk/src/share/classes/java/lang/System.java&ct=xref_jump_to_def&cl=GROK&l=107&gsn=out>.printf <https://codesearch.corp.google.com/#piper///depot/depot2/google_vendor_src_branch/openjdk7/releases/v6/trunk/jdk/src/share/classes/java/io/PrintStream.java&ct=xref_jump_to_def&cl=GROK&l=870&gsn=printf>("A failure for the following reason: '%s <https://codesearch.corp.google.com/#piper///depot/google3/third_party/java_src/adsapi/opensource/examples/adwords_axis/src/main/java/adwords/axis/v201502/errorhandling/HandlePartialFailures.java&ct=xref_usages&gs=java:third_party/java_src/adsapi/opensource/examples/adwords_axis/src/main/java/adwords/axis/v201502/errorhandling/HandlePartialFailures.java:(%2525s):5669&l=131&gsn=%25s>' has occurred.\n", apiError <https://codesearch.corp.google.com/#piper///depot/google3/third_party/java_src/adsapi/opensource/examples/adwords_axis/src/main/java/adwords/axis/v201502/errorhandling/HandlePartialFailures.java&ct=xref_jump_to_def&cl=GROK&l=121&gsn=apiError>.getErrorString <https://codesearch.corp.google.com/#piper///depot/google3/blaze-out/gcc-4.X.Y-crosstool-v18-hybrid-grtev4-k8-fastbuild/genfiles/third_party/java_src/adsapi/java/com/google/api/ads/adwords/axis/libadwords_axis_generated.srcjar.files/com/google/api/ads/adwords/axis/v201502/cm/ApiError.java&ct=xref_jump_to_def&cl=GROK&l=96&gsn=getErrorString>()); } } Happy coding! Nadine, AdWords API Team On Thursday, April 2, 2015 at 10:11:47 AM UTC-4, pcj wrote: > > Hi > > I am developing app in java where I need to Add Campaigns within those > Campaigns AdGroups, and for those AdGroups their repesctive keywords. So fo > adding Ad Group we need Campaign ID, and for adding keywords need AdGroup > ID. > > So for now I am doing like this : > > First Adding Batch of Campiagns like below : > CampaignOperation[] campaignOperations = new CampaignOperation[ ] { > cOp1, cOp2, cOp3}; > // Add campaigns. > CampaignReturnValue addResult = > campaignService.mutate(campaignOperations); > > // Retriving IDs for added campians > > Then I Add AdGroups To Respective Campaigns using Campaign IDs I got, as > below : > > AdGroupOperation[] adAdGroupsOperations = new AdGroupOperation[] { > cOp1AdGrp1, cOp1AdGrp2, cOp1AdGrp3, cOp2AdGrp1, cOp2AdGrp2, > cOp3AdGrp1,}; > > // Add ad groups. > AdGroupReturnValue result = > adGroupService.mutate(adAdGroupsOperations); > > // I retriev Group IDs here > > Then I Add Keywords To Respective AdGroups using AdGroup IDs I got, as > below : > > AdGroupCriterionOperation[] keywordsOperations = new > AdGroupCriterionOperation[ cOp1AdGrp1KeywrdOp1, > cOp1AdGrp1KeywrdOp1, .................., cOp[N]AdGrp[N]KeywrdOp[N]; > > // Add keywords. > AdGroupCriterionReturnValue result = adGroupCriterionService > .mutate(keywordsOperations); > > Above code will do like : > > 1] Adds Campaigns, > 2] Adds AdGroups to respective Campaigns, > 3] Adds Keywords to Respective AdGroups, > > Now my problem is that if any of these fails I need to roll back, > Is there any way to rollback changes made by perticular session > > > OR > > Is there any way that I can do like this : > 1] Create nested operations > > mainOperation { > CampaignOperation1 { > AdGroupOperation1, { > KeywordOperation1, > KeywordOperation2, > } > AdGroupOperation2, { > KeywordOperation1, > KeywordOperation2, > } > AdGroupOperation3, { > KeywordOperation1, > KeywordOperation2, > } > AdGroupOperation4, { > KeywordOperation1, > KeywordOperation2, > } > }, > CampaignOperation1 { > AdGroupOperation1, { > KeywordOperation1, > KeywordOperation2, > } > AdGroupOperation2, { > KeywordOperation1, > KeywordOperation2, > } > AdGroupOperation3, { > KeywordOperation1, > KeywordOperation2, > } > AdGroupOperation4, { > KeywordOperation1, > KeywordOperation2, > } > } > } > > 2] And then add these operations in single batch. > > > Is this possible, and how ? > > > -- -- =~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~ Also find us on our blog and Google+: https://googleadsdeveloper.blogspot.com/ https://plus.google.com/+GoogleAdsDevelopers/posts =~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~ You received this message because you are subscribed to the Google Groups "AdWords API Forum" group. To post to this group, send email to adwords-api@googlegroups.com To unsubscribe from this group, send email to adwords-api+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/adwords-api?hl=en --- You received this message because you are subscribed to the Google Groups "AdWords API Forum" group. To unsubscribe from this group and stop receiving emails from it, send an email to adwords-api+unsubscr...@googlegroups.com. Visit this group at http://groups.google.com/group/adwords-api. To view this discussion on the web visit https://groups.google.com/d/msgid/adwords-api/0670870a-cef7-4b12-b638-ef88c7324773%40googlegroups.com. For more options, visit https://groups.google.com/d/optout.