Generated banner for Google Ads API Quickstart
Generated logo for Google Ads API Quickstart

Google Ads API Quickstart

GoogleOfficialCreated by google-ads-api-team

  • Skill
  • Tool integration
  • Business and productivity
  • Apache-2.0
  • Medium risk

From the author

Guides developers through Google Ads API quickstart: credential setup, choosing from 6 client libraries/REST, configuring environments, and running a "retrieve campaigns" script. Troubleshoots common setup errors: USER_PERMISSION_DENIED, login_customer_id issues, and DEVELOPER_TOKEN_NOT_APPROVED. Use this skill when: - The user asks how to get started with the Google Ads API. - The user needs to set up Google Ads credentials or developer tokens. - The user wants to write a quickstart/example script for Google Ads. - The user encounters errors like USER_PERMISSION_DENIED or DEVELOPER_TOKEN_NOT_APPROVED.
— the description by google-ads-api-team

AutoGineer summary

Written by AutoGineer from the skill’s own files, not by the author

This skill provides a structured path for developers to integrate with the Google Ads API. It covers the entire lifecycle from obtaining necessary credentials—such as developer tokens and OAuth2 secrets—to configuring client libraries or REST endpoints. It emphasizes dynamic version resolution to ensure code longevity and provides specific troubleshooting steps for common authentication and permission errors.

What it does

  • Guides users through obtaining developer tokens and OAuth2 credentials.
  • Provides setup instructions for six official client libraries and direct REST access.
  • Enforces dynamic version resolution for API endpoints and library dependencies.
  • Offers standardized troubleshooting for common errors like USER_PERMISSION_DENIED.
  • Explains the mandatory configuration of login_customer_id for manager account hierarchies.
  • Provides templates for environment-specific configuration files.

When to use it

  • When you need to perform your first successful request to the Google Ads API.
  • When you are unsure how to configure credentials or manage OAuth2 flows for Google Ads.
  • When you encounter common setup errors like DEVELOPER_TOKEN_NOT_APPROVED.
  • When you need to integrate Google Ads data into your own applications or scripts.

Advantages

  • Ensures secure and up-to-date integrations through dynamic versioning.
  • Reduces setup friction by providing clear, language-specific reference guides.
  • Prevents common configuration pitfalls by explicitly documenting hierarchy requirements.
  • Provides a clear path for testing using sandbox accounts.

Usage examples

“How do I get started with the Google Ads API in Python?”
The agent will guide you through installing the google-ads library, setting up your client_secrets.json, and running a script to retrieve your campaigns.
“I am getting a USER_PERMISSION_DENIED error when calling the Google Ads API.”
The agent will explain the manager-client account hierarchy and instruct you to add your 10-digit Manager Account ID as the login_customer_id.
“How do I configure the Google Ads API for a .NET project?”
The agent will provide the NuGet installation command and show you how to initialize the GoogleAdsConfig object in your C# code.

Install

  1. Download the skill as a ZIP:

    https://autogineer.com/agent-skills/google/google-ads-api-quickstart/download
  2. Unzip it into the cross-client skills folder of your project:

    mkdir -p .agents/skills && unzip google-ads-api-quickstart.zip -d .agents/skills

Documentation by google-ads-api-team

Google Ads API Quickstart

This skill guides you from absolute zero to running your first successful request to retrieve campaigns.

Supported Tracks

You can choose to use this skill with:

  1. Official Client Libraries: Python, Java, .NET, PHP, Ruby, or Perl.

  2. Direct REST: Raw HTTP REST requests.


Crucial Requirement: Dynamic Version Resolution & Runtime Resolution

[!IMPORTANT] To ensure the integration is secure, stable, and up-to-date, you must resolve all API and runtime versions dynamically. Do not rely on hardcoded defaults.

Strict Constraints:
  • DO NOT Hardcode: Never use hardcoded Google Ads API versions (e.g., v24) or language runtime versions (e.g., Python 3.8+, Java 11+) in generated code or environment setup instructions, unless the user explicitly requests a specific version.

  • MANDATORY Dynamic Resolution: You must dynamically resolve the latest stable versions at the start of execution before generating any code or configuration, using the procedures detailed below.

