{"id":19176869,"url":"https://github.com/googleads/google-ads-perl","last_synced_at":"2026-01-29T00:12:21.176Z","repository":{"id":37787968,"uuid":"192551304","full_name":"googleads/google-ads-perl","owner":"googleads","description":"Google Ads API Client Library for Perl","archived":false,"fork":false,"pushed_at":"2025-10-15T18:14:37.000Z","size":6829,"stargazers_count":20,"open_issues_count":0,"forks_count":16,"subscribers_count":12,"default_branch":"main","last_synced_at":"2025-10-16T18:14:53.644Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Perl","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/googleads.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2019-06-18T14:00:29.000Z","updated_at":"2025-10-15T18:13:37.000Z","dependencies_parsed_at":"2024-06-07T15:14:54.787Z","dependency_job_id":"10904e57-7725-4804-be91-40bb222d186a","html_url":"https://github.com/googleads/google-ads-perl","commit_stats":null,"previous_names":[],"tags_count":49,"template":false,"template_full_name":null,"purl":"pkg:github/googleads/google-ads-perl","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/googleads%2Fgoogle-ads-perl","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/googleads%2Fgoogle-ads-perl/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/googleads%2Fgoogle-ads-perl/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/googleads%2Fgoogle-ads-perl/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/googleads","download_url":"https://codeload.github.com/googleads/google-ads-perl/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/googleads%2Fgoogle-ads-perl/sbom","scorecard":{"id":438272,"data":{"date":"2025-08-11","repo":{"name":"github.com/googleads/google-ads-perl","commit":"9abffd69cd856633dfdcee5c636fe9cd0eb4b5ed"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":4.5,"checks":[{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Maintained","score":4,"reason":"5 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 4","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Code-Review","score":6,"reason":"Found 19/30 approved changesets -- score normalized to 6","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: Apache License 2.0: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: containerImage not pinned by hash: Dockerfile:1: pin your Docker image by updating perl:5.32 to perl:5.32@sha256:0878b332b373da22b2128db1251ab5eea32adce7b36eb6e41a7f71b42374a943","Info:   0 out of   1 containerImage dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 20 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-19T05:08:41.410Z","repository_id":37787968,"created_at":"2025-08-19T05:08:41.410Z","updated_at":"2025-08-19T05:08:41.410Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28857166,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-28T22:56:21.783Z","status":"ssl_error","status_checked_at":"2026-01-28T22:56:00.861Z","response_time":57,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-09T10:30:51.904Z","updated_at":"2026-01-29T00:12:21.161Z","avatar_url":"https://github.com/googleads.png","language":"Perl","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Google Ads API Client Library for Perl\n\n[![CPAN version](https://badge.fury.io/pl/Google-Ads-GoogleAds-Client.svg)](https://badge.fury.io/pl/Google-Ads-GoogleAds-Client)\n![Build Status](https://storage.googleapis.com/gaa-clientlibs/badges/google-ads-perl/buildstatus_ubuntu.svg)\n\nThis project hosts the Perl client library for the [Google Ads\nAPI](https://developers.google.com/google-ads/api/docs/start).\n\n## Features\n\n  * Distributed via [CPAN](https://metacpan.org/release/Google-Ads-GoogleAds-Client).\n  * Easy management of credentials.\n  * Easy creation of Google Ads API service clients.\n\n## Requirements\n\n  * Perl 5.24.1+\n\n## Getting started\n\n1.  Clone this project in the directory of your choice via:\n\n        git clone https://github.com/googleads/google-ads-perl.git\n\n1.  Change into the `google-ads-perl` directory.\n\n        cd google-ads-perl\n\n    You'll see some files and subdirectories:\n\n    *   `Build.PL`: the Perl build file, which holds the dependencies and test\n        types of this project.\n    *   `lib`: source code of the library.\n    *   `t`: test cases of the library code.\n    *   `examples`: many examples that demonstrate how to use the library to\n        execute common use cases via the Google Ads API.\n    *   `googleads.properties`: the sample configuration file for the library.\n    *   `log4perl.conf`: the sample logging configuration file.\n\n1.  Now run the following command at the command prompt. This will install all\n    dependencies needed for using the library and running examples.\n\n        cpan install Module::Build\n        perl Build.PL\n        perl Build installdeps\n\n1.  Set up your OAuth2 credentials.\n\n    The Google Ads API uses [OAuth2](http://oauth.net/2/) as the authentication\n    mechanism. Choose the appropriate option below based on your use case, and\n    read and follow the instructions that the example prints to the console.\n\n    **If you already have credentials for the AdWords API...**\n\n    *   If you have the `adwords.properties` file you used for the AdWords API,\n        copy and name it as `googleads.properties`. Simply change the key names\n        in the new configuration file as below:\n\n            oAuth2ClientId       --\u003e clientId\n            oAuth2ClientSecret   --\u003e clientSecret\n            oAuth2RefreshToken   --\u003e refreshToken\n            developerToken       --\u003e developerToken\n\n        If you are authenticating as a manager account, additionally you must\n        specify:\n\n            loginCustomerId --\u003e Manager account ID (with hyphens removed).\n\n    **If you're accessing the Google Ads API using your own credentials...**\n\n    *   Copy the sample [`googleads.properties`](googleads.properties)\n        to your [home directory](https://en.wikipedia.org/wiki/Home_directory#Default_home_directory_per_operating_system).\n\n    *   Follow the instructions at\n        https://developers.google.com/google-ads/api/docs/oauth/cloud-project\n        to create an OAuth2 client ID and secret for the **Desktop app**\n        OAuth2 flow.\n\n    *   Run the\n        [generate_user_credentials](examples/authentication/generate_user_credentials.pl)\n        example, by providing your OAuth2 client ID and secret as the parameters.\n\n    *   Copy the output from the last step of the example into the\n        `googleads.properties` file in your home directory. Don't forget to fill\n        in your developer token too.\n\n    **If you're accessing the Google Ads API on behalf of clients...**\n\n    *   Copy the sample [`googleads.properties`](googleads.properties)\n        to your [home directory](https://en.wikipedia.org/wiki/Home_directory#Default_home_directory_per_operating_system).\n\n    *   Follow the instructions at\n        https://developers.google.com/google-ads/api/docs/oauth/cloud-project\n        to create an OAuth2 client ID and secret for the **Web application**\n        OAuth2 flow.\n\n    *   Run the\n        [generate_user_credentials](examples/authentication/generate_user_credentials.pl)\n        example, by providing your OAuth2 client ID and secret as the parameters.\n\n    *   Copy the output from the last step of the example into the\n        `googleads.properties` file in your home directory. Don't forget to fill\n        in your developer token too.\n\n1.  Run the [get_campaigns](examples/basic_operations/get_campaigns.pl) example\n    to test if your credentials are valid. You also need to pass your Google Ads\n    account's customer ID as a command-line parameter:\n\n        perl examples/basic_operations/get_campaigns.pl -customer_id \u003cYOUR_CUSTOMER_ID\u003e\n\n    **NOTE**: Code examples are meant to be run from command prompt, not via the\n    web browsers.\n\n1.  Explore other examples.\n\n    The [examples](examples) directory contains several useful examples. Most of\n    the examples require parameters. You can either pass the parameters as\n    arguments (recommended) or edit the `INSERT_XXXXX_HERE` values in the source\n    code. To see a usage statement for an example, pass `-help` as a\n    command-line argument.\n\n    **Note:** From the source code, you can ignore comments with `[START...]` and\n    `[END...]` in them-they are specifically used by Google.\n\n## Basic usage\n\nTo issue requests via the Google Ads API, you first need to create an\n[API client](lib/Google/Ads/GoogleAds/Client.pm). For convenience, you can store\nthe required settings in a properties file (`googleads.properties`) with the\nfollowing format:\n\n    ### Google Ads ###\n    developerToken=INSERT_DEVELOPER_TOKEN_HERE\n\n    ### OAuth2 ###\n    clientId=INSERT_OAUTH2_CLIENT_ID_HERE\n    clientSecret=INSERT_OAUTH2_CLIENT_SECRET_HERE\n    refreshToken=INSERT_REFRESH_TOKEN_HERE\n\nIf you're authenticating as a manager account, additionally you must specify the\nmanager account ID (with hyphens removed) as the login customer ID:\n\n    ### Google Ads ###\n    loginCustomerId=INSERT_LOGIN_CUSTOMER_ID_HERE\n\nIf you have an `googleads.properties` configuration file in the above format in\nyour home directory, you can instantiate the client with no arguments:\n\n```perl\nmy $api_client = Google::Ads::GoogleAds::Client-\u003enew();\n```\n\nIf your configuration file is not in your home directory, you can pass the file\nlocation to the the `properties_file` property as follows:\n\n```perl\nmy $properties_file = \"/path/to/googleads.properties\";\n\nmy $api_client = Google::Ads::GoogleAds::Client-\u003enew({\n  properties_file =\u003e $properties_file\n});\n```\n\nYou can also get a [OAuth2ApplicationsHandler](lib/Google/Ads/GoogleAds/OAuth2ApplicationsHandler.pm)\nobject from the `API client`, and change the client ID, client secret and\nrefresh token at runtime:\n\n```perl\nmy $api_client = Google::Ads::GoogleAds::Client-\u003enew({\n  developer_token   =\u003e \"INSERT_DEVELOPER_TOKEN_HERE\",\n  login_customer_id =\u003e \"INSERT_LOGIN_CUSTOMER_ID_HERE\"\n});\n\nmy $oauth2_applications_handler = $api_client-\u003eget_oauth2_applications_handler();\n$oauth2_applications_handler-\u003eset_client_id(\"INSERT_CLIENT_ID\");\n$oauth2_applications_handler-\u003eset_client_secret(\"INSERT_CLIENT_SECRET\");\n$oauth2_applications_handler-\u003eset_refresh_token(\"INSERT_REFRESH_TOKEN\");\n```\n\n### Get a service client\n\nOnce you have an instance of `API client`, you can obtain a service client for a\nparticular service using one of the `...Service()` methods:\n\n```perl\nmy $campaign_serevice = $api_client-\u003eCampaignService();\n```\n\n### Request/Response Logging\n\nLogging is configured with [Log::Log4perl](https://metacpan.org/pod/Log::Log4perl),\na generic logging library for Perl.\n\n#### Logging layout and functionality\n\nRequests are logged with a one line summary and the full request/response body\nand headers. The level at which messages are logged depends on whether the event\nsucceeded.\n\n| Log type | Log name                       | Success level | Failure level |\n| -------- | ------------------------------ | ------------- | ------------- |\n| SUMMARY  | Google.Ads.GoogleAds.Summary   | INFO          | WARN          |\n| DETAIL   | Google.Ads.GoogleAds.Detail    | DEBUG         | INFO          |\n\n**Caveat**: Mutate requests where [Partial failure](https://developers.google.com/google-ads/api/docs/samples/handle-partial-failure)\nis true do not cause the entire request to fail. Therefore, partial failure logs\nare always logged at Success level, not at Failure level as may be expected.\n\n#### Configuring logging\n\nThe client library uses a custom class for all logging purposes and is exposed\nthrough the [GoogleAdsLogger](lib/Google/Ads/GoogleAds/Logging/GoogleAdsLogger.pm)\nmodule. This class provides a default configuration that both summary and detail\nloggers will log to relative files in the `logs` folder under your home directory.\nBut the default configuration can be overridden by providing a\n[log4perl.conf](log4perl.conf) file in your home directory.\n\nLogging can be enabled/disabled using the following methods:\n\n* Enables logging for both loggers.\n\n  ```perl\n  Google::Ads::GoogleAds::Logging::GoogleAdsLogger::enable_all_logging();\n  ```\n\n* Disables the summary logging.\n\n  ```perl\n  Google::Ads::GoogleAds::Logging::GoogleAdsLogger::disable_summary_logging();\n  ```\n\n* Disables the detail logging.\n\n  ```perl\n  Google::Ads::GoogleAds::Logging::GoogleAdsLogger::disable_detail_logging();\n  ```\n\nYou can use the methods of the `GoogleAdsLogger` class directly for even more\ncontrol over how requests are logged.\n\n## Running in a Docker container\n\nSee the [Running in a Docker Container guide](https://developers.google.com/google-ads/api/docs/client-libs/perl/docker).\n\n## Proxy configuration\n\nSee the [Proxy guide](https://developers.google.com/google-ads/api/docs/client-libs/perl/proxy).\n\n## Miscellaneous\n\n### Wiki\n\n- https://github.com/googleads/google-ads-perl/wiki\n\n### Issue tracker\n\n- https://github.com/googleads/google-ads-perl/issues\n\n### API Documentation:\n\n- https://developers.google.com/google-ads/api/docs\n\n### Support forum\n\n- https://groups.google.com/forum/#!forum/adwords-api\n\n### Authors\n\n- [Wang Fan](https://github.com/wfansh)\n- [Laura Chevalier](https://github.com/laurachevalier4)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgoogleads%2Fgoogle-ads-perl","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgoogleads%2Fgoogle-ads-perl","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgoogleads%2Fgoogle-ads-perl/lists"}