Skip to content

Latest commit

 

History

History
146 lines (112 loc) · 6.01 KB

README.md

File metadata and controls

146 lines (112 loc) · 6.01 KB

Google Ads API Client Library for Golang

Go GoDoc Go Report Card License

This library provides a Golang client for the Google Ads API. It's fully generated from the googleapis repository. More information on the generation process can be found here.

Although this project isn't official, we deem it as low-risk due to its maturity and our two years of using it in production. However, always consult the sunset schedule of the Google Ads API.

Features

  • Full support for Google Ads API.
  • Source code generated from the official googleapis repository.
  • Support for GRPC and HTTP calls using protojson.
  • Although we won't regularly update this based on the official repository, we continually maintain it. Update frequency depends on our needs but usually occurs a month after the official release.

Version support

google-ads-pb Google Ads API Sunset date
v1.18.0 v18 September 2025
v1.17.1 v17.1 May 2025
v1.17.0 v17 May 2025
v1.16.1 v16.1 January 2025
v1.7.0 v16 January 2025
v1.6.0 v15 Deprecated
v1.5.1 v14.1 Deprecated
v1.5.0 v14 Deprecated

Requirements

Installation

go get github.com/shenzhencenter/google-ads-pb

Getting started

  1. Set your environment variables.
export ACCESS_TOKEN=<your access token>
export DEVELOPER_TOKEN=<your developer token>
export CUSTOMER_ID=<your customer id>

If you're using gRPC, you should attach the access token, developer token, and customer ID to the context.

ctx := context.Background()
headers := metadata.Pairs(
    "authorization", "Bearer "+os.Getenv("ACCESS_TOKEN"),
    "developer-token", os.Getenv("DEVELOPER_TOKEN"),
    "login-customer-id", os.Getenv("CUSTOMER_ID"),
)
ctx = metadata.NewOutgoingContext(ctx, headers)

If you're using HTTP, you should attach the access token, developer token, and customer ID to the header.

header := make(http.Header)
header.Set("content-type", "application/json")
header.Set("authorization", os.Getenv("ACCESS_TOKEN"))
header.Set("developer-token", os.Getenv("DEVELOPER_TOKEN"))
  1. Establish a GRPC connection.
cred := grpc.WithTransportCredentials(credentials.NewClientTLSFromCert(nil, ""))
conn, err := grpc.NewClient("googleads.googleapis.com:443", cred)
if err != nil {
    panic(err)
}
defer conn.Close()
  1. Start making calls.
customerServiceClient := services.NewCustomerServiceClient(conn)
accessibleCustomers, err := customerServiceClient.ListAccessibleCustomers(
    ctx, // be sure to use the context with the access token, developer token, and customer ID
    &services.ListAccessibleCustomersRequest{},
)
if err != nil {
    panic(err)
}

for _, customer := range accessibleCustomers.ResourceNames {
    fmt.Println("ResourceName: " + customer)
}

You can also make HTTP calls using protojson, though it isn't recommended.

const endpoint = "https://googleads.googleapis.com/v18/customers:listAccessibleCustomers"
req := services.ListAccessibleCustomersRequest{}
requestBody, _ := protojson.Marshal(&req)
request, _ := http.NewRequest("GET", endpoint, bytes.NewBuffer(requestBody))
header := make(http.Header)
header.Set("content-type", "application/json")
header.Set("authorization", os.Getenv("ACCESS_TOKEN"))
header.Set("developer-token", os.Getenv("DEVELOPER_TOKEN"))
request.Header = header
response, _ := http.DefaultClient.Do(request)
defer response.Body.Close()
var responseBody []byte
if responseBody, err = io.ReadAll(response.Body); err != nil {
    panic(err)
}
listAccessibleCustomersResponse := new(services.ListAccessibleCustomersResponse)
if err := protojson.Unmarshal(responseBody, listAccessibleCustomersResponse); err != nil {
    panic(err)
}
for _, customer := range listAccessibleCustomersResponse.ResourceNames {
    fmt.Println("ResourceName: " + customer)
}

Note: The above examples are just a starting point. You should adjust them based on your needs.

Examples

See clients/internal/snippets.

Related

Here are some related projects

Contributing

As this project is fully protoc-generated, we aren't accepting pull requests. However, we value your feedback and suggestions, so feel free to open an issue.