---
title: "Add campaign-level negative keywords"
method: POST
path: "/api/v1/tools/google_add_negative_keywords/execute"
tags: ["Google Ads"]
---

# Add campaign-level negative keywords

`POST /api/v1/tools/google_add_negative_keywords/execute`

## Request

- Base URL: `https://adako.ai`
- URL: `https://adako.ai/api/v1/tools/google_add_negative_keywords/execute`
- Auth: HTTP bearer

Blocks queries from triggering ads anywhere in one campaign. Negatives that already exist are skipped, and the result lists them.
Use when: google_analyze_search_terms found wasted queries and the user has approved the list.
Do not use when: the term also appears in queries that converted — blocking it costs real conversions. Show the user the list and get an explicit yes first.
Match types work differently for negatives than for normal keywords: a broad negative blocks queries containing all of its words in any order, a phrase negative blocks queries containing the words in that order, and an exact negative blocks only that precise query. Negatives never expand to synonyms or close variants, so plurals and misspellings need their own entries.
Adding a negative is reversible with google_remove_negative_keywords, but removal is permanent, so prefer adding fewer, well-understood negatives.
If you are unsure which account, campaign or period the user means, ask them — do not guess ids or dates.

## Headers

- `Idempotency-Key` string

## Request body

- object
  - `arguments` object, required
    - `customer_id` string: Google Ads customer id (10 digits, dashes optional). Omit to use the primary account; list_connected_accounts shows the valid ids.
    - `campaign_id` string, required: Campaign id as returned by google_list_campaigns.
    - `keywords` object[], required: Negative keywords to add at campaign level.
      - `text` string, required
      - `match_type` 'EXACT' | 'PHRASE' | 'BROAD', required
    - `idempotency_key` string: Optional caller-supplied key; identical keys never execute twice.

## Response `200`

The tool ran. A write returns proposal_id and approve_url while the change waits for approval.

- SuccessEnvelope
  - `success` unknown, required
  - `tool` string, required
  - `data` object, required: Machine-readable result.
  - `markdown` string, required: The same result written for a person or a model.
  - `quota` Quota: Task usage for the current billing period.
    - `plan` string
    - `used` integer
    - `limit` integer
    - `period_end` string
    - `upgrade_url` string
  - `proposal_id` string: Present for writes. Nothing changes on the ad platform until it is approved.
  - `approve_url` string: Where a person approves the proposal.
  - `request_id` string, required

## Other responses

- `400`: Invalid arguments, or the ad account could not be resolved.
- `401`: Missing, invalid, revoked or expired API key.
- `402`: Monthly task quota used up, or the plan does not include this tool.
- `403`: The connected ad account lacks the access level this tool needs.
- `404`: Unknown tool name.
- `409`: Not connected, reconnect needed, confirmation required, a proposal already pending or no longer pending, an identical create that failed earlier today (proposal_failed_before), a create that duplicates an approved one (duplicate_create), the ad-account limit of the plan reached (account_limit), or an Idempotency-Key reused with different arguments.
- `429`: Rate limited by Adako or by the ad platform. See Retry-After.
- `500`: Unexpected error inside Adako.
- `502`: The ad platform returned an error.

---

[API](https://skmtc.dev/adako/apis/adako-rest-api.md) · [All operations](https://skmtc.dev/adako/apis/adako-rest-api/llms.txt) · [OpenAPI document](https://skmtc.dev/adako/apis/adako-rest-api/revisions/59ee60d48a56?raw)
