Skip to content
This repository was archived by the owner on Oct 22, 2020. It is now read-only.

Repository files navigation

Google Ads Node

Unofficial Google Ads API gRPC client library for Node

Built by Opteo

Features

Note: This library is a minimal, low-level implementation for calling the Google Ads API with gRPC Protocol Buffers. For a more feature-complete and easier-to-use library, try our Javascript client library.

Installation

$ yarn add google-ads-node

Example

import{GoogleAdsClient,SearchGoogleAdsRequest,SearchGoogleAdsResponse,Campaign,Metrics}from"google-ads-node"// 1. Create a new client with valid authenticationconstclient=newGoogleAdsClient({access_token: "<ACCESS_TOKEN>",developer_token: "<DEVELOPER_TOKEN>",login_customer_id: "<LOGIN_CUSTOMER_ID>",});constcustomerId="1234567890";asyncfunctionexample(){// 2. Load a Google Ads serviceconstservice=client.getService("GoogleAdsService");// 3. Create a requestconstrequest=newSearchGoogleAdsRequest();request.setQuery(` SELECT campaign.id, campaign.name, campaign.status, segments.device, metrics.impressions, metrics.clicks, metrics.ctr, metrics.average_cpc, metrics.cost_micros FROM campaign `);request.setCustomerId(customerId);request.setPageSize(12);// 4. Get the resultsconstresult: SearchGoogleAdsResponse=awaitservice.search(request).catch((err: Error)=>{console.log("--- Error in search ---");console.log(err);});// 5. Inspect the data!for(constrowofresult.getResultsList()){constcampaign: Campaign=row.getCampaign()asCampaign;constmetrics: Metrics=row.getMetrics()asMetrics;if((metrics.getClicks()asany)>0){console.log(`Campaign "${campaign.getName()}" has ${metrics.getClicks()} clicks.`);}else{console.log(`Campaign "${campaign.getName()}" has no clicks.`);}}}example();

Usage

Authentication

1. No internal authentication

A valid Google Ads access_token must be provided. This usage depends on the access_token being refreshed and generated outside of the client. If the token isn't valid, an UNAUTHENTICATED error will be thrown. It's recommended to follow the instructions here for generating tokens.

constclient=newGoogleAdsClient({developer_token: "<DEVELOPER_TOKEN>",access_token: "<ACCESS_TOKEN>",});

2. Token generation and refresh handling

This approach, which is recommended, internally handles access token generation and refreshing. A valid client_id, client_secret and refresh_token must be provided.

constclient=newGoogleAdsClient({client_id: "<CLIENT_ID>",client_secret: "<CLIENT_SECRET>",refresh_token: "<REFRESH_TOKEN>",developer_token: "<DEVELOPER_TOKEN>",});

3. Access token getter

You can also additionaly pass in an async access token getter method to the client instance. This will be called on every request. The main purpose is to allow you to handle authentication yourself, and cache tokens/use cached tokens from elsewhere. The method expects a return type of Promise<string> e.g. Promise.resolve("<access-token>"). An example of how you might use the accessTokenGetter option is provided below:

constclient=newGoogleAdsClient({client_id: "<CLIENT_ID>",client_secret: "<CLIENT_SECRET>",refresh_token: "<REFRESH_TOKEN>",developer_token: "<DEVELOPER_TOKEN>",// You can optionally use the parametersasyncaccessTokenGetter(clientId?: string,clientSecret?: string,refreshToken?: string){awaitlogger.someLoggingFunction();if(cache.checkTokenExists()){returncache.getCachedToken();}constaccessToken=awaitauth.someCallToGetAccessToken();returnaccessToken;},});

The returned token string will be used in the gRPC metadata per request, as the Authorization header. You don't need to include the Bearer: part of the token, this is appended automatically.

4. Load GoogleAdsClient options from configuration file

For convenience, you can store the required settings in a configuration file. Copy the sample googleads.config.js file (the library also accepts a .googleadsrc file in JSON or YAML format) to your project root or home directory, and modify it to include the client ID, client secret, and refresh token.

The client will automatically read it from the configuration file if instantiated with no arguments:

constclient=newGoogleAdsClient();

Alternatively, if you prefer to keep the file elsewhere, you can instantiate the client by passing the path to where you keep this file:

constclient=newGoogleAdsClient("path/to/googleads.config.js");

Services

To load a Google Ads service, simply use the getService method. It supports a single string, being the name of the service. For a full list of avaiable services, check out the Google Ads service reference.

constservice=client.getService("AdGroupAdService");

From here, you can then use all the available methods for the service e.g. getAdGroupAd() and mutateAdGroupAds(). The parameters and return value match the format specified in the Google Ads documentation.

import{GetAdGroupAdRequest}from"google-ads-node";constrequest=newGetAdGroupAdRequest();constad=awaitservice.getAdGroupAd(request);

Note: Service methods use camelCase in this library, whereas the Google Ads documentation uses TitleCase, so if a service method was called GetCampaign(), in this library it would be getCampaign()

Mutations

to-do: make this section of the docs better

As it can be quite verbose to create a new gRPC message, especially entities in the Google Ads API which can have many fields, this library provides a buildResource method to handle this for you.

// This is a regular js object, and can't be used in gRPC requestsconstcampaign={name: "Interplanetary Cruises",campaignBudget: "customers/123/campaignBudgets/123",status: CampaignStatusEnum.CampaignStatus.ENABLED,advertisingChannelType: AdvertisingChannelTypeEnum.AdvertisingChannelType.SEARCH,};/* The buildResource method takes two arguments: 1. The message type to construct (matches the Google Ads API docs) 2. The object to convert It returns the object converted into a gRPC message instance, which can then be used in mutate requests/operations*/constpb=client.buildResource("Campaign",campaign);console.log(pb.getName());// "Interplanetary Cruises"

Results

By default, since this library is implemented with gRPC, any calls via a service return an object in the protocol buffer format. This is a binary format object, which is difficult to understand, especially if you're not using the Typescript definitions.

Because of this, retrieving the results you want can be quite verbose. An example of this is below, where we show two methods for acquiring the id of a campaign.

constresults=awaitservice.search(request);// Method 1const{ resultsList }=results.toObject();constid=resultsList[0].campaign.id.value;// Method 2constrow=results.getResultsList();constcampaign=row.getCampaign();constid=campaign.getId().value;

If you don't wish to work directly with protocol buffers, are unfamiliar with gRPC, or just want an easier way to retrieve the data, we recommend using the parseResults client option. Setting this option to true will internally handle parsing the results in a more javascript friendly way, and return the desired entities/metrics/segments as objects (with all types correctly handled, e.g. name as a string, id as a number, etc.).

constclient=newGoogleAdsClient({client_id: "<CLIENT_ID>",client_secret: "<CLIENT_SECRET>",refresh_token: "<REFRESH_TOKEN>",developer_token: "<DEVELOPER_TOKEN>",parseResults: true,});// ...const{ resultsList }=awaitservice.search(request);console.log(resultsList[0].campaign.id);// 123

Changelog

Contributing

Protocol Buffers

To update the Google Ads API version, the latest proto files (in the googleapis submodule) must be compiled.

Requirements:

  • Protoc compiler installed on your machine and added to your $PATH
  • Latest dependencies installed – make sure to use yarn install since some dependencies require a C++ compilation step

Steps:

  1. Navigate into the googleapis/ submodule and update with git pull.

  2. Run make protos to compile the *.proto files

  3. The new compiled proto files should now be in src/protos/, under the google/ads/googleads/v0/ path.

About

Google Ads API gRPC client library for Node

Resources

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages