# Google Ads from the command line.

Adwarp is an open-source CLI and MCP server for Google Ads, run with npx adwarp google from your terminal. Research keywords, launch paused Search campaigns after a dry run and pull reports into cron.

```text
$ npx adwarp google launch --brief google-brief.json
budget, campaign, ad groups, keywords and ads planned
Validated by Google. Nothing was created. Re-run with --apply to create it.
$ npx adwarp google launch --brief google-brief.json --apply
Created campaign 21874059321 (PAUSED)
Everything is PAUSED. Turn it on in the Google Ads UI when you are ready.
```

## Set up in 3 steps.

1. Get Google Ads API access. A developer token from your Google Ads manager account, plus a Desktop app OAuth client in Google Cloud.

   [ads.google.com/aw/apicenter](https://ads.google.com/aw/apicenter)
2. Sign in from your terminal. Add both to ~/.adwarp/google.json, and Adwarp opens your browser for Google's approval.

   `npx -y adwarp google auth login`
3. Run your first command. A read-only check that proves the token, the OAuth client and account access all work.

   `npx adwarp google accounts list`

### Run it on a schedule?

1 cron line pulls last week's search terms every Monday at 9am.

`crontab`:

```text
0 9 * * 1 npx adwarp google report perf search_term -p last_7_days
```

## 5 commands to try first.

### Keyword ideas from a seed and a page

```text
$ npx adwarp google keywords "revops automation" -u https://example.com/product
volume  competition  bid range  keyword
Up to 50 ideas, 1 tab-separated row each.
```

### Dry run, then launch paused

```text
$ npx adwarp google launch --brief google-brief.json
budget, campaign, ad groups, keywords and ads planned
Validated by Google. Nothing was created. Re-run with --apply to create it.
$ npx adwarp google launch --brief google-brief.json --apply
Created campaign 21874059321 (PAUSED)
Everything is PAUSED. Turn it on in the Google Ads UI when you are ready.
```

### Last week's search terms

```text
$ npx adwarp google report perf search_term -p last_7_days
Totals first, then 1 row per search term
Cost, impressions, CTR, CPC and conversions for each.
```

### Campaigns, paused included

```text
$ npx adwarp google campaigns list
Each campaign with its status, channel and daily budget
Its ad groups indented under it, paused included
```

### A raw GAQL query

```text
$ npx adwarp google query "SELECT campaign.name, campaign.status FROM campaign"
Read-only. Any SELECT the other commands don't cover.
```

## Why running Google Ads from the CLI gets better results.

### Every launch is a dry run first

Without --apply, Google validates the whole build and nothing gets created.

### Launches land whole

Budget, campaign, ad groups, keywords and ads go in 1 atomic change, so a failure never leaves half a campaign.

### Reports run on schedule

Cron pulls search terms every week instead of whenever someone remembers.

### Briefs repeat exactly

A brief file is the whole campaign, so the next test reuses it with 1 change.

## Questions, answered.

### What is the Google Ads CLI in Adwarp?

npx adwarp google is the Google Ads part of Adwarp's open-source CLI. It researches keywords, launches paused Search campaigns and reports, from your terminal.

### Does a launch go live?

No. Without --apply it's a dry run Google validates, and with --apply the campaign is created paused. You enable it in Google Ads.

### Can I run raw GAQL?

Yes, read-only. npx adwarp google query runs any SELECT against the account.

### Do I need an AI client?

No. The CLI runs on its own. The same tools run as an MCP server in Claude, Codex or Cursor when you'd rather ask.

### Does it work with the hosted endpoint?

Not for Google Ads. The hosted endpoint serves many callers, and Google credentials there would come from shared server settings, so it never registers the Google tools. Run Adwarp on your machine with your own developer token and OAuth client.

### What are the Google commands?

Every one runs as npx adwarp google followed by the command.

Commands that read an account take -c for the customer id, which defaults to defaultCustomerId in google.json. Periods for -p are last_7_days, last_30_days, last_90_days, month_to_date and last_month.

| npx adwarp google | What it does |
| --- | --- |
| `auth login` | Sign in with your OAuth client. |
| `accounts list` | Every customer this login can reach. |
| `accounts clients <managerId>` | Client accounts under a manager account. |
| `keywords <seeds...> [-u <url>]` | Keyword ideas from seed terms, and from a landing page with -u. |
| `campaigns list` | Campaigns with their ad groups, paused included. |
| `ads <adGroupId>` | Ads in an ad group, with their responsive search copy. |
| `conversions list` | Conversion actions, to name 1 in a brief. |
| `launch --brief <brief.json>` | A paused Search campaign. A dry run unless you add --apply. |
| `report perf <level>` | Rows by campaign, ad group, ad, keyword or search term. |
| `query "<GAQL>"` | A raw, read-only GAQL query. |

### What access do I need?

A Google Ads developer token from a manager account and a Desktop app OAuth client. Campaigns and reporting work on Explorer access, and keyword research needs Basic access.

- A developer token from the API Center of a Google Ads manager account. A plain client account can't issue one.
- Explorer access arrives automatically and covers campaigns and reporting. Keyword research needs Basic access, a separate application on the same screen.
- An OAuth client of the Desktop app type, in a Google Cloud project with the Google Ads API enabled.
- A consent screen that isn't left in Testing, which issues sign-ins that stop working after 7 days.

### What goes in google.json?

Your OAuth client, developer token and account ids, kept on your machine.

loginCustomerId is your manager account, needed only when you reach the ad account through one. Then run npx -y adwarp google auth login.

`~/.adwarp/google.json`:

```json
{
  "clientId": "....apps.googleusercontent.com",
  "clientSecret": "...",
  "developerToken": "...",
  "loginCustomerId": "1234567890",
  "defaultCustomerId": "0987654321",
  "defaultConversionActionNames": ["Demo Booked"]
}
```

### Which house rules does every campaign follow?

Search network only, people in your target area, manual CPC to start, and created paused.

- Search network only. Display expansion and search partners are off.
- People physically in your target area. US means people in the US, not anyone who searched about it.
- Manual CPC to start. Switch to smart bidding in Google Ads once there's conversion data.
- Created paused, with no tool to enable it. You switch it on in Google Ads.
- Search campaigns only for now. No Performance Max, Display, Shopping, video or Customer Match yet.

## Related

- [Google Ads](https://adwarp.dev/google-ads): Search campaigns, keywords, reporting
- [Google Ads in Claude](https://adwarp.dev/google-ads/claude): Ask in plain words instead
- [LinkedIn Ads CLI](https://adwarp.dev/linkedin-ads/cli): The same CLI for LinkedIn

Unofficial. Not affiliated with or endorsed by LinkedIn or Google.

Canonical page: https://adwarp.dev/google-ads/cli
Last updated: 2026-10-18
