> ## Documentation Index
> Fetch the complete documentation index at: https://www.adjar.ai/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Keyword Config Reference

Keywords are the bridge between what a user searches and which ads are eligible to show. In Adjar TOML config, keywords live inside `[[campaigns.ad_groups]]` entries, keeping them tightly scoped to the ad group they belong to. Negative keywords can be added at two levels — ad group or campaign — giving you precise control over which searches trigger (or skip) your ads.

## Full Example

```toml theme={null}
[[campaigns.ad_groups]]
name = "JIT access keywords"
status = "ENABLED"

[[campaigns.ad_groups.keywords]]
text = "just in time database access"
match_type = "PHRASE"

[[campaigns.ad_groups.keywords]]
text = "just in time privileged access"
match_type = "EXACT"

[[campaigns.ad_groups.keywords]]
text = "jit access management"
match_type = "BROAD"

[[campaigns.ad_groups.negative_keywords]]
text = "cyberark"
match_type = "BROAD"

[[campaigns.ad_groups.negative_keywords]]
text = "free"
match_type = "BROAD"
```

***

## `[[campaigns.ad_groups.keywords]]`

Positive keywords that trigger ads in this ad group. An ad group should contain keywords that share a common theme so that your ad copy can speak directly to the search intent.

<ParamField path="keywords.text" type="string" required>
  The keyword text. Do not include match type syntax characters (quotes or square brackets) in the text value — match type is controlled separately via the `match_type` field.

  ```toml theme={null}
  [[campaigns.ad_groups.keywords]]
  text = "just in time database access"
  ```
</ParamField>

<ParamField path="keywords.match_type" type="string" required>
  Controls how closely a user's search query must match the keyword for the ad to be eligible to show.

  | Value      | Matches                                                                  |
  | ---------- | ------------------------------------------------------------------------ |
  | `"EXACT"`  | Searches with the same meaning as the keyword, with no extra context     |
  | `"PHRASE"` | Searches that include the meaning of the keyword                         |
  | `"BROAD"`  | Searches related to the keyword, including synonyms and related concepts |

  ```toml theme={null}
  [[campaigns.ad_groups.keywords]]
  text = "just in time database access"
  match_type = "PHRASE"
  ```
</ParamField>

<ParamField path="keywords.status" type="string" default="ENABLED">
  Whether the keyword is active. Optional — omit it for an enabled keyword (Adjar only writes the field for paused ones, keeping the file terse).

  | Value       | Behaviour                           |
  | ----------- | ----------------------------------- |
  | `"ENABLED"` | Keyword is live and can trigger ads |
  | `"PAUSED"`  | Keyword is suspended                |

  Unlike `text` and `match_type` (which are immutable — changing either recreates the keyword), `status` is patched in place, so a paused→enabled flip is a cheap update. This field applies to positive ad-group keywords only; campaign- and ad-group-level negatives ignore it.

  ```toml theme={null}
  [[campaigns.ad_groups.keywords]]
  text = "jit access management"
  match_type = "BROAD"
  status = "PAUSED"
  ```
</ParamField>

***

## `[[campaigns.ad_groups.negative_keywords]]`

Negative keywords at the **ad group level** prevent ads in that specific ad group from showing on matching searches. Use ad-group-level negatives when you want to block a term for one ad group without affecting others in the same campaign (for example, when different ad groups handle different segments of your keyword space).

<ParamField path="ad_groups.negative_keywords.text" type="string" required>
  The keyword text to exclude from this ad group. As with positive keywords, do not include match type syntax in the text value.

  ```toml theme={null}
  [[campaigns.ad_groups.negative_keywords]]
  text = "cyberark"
  ```
</ParamField>

<ParamField path="ad_groups.negative_keywords.match_type" type="string" required>
  How broadly this negative keyword blocks traffic for this ad group.

  | Value      | Blocks                                                                |
  | ---------- | --------------------------------------------------------------------- |
  | `"BROAD"`  | Any search containing all words in any order                          |
  | `"PHRASE"` | Searches containing the exact phrase (with any words before or after) |
  | `"EXACT"`  | Searches that match the keyword meaning exactly                       |

  ```toml theme={null}
  [[campaigns.ad_groups.negative_keywords]]
  text = "cyberark"
  match_type = "BROAD"
  ```
</ParamField>

***

## `[[campaigns.negative_keywords]]`

Negative keywords at the **campaign level** apply across every ad group in the campaign. Use campaign-level negatives for terms that are irrelevant to the entire campaign — for example, excluding a competitor's brand name or a job-search intent keyword.

<ParamField path="campaigns.negative_keywords.text" type="string" required>
  The keyword text to exclude across all ad groups in this campaign.

  ```toml theme={null}
  [[campaigns.negative_keywords]]
  text = "cybersecurity"
  ```
</ParamField>

<ParamField path="campaigns.negative_keywords.match_type" type="string" required>
  How broadly this negative keyword blocks traffic across the campaign.

  | Value      | Blocks                                          |
  | ---------- | ----------------------------------------------- |
  | `"BROAD"`  | Any search containing all words in any order    |
  | `"PHRASE"` | Searches containing the exact phrase            |
  | `"EXACT"`  | Searches that match the keyword meaning exactly |

  ```toml theme={null}
  [[campaigns.negative_keywords]]
  text = "cybersecurity"
  match_type = "BROAD"
  ```
</ParamField>

***

## Campaign vs. Ad Group Negatives

| Scope    | TOML path                                   | Applies to                    |
| -------- | ------------------------------------------- | ----------------------------- |
| Campaign | `[[campaigns.negative_keywords]]`           | All ad groups in the campaign |
| Ad group | `[[campaigns.ad_groups.negative_keywords]]` | Only the containing ad group  |

When you need a negative to apply everywhere, add it at the campaign level. When you need to carve out specific traffic for one ad group (for example, one ad group targets "enterprise" queries while another targets "SMB" queries), use ad-group-level negatives on each.

***

## Match Type Behaviour

Adjar uses standard Google Ads match type semantics. Here is a quick reference:

| Match type | Keyword example       | Also matches                                                      |
| ---------- | --------------------- | ----------------------------------------------------------------- |
| `EXACT`    | `just in time access` | "just-in-time access", "JIT access" (close variants)              |
| `PHRASE`   | `database access`     | "secure database access", "database access management"            |
| `BROAD`    | `database access`     | "DB access", "access to database", "privileged access management" |

***

## Related Pages

* [Campaigns](/docs/config/google/campaigns) — campaign-level fields, budgets, and targeting
* [Creatives](/docs/config/google/creatives) — ads, headlines, and descriptions that live alongside keywords in ad groups
* [Account Root](/docs/config/google/account) — how campaign files are imported