A. Dynamic API Version Resolution

To ensure the integration is secure, stable, and up-to-date, you MUST resolve the absolute newest stable major version of the Google Ads API dynamically.

Execution Steps:
  1. Pre-Flight Version Resolution: Use your web search or URL-reading tools to inspect the latest entry in the Google Ads API Release Notes or the highest versioned directory in the Googleapis Github Repository to resolve RESOLVED_API_VERSION (e.g., v24). If using Java, you MUST also resolve the latest stable release version of the Google Ads Java Client Library (referred to as RESOLVED_LIBRARY_VERSION, e.g., 34.0.0).

  2. Mandatory Response Anchor: You MUST output the following confirmation block as the very first line of your response to the user. Do not output any greeting, pleasantries, or introductory text before this block.

    [SYSTEM: Using Google Ads API version: RESOLVED_API_VERSION (Resolved from release notes)]
  3. Strict Placeholder Mapping Table: You MUST perform on-the-fly search-and-replace on all code templates and reference files using the mapping table below. Do not leave raw placeholders in the final output.

    Target Language / TechPlaceholder in TemplateReplacement PatternExample (Assuming API v24)
    Java (Maven/Gradle)LATEST_LIBRARY_VERSIONSearch & substitute the latest Maven release version of the library.34.0.0
    Java (Imports)vXXReplace with lower-case API version.com.google.ads.googleads.v24
    .NET / C# (Namespaces)VXXReplace with title-case API version.Google.Ads.GoogleAds.V24
    PHP (Namespaces)VXXReplace with title-case API version.Google\Ads\GoogleAds\V24
    REST (Endpoint URL)vXXReplace with lower-case API version.https://googleads.googleapis.com/v24/...

[!TIP] Offline Fallback: If the URLs are unreachable or the scrape fails, do not halt execution. Fall back to these last-known stable versions:

  • Google Ads API Major Version (RESOLVED_API_VERSION): v24

  • Java Client Library Version (RESOLVED_LIBRARY_VERSION): 34.0.0

B. Dynamic Language Runtime Version Resolution

To prevent the generated setup guides from becoming obsolete due to language deprecation cycles, you MUST resolve language requirements dynamically.

Execution Steps:
  1. Fetch Live Requirements: Use your URL-reading tools to inspect the official Google Ads Client Libraries - Supported Versions page.

  2. Extract Minimums: Identify the minimum supported runtime version for the user's chosen language by scanning the Overview page or compatibility tables (e.g., looking for explicit requirements like Python 3.8+, Java 11+, .NET 6.0+, PHP 8.1+, Ruby 3.0+).

  3. Apply On-The-Fly: Substitute all runtime placeholders (e.g., <PYTHON_MIN_VERSION>) in your generated setup guides with these resolved versions.

[!TIP] Offline Fallback: If the URL is unreachable or the scrape fails, do not halt execution. Fall back to these last-known safe minimum versions:

  • Python: 3.9+

  • Java: 11+

  • .NET: 6.0+

  • PHP: 8.1+

  • Ruby: 3.0+

  • Perl: 5.28.1+


Step 1: Obtain Google Ads API Credentials

Before installing libraries or making API calls, you must obtain the five required authentication parameters.

1. Developer Token
  • Purpose: Identifies your developer access and API quota.

  • How to Obtain:

    1. Navigate directly to the API Center in your Google Ads Manager Account: https://ads.google.com/aw/apicenter (Note: You must sign in with a Manager account, not a standard serving account).

    2. Copy your Developer Token.

[!WARNING] Pending Token Restriction: If your Developer Token status is "Pending" (unapproved), you MUST ONLY target Google Ads Test Accounts. Attempting to call a production account with a pending token will fail with the error: DEVELOPER_TOKEN_NOT_APPROVED.

