|

|  How to Access Google Ads API to Manage Ad Campaigns in Java

How to Access Google Ads API to Manage Ad Campaigns in Java

October 31, 2024

Learn to access Google Ads API using Java to efficiently manage ad campaigns. This guide offers step-by-step instructions for seamless integration.

How to Access Google Ads API to Manage Ad Campaigns in Java

 

Authenticate with Google Ads API

 

  • Set up OAuth2 authorization to authenticate requests. You will need to use the Google Ads API token and client libraries for Java.
  •  

  • Application default credentials are often used in server applications, and you can initially use the `GoogleCredentials` class in Java to help manage these credentials.
  •  


import com.google.ads.googleads.lib.GoogleAdsClient;
import com.google.auth.oauth2.UserCredentials;
import com.google.ads.googleads.lib.GoogleAdsLogging;
import java.io.FileInputStream;
import java.io.IOException;

public class Authenticate {
    public static void main(String[] args) throws IOException {
        // Load user credentials from a properties file.
        UserCredentials credentials = UserCredentials.fromStream(new FileInputStream("path-to-credentials-file.json"));

        // Initialize the Google Ads Client with the user's credentials.
        GoogleAdsClient googleAdsClient = GoogleAdsClient.newBuilder()
            .setCredentials(credentials)
            .build();

        // Implement logging for detailed error reporting.
        GoogleAdsLogging.enable(HttpLoggingInterceptor.Level.BASIC);
    }
}

 

Implement API Calls

 

  • Make use of the service interfaces (`CampaignServiceClient`, `AdGroupServiceClient`, etc.) provided by Google Ads API to interact with different resources.
  •  

  • To create, update, or remove resources in Google Ads (like campaigns, ads, etc.), you will primarily use the `mutate` method calls associated with each service interface.
  •  


import com.google.ads.googleads.v10.services.CampaignServiceClient;
import com.google.ads.googleads.v10.services.CampaignOperation;
import com.google.ads.googleads.v10.resources.Campaign;
import com.google.ads.googleads.v10.services.MutateCampaignsResponse;

public class ManageCampaign {
    public static void main(String[] args) {
        try (GoogleAdsClient googleAdsClient = GoogleAdsClient.newBuilder().fromPropertiesFile().build()) {
            try (CampaignServiceClient campaignServiceClient = googleAdsClient.getLatestVersion().createCampaignServiceClient()) {
                
                CampaignOperation operation = CampaignOperation.newBuilder()
                    .setCreate(Campaign.newBuilder().setName("New Campaign").build())
                    .build();

                MutateCampaignsResponse response = campaignServiceClient.mutateCampaigns("INSERT_CUSTOMER_ID", java.util.Collections.singletonList(operation));
                response.getResultsList().forEach(result 
                    -> System.out.printf("Campaign created with resource name: %s%n", result.getResourceName()));
            } catch (Exception e) {
                e.printStackTrace();
            }
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
}

 

Implementing Pagination to Manage Large Results

 

  • Google Ads API returns search results in pages. Use the `search` function with pagination parameters to manage large datasets effectively.
  •  

  • Implement loops or iterators to fetch each page of results as needed, using `pageToken` for consistent state management across API calls.
  •  


import com.google.ads.googleads.lib.GoogleAdsClient;
import com.google.ads.googleads.v10.services.GoogleAdsServiceClient;
import com.google.ads.googleads.v10.services.SearchGoogleAdsRequest;
import com.google.ads.googleads.v10.services.SearchGoogleAdsResponse;

import java.io.IOException;

public class PaginatedRequest {
    public static void main(String[] args) {
        try (GoogleAdsClient googleAdsClient = GoogleAdsClient.newBuilder().fromPropertiesFile().build()) {
            try (GoogleAdsServiceClient googleAdsServiceClient = googleAdsClient.getLatestVersion().createGoogleAdsServiceClient()) {

                // Define the search query
                String query = "SELECT campaign.id, campaign.name FROM campaign ORDER BY campaign.id";

                // Build the request
                SearchGoogleAdsRequest request = SearchGoogleAdsRequest.newBuilder()
                    .setCustomerId("INSERT_CUSTOMER_ID")
                    .setPageSize(1000)
                    .setQuery(query)
                    .build();

                // Execute the request in a paginated fashion
                String nextPageToken = null;
                do {
                    SearchGoogleAdsResponse response = googleAdsServiceClient.search(request.toBuilder().setPageToken(nextPageToken).build());
                    response.getResultsList().forEach(item -> System.out.println(item.getCampaign().getName()));
                    nextPageToken = response.getNextPageToken();
                } while (nextPageToken != null && !nextPageToken.isEmpty());

            } catch (IOException e) {
                e.printStackTrace();
            }
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
}

 

Handling Errors and Exceptions

 

  • Implement robust error handling to manage exceptions such as network issues, invalid arguments, and quota errors.
  •  

  • Use try-catch blocks around API calls, and log errors to assist debugging and maintain system reliability. Implementing retry logic for transient errors can improve resilience.
  •  


public class ErrorHandling {
    public static void main(String[] args) {
        try {
            // Placeholder for API calls
        } catch (Exception e) {
            System.err.println("Error occurred: " + e.getMessage());

            // Implement retry logic for transient errors
            if (shouldRetry(e)) {
                for (int i = 0; i < 3; i++) {
                    try {
                        // Placeholder for retry logic
                        break; // Exit loop on success
                    } catch (Exception retryException) {
                        // Log retry attempt
                        if (i == 2) { // Last attempt
                            System.err.println("Retries exhausted: " + retryException.getMessage());
                        }
                    }
                }
            }
        }
    }

    private static boolean shouldRetry(Exception e) {
        // Implement logic to determine if the error is transient
        return true;
    }
}