Skip to main content
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

[[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.
keywords.text
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.
[[campaigns.ad_groups.keywords]]
text = "just in time database access"
keywords.match_type
string
required
Controls how closely a user’s search query must match the keyword for the ad to be eligible to show.
ValueMatches
"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
[[campaigns.ad_groups.keywords]]
text = "just in time database access"
match_type = "PHRASE"
keywords.status
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).
ValueBehaviour
"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.
[[campaigns.ad_groups.keywords]]
text = "jit access management"
match_type = "BROAD"
status = "PAUSED"

[[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).
ad_groups.negative_keywords.text
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.
[[campaigns.ad_groups.negative_keywords]]
text = "cyberark"
ad_groups.negative_keywords.match_type
string
required
How broadly this negative keyword blocks traffic for this ad group.
ValueBlocks
"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
[[campaigns.ad_groups.negative_keywords]]
text = "cyberark"
match_type = "BROAD"

[[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.
campaigns.negative_keywords.text
string
required
The keyword text to exclude across all ad groups in this campaign.
[[campaigns.negative_keywords]]
text = "cybersecurity"
campaigns.negative_keywords.match_type
string
required
How broadly this negative keyword blocks traffic across the campaign.
ValueBlocks
"BROAD"Any search containing all words in any order
"PHRASE"Searches containing the exact phrase
"EXACT"Searches that match the keyword meaning exactly
[[campaigns.negative_keywords]]
text = "cybersecurity"
match_type = "BROAD"

Campaign vs. Ad Group Negatives

ScopeTOML pathApplies 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 typeKeyword exampleAlso matches
EXACTjust in time access”just-in-time access”, “JIT access” (close variants)
PHRASEdatabase access”secure database access”, “database access management”
BROADdatabase access”DB access”, “access to database”, “privileged access management”

  • Campaigns — campaign-level fields, budgets, and targeting
  • Creatives — ads, headlines, and descriptions that live alongside keywords in ad groups
  • Account Root — how campaign files are imported