2. OAuth2 Client ID & Client Secret
  • Purpose: Identifies your application to Google's OAuth 2.0 server and allows you to request user authorization.

  • How to Obtain:

    1. Open the Google Cloud Console.

    2. Create a new project (or select an existing one).

    3. Search for the Google Ads API in the API Library and click Enable.

    4. Configure the OAuth Consent Screen:

      • Select External user type.

      • Set the Publishing Status to Testing.

      • [!IMPORTANT]

      • Add Test Users: You MUST add the email address of the Google account you use to log into Google Ads as a Test User in this step. Otherwise, you will be blocked during authorization.

    5. Create the OAuth Client:

      • Go to APIs & Services 🡒 Credentials.

      • Click Create Credentials 🡒 OAuth client ID.

      • Select Desktop App as the Application Type.

      • Name the client and click Create.

    6. Download Secrets: Click the download icon (JSON) next to your newly created Client ID. Save this file locally as client_secrets.json.

3. OAuth2 Refresh Token
  • Purpose: Allows your application to obtain new access tokens automatically without requiring manual user login every hour.

  • How to Obtain: You must run the Google Cloud (gcloud) CLI to generate your refresh token.

    1. Install and Verify gcloud CLI:

    Ensure the gcloud CLI is installed and available in your terminal.

    2. Execute the Login Flow:

    Run the following command in your terminal, passing the path to the client_secrets.json file downloaded in the previous step:

    gcloud auth application-default login \
      --scopes=https://www.googleapis.com/auth/adwords,https://www.googleapis.com/auth/cloud-platform \
      --client-id-file=client_secrets.json
    3. Authorize in Browser:
    1. The command will open a Google Account login window in your browser.

    2. Sign in using the Test User email registered in your OAuth Consent Screen setup.

    3. If your app is unverified, click Advanced and continue to the project. Click Continue to grant permissions.

    4. Retrieve Your Refresh Token:

    Once successful, gcloud will output a message indicating where the credentials were saved (typically ~/.config/gcloud/application_default_credentials.json). Open that file to copy your refresh_token.

4. Client Customer ID
  • Purpose: The 10-digit ID of the specific Google Ads account you want to query or make changes to.

  • Format: Must be 10 digits with no hyphens (e.g., 1234567890, NOT 123-456-7890).

  • How to Find It: Log in to the Google Ads UI; the ID is displayed in the top-right corner next to your user icon.

[!IMPORTANT] Test Account Requirement: If your Developer Token is pending (unapproved), this MUST be the Customer ID of a Test Account. Test accounts have a red "Test account" banner in the top right of the UI.


5. Login Customer ID
  • What it is: The 10-digit Customer ID of the Google Ads Manager Account that owns or manages the target client account.

  • Format: Must be 10 digits with no hyphens (e.g., 9876543210).

  • When to Use: This is mandatory if your OAuth credentials (and developer token) belong to a Manager Account, but you are querying a child/client account (Client Customer ID).

[!CAUTION] Preventing USER_PERMISSION_DENIED: If you are accessing a client account through a Manager Account hierarchy, you MUST set this parameter.

  • login_customer_id = The Manager Account ID.

  • client_customer_id = The Child/Client Account ID. Leaving login_customer_id blank in a manager-client hierarchy is the #1 cause of permission errors.


Step 2: Choose Your Integration Strategy

Developers can connect to the Google Ads API using either the official high-level client libraries or direct HTTPS REST requests.

[!IMPORTANT] Mandatory Agent Directive: Once the user selects their language, you MUST:

  1. Use the view_file tool to lazy-load the corresponding reference file listed below.

  2. Apply the Dynamic Version Resolution (Section B) to dynamically replace all vXX/VXX placeholders and library versions before generating code.

Python

If you need to set up the Google Ads API environment for Python, do not guess the configuration. Instead, read the detailed setup guide:

Java

If you need to set up the Google Ads API environment for Java, do not guess the configuration. Instead, read the detailed setup guide:

.NET / C#

If you need to set up the Google Ads API environment for .NET/C#, do not guess the configuration. Instead, read the detailed setup guide:

PHP

If you need to set up the Google Ads API environment for PHP, do not guess the configuration. Instead, read the detailed setup guide:

Ruby

If you need to set up the Google Ads API environment for Ruby, do not guess the configuration. Instead, read the detailed setup guide:

Perl

