The code samples below provide examples for managing campaigns using the AdWords API. Client Library.
Add a campaign group and set its performance target
' Copyright 2018 Google LLC ' ' Licensed under the Apache License, Version 2.0 (the "License") ' you may not use this file except in compliance with the License. ' You may obtain a copy of the License at ' ' http://www.apache.org/licenses/LICENSE-2.0 ' ' Unless required by applicable law or agreed to in writing, software ' distributed under the License is distributed on an "AS IS" BASIS, ' WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ' See the License for the specific language governing permissions and ' limitations under the License. Imports Google.Api.Ads.AdWords.Lib Imports Google.Api.Ads.AdWords.v201809 Namespace Google.Api.Ads.AdWords.Examples.VB.v201809 ''' <summary> ''' This code example adds a campaign group and sets a performance target for that group. To ''' get campaigns, run GetCampaigns.vb. To download reports, run ''' DownloadCriteriaReportWithAwql.vb. ''' </summary> Public Class AddCampaignGroupsAndPerformanceTargets Inherits ExampleBase ''' <summary> ''' Main method, to run this code example as a standalone application. ''' </summary> ''' <param name="args">The command line arguments.</param> Public Shared Sub Main(ByVal args As String()) Dim codeExample As New AddCampaignGroupsAndPerformanceTargets Console.WriteLine(codeExample.Description) Try Dim campaignId1 As Long = Long.Parse("INSERT_CAMPAIGN_ID1_HERE") Dim campaignId2 As Long = Long.Parse("INSERT_CAMPAIGN_ID2_HERE") codeExample.Run(New AdWordsUser, campaignId1, campaignId2) Catch e As Exception Console.WriteLine("An exception occurred while running this code example. {0}", ExampleUtilities.FormatException(e)) End Try End Sub ''' <summary> ''' Returns a description about the code example. ''' </summary> Public Overrides ReadOnly Property Description() As String Get Return _ "This code example adds a campaign group and sets a performance target for " & "that group. To get campaigns, run GetCampaigns.vb. To download reports, run" & " DownloadCriteriaReportWithAwql.vb." End Get End Property ''' <summary> ''' Runs the code example. ''' </summary> ''' <param name="user">The AdWords user.</param> ''' <param name="campaignId1">Id of the campaign to be added to the campaign group.</param> ''' <param name="campaignId2">Id of the campaign to be added to the campaign group.</param> Public Sub Run(ByVal user As AdWordsUser, ByVal campaignId1 As Long, ByVal campaignId2 As Long) Dim campaignGroup As CampaignGroup = CreateCampaignGroup(user) AddCampaignsToGroup(user, campaignGroup.id, New Long() {campaignId1, campaignId2}) CreatePerformanceTarget(user, campaignGroup.id) Console.WriteLine("Campaign group and its performance target were setup successfully.") End Sub ''' <summary> ''' Create a campaign group. ''' </summary> ''' <param name="user">The AdWords user.</param> ''' <returns>The campaign group.</returns> Private Function CreateCampaignGroup(ByVal user As AdWordsUser) As CampaignGroup Using campaignGroupService As CampaignGroupService = CType( user.GetService( AdWordsService.v201809.CampaignGroupService), CampaignGroupService) ' Create the campaign group. Dim campaignGroup As New CampaignGroup() campaignGroup.name = "Mars campaign group - " + ExampleUtilities.GetShortRandomString() ' Create the operation. Dim operation As New CampaignGroupOperation() operation.operand = campaignGroup operation.operator = [Operator].ADD Try Dim retval As CampaignGroupReturnValue = campaignGroupService.mutate( New CampaignGroupOperation() {operation}) ' Display the results. Dim newCampaignGroup As CampaignGroup = retval.value(0) Console.WriteLine("Campaign group with ID = '{0}' and name = '{1}' was " & "created.", newCampaignGroup.id, newCampaignGroup.name) Return newCampaignGroup Catch e As Exception Throw New System.ApplicationException("Failed to add campaign group.", e) End Try End Using End Function ''' <summary> ''' Adds multiple campaigns to a campaign group. ''' </summary> ''' <param name="user">The AdWords user.</param> ''' <param name="campaignGroupId">The campaign group ID.</param> ''' <param name="campaignIds">IDs of the campaigns to be added to the campaign group. ''' </param> Private Sub AddCampaignsToGroup(ByVal user As AdWordsUser, ByVal campaignGroupId As Long, ByVal campaignIds() As Long) Using campaignService As CampaignService = CType( user.GetService( AdWordsService.v201809.CampaignService), CampaignService) Dim operations As New List(Of CampaignOperation) For i As Integer = 0 To campaignIds.Length - 1 Dim campaign As New Campaign() campaign.id = campaignIds(i) campaign.campaignGroupId = campaignGroupId Dim operation As New CampaignOperation() operation.operand = campaign operation.operator = [Operator].SET operations.Add(operation) Next Try Dim retval As CampaignReturnValue = campaignService.mutate(operations.ToArray()) Dim updatedCampaignIds As New List(Of Long)() For Each updatedCampaign As Campaign In retval.value updatedCampaignIds.Add(updatedCampaign.id) Next ' Display the results. Console.WriteLine( "The following campaign IDs were added to the campaign group " + "with ID '{0}':\n\t{1}'", campaignGroupId, String.Join(", ", campaignIds)) Catch e As Exception Throw New _ System.ApplicationException("Failed to add campaigns to campaign group.", e) End Try End Using End Sub ''' <summary> ''' Creates a performance target for the campaign group. ''' </summary> ''' <param name="user">The AdWords user.</param> ''' <param name="campaignGroupId">Campaign group ID.</param> ''' <returns>The newly created performance target.</returns> Private Function CreatePerformanceTarget(ByVal user As AdWordsUser, ByVal campaignGroupId As Long) _ As CampaignGroupPerformanceTarget Using campaignGroupPerformanceTargetService As CampaignGroupPerformanceTargetService = CType(user.GetService(AdWordsService.v201809.CampaignGroupPerformanceTargetService), CampaignGroupPerformanceTargetService) ' Create the performance target. Dim campaignGroupPerformanceTarget As New CampaignGroupPerformanceTarget() campaignGroupPerformanceTarget.campaignGroupId = campaignGroupId Dim performanceTarget As New PerformanceTarget() ' Keep the CPC for the campaigns <$3. performanceTarget.efficiencyTargetType = EfficiencyTargetType.CPC_LESS_THAN_OR_EQUAL_TO performanceTarget.efficiencyTargetValue = 3000000 ' Keep the maximum spend under $50. performanceTarget.spendTargetType = SpendTargetType.MAXIMUM Dim maxSpend As New Money() maxSpend.microAmount = 500000000 performanceTarget.spendTarget = maxSpend ' Aim for at least 3000 clicks. performanceTarget.volumeTargetValue = 3000 performanceTarget.volumeGoalType = VolumeGoalType.MAXIMIZE_CLICKS ' Start the performance target today, And run it for the next 90 days. Dim startDate As System.DateTime = System.DateTime.Now Dim endDate As System.DateTime = startDate.AddDays(90) performanceTarget.startDate = startDate.ToString("yyyyMMdd") performanceTarget.endDate = endDate.ToString("yyyyMMdd") campaignGroupPerformanceTarget.performanceTarget = performanceTarget ' Create the operation. Dim operation As New CampaignGroupPerformanceTargetOperation() operation.operand = campaignGroupPerformanceTarget operation.operator = [Operator].ADD Try Dim retval As CampaignGroupPerformanceTargetReturnValue = campaignGroupPerformanceTargetService.mutate( New CampaignGroupPerformanceTargetOperation() {operation}) ' Display the results. Dim newCampaignPerfTarget As CampaignGroupPerformanceTarget = retval.value(0) Console.WriteLine("Campaign performance target with id = '{0}' was added for " + "campaign group ID '{1}'.", newCampaignPerfTarget.id, newCampaignPerfTarget.campaignGroupId) Return newCampaignPerfTarget Catch e As Exception Throw _ New System.ApplicationException( "Failed to create campaign performance target.", e) End Try End Using End Function End Class End Namespace
Add a label to multiple campaigns
' Copyright 2018 Google LLC ' ' Licensed under the Apache License, Version 2.0 (the "License"); ' you may not use this file except in compliance with the License. ' You may obtain a copy of the License at ' ' http://www.apache.org/licenses/LICENSE-2.0 ' ' Unless required by applicable law or agreed to in writing, software ' distributed under the License is distributed on an "AS IS" BASIS, ' WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ' See the License for the specific language governing permissions and ' limitations under the License. Imports Google.Api.Ads.AdWords.Lib Imports Google.Api.Ads.AdWords.v201809 Namespace Google.Api.Ads.AdWords.Examples.VB.v201809 ''' <summary> ''' This code example adds a label to multiple campaigns. ''' </summary> Public Class AddCampaignLabels Inherits ExampleBase ''' <summary> ''' Main method, to run this code example as a standalone application. ''' </summary> ''' <param name="args">The command line arguments.</param> Public Shared Sub Main(ByVal args As String()) Dim codeExample As New AddCampaignLabels Console.WriteLine(codeExample.Description) Try Dim campaignId1 As Long = Long.Parse("INSERT_CAMPAIGN_ID1_HERE") Dim campaignId2 As Long = Long.Parse("INSERT_CAMPAIGN_ID2_HERE") Dim labelId As Long = Long.Parse("INSERT_LABEL_ID_HERE") codeExample.Run(New AdWordsUser, campaignId1, campaignId2, labelId) Catch e As Exception Console.WriteLine("An exception occurred while running this code example. {0}", ExampleUtilities.FormatException(e)) End Try End Sub ''' <summary> ''' Returns a description about the code example. ''' </summary> Public Overrides ReadOnly Property Description() As String Get Return "This code example adds a label to multiple campaigns." End Get End Property ''' <summary> ''' Runs the code example. ''' </summary> ''' <param name="user">The AdWords user.</param> ''' <param name="campaignId1">Id of the campaign to which labels are ''' added.</param> ''' <param name="campaignId2">Id of the ad group to which labels are ''' added.</param> ''' <param name="labelId">ID of the label to apply.</param> Public Sub Run(ByVal user As AdWordsUser, ByVal campaignId1 As Long, ByVal campaignId2 As Long, ByVal labelId As Long) Using campaignService As CampaignService = CType( user.GetService( AdWordsService.v201809.CampaignService), CampaignService) ' Create label operations. Dim operations As New List(Of CampaignLabelOperation) For Each campaignId As Long In New Long() {campaignId1, campaignId2} Dim campaignLabel As New CampaignLabel campaignLabel.campaignId = campaignId campaignLabel.labelId = labelId Dim operation As New CampaignLabelOperation operation.operand = campaignLabel operation.operator = [Operator].ADD operations.Add(operation) Next Try Dim retval As CampaignLabelReturnValue = campaignService.mutateLabel( operations.ToArray()) ' Display campaign labels. If Not (retval Is Nothing) AndAlso Not (retval.value Is Nothing) Then For Each newCampaignLabel As CampaignLabel In retval.value Console.WriteLine( "Campaign label for campaign ID {0} and label ID {1} was added.\n", newCampaignLabel.campaignId, newCampaignLabel.labelId) Next Else Console.WriteLine("No campaign labels were added.") End If Catch e As Exception Throw New System.ApplicationException("Failed to add campaign labels.", e) End Try End Using End Sub End Class End Namespace
Add a campaign using BatchJobService
' Copyright 2018 Google LLC ' ' Licensed under the Apache License, Version 2.0 (the "License"); ' you may not use this file except in compliance with the License. ' You may obtain a copy of the License at ' ' http://www.apache.org/licenses/LICENSE-2.0 ' ' Unless required by applicable law or agreed to in writing, software ' distributed under the License is distributed on an "AS IS" BASIS, ' WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ' See the License for the specific language governing permissions and ' limitations under the License. Imports System.Threading Imports Google.Api.Ads.AdWords.Lib Imports Google.Api.Ads.AdWords.Util.BatchJob.v201809 Imports Google.Api.Ads.AdWords.v201809 Namespace Google.Api.Ads.AdWords.Examples.VB.v201809 ''' <summary> ''' This code example illustrates how to use BatchJobService to create multiple ''' complete campaigns, including ad groups and keywords. ''' </summary> Public Class AddCompleteCampaignsUsingBatchJob Inherits ExampleBase ''' <summary> ''' The last ID that was automatically generated. ''' </summary> Private Shared LAST_ID As Long = - 1 ''' <summary> ''' The number of campaigns to be added. ''' </summary> Private Const NUMBER_OF_CAMPAIGNS_TO_ADD As Long = 2 ''' <summary> ''' The number of ad groups to be added per campaign. ''' </summary> Private Const NUMBER_OF_ADGROUPS_TO_ADD As Long = 2 ''' <summary> ''' The number of keywords to be added per campaign. ''' </summary> Private Const NUMBER_OF_KEYWORDS_TO_ADD As Long = 5 ''' <summary> ''' The maximum milliseconds to wait for completion. ''' </summary> Private Const TIME_TO_WAIT_FOR_COMPLETION As Integer = 15*60*1000 ' 15 minutes ''' <summary> ''' Create a temporary ID generator that will produce a sequence of descending ''' negative numbers. ''' </summary> ''' <returns></returns> Private Shared Function NextId() As Long Return Interlocked.Decrement(LAST_ID) End Function ''' <summary> ''' Main method, to run this code example as a standalone application. ''' </summary> ''' <param name="args">The command line arguments.</param> Public Shared Sub Main(ByVal args As String()) Dim codeExample As New AddCompleteCampaignsUsingBatchJob Console.WriteLine(codeExample.Description) Try codeExample.Run(New AdWordsUser) Catch e As Exception Console.WriteLine("An exception occurred while running this code example. {0}", ExampleUtilities.FormatException(e)) End Try End Sub ''' <summary> ''' Returns a description about the code example. ''' </summary> Public Overrides ReadOnly Property Description() As String Get Return _ "This code example illustrates how to use BatchJobService to create multiple" & " complete campaigns, including ad groups and keywords." End Get End Property ''' <summary> ''' Runs the code example. ''' </summary> ''' <param name="user">The AdWords user.</param> Public Sub Run(ByVal user As AdWordsUser) Using batchJobService As BatchJobService = CType( user.GetService( AdWordsService.v201809.BatchJobService), BatchJobService) Try ' Create a BatchJob. Dim addOp As New BatchJobOperation() addOp.operator = [Operator].ADD addOp.operand = New BatchJob() Dim batchJob As BatchJob = batchJobService.mutate( New BatchJobOperation() {addOp}).value(0) ' Get the upload URL from the new job. Dim uploadUrl As String = batchJob.uploadUrl.url Console.WriteLine( "Created BatchJob with ID {0}, status '{1}' and upload URL {2}.", batchJob.id, batchJob.status, batchJob.uploadUrl.url) ' Create the mutate request that will be sent to the upload URL. Dim operations As New List(Of Operation)() ' Create and add an operation to create a new budget. Dim budgetOperation As BudgetOperation = BuildBudgetOperation() operations.Add(budgetOperation) ' Create and add operations to create new campaigns. Dim campaignOperations As List(Of CampaignOperation) = BuildCampaignOperations(budgetOperation.operand.budgetId) operations.AddRange(campaignOperations.ToArray()) Dim adGroupOperations As New List(Of AdGroupOperation)() ' Create and add operations to create new ad groups. For Each campaignOperation As CampaignOperation In campaignOperations adGroupOperations.AddRange( BuildAdGroupOperations(campaignOperation.operand.id)) Next operations.AddRange(adGroupOperations.ToArray()) ' Create and add operations to create new ad group ads (expanded text ads). For Each adGroupOperation As AdGroupOperation In adGroupOperations operations.AddRange( BuildAdGroupAdOperations(adGroupOperation.operand.id).ToArray()) Next ' Create and add operations to create new ad group criteria (keywords). For Each adGroupOperation As AdGroupOperation In adGroupOperations operations.AddRange(BuildAdGroupCriterionOperations( adGroupOperation.operand.id).ToArray()) Next Dim batchJobUploadHelper As New BatchJobUtilities(user) ' Create a resumable Upload URL to upload the operations. Dim resumableUploadUrl As String = batchJobUploadHelper.GetResumableUploadUrl(uploadUrl) ' Use the BatchJobUploadHelper to upload all operations. batchJobUploadHelper.Upload(resumableUploadUrl, operations.ToArray()) Dim waitHandler As WaitHandler ' Create a wait handler. waitHandler = New WaitHandler(batchJob, False) Dim isComplete As Boolean = batchJobUploadHelper.WaitForPendingJob( batchJob.id, TIME_TO_WAIT_FOR_COMPLETION, AddressOf waitHandler.OnJobWaitForCompletion) ' Restore the latest value for batchJob from waithandler. batchJob = waitHandler.Job If Not isComplete Then Throw _ New TimeoutException( "Job is still in pending state after waiting for " & TIME_TO_WAIT_FOR_COMPLETION & " seconds.") End If If Not (batchJob.processingErrors Is Nothing) Then For Each processingError As BatchJobProcessingError In _ batchJob.processingErrors Console.WriteLine(" Processing error: {0}, {1}, {2}, {3}, {4}", processingError.ApiErrorType, processingError.trigger, processingError.errorString, processingError.fieldPath, processingError.reason) Next End If If (Not (batchJob.downloadUrl Is Nothing)) AndAlso (Not (batchJob.downloadUrl.url Is Nothing)) Then Dim mutateResponse As BatchJobMutateResponse = batchJobUploadHelper.Download(batchJob.downloadUrl.url) Console.WriteLine("Downloaded results from {0}.", batchJob.downloadUrl.url) For Each mutateResult As MutateResult In mutateResponse.rval Dim outcome As String = "" If mutateResult.errorList Is Nothing Then outcome = "SUCCESS" Else outcome = "FAILURE" End If Console.WriteLine(" Operation [{0}] - {1}", mutateResult.index, outcome) Next End If Catch e As Exception Throw _ New System.ApplicationException("Failed to add campaigns using batch job.", e) End Try End Using End Sub ''' <summary> ''' A class that handles wait callbacks for the batch job. ''' </summary> Class WaitHandler ''' <summary> ''' The batch job to wait for. ''' </summary> Private batchJob As BatchJob ''' <summary> ''' A flag to determine if the job was requested to be cancelled. This ''' typically comes from the user. ''' </summary> Private cancelRequested As Boolean ''' <summary> ''' Initializes a new instance of the <see cref="WaitHandler"/> class. ''' </summary> ''' <param name="batchJob">The batch job to wait for.</param> ''' <param name="wasCancelRequested">A flag to determine if the job was ''' requested to be cancelled. This typically comes from the user.</param> Sub New(ByVal batchJob As BatchJob, ByVal wasCancelRequested As Boolean) Me.batchJob = batchJob Me.WasCancelRequested = wasCancelRequested End Sub ''' <summary> ''' Gets or sets the batch job to wait for. ''' </summary> Public Property Job As BatchJob Get Return Me.batchJob End Get Set(value As BatchJob) Me.batchJob = value End Set End Property ''' <summary> ''' Gets or sets a flag to determine if the job was requested to be ''' cancelled. This typically comes from the user. ''' </summary> Public Property WasCancelRequested As Boolean Get Return Me.cancelRequested End Get Set(value As Boolean) Me.cancelRequested = value End Set End Property ''' <summary> ''' Callback method when the job is waiting for cancellation. ''' </summary> ''' <param name="waitBatchJob">The updated batch job being waited for.</param> ''' <param name="timeElapsed">The time elapsed.</param> ''' <returns>True, if the wait loop should be cancelled, false otherwise. '''</returns> Public Function OnJobWaitForCancellation(ByVal waitBatchJob As BatchJob, ByVal timeElapsed As Long) As Boolean Console.WriteLine("[{0} seconds]: Batch job ID {1} has status '{2}'.", timeElapsed/1000, waitBatchJob.id, waitBatchJob.status) batchJob = waitBatchJob Return False End Function ''' <summary> ''' Callback method when the job is waiting for completion. ''' </summary> ''' <param name="waitBatchJob">The updated batch job being waited for.</param> ''' <param name="timeElapsed">The time elapsed.</param> ''' <returns>True, if the wait loop should be cancelled, false otherwise. '''</returns> Public Function OnJobWaitForCompletion(ByVal waitBatchJob As BatchJob, ByVal timeElapsed As Long) As Boolean Console.WriteLine("[{0} seconds]: Batch job ID {1} has status '{2}'.", timeElapsed/1000, waitBatchJob.id, waitBatchJob.status) batchJob = waitBatchJob Return Me.WasCancelRequested End Function End Class ''' <summary> ''' Builds the operation for creating an ad within an ad group. ''' </summary> ''' <param name="adGroupId">ID of the ad group for which ads are created.</param> ''' <returns>A list of operations for creating ads.</returns> Private Shared Function BuildAdGroupAdOperations(ByVal adGroupId As Long) _ As List(Of AdGroupAdOperation) Dim operations As New List(Of AdGroupAdOperation)() Dim adGroupAd As New AdGroupAd() adGroupAd.adGroupId = adGroupId Dim expandedTextAd As New ExpandedTextAd expandedTextAd.headlinePart1 = "Luxury Cruise to Mars" expandedTextAd.headlinePart2 = "Visit the Red Planet in style." expandedTextAd.description = "Low-gravity fun for everyone!" expandedTextAd.finalUrls = New String() {"http://www.example.com/1"} adGroupAd.ad = expandedTextAd Dim operation As New AdGroupAdOperation() operation.operand = adGroupAd operation.operator = [Operator].ADD operations.Add(operation) Return operations End Function ''' <summary> ''' Builds the operations for creating keywords within an ad group. ''' </summary> ''' <param name="adGroupId">ID of the ad group for which keywords are ''' created.</param> ''' <returns>A list of operations for creating keywords.</returns> Private Shared Function BuildAdGroupCriterionOperations(ByVal adGroupId As Long) _ As List(Of AdGroupCriterionOperation) Dim adGroupCriteriaOperations As New List(Of AdGroupCriterionOperation)() ' Create AdGroupCriterionOperations to add keywords. For i As Integer = 0 To NUMBER_OF_KEYWORDS_TO_ADD ' Create Keyword. Dim text As String = String.Format("mars{0}", i) ' Make 50% of keywords invalid to demonstrate error handling. If (i Mod 2) = 0 Then text = text & "!!!" End If ' Create AdGroupCriterionOperation. Dim operation As New AdGroupCriterionOperation() operation.operand = New BiddableAdGroupCriterion() operation.operand.adGroupId = adGroupId Dim keyword As New Keyword keyword.text = text keyword.matchType = KeywordMatchType.BROAD operation.operand.criterion = keyword operation.operator = [Operator].ADD ' Add to list. adGroupCriteriaOperations.Add(operation) Next Return adGroupCriteriaOperations End Function ''' <summary> ''' Builds the operations for creating ad groups within a campaign. ''' </summary> ''' <param name="campaignId">ID of the campaign for which ad groups are ''' created.</param> ''' <returns>A list of operations for creating ad groups.</returns> Private Shared Function BuildAdGroupOperations(ByVal campaignId As Long) As _ List(Of AdGroupOperation) Dim operations As New List(Of AdGroupOperation)() For i As Integer = 0 To NUMBER_OF_ADGROUPS_TO_ADD Dim adGroup As New AdGroup() adGroup.campaignId = campaignId adGroup.id = NextId() adGroup.name = "Batch Ad Group # " & ExampleUtilities.GetRandomString() Dim cpcBid As New CpcBid cpcBid.bid = New Money() cpcBid.bid.microAmount = 10000000L Dim biddingStrategyConfiguration As New BiddingStrategyConfiguration() biddingStrategyConfiguration.bids = New Bids() {cpcBid} adGroup.biddingStrategyConfiguration = biddingStrategyConfiguration Dim operation As New AdGroupOperation() operation.operand = adGroup operation.operator = [Operator].ADD operations.Add(operation) Next Return operations End Function ''' <summary> ''' Builds the operations for creating new campaigns. ''' </summary> ''' <param name="budgetId">ID of the budget to be used for the campaign. ''' </param> ''' <returns>A list of operations for creating campaigns.</returns> Private Shared Function BuildCampaignOperations(ByVal budgetId As Long) _ As List(Of CampaignOperation) Dim operations As New List(Of CampaignOperation)() For i As Integer = 0 To NUMBER_OF_CAMPAIGNS_TO_ADD Dim campaign As New Campaign() campaign.name = "Batch Campaign " + ExampleUtilities.GetRandomString() ' Recommendation: Set the campaign to PAUSED when creating it to prevent ' the ads from immediately serving. Set to ENABLED once you've added ' targeting and the ads are ready to serve. campaign.status = CampaignStatus.PAUSED campaign.id = NextId() campaign.advertisingChannelType = AdvertisingChannelType.SEARCH Dim budget As New Budget() budget.budgetId = budgetId campaign.budget = budget Dim biddingStrategyConfiguration As New BiddingStrategyConfiguration() biddingStrategyConfiguration.biddingStrategyType = BiddingStrategyType.MANUAL_CPC ' You can optionally provide a bidding scheme in place of the type. Dim biddingScheme As New ManualCpcBiddingScheme() biddingStrategyConfiguration.biddingScheme = biddingScheme campaign.biddingStrategyConfiguration = biddingStrategyConfiguration Dim operation As New CampaignOperation() operation.operand = campaign operation.operator = [Operator].ADD operations.Add(operation) Next Return operations End Function ''' <summary> ''' Builds an operation for creating a budget. ''' </summary> ''' <returns>The operation for creating a budget.</returns> Private Shared Function BuildBudgetOperation() As BudgetOperation Dim budget As New Budget() budget.budgetId = NextId() budget.name = "Interplanetary Cruise #" & ExampleUtilities.GetRandomString() Dim amount As New Money() amount.microAmount = 50000000L budget.amount = amount budget.deliveryMethod = BudgetBudgetDeliveryMethod.STANDARD Dim budgetOperation As New BudgetOperation() budgetOperation.operand = budget budgetOperation.operator = [Operator].ADD Return budgetOperation End Function End Class End Namespace
Create a draft and access its campaign
' Copyright 2018 Google LLC ' ' Licensed under the Apache License, Version 2.0 (the "License"); ' you may not use this file except in compliance with the License. ' You may obtain a copy of the License at ' ' http://www.apache.org/licenses/LICENSE-2.0 ' ' Unless required by applicable law or agreed to in writing, software ' distributed under the License is distributed on an "AS IS" BASIS, ' WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ' See the License for the specific language governing permissions and ' limitations under the License. Imports Google.Api.Ads.AdWords.Lib Imports Google.Api.Ads.AdWords.v201809 Namespace Google.Api.Ads.AdWords.Examples.VB.v201809 ''' <summary> ''' This code example illustrates how to create a draft and access its ''' associated draft campaign. See the Campaign Drafts and Experiments guide ''' for more information: ''' https://developers.google.com/adwords/api/docs/guides/campaign-drafts-experiments ''' </summary> Public Class AddDraft Inherits ExampleBase ''' <summary> ''' Main method, to run this code example as a standalone application. ''' </summary> ''' <param name="args">The command line arguments.</param> Public Shared Sub Main(ByVal args As String()) Dim codeExample As New AddDraft Console.WriteLine(codeExample.Description) Try Dim baseCampaignId As Long = Long.Parse("INSERT_BASE_CAMPAIGN_ID_HERE") codeExample.Run(New AdWordsUser, baseCampaignId) Catch e As Exception Console.WriteLine("An exception occurred while running this code example. {0}", ExampleUtilities.FormatException(e)) End Try End Sub ''' <summary> ''' Returns a description about the code example. ''' </summary> Public Overrides ReadOnly Property Description() As String Get Return "This code example adds a label to multiple campaigns." End Get End Property ''' <summary> ''' Runs the code example. ''' </summary> ''' <param name="user">The AdWords user.</param> ''' <param name="baseCampaignId">Id of the base campaign for creating draft.</param> Public Sub Run(ByVal user As AdWordsUser, ByVal baseCampaignId As Long) Using draftService As DraftService = CType( user.GetService( AdWordsService.v201809.DraftService), DraftService) Dim draft As New Draft() draft.baseCampaignId = baseCampaignId draft.draftName = "Test Draft #" + ExampleUtilities.GetRandomString() Dim draftOperation As New DraftOperation() draftOperation.operator = [Operator].ADD draftOperation.operand = draft Try draft = draftService.mutate(New DraftOperation() {draftOperation}).value(0) Console.WriteLine( "Draft with ID {0}, base campaign ID {1} and draft campaign ID " & "{2} created.", draft.draftId, draft.baseCampaignId, draft.draftCampaignId) ' Once the draft is created, you can modify the draft campaign as if it ' were a real campaign. For example, you may add criteria, adjust bids, ' or even include additional ads. Adding a criterion is shown here. Dim campaignCriterionService As CampaignCriterionService = CType(user.GetService(AdWordsService.v201809.CampaignCriterionService), CampaignCriterionService) Dim language As New Language() language.id = 1003L ' Spanish ' Make sure to use the draftCampaignId when modifying the virtual draft ' campaign. Dim campaignCriterion As New CampaignCriterion() campaignCriterion.campaignId = draft.draftCampaignId campaignCriterion.criterion = language Dim criterionOperation As New CampaignCriterionOperation() criterionOperation.operator = [Operator].ADD criterionOperation.operand = campaignCriterion campaignCriterion = campaignCriterionService.mutate( New CampaignCriterionOperation() {criterionOperation}).value(0) Console.WriteLine("Draft updated to include criteria in draft campaign ID {0}.", draft.draftCampaignId) Catch e As Exception Throw _ New System.ApplicationException("Failed to create draft campaign and add " & "criteria.", e) End Try End Using End Sub End Class End Namespace
Upload keywords incrementally using BatchJobService
' Copyright 2018 Google LLC ' ' Licensed under the Apache License, Version 2.0 (the "License"); ' you may not use this file except in compliance with the License. ' You may obtain a copy of the License at ' ' http://www.apache.org/licenses/LICENSE-2.0 ' ' Unless required by applicable law or agreed to in writing, software ' distributed under the License is distributed on an "AS IS" BASIS, ' WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ' See the License for the specific language governing permissions and ' limitations under the License. Imports Google.Api.Ads.AdWords.Lib Imports Google.Api.Ads.AdWords.Util.BatchJob.v201809 Imports Google.Api.Ads.AdWords.v201809 Namespace Google.Api.Ads.AdWords.Examples.VB.v201809 ''' <summary> ''' This code sample illustrates how to perform asynchronous requests using ''' BatchJobService and incremental uploads of operations. It also ''' demonstrates how to cancel a running batch job. ''' </summary> Public Class AddKeywordsUsingIncrementalBatchJob Inherits ExampleBase Private Const NUMBER_OF_KEYWORDS_TO_ADD As Long = 100 ''' <summary> ''' The chunk size to use when uploading operations. ''' </summary> Private Const CHUNK_SIZE As Integer = 4*1024*1024 ''' <summary> ''' The maximum milliseconds to wait for completion. ''' </summary> Private Const TIME_TO_WAIT_FOR_COMPLETION As Integer = 15*60*1000 ' 15 minutes ''' <summary> ''' Main method, to run this code example as a standalone application. ''' </summary> ''' <param name="args">The command line arguments.</param> Public Shared Sub Main(ByVal args As String()) Dim codeExample As New AddKeywordsUsingIncrementalBatchJob Console.WriteLine(codeExample.Description) Try Dim adGroupId As Long = Long.Parse("INSERT_ADGROUP_ID_HERE") codeExample.Run(New AdWordsUser, adGroupId) Catch e As Exception Console.WriteLine("An exception occurred while running this code example. {0}", ExampleUtilities.FormatException(e)) End Try End Sub ''' <summary> ''' Returns a description about the code example. ''' </summary> Public Overrides ReadOnly Property Description() As String Get Return "This code sample illustrates how to perform asynchronous requests using " & "BatchJobService and incremental uploads of operations. It also " & "demonstrates how to cancel a running batch job." End Get End Property ''' <summary> ''' Runs the code example. ''' </summary> ''' <param name="user">The AdWords user.</param> ''' <param name="adGroupId">Id of the ad groups to which keywords are ''' added.</param> Public Sub Run(ByVal user As AdWordsUser, ByVal adGroupId As Long) Using batchJobService As BatchJobService = CType( user.GetService( AdWordsService.v201809.BatchJobService), BatchJobService) Dim addOp As New BatchJobOperation addOp.operator = [Operator].ADD addOp.operand = New BatchJob() Try Dim batchJob As BatchJob = batchJobService.mutate( New BatchJobOperation() {addOp}).value(0) Console.WriteLine( "Created BatchJob with ID {0}, status '{1}' and upload URL {2}.", batchJob.id, batchJob.status, batchJob.uploadUrl.url) Dim operations As List(Of AdGroupCriterionOperation) = CreateOperations(adGroupId) ' Create a BatchJobUtilities instance for uploading operations. Use a ' chunked upload. Dim batchJobUploadHelper As New BatchJobUtilities(user, True, CHUNK_SIZE) ' Create a resumable Upload URL to upload the operations. Dim resumableUploadUrl As String = batchJobUploadHelper.GetResumableUploadUrl( batchJob.uploadUrl.url) ' Use the BatchJobUploadHelper to upload all operations. batchJobUploadHelper.Upload(resumableUploadUrl, operations.ToArray()) Dim waitHandler As WaitHandler Dim wasCancelRequested As Boolean = False ' Create a wait handler. waitHandler = New WaitHandler(batchJob, wasCancelRequested) Dim isComplete As Boolean = batchJobUploadHelper.WaitForPendingJob( batchJob.id, TIME_TO_WAIT_FOR_COMPLETION, AddressOf waitHandler.OnJobWaitForCompletion) ' Restore the latest value for batchJob from waithandler. batchJob = waitHandler.Job wasCancelRequested = waitHandler.WasCancelRequested ' Optional: Cancel the job if it has not completed after waiting for ' TIME_TO_WAIT_FOR_COMPLETION. Dim shouldWaitForCancellation As Boolean = False If Not isComplete AndAlso wasCancelRequested Then Dim cancellationError As BatchJobError = Nothing Try batchJobUploadHelper.TryToCancelJob(batchJob.id) Catch e As AdWordsApiException cancellationError = GetBatchJobError(e) End Try If cancellationError Is Nothing Then Console.WriteLine("Successfully requested job cancellation.") shouldWaitForCancellation = True Else Console.WriteLine("Job cancellation failed. Error says: {0}.", cancellationError.reason) End If If shouldWaitForCancellation Then waitHandler = New WaitHandler(batchJob, wasCancelRequested) isComplete = batchJobUploadHelper.WaitForPendingJob( batchJob.id, TIME_TO_WAIT_FOR_COMPLETION, AddressOf waitHandler.OnJobWaitForCancellation) batchJob = waitHandler.Job wasCancelRequested = waitHandler.WasCancelRequested End If End If If Not isComplete Then Throw _ New TimeoutException( "Job is still in pending state after waiting for " & TIME_TO_WAIT_FOR_COMPLETION & " seconds.") End If If Not batchJob.processingErrors Is Nothing Then For Each processingError As BatchJobProcessingError In _ batchJob.processingErrors Console.WriteLine(" Processing error: {0}, {1}, {2}, {3}, {4}", processingError.ApiErrorType, processingError.trigger, processingError.errorString, processingError.fieldPath, processingError.reason) Next End If If (Not batchJob.downloadUrl Is Nothing) AndAlso (Not batchJob.downloadUrl.url Is Nothing) Then Dim mutateResponse As BatchJobMutateResponse = batchJobUploadHelper.Download( batchJob.downloadUrl.url) Console.WriteLine("Downloaded results from {0}.", batchJob.downloadUrl.url) For Each mutateResult As MutateResult In mutateResponse.rval Dim outcome As String If mutateResult.errorList Is Nothing Then outcome = "SUCCESS" Else outcome = "FAILURE" End If Console.WriteLine(" Operation [{0}] - {1}", mutateResult.index, outcome) Next Else Console.WriteLine("No results available for download.") End If Catch e As Exception Throw _ New System.ApplicationException( "Failed to create keywords using batch job.", e) End Try End Using End Sub ''' <summary> ''' A class that handles wait callbacks for the batch job. ''' </summary> Class WaitHandler ''' <summary> ''' The batch job to wait for. ''' </summary> Private batchJob As BatchJob ''' <summary> ''' A flag to determine if the job was requested to be cancelled. This ''' typically comes from the user. ''' </summary> Private cancelRequested As Boolean ''' <summary> ''' Initializes a new instance of the <see cref="WaitHandler"/> class. ''' </summary> ''' <param name="batchJob">The batch job to wait for.</param> ''' <param name="wasCancelRequested">A flag to determine if the job was ''' requested to be cancelled. This typically comes from the user.</param> Sub New(ByVal batchJob As BatchJob, ByVal wasCancelRequested As Boolean) Me.batchJob = batchJob Me.WasCancelRequested = wasCancelRequested End Sub ''' <summary> ''' Gets or sets the batch job to wait for. ''' </summary> Public Property Job As BatchJob Get Return Me.batchJob End Get Set(value As BatchJob) Me.batchJob = value End Set End Property ''' <summary> ''' Gets or sets a flag to determine if the job was requested to be ''' cancelled. This typically comes from the user. ''' </summary> Public Property WasCancelRequested As Boolean Get Return Me.cancelRequested End Get Set(value As Boolean) Me.cancelRequested = value End Set End Property ''' <summary> ''' Callback method when the job is waiting for cancellation. ''' </summary> ''' <param name="waitBatchJob">The updated batch job being waited for.</param> ''' <param name="timeElapsed">The time elapsed.</param> ''' <returns>True, if the wait loop should be cancelled, false otherwise. '''</returns> Public Function OnJobWaitForCancellation(ByVal waitBatchJob As BatchJob, ByVal timeElapsed As Long) As Boolean Console.WriteLine("[{0} seconds]: Batch job ID {1} has status '{2}'.", timeElapsed/1000, waitBatchJob.id, waitBatchJob.status) batchJob = waitBatchJob Return False End Function ''' <summary> ''' Callback method when the job is waiting for completion. ''' </summary> ''' <param name="waitBatchJob">The updated batch job being waited for.</param> ''' <param name="timeElapsed">The time elapsed.</param> ''' <returns>True, if the wait loop should be cancelled, false otherwise. '''</returns> Public Function OnJobWaitForCompletion(ByVal waitBatchJob As BatchJob, ByVal timeElapsed As Long) As Boolean Console.WriteLine("[{0} seconds]: Batch job ID {1} has status '{2}'.", timeElapsed/1000, waitBatchJob.id, waitBatchJob.status) batchJob = waitBatchJob Return Me.WasCancelRequested End Function End Class ''' <summary> ''' Gets the batch job error. ''' </summary> ''' <param name="e">The AdWords API Exception.</param> ''' <returns>The underlying batch job error if available, null otherwise.</returns> Private Function GetBatchJobError(ByVal e As AdWordsApiException) As BatchJobError Dim temp As List(Of BatchJobError) = TryCast(e.ApiException, ApiException). GetAllErrorsByType (Of BatchJobError)() If temp.Count = 0 Then Return Nothing Else Return temp(0) End If End Function ''' <summary> ''' Creates the operations for uploading via batch job. ''' </summary> ''' <param name="adGroupId">The ad group ID.</param> ''' <returns>The list of operations.</returns> Private Shared Function CreateOperations(ByVal adGroupId As Long) _ As List(Of AdGroupCriterionOperation) Dim operations As New List(Of AdGroupCriterionOperation) ' Create AdGroupCriterionOperations to add keywords, and upload every 10 operations ' incrementally. For i As Integer = 0 To NUMBER_OF_KEYWORDS_TO_ADD ' Create Keyword. Dim text As String = String.Format("mars{0}", i) ' Make 10% of keywords invalid to demonstrate error handling. If (i Mod 10) = 0 Then text = text + "!!!" End If ' Create BiddableAdGroupCriterion. Dim bagc As New BiddableAdGroupCriterion() bagc.adGroupId = adGroupId Dim keyword As New Keyword() keyword.text = text keyword.matchType = KeywordMatchType.BROAD bagc.criterion = keyword ' Create AdGroupCriterionOperation. Dim agco As New AdGroupCriterionOperation() agco.operand = bagc agco.operator = [Operator].ADD ' Add to the list of operations. operations.Add(agco) Next Return operations End Function End Class End Namespace
Create a trial
' Copyright 2018 Google LLC ' ' Licensed under the Apache License, Version 2.0 (the "License"); ' you may not use this file except in compliance with the License. ' You may obtain a copy of the License at ' ' http://www.apache.org/licenses/LICENSE-2.0 ' ' Unless required by applicable law or agreed to in writing, software ' distributed under the License is distributed on an "As IS" BASIS, ' WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ' See the License for the specific language governing permissions and ' limitations under the License. Imports System.Threading Imports Google.Api.Ads.AdWords.Lib Imports Google.Api.Ads.AdWords.v201809 Namespace Google.Api.Ads.AdWords.Examples.VB.v201809 ''' <summary> ''' This code example illustrates how to create a trial and wait for it to ''' complete. See the Campaign Drafts and Experiments guide for more ''' information: ''' https://developers.google.com/adwords/api/docs/guides/campaign-drafts-experiments ''' </summary> Public Class AddTrial Inherits ExampleBase ''' <summary> ''' The polling interval base to be used for exponential backoff. ''' </summary> Private Const POLL_INTERVAL_SECONDS_BASE As Integer = 30 ''' <summary> ''' The maximum number of retries. ''' </summary> Private Const MAX_RETRIES As Long = 5 ''' <summary> ''' Main method, to run this code example As a standalone application. ''' </summary> ''' <param name="args">The command line arguments.</param> Public Shared Sub Main(ByVal args As String()) Dim codeExample As New AddTrial Console.WriteLine(codeExample.Description) Try Dim draftId As Long = Long.Parse("INSERT_DRAFT_ID_HERE") Dim baseCampaignId As Long = Long.Parse("INSERT_BASE_CAMPAIGN_ID_HERE") codeExample.Run(New AdWordsUser(), draftId, baseCampaignId) Catch e As Exception Console.WriteLine("An exception occurred while running this code example. {0}", ExampleUtilities.FormatException(e)) End Try End Sub ''' <summary> ''' Returns a description about the code example. ''' </summary> Public Overrides ReadOnly Property Description() As String Get Return "This code example illustrates how to create a trial and wait for it to " & "complete. See the Campaign Drafts and Experiments guide for more " & "information: https://developers.google.com/adwords/api/docs/guides/campaign-drafts-experiments" End Get End Property ''' <summary> ''' Runs the code example. ''' </summary> ''' <param name="user">The AdWords user.</param> ''' <param name="baseCampaignId">Id of the campaign to use as base of the ''' trial.</param> ''' <param name="draftId">Id of the draft.</param> Public Sub Run(ByVal user As AdWordsUser, ByVal draftId As Long, ByVal baseCampaignId As Long) Using trialService As TrialService = CType( user.GetService( AdWordsService.v201809.TrialService), TrialService) Using trialAsyncErrorService As TrialAsyncErrorService = CType(user.GetService(AdWordsService.v201809.TrialAsyncErrorService), TrialAsyncErrorService) Dim newTrial As New Trial newTrial.draftId = draftId newTrial.baseCampaignId = baseCampaignId newTrial.name = "Test Trial #" & ExampleUtilities.GetRandomString() newTrial.trafficSplitPercent = 50 newTrial.trafficSplitType = CampaignTrialTrafficSplitType.RANDOM_QUERY Dim trialOperation As New TrialOperation() trialOperation.operator = [Operator].ADD trialOperation.operand = newTrial Try Dim trialId As Long = trialService.mutate( New TrialOperation() {trialOperation}).value(0).id ' Since creating a trial is asynchronous, we have to poll it to wait ' for it to finish. Dim trialSelector As New Selector() trialSelector.fields = New String() { _ Trial.Fields.Id, Trial.Fields.Status, Trial.Fields.BaseCampaignId, Trial.Fields.TrialCampaignId } trialSelector.predicates = New Predicate() { _ Predicate.Equals( Trial.Fields.Id, trialId) } newTrial = Nothing Dim isPending As Boolean = True Dim pollAttempts As Integer = 0 Do Dim sleepMillis As Integer = CType(Math.Pow(2, pollAttempts)* POLL_INTERVAL_SECONDS_BASE*1000, Integer) Console.WriteLine("Sleeping {0} millis...", sleepMillis) Thread.Sleep(sleepMillis) newTrial = trialService.get(trialSelector).entries(0) Console.WriteLine("Trial ID {0} has status '{1}'.", newTrial.id, newTrial.status) pollAttempts = pollAttempts + 1 isPending = (newTrial.status = TrialStatus.CREATING) Loop While isPending AndAlso (pollAttempts <= MAX_RETRIES) If newTrial.status = TrialStatus.ACTIVE Then ' The trial creation was successful. Console.WriteLine("Trial created with ID {0} and trial campaign " & "ID {1}.", newTrial.id, newTrial.trialCampaignId) ElseIf newTrial.status = TrialStatus.CREATION_FAILED Then ' The trial creation failed, and errors can be fetched from the ' TrialAsyncErrorService. Dim errorsSelector As New Selector() errorsSelector.fields = New String() { _ TrialAsyncError.Fields.TrialId, TrialAsyncError.Fields. AsyncError } errorsSelector.predicates = New Predicate() { _ Predicate.Equals(TrialAsyncError.Fields.TrialId, newTrial.id) } Dim trialAsyncErrorPage As TrialAsyncErrorPage = trialAsyncErrorService. get( errorsSelector) If trialAsyncErrorPage.entries Is Nothing OrElse trialAsyncErrorPage.entries.Length = 0 Then Console.WriteLine("Could not retrieve errors for trial {0}.", newTrial.id) Else Console.WriteLine( "Could not create trial ID {0} for draft ID {1} due to the " & "following errors:", trialId, draftId) Dim i As Integer = 1 For Each err As TrialAsyncError In trialAsyncErrorPage.entries Dim asyncError As ApiError = err.asyncError Console.WriteLine( "Error #{0}: errorType='{1}', errorString='{2}', " & "trigger='{3}', fieldPath='{4}'", i, asyncError.ApiErrorType, asyncError.errorString, asyncError.trigger, asyncError.fieldPath) i += 1 Next End If Else ' Most likely, the trial is still being created. You can continue ' polling, but we have limited the number of attempts in the ' example. Console.WriteLine( "Timed out waiting to create trial from draft ID {0} with " + "base campaign ID {1}.", draftId, baseCampaignId) End If Catch e As Exception Throw _ New System.ApplicationException("Failed to create trial from draft.", e) End Try End Using End Using End Sub End Class End Namespace
Get all disapproved ads in an ad group
' Copyright 2018 Google LLC ' ' Licensed under the Apache License, Version 2.0 (the "License"); ' you may not use this file except in compliance with the License. ' You may obtain a copy of the License at ' ' http://www.apache.org/licenses/LICENSE-2.0 ' ' Unless required by applicable law or agreed to in writing, software ' distributed under the License is distributed on an "AS IS" BASIS, ' WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ' See the License for the specific language governing permissions and ' limitations under the License. Imports Google.Api.Ads.AdWords.Lib Imports Google.Api.Ads.AdWords.v201809 Namespace Google.Api.Ads.AdWords.Examples.VB.v201809 ''' <summary> ''' This code example retrieves all the disapproved ads in a given campaign. ''' </summary> Public Class GetAllDisapprovedAds Inherits ExampleBase ''' <summary> ''' Main method, to run this code example as a standalone application. ''' </summary> ''' <param name="args">The command line arguments.</param> Public Shared Sub Main(ByVal args As String()) Dim codeExample As New GetAllDisapprovedAds Console.WriteLine(codeExample.Description) Try Dim campaignId As Long = Long.Parse("INSERT_CAMPAIGN_ID_HERE") codeExample.Run(New AdWordsUser, campaignId) Catch e As Exception Console.WriteLine("An exception occurred while running this code example. {0}", ExampleUtilities.FormatException(e)) End Try End Sub ''' <summary> ''' Returns a description about the code example. ''' </summary> Public Overrides ReadOnly Property Description() As String Get Return "This code example retrieves all the disapproved ads in a given campaign." End Get End Property ''' <summary> ''' Runs the code example. ''' </summary> ''' <param name="user">The AdWords user.</param> ''' <param name="campaignId">Id of the campaign for which disapproved ads ''' are retrieved.</param> Public Sub Run(ByVal user As AdWordsUser, ByVal campaignId As Long) Using service As AdGroupAdService = CType( user.GetService( AdWordsService.v201809.AdGroupAdService), AdGroupAdService) ' Create the selector. Dim selector As New Selector selector.fields = New String() { _ Ad.Fields.Id, AdGroupAd.Fields.PolicySummary } ' Set the filters. selector.predicates = New Predicate() { _ Predicate.Equals(AdGroup.Fields.CampaignId, campaignId), Predicate.Equals( AdGroupAdPolicySummary.Fields.CombinedApprovalStatus, PolicyApprovalStatus.DISAPPROVED.ToString()) } ' Set the selector paging. selector.paging = Paging.Default Dim page As New AdGroupAdPage Dim disapprovedAdsCount As Integer = 0 Try Do ' Get the disapproved ads. page = service.get(selector) ' Display the results. If Not (page Is Nothing) AndAlso Not (page.entries Is Nothing) Then For Each AdGroupAd As AdGroupAd In page.entries Dim policySummary As AdGroupAdPolicySummary = AdGroupAd.policySummary disapprovedAdsCount += 1 Console.WriteLine( "Ad with ID {0} and type '{1}' was disapproved with the " + "following policy topic entries: ", AdGroupAd.ad.id, AdGroupAd.ad.AdType) ' Display the policy topic entries related to the ad disapproval. For Each PolicyTopicEntry As PolicyTopicEntry In _ policySummary.policyTopicEntries Console.WriteLine(" topic id: {0}, topic name: '{1}'", PolicyTopicEntry.policyTopicId, PolicyTopicEntry.policyTopicName) ' Display the attributes And values that triggered the policy ' topic. If Not PolicyTopicEntry.policyTopicEvidences Is Nothing Then For Each evidence As PolicyTopicEvidence In _ PolicyTopicEntry.policyTopicEvidences Console.WriteLine(" evidence type: {0}", evidence.policyTopicEvidenceType) If Not evidence.evidenceTextList Is Nothing Then For i As Integer = 0 To _ evidence.evidenceTextList.Length Console.WriteLine( " evidence text[{0}]: {1}", i, evidence.evidenceTextList(i)) Next End If Next End If Next Next End If selector.paging.IncreaseOffset() Loop While selector.paging.startIndex < page.totalNumEntries Console.WriteLine("Number of disapproved ads found: {0}", disapprovedAdsCount) Catch e As Exception Throw New System.ApplicationException("Failed to get disapproved ads.", e) End Try End Using End Sub End Class End Namespace
Get all disapproved ads in an ad group using AWQL
' Copyright 2018 Google LLC ' ' Licensed under the Apache License, Version 2.0 (the "License"); ' you may not use this file except in compliance with the License. ' You may obtain a copy of the License at ' ' http://www.apache.org/licenses/LICENSE-2.0 ' ' Unless required by applicable law or agreed to in writing, software ' distributed under the License is distributed on an "AS IS" BASIS, ' WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ' See the License for the specific language governing permissions and ' limitations under the License. Imports Google.Api.Ads.AdWords.Lib Imports Google.Api.Ads.AdWords.Util.Reports.v201809 Imports Google.Api.Ads.AdWords.v201809 Namespace Google.Api.Ads.AdWords.Examples.VB.v201809 ''' <summary> ''' This code example retrieves all the disapproved ads in a given campaign ''' using an AWQL query. See ''' https://developers.google.com/adwords/api/docs/guides/awql for AWQL ''' documentation. ''' </summary> Public Class GetAllDisapprovedAdsWithAwql Inherits ExampleBase ''' <summary> ''' Main method, to run this code example as a standalone application. ''' </summary> ''' <param name="args">The command line arguments.</param> Public Shared Sub Main(ByVal args As String()) Dim codeExample As New GetAllDisapprovedAdsWithAwql Console.WriteLine(codeExample.Description) Try Dim campaignId As Long = Long.Parse("INSERT_CAMPAIGN_ID_HERE") codeExample.Run(New AdWordsUser, campaignId) Catch e As Exception Console.WriteLine("An exception occurred while running this code example. {0}", ExampleUtilities.FormatException(e)) End Try End Sub ''' <summary> ''' Returns a description about the code example. ''' </summary> Public Overrides ReadOnly Property Description() As String Get Return "This code example retrieves all the disapproved ads in a given campaign " & "using an AWQL query. " & "See https://developers.google.com/adwords/api/docs/guides/awql for " & "AWQL documentation." End Get End Property ''' <summary> ''' Runs the code example. ''' </summary> ''' <param name="user">The AdWords user.</param> ''' <param name="campaignId">Id of the campaign for which disapproved ads ''' are retrieved.</param> Public Sub Run(ByVal user As AdWordsUser, ByVal campaignId As Long) Using service As AdGroupAdService = CType( user.GetService( AdWordsService.v201809.AdGroupAdService), AdGroupAdService) ' Get all the disapproved ads for this campaign. Dim query As SelectQuery = New SelectQueryBuilder() _ .Select(Ad.Fields.Id, AdGroupAd.Fields.PolicySummary) _ .Where(AdGroup.Fields.CampaignId).Equals(campaignId) _ .Where(AdGroupAdPolicySummary.Fields.CombinedApprovalStatus) _ .Equals(ApprovalStatus.DISAPPROVED.ToString()) _ .OrderByAscending(Ad.Fields.Id) _ .DefaultLimit() _ .Build() Dim page As New AdGroupAdPage() Dim disapprovedAdsCount As Integer = 0 Try Do ' Get the disapproved ads. page = service.query(query) ' Display the results. If Not (page Is Nothing) AndAlso Not (page.entries Is Nothing) Then For Each AdGroupAd As AdGroupAd In page.entries Dim policySummary As AdGroupAdPolicySummary = AdGroupAd.policySummary disapprovedAdsCount += 1 Console.WriteLine( "Ad with ID {0} and type '{1}' was disapproved with the " + "following policy topic entries: ", AdGroupAd.ad.id, AdGroupAd.ad.AdType) ' Display the policy topic entries related to the ad disapproval. For Each PolicyTopicEntry As PolicyTopicEntry In _ policySummary.policyTopicEntries Console.WriteLine(" topic id: {0}, topic name: '{1}'", PolicyTopicEntry.policyTopicId, PolicyTopicEntry.policyTopicName) ' Display the attributes And values that triggered the policy ' topic. If Not PolicyTopicEntry.policyTopicEvidences Is Nothing Then For Each evidence As PolicyTopicEvidence In _ PolicyTopicEntry.policyTopicEvidences Console.WriteLine(" evidence type: {0}", evidence.policyTopicEvidenceType) If Not evidence.evidenceTextList Is Nothing Then For i As Integer = 0 To _ evidence.evidenceTextList.Length Console.WriteLine( " evidence text[{0}]: {1}", i, evidence.evidenceTextList(i)) Next End If Next End If Next Next End If query.NextPage(page) Loop While (query.HasNextPage(page)) Console.WriteLine("Number of disapproved ads found: {0}", disapprovedAdsCount) Catch e As Exception Throw New System.ApplicationException("Failed to get disapproved ads.", e) End Try End Using End Sub End Class End Namespace
Get all campaigns with a specific label
' Copyright 2018 Google LLC ' ' Licensed under the Apache License, Version 2.0 (the "License"); ' you may not use this file except in compliance with the License. ' You may obtain a copy of the License at ' ' http://www.apache.org/licenses/LICENSE-2.0 ' ' Unless required by applicable law or agreed to in writing, software ' distributed under the License is distributed on an "AS IS" BASIS, ' WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ' See the License for the specific language governing permissions and ' limitations under the License. Imports Google.Api.Ads.AdWords.Lib Imports Google.Api.Ads.AdWords.v201809 Namespace Google.Api.Ads.AdWords.Examples.VB.v201809 ''' <summary> ''' This code example gets all campaigns with a specific label. To add a ''' label to campaigns, run AddCampaignLabels.vb. ''' </summary> Public Class GetCampaignsByLabel Inherits ExampleBase ''' <summary> ''' Main method, to run this code example as a standalone application. ''' </summary> ''' <param name="args">The command line arguments.</param> Public Shared Sub Main(ByVal args As String()) Dim codeExample As New GetCampaignsByLabel Console.WriteLine(codeExample.Description) Dim labelId As Long = Long.Parse("INSERT_LABEL_ID_HERE") Try codeExample.Run(New AdWordsUser, labelId) Catch e As Exception Console.WriteLine("An exception occurred while running this code example. {0}", ExampleUtilities.FormatException(e)) End Try End Sub ''' <summary> ''' Returns a description about the code example. ''' </summary> Public Overrides ReadOnly Property Description() As String Get Return "This code example gets all campaigns with a specific label. To add a" & " label to campaigns, run AddCampaignLabels.vb." End Get End Property ''' <summary> ''' Runs the code example. ''' </summary> ''' <param name="user">The AdWords user.</param> ''' <param name="labelId">ID of the label.</param> Public Sub Run(ByVal user As AdWordsUser, ByVal labelId As Long) Using campaignService As CampaignService = CType( user.GetService( AdWordsService.v201809.CampaignService), CampaignService) ' Create the selector. Dim selector As New Selector selector.fields = New String() { _ Campaign.Fields.Id, Campaign.Fields.Name, Campaign.Fields.Labels } ' Labels filtering is performed by ID. You can use CONTAINS_ANY to ' select campaigns with any of the label IDs, CONTAINS_ALL to select ' campaigns with all of the label IDs, or CONTAINS_NONE to select ' campaigns with none of the label IDs. selector.predicates = New Predicate() { _ Predicate.ContainsAny( Campaign.Fields.Labels, New String() {labelId.ToString()}) } ' Set the selector paging. selector.paging = Paging.Default Dim page As New CampaignPage Try Do ' Get the campaigns. page = campaignService.get(selector) ' Display the results. If Not (page Is Nothing) AndAlso Not (page.entries Is Nothing) Then Dim i As Integer = selector.paging.startIndex For Each campaign As Campaign In page.entries Dim labelNames As New List(Of String) For Each label As Label In campaign.labels labelNames.Add(label.name) Next Console.WriteLine( "{0}) Campaign with id = '{1}', name = '{2}' and labels = " & "'{3}' was found.", i + 1, campaign.id, campaign.name, String.Join(", ", labelNames.ToArray())) i = i + 1 Next End If selector.paging.IncreaseOffset() Loop While selector.paging.startIndex < page.totalNumEntries Console.WriteLine("Number of campaigns found: {0}", page.totalNumEntries) Catch e As Exception Throw _ New System.ApplicationException("Failed to retrieve campaigns by label.", e) End Try End Using End Sub End Class End Namespace
Graduate a trial
' Copyright 2018 Google LLC ' ' Licensed under the Apache License, Version 2.0 (the "License"); ' you may not use this file except in compliance with the License. ' You may obtain a copy of the License at ' ' http://www.apache.org/licenses/LICENSE-2.0 ' ' Unless required by applicable law or agreed to in writing, software ' distributed under the License is distributed on an "AS IS" BASIS, ' WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ' See the License for the specific language governing permissions and ' limitations under the License. Imports Google.Api.Ads.AdWords.Lib Imports Google.Api.Ads.AdWords.v201809 Namespace Google.Api.Ads.AdWords.Examples.VB.v201809 ''' <summary> ''' This code example illustrates how to graduate a trial. See the Campaign ''' Drafts and Experiments guide for more information: ''' https://developers.google.com/adwords/api/docs/guides/campaign-drafts-experiments ''' </summary> Public Class GraduateTrial Inherits ExampleBase ''' <summary> ''' Main method, to run this code example as a standalone application. ''' </summary> ''' <param name="args">The command line arguments.</param> Public Shared Sub Main(ByVal args As String()) Dim codeExample As New GraduateTrial Console.WriteLine(codeExample.Description) Try Dim trialId As Long = Long.Parse("INSERT_TRIAL_ID_HERE") codeExample.Run(New AdWordsUser(), trialId) Catch e As Exception Console.WriteLine("An exception occurred while running this code example. {0}", ExampleUtilities.FormatException(e)) End Try End Sub ''' <summary> ''' Returns a description about the code example. ''' </summary> Public Overrides ReadOnly Property Description() As String Get Return "This code example illustrates how to graduate a trial. See the Campaign " & "Drafts and Experiments guide for more information: " & "https://developers.google.com/adwords/api/docs/guides/campaign-drafts-experiments" End Get End Property ''' <summary> ''' Runs the code example. ''' </summary> ''' <param name="user">The AdWords user.</param> ''' <param name="trialId">Id of the trial to be graduated.</param> Public Sub Run(ByVal user As AdWordsUser, ByVal trialId As Long) Using trialService As TrialService = CType( user.GetService( AdWordsService.v201809.TrialService), TrialService) ' To graduate a trial, you must specify a different budget from the ' base campaign. The base campaign (in order to have had a trial based ' on it) must have a non-shared budget, so it cannot be shared with ' the new independent campaign created by graduation. Dim budget As Budget = CreateBudget(user) Dim trial As New Trial() trial.id = trialId trial.budgetId = budget.budgetId trial.status = TrialStatus.GRADUATED Dim trialOperation As New TrialOperation() trialOperation.operator = [Operator].SET trialOperation.operand = trial Try ' Update the trial. trial = trialService.mutate(New TrialOperation() {trialOperation}).value(0) ' Graduation is a synchronous operation, so the campaign is already ' ready. If you promote instead, make sure to see the polling scheme ' demonstrated in AddTrial.cs to wait for the asynchronous operation ' to finish. Console.WriteLine( "Trial ID {0} graduated. Campaign ID {1} was given a new budget " & "ID {2} and is no Longer dependent on this trial.", trial.id, trial.trialCampaignId, budget.budgetId) Catch e As Exception Throw New System.ApplicationException("Failed to graduate trial.", e) End Try End Using End Sub ''' <summary> ''' Creates the budget. ''' </summary> ''' <param name="user">The user.</param> ''' <returns>The new budget.</returns> Private Shared Function CreateBudget(user As AdWordsUser) As Budget Using budgetService As BudgetService = CType( user.GetService( AdWordsService.v201809.BudgetService), BudgetService) Dim budget As New Budget() budget.name = "Budget #" + ExampleUtilities.GetRandomString() budget.amount = New Money() budget.amount.microAmount = 50000000L budget.deliveryMethod = BudgetBudgetDeliveryMethod.STANDARD Dim budgetOperation As New BudgetOperation() budgetOperation.operator = [Operator].ADD budgetOperation.operand = budget ' Add budget. Return budgetService.mutate(New BudgetOperation() {budgetOperation}).value(0) End Using End Function End Class End Namespace
Set ad parameters for a keyword ad group criterion
' Copyright 2018 Google LLC ' ' Licensed under the Apache License, Version 2.0 (the "License"); ' you may not use this file except in compliance with the License. ' You may obtain a copy of the License at ' ' http://www.apache.org/licenses/LICENSE-2.0 ' ' Unless required by applicable law or agreed to in writing, software ' distributed under the License is distributed on an "AS IS" BASIS, ' WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ' See the License for the specific language governing permissions and ' limitations under the License. Imports Google.Api.Ads.AdWords.Lib Imports Google.Api.Ads.AdWords.v201809 Namespace Google.Api.Ads.AdWords.Examples.VB.v201809 ''' <summary> ''' This code example illustrates how to create a text ad with ad parameters. ''' To add an ad group, run AddAdGroup.vb. To add a keyword, run ''' AddKeyword.vb. ''' </summary> Public Class SetAdParameters Inherits ExampleBase ''' <summary> ''' Main method, to run this code example as a standalone application. ''' </summary> ''' <param name="args">The command line arguments.</param> Public Shared Sub Main(ByVal args As String()) Dim codeExample As New SetAdParameters Console.WriteLine(codeExample.Description) Try Dim adGroupId As Long = Long.Parse("INSERT_ADGROUP_ID_HERE") Dim criterionId As Long = Long.Parse("INSERT_CRITERION_ID_HERE") codeExample.Run(New AdWordsUser, adGroupId, criterionId) Catch e As Exception Console.WriteLine("An exception occurred while running this code example. {0}", ExampleUtilities.FormatException(e)) End Try End Sub ''' <summary> ''' Returns a description about the code example. ''' </summary> Public Overrides ReadOnly Property Description() As String Get Return _ "This code example illustrates how to create a text ad with ad parameters. To" & " add an ad group, run AddAdGroup.vb. To add a keyword, run AddKeyword.vb." End Get End Property ''' <summary> ''' Runs the code example. ''' </summary> ''' <param name="user">The AdWords user.</param> ''' <param name="adGroupId">Id of the ad group that contains the criterion. ''' </param> ''' <param name="criterionId">Id of the keyword for which the ad ''' parameters are set.</param> Public Sub Run(ByVal user As AdWordsUser, ByVal adGroupId As Long, ByVal criterionId As Long) Using adGroupAdService As AdGroupAdService = CType( user.GetService( AdWordsService.v201809.AdGroupAdService), AdGroupAdService) Using adParamService As AdParamService = CType( user.GetService( AdWordsService.v201809.AdParamService), AdParamService) ' Create the expanded text ad. Dim expandedTextAd As New ExpandedTextAd() expandedTextAd.headlinePart1 = "Mars Cruises" expandedTextAd.headlinePart2 = "Low-gravity fun for {param1:cheap}." expandedTextAd.description = "Only {param2:a few} seats left!" expandedTextAd.finalUrls = New String() {"http://www.example.com"} Dim adOperand As New AdGroupAd adOperand.adGroupId = adGroupId adOperand.status = AdGroupAdStatus.ENABLED adOperand.ad = expandedTextAd ' Create the operation. Dim adOperation As New AdGroupAdOperation adOperation.operand = adOperand adOperation.operator = [Operator].ADD ' Create the expanded text ad. Dim retVal As AdGroupAdReturnValue = adGroupAdService.mutate( New AdGroupAdOperation() {adOperation}) ' Display the results. If ((Not retVal Is Nothing) AndAlso (Not retVal.value Is Nothing) _ AndAlso (retVal.value.Length > 0)) Then Console.WriteLine( "Expanded text ad with id = ""{0}"" was successfully added.", retVal.value(0).ad.id) Else Throw New System.ApplicationException("Failed to create expanded text ads.") Return End If ' Create the ad param for price. Dim priceParam As New AdParam priceParam.adGroupId = adGroupId priceParam.criterionId = criterionId priceParam.paramIndex = 1 priceParam.insertionText = "$100" ' Create the ad param for seats. Dim seatParam As New AdParam seatParam.adGroupId = adGroupId seatParam.criterionId = criterionId seatParam.paramIndex = 2 seatParam.insertionText = "50" ' Create the operations. Dim priceOperation As New AdParamOperation priceOperation.operator = [Operator].SET priceOperation.operand = priceParam Dim seatOperation As New AdParamOperation seatOperation.operator = [Operator].SET seatOperation.operand = seatParam Try ' Set the ad parameters. Dim newAdParams As AdParam() = adParamService.mutate( New AdParamOperation() _ {priceOperation, seatOperation}) 'Display the results. If (Not newAdParams Is Nothing) Then Console.WriteLine("Ad parameters were successfully updated.") Else Console.WriteLine("No ad parameters were set.") End If Catch e As Exception Throw New System.ApplicationException("Failed to set ad parameter(s).", e) End Try End Using End Using End Sub End Class End Namespace
Set a bid modifier on a campaign
' Copyright 2018 Google LLC ' ' Licensed under the Apache License, Version 2.0 (the "License"); ' you may not use this file except in compliance with the License. ' You may obtain a copy of the License at ' ' http://www.apache.org/licenses/LICENSE-2.0 ' ' Unless required by applicable law or agreed to in writing, software ' distributed under the License is distributed on an "AS IS" BASIS, ' WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ' See the License for the specific language governing permissions and ' limitations under the License. Imports Google.Api.Ads.AdWords.Lib Imports Google.Api.Ads.AdWords.v201809 Namespace Google.Api.Ads.AdWords.Examples.VB.v201809 ''' <summary> ''' This code example sets a bid modifier for the mobile platform on given ''' campaign. The campaign must be an enhanced type of campaign. To get ''' campaigns, run GetCampaigns.vb. To enhance a campaign, run ''' SetCampaignEnhanced.vb. ''' </summary> Public Class SetBidModifier Inherits ExampleBase ''' <summary> ''' Main method, to run this code example as a standalone application. ''' </summary> ''' <param name="args">The command line arguments.</param> Public Shared Sub Main(ByVal args As String()) Dim codeExample As New SetBidModifier Console.WriteLine(codeExample.Description) Try Dim campaignId As Long = Long.Parse("INSERT_CAMPAIGN_ID_HERE") Dim bidModifier As Double = Double.Parse("INSERT_BID_MODIFIER_HERE") codeExample.Run(New AdWordsUser, campaignId, bidModifier) Catch e As Exception Console.WriteLine("An exception occurred while running this code example. {0}", ExampleUtilities.FormatException(e)) End Try End Sub ''' <summary> ''' Returns a description about the code example. ''' </summary> ''' Public Overrides ReadOnly Property Description() As String Get Return "This code example sets a bid modifier for the mobile platform on given " & "campaign. The campaign must be an enhanced type of campaign. To get " & "campaigns, run GetCampaigns.vb. To enhance a campaign, run " & "SetCampaignEnhanced.vb." End Get End Property ''' <summary> ''' Runs the code example. ''' </summary> ''' <param name="user">The AdWords user.</param> ''' <param name="campaignId">Id of the campaign whose bid should be modified. ''' </param> ''' <param name="bidModifier">The bid modifier.</param> Public Sub Run(ByVal user As AdWordsUser, ByVal campaignId As Long, ByVal bidModifier As Double) Using campaignCriterionService As CampaignCriterionService = CType( user.GetService( AdWordsService.v201809.CampaignCriterionService), CampaignCriterionService) ' Create mobile platform. The ID can be found in the documentation. ' https://developers.google.com/adwords/api/docs/appendix/platforms Dim mobile As New Platform() mobile.id = 30001 ' Create criterion with modified bid. Dim criterion As New CampaignCriterion() criterion.campaignId = campaignId criterion.criterion = mobile criterion.bidModifier = bidModifier ' Create SET operation. Dim operation As New CampaignCriterionOperation() operation.operator = [Operator].SET operation.operand = criterion Try ' Update campaign criteria. Dim result As CampaignCriterionReturnValue = campaignCriterionService.mutate( New CampaignCriterionOperation() {operation}) ' Display campaign criteria. If Not result.value Is Nothing Then For Each newCriterion As CampaignCriterion In result.value Console.WriteLine( "Campaign criterion with campaign id '{0}', criterion id '{1}' " & "and type '{2}' was modified with bid {3:F2}.", newCriterion.campaignId, newCriterion.criterion.id, newCriterion.criterion.type, newCriterion.bidModifier) Next Else Console.WriteLine("No campaigns were modified.") End If Catch e As Exception Throw New System.ApplicationException("Failed to set bid modifier.", e) End Try End Using End Sub End Class End Namespace
Validate text ad through setValidateOnly header
' Copyright 2018 Google LLC ' ' Licensed under the Apache License, Version 2.0 (the "License"); ' you may not use this file except in compliance with the License. ' You may obtain a copy of the License at ' ' http://www.apache.org/licenses/LICENSE-2.0 ' ' Unless required by applicable law or agreed to in writing, software ' distributed under the License is distributed on an "AS IS" BASIS, ' WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ' See the License for the specific language governing permissions and ' limitations under the License. Imports Google.Api.Ads.AdWords.Lib Imports Google.Api.Ads.AdWords.v201809 Namespace Google.Api.Ads.AdWords.Examples.VB.v201809 ''' <summary> ''' This code example shows how to use the validateOnly header to validate ''' an expanded text ad. No objects will be created, but exceptions will ''' still be thrown. ''' </summary> Public Class ValidateTextAd Inherits ExampleBase ''' <summary> ''' Main method, to run this code example as a standalone application. ''' </summary> ''' <param name="args">The command line arguments.</param> Public Shared Sub Main(ByVal args As String()) Dim codeExample As New ValidateTextAd Console.WriteLine(codeExample.Description) Try Dim adGroupId As Long = Long.Parse("INSERT_ADGROUP_ID_HERE") codeExample.Run(New AdWordsUser, adGroupId) Catch e As Exception Console.WriteLine("An exception occurred while running this code example. {0}", ExampleUtilities.FormatException(e)) End Try End Sub ''' <summary> ''' Returns a description about the code example. ''' </summary> ''' Public Overrides ReadOnly Property Description() As String Get Return _ "This code example shows how to use the validateOnly header to validate an " & "expanded text ad. No objects will be created, but exceptions will still be " & "thrown." End Get End Property ''' <summary> ''' Runs the code example. ''' </summary> ''' <param name="user">The AdWords user.</param> ''' <param name="adGroupId">Id of the ad group to which text ads are ''' added.</param> Public Sub Run(ByVal user As AdWordsUser, ByVal adGroupId As Long) Using adGroupAdService As AdGroupAdService = CType( user.GetService( AdWordsService.v201809.AdGroupAdService), AdGroupAdService) ' Set the validateOnly headers. adGroupAdService.RequestHeader.validateOnly = True ' Create your expanded text ad. Dim expandedTextAd As New ExpandedTextAd() expandedTextAd.headlinePart1 = "Luxury Cruise to Mars" expandedTextAd.headlinePart2 = "Visit the Red Planet in style." expandedTextAd.description = "Low-gravity fun for everyone!!" expandedTextAd.finalUrls = New String() {"http://www.example.com"} Dim adGroupAd As New AdGroupAd adGroupAd.adGroupId = adGroupId adGroupAd.ad = expandedTextAd Dim operation As New AdGroupAdOperation operation.operator = [Operator].ADD operation.operand = adGroupAd Try Dim retVal As AdGroupAdReturnValue = adGroupAdService.mutate( New AdGroupAdOperation() {operation}) ' Since validation is ON, result will be null. Console.WriteLine("Expanded text ad validated successfully.") Catch e As AdWordsApiException ' This block will be hit if there is a validation error from the server. Console.WriteLine( "There were validation error(s) while adding expanded text ad.") If (Not e.ApiException Is Nothing) Then For Each apiError As ApiError In _ DirectCast(e.ApiException, ApiException).errors Console.WriteLine(" Error type is '{0}' and fieldPath is '{1}'.", apiError.ApiErrorType, apiError.fieldPath) Next End If Catch e As Exception Throw New System.ApplicationException("Failed to validate expanded text ad.", e) End Try End Using End Sub End Class End Namespace