{"id":48503880,"url":"https://github.com/henribru/google-ads-stubs","last_synced_at":"2026-04-07T15:36:57.660Z","repository":{"id":35418334,"uuid":"195124388","full_name":"henribru/google-ads-stubs","owner":"henribru","description":"Type stubs for the Google Ads API Client Library for Python","archived":false,"fork":false,"pushed_at":"2026-02-14T12:25:05.000Z","size":10514,"stargazers_count":13,"open_issues_count":1,"forks_count":1,"subscribers_count":2,"default_branch":"master","last_synced_at":"2026-02-14T21:04:00.599Z","etag":null,"topics":["annotations","google-ads","google-ads-api","mypy","pep561","pylance","pyre","pyright","python","pytype","stubs","stubs-only","type-annotations","type-stubs","typed","typing"],"latest_commit_sha":null,"homepage":"https://pypi.org/project/google-ads-stubs/","language":"Python","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/henribru.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"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-07-03T20:47:51.000Z","updated_at":"2026-02-14T12:24:43.000Z","dependencies_parsed_at":"2024-03-16T21:05:33.924Z","dependency_job_id":"3054a1ea-8230-4368-8906-81ef40d57d70","html_url":"https://github.com/henribru/google-ads-stubs","commit_stats":{"total_commits":108,"total_committers":1,"mean_commits":108.0,"dds":0.0,"last_synced_commit":"2b0897e84d936ca30f0162a6290780dacf2a286b"},"previous_names":[],"tags_count":44,"template":false,"template_full_name":null,"purl":"pkg:github/henribru/google-ads-stubs","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/henribru%2Fgoogle-ads-stubs","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/henribru%2Fgoogle-ads-stubs/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/henribru%2Fgoogle-ads-stubs/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/henribru%2Fgoogle-ads-stubs/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/henribru","download_url":"https://codeload.github.com/henribru/google-ads-stubs/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/henribru%2Fgoogle-ads-stubs/sbom","scorecard":{"id":461408,"data":{"date":"2025-08-11","repo":{"name":"github.com/henribru/google-ads-stubs","commit":"61916c8c67af78c8b4e30a839b84af4c94a3128c"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":4.1,"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":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","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":"Maintained","score":3,"reason":"4 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 3","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":0,"reason":"Found 1/30 approved changesets -- score normalized to 0","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":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/main.yml:1","Warn: no topLevel permission defined: .github/workflows/publish.yml:1","Info: no jobLevel write permissions found"],"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":"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":"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":"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":"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":"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":"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":"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":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Info: Possibly incomplete results: error parsing shell code: a command can only contain words and redirects; encountered (: create_type_stubs.py:0","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/main.yml:13: update your workflow using https://app.stepsecurity.io/secureworkflow/henribru/google-ads-stubs/main.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/main.yml:16: update your workflow using https://app.stepsecurity.io/secureworkflow/henribru/google-ads-stubs/main.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/main.yml:19: update your workflow using https://app.stepsecurity.io/secureworkflow/henribru/google-ads-stubs/main.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/main.yml:38: update your workflow using https://app.stepsecurity.io/secureworkflow/henribru/google-ads-stubs/main.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/main.yml:41: update your workflow using https://app.stepsecurity.io/secureworkflow/henribru/google-ads-stubs/main.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/main.yml:44: update your workflow using https://app.stepsecurity.io/secureworkflow/henribru/google-ads-stubs/main.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/main.yml:60: update your workflow using https://app.stepsecurity.io/secureworkflow/henribru/google-ads-stubs/main.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/main.yml:63: update your workflow using https://app.stepsecurity.io/secureworkflow/henribru/google-ads-stubs/main.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/main.yml:66: update your workflow using https://app.stepsecurity.io/secureworkflow/henribru/google-ads-stubs/main.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/publish.yml:13: update your workflow using https://app.stepsecurity.io/secureworkflow/henribru/google-ads-stubs/publish.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/publish.yml:16: update your workflow using https://app.stepsecurity.io/secureworkflow/henribru/google-ads-stubs/publish.yml/master?enable=pin","Info:   0 out of   7 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   4 third-party GitHubAction 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":"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":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 12 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-19T11:13:16.164Z","repository_id":35418334,"created_at":"2025-08-19T11:13:16.164Z","updated_at":"2025-08-19T11:13:16.164Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31518631,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-07T03:10:19.677Z","status":"ssl_error","status_checked_at":"2026-04-07T03:10:13.982Z","response_time":105,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5: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":["annotations","google-ads","google-ads-api","mypy","pep561","pylance","pyre","pyright","python","pytype","stubs","stubs-only","type-annotations","type-stubs","typed","typing"],"created_at":"2026-04-07T15:36:57.592Z","updated_at":"2026-04-07T15:36:57.651Z","avatar_url":"https://github.com/henribru.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Type stubs for the Google Ads API Client Library for Python\n\n[![PyPI version](https://badge.fury.io/py/google-ads-stubs.svg)](https://badge.fury.io/py/google-ads-stubs)\n\nThis package provides type stubs for the [Google Ads API Client Library for Python](https://github.com/googleads/google-ads-python). \nIt's currently compatible with v29.1.0 of this library (v23.0 of the API). It allows you to type check usage of the library with e.g. [mypy](http://mypy-lang.org/) and will also improve autocomplete in many editors.\n\n**This is in no way affiliated with Google.**\n\nMost stubs were created automatically by [stubgen](https://mypy.readthedocs.io/en/stable/stubgen.html), the rest are handwritten or generated by self-made scripts.\n\nIf you find incorrect annotations, please create an issue. Contributions for fixes are also welcome.\n\n## Installation\n\n```\n$ pip install google-ads-stubs\n```\n\nThe stubs should be automatically picked up by your editor or typechecker, but note that if you're using Mypy you need to use the `--namespace-packages` option as `google` and `google.ads` are namespace packages.\n\n\n## Caveats\nThe stubs assume the client is constructed with `use_proto_plus=True`. If you use `use_proto_plus=False`, they are unlikely to be of much use to you.\n\nType inference does _not_ work for the `get_type`\nmethod of `GoogleAdsClient`.The workaround is to explicitly state the type. You can also instantiate the object directly to get inference. \n\n```python\n# Replace this:\ncampaign_operation = client.get_type('CampaignOperation')\n# With this:\nfrom google.ads.googleads.v23.services import CampaignOperation\ncampaign_operation: CampaignOperation = client.get_type('CampaignOperation')\n# Or this:\nfrom google.ads.googleads.v23.services import CampaignOperation\ncampaign_operation = CampaignOperation()\n```\nWhile it is technically possible to type this method using a combination of overloading and literal types,\nthis is not included in these stubs. The reason is that it requires about 10,000 overloads, which makes most typecheckers fairly slow.\n\nCertain parts of the stubs assume you are using the latest included API version. This includes `GoogleAdsClient.enums` and calls to `GoogleAdsClient.get_type` and `GoogleAdsClient.get_service` without specifying the `version` argument. If you use an older version, you should import enums directly and specify `version` in these calls even if you specified it when constructing the client.\n\nCertain types are too lenient compared to what's allowed at runtime. The first argument to protobuf message constructors accepts any mapping. \nOn the other hand certain types are more strict than what's allowed at runtime. You can't substitute a protobuf message for an equivalent dict or an enum with it's equivalent name or value.\n\n```python\n# Replace this:\nAdGroupAd({\n    \"status\": \"ENABLED\", \n    \"ad\": {\"type\": 2},\n})\n# With this:\nfrom google.ads.googleads.v23.resources import Ad\nfrom google.ads.googleads.v23.enums import AdGroupAdStatusEnum, AdTypeEnum\nAdGroupAd(\n    status=AdGroupAdStatusEnum.AdGroupAdStatus.ENABLED, \n    ad=Ad(type=AdTypeEnum.AdType.TEXT_AD),\n)\n```\n\n\n## Development\nYou can run `gen.sh` to generate new stubs, but note that there are a few manual steps before and after mentioned in the script.\n\nFeel free to use this to open a PR when new versions come out.\n\nContributions to automate the remaining manual steps are also welcome.","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhenribru%2Fgoogle-ads-stubs","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhenribru%2Fgoogle-ads-stubs","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhenribru%2Fgoogle-ads-stubs/lists"}