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.
- 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.
google-ads-pb | Google Ads API | Sunset date |
---|---|---|
Not generated yet | v18 | End of September 2025 |
Not generated yet | v17.1 | End of May 2025 |
v1.2.0 | v17 | End of May 2025 |
Skipped | v16.1 | End of January 2025 |
Skipped | v16 | End of January 2025 |
v15 | End of September 2024 | |
v14 | End of May 2024 |
- Go 1.21.
- Familiarize yourself with the OAuth2 guide.
- If needed, obtain a developer token.
$ go get github.com/Optable/google-ads-pb
- Set your environment variables.
$ export ACCESS_TOKEN=<your access token>
$ export DEVELOPER_TOKEN=<your developer token>
$ export CUSTOMER_ID=<your customer id>
- Establish a GRPC connection.
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)
cred := grpc.WithTransportCredentials(credentials.NewClientTLSFromCert(nil, ""))
conn, err := grpc.Dial("googleads.googleapis.com:443", cred)
if err != nil {
panic(err)
}
defer conn.Close()
- Start making calls.
customerServiceClient := services.NewCustomerServiceClient(conn)
accessibleCustomers, err := customerServiceClient.ListAccessibleCustomers(
ctx,
&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.
req := services.ListAccessibleCustomersRequest{}
requestBody, err := protojson.Marshal(&req)
if err != nil {
panic(err)
}
request, err := http.NewRequest("GET", "https://googleads.googleapis.com/v14/customers:listAccessibleCustomers", bytes.NewBuffer(requestBody))
if err != nil {
panic(err)
}
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
client := &http.Client{}
response, err := client.Do(request)
if err != nil {
panic(err)
}
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(response, listAccessibleCustomersResponse); err != nil {
panic(err)
}
for _, customer := range listAccessibleCustomersResponse.ResourceNames {
fmt.Println("ResourceName: " + customer)
}
See clients/internal/snippets.
- Find the version number in this folder.
- Run
git checkout -b bump-to-v15
(change the version accordingly). - Run
make generate
to generate the code. - It will prompt you to enter the version number. Enter the version number you found in step 1, without the v. Example: For
v15
, enter15
. - Once the process is done, it should have modified some files in
/clients
and/protogen
- Modify this readme.md to add the version number to the table with the next tag (ref: https://developers.google.com/google-ads/api/docs/sunset-dates)
- Create a PR with the changes against https://github.com/Optable/google-ads-pb/tree/main.
- Create a tag with the PR merged in step 7.
git tag -a v1.1.0 -m "update to v15"
- Mark the pushed tag as
Latest release
in GitHub: https://github.com/Optable/google-ads-pb/releases/edit/v1.1.0 - Publish the release on Golang
GOPROXY=proxy.golang.org go list -m github.com/Optable/[email protected]
Here are some related projects
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.