If you need to set up the Google Ads API environment for Perl, do not guess the configuration. Instead, read the detailed setup guide:

Path B: Direct HTTP REST (No Library Overhead)

Use this path if the user's environment does not support the official client libraries (e.g., lightweight serverless functions, custom language stacks, or restricted runtimes).

[!IMPORTANT] Mandatory Agent Directive: If the user chooses the REST path, you MUST:

  1. Use the view_file tool to lazy-load the REST reference file below.

  2. Apply Dynamic Version Resolution (Section B) to replace all vXX placeholders in the endpoint URLs (e.g., resolving vXX to v24 in https://googleads.googleapis.com/v24/...).

REST (HTTP)

If you need to set up the Google Ads API environment for REST (HTTP), do not guess the configuration. Instead, read the detailed setup guide:


Cross-Referencing: AI-Assistant & MCP Connection

[!TIP] AI Assistant / MCP Integration Handoff: If the goal is to connect an AI Assistant (such as Gemini, Cursor, or Claude Code) to query Google Ads via natural language:

  1. DO NOT write custom scripts or client library code.

  2. STOP executing this skill.

  3. Transition Immediately to the google-ads-api-mcp-setup skill to install and configure the official Google Ads Model Context Protocol (MCP) Server.


Step 4: Troubleshooting Common Errors

[!IMPORTANT] Static Diagnostics Constraint: When troubleshooting, you MUST NOT execute bash commands, run local test scripts, or attempt to reproduce the error in the workspace. Rely entirely on static code analysis, configuration review, and the diagnostic guides below to prevent endless, failing execution loops.

1. Error: USER_PERMISSION_DENIED
  • Symptom: You receive a USER_PERMISSION_DENIED error when executing API requests (e.g., retrieving campaigns).

  • Likely Cause: The authenticating OAuth2 user has access to the target client account indirectly through a Manager Account, but the request header is missing the Manager Account's ID.

Required Agent Response Checklist:

When helping a user with this error, your response MUST include:

  1. [ ] Explain the Hierarchy: Explain that the authenticating user likely belongs to a Manager Account that sits above the target client account.

  2. [ ] Provide the Fix: Instruct the user to add their 10-digit Manager Account ID as the login_customer_id in their configuration file.

  3. [ ] Explain the Routing Logic: Explain that login_customer_id tells the API to route the OAuth credentials through the manager account to validate access to the child account.

  4. [ ] Provide the Configuration Template: Show the exact YAML configuration block below.

[!CAUTION] Security Guardrail: Under no circumstances should you suggest exposing raw passwords, creating new unapproved developer tokens, or widening OAuth scopes beyond the standard adwords scope to bypass this error.

Configuration Fix Example (google-ads.yaml):
developer_token: INSERT_DEVELOPER_TOKEN_HERE
client_id: INSERT_OAUTH2_CLIENT_ID_HERE
client_secret: INSERT_OAUTH2_CLIENT_SECRET_HERE
refresh_token: INSERT_OAUTH2_REFRESH_TOKEN_HERE

# Add your 10-digit Manager Account ID here to resolve USER_PERMISSION_DENIED:
login_customer_id: INSERT_LOGIN_CUSTOMER_ID_HERE
2. Error: DEVELOPER_TOKEN_NOT_APPROVED
  • Symptom: The script fails with a DEVELOPER_TOKEN_NOT_APPROVED error message.

  • Likely Cause: Your Developer Token is currently in the "Pending" (unapproved) state, and you are attempting to target a live production Google Ads account.

Required Agent Response Checklist:

When helping a user with this error, your response MUST include:

  1. [ ] Explain the "Pending" Restriction: Explain that an unapproved (Pending) developer token is fully functional but restricted to Google Ads Test Accounts only.

  2. [ ] Define Production Access Levels: You MUST explicitly list all three access levels by name: state that targeting live production accounts requires the token to be approved for Explorer Access, Basic Access, or Standard Access by the Google Ads API compliance team. Do not condense or paraphrase this to "at least Basic Access".

  3. [ ] Provide Sandbox Setup Steps: Guide the user on how to set up a sandbox environment:

    • Create a Test Manager Account (which does not require an approved token).

    • Create Test Client Accounts under that Test Manager.

    • Use the Test Client Customer ID in their configuration.

  4. [ ] Provide a Link to the Guide: Point the user to the official Google Ads API Test Accounts Guide.

[!CAUTION] Security & Integrity Guardrail: You MUST NOT advise the developer to modify the client library source code, bypass token validation checks, or use third-party "cracked" wrappers to bypass this error. The restriction is enforced server-side by Google, and client-side modifications will not work.

Files

references/python.md

Google Ads API Python Setup Reference

This guide outlines how to configure, install, and write your first Google Ads API call using Python.

Prerequisites

[!IMPORTANT] Action Required: Dynamic Python Version Resolution Before presenting these prerequisites to the user, you must dynamically resolve the minimum required Python version to ensure compliance with current support cycles:

  1. Access the Supported Client Library Versions documentation page.

  2. Scan the page/table for the Python client library to identify the minimum supported Python runtime version (e.g., Python 3.8+).

  3. Replace the MINIMUM_PYTHON_VERSION placeholder below with the dynamically retrieved version in your final output to the user.

  • Python: Version MINIMUM_PYTHON_VERSION or higher.

  • Package Manager: pip


Step 1: Environment & Installation

[!TIP] Best Practice: Always install the client library within a virtual environment (venv) to prevent dependency conflicts with other system packages. This is especially important for automated agents operating in shared workspaces.

1. Create and Activate a Virtual Environment

Run the following commands in your project root:

python3 -m venv .venv
source .venv/bin/activate
2. Install the Library

Install the official Google Ads Python Client Library:

python -m pip install google-ads

Step 2: Configuration (google-ads.yaml & Alternate Methods)

Create a file named google-ads.yaml.

The Python client library supports multiple methods for initializing the GoogleAdsClient:

  1. YAML File (load_from_storage): Resolves in order: (1) Explicit path passed to load_from_storage('/path/to/google-ads.yaml'), (2) GOOGLE_ADS_CONFIGURATION_FILE_PATH environment variable, or (3) $HOME/google-ads.yaml by default.

  2. Environment Variables (load_from_env): Reads uppercase GOOGLE_ADS_ prefixed variables (e.g., GOOGLE_ADS_DEVELOPER_TOKEN, GOOGLE_ADS_CLIENT_ID). (Note: If GOOGLE_ADS_CONFIGURATION_FILE_PATH is set, load_from_env will load from that YAML file instead).

  3. Dictionary (load_from_dict): Accepts a Python dictionary of credentials directly.

  4. YAML String (load_from_string): Accepts a raw YAML string in memory.

[!IMPORTANT] Hermetic Workspace Rule: For self-contained project environments, it is best practice to keep google-ads.yaml in your project root directory and load it explicitly.

Populate the file with your credentials:

# google-ads.yaml
developer_token: INSERT_DEVELOPER_TOKEN_HERE
client_id: INSERT_OAUTH2_CLIENT_ID_HERE
client_secret: INSERT_OAUTH2_CLIENT_SECRET_HERE
refresh_token: INSERT_OAUTH2_REFRESH_TOKEN_HERE
# Optional: Un-comment if you are accessing a client account through a manager account
# login_customer_id: INSERT_LOGIN_CUSTOMER_ID_HERE
use_proto_plus: true

Step 3: Write the Quickstart Script

Create a file named get_campaigns.py.

[!IMPORTANT] Rule 1: Normalize Customer IDs Before passing the Client Customer ID to the API, you must normalize it by stripping all hyphens (e.g., converting 123-456-7890 to 1234567890). The script below handles this automatically in the entry point.

Rule 2: Configuration Pathing The script below is configured to look for google-ads.yaml in the current working directory first, falling back to environment variables or default search paths.

import argparse
import os
import sys
from google.ads.googleads.client import GoogleAdsClient
from google.ads.googleads.errors import GoogleAdsException

def main(client, customer_id):
    # Initialize the Google Ads Service
    googleads_service = client.get_service("GoogleAdsService")
    
    # Define the GAQL query
    query = "SELECT campaign.id, campaign.name, campaign.status FROM campaign ORDER BY campaign.id"
    
    print("Querying Google Ads API...")
    try:
        # Execute the search stream request
        stream = googleads_service.search_stream(customer_id=customer_id, query=query)
        for response in stream:
            for row in response.results:
                print(f"Campaign found: ID = {row.campaign.id}, Name = '{row.campaign.name}', Status = {row.campaign.status.name}")
                
    except GoogleAdsException as ex:
        print(f"Request ID '{ex.request_id}' failed with status '{ex.error.code().name}':")
        for error in ex.failure.errors:
            print(f"\tError: {error.message}")
        sys.exit(1)

if __name__ == '__main__':
    # Determine configuration file path (prefer local workspace config)
    local_config = os.path.join(os.getcwd(), "google-ads.yaml")
    
    if os.path.exists(local_config):
        # Load explicitly from local workspace
        googleads_client = GoogleAdsClient.load_from_storage(local_config)
    elif "GOOGLE_ADS_DEVELOPER_TOKEN" in os.environ:
        # Load from environment variables
        googleads_client = GoogleAdsClient.load_from_env()
    else:
        # Fallback to default search paths (GOOGLE_ADS_CONFIGURATION_FILE_PATH or $HOME/google-ads.yaml)
        googleads_client = GoogleAdsClient.load_from_storage()

    parser = argparse.ArgumentParser(description="Lists campaigns for a specified customer ID.")
    parser.add_argument("-c", "--customer_id", required=True, help="10-digit customer ID.")
    
    args = parser.parse_args()
    
    # Normalize customer ID by removing hyphens before passing to main
    normalized_customer_id = args.customer_id.replace("-", "")
    
    main(googleads_client, normalized_customer_id)

Step 4: Run the Script

Execute the script from your terminal, passing the customer ID as an argument.

[!NOTE] Ensure your virtual environment is active (source .venv/bin/activate) before running.

python get_campaigns.py -c XXXXXXXXXX

(Replace XXXXXXXXXX with your 10-digit customer ID, with or without hyphens).


Step 5: Verification & Troubleshooting

Expected Success Output

Upon successful execution, you should see output similar to the following:

Querying Google Ads API...
Campaign found: ID = 123456789, Name = 'Search - Brand - US', Status = ENABLED
Campaign found: ID = 987654321, Name = 'Display - Remarketing', Status = PAUSED
Common Errors
Error Symptom / CodeRoot CauseSolution
FileNotFoundException / File not foundThe library cannot find google-ads.yaml.Ensure the file is named exactly google-ads.yaml and is placed in the directory from which you are running the script, or in your $HOME directory.
DEVELOPER_TOKEN_NOT_APPROVEDYou are using an unapproved ("Pending") developer token against a production account (production calls require Explorer, Basic, or Standard Access).Use a Test Account (which allows pending tokens) or wait for token approval.
NOT_ADS_USERThe OAuth2 user credentials used to generate the refresh token do not have access to the specified -c/--customer_id.Re-authenticate the OAuth2 flow using a Google account that has access to the target Ads account.
ModuleNotFoundError: No module named 'google'Python cannot find the installed library.You likely installed the library in a virtual environment but are running the script using the global python interpreter. Ensure you run source .venv/bin/activate first.

Requirements and compatibility

Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta

“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.

Needs: Needs a command-line tool, Needs Python

The author says: Outbound HTTPS connectivity required to access the Google Ads API and documentation. Note: If network access is restricted, the agent will fall back to using the last-known stable versions cached within the skill resources.

Security

What our scanner noticed· Medium risk

  • References to credential files
  • Instructions that use the network

A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.

Attribution and licence

Created by
google-ads-api-team
Publisher
Google (Official)
Source
google/skills · skills/ads/google-ads-api-quickstart · commit 2194d3b
Licence
Apache License 2.0 (redistribution allowed)
  • LICENSE (added by AutoGineer from LICENSE)
  • ATTRIBUTION.md (written by AutoGineer)
Synced

AutoGineer is not affiliated with or endorsed by google-ads-api-team or Google.

Download ZIP

The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download google-ads-api-quickstart.zip