pull Google Ads data programmatically without BI tool
Skip the middleman and extract Google Ads data directly. Here’s the three-way choice between APIs, scripts, and BigQuery — plus the exact setup for each.
Built by our community of 2,000 marketers
Free skills and prompts for paid ads and SEO
Templates for Claude, ChatGPT and Perplexity.
Clients we
work with








The short answer
Use the Google Ads API with GAQL (Google Ads Query Language) for precise, custom data extraction; Google Ads Scripts for browser-based automation without infrastructure; or BigQuery Data Transfer service for analysts who want scheduled reports without code.
Each method serves different technical requirements and use cases — the Google Ads API offers the most flexibility, while Scripts eliminate server management, and BigQuery handles the heavy lifting for SQL-based analysis.
BI tools add a layer of abstraction that often limits what data you can access and how quickly you can get it. Going direct gives you real-time access, custom queries, and no monthly platform fees.
Speed and freshness. Google’s APIs deliver data as fresh as 3 hours old, while BI tools often batch sync daily or weekly. For performance monitoring and optimization, that delay matters.
Complete field access. BI tools expose common metrics but hide advanced fields like quality scores, search term details, or auction insights. Direct API access gives you the full dataset.
Three ways to pull Google Ads data
Pick based on your technical setup and how much control you need.
| Method | Best for | Technical requirements | Data freshness |
|---|---|---|---|
| Google Ads API + GAQL | Custom apps, complex automation | Developer + server infrastructure | 3-4 hours |
| Google Ads Scripts | Simple automation, scheduled reports | Basic JavaScript knowledge | 3-4 hours |
| BigQuery Data Transfer | SQL analysis, data warehousing | SQL skills, BigQuery setup | Daily sync |
Method 1: Google Ads API with GAQL
Step 1
Get API access
Apply for a developer token at developers.google.com/google-ads/api. You’ll need to link it to a manager account and pass Google’s compliance review.
Step 2
Set up authentication
Create a service account in Google Cloud Console, download the JSON key file, and configure OAuth2 credentials for the Google Ads API.
Step 3
Install the client library
Use Google’s official client libraries: google-ads-python, google-ads-java, or google-ads-php. Each handles authentication and request formatting.
Step 4
Write GAQL queries
Use Google Ads Query Language to specify exactly what data to extract. GAQL uses SQL-like syntax: SELECT campaign.name, metrics.cost_micros FROM campaign WHERE campaign.status = 'ENABLED'.
Step 5
Handle pagination and rate limits
The API returns up to 10,000 rows per request. For larger datasets, use pagination tokens. Respect the rate limit of 15,000 operations per developer token per day.
Python example
from google.ads.googleads.client import GoogleAdsClient
credentials = {
'developer_token': 'your_dev_token',
'login_customer_id': 'manager_account_id',
'json_key_file_path': 'path/to/service-account.json'
}
client = GoogleAdsClient.load_from_dict(credentials)
service = client.get_service('GoogleAdsService')
query = """
SELECT campaign.name, metrics.cost_micros, metrics.clicks
FROM campaign
WHERE segments.date DURING LAST_7_DAYS
"""
response = service.search(customer_id='123-456-7890', query=query)
for row in response:
print(f"Campaign: {row.campaign.name}")
print(f"Cost: {row.metrics.cost_micros / 1_000_000}")
print(f"Clicks: {row.metrics.clicks}")
Method 2: Google Ads Scripts
Google Ads Scripts run JavaScript directly in your Google Ads account — no servers, no infrastructure, just a browser-based IDE.
Step 1
Access the Scripts interface
Step 2
Write JavaScript queries
Use AdsApp.search() to query data with GAQL syntax. Scripts handle authentication automatically since they run inside your account.
Step 3
Add external integrations
Send data to Google Sheets, email reports, or call external APIs using UrlFetchApp for webhooks and notifications.
Step 4
Schedule execution
Set scripts to run hourly, daily, weekly, or monthly. Google handles the execution automatically.
Step 5
Monitor and debug
Use Logger.log() for debugging and check execution logs in the Scripts interface for errors or performance issues.
Google Ads Script example
function main() {
const query = `
SELECT campaign.name, metrics.cost_micros, metrics.clicks
FROM campaign
WHERE segments.date DURING LAST_7_DAYS
AND campaign.status = 'ENABLED'
`;
const report = AdsApp.search(query);
const data = [];
while (report.hasNext()) {
const row = report.next();
data.push([
row.campaign.name,
row.metrics.costMicros / 1000000,
row.metrics.clicks
]);
}
// Send to Google Sheets
const sheet = SpreadsheetApp.openById('your_sheet_id');
const range = sheet.getRange(1, 1, data.length, 3);
range.setValues(data);
Logger.log(`Exported ${data.length} campaigns`);
}Method 3: BigQuery Data Transfer
The zero-code option for analysts: Google automatically syncs your ads data to BigQuery for SQL analysis.
Step 1
Enable BigQuery API
In Google Cloud Console, enable the BigQuery API and BigQuery Data Transfer API for your project.
Step 2
Create a BigQuery dataset
Set up a dataset to store your Google Ads data. Choose a region close to your other data for better performance.
Step 3
Configure the transfer
In BigQuery, go to Data Transfers and select 'Google Ads'. Authorize access to your Google Ads account and configure which accounts to sync.
Step 4
Set the schedule
Choose daily, weekly, or custom scheduling. Data typically arrives 24-48 hours after ad activity due to Google’s processing delay.
Step 5
Query with SQL
Use standard SQL to analyze your data: SELECT campaign_name, SUM(cost_micros)/1000000 as cost FROM ads_CampaignStats_1234567890 GROUP BY campaign_name.
Get a free instant audit
Get a free, instant read on your paid ads or SEO — and fix it right away.
Paid ads audit
- Catch wasted spend & broad-match leaks
- Find account structure gaps
- Rank your quickest wins
- Spot PMax & brand-search overlap
- Check conversion-tracking health
- Benchmark CPC vs your industry
- Catch wasted spend & broad-match leaks
- Find account structure gaps
- Rank your quickest wins
- Spot PMax & brand-search overlap
- Check conversion-tracking health
- Benchmark CPC vs your industry
SEO audit
- Find keyword & ranking gaps
- Catch technical SEO issues
- Rank your fastest wins
- Surface thin & duplicate pages
- Check indexing & crawl coverage
- Compare backlinks vs competitors
- Find keyword & ranking gaps
- Catch technical SEO issues
- Rank your fastest wins
- Surface thin & duplicate pages
- Check indexing & crawl coverage
- Compare backlinks vs competitors
Worked example: Daily performance monitoring
Say you want to monitor campaign performance daily and alert when ROAS drops below target. Here’s how each method handles it:
Google Ads API approach
Set up a cron job that runs every 4 hours, queries yesterday’s data with GAQL, calculates ROAS per campaign, and sends alerts via Slack/email when thresholds are breached. Requires server hosting but gives real-time control.
Google Ads Scripts approach
Write a script that calculates ROAS, compares to targets, and emails alerts. Schedule it to run daily at 8 AM. Zero infrastructure needed, but limited to email/sheets for notifications.
BigQuery approach
Create a scheduled query that runs daily, calculates ROAS from transferred data, and saves results to a dashboard table. Connect to Data Studio or Looker for visual alerts. Best for historical analysis, not real-time monitoring.
Authentication setup (API method)
The Google Ads API uses OAuth2 + service accounts. Here’s the step-by-step setup:
- 1Create a Google Cloud project. Go to console.cloud.google.com, create a new project, and enable the Google Ads API from the API Library.
- 2Set up OAuth2 consent screen. Configure the OAuth consent screen for your project. Add your email to test users if using external user type.
- 3Create OAuth2 credentials. In Credentials, create an OAuth 2.0 Client ID. Choose 'Desktop application' or 'Web application' based on your setup.
- 4Generate refresh token. Use Google’s OAuth2 Playground (developers.google.com/oauthplayground) to generate a refresh token with Google Ads API scope.
- 5Apply for developer token.
Save these credentials in a secure config file — never hardcode them. The developer token review can take 3-7 business days for new applications.
Common mistakes when pulling Google Ads data
- Not handling pagination — the API limits results to 10,000 rows per request. Always check for next_page_token.
- Ignoring rate limits — hitting 15,000 operations per day kills your API access. Build in exponential backoff for retries.
- Wrong customer ID format — use the 10-digit ID without dashes (1234567890), not the UI format (123-456-7890).
- Querying too frequently — Google Ads data updates every 3-4 hours. Polling more often wastes quota and returns stale data.
- Missing attribution windows — conversions can attribute up to 30 days later. Don’t assume yesterday’s data is final.
Google Ads API vs Scripts: when to use each
Both access the same data, but the infrastructure and complexity differ significantly.
- Use the Google Ads API when you need custom applications, external integrations, real-time processing, or manage multiple client accounts from one codebase.
- Use Google Ads Scripts for simple automation, scheduled reports, Google Sheets integration, or when you want zero server maintenance.
Scripts have a 6-minute execution limit and can’t store data persistently, while the API has no time limits but requires you to handle hosting, databases, and error recovery.
Essential GAQL queries for performance data
Google Ads Query Language uses SQL-like syntax. Here are the most useful patterns:
Campaign performance (last 30 days)
SELECT campaign.name, metrics.cost_micros, metrics.clicks,
metrics.conversions, metrics.conversions_value
FROM campaign
WHERE segments.date DURING LAST_30_DAYS
AND campaign.status = 'ENABLED'Ad group performance with Quality Score
SELECT ad_group.name, metrics.cost_micros, metrics.ctr,
ad_group_criterion.quality_info.quality_score
FROM keyword_view
WHERE segments.date DURING YESTERDAY
AND ad_group.status = 'ENABLED'Search terms with impression share
SELECT search_term_view.search_term, metrics.impressions,
metrics.search_impression_share, metrics.clicks
FROM search_term_view
WHERE segments.date DURING LAST_7_DAYS
AND metrics.impressions > 10Skip the setup entirely
Ryze AI connects to your Google Ads account automatically and continuously monitors performance data to execute optimizations 24/7 — budget reallocation, bid adjustments, keyword management, and creative testing — instead of just extracting data for manual analysis. Learn more at get-ryze.ai — Ryze AI (get-ryze.ai), distinct from ryze.so.
Troubleshooting common issues
"PERMISSION_DENIED" errors
Check that your developer token is approved and linked to the right manager account. Test with the Google Ads API Test Account first.
"INVALID_CUSTOMER_ID" errors
Use the 10-digit customer ID (without dashes) from the account URL. Manager accounts need login_customer_id in the request header.
Empty results from valid queries
Add segments.date to verify the date range has data. Some metrics like conversions may be empty for recent dates due to attribution delays.
Rate limit exceeded
Implement exponential backoff and respect the 15,000 operations per day limit. Consider upgrading to Basic or Standard access for higher quotas.
Scripts timing out
Break large queries into smaller chunks. Use AdsApp.select() for simpler queries or reduce the date range to stay under the 6-minute limit.
Stop pulling data. Start executing changes.
- ✓Connects to Google Ads automatically
- ✓Monitors performance data 24/7
- ✓Executes optimizations without manual work
2,000+
Marketers
$500M+
Ad spend
23
Countries
Keep going
Frequently asked questions
How do I get Google Ads API access without a BI tool?
Apply for a developer token in Google Ads (Tools & Settings → API Center), set up OAuth2 credentials in Google Cloud Console, and use Google's official client libraries to authenticate and query data directly.
What is GAQL and how do I use it?
Google Ads Query Language (GAQL) uses SQL-like syntax to query advertising data. Write SELECT statements to specify fields, use WHERE clauses to filter, and handle pagination for large datasets. All API methods support GAQL.
Can I pull Google Ads data without coding?
Yes, use BigQuery Data Transfer service to automatically sync Google Ads data to BigQuery, then query with SQL. Alternatively, Google Ads Scripts require only basic JavaScript knowledge for simple automation.
How fresh is Google Ads API data?
Google Ads data updates every 3-4 hours. Recent conversion data may take up to 24-48 hours to appear due to attribution windows. BigQuery transfers typically run daily.
What are the rate limits for Google Ads API?
The default quota is 15,000 operations per developer token per day. Each search request counts as one operation. You can request higher quotas (Basic: 40K, Standard: 1.5M) after approval.





