# Manage Google Ads keywords (adsap_google_manage_keywords)

Manages Search keywords after a campaign exists.

Canonical: https://adsap.ai/docs/tools/adsap_google_manage_keywords
Updated: 2026-09-13

**Platform:** Google Ads · **Read or write:** Write · **Plan:** All plans · **Consumes a task:** Yes · **Preview supported:** Yes

## What it does

Manages Search keywords after a campaign exists. It adds up to 100 keywords or ad group negatives in one batch, adds campaign-level negative keywords, replaces one keyword's text or match type, or removes a keyword. Ask for a preview first.

## Parameters

Descriptions are shortened from the tool schema. Your assistant sees the full text.

| Name | Type | Required | Description |
|---|---|---|---|
| `op` | one of `add`, `add_negative`, `replace`, `remove` | Yes |  |
| `ad_account_id` | string | Yes | Bare 10-digit Google Ads customer ID (from adsap_google_list_ad_accounts). No dashes, no act_ prefix. |
| `ad_group_id` | string | No | op 'add' only: the EXISTING ad group to add keywords/negatives to. |
| `campaign_id` | string | No | op 'add_negative' only: the campaign to add campaign-level negatives to. |
| `keywords` | array of object | No | ops 'add' / 'add_negative': the keywords to create. For add_negative, cpc_bid/negative are not allowed (campaign keywords are negative by definition). |
| `keywords[].text` | string | Yes | Keyword text, 80 chars max (Google limit). |
| `keywords[].match_type` | one of `EXACT`, `PHRASE`, `BROAD` | Yes |  |
| `keywords[].cpc_bid` | number | No | Optional per-keyword max CPC in the ACCOUNT CURRENCY (e.g. 1.25). Only used when the campaign bids Manual CPC: automated strategies ignore it. Not allowed on negatives. |
| `keywords[].negative` | boolean | No | true = ad-group-level NEGATIVE (blocks matching queries in this ad group). op 'add' only. |
| `keyword_id` | string | No | ops 'replace' / 'remove': the ad-group keyword as "&lt;ad_group_id&gt;:&lt;criterion_id&gt;". |
| `campaign_negative_id` | string | No | op 'remove' only: a campaign-level negative as "&lt;campaign_id&gt;:&lt;criterion_id&gt;" (ids returned by op 'add_negative'). |
| `replace_with` | object | No | op 'replace' only: the replacement keyword. |
| `replace_with.text` | string | No | New keyword text. Omit to keep the current text (match-type-only change). |
| `replace_with.match_type` | one of `EXACT`, `PHRASE`, `BROAD` | Yes |  |
| `replace_with.cpc_bid` | number | No | New max CPC in account currency. Omit to carry the current bid over. |
| `dry_run` | boolean | No | Preview only: the request is validated and the resolved payload returned, nothing is created or changed. |

## Example prompts

- "Add these 20 keywords as phrase match to the Trail Shoes ad group."
- "Add 'free' and 'jobs' as negative keywords across my whole Search campaign."
- "Change the keyword 'running shoe' from broad to exact match."
- "Remove the keyword 'cheap sneakers' from the Trail Shoes ad group."

## Notes

Google keyword text and match type cannot be edited. A replace is a remove plus a re-add, so the keyword gets a new ID and its performance history restarts.

## Related tools

- [`adsap_google_keyword_ideas`](/tools/adsap_google_keyword_ideas): Get keyword suggestions with search volume from Google Keyword Planner for a Google Search campaign.
- [`adsap_google_manage_targeting`](/tools/adsap_google_manage_targeting): Manage a Google Ads campaign or ad group's targeting AFTER creation: GEO, LANGUAGE and AUDIENCES.
- [`adsap_google_search_geo_targets`](/tools/adsap_google_search_geo_targets): Find Google Ads geo target constants by location name (city, region, country, postal area) for Search campaign location targeting.
- [`adsap_google_search_terms`](/tools/adsap_google_search_terms): Search terms report for a Google Ads account: the REAL user queries that triggered Search (and Shopping) ads, with...

## Guide

Read [Keywords](/guides/google-ads/keywords) for the workflow around this tool, and the [Tool reference](/tools) for every tool.
