Camberstack: Google Ads
Server Details
Hosted Google Ads MCP: build Search, PMax, Display and YouTube campaigns, approve each change, undo.
- Status
- Healthy
- Uptime
- 61.5% over 21 days
- OAuth
- Works in Glama
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- Repository
- zwznco/camberstack-mcp
- GitHub Stars
- 0
- Server Listing
- Camberstack
TDQS
Scored across 26 tools
Tools split cleanly across three product surfaces (Google Ads, GA4, Search Console) plus a proposal/apply lifecycle, and most purposes are distinct. The main overlap risk is within Search Console (summary, performance, and trend all return clicks/impressions/CTR/position) and between propose_changes and propose_analytics_changes, but descriptions clearly differentiate site-wide totals, dimension-grouped, and comparison views.
Names are uniformly snake_case and product groups are prefixed consistently (analytics_*, search_console_*). The only inconsistency is stylistic: some tools are verb_noun (apply_changes, list_accounts, run_gaql) while others are bare noun phrases (account_overview, keyword_ideas, billing), which is readable but not a single predictable pattern.
At 26 tools the set is on the heavy side, but the scope genuinely spans three integrated Google products plus a proposal/apply/undo workflow, so each tool has a role. It sits just over the comfortable range, with the 8 search_console_* tools being the densest cluster.
Read coverage is strong: run_gaql and analytics_report act as escape hatches for Ads and GA4, while writes go through a full propose/apply/undo lifecycle with change history. Minor gaps remain, such as no delete (only pause) operations and sitemap submission being explicitly out of scope.
Available Tools
26 toolsaccount_overviewAccount overviewBRead-onlyInspect
Spend, clicks, conversions and cost per conversion per campaign over a window.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | Look-back window in days, ending yesterday | |
| customer_id | Yes | Google Ads customer ID, with or without dashes (from list_accounts) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=true, so the safety profile is covered. The description adds almost nothing beyond that: it does not mention aggregation semantics, rate limits, auth scopes, or what happens when the window exceeds available history.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence listing the metrics and their grouping, with no filler or redundancy. It is appropriately sized for a simple two-parameter reporting tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description partially compensates by naming the returned metrics and their grouping. However, it omits whether additional metrics exist, whether the response can be broken down by day, and any pagination or size caveats an agent would need.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and both parameters are well documented in the schema, including the 'ending yesterday' nuance for days. The description's phrase 'over a window' only loosely gestures at the days parameter, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names the concrete outputs (spend, clicks, conversions, cost per conversion) and the granularity (per campaign) over a window, so an agent knows this is a reporting/aggregation read. It does not differentiate itself from siblings such as run_gaql or search_console_summary, which could plausibly return overlapping data.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no mention of when to prefer this over run_gaql, and no prerequisites stated in the description itself. The only routing hint (customer_id from list_accounts) lives in the schema, not the description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
analytics_landing_pagesGoogle Analytics landing pagesARead-onlyInspect
Where visitors land and whether it works: sessions, users, engagement rate, key events (GA4's conversions) and key event rate per landing page, most sessions first. Pass channel to see one source, e.g. "Paid Search" for Google Ads traffic or "Organic Search". Changes nothing.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | Look-back window in days, ending yesterday | |
| limit | No | Most landing pages to return | |
| channel | No | Only sessions whose default channel group contains this, e.g. Paid Search, Organic Search, Direct | |
| end_date | No | Exact last day, YYYY-MM-DD | |
| start_date | No | Exact first day, YYYY-MM-DD. Pass with end_date to use exact dates instead of days | |
| property_id | Yes | GA4 property id, digits only (from analytics_properties) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so "Changes nothing" largely restates structured data. The description does add the default result ordering (most sessions first) and clarifies that GA4 key events are the conversion metric, which is modest added value beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Metrics are front-loaded and the two trailing sentences are short and purposeful. It is dense but wastes little; the "Google Ads traffic" example earns its place by disambiguating channel values.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description carries the burden of describing returns — and it does list the returned metrics and ordering. It stops short of describing pagination or how the day/date-range defaults interact, but the schema covers those parameters adequately.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and every parameter (days, limit, channel, start/end date, property_id) is already documented in the schema. The description echoes the channel filter with examples but adds no new syntax or constraint beyond what the schema supplies, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names the specific resource (landing pages) and enumerates the exact metric set returned (sessions, users, engagement rate, key events, key event rate), plus the sort order. That is enough for an agent to distinguish it from analytics_report or the search_console_* family.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Pass channel to see one source" gives a concrete usage cue with examples, but there is no guidance on when to prefer this over siblings like analytics_report or paid_organic_overlap, and no exclusions. Usage is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
analytics_propertiesList Google Analytics propertiesARead-onlyInspect
Lists the Google Analytics 4 properties this Google login can read. Use a property_id from here in the other Google Analytics tools. If Google Analytics isn't part of the connection yet, says so and returns grant_url, a personal link the user opens to add it.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint=true, destructiveHint=false, openWorldHint=true). The description adds genuinely new behavior: when GA is not part of the connection, the tool reports that and returns a grant_url the user must open to authorize. That fallback/remediation path is not derivable from annotations or schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the core action, then downstream usage, then the failure-mode behavior. Every sentence carries distinct information and there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no parameters and no output schema, the description carries the explanation burden well: it covers what is listed, how to use the result, and the not-connected fallback including the grant_url. It does not describe the shape of a returned property record (e.g., id vs display name), which would close the remaining gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the schema places no burden on the description. It appropriately mentions property_id as the output value to carry into downstream tools rather than as an input, which is context the schema cannot express.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource with scope: 'Lists the Google Analytics 4 properties this Google login can read.' The scope qualifier (properties readable by this login) is more precise than the title alone, and it hints at its role relative to other GA tools, though it never names a specific sibling to differentiate against.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Use a property_id from here in the other Google Analytics tools' tells the agent this is the entry point for GA workflows, which is actionable routing guidance. It stops short of naming which sibling to use next (e.g., analytics_report vs analytics_setup) or when the tool is not needed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
analytics_reportRun a Google Analytics reportARead-onlyInspect
Any GA4 report: dimensions and metrics by their GA4 API names, highest first. Common dimensions: date, landingPage, pagePath, sessionDefaultChannelGroup, sessionSourceMedium, sessionCampaignName, sessionGoogleAdsCampaignName, deviceCategory, country, eventName. Common metrics: sessions, totalUsers, engagedSessions, engagementRate, keyEvents, sessionKeyEventRate, screenPageViews, purchaseRevenue. Changes nothing.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | Look-back window in days, ending yesterday | |
| limit | No | Most rows to return | |
| filter | No | Only rows whose dimension contains this text (case-insensitive) | |
| metrics | Yes | GA4 metric names | |
| end_date | No | Exact last day, YYYY-MM-DD | |
| order_by | No | Metric to sort by, highest first; defaults to the first metric | |
| dimensions | No | GA4 dimension names; none gives totals | |
| start_date | No | Exact first day, YYYY-MM-DD. Pass with end_date to use exact dates instead of days | |
| property_id | Yes | GA4 property id, digits only (from analytics_properties) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=true, so "Changes nothing" largely restates the safety profile; openWorld (live GA data) is never surfaced in prose. The "highest first" ordering hint is genuine behavioral context, but it is also covered by the order_by schema description, so added value is modest.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the core capability and sort behavior, followed by compact reference lists. The dimension/metric enumerations are the longest part but are directly actionable, so nothing is padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers what the tool does, valid field vocabulary, and the no-mutation guarantee for a 9-parameter tool, but with no output schema it never describes the shape of returned rows. The days-vs-start_date/end_date interplay and limit behavior are left entirely to the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, and the description earns an extra point by enumerating common GA4 dimension and metric names — the schema only says "GA4 dimension/metric names" with a regex and provides no enums. This materially reduces the risk of passing invalid field names.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: run an arbitrary GA4 report from dimension/metric names. "Any GA4 report" signals flexibility versus the preset sibling analytics_landing_pages, though it never names a sibling explicitly, so differentiation is inferred rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied: reach for this when you need an arbitrary dimension/metric combination rather than one of the curated report siblings. There is no explicit when-to-use, when-not-to-use, or named alternative to route against analytics_landing_pages or run_gaql.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
analytics_setupGoogle Analytics setupARead-onlyInspect
How a GA4 property is set up: its web streams with their measurement IDs (what the site's tag must use), which events are key events (GA4's conversions), and which Google Ads accounts it's linked to. Check this before proposing setup changes. Changes nothing.
| Name | Required | Description | Default |
|---|---|---|---|
| property_id | Yes | GA4 property id, digits only (from analytics_properties) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false; the description adds value by confirming 'Changes nothing' and by describing the shape of what is returned (streams, measurement IDs, key events, ad links), including the actionable note that the measurement ID is what the site's tag must use. It doesn't cover freshness, pagination, or limits, but it goes beyond the annotations' safety profile.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tightly packed sentences plus a two-word reassurance; the return contents lead and the read-only caveat closes. No sentence is filler and nothing is buried.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter read with no output schema, the description adequately conveys what comes back and that nothing is mutated. It could say slightly more about scope (per-property vs. account-wide) or response freshness, but an agent has enough to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single property_id parameter is fully documented in the schema, including its digits-only pattern and its provenance from analytics_properties. The description adds no further parameter meaning, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific resource (a GA4 property's setup) and enumerates the exact contents returned: web streams with measurement IDs, key events, and linked Google Ads accounts. This distinguishes it cleanly from the sibling analytics_properties (which lists properties) and analytics_report (which returns metrics).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
States a clear trigger: 'Check this before proposing setup changes,' which implicitly routes the agent away from propose_analytics_changes and toward inspection first. It stops short of naming the alternative tool or stating exclusions, so it is clear context rather than full when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
apply_changesApply an approved proposalADestructiveInspect
Applies a proposal from propose_changes to the account. Only call this after the user has explicitly approved that proposal. All or nothing: every change is checked with Google first, and if one still fails the ones before it are rolled back. Each change is logged and can be reversed with undo_changes. If the account changed since the proposal, nothing is applied and the result (status "needs approval") is a new proposal with the updated summary: show it to the user and apply it only after they approve.
| Name | Required | Description | Default |
|---|---|---|---|
| proposal_id | Yes | The proposal_id a propose tool returned |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true, idempotentHint=false, readOnlyHint=false, but the description adds substantial context beyond them: all-or-nothing semantics, server-side validation with Google, rollback of preceding changes on failure, per-change logging, reversibility via undo_changes, and the stale-proposal 'needs approval' outcome. This is exactly the behavioral disclosure a mutation tool needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the action and the approval precondition, then layers atomicity, reversibility, and the stale-proposal branch. Every sentence earns its place with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, yet the description names the salient return condition (status 'needs approval' yielding a fresh proposal) and the failure behavior, so an agent knows what to expect and what to do with the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter with 100% schema description coverage, so the schema already carries the burden and baseline is 3. The description adds the provenance of the value (a proposal produced by propose_changes) but no format or sourcing detail beyond that.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Applies a proposal from propose_changes to the account') and names the sibling tool that produces its input. An agent can distinguish it from propose_changes, discard_proposal, and undo_changes immediately.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit precondition ('Only call this after the user has explicitly approved that proposal') and describes the conditional branch when the account has changed since the proposal — show the new proposal to the user and apply only after approval. It also names undo_changes as the reversal path.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
billingPlan and billingARead-onlyInspect
Shows the user's Camberstack plan: the Google Ads accounts used in the last 30 days against the number the plan covers (Free 1, Pro 10). Returns a personal link to upgrade (Free) or to change card and cancel (Pro). This is the Camberstack subscription only, not a Google Ads account's own billing, invoices or ad spend.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnlyHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is covered. Beyond that the description discloses meaningful behavior the annotations cannot: the 30-day usage window, the Pro/Free tier thresholds, and the two branches of the returned upgrade/manage link.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with what is shown, followed by the return value, then the scope exclusion last. Every clause carries information; there is no filler or restatement of the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description carries the burden of describing returns, and it does: it names the compared counts, the tier limits, and the type of link returned. An agent has everything needed to call this and interpret the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so per the rubric the baseline is 4. There are no parameters for the description to clarify, and it correctly does not invent any.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Shows) and resource (the user's Camberstack plan) and even specifies the payload: Google Ads accounts used in the last 30 days against the plan quota. It also explicitly disambiguates from Google Ads account-level billing, which no sibling covers, so the agent can separate it from the rest of the tool set.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides a clear scoping exclusion ('Camberstack subscription only, not a Google Ads account's own billing, invoices or ad spend'), which functions as a when-not rule. It does not name an alternative tool, but for a zero-parameter account-scoped lookup there is little genuine selection ambiguity among siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
change_historyChange historyBRead-onlyInspect
Every proposal made through Camberstack, with what was applied, what failed, and what was undone.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Most proposals to return, newest first | |
| customer_id | No | Google Ads customer ID, with or without dashes (from list_accounts) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false, so safety is covered. The description adds genuine value beyond that by disclosing the composition of the returned records (applied vs. failed vs. undone proposals), which matters because no output schema exists. It does not discuss volume, pagination, or retention windows.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler, and the resource is stated first. The word 'Every' slightly overstates the result set given the schema's default limit of 20 and maximum of 100, a minor imprecision in an otherwise efficient sentence.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the burden of explaining returns; it does so at a high level (applied/failed/undone) but says nothing about record structure, pagination, or how far back history goes. Both parameters are optional, and annotations cover the safety profile, so the gaps are moderate rather than severe.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%: limit is documented as 'most proposals to return, newest first' with default and bounds, and customer_id notes the dashed/undashed format and points to list_accounts. The description adds no parameter-level meaning beyond that, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific resource (every proposal made through Camberstack) and enumerates the record contents (applied, failed, undone), so the agent knows this is a historical/audit listing rather than an action. It does not explicitly name the sibling tools it contrasts with (propose_changes, apply_changes, undo_changes), but the 'history' framing makes the distinction inferable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no statement of prerequisites, and no reference to alternative tools such as run_gaql or account_overview for related lookups. The agent must infer from the resource name alone that this is a read-only audit call.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
discard_proposalDiscard a proposalADestructiveInspect
Marks an open proposal as discarded so it can never be applied; this can't be reversed (propose again instead). Changes nothing in the Google Ads account.
| Name | Required | Description | Default |
|---|---|---|---|
| proposal_id | Yes | The proposal_id a propose tool returned |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, but the description adds the crucial context the annotation cannot: the action is irreversible, and it 'changes nothing in the Google Ads account' (i.e. no account mutation, only proposal state). That materially sharpens how the agent interprets the destructive hint.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One tight sentence with the destructive/irreversible fact front-loaded, followed by the remedy and the account-impact clarification. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-param, no-output-schema tool, the definition covers irreversibility, account impact, and the re-propose path. The remaining gap is that it never contrasts with undo_changes, which is the sibling an agent is most likely to weigh against it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter with 100% schema coverage, and the schema already explains it is 'the proposal_id a propose tool returned'. The description adds no formatting, sourcing, or validation detail beyond that, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (marks as discarded) on a specific resource (an open proposal) and defines the terminal consequence ('can never be applied'). The agent can distinguish this from apply_changes, propose_changes and undo_changes without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives the precondition ('an open proposal') and an explicit recovery path ('propose again instead'), which tells the agent what to do after discarding. It does not, however, say when to prefer this over undo_changes, the closest sibling in the list.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
disconnectDisconnect Google AdsADestructiveInspect
Revokes Camberstack's Google access and deletes the stored credentials. The user must confirm.
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | Yes | Must be true; ask the user first |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, readOnlyHint=false and openWorldHint=true, so the danger class is known. The description adds genuine value beyond that by naming exactly what is destroyed (stored credentials and Google access) and flagging the mandatory user confirmation, though it omits reversibility/re-auth consequences.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, zero filler, with the destructive action and its consequence front-loaded before the confirmation requirement. Nothing is wasted or buried.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter destructive tool whose annotations and schema already carry the safety profile and parameter contract, the description covers the essentials: what is revoked, what is deleted, and the confirmation gate. Only the post-disconnect state (irreversibility, need to re-authorize) is left implicit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single `confirm` parameter is already documented as const true with 'Must be true; ask the user first'. The description's 'The user must confirm' restates rather than extends the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Revokes Camberstack's Google access and deletes the stored credentials'), making the action unambiguous. It is clearly distinguishable from every sibling, all of which are read/analysis/change-proposal tools rather than credential lifecycle tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It implies when to use it via the precondition 'The user must confirm', which tells the agent a prerequisite step. However, it does not explicitly frame the situation (e.g., 'use when the user wants to unlink or re-authenticate their Google account') or state any when-not conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
keyword_ideasKeyword ideas (Keyword Planner)ARead-onlyInspect
Google Keyword Planner ideas from seed keywords and/or a landing-page URL: average monthly searches, competition and the top-of-page bid range in the account's currency, biggest first. Ideas the account already targets, or already blocks as negatives, are marked in_account. Changes nothing.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | A page to pull ideas from, such as the ad's landing page | |
| limit | No | Most ideas to return | |
| keywords | No | Up to 20 seed keywords | |
| customer_id | Yes | Google Ads customer ID, with or without dashes (from list_accounts) | |
| language_id | No | Google language ID. 1000 English, 1003 Spanish, 1002 French, 1001 German, 1014 Portuguese | 1000 |
| location_ids | No | Google geo target IDs. 2840 United States, 2826 United Kingdom, 2124 Canada, 2036 Australia, 2356 India. For a state, city or other country, look the ID up with run_gaql: SELECT geo_target_constant.id, geo_target_constant.canonical_name FROM geo_target_constant WHERE geo_target_constant.name = 'Denver' | |
| min_searches | No | Drop ideas below this many average monthly searches |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so safety is covered; 'Changes nothing.' is a harmless restatement rather than new information. The description does add genuine behavioral detail beyond annotations, though: results are sorted biggest-first, entries the account already targets or blocks are flagged in_account, and bid ranges are rendered in the account's currency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One dense sentence with the resource and return fields front-loaded, no filler. It is slightly overloaded with listing output fields that the agent could infer, but every clause carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description usefully enumerates the return fields, sorting, in_account flagging, and currency, and annotations carry the safety profile. Minor gaps remain (empty-result behavior, whether ideas are capped by 'limit' default 50 vs max 200), but these are covered in the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with rich per-parameter descriptions (language IDs, geo IDs, seeds limit of 20, min_searches), so baseline 3 applies. The description only adds that seeds and URL are combinable ('and/or') and that monetary values use account currency; it adds nothing about limit, min_searches, or location_ids beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Google Keyword Planner ideas from seed keywords and/or a landing-page URL', and enumerates the returned fields (average monthly searches, competition, top-of-page bid range). An agent can tell this generates keyword ideas rather than looking up metrics, though it never names the closest sibling (keyword_metrics) to draw the boundary explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'From seed keywords and/or a landing-page URL' implies the two entry modes, which is useful usage context. However, there is no explicit when-to-use/when-not or a named alternative such as keyword_metrics for cases where the agent already has a keyword list and only wants metrics.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
keyword_metricsKeyword volume and bids (Keyword Planner)ARead-onlyInspect
Google Keyword Planner numbers for an exact list of keywords: average monthly searches, the last 12 months, competition and the top-of-page bid range in the account's currency. Use it to size keywords before adding them or to check a trend. Up to 100 keywords come back as one object each; over 100, as a compact table (columns, months, rows). Changes nothing.
| Name | Required | Description | Default |
|---|---|---|---|
| keywords | Yes | Keywords to look up, up to 500 | |
| customer_id | Yes | Google Ads customer ID, with or without dashes (from list_accounts) | |
| language_id | No | Google language ID. 1000 English, 1003 Spanish, 1002 French, 1001 German, 1014 Portuguese | 1000 |
| location_ids | No | Google geo target IDs. 2840 United States, 2826 United Kingdom, 2124 Canada, 2036 Australia, 2356 India. For a state, city or other country, look the ID up with run_gaql: SELECT geo_target_constant.id, geo_target_constant.canonical_name FROM geo_target_constant WHERE geo_target_constant.name = 'Denver' |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses a genuinely non-obvious behavior the schema cannot: result shape switches from one object per keyword at ≤100 keywords to a compact table (columns/months/rows) above 100. Also notes values are in the account's currency and that 'changes nothing' (redundant with readOnlyHint, but harmless). Does not mention rate limits or partial-failure behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences: capabilities first, then usage, then the response-shape caveat and safety note. No filler, and the most surprising fact (the 100-keyword format switch) is preserved rather than buried.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the burden of explaining returns and does so concretely, including both response shapes. Annotations cover the safety profile and the schema covers every parameter's meaning, so an agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real semantics the schema lacks: the 100-keyword threshold that changes the response representation, despite the schema allowing up to 500. Doesn't elaborate on language_id/location_ids behavior, which the schema already handles well.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a concrete resource (Google Keyword Planner data) and enumerates the exact metrics returned: average monthly searches, 12-month window, competition, top-of-page bid range. The phrase 'an exact list of keywords' implicitly separates it from the sibling keyword_ideas (ideation) without needing the agent to open either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit use cases — 'size keywords before adding them' and 'check a trend' — which tells the agent where this fits in a workflow. It stops short of naming alternatives or exclusions (e.g. 'for discovery use keyword_ideas instead'), so the routing is clear but not exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_accountsList Google Ads accountsARead-onlyInspect
Lists every Google Ads account this login can reach, including client accounts under a manager (MCC). Start here. When the user's plan is at its limit, each account also says whether the plan covers it (plan_status: active, switch or locked).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly=true, destructive=false, and openWorld=true, so the safety profile is covered. The description adds real behavioral value beyond that: it discloses what is returned (client accounts under a manager) and the plan_status flag values (active, switch, locked), which matters because there is no output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with what the tool lists and immediately followed by the routing directive "Start here". Every sentence carries distinct information with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description usefully describes the return set and the plan_status enum meanings. It omits auth/permission prerequisites (e.g. OAuth login requirement) and pagination behavior, but for a zero-parameter read-only listing tool it is nearly complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline is 4; there is nothing for the description to disambiguate. No parameter-level guidance is needed or missing.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Lists) and resource (Google Ads accounts) with explicit scope: every account the login can reach, including MCC client accounts. This clearly differentiates it from siblings like account_overview and billing, which the agent can infer operate on a narrower view.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Start here" is a direct, actionable usage signal that positions this as the entry point for account discovery. It stops short of naming alternatives or stating exclusions (e.g. when to prefer account_overview), so it falls just short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
paid_organic_overlapPaid vs organic overlapARead-onlyInspect
Joins a Google Ads account's search terms with a website's Search Console queries over the same days. Returns paid_and_ranking (searches you pay for where the site already ranks near the top organically, with ad spend) and organic_gaps (searches the site shows up for on page 2 or lower with no ad or keyword). Changes nothing; follow up with propose_changes.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | Look-back window in days, ending 3 days ago | |
| limit | No | Most rows in each list | |
| site_url | Yes | Search Console property exactly as search_console_sites lists it, e.g. sc-domain:example.com or https://www.example.com/ | |
| customer_id | Yes | Google Ads customer ID, with or without dashes (from list_accounts) | |
| max_position | No | paid_and_ranking: average organic position at or better than this | |
| min_impressions | No | organic_gaps: only queries with at least this many impressions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, and the description reinforces this with 'Changes nothing.' It goes beyond the safety profile by explaining what the two output lists represent (paid_and_ranking vs organic_gaps) and their inclusion criteria, which is genuine behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the join operation and immediately followed by the return-list definitions. Efficient with no filler, though the parenthetical definitions of the two lists add some length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description correctly carries the burden of explaining the return values, which it does via the two named lists. The absence of pagination or volume guidance is a minor gap given the limit parameter's own schema documentation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all six parameters are already documented, including max_position and min_impressions. The description alludes to these semantics ('near the top organically', 'shows up for on page 2 or lower') but adds no syntax or format guidance beyond the schema. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Uses a specific verb (joins) plus both named resources (Google Ads search terms, Search Console queries) and enumerates the two returned lists with definitions. An agent can distinguish this cross-source overlap tool from single-source siblings like search_console_opportunities or keyword_metrics without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states the operation changes nothing and points to propose_changes as the follow-up, which is useful routing, but it never says when to choose this over the adjacent search_console_opportunities or keyword_ideas tools. Usage is implied rather than explicitly scoped with alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
propose_analytics_changesPropose Google Analytics changes (applies nothing)AIdempotentInspect
Checks Google Analytics setup changes against the live property and stores them as a proposal with a plain-English summary; nothing is changed. Show the summary to the user and apply only after they approve, with apply_changes (undo_changes reverses it). Supported: create_ga4_property (a property plus a web stream; the applied result gives the measurement ID and the tag the site needs), mark_key_event / unmark_key_event (GA4's conversions), link_google_ads / unlink_google_ads. Point out any ⚠ line before they approve.
| Name | Required | Description | Default |
|---|---|---|---|
| changes | Yes | Changes to propose; several can go in one proposal |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false and destructiveHint=false, but the description adds genuinely new behavior: that it validates against the live property, stores a proposal with a plain-English summary, changes nothing, and emits ⚠ lines the agent must surface before approval. These are action-guiding traits no annotation conveys.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the key fact (nothing is changed) followed by the workflow and supported types, with no filler. Dense parenthetical clauses make the single paragraph slightly heavy, but each clause carries real information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a proposal-only tool with no output schema, the description covers the full lifecycle (propose → review → approve → apply/undo) and the change types accepted, which is everything an agent needs to call and follow up correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the per-field semantics (property_id, account_id, counting, event_name, customer_id) are already fully documented in the schema, including the measurement-ID/tag note for create_ga4_property. The description's parentheticals largely restate that schema content, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete verb (propose/check) and resource (Google Analytics setup changes) and immediately disambiguates with 'applies nothing', so an agent can distinguish it from apply_changes and undo_changes without reading a schema. It even enumerates the supported change types, making scope unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit workflow: check against the live property, store as a proposal, show the summary, apply only after user approval via apply_changes, with undo_changes to reverse. The when-to-use path and the correct sibling for the follow-up action are both named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
propose_changesPropose Google Ads changes (applies nothing)AIdempotentInspect
Checks a set of changes against the live account and dry-runs them with Google, then stores them as a proposal and returns a plain-English summary. Nothing is changed. Show the summary to the user and apply only after they approve. Supported: add_negative_keywords, pause_campaign, enable_campaign, pause_keyword, enable_keyword, pause_ad_group, enable_ad_group, set_daily_budget, set_end_date, and building: create_campaign (Search), create_display_campaign, create_demand_gen_campaign (YouTube), create_performance_max_campaign, all created paused; add_ad_group, add_keywords, add_responsive_search_ad, add_sitelinks, set_conversion_goal; and tuning: set_keyword_bid, set_ad_group_bid, pause_ad, enable_ad (to replace an ad: add the new one and pause the old in one proposal), add_campaign_targeting, remove_campaign_targeting, set_location_mode, set_bidding_strategy, set_shared_bid_strategy, create_shared_bid_strategy, set_url_suffix, create_conversion_action, set_conversion_counting, import_ga4_key_event. Point out any ⚠ line in the summary to the user before they approve. At most 50 changes per proposal, counting each keyword in add_keywords and add_negative_keywords as one (a create_campaign or add_ad_group counts as one however much it holds); for more, split them into several proposals up front and show the user all the summaries together.
| Name | Required | Description | Default |
|---|---|---|---|
| changes | Yes | Changes to propose; several can go in one proposal, up to 50 (each keyword counts as one) | |
| customer_id | Yes | Google Ads customer ID, with or without dashes (from list_accounts) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond the annotations by explaining the dry-run validation, proposal storage, human approval workflow, warning lines, change-counting rules, and campaigns being created paused. These details are important because the tool is not read-only even though it applies nothing to the live account.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core behavior is front-loaded and the workflow is easy to follow. The long supported-operations list is useful but somewhat redundant with the schema, making the description longer than strictly necessary.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex proposal-creation tool with a rich schema and safety-relevant annotations, the description covers what the tool does, what it does not do, how to handle warnings and approval, and how to manage the batch-size limit. No critical context appears missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents the nested change objects well. The description still adds useful semantics by listing supported change types and clarifying that each keyword counts toward the 50-change limit while a create_campaign or add_ad_group counts as one.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a precise verb and resource: check and dry-run Google Ads changes, store a proposal, return a summary, and change nothing. It clearly distinguishes this from applying changes by saying 'Nothing is changed' and 'apply only after they approve.'
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly tells the agent to show the summary to the user and only apply after approval, and to point out any ⚠ line before approval. It also handles the 50-change limit by instructing the agent to split larger batches into multiple proposals and present all summaries together.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_gaqlRun a read-only GAQL queryARead-onlyInspect
Runs any read-only Google Ads Query Language SELECT for questions the other tools don't cover. Returns up to 500 rows. Google rejects queries that break these rules: selecting or segmenting by segments.date needs a finite range in WHERE (segments.date DURING LAST_30_DAYS, or BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD'); click_view needs a single day (segments.date = 'YYYY-MM-DD'); every field used in WHERE or ORDER BY must also be in SELECT. Maximize clicks is target_spend in the API: campaign.target_spend.cpc_bid_ceiling_micros (there is no campaign.maximize_clicks). Unsure of a field's name or whether it fits this FROM? Look it up first with a query that has no FROM, which reads Google's field catalog instead of the account (any customer_id): SELECT name, category, selectable WHERE name LIKE '%search_term%', or SELECT attribute_resources, metrics, segments WHERE name = 'campaign' for what can be used FROM campaign.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | A GAQL SELECT statement | |
| customer_id | Yes | Google Ads customer ID, with or without dashes (from list_accounts) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, destructiveHint, and openWorldHint, so the safety profile is covered. The description adds real behavioral value beyond that: a 500-row result cap and the server-side rejection rules (date segmentation, click_view, WHERE/ORDER BY fields must appear in SELECT). It leaves error/pagination behavior unspecified, so 4 rather than 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but every sentence is substantive domain knowledge, and the core purpose is front-loaded in the first clause. It could be tightened slightly (the rule list runs on inline), but there is no filler to cut.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, yet the description covers the return cap (500 rows) and supplies the query-validity rules an agent needs to avoid server-side rejection, plus the field-catalog trick and the maximize-clicks/target_spend mapping. Nothing essential for a correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds meaning beyond the schema by clarifying that for the catalog lookup any customer_id works, and by framing the query parameter's expected shape as a GAQL SELECT with enumerated semantic rules rather than just a string type.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (run a read-only GAQL SELECT) and constrains scope to 'questions the other tools don't cover', which distinguishes it from the many sibling report tools. An agent can identify the intended use without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear routing rule (fallback for questions other tools don't cover) and even describes a second usage mode: use a FROM-less query to inspect Google's field catalog before committing to a real query. It does not name specific sibling tools to prefer or spell out hard exclusions, so it stops short of a full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_console_inspect_urlsInspect URLs in Google's indexARead-onlyInspect
Google's index record for each page: indexed or not and the reason (for example "Discovered - currently not indexed"), last crawl, robots.txt and fetch result, the canonical Google chose against the one the page declares, and structured-data items with their errors. Use it when a page gets no impressions, or seems to have dropped, before assuming a ranking problem. Changes nothing.
| Name | Required | Description | Default |
|---|---|---|---|
| urls | Yes | Full page URLs inside the property, up to 20 per call (Google allows 2,000 a day per site) | |
| site_url | Yes | Search Console property exactly as search_console_sites lists it, e.g. sc-domain:example.com or https://www.example.com/ |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=true, so 'Changes nothing' mostly restates the safety profile. The description's real added value is disclosing what the call actually returns (index verdict and reason, crawl data, canonical mismatch, structured-data errors), which matters since no output schema exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the resource and its payload, then the usage condition, then the side-effect note. Zero wasted sentences, though the dense field list is packed into one long clause and 'Changes nothing' is largely redundant with the readOnlyHint annotation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the burden of explaining returns and does so thoroughly; usage context and safety are also covered. Parameter limits live in the schema, so the definition is nearly complete for a two-parameter read-only inspection tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%: 'urls' documents the 20-per-call and 2,000/day limits, and 'site_url' documents the exact property format. The description adds nothing about either parameter, so the schema does all the work and the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb (inspect URLs) and a specific resource (Google's index record per page), then enumerates the exact fields returned: index status and reason, last crawl, robots.txt/fetch result, Google-chosen canonical vs declared canonical, structured-data items. That level of specificity clearly separates it from search_console_performance or search_console_summary.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit triggering condition: use it when a page gets no impressions or seems to have dropped, and explicitly before assuming a ranking problem. It does not name a sibling tool as the alternative (e.g. search_console_performance) or state when not to use it, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_console_opportunitiesSearch Console opportunitiesARead-onlyInspect
Finds where more organic clicks are within reach: queries on positions 4-20 with the clicks a realistic climb would add, top-5 queries with an unusually low click-through rate (a title or description to fix), and question-shaped queries. Changes nothing.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | Look-back window in days, ending 3 days ago (yesterday with fresh) | |
| fresh | No | Include the last 2-3 days, which Google is still filling in (they read low). Use to check something from the last few days | |
| limit | No | Most rows in each list | |
| end_date | No | Exact last day, YYYY-MM-DD | |
| site_url | Yes | Search Console property exactly as search_console_sites lists it, e.g. sc-domain:example.com or https://www.example.com/ | |
| start_date | No | Exact first day, YYYY-MM-DD. Pass with end_date to use exact dates instead of days | |
| exclude_query_regex | No | Leave out queries matching this RE2 regex, typically the brand name, e.g. (?i)acme|ac me |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so "Changes nothing" mostly restates what the structured data provides. The description does add behavioral value by disclosing what the analysis surfaces (three distinct opportunity classes), but omits pagination, ordering, or how the three lists are returned. With annotations carrying the safety profile, a 3 is appropriate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single dense sentence with no filler; the opportunity categories are front-loaded and each clause carries information. The clause-packed enumeration is slightly heavy to parse but nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and seven parameters, the description responsibly explains what the tool returns (three opportunity categories), which is the key unknown. It stops short of describing result ordering or grouping, but for a read-only analysis tool whose annotations and schema are otherwise complete, coverage is solid.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all seven parameters (days, fresh, limit, end_date, start_date, site_url, exclude_query_regex) are already documented in the schema. The description adds no parameter-level meaning beyond the schema, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ("Finds") and enumerates three concrete outputs: position 4-20 queries with realistic click gains, top-5 queries with low CTR, and question-shaped queries. This is far more specific than a generic 'search console data' tool. However, it never names a sibling (e.g. search_console_performance or search_console_summary), so an agent must infer the boundary from the output description alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Finds where more organic clicks are within reach" implies the use case (diagnosing growth opportunities) but there is no explicit when-to-use framing, no when-not, and no named alternative such as search_console_performance for raw metrics. Usage is only implied by the output categories.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_console_performanceSearch Console performanceARead-onlyInspect
Organic Google Search clicks, impressions, CTR and average position for a website, grouped by query, page, country, device or date, most clicks first. Search Console's last 2-3 days are incomplete, so the window ends 3 days ago unless fresh is set. Group by query and page together to see whether several pages compete for the same search; by page and date to see when a page's impressions or position changed. Changes nothing.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | Look-back window in days, ending 3 days ago (yesterday with fresh) | |
| fresh | No | Include the last 2-3 days, which Google is still filling in (they read low). Use to check something from the last few days | |
| limit | No | Most rows to return | |
| end_date | No | Exact last day, YYYY-MM-DD | |
| site_url | Yes | Search Console property exactly as search_console_sites lists it, e.g. sc-domain:example.com or https://www.example.com/ | |
| dimensions | No | What to group by | |
| page_regex | No | Only pages whose URL matches this RE2 regex | |
| start_date | No | Exact first day, YYYY-MM-DD. Pass with end_date to use exact dates instead of days | |
| query_regex | No | Only queries matching this RE2 regex | |
| page_contains | No | Only pages whose URL contains this text | |
| query_contains | No | Only queries containing this text | |
| exclude_query_regex | No | Leave out queries matching this RE2 regex, typically the brand name, e.g. (?i)acme|ac me |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, destructiveHint:false and openWorldHint. Beyond that, the description adds genuinely useful behavioral context: results are sorted 'most clicks first', and Search Console's last 2-3 days are incomplete so the window ends 3 days ago unless fresh is set. It does not mention rate limits or auth, keeping it short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense, front-loaded sentences: returned metrics first, then the freshness caveat, then practical grouping tips. Every clause carries information; the closing 'Changes nothing' is minor restatement of the annotation but reads as a quick safety confirmation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 12-parameter tool with full schema coverage and no output schema, the description covers the important non-obvious bits: freshness incompleteness, sort order, grouping intent, and read-only nature. It could still say more about pagination/result shape, but an agent has enough to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description earns a bump by adding grouping semantics the schema lacks - explaining what combining dimensions reveals - and by reinforcing the window/fresh tradeoff, giving meaning beyond the raw field descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: it returns organic Google Search clicks, impressions, CTR and average position and names the grouping dimensions. This distinguishes it from siblings like search_console_summary or search_console_trend by its per-dimension grouping, though it never names those siblings explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete usage guidance for combining dimensions ('query and page together to see whether several pages compete'; 'page and date to see when a page's impressions or position changed'). However it never states when to prefer this tool over search_console_summary/trend/opportunities, so there are no exclusions or named alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_console_sitemapsSearch Console sitemapsARead-onlyInspect
The sitemaps submitted for a website: when Google last downloaded each one, how many URLs it lists, and its error and warning counts. Changes nothing: submitting a sitemap is done in Search Console.
| Name | Required | Description | Default |
|---|---|---|---|
| site_url | Yes | Search Console property exactly as search_console_sites lists it, e.g. sc-domain:example.com or https://www.example.com/ |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description still adds value by reinforcing the read-only nature ('changes nothing') and by disclosing the shape of the returned data (last download, URL count, error and warning counts), which matters since there is no output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences with zero filler; the resource and returned fields come first, and the scope caveat follows. Nothing needs trimming.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter read tool with no output schema, the description covers the resource, the returned fields, and the read-only scope, which is most of what an agent needs. It could note that results cover all submitted sitemaps for the property (no pagination/filter params exist), but the gaps are minor.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%; site_url is already documented with exact format examples (sc-domain:example.com) and a pointer to search_console_sites for the canonical value. The description's 'for a website' adds no syntax or format information beyond the schema, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states the specific resource (sitemaps submitted for a website) and enumerates the data returned: last download time, URL count, and error/warning counts. It also draws a boundary against the write path ('submitting a sitemap is done in Search Console'), though it does not explicitly distinguish itself from the other read siblings like search_console_sites or search_console_performance.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Changes nothing: submitting a sitemap is done in Search Console' gives an implicit when-not (do not use this to submit), but there is no explicit statement of when to reach for this tool over the other Search Console read tools. Usage is inferable from the purpose but not spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_console_sitesList Search Console sitesARead-onlyInspect
Lists the websites (Search Console properties) this Google login can read. Use a site_url from here in the other Search Console tools.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=true, so the safety and external-call profile is covered by structured data. The description adds the auth-scoping caveat (results are limited to this login's readable properties), which is useful for interpreting an empty result, but says nothing about pagination, latency, or live-call behavior. With annotations carrying the main burden, a 3 is appropriate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with zero filler; the purpose comes first and the actionable next step second. Nothing could be removed without losing information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter listing tool with no output schema, the description conveys what comes back conceptually (websites/properties) and names the field an agent will need downstream (site_url). It leaves return shape and pagination unspecified, but that is a minor gap against the low complexity of the call.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline is 4 per the rubric. The description's mention of site_url is an output reference rather than an input constraint, and adds no parameter meaning because there are no parameters to disambiguate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (lists Search Console properties) and adds a meaningful scope qualifier: only the sites this Google login can read. An agent can immediately tell this is the discovery/enumeration call for the Search Console family.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent downstream — 'Use a site_url from here in the other Search Console tools' — which is exactly the workflow context needed for a zero-argument lookup tool. It stops short of stating when not to call it, but no sibling competes for this job, so exclusions are unnecessary.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_console_summarySearch Console summaryARead-onlyInspect
A website's total organic Google Search clicks, impressions, CTR and average position over a window, next to the same number of days before it, with the change. Site-wide totals, more complete than adding up per-query rows. Changes nothing.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | Look-back window in days, ending 3 days ago (yesterday with fresh) | |
| fresh | No | Include the last 2-3 days, which Google is still filling in (they read low). Use to check something from the last few days | |
| end_date | No | Exact last day, YYYY-MM-DD | |
| site_url | Yes | Search Console property exactly as search_console_sites lists it, e.g. sc-domain:example.com or https://www.example.com/ | |
| start_date | No | Exact first day, YYYY-MM-DD. Pass with end_date to use exact dates instead of days |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so 'Changes nothing' largely restates the structured data. The description does add genuine behavioral context beyond annotations: the result is computed as a comparison against the same number of preceding days, and site-wide totals aren't derivable by summing per-query rows.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences that front-load the metrics and the comparison, with no filler. The dash-free compressed style is dense but every clause carries information about what is returned.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the return-value burden and does so: it names the four metrics and the change versus the prior window. Read-only safety is covered by annotations, and the parameter space is covered by the schema, so nothing an agent needs is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema fully documents days, fresh, start_date, end_date and site_url, including formats and the 3-day lag. The description's 'over a window' adds only a vague gesture at the time parameters and no meaning beyond the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: total organic Search clicks, impressions, CTR and average position for a site over a window, plus prior-period comparison. The phrase 'Site-wide totals, more complete than adding up per-query rows' implicitly distinguishes it from the per-query performance tool, though it never names that sibling explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied – reach for this when you want site-wide totals and a period-over-period change rather than per-query detail. There is no explicit when-to-use/when-not statement and no alternative tool is named, so the agent must infer the routing against search_console_performance and search_console_trend.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_console_trendSearch Console trendARead-onlyInspect
Compares a window with the same number of days right before it, query by query and page by page: rising, falling, new and lost queries, rising searches the site is losing position on, and rising and falling pages. Totals are the site's true totals. Changes nothing.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | Look-back window in days, ending 3 days ago (yesterday with fresh) | |
| fresh | No | Include the last 2-3 days, which Google is still filling in (they read low). Use to check something from the last few days | |
| limit | No | Most rows in each list | |
| end_date | No | Exact last day, YYYY-MM-DD | |
| site_url | Yes | Search Console property exactly as search_console_sites lists it, e.g. sc-domain:example.com or https://www.example.com/ | |
| start_date | No | Exact first day, YYYY-MM-DD. Pass with end_date to use exact dates instead of days | |
| min_impressions | No | Skip queries and pages under this many impressions in both windows | |
| exclude_query_regex | No | Leave out queries matching this RE2 regex, typically the brand name, e.g. (?i)acme|ac me |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint and destructiveHint, so 'Changes nothing' is largely redundant and safety is covered. The one genuinely additive behavioral note is 'Totals are the site's true totals', which warns that per-row sums may not reconcile with reported totals — a real trap in this data. No mention of rate limits, auth scope, or result-size behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with no filler; the core action and comparison basis are front-loaded before the enumeration of output categories. The dense enumerated list in sentence one is justified because it tells the agent exactly what rows it will get back, though the trailing 'Changes nothing' is redundant against the readOnlyHint annotation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an eight-parameter tool with no output schema, the description carries the burden of describing returns and does so by naming the result categories, and the fully-covered schema handles invocation details. It is only slightly short of complete: how 'rising' is defined/thresholded and when to prefer this over search_console_performance are left implicit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all eight parameters (days, fresh, limit, end_date, site_url, start_date, min_impressions, exclude_query_regex) are already documented in the schema, including the 3-day look-back lag and regex intent. The description adds no parameter-level detail beyond what the schema supplies, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and scope: it compares a window against the equally-sized window immediately before it, and enumerates the exact output categories (rising, falling, new and lost queries, losing-position searches, rising/falling pages). This is clearly distinguishable from search_console_performance or search_console_summary by its delta framing, though it never names a sibling to sharpen the contrast.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The comparison framing implies the use case (period-over-period movement analysis), so an agent can infer when this beats the sibling summary/performance tools. However, it contains no explicit when-to-use, when-not, or 'use X instead' guidance across the eight sibling search_console_* tools, leaving the choice to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
switch_accountSwitch the plan's active accountADestructiveIdempotentInspect
Spends the plan's one account switch per 30 days on customer_id: it becomes an active account, and the least recently used active account locks until the date the "Account switch:" notice gave, switching back included. Call it only after another tool answered "Account switch:" for this account and the user agreed. Changes nothing in Google Ads; a no-op for an account that is already active.
| Name | Required | Description | Default |
|---|---|---|---|
| customer_id | Yes | Google Ads customer ID, with or without dashes (from list_accounts) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true and idempotentHint=true, and the description adds the non-obvious context behind them: a one-switch-per-30-days budget is consumed, the LRU account is locked until a stated date, and nothing changes in Google Ads. It explains why the operation is not freely repeatable, which the annotations alone cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense sentences front-load the cost and consequence before the precondition, which is the right order. Phrasing like 'switching back included' and the quoted notice string are slightly cryptic, but nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and one parameter fully documented, the description covers everything an agent needs: the trigger, the user-consent requirement, the quota cost, the side effect on another account, and the no-op case. Nothing material is missing for a destructive, quota-limited mutation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single parameter's description already specifies the format and source (from list_accounts). The prose only adds that customer_id is the account that becomes active, a small increment over the schema, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (switch the plan's active account) and goes further to describe the concrete effect: customer_id becomes active and the least recently used active account locks. No sibling tool overlaps with this behavior, so an agent can identify it immediately.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit precondition – call only after another tool returned an "Account switch:" notice for this account and the user agreed – plus the exemption that it is a no-op for an already-active account. This is exactly the when-to-call/when-not detail an agent needs for a rare, quota-limited action.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
undo_changesPropose reversing an applied proposalAInspect
Builds a new proposal that would reverse an applied one (removes the negatives it added, restores statuses and budgets). Changes nothing by itself: like any proposal, it must be approved and then applied with apply_changes.
| Name | Required | Description | Default |
|---|---|---|---|
| proposal_id | Yes | The id of an applied proposal, from change_history or apply_changes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The name 'undo_changes' implies immediate reversal, and the description corrects that misconception head-on: 'Changes nothing by itself: like any proposal, it must be approved and then applied with apply_changes.' It also discloses the concrete semantics of the reversal. This is context annotations cannot supply on their own.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no filler, and the most important fact (it only builds a proposal) is placed immediately after the one-line purpose. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, yet an agent has everything needed: what the tool produces, that it is inert until approved and applied, and the required follow-up call. Nothing material is omitted for a single-parameter tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter and schema description coverage is 100%; the schema already tells the agent the id comes from change_history or apply_changes. The description adds no additional parameter meaning, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Builds a new proposal that would reverse an applied one') and enumerates the effects (removes negatives, restores statuses and budgets). This clearly separates it from propose_changes, apply_changes, and discard_proposal.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Makes clear it targets an *applied* proposal and names the required follow-up path (approve, then apply_changes), which is exactly the routing an agent needs. It stops short of an explicit exclusion (e.g. use discard_proposal for a pending, un-applied proposal), so it's clear context rather than full when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
9 tool updates
- Changed
account_overview1 field changed- removed
Input schema / properties / confirm_switchRemoved value: -{ - "description": "Only after the user has agreed to spend their plan's account switch (a call answered \"Account switch:\"). Leave out otherwise", - "type": "boolean" -}
- Changed
apply_changes1 field changed- changed
Input schema / properties / proposal_id / descriptionPrevious value: -"The id returned by propose_changes"New value: +"The proposal_id a propose tool returned"
- Changed
discard_proposal1 field changed- changed
Input schema / properties / proposal_id / descriptionPrevious value: -"The id returned by propose_changes"New value: +"The proposal_id a propose tool returned"
- Changed
keyword_ideas1 field changed- removed
Input schema / properties / confirm_switchRemoved value: -{ - "description": "Only after the user has agreed to spend their plan's account switch (a call answered \"Account switch:\"). Leave out otherwise", - "type": "boolean" -}
- Changed
keyword_metrics1 field changed- removed
Input schema / properties / confirm_switchRemoved value: -{ - "description": "Only after the user has agreed to spend their plan's account switch (a call answered \"Account switch:\"). Leave out otherwise", - "type": "boolean" -}
- Changed
paid_organic_overlap1 field changed- removed
Input schema / properties / confirm_switchRemoved value: -{ - "description": "Only after the user has agreed to spend their plan's account switch (a call answered \"Account switch:\"). Leave out otherwise", - "type": "boolean" -}
- Changed
propose_changes2 fields changed- changed
Input schema / properties / changes / items / oneOfPrevious value: -[ - { - "description": "Block searches containing these words in one campaign", - "properties": { - "campaign_id": { - "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)", - "pattern": "^\\d+$", - "type": "string" - }, - "keywords": { - "items": { - "properties": { - "match_type": { - "description": "PHRASE blocks any search containing the words in order; the usual choice", - "enum": [ - "EXACT", - "PHRASE", - "BROAD" - ], - "type": "string" - }, - "text": { - "description": "The search words to block, e.g. \"free\"", - "maxLength": 80, - "minLength": 1, - "type": "string" - } - }, - "required": [ - "text", - "match_type" - ], - "type": "object" - }, - "maxItems": 50, - "minItems": 1, - "type": "array" - }, - "type": { - "const": "add_negative_keywords", - "type": "string" - } - }, - "required": [ - "type", - "campaign_id", - "keywords" - ], - "type": "object" - }, - { - "description": "Pause one keyword", - "properties": { - "ad_group_id": { - "description": "Ad group id, digits only (ad_group.id from run_gaql)", - "pattern": "^\\d+$", - "type": "string" - }, - "criterion_id": { - "description": "Keyword criterion id, digits only (ad_group_criterion.criterion_id from run_gaql)", - "pattern": "^\\d+$", - "type": "string" - }, - "type": { - "const": "pause_keyword", - "type": "string" - } - }, - "required": [ - "type", - "ad_group_id", - "criterion_id" - ], - "type": "object" - }, - { - "description": "Re-enable one paused keyword", - "properties": { - "ad_group_id": { - "description": "Ad group id, digits only (ad_group.id from run_gaql)", - "pattern": "^\\d+$", - "type": "string" - }, - "criterion_id": { - "description": "Keyword criterion id, digits only (ad_group_criterion.criterion_id from run_gaql)", - "pattern": "^\\d+$", - "type": "string" - }, - "type": { - "const": "enable_keyword", - "type": "string" - } - }, - "required": [ - "type", - "ad_group_id", - "criterion_id" - ], - "type": "object" - }, - { - "description": "Pause a whole campaign (stops all its spend)", - "properties": { - "campaign_id": { - "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)", - "pattern": "^\\d+$", - "type": "string" - }, - "type": { - "const": "pause_campaign", - "type": "string" - } - }, - "required": [ - "type", - "campaign_id" - ], - "type": "object" - }, - { - "description": "Turn a paused campaign back on. It starts spending again; the summary says how much", - "properties": { - "campaign_id": { - "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)", - "pattern": "^\\d+$", - "type": "string" - }, - "type": { - "const": "enable_campaign", - "type": "string" - } - }, - "required": [ - "type", - "campaign_id" - ], - "type": "object" - }, - { - "description": "Pause one ad group", - "properties": { - "ad_group_id": { - "description": "Ad group id, digits only (ad_group.id from run_gaql)", - "pattern": "^\\d+$", - "type": "string" - }, - "type": { - "const": "pause_ad_group", - "type": "string" - } - }, - "required": [ - "type", - "ad_group_id" - ], - "type": "object" - }, - { - "description": "Re-enable one paused ad group", - "properties": { - "ad_group_id": { - "description": "Ad group id, digits only (ad_group.id from run_gaql)", - "pattern": "^\\d+$", - "type": "string" - }, - "type": { - "const": "enable_ad_group", - "type": "string" - } - }, - "required": [ - "type", - "ad_group_id" - ], - "type": "object" - }, - { - "description": "Change a campaign's daily budget (not shared budgets)", - "properties": { - "amount": { - "description": "New average daily budget in the account's currency, e.g. 10 for $10.00/day (not micros)", - "exclusiveMinimum": 0, - "maximum": 1000000, - "type": "number" - }, - "campaign_id": { - "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)", - "pattern": "^\\d+$", - "type": "string" - }, - "type": { - "const": "set_daily_budget", - "type": "string" - } - }, - "required": [ - "type", - "campaign_id", - "amount" - ], - "type": "object" - }, - { - "description": "Set the last day a campaign runs, so it stops spending on its own", - "properties": { - "campaign_id": { - "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)", - "pattern": "^\\d+$", - "type": "string" - }, - "end_date": { - "anyOf": [ - { - "pattern": "^\\d{4}-\\d{2}-\\d{2}$", - "type": "string" - }, - { - "const": "none", - "type": "string" - } - ], - "description": "Last day the campaign runs, YYYY-MM-DD in the account's time zone (it stops after 23:59:59 that day), or \"none\" to remove the end date" - }, - "type": { - "const": "set_end_date", - "type": "string" - } - }, - "required": [ - "type", - "campaign_id", - "end_date" - ], - "type": "object" - }, - { - "description": "Build a new Search campaign with its ad groups, keywords, ads, targeting, negatives and sitelinks, in one step. It is created PAUSED: nothing spends until a separate enable_campaign", - "properties": { - "ad_groups": { - "items": { - "properties": { - "ads": { - "items": { - "description": "A responsive search ad", - "properties": { - "descriptions": { - "description": "2 to 4 descriptions, each at most 90 characters", - "items": { - "maxLength": 90, - "minLength": 1, - "type": "string" - }, - "maxItems": 4, - "minItems": 2, - "type": "array" - }, - "final_url": { - "description": "The landing page", - "maxLength": 2048, - "pattern": "^https?:\\/\\/", - "type": "string" - }, - "headlines": { - "description": "3 to 15 headlines, each at most 30 characters", - "items": { - "maxLength": 30, - "minLength": 1, - "type": "string" - }, - "maxItems": 15, - "minItems": 3, - "type": "array" - }, - "path1": { - "description": "Display path part 1, at most 15 characters", - "maxLength": 15, - "minLength": 1, - "type": "string" - }, - "path2": { - "description": "Display path part 2, at most 15 characters", - "maxLength": 15, - "minLength": 1, - "type": "string" - } - }, - "required": [ - "headlines", - "descriptions", - "final_url" - ], - "type": "object" - }, - "maxItems": 3, - "minItems": 1, - "type": "array" - }, - "default_max_cpc": { - "description": "Default max cost per click for the ad group (required when the campaign uses manual CPC)", - "exclusiveMinimum": 0, - "maximum": 1000, - "type": "number" - }, - "keywords": { - "items": { - "properties": { - "match_type": { - "description": "PHRASE matches searches containing the words in order; the usual choice", - "enum": [ - "EXACT", - "PHRASE", - "BROAD" - ], - "type": "string" - }, - "max_cpc": { - "description": "Max cost per click for this keyword in the account's currency (manual CPC only); omit to use the ad group's", - "exclusiveMinimum": 0, - "maximum": 1000, - "type": "number" - }, - "text": { - "description": "The keyword, e.g. \"cleaning invoice template\"", - "maxLength": 80, - "minLength": 1, - "type": "string" - } - }, - "required": [ - "text", - "match_type" - ], - "type": "object" - }, - "maxItems": 50, - "minItems": 1, - "type": "array" - }, - "name": { - "maxLength": 255, - "minLength": 1, - "type": "string" - } - }, - "required": [ - "name", - "keywords", - "ads" - ], - "type": "object" - }, - "maxItems": 10, - "minItems": 1, - "type": "array" - }, - "bidding": { - "default": "MANUAL_CPC", - "description": "MANUAL_CPC uses the ad group and keyword max CPCs; MAXIMIZE_CLICKS and MAXIMIZE_CONVERSIONS let Google bid within the budget", - "enum": [ - "MANUAL_CPC", - "MAXIMIZE_CLICKS", - "MAXIMIZE_CONVERSIONS" - ], - "type": "string" - }, - "daily_budget": { - "description": "Average daily budget in the account's currency, e.g. 20 for $20.00/day", - "exclusiveMinimum": 0, - "maximum": 1000000, - "type": "number" - }, - "end_date": { - "description": "Last day the campaign runs, YYYY-MM-DD", - "pattern": "^\\d{4}-\\d{2}-\\d{2}$", - "type": "string" - }, - "language_ids": { - "default": [ - "1000" - ], - "description": "Google language ids, e.g. 1000 English, 1003 Spanish", - "items": { - "pattern": "^\\d+$", - "type": "string" - }, - "maxItems": 20, - "minItems": 1, - "type": "array" - }, - "location_ids": { - "default": [ - "2840" - ], - "description": "Google geo target ids, e.g. 2840 United States, 2826 United Kingdom, 2124 Canada (look others up in geo_target_constant)", - "items": { - "pattern": "^\\d+$", - "type": "string" - }, - "maxItems": 50, - "minItems": 1, - "type": "array" - }, - "max_cpc_ceiling": { - "description": "MAXIMIZE_CLICKS only: the most Google may bid per click", - "exclusiveMinimum": 0, - "maximum": 1000, - "type": "number" - }, - "name": { - "description": "Campaign name; must not match an existing campaign", - "maxLength": 255, - "minLength": 1, - "type": "string" - }, - "negative_keywords": { - "default": [], - "description": "Searches to block across the campaign", - "items": { - "properties": { - "match_type": { - "enum": [ - "EXACT", - "PHRASE", - "BROAD" - ], - "type": "string" - }, - "text": { - "maxLength": 80, - "minLength": 1, - "type": "string" - } - }, - "required": [ - "text", - "match_type" - ], - "type": "object" - }, - "maxItems": 200, - "type": "array" - }, - "presence_only": { - "default": true, - "description": "Show ads only to people IN the locations (true), not merely interested in them", - "type": "boolean" - }, - "search_partners": { - "default": false, - "description": "Also show on Google's search partner sites", - "type": "boolean" - }, - "sitelinks": { - "default": [], - "items": { - "properties": { - "description1": { - "description": "At most 35 characters; give both descriptions or neither", - "maxLength": 35, - "minLength": 1, - "type": "string" - }, - "description2": { - "maxLength": 35, - "minLength": 1, - "type": "string" - }, - "text": { - "description": "Link text, at most 25 characters", - "maxLength": 25, - "minLength": 1, - "type": "string" - }, - "url": { - "maxLength": 2048, - "pattern": "^https?:\\/\\/", - "type": "string" - } - }, - "required": [ - "text", - "url" - ], - "type": "object" - }, - "maxItems": 8, - "type": "array" - }, - "type": { - "const": "create_campaign", - "type": "string" - } - }, - "required": [ - "type", - "name", - "daily_budget", - "ad_groups" - ], - "type": "object" - }, - { - "description": "Build a new Display campaign (image ads across Google's Display Network of sites and apps) with ad groups and responsive display ads. Google's optimized targeting finds the audience. It is created PAUSED: nothing spends until a separate enable_campaign", - "properties": { - "ad_groups": { - "items": { - "properties": { - "ads": { - "items": { - "description": "A responsive display ad: Google assembles ads from these headlines, descriptions and images", - "properties": { - "business_name": { - "description": "The advertiser's name, at most 25 characters", - "maxLength": 25, - "minLength": 1, - "type": "string" - }, - "descriptions": { - "description": "1 to 5 descriptions, each at most 90 characters", - "items": { - "maxLength": 90, - "minLength": 1, - "type": "string" - }, - "maxItems": 5, - "minItems": 1, - "type": "array" - }, - "final_url": { - "description": "The landing page", - "maxLength": 2048, - "pattern": "^https?:\\/\\/", - "type": "string" - }, - "headlines": { - "description": "1 to 5 short headlines, each at most 30 characters", - "items": { - "maxLength": 30, - "minLength": 1, - "type": "string" - }, - "maxItems": 5, - "minItems": 1, - "type": "array" - }, - "logo_images": { - "default": [], - "description": "0 to 5 landscape logos, 4:1 (e.g. 1200×300, at least 512×128)", - "items": { - "description": "An https URL of a PNG, JPEG or GIF (at most 5120 KB), or the id of an image asset already in the account (asset.id from run_gaql WHERE asset.type = 'IMAGE')", - "maxLength": 2048, - "minLength": 1, - "type": "string" - }, - "maxItems": 5, - "minItems": 0, - "type": "array" - }, - "long_headline": { - "description": "One long headline, at most 90 characters", - "maxLength": 90, - "minLength": 1, - "type": "string" - }, - "marketing_images": { - "description": "1 to 15 landscape images, 1.91:1 (e.g. 1200×628, at least 600×314)", - "items": { - "description": "An https URL of a PNG, JPEG or GIF (at most 5120 KB), or the id of an image asset already in the account (asset.id from run_gaql WHERE asset.type = 'IMAGE')", - "maxLength": 2048, - "minLength": 1, - "type": "string" - }, - "maxItems": 15, - "minItems": 1, - "type": "array" - }, - "square_logo_images": { - "default": [], - "description": "0 to 5 square logos, 1:1 (e.g. 1200×1200, at least 128×128)", - "items": { - "description": "An https URL of a PNG, JPEG or GIF (at most 5120 KB), or the id of an image asset already in the account (asset.id from run_gaql WHERE asset.type = 'IMAGE')", - "maxLength": 2048, - "minLength": 1, - "type": "string" - }, - "maxItems": 5, - "minItems": 0, - "type": "array" - }, - "square_marketing_images": { - "description": "1 to 15 square images, 1:1 (e.g. 1200×1200, at least 300×300)", - "items": { - "description": "An https URL of a PNG, JPEG or GIF (at most 5120 KB), or the id of an image asset already in the account (asset.id from run_gaql WHERE asset.type = 'IMAGE')", - "maxLength": 2048, - "minLength": 1, - "type": "string" - }, - "maxItems": 15, - "minItems": 1, - "type": "array" - } - }, - "required": [ - "headlines", - "long_headline", - "descriptions", - "business_name", - "final_url", - "marketing_images", - "square_marketing_images" - ], - "type": "object" - }, - "maxItems": 3, - "minItems": 1, - "type": "array" - }, - "default_max_cpc": { - "description": "Default max cost per click (required when the campaign uses manual CPC)", - "exclusiveMinimum": 0, - "maximum": 1000, - "type": "number" - }, - "name": { - "maxLength": 255, - "minLength": 1, - "type": "string" - } - }, - "required": [ - "name", - "ads" - ], - "type": "object" - }, - "maxItems": 5, - "minItems": 1, - "type": "array" - }, - "bidding": { - "default": "MAXIMIZE_CLICKS", - "description": "MANUAL_CPC uses the ad groups' max CPCs; MAXIMIZE_CLICKS and MAXIMIZE_CONVERSIONS let Google bid within the budget", - "enum": [ - "MANUAL_CPC", - "MAXIMIZE_CLICKS", - "MAXIMIZE_CONVERSIONS" - ], - "type": "string" - }, - "daily_budget": { - "description": "Average daily budget in the account's currency, e.g. 20 for $20.00/day", - "exclusiveMinimum": 0, - "maximum": 1000000, - "type": "number" - }, - "end_date": { - "description": "Last day the campaign runs, YYYY-MM-DD", - "pattern": "^\\d{4}-\\d{2}-\\d{2}$", - "type": "string" - }, - "language_ids": { - "default": [ - "1000" - ], - "description": "Google language ids, e.g. 1000 English", - "items": { - "pattern": "^\\d+$", - "type": "string" - }, - "maxItems": 20, - "minItems": 1, - "type": "array" - }, - "location_ids": { - "default": [ - "2840" - ], - "description": "Google geo target ids, e.g. 2840 United States", - "items": { - "pattern": "^\\d+$", - "type": "string" - }, - "maxItems": 50, - "minItems": 1, - "type": "array" - }, - "max_cpc_ceiling": { - "description": "MAXIMIZE_CLICKS only: the most Google may bid per click", - "exclusiveMinimum": 0, - "maximum": 1000, - "type": "number" - }, - "name": { - "description": "Campaign name; must not match an existing campaign", - "maxLength": 255, - "minLength": 1, - "type": "string" - }, - "presence_only": { - "default": true, - "description": "Show ads only to people IN the locations (true), not merely interested in them", - "type": "boolean" - }, - "type": { - "const": "create_display_campaign", - "type": "string" - } - }, - "required": [ - "type", - "name", - "daily_budget", - "ad_groups" - ], - "type": "object" - }, - { - "description": "Build a new Demand Gen campaign with YouTube video ads, which is how to advertise on YouTube through the API (Google doesn't allow creating Video campaigns there). It is created PAUSED: nothing spends until a separate enable_campaign", - "properties": { - "ad_groups": { - "items": { - "properties": { - "ads": { - "items": { - "description": "A Demand Gen video ad: runs on YouTube (in-stream, in-feed and Shorts), Discover and Gmail", - "properties": { - "business_name": { - "description": "The advertiser's name, at most 25 characters", - "maxLength": 25, - "minLength": 1, - "type": "string" - }, - "descriptions": { - "description": "1 to 5 descriptions, each at most 90 characters", - "items": { - "maxLength": 90, - "minLength": 1, - "type": "string" - }, - "maxItems": 5, - "minItems": 1, - "type": "array" - }, - "final_url": { - "description": "The landing page", - "maxLength": 2048, - "pattern": "^https?:\\/\\/", - "type": "string" - }, - "headlines": { - "description": "1 to 5 headlines, each at most 40 characters", - "items": { - "maxLength": 40, - "minLength": 1, - "type": "string" - }, - "maxItems": 5, - "minItems": 1, - "type": "array" - }, - "logo_image": { - "description": "A square 1:1 logo (e.g. 1200×1200, at least 128×128): an https URL, or an image asset id from the account", - "maxLength": 2048, - "minLength": 1, - "type": "string" - }, - "long_headlines": { - "description": "1 to 5 long headlines, each at most 90 characters", - "items": { - "maxLength": 90, - "minLength": 1, - "type": "string" - }, - "maxItems": 5, - "minItems": 1, - "type": "array" - }, - "videos": { - "description": "1 to 5 YouTube videos", - "items": { - "description": "A YouTube video id (e.g. dQw4w9WgXcQ) or its youtube.com / youtu.be URL. The video must be public or unlisted", - "maxLength": 200, - "minLength": 1, - "type": "string" - }, - "maxItems": 5, - "minItems": 1, - "type": "array" - } - }, - "required": [ - "videos", - "headlines", - "long_headlines", - "descriptions", - "business_name", - "logo_image", - "final_url" - ], - "type": "object" - }, - "maxItems": 3, - "minItems": 1, - "type": "array" - }, - "language_ids": { - "default": [ - "1000" - ], - "description": "Google language ids, e.g. 1000 English", - "items": { - "pattern": "^\\d+$", - "type": "string" - }, - "maxItems": 20, - "minItems": 1, - "type": "array" - }, - "location_ids": { - "default": [ - "2840" - ], - "description": "Google geo target ids, e.g. 2840 United States (Demand Gen targets locations per ad group, not per campaign)", - "items": { - "pattern": "^\\d+$", - "type": "string" - }, - "maxItems": 50, - "minItems": 1, - "type": "array" - }, - "name": { - "maxLength": 255, - "minLength": 1, - "type": "string" - } - }, - "required": [ - "name", - "ads" - ], - "type": "object" - }, - "maxItems": 5, - "minItems": 1, - "type": "array" - }, - "bidding": { - "default": "MAXIMIZE_CONVERSIONS", - "description": "Demand Gen bids automatically: MAXIMIZE_CONVERSIONS (needs conversion tracking) or MAXIMIZE_CLICKS", - "enum": [ - "MAXIMIZE_CONVERSIONS", - "MAXIMIZE_CLICKS" - ], - "type": "string" - }, - "daily_budget": { - "description": "Average daily budget in the account's currency, e.g. 20 for $20.00/day", - "exclusiveMinimum": 0, - "maximum": 1000000, - "type": "number" - }, - "end_date": { - "description": "Last day the campaign runs, YYYY-MM-DD", - "pattern": "^\\d{4}-\\d{2}-\\d{2}$", - "type": "string" - }, - "name": { - "description": "Campaign name; must not match an existing campaign", - "maxLength": 255, - "minLength": 1, - "type": "string" - }, - "type": { - "const": "create_demand_gen_campaign", - "type": "string" - } - }, - "required": [ - "type", - "name", - "daily_budget", - "ad_groups" - ], - "type": "object" - }, - { - "description": "Build a new Performance Max campaign: one budget, Google places ads across Search, YouTube, Display, Discover, Gmail and Maps from the asset groups' text, images and videos. No shopping feed (non-retail). It is created PAUSED: nothing spends until a separate enable_campaign", - "properties": { - "asset_groups": { - "items": { - "description": "An asset group: the headlines, descriptions, images and videos Google combines into ads on every channel", - "properties": { - "descriptions": { - "description": "2 to 5 descriptions, each at most 90 characters; Google recommends one of 60 or fewer", - "items": { - "maxLength": 90, - "minLength": 1, - "type": "string" - }, - "maxItems": 5, - "minItems": 2, - "type": "array" - }, - "final_url": { - "description": "The landing page (Google may also send people to other pages on the same site)", - "maxLength": 2048, - "pattern": "^https?:\\/\\/", - "type": "string" - }, - "headlines": { - "description": "3 to 15 headlines, each at most 30 characters", - "items": { - "maxLength": 30, - "minLength": 1, - "type": "string" - }, - "maxItems": 15, - "minItems": 3, - "type": "array" - }, - "long_headlines": { - "description": "1 to 5 long headlines, each at most 90 characters", - "items": { - "maxLength": 90, - "minLength": 1, - "type": "string" - }, - "maxItems": 5, - "minItems": 1, - "type": "array" - }, - "marketing_images": { - "description": "1 to 20 landscape images, 1.91:1 (e.g. 1200×628)", - "items": { - "description": "An https URL of a PNG, JPEG or GIF (at most 5120 KB), or the id of an image asset already in the account (asset.id from run_gaql WHERE asset.type = 'IMAGE')", - "maxLength": 2048, - "minLength": 1, - "type": "string" - }, - "maxItems": 20, - "minItems": 1, - "type": "array" - }, - "name": { - "maxLength": 255, - "minLength": 1, - "type": "string" - }, - "portrait_marketing_images": { - "default": [], - "description": "0 to 20 portrait images, 4:5 (e.g. 960×1200)", - "items": { - "description": "An https URL of a PNG, JPEG or GIF (at most 5120 KB), or the id of an image asset already in the account (asset.id from run_gaql WHERE asset.type = 'IMAGE')", - "maxLength": 2048, - "minLength": 1, - "type": "string" - }, - "maxItems": 20, - "minItems": 0, - "type": "array" - }, - "square_marketing_images": { - "description": "1 to 20 square images, 1:1 (e.g. 1200×1200)", - "items": { - "description": "An https URL of a PNG, JPEG or GIF (at most 5120 KB), or the id of an image asset already in the account (asset.id from run_gaql WHERE asset.type = 'IMAGE')", - "maxLength": 2048, - "minLength": 1, - "type": "string" - }, - "maxItems": 20, - "minItems": 1, - "type": "array" - }, - "videos": { - "default": [], - "description": "0 to 5 YouTube videos; without one, Google may auto-generate a video from the images", - "items": { - "description": "A YouTube video id (e.g. dQw4w9WgXcQ) or its youtube.com / youtu.be URL. The video must be public or unlisted", - "maxLength": 200, - "minLength": 1, - "type": "string" - }, - "maxItems": 5, - "type": "array" - } - }, - "required": [ - "name", - "final_url", - "headlines", - "long_headlines", - "descriptions", - "marketing_images", - "square_marketing_images" - ], - "type": "object" - }, - "maxItems": 5, - "minItems": 1, - "type": "array" - }, - "bidding": { - "default": "MAXIMIZE_CONVERSIONS", - "description": "Performance Max bids for conversions only: MAXIMIZE_CONVERSIONS, or MAXIMIZE_CONVERSION_VALUE when conversions carry values", - "enum": [ - "MAXIMIZE_CONVERSIONS", - "MAXIMIZE_CONVERSION_VALUE" - ], - "type": "string" - }, - "business_name": { - "description": "The advertiser's name, at most 25 characters (linked to the campaign, per Google's brand guidelines)", - "maxLength": 25, - "minLength": 1, - "type": "string" - }, - "daily_budget": { - "description": "Average daily budget in the account's currency, e.g. 20 for $20.00/day", - "exclusiveMinimum": 0, - "maximum": 1000000, - "type": "number" - }, - "end_date": { - "description": "Last day the campaign runs, YYYY-MM-DD", - "pattern": "^\\d{4}-\\d{2}-\\d{2}$", - "type": "string" - }, - "language_ids": { - "default": [ - "1000" - ], - "description": "Google language ids, e.g. 1000 English", - "items": { - "pattern": "^\\d+$", - "type": "string" - }, - "maxItems": 20, - "minItems": 1, - "type": "array" - }, - "location_ids": { - "default": [ - "2840" - ], - "description": "Google geo target ids, e.g. 2840 United States", - "items": { - "pattern": "^\\d+$", - "type": "string" - }, - "maxItems": 50, - "minItems": 1, - "type": "array" - }, - "logo_images": { - "description": "1 to 5 square logos, 1:1 (e.g. 1200×1200, at least 128×128), linked to the campaign", - "items": { - "description": "An https URL of a PNG, JPEG or GIF (at most 5120 KB), or the id of an image asset already in the account (asset.id from run_gaql WHERE asset.type = 'IMAGE')", - "maxLength": 2048, - "minLength": 1, - "type": "string" - }, - "maxItems": 5, - "minItems": 1, - "type": "array" - }, - "name": { - "description": "Campaign name; must not match an existing campaign", - "maxLength": 255, - "minLength": 1, - "type": "string" - }, - "target_cpa": { - "description": "MAXIMIZE_CONVERSIONS only: target cost per conversion", - "exclusiveMinimum": 0, - "maximum": 1000, - "type": "number" - }, - "type": { - "const": "create_performance_max_campaign", - "type": "string" - } - }, - "required": [ - "type", - "name", - "daily_budget", - "business_name", - "logo_images", - "asset_groups" - ], - "type": "object" - }, - { - "description": "Add an ad group, with its keywords and ads, to an existing Search campaign", - "properties": { - "ad_group": { - "properties": { - "ads": { - "items": { - "description": "A responsive search ad", - "properties": { - "descriptions": { - "description": "2 to 4 descriptions, each at most 90 characters", - "items": { - "maxLength": 90, - "minLength": 1, - "type": "string" - }, - "maxItems": 4, - "minItems": 2, - "type": "array" - }, - "final_url": { - "description": "The landing page", - "maxLength": 2048, - "pattern": "^https?:\\/\\/", - "type": "string" - }, - "headlines": { - "description": "3 to 15 headlines, each at most 30 characters", - "items": { - "maxLength": 30, - "minLength": 1, - "type": "string" - }, - "maxItems": 15, - "minItems": 3, - "type": "array" - }, - "path1": { - "description": "Display path part 1, at most 15 characters", - "maxLength": 15, - "minLength": 1, - "type": "string" - }, - "path2": { - "description": "Display path part 2, at most 15 characters", - "maxLength": 15, - "minLength": 1, - "type": "string" - } - }, - "required": [ - "headlines", - "descriptions", - "final_url" - ], - "type": "object" - }, - "maxItems": 3, - "minItems": 1, - "type": "array" - }, - "default_max_cpc": { - "description": "Default max cost per click for the ad group (required when the campaign uses manual CPC)", - "exclusiveMinimum": 0, - "maximum": 1000, - "type": "number" - }, - "keywords": { - "items": { - "properties": { - "match_type": { - "description": "PHRASE matches searches containing the words in order; the usual choice", - "enum": [ - "EXACT", - "PHRASE", - "BROAD" - ], - "type": "string" - }, - "max_cpc": { - "description": "Max cost per click for this keyword in the account's currency (manual CPC only); omit to use the ad group's", - "exclusiveMinimum": 0, - "maximum": 1000, - "type": "number" - }, - "text": { - "description": "The keyword, e.g. \"cleaning invoice template\"", - "maxLength": 80, - "minLength": 1, - "type": "string" - } - }, - "required": [ - "text", - "match_type" - ], - "type": "object" - }, - "maxItems": 50, - "minItems": 1, - "type": "array" - }, - "name": { - "maxLength": 255, - "minLength": 1, - "type": "string" - } - }, - "required": [ - "name", - "keywords", - "ads" - ], - "type": "object" - }, - "campaign_id": { - "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)", - "pattern": "^\\d+$", - "type": "string" - }, - "type": { - "const": "add_ad_group", - "type": "string" - } - }, - "required": [ - "type", - "campaign_id", - "ad_group" - ], - "type": "object" - }, - { - "description": "Add keywords to an existing ad group", - "properties": { - "ad_group_id": { - "description": "Ad group id, digits only (ad_group.id from run_gaql)", - "pattern": "^\\d+$", - "type": "string" - }, - "keywords": { - "items": { - "properties": { - "match_type": { - "description": "PHRASE matches searches containing the words in order; the usual choice", - "enum": [ - "EXACT", - "PHRASE", - "BROAD" - ], - "type": "string" - }, - "max_cpc": { - "description": "Max cost per click for this keyword in the account's currency (manual CPC only); omit to use the ad group's", - "exclusiveMinimum": 0, - "maximum": 1000, - "type": "number" - }, - "text": { - "description": "The keyword, e.g. \"cleaning invoice template\"", - "maxLength": 80, - "minLength": 1, - "type": "string" - } - }, - "required": [ - "text", - "match_type" - ], - "type": "object" - }, - "maxItems": 50, - "minItems": 1, - "type": "array" - }, - "type": { - "const": "add_keywords", - "type": "string" - } - }, - "required": [ - "type", - "ad_group_id", - "keywords" - ], - "type": "object" - }, - { - "description": "Add a responsive search ad to an existing ad group", - "properties": { - "ad": { - "description": "A responsive search ad", - "properties": { - "descriptions": { - "description": "2 to 4 descriptions, each at most 90 characters", - "items": { - "maxLength": 90, - "minLength": 1, - "type": "string" - }, - "maxItems": 4, - "minItems": 2, - "type": "array" - }, - "final_url": { - "description": "The landing page", - "maxLength": 2048, - "pattern": "^https?:\\/\\/", - "type": "string" - }, - "headlines": { - "description": "3 to 15 headlines, each at most 30 characters", - "items": { - "maxLength": 30, - "minLength": 1, - "type": "string" - }, - "maxItems": 15, - "minItems": 3, - "type": "array" - }, - "path1": { - "description": "Display path part 1, at most 15 characters", - "maxLength": 15, - "minLength": 1, - "type": "string" - }, - "path2": { - "description": "Display path part 2, at most 15 characters", - "maxLength": 15, - "minLength": 1, - "type": "string" - } - }, - "required": [ - "headlines", - "descriptions", - "final_url" - ], - "type": "object" - }, - "ad_group_id": { - "description": "Ad group id, digits only (ad_group.id from run_gaql)", - "pattern": "^\\d+$", - "type": "string" - }, - "type": { - "const": "add_responsive_search_ad", - "type": "string" - } - }, - "required": [ - "type", - "ad_group_id", - "ad" - ], - "type": "object" - }, - { - "description": "Add sitelinks to a campaign", - "properties": { - "campaign_id": { - "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)", - "pattern": "^\\d+$", - "type": "string" - }, - "sitelinks": { - "items": { - "properties": { - "description1": { - "description": "At most 35 characters; give both descriptions or neither", - "maxLength": 35, - "minLength": 1, - "type": "string" - }, - "description2": { - "maxLength": 35, - "minLength": 1, - "type": "string" - }, - "text": { - "description": "Link text, at most 25 characters", - "maxLength": 25, - "minLength": 1, - "type": "string" - }, - "url": { - "maxLength": 2048, - "pattern": "^https?:\\/\\/", - "type": "string" - } - }, - "required": [ - "text", - "url" - ], - "type": "object" - }, - "maxItems": 8, - "minItems": 1, - "type": "array" - }, - "type": { - "const": "add_sitelinks", - "type": "string" - } - }, - "required": [ - "type", - "campaign_id", - "sitelinks" - ], - "type": "object" - }, - { - "description": "Make a campaign count and bid on ONE conversion category only (e.g. SIGNUP), so another product's or step's conversions don't steer it", - "properties": { - "campaign_id": { - "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)", - "pattern": "^\\d+$", - "type": "string" - }, - "category": { - "description": "Conversion category, e.g. SIGNUP, PURCHASE, SUBMIT_LEAD_FORM, QUALIFIED_LEAD (see conversion_action.category in run_gaql)", - "pattern": "^[A-Z_]+$", - "type": "string" - }, - "type": { - "const": "set_conversion_goal", - "type": "string" - } - }, - "required": [ - "type", - "campaign_id", - "category" - ], - "type": "object" - }, - { - "description": "Change one keyword's max CPC (manual CPC campaigns)", - "properties": { - "ad_group_id": { - "description": "Ad group id, digits only (ad_group.id from run_gaql)", - "pattern": "^\\d+$", - "type": "string" - }, - "criterion_id": { - "description": "Keyword criterion id, digits only (ad_group_criterion.criterion_id from run_gaql)", - "pattern": "^\\d+$", - "type": "string" - }, - "max_cpc": { - "anyOf": [ - { - "exclusiveMinimum": 0, - "maximum": 1000, - "type": "number" - }, - { - "type": "null" - } - ], - "description": "New max cost per click for this keyword, or null to clear it so the keyword uses the ad group's bid" - }, - "type": { - "const": "set_keyword_bid", - "type": "string" - } - }, - "required": [ - "type", - "ad_group_id", - "criterion_id", - "max_cpc" - ], - "type": "object" - }, - { - "description": "Change an ad group's default max CPC, which its keywords use unless they have their own", - "properties": { - "ad_group_id": { - "description": "Ad group id, digits only (ad_group.id from run_gaql)", - "pattern": "^\\d+$", - "type": "string" - }, - "max_cpc": { - "description": "New default max cost per click for the ad group", - "exclusiveMinimum": 0, - "maximum": 1000, - "type": "number" - }, - "type": { - "const": "set_ad_group_bid", - "type": "string" - } - }, - "required": [ - "type", - "ad_group_id", - "max_cpc" - ], - "type": "object" - }, - { - "description": "Pause one ad", - "properties": { - "ad_group_id": { - "description": "Ad group id, digits only (ad_group.id from run_gaql)", - "pattern": "^\\d+$", - "type": "string" - }, - "ad_id": { - "description": "Ad id, digits only (ad_group_ad.ad.id from run_gaql)", - "pattern": "^\\d+$", - "type": "string" - }, - "type": { - "const": "pause_ad", - "type": "string" - } - }, - "required": [ - "type", - "ad_group_id", - "ad_id" - ], - "type": "object" - }, - { - "description": "Re-enable one paused ad", - "properties": { - "ad_group_id": { - "description": "Ad group id, digits only (ad_group.id from run_gaql)", - "pattern": "^\\d+$", - "type": "string" - }, - "ad_id": { - "description": "Ad id, digits only (ad_group_ad.ad.id from run_gaql)", - "pattern": "^\\d+$", - "type": "string" - }, - "type": { - "const": "enable_ad", - "type": "string" - } - }, - "required": [ - "type", - "ad_group_id", - "ad_id" - ], - "type": "object" - }, - { - "description": "Add locations and/or languages a campaign targets", - "properties": { - "campaign_id": { - "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)", - "pattern": "^\\d+$", - "type": "string" - }, - "language_ids": { - "default": [], - "description": "Language ids to add, e.g. 1000 English", - "items": { - "pattern": "^\\d+$", - "type": "string" - }, - "maxItems": 20, - "type": "array" - }, - "location_ids": { - "default": [], - "description": "Geo target ids to add, e.g. 2840 United States", - "items": { - "pattern": "^\\d+$", - "type": "string" - }, - "maxItems": 50, - "type": "array" - }, - "type": { - "const": "add_campaign_targeting", - "type": "string" - } - }, - "required": [ - "type", - "campaign_id" - ], - "type": "object" - }, - { - "description": "Stop targeting some of a campaign's locations and/or languages", - "properties": { - "campaign_id": { - "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)", - "pattern": "^\\d+$", - "type": "string" - }, - "language_ids": { - "default": [], - "items": { - "pattern": "^\\d+$", - "type": "string" - }, - "maxItems": 20, - "type": "array" - }, - "location_ids": { - "default": [], - "items": { - "pattern": "^\\d+$", - "type": "string" - }, - "maxItems": 50, - "type": "array" - }, - "type": { - "const": "remove_campaign_targeting", - "type": "string" - } - }, - "required": [ - "type", - "campaign_id" - ], - "type": "object" - }, - { - "description": "Choose whether a campaign shows to people in its locations only, or also to people interested in them", - "properties": { - "campaign_id": { - "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)", - "pattern": "^\\d+$", - "type": "string" - }, - "presence_only": { - "description": "true: only people IN the locations; false: also people interested in them", - "type": "boolean" - }, - "type": { - "const": "set_location_mode", - "type": "string" - } - }, - "required": [ - "type", - "campaign_id", - "presence_only" - ], - "type": "object" - }, - { - "description": "Switch ONE campaign's bid strategy. A campaign on a shared (portfolio) strategy moves off it onto its own; the other campaigns on the shared strategy keep it. To change the shared strategy for every campaign on it, use set_shared_bid_strategy. If the user didn't say which they mean, ask. Google re-learns after a switch, so performance can wobble for a week or two", - "properties": { - "campaign_id": { - "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)", - "pattern": "^\\d+$", - "type": "string" - }, - "max_cpc_ceiling": { - "description": "MAXIMIZE_CLICKS only: the most Google may bid per click", - "exclusiveMinimum": 0, - "maximum": 1000, - "type": "number" - }, - "strategy": { - "enum": [ - "MANUAL_CPC", - "MAXIMIZE_CLICKS", - "MAXIMIZE_CONVERSIONS" - ], - "type": "string" - }, - "target_cpa": { - "description": "MAXIMIZE_CONVERSIONS only: target cost per conversion", - "exclusiveMinimum": 0, - "maximum": 1000, - "type": "number" - }, - "type": { - "const": "set_bidding_strategy", - "type": "string" - } - }, - "required": [ - "type", - "campaign_id", - "strategy" - ], - "type": "object" - }, - { - "description": "Change a shared (portfolio) bid strategy's targets. This changes EVERY campaign on it, which the proposal lists. Its type can't be changed; to move one campaign to another strategy, use set_bidding_strategy", - "properties": { - "bidding_strategy_id": { - "description": "Shared (portfolio) strategy id: bidding_strategy.id from run_gaql, or the id at the end of campaign.bidding_strategy", - "pattern": "^\\d+$", - "type": "string" - }, - "max_cpc_ceiling": { - "description": "The most Google may bid per click", - "exclusiveMinimum": 0, - "maximum": 1000, - "type": "number" - }, - "target_cpa": { - "description": "Target cost per conversion (TARGET_CPA and MAXIMIZE_CONVERSIONS strategies)", - "exclusiveMinimum": 0, - "maximum": 1000, - "type": "number" - }, - "target_roas": { - "description": "Target return on ad spend as a ratio, e.g. 4 = 400% (TARGET_ROAS and MAXIMIZE_CONVERSION_VALUE)", - "exclusiveMinimum": 0, - "maximum": 1000, - "type": "number" - }, - "type": { - "const": "set_shared_bid_strategy", - "type": "string" - } - }, - "required": [ - "type", - "bidding_strategy_id" - ], - "type": "object" - }, - { - "description": "Create a shared (portfolio) bid strategy, optionally moving campaigns onto it. Undo moves those campaigns back and removes it", - "properties": { - "campaign_ids": { - "default": [], - "description": "Campaigns to move onto it in the same step (each leaves its current strategy)", - "items": { - "pattern": "^\\d+$", - "type": "string" - }, - "maxItems": 50, - "type": "array" - }, - "max_cpc_ceiling": { - "description": "The most Google may bid per click", - "exclusiveMinimum": 0, - "maximum": 1000, - "type": "number" - }, - "name": { - "description": "Name for the shared strategy; must not match an existing one", - "maxLength": 255, - "minLength": 1, - "type": "string" - }, - "strategy": { - "enum": [ - "MAXIMIZE_CLICKS", - "MAXIMIZE_CONVERSIONS", - "MAXIMIZE_CONVERSION_VALUE", - "TARGET_CPA", - "TARGET_ROAS" - ], - "type": "string" - }, - "target_cpa": { - "description": "Target cost per conversion: required for TARGET_CPA, optional for MAXIMIZE_CONVERSIONS", - "exclusiveMinimum": 0, - "maximum": 1000, - "type": "number" - }, - "target_roas": { - "description": "Target return on ad spend as a ratio, e.g. 4 = 400%: required for TARGET_ROAS, optional for MAXIMIZE_CONVERSION_VALUE", - "exclusiveMinimum": 0, - "maximum": 1000, - "type": "number" - }, - "type": { - "const": "create_shared_bid_strategy", - "type": "string" - } - }, - "required": [ - "type", - "name", - "strategy" - ], - "type": "object" - }, - { - "description": "Set or clear a campaign's final URL suffix (tracking parameters on every ad click)", - "properties": { - "campaign_id": { - "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)", - "pattern": "^\\d+$", - "type": "string" - }, - "suffix": { - "description": "Query string Google appends to every landing page in the campaign, e.g. \"utm_source=google&utm_medium=cpc&utm_term={keyword}\", or \"none\" to clear it", - "maxLength": 1000, - "type": "string" - }, - "type": { - "const": "set_url_suffix", - "type": "string" - } - }, - "required": [ - "type", - "campaign_id", - "suffix" - ], - "type": "object" - }, - { - "description": "Create a conversion action to measure sign-ups, leads or purchases", - "properties": { - "category": { - "description": "Conversion category, e.g. SIGNUP, PURCHASE, SUBMIT_LEAD_FORM, QUALIFIED_LEAD (see conversion_action.category in run_gaql)", - "pattern": "^[A-Z_]+$", - "type": "string" - }, - "counting": { - "default": "ONE_PER_CLICK", - "description": "ONE_PER_CLICK for sign-ups and leads; MANY_PER_CLICK for purchases", - "enum": [ - "ONE_PER_CLICK", - "MANY_PER_CLICK" - ], - "type": "string" - }, - "default_value": { - "description": "Value per conversion when none is sent", - "maximum": 1000000, - "minimum": 0, - "type": "number" - }, - "name": { - "maxLength": 100, - "minLength": 1, - "type": "string" - }, - "primary": { - "default": true, - "description": "Primary actions count in Conversions and can steer bidding", - "type": "boolean" - }, - "source": { - "default": "UPLOAD_CLICKS", - "description": "UPLOAD_CLICKS: your server uploads ad click ids (no Google tag). WEBPAGE: Google gives you a tag to put on the page", - "enum": [ - "UPLOAD_CLICKS", - "WEBPAGE" - ], - "type": "string" - }, - "type": { - "const": "create_conversion_action", - "type": "string" - } - }, - "required": [ - "type", - "name", - "category" - ], - "type": "object" - }, - { - "description": "Set how many conversions one ad click can produce for a conversion action", - "properties": { - "conversion_action_id": { - "description": "conversion_action.id from run_gaql", - "pattern": "^\\d+$", - "type": "string" - }, - "counting": { - "enum": [ - "ONE_PER_CLICK", - "MANY_PER_CLICK" - ], - "type": "string" - }, - "type": { - "const": "set_conversion_counting", - "type": "string" - } - }, - "required": [ - "type", - "conversion_action_id", - "counting" - ], - "type": "object" - } -]New value: +[ + { + "description": "Block searches containing these words in one campaign", + "properties": { + "campaign_id": { + "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "keywords": { + "items": { + "properties": { + "match_type": { + "description": "PHRASE blocks any search containing the words in order; the usual choice", + "enum": [ + "EXACT", + "PHRASE", + "BROAD" + ], + "type": "string" + }, + "text": { + "description": "The search words to block, e.g. \"free\"", + "maxLength": 80, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "text", + "match_type" + ], + "type": "object" + }, + "maxItems": 50, + "minItems": 1, + "type": "array" + }, + "type": { + "const": "add_negative_keywords", + "type": "string" + } + }, + "required": [ + "type", + "campaign_id", + "keywords" + ], + "type": "object" + }, + { + "description": "Pause one keyword", + "properties": { + "ad_group_id": { + "description": "Ad group id, digits only (ad_group.id from run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "criterion_id": { + "description": "Keyword criterion id, digits only (ad_group_criterion.criterion_id from run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "type": { + "const": "pause_keyword", + "type": "string" + } + }, + "required": [ + "type", + "ad_group_id", + "criterion_id" + ], + "type": "object" + }, + { + "description": "Re-enable one paused keyword", + "properties": { + "ad_group_id": { + "description": "Ad group id, digits only (ad_group.id from run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "criterion_id": { + "description": "Keyword criterion id, digits only (ad_group_criterion.criterion_id from run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "type": { + "const": "enable_keyword", + "type": "string" + } + }, + "required": [ + "type", + "ad_group_id", + "criterion_id" + ], + "type": "object" + }, + { + "description": "Pause a whole campaign (stops all its spend)", + "properties": { + "campaign_id": { + "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "type": { + "const": "pause_campaign", + "type": "string" + } + }, + "required": [ + "type", + "campaign_id" + ], + "type": "object" + }, + { + "description": "Turn a paused campaign back on. It starts spending again; the summary says how much", + "properties": { + "campaign_id": { + "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "type": { + "const": "enable_campaign", + "type": "string" + } + }, + "required": [ + "type", + "campaign_id" + ], + "type": "object" + }, + { + "description": "Pause one ad group", + "properties": { + "ad_group_id": { + "description": "Ad group id, digits only (ad_group.id from run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "type": { + "const": "pause_ad_group", + "type": "string" + } + }, + "required": [ + "type", + "ad_group_id" + ], + "type": "object" + }, + { + "description": "Re-enable one paused ad group", + "properties": { + "ad_group_id": { + "description": "Ad group id, digits only (ad_group.id from run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "type": { + "const": "enable_ad_group", + "type": "string" + } + }, + "required": [ + "type", + "ad_group_id" + ], + "type": "object" + }, + { + "description": "Change a campaign's daily budget (not shared budgets)", + "properties": { + "amount": { + "description": "New average daily budget in the account's currency, e.g. 10 for $10.00/day (not micros)", + "exclusiveMinimum": 0, + "maximum": 1000000, + "type": "number" + }, + "campaign_id": { + "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "type": { + "const": "set_daily_budget", + "type": "string" + } + }, + "required": [ + "type", + "campaign_id", + "amount" + ], + "type": "object" + }, + { + "description": "Set the last day a campaign runs, so it stops spending on its own", + "properties": { + "campaign_id": { + "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "end_date": { + "anyOf": [ + { + "pattern": "^\\d{4}-\\d{2}-\\d{2}$", + "type": "string" + }, + { + "const": "none", + "type": "string" + } + ], + "description": "Last day the campaign runs, YYYY-MM-DD in the account's time zone (it stops after 23:59:59 that day), or \"none\" to remove the end date" + }, + "type": { + "const": "set_end_date", + "type": "string" + } + }, + "required": [ + "type", + "campaign_id", + "end_date" + ], + "type": "object" + }, + { + "description": "Build a new Search campaign with its ad groups, keywords, ads, targeting, negatives and sitelinks, in one step. It is created PAUSED: nothing spends until a separate enable_campaign", + "properties": { + "ad_groups": { + "items": { + "properties": { + "ads": { + "items": { + "description": "A responsive search ad", + "properties": { + "descriptions": { + "description": "2 to 4 descriptions, each at most 90 characters", + "items": { + "maxLength": 90, + "minLength": 1, + "type": "string" + }, + "maxItems": 4, + "minItems": 2, + "type": "array" + }, + "final_url": { + "description": "The landing page", + "maxLength": 2048, + "pattern": "^https?:\\/\\/", + "type": "string" + }, + "headlines": { + "description": "3 to 15 headlines, each at most 30 characters", + "items": { + "maxLength": 30, + "minLength": 1, + "type": "string" + }, + "maxItems": 15, + "minItems": 3, + "type": "array" + }, + "path1": { + "description": "Display path part 1, at most 15 characters", + "maxLength": 15, + "minLength": 1, + "type": "string" + }, + "path2": { + "description": "Display path part 2, at most 15 characters", + "maxLength": 15, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "headlines", + "descriptions", + "final_url" + ], + "type": "object" + }, + "maxItems": 3, + "minItems": 1, + "type": "array" + }, + "default_max_cpc": { + "description": "Default max cost per click for the ad group (required when the campaign uses manual CPC)", + "exclusiveMinimum": 0, + "maximum": 1000, + "type": "number" + }, + "keywords": { + "items": { + "properties": { + "match_type": { + "description": "PHRASE matches searches containing the words in order; the usual choice", + "enum": [ + "EXACT", + "PHRASE", + "BROAD" + ], + "type": "string" + }, + "max_cpc": { + "description": "Max cost per click for this keyword in the account's currency (manual CPC only); omit to use the ad group's", + "exclusiveMinimum": 0, + "maximum": 1000, + "type": "number" + }, + "text": { + "description": "The keyword, e.g. \"cleaning invoice template\"", + "maxLength": 80, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "text", + "match_type" + ], + "type": "object" + }, + "maxItems": 50, + "minItems": 1, + "type": "array" + }, + "name": { + "maxLength": 255, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "name", + "keywords", + "ads" + ], + "type": "object" + }, + "maxItems": 10, + "minItems": 1, + "type": "array" + }, + "bidding": { + "default": "MANUAL_CPC", + "description": "MANUAL_CPC uses the ad group and keyword max CPCs; MAXIMIZE_CLICKS and MAXIMIZE_CONVERSIONS let Google bid within the budget", + "enum": [ + "MANUAL_CPC", + "MAXIMIZE_CLICKS", + "MAXIMIZE_CONVERSIONS" + ], + "type": "string" + }, + "daily_budget": { + "description": "Average daily budget in the account's currency, e.g. 20 for $20.00/day", + "exclusiveMinimum": 0, + "maximum": 1000000, + "type": "number" + }, + "end_date": { + "description": "Last day the campaign runs, YYYY-MM-DD", + "pattern": "^\\d{4}-\\d{2}-\\d{2}$", + "type": "string" + }, + "language_ids": { + "default": [ + "1000" + ], + "description": "Google language ids, e.g. 1000 English, 1003 Spanish", + "items": { + "pattern": "^\\d+$", + "type": "string" + }, + "maxItems": 20, + "minItems": 1, + "type": "array" + }, + "location_ids": { + "default": [ + "2840" + ], + "description": "Google geo target ids, e.g. 2840 United States, 2826 United Kingdom, 2124 Canada (look others up in geo_target_constant)", + "items": { + "pattern": "^\\d+$", + "type": "string" + }, + "maxItems": 50, + "minItems": 1, + "type": "array" + }, + "max_cpc_ceiling": { + "description": "MAXIMIZE_CLICKS only: the most Google may bid per click", + "exclusiveMinimum": 0, + "maximum": 1000, + "type": "number" + }, + "name": { + "description": "Campaign name; must not match an existing campaign", + "maxLength": 255, + "minLength": 1, + "type": "string" + }, + "negative_keywords": { + "default": [], + "description": "Searches to block across the campaign", + "items": { + "properties": { + "match_type": { + "enum": [ + "EXACT", + "PHRASE", + "BROAD" + ], + "type": "string" + }, + "text": { + "maxLength": 80, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "text", + "match_type" + ], + "type": "object" + }, + "maxItems": 200, + "type": "array" + }, + "presence_only": { + "default": true, + "description": "Show ads only to people IN the locations (true), not merely interested in them", + "type": "boolean" + }, + "search_partners": { + "default": false, + "description": "Also show on Google's search partner sites", + "type": "boolean" + }, + "sitelinks": { + "default": [], + "items": { + "properties": { + "description1": { + "description": "At most 35 characters; give both descriptions or neither", + "maxLength": 35, + "minLength": 1, + "type": "string" + }, + "description2": { + "maxLength": 35, + "minLength": 1, + "type": "string" + }, + "text": { + "description": "Link text, at most 25 characters", + "maxLength": 25, + "minLength": 1, + "type": "string" + }, + "url": { + "maxLength": 2048, + "pattern": "^https?:\\/\\/", + "type": "string" + } + }, + "required": [ + "text", + "url" + ], + "type": "object" + }, + "maxItems": 8, + "type": "array" + }, + "type": { + "const": "create_campaign", + "type": "string" + } + }, + "required": [ + "type", + "name", + "daily_budget", + "ad_groups" + ], + "type": "object" + }, + { + "description": "Build a new Display campaign (image ads across Google's Display Network of sites and apps) with ad groups and responsive display ads. Google's optimized targeting finds the audience. It is created PAUSED: nothing spends until a separate enable_campaign", + "properties": { + "ad_groups": { + "items": { + "properties": { + "ads": { + "items": { + "description": "A responsive display ad: Google assembles ads from these headlines, descriptions and images", + "properties": { + "business_name": { + "description": "The advertiser's name, at most 25 characters", + "maxLength": 25, + "minLength": 1, + "type": "string" + }, + "descriptions": { + "description": "1 to 5 descriptions, each at most 90 characters", + "items": { + "maxLength": 90, + "minLength": 1, + "type": "string" + }, + "maxItems": 5, + "minItems": 1, + "type": "array" + }, + "final_url": { + "description": "The landing page", + "maxLength": 2048, + "pattern": "^https?:\\/\\/", + "type": "string" + }, + "headlines": { + "description": "1 to 5 short headlines, each at most 30 characters", + "items": { + "maxLength": 30, + "minLength": 1, + "type": "string" + }, + "maxItems": 5, + "minItems": 1, + "type": "array" + }, + "logo_images": { + "default": [], + "description": "0 to 5 landscape logos, 4:1 (e.g. 1200×300, at least 512×128)", + "items": { + "description": "An https URL of a PNG, JPEG or GIF (at most 5120 KB), or the id of an image asset already in the account (asset.id from run_gaql WHERE asset.type = 'IMAGE')", + "maxLength": 2048, + "minLength": 1, + "type": "string" + }, + "maxItems": 5, + "minItems": 0, + "type": "array" + }, + "long_headline": { + "description": "One long headline, at most 90 characters", + "maxLength": 90, + "minLength": 1, + "type": "string" + }, + "marketing_images": { + "description": "1 to 15 landscape images, 1.91:1 (e.g. 1200×628, at least 600×314)", + "items": { + "description": "An https URL of a PNG, JPEG or GIF (at most 5120 KB), or the id of an image asset already in the account (asset.id from run_gaql WHERE asset.type = 'IMAGE')", + "maxLength": 2048, + "minLength": 1, + "type": "string" + }, + "maxItems": 15, + "minItems": 1, + "type": "array" + }, + "square_logo_images": { + "default": [], + "description": "0 to 5 square logos, 1:1 (e.g. 1200×1200, at least 128×128)", + "items": { + "description": "An https URL of a PNG, JPEG or GIF (at most 5120 KB), or the id of an image asset already in the account (asset.id from run_gaql WHERE asset.type = 'IMAGE')", + "maxLength": 2048, + "minLength": 1, + "type": "string" + }, + "maxItems": 5, + "minItems": 0, + "type": "array" + }, + "square_marketing_images": { + "description": "1 to 15 square images, 1:1 (e.g. 1200×1200, at least 300×300)", + "items": { + "description": "An https URL of a PNG, JPEG or GIF (at most 5120 KB), or the id of an image asset already in the account (asset.id from run_gaql WHERE asset.type = 'IMAGE')", + "maxLength": 2048, + "minLength": 1, + "type": "string" + }, + "maxItems": 15, + "minItems": 1, + "type": "array" + } + }, + "required": [ + "headlines", + "long_headline", + "descriptions", + "business_name", + "final_url", + "marketing_images", + "square_marketing_images" + ], + "type": "object" + }, + "maxItems": 3, + "minItems": 1, + "type": "array" + }, + "default_max_cpc": { + "description": "Default max cost per click (required when the campaign uses manual CPC)", + "exclusiveMinimum": 0, + "maximum": 1000, + "type": "number" + }, + "name": { + "maxLength": 255, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "name", + "ads" + ], + "type": "object" + }, + "maxItems": 5, + "minItems": 1, + "type": "array" + }, + "bidding": { + "default": "MAXIMIZE_CLICKS", + "description": "MANUAL_CPC uses the ad groups' max CPCs; MAXIMIZE_CLICKS and MAXIMIZE_CONVERSIONS let Google bid within the budget", + "enum": [ + "MANUAL_CPC", + "MAXIMIZE_CLICKS", + "MAXIMIZE_CONVERSIONS" + ], + "type": "string" + }, + "daily_budget": { + "description": "Average daily budget in the account's currency, e.g. 20 for $20.00/day", + "exclusiveMinimum": 0, + "maximum": 1000000, + "type": "number" + }, + "end_date": { + "description": "Last day the campaign runs, YYYY-MM-DD", + "pattern": "^\\d{4}-\\d{2}-\\d{2}$", + "type": "string" + }, + "language_ids": { + "default": [ + "1000" + ], + "description": "Google language ids, e.g. 1000 English", + "items": { + "pattern": "^\\d+$", + "type": "string" + }, + "maxItems": 20, + "minItems": 1, + "type": "array" + }, + "location_ids": { + "default": [ + "2840" + ], + "description": "Google geo target ids, e.g. 2840 United States", + "items": { + "pattern": "^\\d+$", + "type": "string" + }, + "maxItems": 50, + "minItems": 1, + "type": "array" + }, + "max_cpc_ceiling": { + "description": "MAXIMIZE_CLICKS only: the most Google may bid per click", + "exclusiveMinimum": 0, + "maximum": 1000, + "type": "number" + }, + "name": { + "description": "Campaign name; must not match an existing campaign", + "maxLength": 255, + "minLength": 1, + "type": "string" + }, + "presence_only": { + "default": true, + "description": "Show ads only to people IN the locations (true), not merely interested in them", + "type": "boolean" + }, + "type": { + "const": "create_display_campaign", + "type": "string" + } + }, + "required": [ + "type", + "name", + "daily_budget", + "ad_groups" + ], + "type": "object" + }, + { + "description": "Build a new Demand Gen campaign with YouTube video ads, which is how to advertise on YouTube through the API (Google doesn't allow creating Video campaigns there). It is created PAUSED: nothing spends until a separate enable_campaign", + "properties": { + "ad_groups": { + "items": { + "properties": { + "ads": { + "items": { + "description": "A Demand Gen video ad: runs on YouTube (in-stream, in-feed and Shorts), Discover and Gmail", + "properties": { + "business_name": { + "description": "The advertiser's name, at most 25 characters", + "maxLength": 25, + "minLength": 1, + "type": "string" + }, + "descriptions": { + "description": "1 to 5 descriptions, each at most 90 characters", + "items": { + "maxLength": 90, + "minLength": 1, + "type": "string" + }, + "maxItems": 5, + "minItems": 1, + "type": "array" + }, + "final_url": { + "description": "The landing page", + "maxLength": 2048, + "pattern": "^https?:\\/\\/", + "type": "string" + }, + "headlines": { + "description": "1 to 5 headlines, each at most 40 characters", + "items": { + "maxLength": 40, + "minLength": 1, + "type": "string" + }, + "maxItems": 5, + "minItems": 1, + "type": "array" + }, + "logo_image": { + "description": "A square 1:1 logo (e.g. 1200×1200, at least 128×128): an https URL, or an image asset id from the account", + "maxLength": 2048, + "minLength": 1, + "type": "string" + }, + "long_headlines": { + "description": "1 to 5 long headlines, each at most 90 characters", + "items": { + "maxLength": 90, + "minLength": 1, + "type": "string" + }, + "maxItems": 5, + "minItems": 1, + "type": "array" + }, + "videos": { + "description": "1 to 5 YouTube videos", + "items": { + "description": "A YouTube video id (e.g. dQw4w9WgXcQ) or its youtube.com / youtu.be URL. The video must be public or unlisted", + "maxLength": 200, + "minLength": 1, + "type": "string" + }, + "maxItems": 5, + "minItems": 1, + "type": "array" + } + }, + "required": [ + "videos", + "headlines", + "long_headlines", + "descriptions", + "business_name", + "logo_image", + "final_url" + ], + "type": "object" + }, + "maxItems": 3, + "minItems": 1, + "type": "array" + }, + "language_ids": { + "default": [ + "1000" + ], + "description": "Google language ids, e.g. 1000 English", + "items": { + "pattern": "^\\d+$", + "type": "string" + }, + "maxItems": 20, + "minItems": 1, + "type": "array" + }, + "location_ids": { + "default": [ + "2840" + ], + "description": "Google geo target ids, e.g. 2840 United States (Demand Gen targets locations per ad group, not per campaign)", + "items": { + "pattern": "^\\d+$", + "type": "string" + }, + "maxItems": 50, + "minItems": 1, + "type": "array" + }, + "name": { + "maxLength": 255, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "name", + "ads" + ], + "type": "object" + }, + "maxItems": 5, + "minItems": 1, + "type": "array" + }, + "bidding": { + "default": "MAXIMIZE_CONVERSIONS", + "description": "Demand Gen bids automatically: MAXIMIZE_CONVERSIONS (needs conversion tracking) or MAXIMIZE_CLICKS", + "enum": [ + "MAXIMIZE_CONVERSIONS", + "MAXIMIZE_CLICKS" + ], + "type": "string" + }, + "daily_budget": { + "description": "Average daily budget in the account's currency, e.g. 20 for $20.00/day", + "exclusiveMinimum": 0, + "maximum": 1000000, + "type": "number" + }, + "end_date": { + "description": "Last day the campaign runs, YYYY-MM-DD", + "pattern": "^\\d{4}-\\d{2}-\\d{2}$", + "type": "string" + }, + "name": { + "description": "Campaign name; must not match an existing campaign", + "maxLength": 255, + "minLength": 1, + "type": "string" + }, + "type": { + "const": "create_demand_gen_campaign", + "type": "string" + } + }, + "required": [ + "type", + "name", + "daily_budget", + "ad_groups" + ], + "type": "object" + }, + { + "description": "Build a new Performance Max campaign: one budget, Google places ads across Search, YouTube, Display, Discover, Gmail and Maps from the asset groups' text, images and videos. No shopping feed (non-retail). It is created PAUSED: nothing spends until a separate enable_campaign", + "properties": { + "asset_groups": { + "items": { + "description": "An asset group: the headlines, descriptions, images and videos Google combines into ads on every channel", + "properties": { + "descriptions": { + "description": "2 to 5 descriptions, each at most 90 characters; Google recommends one of 60 or fewer", + "items": { + "maxLength": 90, + "minLength": 1, + "type": "string" + }, + "maxItems": 5, + "minItems": 2, + "type": "array" + }, + "final_url": { + "description": "The landing page (Google may also send people to other pages on the same site)", + "maxLength": 2048, + "pattern": "^https?:\\/\\/", + "type": "string" + }, + "headlines": { + "description": "3 to 15 headlines, each at most 30 characters", + "items": { + "maxLength": 30, + "minLength": 1, + "type": "string" + }, + "maxItems": 15, + "minItems": 3, + "type": "array" + }, + "long_headlines": { + "description": "1 to 5 long headlines, each at most 90 characters", + "items": { + "maxLength": 90, + "minLength": 1, + "type": "string" + }, + "maxItems": 5, + "minItems": 1, + "type": "array" + }, + "marketing_images": { + "description": "1 to 20 landscape images, 1.91:1 (e.g. 1200×628)", + "items": { + "description": "An https URL of a PNG, JPEG or GIF (at most 5120 KB), or the id of an image asset already in the account (asset.id from run_gaql WHERE asset.type = 'IMAGE')", + "maxLength": 2048, + "minLength": 1, + "type": "string" + }, + "maxItems": 20, + "minItems": 1, + "type": "array" + }, + "name": { + "maxLength": 255, + "minLength": 1, + "type": "string" + }, + "portrait_marketing_images": { + "default": [], + "description": "0 to 20 portrait images, 4:5 (e.g. 960×1200)", + "items": { + "description": "An https URL of a PNG, JPEG or GIF (at most 5120 KB), or the id of an image asset already in the account (asset.id from run_gaql WHERE asset.type = 'IMAGE')", + "maxLength": 2048, + "minLength": 1, + "type": "string" + }, + "maxItems": 20, + "minItems": 0, + "type": "array" + }, + "square_marketing_images": { + "description": "1 to 20 square images, 1:1 (e.g. 1200×1200)", + "items": { + "description": "An https URL of a PNG, JPEG or GIF (at most 5120 KB), or the id of an image asset already in the account (asset.id from run_gaql WHERE asset.type = 'IMAGE')", + "maxLength": 2048, + "minLength": 1, + "type": "string" + }, + "maxItems": 20, + "minItems": 1, + "type": "array" + }, + "videos": { + "default": [], + "description": "0 to 5 YouTube videos; without one, Google may auto-generate a video from the images", + "items": { + "description": "A YouTube video id (e.g. dQw4w9WgXcQ) or its youtube.com / youtu.be URL. The video must be public or unlisted", + "maxLength": 200, + "minLength": 1, + "type": "string" + }, + "maxItems": 5, + "type": "array" + } + }, + "required": [ + "name", + "final_url", + "headlines", + "long_headlines", + "descriptions", + "marketing_images", + "square_marketing_images" + ], + "type": "object" + }, + "maxItems": 5, + "minItems": 1, + "type": "array" + }, + "bidding": { + "default": "MAXIMIZE_CONVERSIONS", + "description": "Performance Max bids for conversions only: MAXIMIZE_CONVERSIONS, or MAXIMIZE_CONVERSION_VALUE when conversions carry values", + "enum": [ + "MAXIMIZE_CONVERSIONS", + "MAXIMIZE_CONVERSION_VALUE" + ], + "type": "string" + }, + "business_name": { + "description": "The advertiser's name, at most 25 characters (linked to the campaign, per Google's brand guidelines)", + "maxLength": 25, + "minLength": 1, + "type": "string" + }, + "daily_budget": { + "description": "Average daily budget in the account's currency, e.g. 20 for $20.00/day", + "exclusiveMinimum": 0, + "maximum": 1000000, + "type": "number" + }, + "end_date": { + "description": "Last day the campaign runs, YYYY-MM-DD", + "pattern": "^\\d{4}-\\d{2}-\\d{2}$", + "type": "string" + }, + "language_ids": { + "default": [ + "1000" + ], + "description": "Google language ids, e.g. 1000 English", + "items": { + "pattern": "^\\d+$", + "type": "string" + }, + "maxItems": 20, + "minItems": 1, + "type": "array" + }, + "location_ids": { + "default": [ + "2840" + ], + "description": "Google geo target ids, e.g. 2840 United States", + "items": { + "pattern": "^\\d+$", + "type": "string" + }, + "maxItems": 50, + "minItems": 1, + "type": "array" + }, + "logo_images": { + "description": "1 to 5 square logos, 1:1 (e.g. 1200×1200, at least 128×128), linked to the campaign", + "items": { + "description": "An https URL of a PNG, JPEG or GIF (at most 5120 KB), or the id of an image asset already in the account (asset.id from run_gaql WHERE asset.type = 'IMAGE')", + "maxLength": 2048, + "minLength": 1, + "type": "string" + }, + "maxItems": 5, + "minItems": 1, + "type": "array" + }, + "name": { + "description": "Campaign name; must not match an existing campaign", + "maxLength": 255, + "minLength": 1, + "type": "string" + }, + "target_cpa": { + "description": "MAXIMIZE_CONVERSIONS only: target cost per conversion", + "exclusiveMinimum": 0, + "maximum": 1000, + "type": "number" + }, + "type": { + "const": "create_performance_max_campaign", + "type": "string" + } + }, + "required": [ + "type", + "name", + "daily_budget", + "business_name", + "logo_images", + "asset_groups" + ], + "type": "object" + }, + { + "description": "Add an ad group, with its keywords and ads, to an existing Search campaign", + "properties": { + "ad_group": { + "properties": { + "ads": { + "items": { + "description": "A responsive search ad", + "properties": { + "descriptions": { + "description": "2 to 4 descriptions, each at most 90 characters", + "items": { + "maxLength": 90, + "minLength": 1, + "type": "string" + }, + "maxItems": 4, + "minItems": 2, + "type": "array" + }, + "final_url": { + "description": "The landing page", + "maxLength": 2048, + "pattern": "^https?:\\/\\/", + "type": "string" + }, + "headlines": { + "description": "3 to 15 headlines, each at most 30 characters", + "items": { + "maxLength": 30, + "minLength": 1, + "type": "string" + }, + "maxItems": 15, + "minItems": 3, + "type": "array" + }, + "path1": { + "description": "Display path part 1, at most 15 characters", + "maxLength": 15, + "minLength": 1, + "type": "string" + }, + "path2": { + "description": "Display path part 2, at most 15 characters", + "maxLength": 15, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "headlines", + "descriptions", + "final_url" + ], + "type": "object" + }, + "maxItems": 3, + "minItems": 1, + "type": "array" + }, + "default_max_cpc": { + "description": "Default max cost per click for the ad group (required when the campaign uses manual CPC)", + "exclusiveMinimum": 0, + "maximum": 1000, + "type": "number" + }, + "keywords": { + "items": { + "properties": { + "match_type": { + "description": "PHRASE matches searches containing the words in order; the usual choice", + "enum": [ + "EXACT", + "PHRASE", + "BROAD" + ], + "type": "string" + }, + "max_cpc": { + "description": "Max cost per click for this keyword in the account's currency (manual CPC only); omit to use the ad group's", + "exclusiveMinimum": 0, + "maximum": 1000, + "type": "number" + }, + "text": { + "description": "The keyword, e.g. \"cleaning invoice template\"", + "maxLength": 80, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "text", + "match_type" + ], + "type": "object" + }, + "maxItems": 50, + "minItems": 1, + "type": "array" + }, + "name": { + "maxLength": 255, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "name", + "keywords", + "ads" + ], + "type": "object" + }, + "campaign_id": { + "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "type": { + "const": "add_ad_group", + "type": "string" + } + }, + "required": [ + "type", + "campaign_id", + "ad_group" + ], + "type": "object" + }, + { + "description": "Add keywords to an existing ad group", + "properties": { + "ad_group_id": { + "description": "Ad group id, digits only (ad_group.id from run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "keywords": { + "items": { + "properties": { + "match_type": { + "description": "PHRASE matches searches containing the words in order; the usual choice", + "enum": [ + "EXACT", + "PHRASE", + "BROAD" + ], + "type": "string" + }, + "max_cpc": { + "description": "Max cost per click for this keyword in the account's currency (manual CPC only); omit to use the ad group's", + "exclusiveMinimum": 0, + "maximum": 1000, + "type": "number" + }, + "text": { + "description": "The keyword, e.g. \"cleaning invoice template\"", + "maxLength": 80, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "text", + "match_type" + ], + "type": "object" + }, + "maxItems": 50, + "minItems": 1, + "type": "array" + }, + "type": { + "const": "add_keywords", + "type": "string" + } + }, + "required": [ + "type", + "ad_group_id", + "keywords" + ], + "type": "object" + }, + { + "description": "Add a responsive search ad to an existing ad group", + "properties": { + "ad": { + "description": "A responsive search ad", + "properties": { + "descriptions": { + "description": "2 to 4 descriptions, each at most 90 characters", + "items": { + "maxLength": 90, + "minLength": 1, + "type": "string" + }, + "maxItems": 4, + "minItems": 2, + "type": "array" + }, + "final_url": { + "description": "The landing page", + "maxLength": 2048, + "pattern": "^https?:\\/\\/", + "type": "string" + }, + "headlines": { + "description": "3 to 15 headlines, each at most 30 characters", + "items": { + "maxLength": 30, + "minLength": 1, + "type": "string" + }, + "maxItems": 15, + "minItems": 3, + "type": "array" + }, + "path1": { + "description": "Display path part 1, at most 15 characters", + "maxLength": 15, + "minLength": 1, + "type": "string" + }, + "path2": { + "description": "Display path part 2, at most 15 characters", + "maxLength": 15, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "headlines", + "descriptions", + "final_url" + ], + "type": "object" + }, + "ad_group_id": { + "description": "Ad group id, digits only (ad_group.id from run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "type": { + "const": "add_responsive_search_ad", + "type": "string" + } + }, + "required": [ + "type", + "ad_group_id", + "ad" + ], + "type": "object" + }, + { + "description": "Add sitelinks to a campaign", + "properties": { + "campaign_id": { + "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "sitelinks": { + "items": { + "properties": { + "description1": { + "description": "At most 35 characters; give both descriptions or neither", + "maxLength": 35, + "minLength": 1, + "type": "string" + }, + "description2": { + "maxLength": 35, + "minLength": 1, + "type": "string" + }, + "text": { + "description": "Link text, at most 25 characters", + "maxLength": 25, + "minLength": 1, + "type": "string" + }, + "url": { + "maxLength": 2048, + "pattern": "^https?:\\/\\/", + "type": "string" + } + }, + "required": [ + "text", + "url" + ], + "type": "object" + }, + "maxItems": 8, + "minItems": 1, + "type": "array" + }, + "type": { + "const": "add_sitelinks", + "type": "string" + } + }, + "required": [ + "type", + "campaign_id", + "sitelinks" + ], + "type": "object" + }, + { + "description": "Make a campaign count and bid on ONE conversion category only (e.g. SIGNUP), so another product's or step's conversions don't steer it", + "properties": { + "campaign_id": { + "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "category": { + "description": "Conversion category, e.g. SIGNUP, PURCHASE, SUBMIT_LEAD_FORM, QUALIFIED_LEAD (see conversion_action.category in run_gaql)", + "pattern": "^[A-Z_]+$", + "type": "string" + }, + "type": { + "const": "set_conversion_goal", + "type": "string" + } + }, + "required": [ + "type", + "campaign_id", + "category" + ], + "type": "object" + }, + { + "description": "Change one keyword's max CPC (manual CPC campaigns)", + "properties": { + "ad_group_id": { + "description": "Ad group id, digits only (ad_group.id from run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "criterion_id": { + "description": "Keyword criterion id, digits only (ad_group_criterion.criterion_id from run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "max_cpc": { + "anyOf": [ + { + "exclusiveMinimum": 0, + "maximum": 1000, + "type": "number" + }, + { + "type": "null" + } + ], + "description": "New max cost per click for this keyword, or null to clear it so the keyword uses the ad group's bid" + }, + "type": { + "const": "set_keyword_bid", + "type": "string" + } + }, + "required": [ + "type", + "ad_group_id", + "criterion_id", + "max_cpc" + ], + "type": "object" + }, + { + "description": "Change an ad group's default max CPC, which its keywords use unless they have their own", + "properties": { + "ad_group_id": { + "description": "Ad group id, digits only (ad_group.id from run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "max_cpc": { + "description": "New default max cost per click for the ad group", + "exclusiveMinimum": 0, + "maximum": 1000, + "type": "number" + }, + "type": { + "const": "set_ad_group_bid", + "type": "string" + } + }, + "required": [ + "type", + "ad_group_id", + "max_cpc" + ], + "type": "object" + }, + { + "description": "Pause one ad", + "properties": { + "ad_group_id": { + "description": "Ad group id, digits only (ad_group.id from run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "ad_id": { + "description": "Ad id, digits only (ad_group_ad.ad.id from run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "type": { + "const": "pause_ad", + "type": "string" + } + }, + "required": [ + "type", + "ad_group_id", + "ad_id" + ], + "type": "object" + }, + { + "description": "Re-enable one paused ad", + "properties": { + "ad_group_id": { + "description": "Ad group id, digits only (ad_group.id from run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "ad_id": { + "description": "Ad id, digits only (ad_group_ad.ad.id from run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "type": { + "const": "enable_ad", + "type": "string" + } + }, + "required": [ + "type", + "ad_group_id", + "ad_id" + ], + "type": "object" + }, + { + "description": "Add locations and/or languages a campaign targets", + "properties": { + "campaign_id": { + "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "language_ids": { + "default": [], + "description": "Language ids to add, e.g. 1000 English", + "items": { + "pattern": "^\\d+$", + "type": "string" + }, + "maxItems": 20, + "type": "array" + }, + "location_ids": { + "default": [], + "description": "Geo target ids to add, e.g. 2840 United States", + "items": { + "pattern": "^\\d+$", + "type": "string" + }, + "maxItems": 50, + "type": "array" + }, + "type": { + "const": "add_campaign_targeting", + "type": "string" + } + }, + "required": [ + "type", + "campaign_id" + ], + "type": "object" + }, + { + "description": "Stop targeting some of a campaign's locations and/or languages", + "properties": { + "campaign_id": { + "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "language_ids": { + "default": [], + "items": { + "pattern": "^\\d+$", + "type": "string" + }, + "maxItems": 20, + "type": "array" + }, + "location_ids": { + "default": [], + "items": { + "pattern": "^\\d+$", + "type": "string" + }, + "maxItems": 50, + "type": "array" + }, + "type": { + "const": "remove_campaign_targeting", + "type": "string" + } + }, + "required": [ + "type", + "campaign_id" + ], + "type": "object" + }, + { + "description": "Choose whether a campaign shows to people in its locations only, or also to people interested in them", + "properties": { + "campaign_id": { + "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "presence_only": { + "description": "true: only people IN the locations; false: also people interested in them", + "type": "boolean" + }, + "type": { + "const": "set_location_mode", + "type": "string" + } + }, + "required": [ + "type", + "campaign_id", + "presence_only" + ], + "type": "object" + }, + { + "description": "Switch ONE campaign's bid strategy. A campaign on a shared (portfolio) strategy moves off it onto its own; the other campaigns on the shared strategy keep it. To change the shared strategy for every campaign on it, use set_shared_bid_strategy. If the user didn't say which they mean, ask. Google re-learns after a switch, so performance can wobble for a week or two", + "properties": { + "campaign_id": { + "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "max_cpc_ceiling": { + "description": "MAXIMIZE_CLICKS only: the most Google may bid per click", + "exclusiveMinimum": 0, + "maximum": 1000, + "type": "number" + }, + "strategy": { + "enum": [ + "MANUAL_CPC", + "MAXIMIZE_CLICKS", + "MAXIMIZE_CONVERSIONS" + ], + "type": "string" + }, + "target_cpa": { + "description": "MAXIMIZE_CONVERSIONS only: target cost per conversion", + "exclusiveMinimum": 0, + "maximum": 1000, + "type": "number" + }, + "type": { + "const": "set_bidding_strategy", + "type": "string" + } + }, + "required": [ + "type", + "campaign_id", + "strategy" + ], + "type": "object" + }, + { + "description": "Change a shared (portfolio) bid strategy's targets. This changes EVERY campaign on it, which the proposal lists. Its type can't be changed; to move one campaign to another strategy, use set_bidding_strategy", + "properties": { + "bidding_strategy_id": { + "description": "Shared (portfolio) strategy id: bidding_strategy.id from run_gaql, or the id at the end of campaign.bidding_strategy", + "pattern": "^\\d+$", + "type": "string" + }, + "max_cpc_ceiling": { + "description": "The most Google may bid per click", + "exclusiveMinimum": 0, + "maximum": 1000, + "type": "number" + }, + "target_cpa": { + "description": "Target cost per conversion (TARGET_CPA and MAXIMIZE_CONVERSIONS strategies)", + "exclusiveMinimum": 0, + "maximum": 1000, + "type": "number" + }, + "target_roas": { + "description": "Target return on ad spend as a ratio, e.g. 4 = 400% (TARGET_ROAS and MAXIMIZE_CONVERSION_VALUE)", + "exclusiveMinimum": 0, + "maximum": 1000, + "type": "number" + }, + "type": { + "const": "set_shared_bid_strategy", + "type": "string" + } + }, + "required": [ + "type", + "bidding_strategy_id" + ], + "type": "object" + }, + { + "description": "Create a shared (portfolio) bid strategy, optionally moving campaigns onto it. Undo moves those campaigns back and removes it", + "properties": { + "campaign_ids": { + "default": [], + "description": "Campaigns to move onto it in the same step (each leaves its current strategy)", + "items": { + "pattern": "^\\d+$", + "type": "string" + }, + "maxItems": 50, + "type": "array" + }, + "max_cpc_ceiling": { + "description": "The most Google may bid per click", + "exclusiveMinimum": 0, + "maximum": 1000, + "type": "number" + }, + "name": { + "description": "Name for the shared strategy; must not match an existing one", + "maxLength": 255, + "minLength": 1, + "type": "string" + }, + "strategy": { + "enum": [ + "MAXIMIZE_CLICKS", + "MAXIMIZE_CONVERSIONS", + "MAXIMIZE_CONVERSION_VALUE", + "TARGET_CPA", + "TARGET_ROAS" + ], + "type": "string" + }, + "target_cpa": { + "description": "Target cost per conversion: required for TARGET_CPA, optional for MAXIMIZE_CONVERSIONS", + "exclusiveMinimum": 0, + "maximum": 1000, + "type": "number" + }, + "target_roas": { + "description": "Target return on ad spend as a ratio, e.g. 4 = 400%: required for TARGET_ROAS, optional for MAXIMIZE_CONVERSION_VALUE", + "exclusiveMinimum": 0, + "maximum": 1000, + "type": "number" + }, + "type": { + "const": "create_shared_bid_strategy", + "type": "string" + } + }, + "required": [ + "type", + "name", + "strategy" + ], + "type": "object" + }, + { + "description": "Set or clear a campaign's final URL suffix (tracking parameters on every ad click)", + "properties": { + "campaign_id": { + "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "suffix": { + "description": "Query string Google appends to every landing page in the campaign, e.g. \"utm_source=google&utm_medium=cpc&utm_term={keyword}\", or \"none\" to clear it", + "maxLength": 1000, + "type": "string" + }, + "type": { + "const": "set_url_suffix", + "type": "string" + } + }, + "required": [ + "type", + "campaign_id", + "suffix" + ], + "type": "object" + }, + { + "description": "Create a conversion action to measure sign-ups, leads or purchases", + "properties": { + "category": { + "description": "Conversion category, e.g. SIGNUP, PURCHASE, SUBMIT_LEAD_FORM, QUALIFIED_LEAD (see conversion_action.category in run_gaql)", + "pattern": "^[A-Z_]+$", + "type": "string" + }, + "counting": { + "default": "ONE_PER_CLICK", + "description": "ONE_PER_CLICK for sign-ups and leads; MANY_PER_CLICK for purchases", + "enum": [ + "ONE_PER_CLICK", + "MANY_PER_CLICK" + ], + "type": "string" + }, + "default_value": { + "description": "Value per conversion when none is sent", + "maximum": 1000000, + "minimum": 0, + "type": "number" + }, + "name": { + "maxLength": 100, + "minLength": 1, + "type": "string" + }, + "primary": { + "default": true, + "description": "Primary actions count in Conversions and can steer bidding", + "type": "boolean" + }, + "source": { + "default": "UPLOAD_CLICKS", + "description": "UPLOAD_CLICKS: your server uploads ad click ids (no Google tag). WEBPAGE: Google gives you a tag to put on the page", + "enum": [ + "UPLOAD_CLICKS", + "WEBPAGE" + ], + "type": "string" + }, + "type": { + "const": "create_conversion_action", + "type": "string" + } + }, + "required": [ + "type", + "name", + "category" + ], + "type": "object" + }, + { + "description": "Set how many conversions one ad click can produce for a conversion action", + "properties": { + "conversion_action_id": { + "description": "conversion_action.id from run_gaql", + "pattern": "^\\d+$", + "type": "string" + }, + "counting": { + "enum": [ + "ONE_PER_CLICK", + "MANY_PER_CLICK" + ], + "type": "string" + }, + "type": { + "const": "set_conversion_counting", + "type": "string" + } + }, + "required": [ + "type", + "conversion_action_id", + "counting" + ], + "type": "object" + }, + { + "description": "Import a GA4 key event into Google Ads as a conversion action, so campaigns can count and bid on it. The GA4 property must be linked to this account", + "properties": { + "event_name": { + "description": "The GA4 key event, e.g. generate_lead, purchase, sign_up", + "pattern": "^[A-Za-z][A-Za-z0-9_]{0,39}$", + "type": "string" + }, + "primary": { + "default": true, + "description": "Primary actions count in Conversions and can steer bidding", + "type": "boolean" + }, + "property_id": { + "description": "GA4 property id (from analytics_properties)", + "pattern": "^\\d+$", + "type": "string" + }, + "type": { + "const": "import_ga4_key_event", + "type": "string" + } + }, + "required": [ + "type", + "property_id", + "event_name" + ], + "type": "object" + } +] - removed
Input schema / properties / confirm_switchRemoved value: -{ - "description": "Only after the user has agreed to spend their plan's account switch (a call answered \"Account switch:\"). Leave out otherwise", - "type": "boolean" -}
- Changed
run_gaql1 field changed- removed
Input schema / properties / confirm_switchRemoved value: -{ - "description": "Only after the user has agreed to spend their plan's account switch (a call answered \"Account switch:\"). Leave out otherwise", - "type": "boolean" -}
- Added
switch_account
1 tool update
- Removed
gaql_fields
1 tool update
- Changed
keyword_metrics2 fields changed- changed
Input schema / properties / keywords / descriptionPrevious value: -"Keywords to look up"New value: +"Keywords to look up, up to 500" - changed
Input schema / properties / keywords / maxItemsPrevious value: -100New value: +500
6 tool updates
- Changed
account_overview1 field changed- added
Input schema / properties / confirm_switchAdded value: +{ + "description": "Only after the user has agreed to spend their plan's account switch (a call answered \"Account switch:\"). Leave out otherwise", + "type": "boolean" +}
- Changed
keyword_ideas1 field changed- added
Input schema / properties / confirm_switchAdded value: +{ + "description": "Only after the user has agreed to spend their plan's account switch (a call answered \"Account switch:\"). Leave out otherwise", + "type": "boolean" +}
- Changed
keyword_metrics1 field changed- added
Input schema / properties / confirm_switchAdded value: +{ + "description": "Only after the user has agreed to spend their plan's account switch (a call answered \"Account switch:\"). Leave out otherwise", + "type": "boolean" +}
- Changed
paid_organic_overlap1 field changed- added
Input schema / properties / confirm_switchAdded value: +{ + "description": "Only after the user has agreed to spend their plan's account switch (a call answered \"Account switch:\"). Leave out otherwise", + "type": "boolean" +}
- Changed
propose_changes1 field changed- added
Input schema / properties / confirm_switchAdded value: +{ + "description": "Only after the user has agreed to spend their plan's account switch (a call answered \"Account switch:\"). Leave out otherwise", + "type": "boolean" +}
- Changed
run_gaql1 field changed- added
Input schema / properties / confirm_switchAdded value: +{ + "description": "Only after the user has agreed to spend their plan's account switch (a call answered \"Account switch:\"). Leave out otherwise", + "type": "boolean" +}
1 tool update
- Changed
propose_changes2 fields changed- changed
Input schema / properties / changes / descriptionPrevious value: -"Changes to propose; several can go in one proposal"New value: +"Changes to propose; several can go in one proposal, up to 50 (each keyword counts as one)" - added
Input schema / properties / changes / maxItemsAdded value: +50
1 tool update
- Added
gaql_fields
1 tool update
- Changed
propose_changes1 field changed- changed
Input schema / properties / changes / items / oneOfPrevious value: -[ - { - "description": "Block searches containing these words in one campaign", - "properties": { - "campaign_id": { - "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)", - "pattern": "^\\d+$", - "type": "string" - }, - "keywords": { - "items": { - "properties": { - "match_type": { - "description": "PHRASE blocks any search containing the words in order; the usual choice", - "enum": [ - "EXACT", - "PHRASE", - "BROAD" - ], - "type": "string" - }, - "text": { - "description": "The search words to block, e.g. \"free\"", - "maxLength": 80, - "minLength": 1, - "type": "string" - } - }, - "required": [ - "text", - "match_type" - ], - "type": "object" - }, - "maxItems": 50, - "minItems": 1, - "type": "array" - }, - "type": { - "const": "add_negative_keywords", - "type": "string" - } - }, - "required": [ - "type", - "campaign_id", - "keywords" - ], - "type": "object" - }, - { - "description": "Pause one keyword", - "properties": { - "ad_group_id": { - "description": "Ad group id, digits only (ad_group.id from run_gaql)", - "pattern": "^\\d+$", - "type": "string" - }, - "criterion_id": { - "description": "Keyword criterion id, digits only (ad_group_criterion.criterion_id from run_gaql)", - "pattern": "^\\d+$", - "type": "string" - }, - "type": { - "const": "pause_keyword", - "type": "string" - } - }, - "required": [ - "type", - "ad_group_id", - "criterion_id" - ], - "type": "object" - }, - { - "description": "Re-enable one paused keyword", - "properties": { - "ad_group_id": { - "description": "Ad group id, digits only (ad_group.id from run_gaql)", - "pattern": "^\\d+$", - "type": "string" - }, - "criterion_id": { - "description": "Keyword criterion id, digits only (ad_group_criterion.criterion_id from run_gaql)", - "pattern": "^\\d+$", - "type": "string" - }, - "type": { - "const": "enable_keyword", - "type": "string" - } - }, - "required": [ - "type", - "ad_group_id", - "criterion_id" - ], - "type": "object" - }, - { - "description": "Pause a whole campaign (stops all its spend)", - "properties": { - "campaign_id": { - "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)", - "pattern": "^\\d+$", - "type": "string" - }, - "type": { - "const": "pause_campaign", - "type": "string" - } - }, - "required": [ - "type", - "campaign_id" - ], - "type": "object" - }, - { - "description": "Turn a paused campaign back on. It starts spending again; the summary says how much", - "properties": { - "campaign_id": { - "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)", - "pattern": "^\\d+$", - "type": "string" - }, - "type": { - "const": "enable_campaign", - "type": "string" - } - }, - "required": [ - "type", - "campaign_id" - ], - "type": "object" - }, - { - "description": "Pause one ad group", - "properties": { - "ad_group_id": { - "description": "Ad group id, digits only (ad_group.id from run_gaql)", - "pattern": "^\\d+$", - "type": "string" - }, - "type": { - "const": "pause_ad_group", - "type": "string" - } - }, - "required": [ - "type", - "ad_group_id" - ], - "type": "object" - }, - { - "description": "Re-enable one paused ad group", - "properties": { - "ad_group_id": { - "description": "Ad group id, digits only (ad_group.id from run_gaql)", - "pattern": "^\\d+$", - "type": "string" - }, - "type": { - "const": "enable_ad_group", - "type": "string" - } - }, - "required": [ - "type", - "ad_group_id" - ], - "type": "object" - }, - { - "description": "Change a campaign's daily budget (not shared budgets)", - "properties": { - "amount": { - "description": "New average daily budget in the account's currency, e.g. 10 for $10.00/day (not micros)", - "exclusiveMinimum": 0, - "maximum": 1000000, - "type": "number" - }, - "campaign_id": { - "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)", - "pattern": "^\\d+$", - "type": "string" - }, - "type": { - "const": "set_daily_budget", - "type": "string" - } - }, - "required": [ - "type", - "campaign_id", - "amount" - ], - "type": "object" - }, - { - "description": "Set the last day a campaign runs, so it stops spending on its own", - "properties": { - "campaign_id": { - "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)", - "pattern": "^\\d+$", - "type": "string" - }, - "end_date": { - "anyOf": [ - { - "pattern": "^\\d{4}-\\d{2}-\\d{2}$", - "type": "string" - }, - { - "const": "none", - "type": "string" - } - ], - "description": "Last day the campaign runs, YYYY-MM-DD in the account's time zone (it stops after 23:59:59 that day), or \"none\" to remove the end date" - }, - "type": { - "const": "set_end_date", - "type": "string" - } - }, - "required": [ - "type", - "campaign_id", - "end_date" - ], - "type": "object" - }, - { - "description": "Build a new Search campaign with its ad groups, keywords, ads, targeting, negatives and sitelinks, in one step. It is created PAUSED: nothing spends until a separate enable_campaign", - "properties": { - "ad_groups": { - "items": { - "properties": { - "ads": { - "items": { - "description": "A responsive search ad", - "properties": { - "descriptions": { - "description": "2 to 4 descriptions, each at most 90 characters", - "items": { - "maxLength": 90, - "minLength": 1, - "type": "string" - }, - "maxItems": 4, - "minItems": 2, - "type": "array" - }, - "final_url": { - "description": "The landing page", - "maxLength": 2048, - "pattern": "^https?:\\/\\/", - "type": "string" - }, - "headlines": { - "description": "3 to 15 headlines, each at most 30 characters", - "items": { - "maxLength": 30, - "minLength": 1, - "type": "string" - }, - "maxItems": 15, - "minItems": 3, - "type": "array" - }, - "path1": { - "description": "Display path part 1, at most 15 characters", - "maxLength": 15, - "minLength": 1, - "type": "string" - }, - "path2": { - "description": "Display path part 2, at most 15 characters", - "maxLength": 15, - "minLength": 1, - "type": "string" - } - }, - "required": [ - "headlines", - "descriptions", - "final_url" - ], - "type": "object" - }, - "maxItems": 3, - "minItems": 1, - "type": "array" - }, - "default_max_cpc": { - "description": "Default max cost per click for the ad group (required when the campaign uses manual CPC)", - "exclusiveMinimum": 0, - "maximum": 1000, - "type": "number" - }, - "keywords": { - "items": { - "properties": { - "match_type": { - "description": "PHRASE matches searches containing the words in order; the usual choice", - "enum": [ - "EXACT", - "PHRASE", - "BROAD" - ], - "type": "string" - }, - "max_cpc": { - "description": "Max cost per click for this keyword in the account's currency (manual CPC only); omit to use the ad group's", - "exclusiveMinimum": 0, - "maximum": 1000, - "type": "number" - }, - "text": { - "description": "The keyword, e.g. \"cleaning invoice template\"", - "maxLength": 80, - "minLength": 1, - "type": "string" - } - }, - "required": [ - "text", - "match_type" - ], - "type": "object" - }, - "maxItems": 50, - "minItems": 1, - "type": "array" - }, - "name": { - "maxLength": 255, - "minLength": 1, - "type": "string" - } - }, - "required": [ - "name", - "keywords", - "ads" - ], - "type": "object" - }, - "maxItems": 10, - "minItems": 1, - "type": "array" - }, - "bidding": { - "default": "MANUAL_CPC", - "description": "MANUAL_CPC uses the ad group and keyword max CPCs; MAXIMIZE_CLICKS and MAXIMIZE_CONVERSIONS let Google bid within the budget", - "enum": [ - "MANUAL_CPC", - "MAXIMIZE_CLICKS", - "MAXIMIZE_CONVERSIONS" - ], - "type": "string" - }, - "daily_budget": { - "description": "Average daily budget in the account's currency, e.g. 20 for $20.00/day", - "exclusiveMinimum": 0, - "maximum": 1000000, - "type": "number" - }, - "end_date": { - "description": "Last day the campaign runs, YYYY-MM-DD", - "pattern": "^\\d{4}-\\d{2}-\\d{2}$", - "type": "string" - }, - "language_ids": { - "default": [ - "1000" - ], - "description": "Google language ids, e.g. 1000 English, 1003 Spanish", - "items": { - "pattern": "^\\d+$", - "type": "string" - }, - "maxItems": 20, - "minItems": 1, - "type": "array" - }, - "location_ids": { - "default": [ - "2840" - ], - "description": "Google geo target ids, e.g. 2840 United States, 2826 United Kingdom, 2124 Canada (look others up in geo_target_constant)", - "items": { - "pattern": "^\\d+$", - "type": "string" - }, - "maxItems": 50, - "minItems": 1, - "type": "array" - }, - "max_cpc_ceiling": { - "description": "MAXIMIZE_CLICKS only: the most Google may bid per click", - "exclusiveMinimum": 0, - "maximum": 1000, - "type": "number" - }, - "name": { - "description": "Campaign name; must not match an existing campaign", - "maxLength": 255, - "minLength": 1, - "type": "string" - }, - "negative_keywords": { - "default": [], - "description": "Searches to block across the campaign", - "items": { - "properties": { - "match_type": { - "enum": [ - "EXACT", - "PHRASE", - "BROAD" - ], - "type": "string" - }, - "text": { - "maxLength": 80, - "minLength": 1, - "type": "string" - } - }, - "required": [ - "text", - "match_type" - ], - "type": "object" - }, - "maxItems": 200, - "type": "array" - }, - "presence_only": { - "default": true, - "description": "Show ads only to people IN the locations (true), not merely interested in them", - "type": "boolean" - }, - "search_partners": { - "default": false, - "description": "Also show on Google's search partner sites", - "type": "boolean" - }, - "sitelinks": { - "default": [], - "items": { - "properties": { - "description1": { - "description": "At most 35 characters; give both descriptions or neither", - "maxLength": 35, - "minLength": 1, - "type": "string" - }, - "description2": { - "maxLength": 35, - "minLength": 1, - "type": "string" - }, - "text": { - "description": "Link text, at most 25 characters", - "maxLength": 25, - "minLength": 1, - "type": "string" - }, - "url": { - "maxLength": 2048, - "pattern": "^https?:\\/\\/", - "type": "string" - } - }, - "required": [ - "text", - "url" - ], - "type": "object" - }, - "maxItems": 8, - "type": "array" - }, - "type": { - "const": "create_campaign", - "type": "string" - } - }, - "required": [ - "type", - "name", - "daily_budget", - "ad_groups" - ], - "type": "object" - }, - { - "description": "Build a new Display campaign (image ads across Google's Display Network of sites and apps) with ad groups and responsive display ads. Google's optimized targeting finds the audience. It is created PAUSED: nothing spends until a separate enable_campaign", - "properties": { - "ad_groups": { - "items": { - "properties": { - "ads": { - "items": { - "description": "A responsive display ad: Google assembles ads from these headlines, descriptions and images", - "properties": { - "business_name": { - "description": "The advertiser's name, at most 25 characters", - "maxLength": 25, - "minLength": 1, - "type": "string" - }, - "descriptions": { - "description": "1 to 5 descriptions, each at most 90 characters", - "items": { - "maxLength": 90, - "minLength": 1, - "type": "string" - }, - "maxItems": 5, - "minItems": 1, - "type": "array" - }, - "final_url": { - "description": "The landing page", - "maxLength": 2048, - "pattern": "^https?:\\/\\/", - "type": "string" - }, - "headlines": { - "description": "1 to 5 short headlines, each at most 30 characters", - "items": { - "maxLength": 30, - "minLength": 1, - "type": "string" - }, - "maxItems": 5, - "minItems": 1, - "type": "array" - }, - "logo_images": { - "default": [], - "description": "0 to 5 landscape logos, 4:1 (e.g. 1200×300, at least 512×128)", - "items": { - "description": "An https URL of a PNG, JPEG or GIF (at most 5120 KB), or the id of an image asset already in the account (asset.id from run_gaql WHERE asset.type = 'IMAGE')", - "maxLength": 2048, - "minLength": 1, - "type": "string" - }, - "maxItems": 5, - "minItems": 0, - "type": "array" - }, - "long_headline": { - "description": "One long headline, at most 90 characters", - "maxLength": 90, - "minLength": 1, - "type": "string" - }, - "marketing_images": { - "description": "1 to 15 landscape images, 1.91:1 (e.g. 1200×628, at least 600×314)", - "items": { - "description": "An https URL of a PNG, JPEG or GIF (at most 5120 KB), or the id of an image asset already in the account (asset.id from run_gaql WHERE asset.type = 'IMAGE')", - "maxLength": 2048, - "minLength": 1, - "type": "string" - }, - "maxItems": 15, - "minItems": 1, - "type": "array" - }, - "square_logo_images": { - "default": [], - "description": "0 to 5 square logos, 1:1 (e.g. 1200×1200, at least 128×128)", - "items": { - "description": "An https URL of a PNG, JPEG or GIF (at most 5120 KB), or the id of an image asset already in the account (asset.id from run_gaql WHERE asset.type = 'IMAGE')", - "maxLength": 2048, - "minLength": 1, - "type": "string" - }, - "maxItems": 5, - "minItems": 0, - "type": "array" - }, - "square_marketing_images": { - "description": "1 to 15 square images, 1:1 (e.g. 1200×1200, at least 300×300)", - "items": { - "description": "An https URL of a PNG, JPEG or GIF (at most 5120 KB), or the id of an image asset already in the account (asset.id from run_gaql WHERE asset.type = 'IMAGE')", - "maxLength": 2048, - "minLength": 1, - "type": "string" - }, - "maxItems": 15, - "minItems": 1, - "type": "array" - } - }, - "required": [ - "headlines", - "long_headline", - "descriptions", - "business_name", - "final_url", - "marketing_images", - "square_marketing_images" - ], - "type": "object" - }, - "maxItems": 3, - "minItems": 1, - "type": "array" - }, - "default_max_cpc": { - "description": "Default max cost per click (required when the campaign uses manual CPC)", - "exclusiveMinimum": 0, - "maximum": 1000, - "type": "number" - }, - "name": { - "maxLength": 255, - "minLength": 1, - "type": "string" - } - }, - "required": [ - "name", - "ads" - ], - "type": "object" - }, - "maxItems": 5, - "minItems": 1, - "type": "array" - }, - "bidding": { - "default": "MAXIMIZE_CLICKS", - "description": "MANUAL_CPC uses the ad groups' max CPCs; MAXIMIZE_CLICKS and MAXIMIZE_CONVERSIONS let Google bid within the budget", - "enum": [ - "MANUAL_CPC", - "MAXIMIZE_CLICKS", - "MAXIMIZE_CONVERSIONS" - ], - "type": "string" - }, - "daily_budget": { - "description": "Average daily budget in the account's currency, e.g. 20 for $20.00/day", - "exclusiveMinimum": 0, - "maximum": 1000000, - "type": "number" - }, - "end_date": { - "description": "Last day the campaign runs, YYYY-MM-DD", - "pattern": "^\\d{4}-\\d{2}-\\d{2}$", - "type": "string" - }, - "language_ids": { - "default": [ - "1000" - ], - "description": "Google language ids, e.g. 1000 English", - "items": { - "pattern": "^\\d+$", - "type": "string" - }, - "maxItems": 20, - "minItems": 1, - "type": "array" - }, - "location_ids": { - "default": [ - "2840" - ], - "description": "Google geo target ids, e.g. 2840 United States", - "items": { - "pattern": "^\\d+$", - "type": "string" - }, - "maxItems": 50, - "minItems": 1, - "type": "array" - }, - "max_cpc_ceiling": { - "description": "MAXIMIZE_CLICKS only: the most Google may bid per click", - "exclusiveMinimum": 0, - "maximum": 1000, - "type": "number" - }, - "name": { - "description": "Campaign name; must not match an existing campaign", - "maxLength": 255, - "minLength": 1, - "type": "string" - }, - "presence_only": { - "default": true, - "description": "Show ads only to people IN the locations (true), not merely interested in them", - "type": "boolean" - }, - "type": { - "const": "create_display_campaign", - "type": "string" - } - }, - "required": [ - "type", - "name", - "daily_budget", - "ad_groups" - ], - "type": "object" - }, - { - "description": "Build a new Demand Gen campaign with YouTube video ads, which is how to advertise on YouTube through the API (Google doesn't allow creating Video campaigns there). It is created PAUSED: nothing spends until a separate enable_campaign", - "properties": { - "ad_groups": { - "items": { - "properties": { - "ads": { - "items": { - "description": "A Demand Gen video ad: runs on YouTube (in-stream, in-feed and Shorts), Discover and Gmail", - "properties": { - "business_name": { - "description": "The advertiser's name, at most 25 characters", - "maxLength": 25, - "minLength": 1, - "type": "string" - }, - "descriptions": { - "description": "1 to 5 descriptions, each at most 90 characters", - "items": { - "maxLength": 90, - "minLength": 1, - "type": "string" - }, - "maxItems": 5, - "minItems": 1, - "type": "array" - }, - "final_url": { - "description": "The landing page", - "maxLength": 2048, - "pattern": "^https?:\\/\\/", - "type": "string" - }, - "headlines": { - "description": "1 to 5 headlines, each at most 40 characters", - "items": { - "maxLength": 40, - "minLength": 1, - "type": "string" - }, - "maxItems": 5, - "minItems": 1, - "type": "array" - }, - "logo_image": { - "description": "A square 1:1 logo (e.g. 1200×1200, at least 128×128): an https URL, or an image asset id from the account", - "maxLength": 2048, - "minLength": 1, - "type": "string" - }, - "long_headlines": { - "description": "1 to 5 long headlines, each at most 90 characters", - "items": { - "maxLength": 90, - "minLength": 1, - "type": "string" - }, - "maxItems": 5, - "minItems": 1, - "type": "array" - }, - "videos": { - "description": "1 to 5 YouTube videos", - "items": { - "description": "A YouTube video id (e.g. dQw4w9WgXcQ) or its youtube.com / youtu.be URL. The video must be public or unlisted", - "maxLength": 200, - "minLength": 1, - "type": "string" - }, - "maxItems": 5, - "minItems": 1, - "type": "array" - } - }, - "required": [ - "videos", - "headlines", - "long_headlines", - "descriptions", - "business_name", - "logo_image", - "final_url" - ], - "type": "object" - }, - "maxItems": 3, - "minItems": 1, - "type": "array" - }, - "language_ids": { - "default": [ - "1000" - ], - "description": "Google language ids, e.g. 1000 English", - "items": { - "pattern": "^\\d+$", - "type": "string" - }, - "maxItems": 20, - "minItems": 1, - "type": "array" - }, - "location_ids": { - "default": [ - "2840" - ], - "description": "Google geo target ids, e.g. 2840 United States (Demand Gen targets locations per ad group, not per campaign)", - "items": { - "pattern": "^\\d+$", - "type": "string" - }, - "maxItems": 50, - "minItems": 1, - "type": "array" - }, - "name": { - "maxLength": 255, - "minLength": 1, - "type": "string" - } - }, - "required": [ - "name", - "ads" - ], - "type": "object" - }, - "maxItems": 5, - "minItems": 1, - "type": "array" - }, - "bidding": { - "default": "MAXIMIZE_CONVERSIONS", - "description": "Demand Gen bids automatically: MAXIMIZE_CONVERSIONS (needs conversion tracking) or MAXIMIZE_CLICKS", - "enum": [ - "MAXIMIZE_CONVERSIONS", - "MAXIMIZE_CLICKS" - ], - "type": "string" - }, - "daily_budget": { - "description": "Average daily budget in the account's currency, e.g. 20 for $20.00/day", - "exclusiveMinimum": 0, - "maximum": 1000000, - "type": "number" - }, - "end_date": { - "description": "Last day the campaign runs, YYYY-MM-DD", - "pattern": "^\\d{4}-\\d{2}-\\d{2}$", - "type": "string" - }, - "name": { - "description": "Campaign name; must not match an existing campaign", - "maxLength": 255, - "minLength": 1, - "type": "string" - }, - "type": { - "const": "create_demand_gen_campaign", - "type": "string" - } - }, - "required": [ - "type", - "name", - "daily_budget", - "ad_groups" - ], - "type": "object" - }, - { - "description": "Build a new Performance Max campaign: one budget, Google places ads across Search, YouTube, Display, Discover, Gmail and Maps from the asset groups' text, images and videos. No shopping feed (non-retail). It is created PAUSED: nothing spends until a separate enable_campaign", - "properties": { - "asset_groups": { - "items": { - "description": "An asset group: the headlines, descriptions, images and videos Google combines into ads on every channel", - "properties": { - "descriptions": { - "description": "2 to 5 descriptions, each at most 90 characters; Google recommends one of 60 or fewer", - "items": { - "maxLength": 90, - "minLength": 1, - "type": "string" - }, - "maxItems": 5, - "minItems": 2, - "type": "array" - }, - "final_url": { - "description": "The landing page (Google may also send people to other pages on the same site)", - "maxLength": 2048, - "pattern": "^https?:\\/\\/", - "type": "string" - }, - "headlines": { - "description": "3 to 15 headlines, each at most 30 characters", - "items": { - "maxLength": 30, - "minLength": 1, - "type": "string" - }, - "maxItems": 15, - "minItems": 3, - "type": "array" - }, - "long_headlines": { - "description": "1 to 5 long headlines, each at most 90 characters", - "items": { - "maxLength": 90, - "minLength": 1, - "type": "string" - }, - "maxItems": 5, - "minItems": 1, - "type": "array" - }, - "marketing_images": { - "description": "1 to 20 landscape images, 1.91:1 (e.g. 1200×628)", - "items": { - "description": "An https URL of a PNG, JPEG or GIF (at most 5120 KB), or the id of an image asset already in the account (asset.id from run_gaql WHERE asset.type = 'IMAGE')", - "maxLength": 2048, - "minLength": 1, - "type": "string" - }, - "maxItems": 20, - "minItems": 1, - "type": "array" - }, - "name": { - "maxLength": 255, - "minLength": 1, - "type": "string" - }, - "portrait_marketing_images": { - "default": [], - "description": "0 to 20 portrait images, 4:5 (e.g. 960×1200)", - "items": { - "description": "An https URL of a PNG, JPEG or GIF (at most 5120 KB), or the id of an image asset already in the account (asset.id from run_gaql WHERE asset.type = 'IMAGE')", - "maxLength": 2048, - "minLength": 1, - "type": "string" - }, - "maxItems": 20, - "minItems": 0, - "type": "array" - }, - "square_marketing_images": { - "description": "1 to 20 square images, 1:1 (e.g. 1200×1200)", - "items": { - "description": "An https URL of a PNG, JPEG or GIF (at most 5120 KB), or the id of an image asset already in the account (asset.id from run_gaql WHERE asset.type = 'IMAGE')", - "maxLength": 2048, - "minLength": 1, - "type": "string" - }, - "maxItems": 20, - "minItems": 1, - "type": "array" - }, - "videos": { - "default": [], - "description": "0 to 5 YouTube videos; without one, Google may auto-generate a video from the images", - "items": { - "description": "A YouTube video id (e.g. dQw4w9WgXcQ) or its youtube.com / youtu.be URL. The video must be public or unlisted", - "maxLength": 200, - "minLength": 1, - "type": "string" - }, - "maxItems": 5, - "type": "array" - } - }, - "required": [ - "name", - "final_url", - "headlines", - "long_headlines", - "descriptions", - "marketing_images", - "square_marketing_images" - ], - "type": "object" - }, - "maxItems": 5, - "minItems": 1, - "type": "array" - }, - "bidding": { - "default": "MAXIMIZE_CONVERSIONS", - "description": "Performance Max bids for conversions only: MAXIMIZE_CONVERSIONS, or MAXIMIZE_CONVERSION_VALUE when conversions carry values", - "enum": [ - "MAXIMIZE_CONVERSIONS", - "MAXIMIZE_CONVERSION_VALUE" - ], - "type": "string" - }, - "business_name": { - "description": "The advertiser's name, at most 25 characters (linked to the campaign, per Google's brand guidelines)", - "maxLength": 25, - "minLength": 1, - "type": "string" - }, - "daily_budget": { - "description": "Average daily budget in the account's currency, e.g. 20 for $20.00/day", - "exclusiveMinimum": 0, - "maximum": 1000000, - "type": "number" - }, - "end_date": { - "description": "Last day the campaign runs, YYYY-MM-DD", - "pattern": "^\\d{4}-\\d{2}-\\d{2}$", - "type": "string" - }, - "language_ids": { - "default": [ - "1000" - ], - "description": "Google language ids, e.g. 1000 English", - "items": { - "pattern": "^\\d+$", - "type": "string" - }, - "maxItems": 20, - "minItems": 1, - "type": "array" - }, - "location_ids": { - "default": [ - "2840" - ], - "description": "Google geo target ids, e.g. 2840 United States", - "items": { - "pattern": "^\\d+$", - "type": "string" - }, - "maxItems": 50, - "minItems": 1, - "type": "array" - }, - "logo_images": { - "description": "1 to 5 square logos, 1:1 (e.g. 1200×1200, at least 128×128), linked to the campaign", - "items": { - "description": "An https URL of a PNG, JPEG or GIF (at most 5120 KB), or the id of an image asset already in the account (asset.id from run_gaql WHERE asset.type = 'IMAGE')", - "maxLength": 2048, - "minLength": 1, - "type": "string" - }, - "maxItems": 5, - "minItems": 1, - "type": "array" - }, - "name": { - "description": "Campaign name; must not match an existing campaign", - "maxLength": 255, - "minLength": 1, - "type": "string" - }, - "target_cpa": { - "description": "MAXIMIZE_CONVERSIONS only: target cost per conversion", - "exclusiveMinimum": 0, - "maximum": 1000, - "type": "number" - }, - "type": { - "const": "create_performance_max_campaign", - "type": "string" - } - }, - "required": [ - "type", - "name", - "daily_budget", - "business_name", - "logo_images", - "asset_groups" - ], - "type": "object" - }, - { - "description": "Add an ad group, with its keywords and ads, to an existing Search campaign", - "properties": { - "ad_group": { - "properties": { - "ads": { - "items": { - "description": "A responsive search ad", - "properties": { - "descriptions": { - "description": "2 to 4 descriptions, each at most 90 characters", - "items": { - "maxLength": 90, - "minLength": 1, - "type": "string" - }, - "maxItems": 4, - "minItems": 2, - "type": "array" - }, - "final_url": { - "description": "The landing page", - "maxLength": 2048, - "pattern": "^https?:\\/\\/", - "type": "string" - }, - "headlines": { - "description": "3 to 15 headlines, each at most 30 characters", - "items": { - "maxLength": 30, - "minLength": 1, - "type": "string" - }, - "maxItems": 15, - "minItems": 3, - "type": "array" - }, - "path1": { - "description": "Display path part 1, at most 15 characters", - "maxLength": 15, - "minLength": 1, - "type": "string" - }, - "path2": { - "description": "Display path part 2, at most 15 characters", - "maxLength": 15, - "minLength": 1, - "type": "string" - } - }, - "required": [ - "headlines", - "descriptions", - "final_url" - ], - "type": "object" - }, - "maxItems": 3, - "minItems": 1, - "type": "array" - }, - "default_max_cpc": { - "description": "Default max cost per click for the ad group (required when the campaign uses manual CPC)", - "exclusiveMinimum": 0, - "maximum": 1000, - "type": "number" - }, - "keywords": { - "items": { - "properties": { - "match_type": { - "description": "PHRASE matches searches containing the words in order; the usual choice", - "enum": [ - "EXACT", - "PHRASE", - "BROAD" - ], - "type": "string" - }, - "max_cpc": { - "description": "Max cost per click for this keyword in the account's currency (manual CPC only); omit to use the ad group's", - "exclusiveMinimum": 0, - "maximum": 1000, - "type": "number" - }, - "text": { - "description": "The keyword, e.g. \"cleaning invoice template\"", - "maxLength": 80, - "minLength": 1, - "type": "string" - } - }, - "required": [ - "text", - "match_type" - ], - "type": "object" - }, - "maxItems": 50, - "minItems": 1, - "type": "array" - }, - "name": { - "maxLength": 255, - "minLength": 1, - "type": "string" - } - }, - "required": [ - "name", - "keywords", - "ads" - ], - "type": "object" - }, - "campaign_id": { - "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)", - "pattern": "^\\d+$", - "type": "string" - }, - "type": { - "const": "add_ad_group", - "type": "string" - } - }, - "required": [ - "type", - "campaign_id", - "ad_group" - ], - "type": "object" - }, - { - "description": "Add keywords to an existing ad group", - "properties": { - "ad_group_id": { - "description": "Ad group id, digits only (ad_group.id from run_gaql)", - "pattern": "^\\d+$", - "type": "string" - }, - "keywords": { - "items": { - "properties": { - "match_type": { - "description": "PHRASE matches searches containing the words in order; the usual choice", - "enum": [ - "EXACT", - "PHRASE", - "BROAD" - ], - "type": "string" - }, - "max_cpc": { - "description": "Max cost per click for this keyword in the account's currency (manual CPC only); omit to use the ad group's", - "exclusiveMinimum": 0, - "maximum": 1000, - "type": "number" - }, - "text": { - "description": "The keyword, e.g. \"cleaning invoice template\"", - "maxLength": 80, - "minLength": 1, - "type": "string" - } - }, - "required": [ - "text", - "match_type" - ], - "type": "object" - }, - "maxItems": 50, - "minItems": 1, - "type": "array" - }, - "type": { - "const": "add_keywords", - "type": "string" - } - }, - "required": [ - "type", - "ad_group_id", - "keywords" - ], - "type": "object" - }, - { - "description": "Add a responsive search ad to an existing ad group", - "properties": { - "ad": { - "description": "A responsive search ad", - "properties": { - "descriptions": { - "description": "2 to 4 descriptions, each at most 90 characters", - "items": { - "maxLength": 90, - "minLength": 1, - "type": "string" - }, - "maxItems": 4, - "minItems": 2, - "type": "array" - }, - "final_url": { - "description": "The landing page", - "maxLength": 2048, - "pattern": "^https?:\\/\\/", - "type": "string" - }, - "headlines": { - "description": "3 to 15 headlines, each at most 30 characters", - "items": { - "maxLength": 30, - "minLength": 1, - "type": "string" - }, - "maxItems": 15, - "minItems": 3, - "type": "array" - }, - "path1": { - "description": "Display path part 1, at most 15 characters", - "maxLength": 15, - "minLength": 1, - "type": "string" - }, - "path2": { - "description": "Display path part 2, at most 15 characters", - "maxLength": 15, - "minLength": 1, - "type": "string" - } - }, - "required": [ - "headlines", - "descriptions", - "final_url" - ], - "type": "object" - }, - "ad_group_id": { - "description": "Ad group id, digits only (ad_group.id from run_gaql)", - "pattern": "^\\d+$", - "type": "string" - }, - "type": { - "const": "add_responsive_search_ad", - "type": "string" - } - }, - "required": [ - "type", - "ad_group_id", - "ad" - ], - "type": "object" - }, - { - "description": "Add sitelinks to a campaign", - "properties": { - "campaign_id": { - "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)", - "pattern": "^\\d+$", - "type": "string" - }, - "sitelinks": { - "items": { - "properties": { - "description1": { - "description": "At most 35 characters; give both descriptions or neither", - "maxLength": 35, - "minLength": 1, - "type": "string" - }, - "description2": { - "maxLength": 35, - "minLength": 1, - "type": "string" - }, - "text": { - "description": "Link text, at most 25 characters", - "maxLength": 25, - "minLength": 1, - "type": "string" - }, - "url": { - "maxLength": 2048, - "pattern": "^https?:\\/\\/", - "type": "string" - } - }, - "required": [ - "text", - "url" - ], - "type": "object" - }, - "maxItems": 8, - "minItems": 1, - "type": "array" - }, - "type": { - "const": "add_sitelinks", - "type": "string" - } - }, - "required": [ - "type", - "campaign_id", - "sitelinks" - ], - "type": "object" - }, - { - "description": "Make a campaign count and bid on ONE conversion category only (e.g. SIGNUP), so another product's or step's conversions don't steer it", - "properties": { - "campaign_id": { - "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)", - "pattern": "^\\d+$", - "type": "string" - }, - "category": { - "description": "Conversion category, e.g. SIGNUP, PURCHASE, SUBMIT_LEAD_FORM, QUALIFIED_LEAD (see conversion_action.category in run_gaql)", - "pattern": "^[A-Z_]+$", - "type": "string" - }, - "type": { - "const": "set_conversion_goal", - "type": "string" - } - }, - "required": [ - "type", - "campaign_id", - "category" - ], - "type": "object" - }, - { - "description": "Change one keyword's max CPC (manual CPC campaigns)", - "properties": { - "ad_group_id": { - "description": "Ad group id, digits only (ad_group.id from run_gaql)", - "pattern": "^\\d+$", - "type": "string" - }, - "criterion_id": { - "description": "Keyword criterion id, digits only (ad_group_criterion.criterion_id from run_gaql)", - "pattern": "^\\d+$", - "type": "string" - }, - "max_cpc": { - "anyOf": [ - { - "exclusiveMinimum": 0, - "maximum": 1000, - "type": "number" - }, - { - "type": "null" - } - ], - "description": "New max cost per click for this keyword, or null to clear it so the keyword uses the ad group's bid" - }, - "type": { - "const": "set_keyword_bid", - "type": "string" - } - }, - "required": [ - "type", - "ad_group_id", - "criterion_id", - "max_cpc" - ], - "type": "object" - }, - { - "description": "Change an ad group's default max CPC, which its keywords use unless they have their own", - "properties": { - "ad_group_id": { - "description": "Ad group id, digits only (ad_group.id from run_gaql)", - "pattern": "^\\d+$", - "type": "string" - }, - "max_cpc": { - "description": "New default max cost per click for the ad group", - "exclusiveMinimum": 0, - "maximum": 1000, - "type": "number" - }, - "type": { - "const": "set_ad_group_bid", - "type": "string" - } - }, - "required": [ - "type", - "ad_group_id", - "max_cpc" - ], - "type": "object" - }, - { - "description": "Pause one ad", - "properties": { - "ad_group_id": { - "description": "Ad group id, digits only (ad_group.id from run_gaql)", - "pattern": "^\\d+$", - "type": "string" - }, - "ad_id": { - "description": "Ad id, digits only (ad_group_ad.ad.id from run_gaql)", - "pattern": "^\\d+$", - "type": "string" - }, - "type": { - "const": "pause_ad", - "type": "string" - } - }, - "required": [ - "type", - "ad_group_id", - "ad_id" - ], - "type": "object" - }, - { - "description": "Re-enable one paused ad", - "properties": { - "ad_group_id": { - "description": "Ad group id, digits only (ad_group.id from run_gaql)", - "pattern": "^\\d+$", - "type": "string" - }, - "ad_id": { - "description": "Ad id, digits only (ad_group_ad.ad.id from run_gaql)", - "pattern": "^\\d+$", - "type": "string" - }, - "type": { - "const": "enable_ad", - "type": "string" - } - }, - "required": [ - "type", - "ad_group_id", - "ad_id" - ], - "type": "object" - }, - { - "description": "Add locations and/or languages a campaign targets", - "properties": { - "campaign_id": { - "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)", - "pattern": "^\\d+$", - "type": "string" - }, - "language_ids": { - "default": [], - "description": "Language ids to add, e.g. 1000 English", - "items": { - "pattern": "^\\d+$", - "type": "string" - }, - "maxItems": 20, - "type": "array" - }, - "location_ids": { - "default": [], - "description": "Geo target ids to add, e.g. 2840 United States", - "items": { - "pattern": "^\\d+$", - "type": "string" - }, - "maxItems": 50, - "type": "array" - }, - "type": { - "const": "add_campaign_targeting", - "type": "string" - } - }, - "required": [ - "type", - "campaign_id" - ], - "type": "object" - }, - { - "description": "Stop targeting some of a campaign's locations and/or languages", - "properties": { - "campaign_id": { - "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)", - "pattern": "^\\d+$", - "type": "string" - }, - "language_ids": { - "default": [], - "items": { - "pattern": "^\\d+$", - "type": "string" - }, - "maxItems": 20, - "type": "array" - }, - "location_ids": { - "default": [], - "items": { - "pattern": "^\\d+$", - "type": "string" - }, - "maxItems": 50, - "type": "array" - }, - "type": { - "const": "remove_campaign_targeting", - "type": "string" - } - }, - "required": [ - "type", - "campaign_id" - ], - "type": "object" - }, - { - "description": "Choose whether a campaign shows to people in its locations only, or also to people interested in them", - "properties": { - "campaign_id": { - "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)", - "pattern": "^\\d+$", - "type": "string" - }, - "presence_only": { - "description": "true: only people IN the locations; false: also people interested in them", - "type": "boolean" - }, - "type": { - "const": "set_location_mode", - "type": "string" - } - }, - "required": [ - "type", - "campaign_id", - "presence_only" - ], - "type": "object" - }, - { - "description": "Switch a campaign's bid strategy. Google re-learns after a switch, so performance can wobble for a week or two", - "properties": { - "campaign_id": { - "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)", - "pattern": "^\\d+$", - "type": "string" - }, - "max_cpc_ceiling": { - "description": "MAXIMIZE_CLICKS only: the most Google may bid per click", - "exclusiveMinimum": 0, - "maximum": 1000, - "type": "number" - }, - "strategy": { - "enum": [ - "MANUAL_CPC", - "MAXIMIZE_CLICKS", - "MAXIMIZE_CONVERSIONS" - ], - "type": "string" - }, - "target_cpa": { - "description": "MAXIMIZE_CONVERSIONS only: target cost per conversion", - "exclusiveMinimum": 0, - "maximum": 1000, - "type": "number" - }, - "type": { - "const": "set_bidding_strategy", - "type": "string" - } - }, - "required": [ - "type", - "campaign_id", - "strategy" - ], - "type": "object" - }, - { - "description": "Set or clear a campaign's final URL suffix (tracking parameters on every ad click)", - "properties": { - "campaign_id": { - "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)", - "pattern": "^\\d+$", - "type": "string" - }, - "suffix": { - "description": "Query string Google appends to every landing page in the campaign, e.g. \"utm_source=google&utm_medium=cpc&utm_term={keyword}\", or \"none\" to clear it", - "maxLength": 1000, - "type": "string" - }, - "type": { - "const": "set_url_suffix", - "type": "string" - } - }, - "required": [ - "type", - "campaign_id", - "suffix" - ], - "type": "object" - }, - { - "description": "Create a conversion action to measure sign-ups, leads or purchases", - "properties": { - "category": { - "description": "Conversion category, e.g. SIGNUP, PURCHASE, SUBMIT_LEAD_FORM, QUALIFIED_LEAD (see conversion_action.category in run_gaql)", - "pattern": "^[A-Z_]+$", - "type": "string" - }, - "counting": { - "default": "ONE_PER_CLICK", - "description": "ONE_PER_CLICK for sign-ups and leads; MANY_PER_CLICK for purchases", - "enum": [ - "ONE_PER_CLICK", - "MANY_PER_CLICK" - ], - "type": "string" - }, - "default_value": { - "description": "Value per conversion when none is sent", - "maximum": 1000000, - "minimum": 0, - "type": "number" - }, - "name": { - "maxLength": 100, - "minLength": 1, - "type": "string" - }, - "primary": { - "default": true, - "description": "Primary actions count in Conversions and can steer bidding", - "type": "boolean" - }, - "source": { - "default": "UPLOAD_CLICKS", - "description": "UPLOAD_CLICKS: your server uploads ad click ids (no Google tag). WEBPAGE: Google gives you a tag to put on the page", - "enum": [ - "UPLOAD_CLICKS", - "WEBPAGE" - ], - "type": "string" - }, - "type": { - "const": "create_conversion_action", - "type": "string" - } - }, - "required": [ - "type", - "name", - "category" - ], - "type": "object" - }, - { - "description": "Set how many conversions one ad click can produce for a conversion action", - "properties": { - "conversion_action_id": { - "description": "conversion_action.id from run_gaql", - "pattern": "^\\d+$", - "type": "string" - }, - "counting": { - "enum": [ - "ONE_PER_CLICK", - "MANY_PER_CLICK" - ], - "type": "string" - }, - "type": { - "const": "set_conversion_counting", - "type": "string" - } - }, - "required": [ - "type", - "conversion_action_id", - "counting" - ], - "type": "object" - } -]New value: +[ + { + "description": "Block searches containing these words in one campaign", + "properties": { + "campaign_id": { + "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "keywords": { + "items": { + "properties": { + "match_type": { + "description": "PHRASE blocks any search containing the words in order; the usual choice", + "enum": [ + "EXACT", + "PHRASE", + "BROAD" + ], + "type": "string" + }, + "text": { + "description": "The search words to block, e.g. \"free\"", + "maxLength": 80, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "text", + "match_type" + ], + "type": "object" + }, + "maxItems": 50, + "minItems": 1, + "type": "array" + }, + "type": { + "const": "add_negative_keywords", + "type": "string" + } + }, + "required": [ + "type", + "campaign_id", + "keywords" + ], + "type": "object" + }, + { + "description": "Pause one keyword", + "properties": { + "ad_group_id": { + "description": "Ad group id, digits only (ad_group.id from run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "criterion_id": { + "description": "Keyword criterion id, digits only (ad_group_criterion.criterion_id from run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "type": { + "const": "pause_keyword", + "type": "string" + } + }, + "required": [ + "type", + "ad_group_id", + "criterion_id" + ], + "type": "object" + }, + { + "description": "Re-enable one paused keyword", + "properties": { + "ad_group_id": { + "description": "Ad group id, digits only (ad_group.id from run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "criterion_id": { + "description": "Keyword criterion id, digits only (ad_group_criterion.criterion_id from run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "type": { + "const": "enable_keyword", + "type": "string" + } + }, + "required": [ + "type", + "ad_group_id", + "criterion_id" + ], + "type": "object" + }, + { + "description": "Pause a whole campaign (stops all its spend)", + "properties": { + "campaign_id": { + "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "type": { + "const": "pause_campaign", + "type": "string" + } + }, + "required": [ + "type", + "campaign_id" + ], + "type": "object" + }, + { + "description": "Turn a paused campaign back on. It starts spending again; the summary says how much", + "properties": { + "campaign_id": { + "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "type": { + "const": "enable_campaign", + "type": "string" + } + }, + "required": [ + "type", + "campaign_id" + ], + "type": "object" + }, + { + "description": "Pause one ad group", + "properties": { + "ad_group_id": { + "description": "Ad group id, digits only (ad_group.id from run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "type": { + "const": "pause_ad_group", + "type": "string" + } + }, + "required": [ + "type", + "ad_group_id" + ], + "type": "object" + }, + { + "description": "Re-enable one paused ad group", + "properties": { + "ad_group_id": { + "description": "Ad group id, digits only (ad_group.id from run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "type": { + "const": "enable_ad_group", + "type": "string" + } + }, + "required": [ + "type", + "ad_group_id" + ], + "type": "object" + }, + { + "description": "Change a campaign's daily budget (not shared budgets)", + "properties": { + "amount": { + "description": "New average daily budget in the account's currency, e.g. 10 for $10.00/day (not micros)", + "exclusiveMinimum": 0, + "maximum": 1000000, + "type": "number" + }, + "campaign_id": { + "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "type": { + "const": "set_daily_budget", + "type": "string" + } + }, + "required": [ + "type", + "campaign_id", + "amount" + ], + "type": "object" + }, + { + "description": "Set the last day a campaign runs, so it stops spending on its own", + "properties": { + "campaign_id": { + "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "end_date": { + "anyOf": [ + { + "pattern": "^\\d{4}-\\d{2}-\\d{2}$", + "type": "string" + }, + { + "const": "none", + "type": "string" + } + ], + "description": "Last day the campaign runs, YYYY-MM-DD in the account's time zone (it stops after 23:59:59 that day), or \"none\" to remove the end date" + }, + "type": { + "const": "set_end_date", + "type": "string" + } + }, + "required": [ + "type", + "campaign_id", + "end_date" + ], + "type": "object" + }, + { + "description": "Build a new Search campaign with its ad groups, keywords, ads, targeting, negatives and sitelinks, in one step. It is created PAUSED: nothing spends until a separate enable_campaign", + "properties": { + "ad_groups": { + "items": { + "properties": { + "ads": { + "items": { + "description": "A responsive search ad", + "properties": { + "descriptions": { + "description": "2 to 4 descriptions, each at most 90 characters", + "items": { + "maxLength": 90, + "minLength": 1, + "type": "string" + }, + "maxItems": 4, + "minItems": 2, + "type": "array" + }, + "final_url": { + "description": "The landing page", + "maxLength": 2048, + "pattern": "^https?:\\/\\/", + "type": "string" + }, + "headlines": { + "description": "3 to 15 headlines, each at most 30 characters", + "items": { + "maxLength": 30, + "minLength": 1, + "type": "string" + }, + "maxItems": 15, + "minItems": 3, + "type": "array" + }, + "path1": { + "description": "Display path part 1, at most 15 characters", + "maxLength": 15, + "minLength": 1, + "type": "string" + }, + "path2": { + "description": "Display path part 2, at most 15 characters", + "maxLength": 15, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "headlines", + "descriptions", + "final_url" + ], + "type": "object" + }, + "maxItems": 3, + "minItems": 1, + "type": "array" + }, + "default_max_cpc": { + "description": "Default max cost per click for the ad group (required when the campaign uses manual CPC)", + "exclusiveMinimum": 0, + "maximum": 1000, + "type": "number" + }, + "keywords": { + "items": { + "properties": { + "match_type": { + "description": "PHRASE matches searches containing the words in order; the usual choice", + "enum": [ + "EXACT", + "PHRASE", + "BROAD" + ], + "type": "string" + }, + "max_cpc": { + "description": "Max cost per click for this keyword in the account's currency (manual CPC only); omit to use the ad group's", + "exclusiveMinimum": 0, + "maximum": 1000, + "type": "number" + }, + "text": { + "description": "The keyword, e.g. \"cleaning invoice template\"", + "maxLength": 80, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "text", + "match_type" + ], + "type": "object" + }, + "maxItems": 50, + "minItems": 1, + "type": "array" + }, + "name": { + "maxLength": 255, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "name", + "keywords", + "ads" + ], + "type": "object" + }, + "maxItems": 10, + "minItems": 1, + "type": "array" + }, + "bidding": { + "default": "MANUAL_CPC", + "description": "MANUAL_CPC uses the ad group and keyword max CPCs; MAXIMIZE_CLICKS and MAXIMIZE_CONVERSIONS let Google bid within the budget", + "enum": [ + "MANUAL_CPC", + "MAXIMIZE_CLICKS", + "MAXIMIZE_CONVERSIONS" + ], + "type": "string" + }, + "daily_budget": { + "description": "Average daily budget in the account's currency, e.g. 20 for $20.00/day", + "exclusiveMinimum": 0, + "maximum": 1000000, + "type": "number" + }, + "end_date": { + "description": "Last day the campaign runs, YYYY-MM-DD", + "pattern": "^\\d{4}-\\d{2}-\\d{2}$", + "type": "string" + }, + "language_ids": { + "default": [ + "1000" + ], + "description": "Google language ids, e.g. 1000 English, 1003 Spanish", + "items": { + "pattern": "^\\d+$", + "type": "string" + }, + "maxItems": 20, + "minItems": 1, + "type": "array" + }, + "location_ids": { + "default": [ + "2840" + ], + "description": "Google geo target ids, e.g. 2840 United States, 2826 United Kingdom, 2124 Canada (look others up in geo_target_constant)", + "items": { + "pattern": "^\\d+$", + "type": "string" + }, + "maxItems": 50, + "minItems": 1, + "type": "array" + }, + "max_cpc_ceiling": { + "description": "MAXIMIZE_CLICKS only: the most Google may bid per click", + "exclusiveMinimum": 0, + "maximum": 1000, + "type": "number" + }, + "name": { + "description": "Campaign name; must not match an existing campaign", + "maxLength": 255, + "minLength": 1, + "type": "string" + }, + "negative_keywords": { + "default": [], + "description": "Searches to block across the campaign", + "items": { + "properties": { + "match_type": { + "enum": [ + "EXACT", + "PHRASE", + "BROAD" + ], + "type": "string" + }, + "text": { + "maxLength": 80, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "text", + "match_type" + ], + "type": "object" + }, + "maxItems": 200, + "type": "array" + }, + "presence_only": { + "default": true, + "description": "Show ads only to people IN the locations (true), not merely interested in them", + "type": "boolean" + }, + "search_partners": { + "default": false, + "description": "Also show on Google's search partner sites", + "type": "boolean" + }, + "sitelinks": { + "default": [], + "items": { + "properties": { + "description1": { + "description": "At most 35 characters; give both descriptions or neither", + "maxLength": 35, + "minLength": 1, + "type": "string" + }, + "description2": { + "maxLength": 35, + "minLength": 1, + "type": "string" + }, + "text": { + "description": "Link text, at most 25 characters", + "maxLength": 25, + "minLength": 1, + "type": "string" + }, + "url": { + "maxLength": 2048, + "pattern": "^https?:\\/\\/", + "type": "string" + } + }, + "required": [ + "text", + "url" + ], + "type": "object" + }, + "maxItems": 8, + "type": "array" + }, + "type": { + "const": "create_campaign", + "type": "string" + } + }, + "required": [ + "type", + "name", + "daily_budget", + "ad_groups" + ], + "type": "object" + }, + { + "description": "Build a new Display campaign (image ads across Google's Display Network of sites and apps) with ad groups and responsive display ads. Google's optimized targeting finds the audience. It is created PAUSED: nothing spends until a separate enable_campaign", + "properties": { + "ad_groups": { + "items": { + "properties": { + "ads": { + "items": { + "description": "A responsive display ad: Google assembles ads from these headlines, descriptions and images", + "properties": { + "business_name": { + "description": "The advertiser's name, at most 25 characters", + "maxLength": 25, + "minLength": 1, + "type": "string" + }, + "descriptions": { + "description": "1 to 5 descriptions, each at most 90 characters", + "items": { + "maxLength": 90, + "minLength": 1, + "type": "string" + }, + "maxItems": 5, + "minItems": 1, + "type": "array" + }, + "final_url": { + "description": "The landing page", + "maxLength": 2048, + "pattern": "^https?:\\/\\/", + "type": "string" + }, + "headlines": { + "description": "1 to 5 short headlines, each at most 30 characters", + "items": { + "maxLength": 30, + "minLength": 1, + "type": "string" + }, + "maxItems": 5, + "minItems": 1, + "type": "array" + }, + "logo_images": { + "default": [], + "description": "0 to 5 landscape logos, 4:1 (e.g. 1200×300, at least 512×128)", + "items": { + "description": "An https URL of a PNG, JPEG or GIF (at most 5120 KB), or the id of an image asset already in the account (asset.id from run_gaql WHERE asset.type = 'IMAGE')", + "maxLength": 2048, + "minLength": 1, + "type": "string" + }, + "maxItems": 5, + "minItems": 0, + "type": "array" + }, + "long_headline": { + "description": "One long headline, at most 90 characters", + "maxLength": 90, + "minLength": 1, + "type": "string" + }, + "marketing_images": { + "description": "1 to 15 landscape images, 1.91:1 (e.g. 1200×628, at least 600×314)", + "items": { + "description": "An https URL of a PNG, JPEG or GIF (at most 5120 KB), or the id of an image asset already in the account (asset.id from run_gaql WHERE asset.type = 'IMAGE')", + "maxLength": 2048, + "minLength": 1, + "type": "string" + }, + "maxItems": 15, + "minItems": 1, + "type": "array" + }, + "square_logo_images": { + "default": [], + "description": "0 to 5 square logos, 1:1 (e.g. 1200×1200, at least 128×128)", + "items": { + "description": "An https URL of a PNG, JPEG or GIF (at most 5120 KB), or the id of an image asset already in the account (asset.id from run_gaql WHERE asset.type = 'IMAGE')", + "maxLength": 2048, + "minLength": 1, + "type": "string" + }, + "maxItems": 5, + "minItems": 0, + "type": "array" + }, + "square_marketing_images": { + "description": "1 to 15 square images, 1:1 (e.g. 1200×1200, at least 300×300)", + "items": { + "description": "An https URL of a PNG, JPEG or GIF (at most 5120 KB), or the id of an image asset already in the account (asset.id from run_gaql WHERE asset.type = 'IMAGE')", + "maxLength": 2048, + "minLength": 1, + "type": "string" + }, + "maxItems": 15, + "minItems": 1, + "type": "array" + } + }, + "required": [ + "headlines", + "long_headline", + "descriptions", + "business_name", + "final_url", + "marketing_images", + "square_marketing_images" + ], + "type": "object" + }, + "maxItems": 3, + "minItems": 1, + "type": "array" + }, + "default_max_cpc": { + "description": "Default max cost per click (required when the campaign uses manual CPC)", + "exclusiveMinimum": 0, + "maximum": 1000, + "type": "number" + }, + "name": { + "maxLength": 255, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "name", + "ads" + ], + "type": "object" + }, + "maxItems": 5, + "minItems": 1, + "type": "array" + }, + "bidding": { + "default": "MAXIMIZE_CLICKS", + "description": "MANUAL_CPC uses the ad groups' max CPCs; MAXIMIZE_CLICKS and MAXIMIZE_CONVERSIONS let Google bid within the budget", + "enum": [ + "MANUAL_CPC", + "MAXIMIZE_CLICKS", + "MAXIMIZE_CONVERSIONS" + ], + "type": "string" + }, + "daily_budget": { + "description": "Average daily budget in the account's currency, e.g. 20 for $20.00/day", + "exclusiveMinimum": 0, + "maximum": 1000000, + "type": "number" + }, + "end_date": { + "description": "Last day the campaign runs, YYYY-MM-DD", + "pattern": "^\\d{4}-\\d{2}-\\d{2}$", + "type": "string" + }, + "language_ids": { + "default": [ + "1000" + ], + "description": "Google language ids, e.g. 1000 English", + "items": { + "pattern": "^\\d+$", + "type": "string" + }, + "maxItems": 20, + "minItems": 1, + "type": "array" + }, + "location_ids": { + "default": [ + "2840" + ], + "description": "Google geo target ids, e.g. 2840 United States", + "items": { + "pattern": "^\\d+$", + "type": "string" + }, + "maxItems": 50, + "minItems": 1, + "type": "array" + }, + "max_cpc_ceiling": { + "description": "MAXIMIZE_CLICKS only: the most Google may bid per click", + "exclusiveMinimum": 0, + "maximum": 1000, + "type": "number" + }, + "name": { + "description": "Campaign name; must not match an existing campaign", + "maxLength": 255, + "minLength": 1, + "type": "string" + }, + "presence_only": { + "default": true, + "description": "Show ads only to people IN the locations (true), not merely interested in them", + "type": "boolean" + }, + "type": { + "const": "create_display_campaign", + "type": "string" + } + }, + "required": [ + "type", + "name", + "daily_budget", + "ad_groups" + ], + "type": "object" + }, + { + "description": "Build a new Demand Gen campaign with YouTube video ads, which is how to advertise on YouTube through the API (Google doesn't allow creating Video campaigns there). It is created PAUSED: nothing spends until a separate enable_campaign", + "properties": { + "ad_groups": { + "items": { + "properties": { + "ads": { + "items": { + "description": "A Demand Gen video ad: runs on YouTube (in-stream, in-feed and Shorts), Discover and Gmail", + "properties": { + "business_name": { + "description": "The advertiser's name, at most 25 characters", + "maxLength": 25, + "minLength": 1, + "type": "string" + }, + "descriptions": { + "description": "1 to 5 descriptions, each at most 90 characters", + "items": { + "maxLength": 90, + "minLength": 1, + "type": "string" + }, + "maxItems": 5, + "minItems": 1, + "type": "array" + }, + "final_url": { + "description": "The landing page", + "maxLength": 2048, + "pattern": "^https?:\\/\\/", + "type": "string" + }, + "headlines": { + "description": "1 to 5 headlines, each at most 40 characters", + "items": { + "maxLength": 40, + "minLength": 1, + "type": "string" + }, + "maxItems": 5, + "minItems": 1, + "type": "array" + }, + "logo_image": { + "description": "A square 1:1 logo (e.g. 1200×1200, at least 128×128): an https URL, or an image asset id from the account", + "maxLength": 2048, + "minLength": 1, + "type": "string" + }, + "long_headlines": { + "description": "1 to 5 long headlines, each at most 90 characters", + "items": { + "maxLength": 90, + "minLength": 1, + "type": "string" + }, + "maxItems": 5, + "minItems": 1, + "type": "array" + }, + "videos": { + "description": "1 to 5 YouTube videos", + "items": { + "description": "A YouTube video id (e.g. dQw4w9WgXcQ) or its youtube.com / youtu.be URL. The video must be public or unlisted", + "maxLength": 200, + "minLength": 1, + "type": "string" + }, + "maxItems": 5, + "minItems": 1, + "type": "array" + } + }, + "required": [ + "videos", + "headlines", + "long_headlines", + "descriptions", + "business_name", + "logo_image", + "final_url" + ], + "type": "object" + }, + "maxItems": 3, + "minItems": 1, + "type": "array" + }, + "language_ids": { + "default": [ + "1000" + ], + "description": "Google language ids, e.g. 1000 English", + "items": { + "pattern": "^\\d+$", + "type": "string" + }, + "maxItems": 20, + "minItems": 1, + "type": "array" + }, + "location_ids": { + "default": [ + "2840" + ], + "description": "Google geo target ids, e.g. 2840 United States (Demand Gen targets locations per ad group, not per campaign)", + "items": { + "pattern": "^\\d+$", + "type": "string" + }, + "maxItems": 50, + "minItems": 1, + "type": "array" + }, + "name": { + "maxLength": 255, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "name", + "ads" + ], + "type": "object" + }, + "maxItems": 5, + "minItems": 1, + "type": "array" + }, + "bidding": { + "default": "MAXIMIZE_CONVERSIONS", + "description": "Demand Gen bids automatically: MAXIMIZE_CONVERSIONS (needs conversion tracking) or MAXIMIZE_CLICKS", + "enum": [ + "MAXIMIZE_CONVERSIONS", + "MAXIMIZE_CLICKS" + ], + "type": "string" + }, + "daily_budget": { + "description": "Average daily budget in the account's currency, e.g. 20 for $20.00/day", + "exclusiveMinimum": 0, + "maximum": 1000000, + "type": "number" + }, + "end_date": { + "description": "Last day the campaign runs, YYYY-MM-DD", + "pattern": "^\\d{4}-\\d{2}-\\d{2}$", + "type": "string" + }, + "name": { + "description": "Campaign name; must not match an existing campaign", + "maxLength": 255, + "minLength": 1, + "type": "string" + }, + "type": { + "const": "create_demand_gen_campaign", + "type": "string" + } + }, + "required": [ + "type", + "name", + "daily_budget", + "ad_groups" + ], + "type": "object" + }, + { + "description": "Build a new Performance Max campaign: one budget, Google places ads across Search, YouTube, Display, Discover, Gmail and Maps from the asset groups' text, images and videos. No shopping feed (non-retail). It is created PAUSED: nothing spends until a separate enable_campaign", + "properties": { + "asset_groups": { + "items": { + "description": "An asset group: the headlines, descriptions, images and videos Google combines into ads on every channel", + "properties": { + "descriptions": { + "description": "2 to 5 descriptions, each at most 90 characters; Google recommends one of 60 or fewer", + "items": { + "maxLength": 90, + "minLength": 1, + "type": "string" + }, + "maxItems": 5, + "minItems": 2, + "type": "array" + }, + "final_url": { + "description": "The landing page (Google may also send people to other pages on the same site)", + "maxLength": 2048, + "pattern": "^https?:\\/\\/", + "type": "string" + }, + "headlines": { + "description": "3 to 15 headlines, each at most 30 characters", + "items": { + "maxLength": 30, + "minLength": 1, + "type": "string" + }, + "maxItems": 15, + "minItems": 3, + "type": "array" + }, + "long_headlines": { + "description": "1 to 5 long headlines, each at most 90 characters", + "items": { + "maxLength": 90, + "minLength": 1, + "type": "string" + }, + "maxItems": 5, + "minItems": 1, + "type": "array" + }, + "marketing_images": { + "description": "1 to 20 landscape images, 1.91:1 (e.g. 1200×628)", + "items": { + "description": "An https URL of a PNG, JPEG or GIF (at most 5120 KB), or the id of an image asset already in the account (asset.id from run_gaql WHERE asset.type = 'IMAGE')", + "maxLength": 2048, + "minLength": 1, + "type": "string" + }, + "maxItems": 20, + "minItems": 1, + "type": "array" + }, + "name": { + "maxLength": 255, + "minLength": 1, + "type": "string" + }, + "portrait_marketing_images": { + "default": [], + "description": "0 to 20 portrait images, 4:5 (e.g. 960×1200)", + "items": { + "description": "An https URL of a PNG, JPEG or GIF (at most 5120 KB), or the id of an image asset already in the account (asset.id from run_gaql WHERE asset.type = 'IMAGE')", + "maxLength": 2048, + "minLength": 1, + "type": "string" + }, + "maxItems": 20, + "minItems": 0, + "type": "array" + }, + "square_marketing_images": { + "description": "1 to 20 square images, 1:1 (e.g. 1200×1200)", + "items": { + "description": "An https URL of a PNG, JPEG or GIF (at most 5120 KB), or the id of an image asset already in the account (asset.id from run_gaql WHERE asset.type = 'IMAGE')", + "maxLength": 2048, + "minLength": 1, + "type": "string" + }, + "maxItems": 20, + "minItems": 1, + "type": "array" + }, + "videos": { + "default": [], + "description": "0 to 5 YouTube videos; without one, Google may auto-generate a video from the images", + "items": { + "description": "A YouTube video id (e.g. dQw4w9WgXcQ) or its youtube.com / youtu.be URL. The video must be public or unlisted", + "maxLength": 200, + "minLength": 1, + "type": "string" + }, + "maxItems": 5, + "type": "array" + } + }, + "required": [ + "name", + "final_url", + "headlines", + "long_headlines", + "descriptions", + "marketing_images", + "square_marketing_images" + ], + "type": "object" + }, + "maxItems": 5, + "minItems": 1, + "type": "array" + }, + "bidding": { + "default": "MAXIMIZE_CONVERSIONS", + "description": "Performance Max bids for conversions only: MAXIMIZE_CONVERSIONS, or MAXIMIZE_CONVERSION_VALUE when conversions carry values", + "enum": [ + "MAXIMIZE_CONVERSIONS", + "MAXIMIZE_CONVERSION_VALUE" + ], + "type": "string" + }, + "business_name": { + "description": "The advertiser's name, at most 25 characters (linked to the campaign, per Google's brand guidelines)", + "maxLength": 25, + "minLength": 1, + "type": "string" + }, + "daily_budget": { + "description": "Average daily budget in the account's currency, e.g. 20 for $20.00/day", + "exclusiveMinimum": 0, + "maximum": 1000000, + "type": "number" + }, + "end_date": { + "description": "Last day the campaign runs, YYYY-MM-DD", + "pattern": "^\\d{4}-\\d{2}-\\d{2}$", + "type": "string" + }, + "language_ids": { + "default": [ + "1000" + ], + "description": "Google language ids, e.g. 1000 English", + "items": { + "pattern": "^\\d+$", + "type": "string" + }, + "maxItems": 20, + "minItems": 1, + "type": "array" + }, + "location_ids": { + "default": [ + "2840" + ], + "description": "Google geo target ids, e.g. 2840 United States", + "items": { + "pattern": "^\\d+$", + "type": "string" + }, + "maxItems": 50, + "minItems": 1, + "type": "array" + }, + "logo_images": { + "description": "1 to 5 square logos, 1:1 (e.g. 1200×1200, at least 128×128), linked to the campaign", + "items": { + "description": "An https URL of a PNG, JPEG or GIF (at most 5120 KB), or the id of an image asset already in the account (asset.id from run_gaql WHERE asset.type = 'IMAGE')", + "maxLength": 2048, + "minLength": 1, + "type": "string" + }, + "maxItems": 5, + "minItems": 1, + "type": "array" + }, + "name": { + "description": "Campaign name; must not match an existing campaign", + "maxLength": 255, + "minLength": 1, + "type": "string" + }, + "target_cpa": { + "description": "MAXIMIZE_CONVERSIONS only: target cost per conversion", + "exclusiveMinimum": 0, + "maximum": 1000, + "type": "number" + }, + "type": { + "const": "create_performance_max_campaign", + "type": "string" + } + }, + "required": [ + "type", + "name", + "daily_budget", + "business_name", + "logo_images", + "asset_groups" + ], + "type": "object" + }, + { + "description": "Add an ad group, with its keywords and ads, to an existing Search campaign", + "properties": { + "ad_group": { + "properties": { + "ads": { + "items": { + "description": "A responsive search ad", + "properties": { + "descriptions": { + "description": "2 to 4 descriptions, each at most 90 characters", + "items": { + "maxLength": 90, + "minLength": 1, + "type": "string" + }, + "maxItems": 4, + "minItems": 2, + "type": "array" + }, + "final_url": { + "description": "The landing page", + "maxLength": 2048, + "pattern": "^https?:\\/\\/", + "type": "string" + }, + "headlines": { + "description": "3 to 15 headlines, each at most 30 characters", + "items": { + "maxLength": 30, + "minLength": 1, + "type": "string" + }, + "maxItems": 15, + "minItems": 3, + "type": "array" + }, + "path1": { + "description": "Display path part 1, at most 15 characters", + "maxLength": 15, + "minLength": 1, + "type": "string" + }, + "path2": { + "description": "Display path part 2, at most 15 characters", + "maxLength": 15, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "headlines", + "descriptions", + "final_url" + ], + "type": "object" + }, + "maxItems": 3, + "minItems": 1, + "type": "array" + }, + "default_max_cpc": { + "description": "Default max cost per click for the ad group (required when the campaign uses manual CPC)", + "exclusiveMinimum": 0, + "maximum": 1000, + "type": "number" + }, + "keywords": { + "items": { + "properties": { + "match_type": { + "description": "PHRASE matches searches containing the words in order; the usual choice", + "enum": [ + "EXACT", + "PHRASE", + "BROAD" + ], + "type": "string" + }, + "max_cpc": { + "description": "Max cost per click for this keyword in the account's currency (manual CPC only); omit to use the ad group's", + "exclusiveMinimum": 0, + "maximum": 1000, + "type": "number" + }, + "text": { + "description": "The keyword, e.g. \"cleaning invoice template\"", + "maxLength": 80, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "text", + "match_type" + ], + "type": "object" + }, + "maxItems": 50, + "minItems": 1, + "type": "array" + }, + "name": { + "maxLength": 255, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "name", + "keywords", + "ads" + ], + "type": "object" + }, + "campaign_id": { + "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "type": { + "const": "add_ad_group", + "type": "string" + } + }, + "required": [ + "type", + "campaign_id", + "ad_group" + ], + "type": "object" + }, + { + "description": "Add keywords to an existing ad group", + "properties": { + "ad_group_id": { + "description": "Ad group id, digits only (ad_group.id from run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "keywords": { + "items": { + "properties": { + "match_type": { + "description": "PHRASE matches searches containing the words in order; the usual choice", + "enum": [ + "EXACT", + "PHRASE", + "BROAD" + ], + "type": "string" + }, + "max_cpc": { + "description": "Max cost per click for this keyword in the account's currency (manual CPC only); omit to use the ad group's", + "exclusiveMinimum": 0, + "maximum": 1000, + "type": "number" + }, + "text": { + "description": "The keyword, e.g. \"cleaning invoice template\"", + "maxLength": 80, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "text", + "match_type" + ], + "type": "object" + }, + "maxItems": 50, + "minItems": 1, + "type": "array" + }, + "type": { + "const": "add_keywords", + "type": "string" + } + }, + "required": [ + "type", + "ad_group_id", + "keywords" + ], + "type": "object" + }, + { + "description": "Add a responsive search ad to an existing ad group", + "properties": { + "ad": { + "description": "A responsive search ad", + "properties": { + "descriptions": { + "description": "2 to 4 descriptions, each at most 90 characters", + "items": { + "maxLength": 90, + "minLength": 1, + "type": "string" + }, + "maxItems": 4, + "minItems": 2, + "type": "array" + }, + "final_url": { + "description": "The landing page", + "maxLength": 2048, + "pattern": "^https?:\\/\\/", + "type": "string" + }, + "headlines": { + "description": "3 to 15 headlines, each at most 30 characters", + "items": { + "maxLength": 30, + "minLength": 1, + "type": "string" + }, + "maxItems": 15, + "minItems": 3, + "type": "array" + }, + "path1": { + "description": "Display path part 1, at most 15 characters", + "maxLength": 15, + "minLength": 1, + "type": "string" + }, + "path2": { + "description": "Display path part 2, at most 15 characters", + "maxLength": 15, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "headlines", + "descriptions", + "final_url" + ], + "type": "object" + }, + "ad_group_id": { + "description": "Ad group id, digits only (ad_group.id from run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "type": { + "const": "add_responsive_search_ad", + "type": "string" + } + }, + "required": [ + "type", + "ad_group_id", + "ad" + ], + "type": "object" + }, + { + "description": "Add sitelinks to a campaign", + "properties": { + "campaign_id": { + "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "sitelinks": { + "items": { + "properties": { + "description1": { + "description": "At most 35 characters; give both descriptions or neither", + "maxLength": 35, + "minLength": 1, + "type": "string" + }, + "description2": { + "maxLength": 35, + "minLength": 1, + "type": "string" + }, + "text": { + "description": "Link text, at most 25 characters", + "maxLength": 25, + "minLength": 1, + "type": "string" + }, + "url": { + "maxLength": 2048, + "pattern": "^https?:\\/\\/", + "type": "string" + } + }, + "required": [ + "text", + "url" + ], + "type": "object" + }, + "maxItems": 8, + "minItems": 1, + "type": "array" + }, + "type": { + "const": "add_sitelinks", + "type": "string" + } + }, + "required": [ + "type", + "campaign_id", + "sitelinks" + ], + "type": "object" + }, + { + "description": "Make a campaign count and bid on ONE conversion category only (e.g. SIGNUP), so another product's or step's conversions don't steer it", + "properties": { + "campaign_id": { + "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "category": { + "description": "Conversion category, e.g. SIGNUP, PURCHASE, SUBMIT_LEAD_FORM, QUALIFIED_LEAD (see conversion_action.category in run_gaql)", + "pattern": "^[A-Z_]+$", + "type": "string" + }, + "type": { + "const": "set_conversion_goal", + "type": "string" + } + }, + "required": [ + "type", + "campaign_id", + "category" + ], + "type": "object" + }, + { + "description": "Change one keyword's max CPC (manual CPC campaigns)", + "properties": { + "ad_group_id": { + "description": "Ad group id, digits only (ad_group.id from run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "criterion_id": { + "description": "Keyword criterion id, digits only (ad_group_criterion.criterion_id from run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "max_cpc": { + "anyOf": [ + { + "exclusiveMinimum": 0, + "maximum": 1000, + "type": "number" + }, + { + "type": "null" + } + ], + "description": "New max cost per click for this keyword, or null to clear it so the keyword uses the ad group's bid" + }, + "type": { + "const": "set_keyword_bid", + "type": "string" + } + }, + "required": [ + "type", + "ad_group_id", + "criterion_id", + "max_cpc" + ], + "type": "object" + }, + { + "description": "Change an ad group's default max CPC, which its keywords use unless they have their own", + "properties": { + "ad_group_id": { + "description": "Ad group id, digits only (ad_group.id from run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "max_cpc": { + "description": "New default max cost per click for the ad group", + "exclusiveMinimum": 0, + "maximum": 1000, + "type": "number" + }, + "type": { + "const": "set_ad_group_bid", + "type": "string" + } + }, + "required": [ + "type", + "ad_group_id", + "max_cpc" + ], + "type": "object" + }, + { + "description": "Pause one ad", + "properties": { + "ad_group_id": { + "description": "Ad group id, digits only (ad_group.id from run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "ad_id": { + "description": "Ad id, digits only (ad_group_ad.ad.id from run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "type": { + "const": "pause_ad", + "type": "string" + } + }, + "required": [ + "type", + "ad_group_id", + "ad_id" + ], + "type": "object" + }, + { + "description": "Re-enable one paused ad", + "properties": { + "ad_group_id": { + "description": "Ad group id, digits only (ad_group.id from run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "ad_id": { + "description": "Ad id, digits only (ad_group_ad.ad.id from run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "type": { + "const": "enable_ad", + "type": "string" + } + }, + "required": [ + "type", + "ad_group_id", + "ad_id" + ], + "type": "object" + }, + { + "description": "Add locations and/or languages a campaign targets", + "properties": { + "campaign_id": { + "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "language_ids": { + "default": [], + "description": "Language ids to add, e.g. 1000 English", + "items": { + "pattern": "^\\d+$", + "type": "string" + }, + "maxItems": 20, + "type": "array" + }, + "location_ids": { + "default": [], + "description": "Geo target ids to add, e.g. 2840 United States", + "items": { + "pattern": "^\\d+$", + "type": "string" + }, + "maxItems": 50, + "type": "array" + }, + "type": { + "const": "add_campaign_targeting", + "type": "string" + } + }, + "required": [ + "type", + "campaign_id" + ], + "type": "object" + }, + { + "description": "Stop targeting some of a campaign's locations and/or languages", + "properties": { + "campaign_id": { + "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "language_ids": { + "default": [], + "items": { + "pattern": "^\\d+$", + "type": "string" + }, + "maxItems": 20, + "type": "array" + }, + "location_ids": { + "default": [], + "items": { + "pattern": "^\\d+$", + "type": "string" + }, + "maxItems": 50, + "type": "array" + }, + "type": { + "const": "remove_campaign_targeting", + "type": "string" + } + }, + "required": [ + "type", + "campaign_id" + ], + "type": "object" + }, + { + "description": "Choose whether a campaign shows to people in its locations only, or also to people interested in them", + "properties": { + "campaign_id": { + "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "presence_only": { + "description": "true: only people IN the locations; false: also people interested in them", + "type": "boolean" + }, + "type": { + "const": "set_location_mode", + "type": "string" + } + }, + "required": [ + "type", + "campaign_id", + "presence_only" + ], + "type": "object" + }, + { + "description": "Switch ONE campaign's bid strategy. A campaign on a shared (portfolio) strategy moves off it onto its own; the other campaigns on the shared strategy keep it. To change the shared strategy for every campaign on it, use set_shared_bid_strategy. If the user didn't say which they mean, ask. Google re-learns after a switch, so performance can wobble for a week or two", + "properties": { + "campaign_id": { + "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "max_cpc_ceiling": { + "description": "MAXIMIZE_CLICKS only: the most Google may bid per click", + "exclusiveMinimum": 0, + "maximum": 1000, + "type": "number" + }, + "strategy": { + "enum": [ + "MANUAL_CPC", + "MAXIMIZE_CLICKS", + "MAXIMIZE_CONVERSIONS" + ], + "type": "string" + }, + "target_cpa": { + "description": "MAXIMIZE_CONVERSIONS only: target cost per conversion", + "exclusiveMinimum": 0, + "maximum": 1000, + "type": "number" + }, + "type": { + "const": "set_bidding_strategy", + "type": "string" + } + }, + "required": [ + "type", + "campaign_id", + "strategy" + ], + "type": "object" + }, + { + "description": "Change a shared (portfolio) bid strategy's targets. This changes EVERY campaign on it, which the proposal lists. Its type can't be changed; to move one campaign to another strategy, use set_bidding_strategy", + "properties": { + "bidding_strategy_id": { + "description": "Shared (portfolio) strategy id: bidding_strategy.id from run_gaql, or the id at the end of campaign.bidding_strategy", + "pattern": "^\\d+$", + "type": "string" + }, + "max_cpc_ceiling": { + "description": "The most Google may bid per click", + "exclusiveMinimum": 0, + "maximum": 1000, + "type": "number" + }, + "target_cpa": { + "description": "Target cost per conversion (TARGET_CPA and MAXIMIZE_CONVERSIONS strategies)", + "exclusiveMinimum": 0, + "maximum": 1000, + "type": "number" + }, + "target_roas": { + "description": "Target return on ad spend as a ratio, e.g. 4 = 400% (TARGET_ROAS and MAXIMIZE_CONVERSION_VALUE)", + "exclusiveMinimum": 0, + "maximum": 1000, + "type": "number" + }, + "type": { + "const": "set_shared_bid_strategy", + "type": "string" + } + }, + "required": [ + "type", + "bidding_strategy_id" + ], + "type": "object" + }, + { + "description": "Create a shared (portfolio) bid strategy, optionally moving campaigns onto it. Undo moves those campaigns back and removes it", + "properties": { + "campaign_ids": { + "default": [], + "description": "Campaigns to move onto it in the same step (each leaves its current strategy)", + "items": { + "pattern": "^\\d+$", + "type": "string" + }, + "maxItems": 50, + "type": "array" + }, + "max_cpc_ceiling": { + "description": "The most Google may bid per click", + "exclusiveMinimum": 0, + "maximum": 1000, + "type": "number" + }, + "name": { + "description": "Name for the shared strategy; must not match an existing one", + "maxLength": 255, + "minLength": 1, + "type": "string" + }, + "strategy": { + "enum": [ + "MAXIMIZE_CLICKS", + "MAXIMIZE_CONVERSIONS", + "MAXIMIZE_CONVERSION_VALUE", + "TARGET_CPA", + "TARGET_ROAS" + ], + "type": "string" + }, + "target_cpa": { + "description": "Target cost per conversion: required for TARGET_CPA, optional for MAXIMIZE_CONVERSIONS", + "exclusiveMinimum": 0, + "maximum": 1000, + "type": "number" + }, + "target_roas": { + "description": "Target return on ad spend as a ratio, e.g. 4 = 400%: required for TARGET_ROAS, optional for MAXIMIZE_CONVERSION_VALUE", + "exclusiveMinimum": 0, + "maximum": 1000, + "type": "number" + }, + "type": { + "const": "create_shared_bid_strategy", + "type": "string" + } + }, + "required": [ + "type", + "name", + "strategy" + ], + "type": "object" + }, + { + "description": "Set or clear a campaign's final URL suffix (tracking parameters on every ad click)", + "properties": { + "campaign_id": { + "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "suffix": { + "description": "Query string Google appends to every landing page in the campaign, e.g. \"utm_source=google&utm_medium=cpc&utm_term={keyword}\", or \"none\" to clear it", + "maxLength": 1000, + "type": "string" + }, + "type": { + "const": "set_url_suffix", + "type": "string" + } + }, + "required": [ + "type", + "campaign_id", + "suffix" + ], + "type": "object" + }, + { + "description": "Create a conversion action to measure sign-ups, leads or purchases", + "properties": { + "category": { + "description": "Conversion category, e.g. SIGNUP, PURCHASE, SUBMIT_LEAD_FORM, QUALIFIED_LEAD (see conversion_action.category in run_gaql)", + "pattern": "^[A-Z_]+$", + "type": "string" + }, + "counting": { + "default": "ONE_PER_CLICK", + "description": "ONE_PER_CLICK for sign-ups and leads; MANY_PER_CLICK for purchases", + "enum": [ + "ONE_PER_CLICK", + "MANY_PER_CLICK" + ], + "type": "string" + }, + "default_value": { + "description": "Value per conversion when none is sent", + "maximum": 1000000, + "minimum": 0, + "type": "number" + }, + "name": { + "maxLength": 100, + "minLength": 1, + "type": "string" + }, + "primary": { + "default": true, + "description": "Primary actions count in Conversions and can steer bidding", + "type": "boolean" + }, + "source": { + "default": "UPLOAD_CLICKS", + "description": "UPLOAD_CLICKS: your server uploads ad click ids (no Google tag). WEBPAGE: Google gives you a tag to put on the page", + "enum": [ + "UPLOAD_CLICKS", + "WEBPAGE" + ], + "type": "string" + }, + "type": { + "const": "create_conversion_action", + "type": "string" + } + }, + "required": [ + "type", + "name", + "category" + ], + "type": "object" + }, + { + "description": "Set how many conversions one ad click can produce for a conversion action", + "properties": { + "conversion_action_id": { + "description": "conversion_action.id from run_gaql", + "pattern": "^\\d+$", + "type": "string" + }, + "counting": { + "enum": [ + "ONE_PER_CLICK", + "MANY_PER_CLICK" + ], + "type": "string" + }, + "type": { + "const": "set_conversion_counting", + "type": "string" + } + }, + "required": [ + "type", + "conversion_action_id", + "counting" + ], + "type": "object" + } +]
5 tool updates
- Added
analytics_landing_pages - Added
analytics_properties - Added
analytics_report - Added
analytics_setup - Added
propose_analytics_changes
1 tool update
- Changed
propose_changes1 field changed- changed
Input schema / properties / changes / items / oneOfPrevious value: -[ - { - "description": "Block searches containing these words in one campaign", - "properties": { - "campaign_id": { - "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)", - "pattern": "^\\d+$", - "type": "string" - }, - "keywords": { - "items": { - "properties": { - "match_type": { - "description": "PHRASE blocks any search containing the words in order; the usual choice", - "enum": [ - "EXACT", - "PHRASE", - "BROAD" - ], - "type": "string" - }, - "text": { - "description": "The search words to block, e.g. \"free\"", - "maxLength": 80, - "minLength": 1, - "type": "string" - } - }, - "required": [ - "text", - "match_type" - ], - "type": "object" - }, - "maxItems": 50, - "minItems": 1, - "type": "array" - }, - "type": { - "const": "add_negative_keywords", - "type": "string" - } - }, - "required": [ - "type", - "campaign_id", - "keywords" - ], - "type": "object" - }, - { - "description": "Pause one keyword", - "properties": { - "ad_group_id": { - "description": "Ad group id, digits only (ad_group.id from run_gaql)", - "pattern": "^\\d+$", - "type": "string" - }, - "criterion_id": { - "description": "Keyword criterion id, digits only (ad_group_criterion.criterion_id from run_gaql)", - "pattern": "^\\d+$", - "type": "string" - }, - "type": { - "const": "pause_keyword", - "type": "string" - } - }, - "required": [ - "type", - "ad_group_id", - "criterion_id" - ], - "type": "object" - }, - { - "description": "Re-enable one paused keyword", - "properties": { - "ad_group_id": { - "description": "Ad group id, digits only (ad_group.id from run_gaql)", - "pattern": "^\\d+$", - "type": "string" - }, - "criterion_id": { - "description": "Keyword criterion id, digits only (ad_group_criterion.criterion_id from run_gaql)", - "pattern": "^\\d+$", - "type": "string" - }, - "type": { - "const": "enable_keyword", - "type": "string" - } - }, - "required": [ - "type", - "ad_group_id", - "criterion_id" - ], - "type": "object" - }, - { - "description": "Pause a whole campaign (stops all its spend)", - "properties": { - "campaign_id": { - "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)", - "pattern": "^\\d+$", - "type": "string" - }, - "type": { - "const": "pause_campaign", - "type": "string" - } - }, - "required": [ - "type", - "campaign_id" - ], - "type": "object" - }, - { - "description": "Turn a paused campaign back on. It starts spending again; the summary says how much", - "properties": { - "campaign_id": { - "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)", - "pattern": "^\\d+$", - "type": "string" - }, - "type": { - "const": "enable_campaign", - "type": "string" - } - }, - "required": [ - "type", - "campaign_id" - ], - "type": "object" - }, - { - "description": "Pause one ad group", - "properties": { - "ad_group_id": { - "description": "Ad group id, digits only (ad_group.id from run_gaql)", - "pattern": "^\\d+$", - "type": "string" - }, - "type": { - "const": "pause_ad_group", - "type": "string" - } - }, - "required": [ - "type", - "ad_group_id" - ], - "type": "object" - }, - { - "description": "Re-enable one paused ad group", - "properties": { - "ad_group_id": { - "description": "Ad group id, digits only (ad_group.id from run_gaql)", - "pattern": "^\\d+$", - "type": "string" - }, - "type": { - "const": "enable_ad_group", - "type": "string" - } - }, - "required": [ - "type", - "ad_group_id" - ], - "type": "object" - }, - { - "description": "Change a campaign's daily budget (not shared budgets)", - "properties": { - "amount": { - "description": "New average daily budget in the account's currency, e.g. 10 for $10.00/day (not micros)", - "exclusiveMinimum": 0, - "maximum": 1000000, - "type": "number" - }, - "campaign_id": { - "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)", - "pattern": "^\\d+$", - "type": "string" - }, - "type": { - "const": "set_daily_budget", - "type": "string" - } - }, - "required": [ - "type", - "campaign_id", - "amount" - ], - "type": "object" - }, - { - "description": "Set the last day a campaign runs, so it stops spending on its own", - "properties": { - "campaign_id": { - "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)", - "pattern": "^\\d+$", - "type": "string" - }, - "end_date": { - "anyOf": [ - { - "pattern": "^\\d{4}-\\d{2}-\\d{2}$", - "type": "string" - }, - { - "const": "none", - "type": "string" - } - ], - "description": "Last day the campaign runs, YYYY-MM-DD in the account's time zone (it stops after 23:59:59 that day), or \"none\" to remove the end date" - }, - "type": { - "const": "set_end_date", - "type": "string" - } - }, - "required": [ - "type", - "campaign_id", - "end_date" - ], - "type": "object" - }, - { - "description": "Build a new Search campaign with its ad groups, keywords, ads, targeting, negatives and sitelinks, in one step. It is created PAUSED: nothing spends until a separate enable_campaign", - "properties": { - "ad_groups": { - "items": { - "properties": { - "ads": { - "items": { - "description": "A responsive search ad", - "properties": { - "descriptions": { - "description": "2 to 4 descriptions, each at most 90 characters", - "items": { - "maxLength": 90, - "minLength": 1, - "type": "string" - }, - "maxItems": 4, - "minItems": 2, - "type": "array" - }, - "final_url": { - "description": "The landing page", - "maxLength": 2048, - "pattern": "^https?:\\/\\/", - "type": "string" - }, - "headlines": { - "description": "3 to 15 headlines, each at most 30 characters", - "items": { - "maxLength": 30, - "minLength": 1, - "type": "string" - }, - "maxItems": 15, - "minItems": 3, - "type": "array" - }, - "path1": { - "description": "Display path part 1, at most 15 characters", - "maxLength": 15, - "minLength": 1, - "type": "string" - }, - "path2": { - "description": "Display path part 2, at most 15 characters", - "maxLength": 15, - "minLength": 1, - "type": "string" - } - }, - "required": [ - "headlines", - "descriptions", - "final_url" - ], - "type": "object" - }, - "maxItems": 3, - "minItems": 1, - "type": "array" - }, - "default_max_cpc": { - "description": "Default max cost per click for the ad group (required when the campaign uses manual CPC)", - "exclusiveMinimum": 0, - "maximum": 1000, - "type": "number" - }, - "keywords": { - "items": { - "properties": { - "match_type": { - "description": "PHRASE matches searches containing the words in order; the usual choice", - "enum": [ - "EXACT", - "PHRASE", - "BROAD" - ], - "type": "string" - }, - "max_cpc": { - "description": "Max cost per click for this keyword in the account's currency (manual CPC only); omit to use the ad group's", - "exclusiveMinimum": 0, - "maximum": 1000, - "type": "number" - }, - "text": { - "description": "The keyword, e.g. \"cleaning invoice template\"", - "maxLength": 80, - "minLength": 1, - "type": "string" - } - }, - "required": [ - "text", - "match_type" - ], - "type": "object" - }, - "maxItems": 50, - "minItems": 1, - "type": "array" - }, - "name": { - "maxLength": 255, - "minLength": 1, - "type": "string" - } - }, - "required": [ - "name", - "keywords", - "ads" - ], - "type": "object" - }, - "maxItems": 10, - "minItems": 1, - "type": "array" - }, - "bidding": { - "default": "MANUAL_CPC", - "description": "MANUAL_CPC uses the ad group and keyword max CPCs; MAXIMIZE_CLICKS and MAXIMIZE_CONVERSIONS let Google bid within the budget", - "enum": [ - "MANUAL_CPC", - "MAXIMIZE_CLICKS", - "MAXIMIZE_CONVERSIONS" - ], - "type": "string" - }, - "daily_budget": { - "description": "Average daily budget in the account's currency, e.g. 20 for $20.00/day", - "exclusiveMinimum": 0, - "maximum": 1000000, - "type": "number" - }, - "end_date": { - "description": "Last day the campaign runs, YYYY-MM-DD", - "pattern": "^\\d{4}-\\d{2}-\\d{2}$", - "type": "string" - }, - "language_ids": { - "default": [ - "1000" - ], - "description": "Google language ids, e.g. 1000 English, 1003 Spanish", - "items": { - "pattern": "^\\d+$", - "type": "string" - }, - "maxItems": 20, - "minItems": 1, - "type": "array" - }, - "location_ids": { - "default": [ - "2840" - ], - "description": "Google geo target ids, e.g. 2840 United States, 2826 United Kingdom, 2124 Canada (look others up in geo_target_constant)", - "items": { - "pattern": "^\\d+$", - "type": "string" - }, - "maxItems": 50, - "minItems": 1, - "type": "array" - }, - "max_cpc_ceiling": { - "description": "MAXIMIZE_CLICKS only: the most Google may bid per click", - "exclusiveMinimum": 0, - "maximum": 1000, - "type": "number" - }, - "name": { - "description": "Campaign name; must not match an existing campaign", - "maxLength": 255, - "minLength": 1, - "type": "string" - }, - "negative_keywords": { - "default": [], - "description": "Searches to block across the campaign", - "items": { - "properties": { - "match_type": { - "enum": [ - "EXACT", - "PHRASE", - "BROAD" - ], - "type": "string" - }, - "text": { - "maxLength": 80, - "minLength": 1, - "type": "string" - } - }, - "required": [ - "text", - "match_type" - ], - "type": "object" - }, - "maxItems": 200, - "type": "array" - }, - "presence_only": { - "default": true, - "description": "Show ads only to people IN the locations (true), not merely interested in them", - "type": "boolean" - }, - "search_partners": { - "default": false, - "description": "Also show on Google's search partner sites", - "type": "boolean" - }, - "sitelinks": { - "default": [], - "items": { - "properties": { - "description1": { - "description": "At most 35 characters; give both descriptions or neither", - "maxLength": 35, - "minLength": 1, - "type": "string" - }, - "description2": { - "maxLength": 35, - "minLength": 1, - "type": "string" - }, - "text": { - "description": "Link text, at most 25 characters", - "maxLength": 25, - "minLength": 1, - "type": "string" - }, - "url": { - "maxLength": 2048, - "pattern": "^https?:\\/\\/", - "type": "string" - } - }, - "required": [ - "text", - "url" - ], - "type": "object" - }, - "maxItems": 8, - "type": "array" - }, - "type": { - "const": "create_campaign", - "type": "string" - } - }, - "required": [ - "type", - "name", - "daily_budget", - "ad_groups" - ], - "type": "object" - }, - { - "description": "Build a new Display campaign (image ads across Google's Display Network of sites and apps) with ad groups and responsive display ads. Google's optimized targeting finds the audience. It is created PAUSED: nothing spends until a separate enable_campaign", - "properties": { - "ad_groups": { - "items": { - "properties": { - "ads": { - "items": { - "description": "A responsive display ad: Google assembles ads from these headlines, descriptions and images", - "properties": { - "business_name": { - "description": "The advertiser's name, at most 25 characters", - "maxLength": 25, - "minLength": 1, - "type": "string" - }, - "descriptions": { - "description": "1 to 5 descriptions, each at most 90 characters", - "items": { - "maxLength": 90, - "minLength": 1, - "type": "string" - }, - "maxItems": 5, - "minItems": 1, - "type": "array" - }, - "final_url": { - "description": "The landing page", - "maxLength": 2048, - "pattern": "^https?:\\/\\/", - "type": "string" - }, - "headlines": { - "description": "1 to 5 short headlines, each at most 30 characters", - "items": { - "maxLength": 30, - "minLength": 1, - "type": "string" - }, - "maxItems": 5, - "minItems": 1, - "type": "array" - }, - "logo_images": { - "default": [], - "description": "0 to 5 landscape logos, 4:1 (e.g. 1200×300, at least 512×128)", - "items": { - "description": "An https URL of a PNG, JPEG or GIF (at most 5120 KB), or the id of an image asset already in the account (asset.id from run_gaql WHERE asset.type = 'IMAGE')", - "maxLength": 2048, - "minLength": 1, - "type": "string" - }, - "maxItems": 5, - "minItems": 0, - "type": "array" - }, - "long_headline": { - "description": "One long headline, at most 90 characters", - "maxLength": 90, - "minLength": 1, - "type": "string" - }, - "marketing_images": { - "description": "1 to 15 landscape images, 1.91:1 (e.g. 1200×628, at least 600×314)", - "items": { - "description": "An https URL of a PNG, JPEG or GIF (at most 5120 KB), or the id of an image asset already in the account (asset.id from run_gaql WHERE asset.type = 'IMAGE')", - "maxLength": 2048, - "minLength": 1, - "type": "string" - }, - "maxItems": 15, - "minItems": 1, - "type": "array" - }, - "square_logo_images": { - "default": [], - "description": "0 to 5 square logos, 1:1 (e.g. 1200×1200, at least 128×128)", - "items": { - "description": "An https URL of a PNG, JPEG or GIF (at most 5120 KB), or the id of an image asset already in the account (asset.id from run_gaql WHERE asset.type = 'IMAGE')", - "maxLength": 2048, - "minLength": 1, - "type": "string" - }, - "maxItems": 5, - "minItems": 0, - "type": "array" - }, - "square_marketing_images": { - "description": "1 to 15 square images, 1:1 (e.g. 1200×1200, at least 300×300)", - "items": { - "description": "An https URL of a PNG, JPEG or GIF (at most 5120 KB), or the id of an image asset already in the account (asset.id from run_gaql WHERE asset.type = 'IMAGE')", - "maxLength": 2048, - "minLength": 1, - "type": "string" - }, - "maxItems": 15, - "minItems": 1, - "type": "array" - } - }, - "required": [ - "headlines", - "long_headline", - "descriptions", - "business_name", - "final_url", - "marketing_images", - "square_marketing_images" - ], - "type": "object" - }, - "maxItems": 3, - "minItems": 1, - "type": "array" - }, - "default_max_cpc": { - "description": "Default max cost per click (required when the campaign uses manual CPC)", - "exclusiveMinimum": 0, - "maximum": 1000, - "type": "number" - }, - "name": { - "maxLength": 255, - "minLength": 1, - "type": "string" - } - }, - "required": [ - "name", - "ads" - ], - "type": "object" - }, - "maxItems": 5, - "minItems": 1, - "type": "array" - }, - "bidding": { - "default": "MAXIMIZE_CLICKS", - "description": "MANUAL_CPC uses the ad groups' max CPCs; MAXIMIZE_CLICKS and MAXIMIZE_CONVERSIONS let Google bid within the budget", - "enum": [ - "MANUAL_CPC", - "MAXIMIZE_CLICKS", - "MAXIMIZE_CONVERSIONS" - ], - "type": "string" - }, - "daily_budget": { - "description": "Average daily budget in the account's currency, e.g. 20 for $20.00/day", - "exclusiveMinimum": 0, - "maximum": 1000000, - "type": "number" - }, - "end_date": { - "description": "Last day the campaign runs, YYYY-MM-DD", - "pattern": "^\\d{4}-\\d{2}-\\d{2}$", - "type": "string" - }, - "language_ids": { - "default": [ - "1000" - ], - "description": "Google language ids, e.g. 1000 English", - "items": { - "pattern": "^\\d+$", - "type": "string" - }, - "maxItems": 20, - "minItems": 1, - "type": "array" - }, - "location_ids": { - "default": [ - "2840" - ], - "description": "Google geo target ids, e.g. 2840 United States", - "items": { - "pattern": "^\\d+$", - "type": "string" - }, - "maxItems": 50, - "minItems": 1, - "type": "array" - }, - "max_cpc_ceiling": { - "description": "MAXIMIZE_CLICKS only: the most Google may bid per click", - "exclusiveMinimum": 0, - "maximum": 1000, - "type": "number" - }, - "name": { - "description": "Campaign name; must not match an existing campaign", - "maxLength": 255, - "minLength": 1, - "type": "string" - }, - "presence_only": { - "default": true, - "description": "Show ads only to people IN the locations (true), not merely interested in them", - "type": "boolean" - }, - "type": { - "const": "create_display_campaign", - "type": "string" - } - }, - "required": [ - "type", - "name", - "daily_budget", - "ad_groups" - ], - "type": "object" - }, - { - "description": "Build a new Demand Gen campaign with YouTube video ads, which is how to advertise on YouTube through the API (Google doesn't allow creating Video campaigns there). It is created PAUSED: nothing spends until a separate enable_campaign", - "properties": { - "ad_groups": { - "items": { - "properties": { - "ads": { - "items": { - "description": "A Demand Gen video ad: runs on YouTube (in-stream, in-feed and Shorts), Discover and Gmail", - "properties": { - "business_name": { - "description": "The advertiser's name, at most 25 characters", - "maxLength": 25, - "minLength": 1, - "type": "string" - }, - "descriptions": { - "description": "1 to 5 descriptions, each at most 90 characters", - "items": { - "maxLength": 90, - "minLength": 1, - "type": "string" - }, - "maxItems": 5, - "minItems": 1, - "type": "array" - }, - "final_url": { - "description": "The landing page", - "maxLength": 2048, - "pattern": "^https?:\\/\\/", - "type": "string" - }, - "headlines": { - "description": "1 to 5 headlines, each at most 40 characters", - "items": { - "maxLength": 40, - "minLength": 1, - "type": "string" - }, - "maxItems": 5, - "minItems": 1, - "type": "array" - }, - "logo_image": { - "description": "A square 1:1 logo (e.g. 1200×1200, at least 128×128): an https URL, or an image asset id from the account", - "maxLength": 2048, - "minLength": 1, - "type": "string" - }, - "long_headlines": { - "description": "1 to 5 long headlines, each at most 90 characters", - "items": { - "maxLength": 90, - "minLength": 1, - "type": "string" - }, - "maxItems": 5, - "minItems": 1, - "type": "array" - }, - "videos": { - "description": "1 to 5 YouTube videos", - "items": { - "description": "A YouTube video id (e.g. dQw4w9WgXcQ) or its youtube.com / youtu.be URL. The video must be public or unlisted", - "maxLength": 200, - "minLength": 1, - "type": "string" - }, - "maxItems": 5, - "minItems": 1, - "type": "array" - } - }, - "required": [ - "videos", - "headlines", - "long_headlines", - "descriptions", - "business_name", - "logo_image", - "final_url" - ], - "type": "object" - }, - "maxItems": 3, - "minItems": 1, - "type": "array" - }, - "language_ids": { - "default": [ - "1000" - ], - "description": "Google language ids, e.g. 1000 English", - "items": { - "pattern": "^\\d+$", - "type": "string" - }, - "maxItems": 20, - "minItems": 1, - "type": "array" - }, - "location_ids": { - "default": [ - "2840" - ], - "description": "Google geo target ids, e.g. 2840 United States (Demand Gen targets locations per ad group, not per campaign)", - "items": { - "pattern": "^\\d+$", - "type": "string" - }, - "maxItems": 50, - "minItems": 1, - "type": "array" - }, - "name": { - "maxLength": 255, - "minLength": 1, - "type": "string" - } - }, - "required": [ - "name", - "ads" - ], - "type": "object" - }, - "maxItems": 5, - "minItems": 1, - "type": "array" - }, - "bidding": { - "default": "MAXIMIZE_CONVERSIONS", - "description": "Demand Gen bids automatically: MAXIMIZE_CONVERSIONS (needs conversion tracking) or MAXIMIZE_CLICKS", - "enum": [ - "MAXIMIZE_CONVERSIONS", - "MAXIMIZE_CLICKS" - ], - "type": "string" - }, - "daily_budget": { - "description": "Average daily budget in the account's currency, e.g. 20 for $20.00/day", - "exclusiveMinimum": 0, - "maximum": 1000000, - "type": "number" - }, - "end_date": { - "description": "Last day the campaign runs, YYYY-MM-DD", - "pattern": "^\\d{4}-\\d{2}-\\d{2}$", - "type": "string" - }, - "name": { - "description": "Campaign name; must not match an existing campaign", - "maxLength": 255, - "minLength": 1, - "type": "string" - }, - "type": { - "const": "create_demand_gen_campaign", - "type": "string" - } - }, - "required": [ - "type", - "name", - "daily_budget", - "ad_groups" - ], - "type": "object" - }, - { - "description": "Add an ad group, with its keywords and ads, to an existing Search campaign", - "properties": { - "ad_group": { - "properties": { - "ads": { - "items": { - "description": "A responsive search ad", - "properties": { - "descriptions": { - "description": "2 to 4 descriptions, each at most 90 characters", - "items": { - "maxLength": 90, - "minLength": 1, - "type": "string" - }, - "maxItems": 4, - "minItems": 2, - "type": "array" - }, - "final_url": { - "description": "The landing page", - "maxLength": 2048, - "pattern": "^https?:\\/\\/", - "type": "string" - }, - "headlines": { - "description": "3 to 15 headlines, each at most 30 characters", - "items": { - "maxLength": 30, - "minLength": 1, - "type": "string" - }, - "maxItems": 15, - "minItems": 3, - "type": "array" - }, - "path1": { - "description": "Display path part 1, at most 15 characters", - "maxLength": 15, - "minLength": 1, - "type": "string" - }, - "path2": { - "description": "Display path part 2, at most 15 characters", - "maxLength": 15, - "minLength": 1, - "type": "string" - } - }, - "required": [ - "headlines", - "descriptions", - "final_url" - ], - "type": "object" - }, - "maxItems": 3, - "minItems": 1, - "type": "array" - }, - "default_max_cpc": { - "description": "Default max cost per click for the ad group (required when the campaign uses manual CPC)", - "exclusiveMinimum": 0, - "maximum": 1000, - "type": "number" - }, - "keywords": { - "items": { - "properties": { - "match_type": { - "description": "PHRASE matches searches containing the words in order; the usual choice", - "enum": [ - "EXACT", - "PHRASE", - "BROAD" - ], - "type": "string" - }, - "max_cpc": { - "description": "Max cost per click for this keyword in the account's currency (manual CPC only); omit to use the ad group's", - "exclusiveMinimum": 0, - "maximum": 1000, - "type": "number" - }, - "text": { - "description": "The keyword, e.g. \"cleaning invoice template\"", - "maxLength": 80, - "minLength": 1, - "type": "string" - } - }, - "required": [ - "text", - "match_type" - ], - "type": "object" - }, - "maxItems": 50, - "minItems": 1, - "type": "array" - }, - "name": { - "maxLength": 255, - "minLength": 1, - "type": "string" - } - }, - "required": [ - "name", - "keywords", - "ads" - ], - "type": "object" - }, - "campaign_id": { - "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)", - "pattern": "^\\d+$", - "type": "string" - }, - "type": { - "const": "add_ad_group", - "type": "string" - } - }, - "required": [ - "type", - "campaign_id", - "ad_group" - ], - "type": "object" - }, - { - "description": "Add keywords to an existing ad group", - "properties": { - "ad_group_id": { - "description": "Ad group id, digits only (ad_group.id from run_gaql)", - "pattern": "^\\d+$", - "type": "string" - }, - "keywords": { - "items": { - "properties": { - "match_type": { - "description": "PHRASE matches searches containing the words in order; the usual choice", - "enum": [ - "EXACT", - "PHRASE", - "BROAD" - ], - "type": "string" - }, - "max_cpc": { - "description": "Max cost per click for this keyword in the account's currency (manual CPC only); omit to use the ad group's", - "exclusiveMinimum": 0, - "maximum": 1000, - "type": "number" - }, - "text": { - "description": "The keyword, e.g. \"cleaning invoice template\"", - "maxLength": 80, - "minLength": 1, - "type": "string" - } - }, - "required": [ - "text", - "match_type" - ], - "type": "object" - }, - "maxItems": 50, - "minItems": 1, - "type": "array" - }, - "type": { - "const": "add_keywords", - "type": "string" - } - }, - "required": [ - "type", - "ad_group_id", - "keywords" - ], - "type": "object" - }, - { - "description": "Add a responsive search ad to an existing ad group", - "properties": { - "ad": { - "description": "A responsive search ad", - "properties": { - "descriptions": { - "description": "2 to 4 descriptions, each at most 90 characters", - "items": { - "maxLength": 90, - "minLength": 1, - "type": "string" - }, - "maxItems": 4, - "minItems": 2, - "type": "array" - }, - "final_url": { - "description": "The landing page", - "maxLength": 2048, - "pattern": "^https?:\\/\\/", - "type": "string" - }, - "headlines": { - "description": "3 to 15 headlines, each at most 30 characters", - "items": { - "maxLength": 30, - "minLength": 1, - "type": "string" - }, - "maxItems": 15, - "minItems": 3, - "type": "array" - }, - "path1": { - "description": "Display path part 1, at most 15 characters", - "maxLength": 15, - "minLength": 1, - "type": "string" - }, - "path2": { - "description": "Display path part 2, at most 15 characters", - "maxLength": 15, - "minLength": 1, - "type": "string" - } - }, - "required": [ - "headlines", - "descriptions", - "final_url" - ], - "type": "object" - }, - "ad_group_id": { - "description": "Ad group id, digits only (ad_group.id from run_gaql)", - "pattern": "^\\d+$", - "type": "string" - }, - "type": { - "const": "add_responsive_search_ad", - "type": "string" - } - }, - "required": [ - "type", - "ad_group_id", - "ad" - ], - "type": "object" - }, - { - "description": "Add sitelinks to a campaign", - "properties": { - "campaign_id": { - "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)", - "pattern": "^\\d+$", - "type": "string" - }, - "sitelinks": { - "items": { - "properties": { - "description1": { - "description": "At most 35 characters; give both descriptions or neither", - "maxLength": 35, - "minLength": 1, - "type": "string" - }, - "description2": { - "maxLength": 35, - "minLength": 1, - "type": "string" - }, - "text": { - "description": "Link text, at most 25 characters", - "maxLength": 25, - "minLength": 1, - "type": "string" - }, - "url": { - "maxLength": 2048, - "pattern": "^https?:\\/\\/", - "type": "string" - } - }, - "required": [ - "text", - "url" - ], - "type": "object" - }, - "maxItems": 8, - "minItems": 1, - "type": "array" - }, - "type": { - "const": "add_sitelinks", - "type": "string" - } - }, - "required": [ - "type", - "campaign_id", - "sitelinks" - ], - "type": "object" - }, - { - "description": "Make a campaign count and bid on ONE conversion category only (e.g. SIGNUP), so another product's or step's conversions don't steer it", - "properties": { - "campaign_id": { - "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)", - "pattern": "^\\d+$", - "type": "string" - }, - "category": { - "description": "Conversion category, e.g. SIGNUP, PURCHASE, SUBMIT_LEAD_FORM, QUALIFIED_LEAD (see conversion_action.category in run_gaql)", - "pattern": "^[A-Z_]+$", - "type": "string" - }, - "type": { - "const": "set_conversion_goal", - "type": "string" - } - }, - "required": [ - "type", - "campaign_id", - "category" - ], - "type": "object" - }, - { - "description": "Change one keyword's max CPC (manual CPC campaigns)", - "properties": { - "ad_group_id": { - "description": "Ad group id, digits only (ad_group.id from run_gaql)", - "pattern": "^\\d+$", - "type": "string" - }, - "criterion_id": { - "description": "Keyword criterion id, digits only (ad_group_criterion.criterion_id from run_gaql)", - "pattern": "^\\d+$", - "type": "string" - }, - "max_cpc": { - "anyOf": [ - { - "exclusiveMinimum": 0, - "maximum": 1000, - "type": "number" - }, - { - "type": "null" - } - ], - "description": "New max cost per click for this keyword, or null to clear it so the keyword uses the ad group's bid" - }, - "type": { - "const": "set_keyword_bid", - "type": "string" - } - }, - "required": [ - "type", - "ad_group_id", - "criterion_id", - "max_cpc" - ], - "type": "object" - }, - { - "description": "Change an ad group's default max CPC, which its keywords use unless they have their own", - "properties": { - "ad_group_id": { - "description": "Ad group id, digits only (ad_group.id from run_gaql)", - "pattern": "^\\d+$", - "type": "string" - }, - "max_cpc": { - "description": "New default max cost per click for the ad group", - "exclusiveMinimum": 0, - "maximum": 1000, - "type": "number" - }, - "type": { - "const": "set_ad_group_bid", - "type": "string" - } - }, - "required": [ - "type", - "ad_group_id", - "max_cpc" - ], - "type": "object" - }, - { - "description": "Pause one ad", - "properties": { - "ad_group_id": { - "description": "Ad group id, digits only (ad_group.id from run_gaql)", - "pattern": "^\\d+$", - "type": "string" - }, - "ad_id": { - "description": "Ad id, digits only (ad_group_ad.ad.id from run_gaql)", - "pattern": "^\\d+$", - "type": "string" - }, - "type": { - "const": "pause_ad", - "type": "string" - } - }, - "required": [ - "type", - "ad_group_id", - "ad_id" - ], - "type": "object" - }, - { - "description": "Re-enable one paused ad", - "properties": { - "ad_group_id": { - "description": "Ad group id, digits only (ad_group.id from run_gaql)", - "pattern": "^\\d+$", - "type": "string" - }, - "ad_id": { - "description": "Ad id, digits only (ad_group_ad.ad.id from run_gaql)", - "pattern": "^\\d+$", - "type": "string" - }, - "type": { - "const": "enable_ad", - "type": "string" - } - }, - "required": [ - "type", - "ad_group_id", - "ad_id" - ], - "type": "object" - }, - { - "description": "Add locations and/or languages a campaign targets", - "properties": { - "campaign_id": { - "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)", - "pattern": "^\\d+$", - "type": "string" - }, - "language_ids": { - "default": [], - "description": "Language ids to add, e.g. 1000 English", - "items": { - "pattern": "^\\d+$", - "type": "string" - }, - "maxItems": 20, - "type": "array" - }, - "location_ids": { - "default": [], - "description": "Geo target ids to add, e.g. 2840 United States", - "items": { - "pattern": "^\\d+$", - "type": "string" - }, - "maxItems": 50, - "type": "array" - }, - "type": { - "const": "add_campaign_targeting", - "type": "string" - } - }, - "required": [ - "type", - "campaign_id" - ], - "type": "object" - }, - { - "description": "Stop targeting some of a campaign's locations and/or languages", - "properties": { - "campaign_id": { - "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)", - "pattern": "^\\d+$", - "type": "string" - }, - "language_ids": { - "default": [], - "items": { - "pattern": "^\\d+$", - "type": "string" - }, - "maxItems": 20, - "type": "array" - }, - "location_ids": { - "default": [], - "items": { - "pattern": "^\\d+$", - "type": "string" - }, - "maxItems": 50, - "type": "array" - }, - "type": { - "const": "remove_campaign_targeting", - "type": "string" - } - }, - "required": [ - "type", - "campaign_id" - ], - "type": "object" - }, - { - "description": "Choose whether a campaign shows to people in its locations only, or also to people interested in them", - "properties": { - "campaign_id": { - "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)", - "pattern": "^\\d+$", - "type": "string" - }, - "presence_only": { - "description": "true: only people IN the locations; false: also people interested in them", - "type": "boolean" - }, - "type": { - "const": "set_location_mode", - "type": "string" - } - }, - "required": [ - "type", - "campaign_id", - "presence_only" - ], - "type": "object" - }, - { - "description": "Switch a campaign's bid strategy. Google re-learns after a switch, so performance can wobble for a week or two", - "properties": { - "campaign_id": { - "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)", - "pattern": "^\\d+$", - "type": "string" - }, - "max_cpc_ceiling": { - "description": "MAXIMIZE_CLICKS only: the most Google may bid per click", - "exclusiveMinimum": 0, - "maximum": 1000, - "type": "number" - }, - "strategy": { - "enum": [ - "MANUAL_CPC", - "MAXIMIZE_CLICKS", - "MAXIMIZE_CONVERSIONS" - ], - "type": "string" - }, - "target_cpa": { - "description": "MAXIMIZE_CONVERSIONS only: target cost per conversion", - "exclusiveMinimum": 0, - "maximum": 1000, - "type": "number" - }, - "type": { - "const": "set_bidding_strategy", - "type": "string" - } - }, - "required": [ - "type", - "campaign_id", - "strategy" - ], - "type": "object" - }, - { - "description": "Set or clear a campaign's final URL suffix (tracking parameters on every ad click)", - "properties": { - "campaign_id": { - "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)", - "pattern": "^\\d+$", - "type": "string" - }, - "suffix": { - "description": "Query string Google appends to every landing page in the campaign, e.g. \"utm_source=google&utm_medium=cpc&utm_term={keyword}\", or \"none\" to clear it", - "maxLength": 1000, - "type": "string" - }, - "type": { - "const": "set_url_suffix", - "type": "string" - } - }, - "required": [ - "type", - "campaign_id", - "suffix" - ], - "type": "object" - }, - { - "description": "Create a conversion action to measure sign-ups, leads or purchases", - "properties": { - "category": { - "description": "Conversion category, e.g. SIGNUP, PURCHASE, SUBMIT_LEAD_FORM, QUALIFIED_LEAD (see conversion_action.category in run_gaql)", - "pattern": "^[A-Z_]+$", - "type": "string" - }, - "counting": { - "default": "ONE_PER_CLICK", - "description": "ONE_PER_CLICK for sign-ups and leads; MANY_PER_CLICK for purchases", - "enum": [ - "ONE_PER_CLICK", - "MANY_PER_CLICK" - ], - "type": "string" - }, - "default_value": { - "description": "Value per conversion when none is sent", - "maximum": 1000000, - "minimum": 0, - "type": "number" - }, - "name": { - "maxLength": 100, - "minLength": 1, - "type": "string" - }, - "primary": { - "default": true, - "description": "Primary actions count in Conversions and can steer bidding", - "type": "boolean" - }, - "source": { - "default": "UPLOAD_CLICKS", - "description": "UPLOAD_CLICKS: your server uploads ad click ids (no Google tag). WEBPAGE: Google gives you a tag to put on the page", - "enum": [ - "UPLOAD_CLICKS", - "WEBPAGE" - ], - "type": "string" - }, - "type": { - "const": "create_conversion_action", - "type": "string" - } - }, - "required": [ - "type", - "name", - "category" - ], - "type": "object" - }, - { - "description": "Set how many conversions one ad click can produce for a conversion action", - "properties": { - "conversion_action_id": { - "description": "conversion_action.id from run_gaql", - "pattern": "^\\d+$", - "type": "string" - }, - "counting": { - "enum": [ - "ONE_PER_CLICK", - "MANY_PER_CLICK" - ], - "type": "string" - }, - "type": { - "const": "set_conversion_counting", - "type": "string" - } - }, - "required": [ - "type", - "conversion_action_id", - "counting" - ], - "type": "object" - } -]New value: +[ + { + "description": "Block searches containing these words in one campaign", + "properties": { + "campaign_id": { + "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "keywords": { + "items": { + "properties": { + "match_type": { + "description": "PHRASE blocks any search containing the words in order; the usual choice", + "enum": [ + "EXACT", + "PHRASE", + "BROAD" + ], + "type": "string" + }, + "text": { + "description": "The search words to block, e.g. \"free\"", + "maxLength": 80, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "text", + "match_type" + ], + "type": "object" + }, + "maxItems": 50, + "minItems": 1, + "type": "array" + }, + "type": { + "const": "add_negative_keywords", + "type": "string" + } + }, + "required": [ + "type", + "campaign_id", + "keywords" + ], + "type": "object" + }, + { + "description": "Pause one keyword", + "properties": { + "ad_group_id": { + "description": "Ad group id, digits only (ad_group.id from run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "criterion_id": { + "description": "Keyword criterion id, digits only (ad_group_criterion.criterion_id from run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "type": { + "const": "pause_keyword", + "type": "string" + } + }, + "required": [ + "type", + "ad_group_id", + "criterion_id" + ], + "type": "object" + }, + { + "description": "Re-enable one paused keyword", + "properties": { + "ad_group_id": { + "description": "Ad group id, digits only (ad_group.id from run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "criterion_id": { + "description": "Keyword criterion id, digits only (ad_group_criterion.criterion_id from run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "type": { + "const": "enable_keyword", + "type": "string" + } + }, + "required": [ + "type", + "ad_group_id", + "criterion_id" + ], + "type": "object" + }, + { + "description": "Pause a whole campaign (stops all its spend)", + "properties": { + "campaign_id": { + "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "type": { + "const": "pause_campaign", + "type": "string" + } + }, + "required": [ + "type", + "campaign_id" + ], + "type": "object" + }, + { + "description": "Turn a paused campaign back on. It starts spending again; the summary says how much", + "properties": { + "campaign_id": { + "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "type": { + "const": "enable_campaign", + "type": "string" + } + }, + "required": [ + "type", + "campaign_id" + ], + "type": "object" + }, + { + "description": "Pause one ad group", + "properties": { + "ad_group_id": { + "description": "Ad group id, digits only (ad_group.id from run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "type": { + "const": "pause_ad_group", + "type": "string" + } + }, + "required": [ + "type", + "ad_group_id" + ], + "type": "object" + }, + { + "description": "Re-enable one paused ad group", + "properties": { + "ad_group_id": { + "description": "Ad group id, digits only (ad_group.id from run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "type": { + "const": "enable_ad_group", + "type": "string" + } + }, + "required": [ + "type", + "ad_group_id" + ], + "type": "object" + }, + { + "description": "Change a campaign's daily budget (not shared budgets)", + "properties": { + "amount": { + "description": "New average daily budget in the account's currency, e.g. 10 for $10.00/day (not micros)", + "exclusiveMinimum": 0, + "maximum": 1000000, + "type": "number" + }, + "campaign_id": { + "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "type": { + "const": "set_daily_budget", + "type": "string" + } + }, + "required": [ + "type", + "campaign_id", + "amount" + ], + "type": "object" + }, + { + "description": "Set the last day a campaign runs, so it stops spending on its own", + "properties": { + "campaign_id": { + "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "end_date": { + "anyOf": [ + { + "pattern": "^\\d{4}-\\d{2}-\\d{2}$", + "type": "string" + }, + { + "const": "none", + "type": "string" + } + ], + "description": "Last day the campaign runs, YYYY-MM-DD in the account's time zone (it stops after 23:59:59 that day), or \"none\" to remove the end date" + }, + "type": { + "const": "set_end_date", + "type": "string" + } + }, + "required": [ + "type", + "campaign_id", + "end_date" + ], + "type": "object" + }, + { + "description": "Build a new Search campaign with its ad groups, keywords, ads, targeting, negatives and sitelinks, in one step. It is created PAUSED: nothing spends until a separate enable_campaign", + "properties": { + "ad_groups": { + "items": { + "properties": { + "ads": { + "items": { + "description": "A responsive search ad", + "properties": { + "descriptions": { + "description": "2 to 4 descriptions, each at most 90 characters", + "items": { + "maxLength": 90, + "minLength": 1, + "type": "string" + }, + "maxItems": 4, + "minItems": 2, + "type": "array" + }, + "final_url": { + "description": "The landing page", + "maxLength": 2048, + "pattern": "^https?:\\/\\/", + "type": "string" + }, + "headlines": { + "description": "3 to 15 headlines, each at most 30 characters", + "items": { + "maxLength": 30, + "minLength": 1, + "type": "string" + }, + "maxItems": 15, + "minItems": 3, + "type": "array" + }, + "path1": { + "description": "Display path part 1, at most 15 characters", + "maxLength": 15, + "minLength": 1, + "type": "string" + }, + "path2": { + "description": "Display path part 2, at most 15 characters", + "maxLength": 15, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "headlines", + "descriptions", + "final_url" + ], + "type": "object" + }, + "maxItems": 3, + "minItems": 1, + "type": "array" + }, + "default_max_cpc": { + "description": "Default max cost per click for the ad group (required when the campaign uses manual CPC)", + "exclusiveMinimum": 0, + "maximum": 1000, + "type": "number" + }, + "keywords": { + "items": { + "properties": { + "match_type": { + "description": "PHRASE matches searches containing the words in order; the usual choice", + "enum": [ + "EXACT", + "PHRASE", + "BROAD" + ], + "type": "string" + }, + "max_cpc": { + "description": "Max cost per click for this keyword in the account's currency (manual CPC only); omit to use the ad group's", + "exclusiveMinimum": 0, + "maximum": 1000, + "type": "number" + }, + "text": { + "description": "The keyword, e.g. \"cleaning invoice template\"", + "maxLength": 80, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "text", + "match_type" + ], + "type": "object" + }, + "maxItems": 50, + "minItems": 1, + "type": "array" + }, + "name": { + "maxLength": 255, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "name", + "keywords", + "ads" + ], + "type": "object" + }, + "maxItems": 10, + "minItems": 1, + "type": "array" + }, + "bidding": { + "default": "MANUAL_CPC", + "description": "MANUAL_CPC uses the ad group and keyword max CPCs; MAXIMIZE_CLICKS and MAXIMIZE_CONVERSIONS let Google bid within the budget", + "enum": [ + "MANUAL_CPC", + "MAXIMIZE_CLICKS", + "MAXIMIZE_CONVERSIONS" + ], + "type": "string" + }, + "daily_budget": { + "description": "Average daily budget in the account's currency, e.g. 20 for $20.00/day", + "exclusiveMinimum": 0, + "maximum": 1000000, + "type": "number" + }, + "end_date": { + "description": "Last day the campaign runs, YYYY-MM-DD", + "pattern": "^\\d{4}-\\d{2}-\\d{2}$", + "type": "string" + }, + "language_ids": { + "default": [ + "1000" + ], + "description": "Google language ids, e.g. 1000 English, 1003 Spanish", + "items": { + "pattern": "^\\d+$", + "type": "string" + }, + "maxItems": 20, + "minItems": 1, + "type": "array" + }, + "location_ids": { + "default": [ + "2840" + ], + "description": "Google geo target ids, e.g. 2840 United States, 2826 United Kingdom, 2124 Canada (look others up in geo_target_constant)", + "items": { + "pattern": "^\\d+$", + "type": "string" + }, + "maxItems": 50, + "minItems": 1, + "type": "array" + }, + "max_cpc_ceiling": { + "description": "MAXIMIZE_CLICKS only: the most Google may bid per click", + "exclusiveMinimum": 0, + "maximum": 1000, + "type": "number" + }, + "name": { + "description": "Campaign name; must not match an existing campaign", + "maxLength": 255, + "minLength": 1, + "type": "string" + }, + "negative_keywords": { + "default": [], + "description": "Searches to block across the campaign", + "items": { + "properties": { + "match_type": { + "enum": [ + "EXACT", + "PHRASE", + "BROAD" + ], + "type": "string" + }, + "text": { + "maxLength": 80, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "text", + "match_type" + ], + "type": "object" + }, + "maxItems": 200, + "type": "array" + }, + "presence_only": { + "default": true, + "description": "Show ads only to people IN the locations (true), not merely interested in them", + "type": "boolean" + }, + "search_partners": { + "default": false, + "description": "Also show on Google's search partner sites", + "type": "boolean" + }, + "sitelinks": { + "default": [], + "items": { + "properties": { + "description1": { + "description": "At most 35 characters; give both descriptions or neither", + "maxLength": 35, + "minLength": 1, + "type": "string" + }, + "description2": { + "maxLength": 35, + "minLength": 1, + "type": "string" + }, + "text": { + "description": "Link text, at most 25 characters", + "maxLength": 25, + "minLength": 1, + "type": "string" + }, + "url": { + "maxLength": 2048, + "pattern": "^https?:\\/\\/", + "type": "string" + } + }, + "required": [ + "text", + "url" + ], + "type": "object" + }, + "maxItems": 8, + "type": "array" + }, + "type": { + "const": "create_campaign", + "type": "string" + } + }, + "required": [ + "type", + "name", + "daily_budget", + "ad_groups" + ], + "type": "object" + }, + { + "description": "Build a new Display campaign (image ads across Google's Display Network of sites and apps) with ad groups and responsive display ads. Google's optimized targeting finds the audience. It is created PAUSED: nothing spends until a separate enable_campaign", + "properties": { + "ad_groups": { + "items": { + "properties": { + "ads": { + "items": { + "description": "A responsive display ad: Google assembles ads from these headlines, descriptions and images", + "properties": { + "business_name": { + "description": "The advertiser's name, at most 25 characters", + "maxLength": 25, + "minLength": 1, + "type": "string" + }, + "descriptions": { + "description": "1 to 5 descriptions, each at most 90 characters", + "items": { + "maxLength": 90, + "minLength": 1, + "type": "string" + }, + "maxItems": 5, + "minItems": 1, + "type": "array" + }, + "final_url": { + "description": "The landing page", + "maxLength": 2048, + "pattern": "^https?:\\/\\/", + "type": "string" + }, + "headlines": { + "description": "1 to 5 short headlines, each at most 30 characters", + "items": { + "maxLength": 30, + "minLength": 1, + "type": "string" + }, + "maxItems": 5, + "minItems": 1, + "type": "array" + }, + "logo_images": { + "default": [], + "description": "0 to 5 landscape logos, 4:1 (e.g. 1200×300, at least 512×128)", + "items": { + "description": "An https URL of a PNG, JPEG or GIF (at most 5120 KB), or the id of an image asset already in the account (asset.id from run_gaql WHERE asset.type = 'IMAGE')", + "maxLength": 2048, + "minLength": 1, + "type": "string" + }, + "maxItems": 5, + "minItems": 0, + "type": "array" + }, + "long_headline": { + "description": "One long headline, at most 90 characters", + "maxLength": 90, + "minLength": 1, + "type": "string" + }, + "marketing_images": { + "description": "1 to 15 landscape images, 1.91:1 (e.g. 1200×628, at least 600×314)", + "items": { + "description": "An https URL of a PNG, JPEG or GIF (at most 5120 KB), or the id of an image asset already in the account (asset.id from run_gaql WHERE asset.type = 'IMAGE')", + "maxLength": 2048, + "minLength": 1, + "type": "string" + }, + "maxItems": 15, + "minItems": 1, + "type": "array" + }, + "square_logo_images": { + "default": [], + "description": "0 to 5 square logos, 1:1 (e.g. 1200×1200, at least 128×128)", + "items": { + "description": "An https URL of a PNG, JPEG or GIF (at most 5120 KB), or the id of an image asset already in the account (asset.id from run_gaql WHERE asset.type = 'IMAGE')", + "maxLength": 2048, + "minLength": 1, + "type": "string" + }, + "maxItems": 5, + "minItems": 0, + "type": "array" + }, + "square_marketing_images": { + "description": "1 to 15 square images, 1:1 (e.g. 1200×1200, at least 300×300)", + "items": { + "description": "An https URL of a PNG, JPEG or GIF (at most 5120 KB), or the id of an image asset already in the account (asset.id from run_gaql WHERE asset.type = 'IMAGE')", + "maxLength": 2048, + "minLength": 1, + "type": "string" + }, + "maxItems": 15, + "minItems": 1, + "type": "array" + } + }, + "required": [ + "headlines", + "long_headline", + "descriptions", + "business_name", + "final_url", + "marketing_images", + "square_marketing_images" + ], + "type": "object" + }, + "maxItems": 3, + "minItems": 1, + "type": "array" + }, + "default_max_cpc": { + "description": "Default max cost per click (required when the campaign uses manual CPC)", + "exclusiveMinimum": 0, + "maximum": 1000, + "type": "number" + }, + "name": { + "maxLength": 255, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "name", + "ads" + ], + "type": "object" + }, + "maxItems": 5, + "minItems": 1, + "type": "array" + }, + "bidding": { + "default": "MAXIMIZE_CLICKS", + "description": "MANUAL_CPC uses the ad groups' max CPCs; MAXIMIZE_CLICKS and MAXIMIZE_CONVERSIONS let Google bid within the budget", + "enum": [ + "MANUAL_CPC", + "MAXIMIZE_CLICKS", + "MAXIMIZE_CONVERSIONS" + ], + "type": "string" + }, + "daily_budget": { + "description": "Average daily budget in the account's currency, e.g. 20 for $20.00/day", + "exclusiveMinimum": 0, + "maximum": 1000000, + "type": "number" + }, + "end_date": { + "description": "Last day the campaign runs, YYYY-MM-DD", + "pattern": "^\\d{4}-\\d{2}-\\d{2}$", + "type": "string" + }, + "language_ids": { + "default": [ + "1000" + ], + "description": "Google language ids, e.g. 1000 English", + "items": { + "pattern": "^\\d+$", + "type": "string" + }, + "maxItems": 20, + "minItems": 1, + "type": "array" + }, + "location_ids": { + "default": [ + "2840" + ], + "description": "Google geo target ids, e.g. 2840 United States", + "items": { + "pattern": "^\\d+$", + "type": "string" + }, + "maxItems": 50, + "minItems": 1, + "type": "array" + }, + "max_cpc_ceiling": { + "description": "MAXIMIZE_CLICKS only: the most Google may bid per click", + "exclusiveMinimum": 0, + "maximum": 1000, + "type": "number" + }, + "name": { + "description": "Campaign name; must not match an existing campaign", + "maxLength": 255, + "minLength": 1, + "type": "string" + }, + "presence_only": { + "default": true, + "description": "Show ads only to people IN the locations (true), not merely interested in them", + "type": "boolean" + }, + "type": { + "const": "create_display_campaign", + "type": "string" + } + }, + "required": [ + "type", + "name", + "daily_budget", + "ad_groups" + ], + "type": "object" + }, + { + "description": "Build a new Demand Gen campaign with YouTube video ads, which is how to advertise on YouTube through the API (Google doesn't allow creating Video campaigns there). It is created PAUSED: nothing spends until a separate enable_campaign", + "properties": { + "ad_groups": { + "items": { + "properties": { + "ads": { + "items": { + "description": "A Demand Gen video ad: runs on YouTube (in-stream, in-feed and Shorts), Discover and Gmail", + "properties": { + "business_name": { + "description": "The advertiser's name, at most 25 characters", + "maxLength": 25, + "minLength": 1, + "type": "string" + }, + "descriptions": { + "description": "1 to 5 descriptions, each at most 90 characters", + "items": { + "maxLength": 90, + "minLength": 1, + "type": "string" + }, + "maxItems": 5, + "minItems": 1, + "type": "array" + }, + "final_url": { + "description": "The landing page", + "maxLength": 2048, + "pattern": "^https?:\\/\\/", + "type": "string" + }, + "headlines": { + "description": "1 to 5 headlines, each at most 40 characters", + "items": { + "maxLength": 40, + "minLength": 1, + "type": "string" + }, + "maxItems": 5, + "minItems": 1, + "type": "array" + }, + "logo_image": { + "description": "A square 1:1 logo (e.g. 1200×1200, at least 128×128): an https URL, or an image asset id from the account", + "maxLength": 2048, + "minLength": 1, + "type": "string" + }, + "long_headlines": { + "description": "1 to 5 long headlines, each at most 90 characters", + "items": { + "maxLength": 90, + "minLength": 1, + "type": "string" + }, + "maxItems": 5, + "minItems": 1, + "type": "array" + }, + "videos": { + "description": "1 to 5 YouTube videos", + "items": { + "description": "A YouTube video id (e.g. dQw4w9WgXcQ) or its youtube.com / youtu.be URL. The video must be public or unlisted", + "maxLength": 200, + "minLength": 1, + "type": "string" + }, + "maxItems": 5, + "minItems": 1, + "type": "array" + } + }, + "required": [ + "videos", + "headlines", + "long_headlines", + "descriptions", + "business_name", + "logo_image", + "final_url" + ], + "type": "object" + }, + "maxItems": 3, + "minItems": 1, + "type": "array" + }, + "language_ids": { + "default": [ + "1000" + ], + "description": "Google language ids, e.g. 1000 English", + "items": { + "pattern": "^\\d+$", + "type": "string" + }, + "maxItems": 20, + "minItems": 1, + "type": "array" + }, + "location_ids": { + "default": [ + "2840" + ], + "description": "Google geo target ids, e.g. 2840 United States (Demand Gen targets locations per ad group, not per campaign)", + "items": { + "pattern": "^\\d+$", + "type": "string" + }, + "maxItems": 50, + "minItems": 1, + "type": "array" + }, + "name": { + "maxLength": 255, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "name", + "ads" + ], + "type": "object" + }, + "maxItems": 5, + "minItems": 1, + "type": "array" + }, + "bidding": { + "default": "MAXIMIZE_CONVERSIONS", + "description": "Demand Gen bids automatically: MAXIMIZE_CONVERSIONS (needs conversion tracking) or MAXIMIZE_CLICKS", + "enum": [ + "MAXIMIZE_CONVERSIONS", + "MAXIMIZE_CLICKS" + ], + "type": "string" + }, + "daily_budget": { + "description": "Average daily budget in the account's currency, e.g. 20 for $20.00/day", + "exclusiveMinimum": 0, + "maximum": 1000000, + "type": "number" + }, + "end_date": { + "description": "Last day the campaign runs, YYYY-MM-DD", + "pattern": "^\\d{4}-\\d{2}-\\d{2}$", + "type": "string" + }, + "name": { + "description": "Campaign name; must not match an existing campaign", + "maxLength": 255, + "minLength": 1, + "type": "string" + }, + "type": { + "const": "create_demand_gen_campaign", + "type": "string" + } + }, + "required": [ + "type", + "name", + "daily_budget", + "ad_groups" + ], + "type": "object" + }, + { + "description": "Build a new Performance Max campaign: one budget, Google places ads across Search, YouTube, Display, Discover, Gmail and Maps from the asset groups' text, images and videos. No shopping feed (non-retail). It is created PAUSED: nothing spends until a separate enable_campaign", + "properties": { + "asset_groups": { + "items": { + "description": "An asset group: the headlines, descriptions, images and videos Google combines into ads on every channel", + "properties": { + "descriptions": { + "description": "2 to 5 descriptions, each at most 90 characters; Google recommends one of 60 or fewer", + "items": { + "maxLength": 90, + "minLength": 1, + "type": "string" + }, + "maxItems": 5, + "minItems": 2, + "type": "array" + }, + "final_url": { + "description": "The landing page (Google may also send people to other pages on the same site)", + "maxLength": 2048, + "pattern": "^https?:\\/\\/", + "type": "string" + }, + "headlines": { + "description": "3 to 15 headlines, each at most 30 characters", + "items": { + "maxLength": 30, + "minLength": 1, + "type": "string" + }, + "maxItems": 15, + "minItems": 3, + "type": "array" + }, + "long_headlines": { + "description": "1 to 5 long headlines, each at most 90 characters", + "items": { + "maxLength": 90, + "minLength": 1, + "type": "string" + }, + "maxItems": 5, + "minItems": 1, + "type": "array" + }, + "marketing_images": { + "description": "1 to 20 landscape images, 1.91:1 (e.g. 1200×628)", + "items": { + "description": "An https URL of a PNG, JPEG or GIF (at most 5120 KB), or the id of an image asset already in the account (asset.id from run_gaql WHERE asset.type = 'IMAGE')", + "maxLength": 2048, + "minLength": 1, + "type": "string" + }, + "maxItems": 20, + "minItems": 1, + "type": "array" + }, + "name": { + "maxLength": 255, + "minLength": 1, + "type": "string" + }, + "portrait_marketing_images": { + "default": [], + "description": "0 to 20 portrait images, 4:5 (e.g. 960×1200)", + "items": { + "description": "An https URL of a PNG, JPEG or GIF (at most 5120 KB), or the id of an image asset already in the account (asset.id from run_gaql WHERE asset.type = 'IMAGE')", + "maxLength": 2048, + "minLength": 1, + "type": "string" + }, + "maxItems": 20, + "minItems": 0, + "type": "array" + }, + "square_marketing_images": { + "description": "1 to 20 square images, 1:1 (e.g. 1200×1200)", + "items": { + "description": "An https URL of a PNG, JPEG or GIF (at most 5120 KB), or the id of an image asset already in the account (asset.id from run_gaql WHERE asset.type = 'IMAGE')", + "maxLength": 2048, + "minLength": 1, + "type": "string" + }, + "maxItems": 20, + "minItems": 1, + "type": "array" + }, + "videos": { + "default": [], + "description": "0 to 5 YouTube videos; without one, Google may auto-generate a video from the images", + "items": { + "description": "A YouTube video id (e.g. dQw4w9WgXcQ) or its youtube.com / youtu.be URL. The video must be public or unlisted", + "maxLength": 200, + "minLength": 1, + "type": "string" + }, + "maxItems": 5, + "type": "array" + } + }, + "required": [ + "name", + "final_url", + "headlines", + "long_headlines", + "descriptions", + "marketing_images", + "square_marketing_images" + ], + "type": "object" + }, + "maxItems": 5, + "minItems": 1, + "type": "array" + }, + "bidding": { + "default": "MAXIMIZE_CONVERSIONS", + "description": "Performance Max bids for conversions only: MAXIMIZE_CONVERSIONS, or MAXIMIZE_CONVERSION_VALUE when conversions carry values", + "enum": [ + "MAXIMIZE_CONVERSIONS", + "MAXIMIZE_CONVERSION_VALUE" + ], + "type": "string" + }, + "business_name": { + "description": "The advertiser's name, at most 25 characters (linked to the campaign, per Google's brand guidelines)", + "maxLength": 25, + "minLength": 1, + "type": "string" + }, + "daily_budget": { + "description": "Average daily budget in the account's currency, e.g. 20 for $20.00/day", + "exclusiveMinimum": 0, + "maximum": 1000000, + "type": "number" + }, + "end_date": { + "description": "Last day the campaign runs, YYYY-MM-DD", + "pattern": "^\\d{4}-\\d{2}-\\d{2}$", + "type": "string" + }, + "language_ids": { + "default": [ + "1000" + ], + "description": "Google language ids, e.g. 1000 English", + "items": { + "pattern": "^\\d+$", + "type": "string" + }, + "maxItems": 20, + "minItems": 1, + "type": "array" + }, + "location_ids": { + "default": [ + "2840" + ], + "description": "Google geo target ids, e.g. 2840 United States", + "items": { + "pattern": "^\\d+$", + "type": "string" + }, + "maxItems": 50, + "minItems": 1, + "type": "array" + }, + "logo_images": { + "description": "1 to 5 square logos, 1:1 (e.g. 1200×1200, at least 128×128), linked to the campaign", + "items": { + "description": "An https URL of a PNG, JPEG or GIF (at most 5120 KB), or the id of an image asset already in the account (asset.id from run_gaql WHERE asset.type = 'IMAGE')", + "maxLength": 2048, + "minLength": 1, + "type": "string" + }, + "maxItems": 5, + "minItems": 1, + "type": "array" + }, + "name": { + "description": "Campaign name; must not match an existing campaign", + "maxLength": 255, + "minLength": 1, + "type": "string" + }, + "target_cpa": { + "description": "MAXIMIZE_CONVERSIONS only: target cost per conversion", + "exclusiveMinimum": 0, + "maximum": 1000, + "type": "number" + }, + "type": { + "const": "create_performance_max_campaign", + "type": "string" + } + }, + "required": [ + "type", + "name", + "daily_budget", + "business_name", + "logo_images", + "asset_groups" + ], + "type": "object" + }, + { + "description": "Add an ad group, with its keywords and ads, to an existing Search campaign", + "properties": { + "ad_group": { + "properties": { + "ads": { + "items": { + "description": "A responsive search ad", + "properties": { + "descriptions": { + "description": "2 to 4 descriptions, each at most 90 characters", + "items": { + "maxLength": 90, + "minLength": 1, + "type": "string" + }, + "maxItems": 4, + "minItems": 2, + "type": "array" + }, + "final_url": { + "description": "The landing page", + "maxLength": 2048, + "pattern": "^https?:\\/\\/", + "type": "string" + }, + "headlines": { + "description": "3 to 15 headlines, each at most 30 characters", + "items": { + "maxLength": 30, + "minLength": 1, + "type": "string" + }, + "maxItems": 15, + "minItems": 3, + "type": "array" + }, + "path1": { + "description": "Display path part 1, at most 15 characters", + "maxLength": 15, + "minLength": 1, + "type": "string" + }, + "path2": { + "description": "Display path part 2, at most 15 characters", + "maxLength": 15, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "headlines", + "descriptions", + "final_url" + ], + "type": "object" + }, + "maxItems": 3, + "minItems": 1, + "type": "array" + }, + "default_max_cpc": { + "description": "Default max cost per click for the ad group (required when the campaign uses manual CPC)", + "exclusiveMinimum": 0, + "maximum": 1000, + "type": "number" + }, + "keywords": { + "items": { + "properties": { + "match_type": { + "description": "PHRASE matches searches containing the words in order; the usual choice", + "enum": [ + "EXACT", + "PHRASE", + "BROAD" + ], + "type": "string" + }, + "max_cpc": { + "description": "Max cost per click for this keyword in the account's currency (manual CPC only); omit to use the ad group's", + "exclusiveMinimum": 0, + "maximum": 1000, + "type": "number" + }, + "text": { + "description": "The keyword, e.g. \"cleaning invoice template\"", + "maxLength": 80, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "text", + "match_type" + ], + "type": "object" + }, + "maxItems": 50, + "minItems": 1, + "type": "array" + }, + "name": { + "maxLength": 255, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "name", + "keywords", + "ads" + ], + "type": "object" + }, + "campaign_id": { + "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "type": { + "const": "add_ad_group", + "type": "string" + } + }, + "required": [ + "type", + "campaign_id", + "ad_group" + ], + "type": "object" + }, + { + "description": "Add keywords to an existing ad group", + "properties": { + "ad_group_id": { + "description": "Ad group id, digits only (ad_group.id from run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "keywords": { + "items": { + "properties": { + "match_type": { + "description": "PHRASE matches searches containing the words in order; the usual choice", + "enum": [ + "EXACT", + "PHRASE", + "BROAD" + ], + "type": "string" + }, + "max_cpc": { + "description": "Max cost per click for this keyword in the account's currency (manual CPC only); omit to use the ad group's", + "exclusiveMinimum": 0, + "maximum": 1000, + "type": "number" + }, + "text": { + "description": "The keyword, e.g. \"cleaning invoice template\"", + "maxLength": 80, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "text", + "match_type" + ], + "type": "object" + }, + "maxItems": 50, + "minItems": 1, + "type": "array" + }, + "type": { + "const": "add_keywords", + "type": "string" + } + }, + "required": [ + "type", + "ad_group_id", + "keywords" + ], + "type": "object" + }, + { + "description": "Add a responsive search ad to an existing ad group", + "properties": { + "ad": { + "description": "A responsive search ad", + "properties": { + "descriptions": { + "description": "2 to 4 descriptions, each at most 90 characters", + "items": { + "maxLength": 90, + "minLength": 1, + "type": "string" + }, + "maxItems": 4, + "minItems": 2, + "type": "array" + }, + "final_url": { + "description": "The landing page", + "maxLength": 2048, + "pattern": "^https?:\\/\\/", + "type": "string" + }, + "headlines": { + "description": "3 to 15 headlines, each at most 30 characters", + "items": { + "maxLength": 30, + "minLength": 1, + "type": "string" + }, + "maxItems": 15, + "minItems": 3, + "type": "array" + }, + "path1": { + "description": "Display path part 1, at most 15 characters", + "maxLength": 15, + "minLength": 1, + "type": "string" + }, + "path2": { + "description": "Display path part 2, at most 15 characters", + "maxLength": 15, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "headlines", + "descriptions", + "final_url" + ], + "type": "object" + }, + "ad_group_id": { + "description": "Ad group id, digits only (ad_group.id from run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "type": { + "const": "add_responsive_search_ad", + "type": "string" + } + }, + "required": [ + "type", + "ad_group_id", + "ad" + ], + "type": "object" + }, + { + "description": "Add sitelinks to a campaign", + "properties": { + "campaign_id": { + "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "sitelinks": { + "items": { + "properties": { + "description1": { + "description": "At most 35 characters; give both descriptions or neither", + "maxLength": 35, + "minLength": 1, + "type": "string" + }, + "description2": { + "maxLength": 35, + "minLength": 1, + "type": "string" + }, + "text": { + "description": "Link text, at most 25 characters", + "maxLength": 25, + "minLength": 1, + "type": "string" + }, + "url": { + "maxLength": 2048, + "pattern": "^https?:\\/\\/", + "type": "string" + } + }, + "required": [ + "text", + "url" + ], + "type": "object" + }, + "maxItems": 8, + "minItems": 1, + "type": "array" + }, + "type": { + "const": "add_sitelinks", + "type": "string" + } + }, + "required": [ + "type", + "campaign_id", + "sitelinks" + ], + "type": "object" + }, + { + "description": "Make a campaign count and bid on ONE conversion category only (e.g. SIGNUP), so another product's or step's conversions don't steer it", + "properties": { + "campaign_id": { + "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "category": { + "description": "Conversion category, e.g. SIGNUP, PURCHASE, SUBMIT_LEAD_FORM, QUALIFIED_LEAD (see conversion_action.category in run_gaql)", + "pattern": "^[A-Z_]+$", + "type": "string" + }, + "type": { + "const": "set_conversion_goal", + "type": "string" + } + }, + "required": [ + "type", + "campaign_id", + "category" + ], + "type": "object" + }, + { + "description": "Change one keyword's max CPC (manual CPC campaigns)", + "properties": { + "ad_group_id": { + "description": "Ad group id, digits only (ad_group.id from run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "criterion_id": { + "description": "Keyword criterion id, digits only (ad_group_criterion.criterion_id from run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "max_cpc": { + "anyOf": [ + { + "exclusiveMinimum": 0, + "maximum": 1000, + "type": "number" + }, + { + "type": "null" + } + ], + "description": "New max cost per click for this keyword, or null to clear it so the keyword uses the ad group's bid" + }, + "type": { + "const": "set_keyword_bid", + "type": "string" + } + }, + "required": [ + "type", + "ad_group_id", + "criterion_id", + "max_cpc" + ], + "type": "object" + }, + { + "description": "Change an ad group's default max CPC, which its keywords use unless they have their own", + "properties": { + "ad_group_id": { + "description": "Ad group id, digits only (ad_group.id from run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "max_cpc": { + "description": "New default max cost per click for the ad group", + "exclusiveMinimum": 0, + "maximum": 1000, + "type": "number" + }, + "type": { + "const": "set_ad_group_bid", + "type": "string" + } + }, + "required": [ + "type", + "ad_group_id", + "max_cpc" + ], + "type": "object" + }, + { + "description": "Pause one ad", + "properties": { + "ad_group_id": { + "description": "Ad group id, digits only (ad_group.id from run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "ad_id": { + "description": "Ad id, digits only (ad_group_ad.ad.id from run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "type": { + "const": "pause_ad", + "type": "string" + } + }, + "required": [ + "type", + "ad_group_id", + "ad_id" + ], + "type": "object" + }, + { + "description": "Re-enable one paused ad", + "properties": { + "ad_group_id": { + "description": "Ad group id, digits only (ad_group.id from run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "ad_id": { + "description": "Ad id, digits only (ad_group_ad.ad.id from run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "type": { + "const": "enable_ad", + "type": "string" + } + }, + "required": [ + "type", + "ad_group_id", + "ad_id" + ], + "type": "object" + }, + { + "description": "Add locations and/or languages a campaign targets", + "properties": { + "campaign_id": { + "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "language_ids": { + "default": [], + "description": "Language ids to add, e.g. 1000 English", + "items": { + "pattern": "^\\d+$", + "type": "string" + }, + "maxItems": 20, + "type": "array" + }, + "location_ids": { + "default": [], + "description": "Geo target ids to add, e.g. 2840 United States", + "items": { + "pattern": "^\\d+$", + "type": "string" + }, + "maxItems": 50, + "type": "array" + }, + "type": { + "const": "add_campaign_targeting", + "type": "string" + } + }, + "required": [ + "type", + "campaign_id" + ], + "type": "object" + }, + { + "description": "Stop targeting some of a campaign's locations and/or languages", + "properties": { + "campaign_id": { + "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "language_ids": { + "default": [], + "items": { + "pattern": "^\\d+$", + "type": "string" + }, + "maxItems": 20, + "type": "array" + }, + "location_ids": { + "default": [], + "items": { + "pattern": "^\\d+$", + "type": "string" + }, + "maxItems": 50, + "type": "array" + }, + "type": { + "const": "remove_campaign_targeting", + "type": "string" + } + }, + "required": [ + "type", + "campaign_id" + ], + "type": "object" + }, + { + "description": "Choose whether a campaign shows to people in its locations only, or also to people interested in them", + "properties": { + "campaign_id": { + "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "presence_only": { + "description": "true: only people IN the locations; false: also people interested in them", + "type": "boolean" + }, + "type": { + "const": "set_location_mode", + "type": "string" + } + }, + "required": [ + "type", + "campaign_id", + "presence_only" + ], + "type": "object" + }, + { + "description": "Switch a campaign's bid strategy. Google re-learns after a switch, so performance can wobble for a week or two", + "properties": { + "campaign_id": { + "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "max_cpc_ceiling": { + "description": "MAXIMIZE_CLICKS only: the most Google may bid per click", + "exclusiveMinimum": 0, + "maximum": 1000, + "type": "number" + }, + "strategy": { + "enum": [ + "MANUAL_CPC", + "MAXIMIZE_CLICKS", + "MAXIMIZE_CONVERSIONS" + ], + "type": "string" + }, + "target_cpa": { + "description": "MAXIMIZE_CONVERSIONS only: target cost per conversion", + "exclusiveMinimum": 0, + "maximum": 1000, + "type": "number" + }, + "type": { + "const": "set_bidding_strategy", + "type": "string" + } + }, + "required": [ + "type", + "campaign_id", + "strategy" + ], + "type": "object" + }, + { + "description": "Set or clear a campaign's final URL suffix (tracking parameters on every ad click)", + "properties": { + "campaign_id": { + "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "suffix": { + "description": "Query string Google appends to every landing page in the campaign, e.g. \"utm_source=google&utm_medium=cpc&utm_term={keyword}\", or \"none\" to clear it", + "maxLength": 1000, + "type": "string" + }, + "type": { + "const": "set_url_suffix", + "type": "string" + } + }, + "required": [ + "type", + "campaign_id", + "suffix" + ], + "type": "object" + }, + { + "description": "Create a conversion action to measure sign-ups, leads or purchases", + "properties": { + "category": { + "description": "Conversion category, e.g. SIGNUP, PURCHASE, SUBMIT_LEAD_FORM, QUALIFIED_LEAD (see conversion_action.category in run_gaql)", + "pattern": "^[A-Z_]+$", + "type": "string" + }, + "counting": { + "default": "ONE_PER_CLICK", + "description": "ONE_PER_CLICK for sign-ups and leads; MANY_PER_CLICK for purchases", + "enum": [ + "ONE_PER_CLICK", + "MANY_PER_CLICK" + ], + "type": "string" + }, + "default_value": { + "description": "Value per conversion when none is sent", + "maximum": 1000000, + "minimum": 0, + "type": "number" + }, + "name": { + "maxLength": 100, + "minLength": 1, + "type": "string" + }, + "primary": { + "default": true, + "description": "Primary actions count in Conversions and can steer bidding", + "type": "boolean" + }, + "source": { + "default": "UPLOAD_CLICKS", + "description": "UPLOAD_CLICKS: your server uploads ad click ids (no Google tag). WEBPAGE: Google gives you a tag to put on the page", + "enum": [ + "UPLOAD_CLICKS", + "WEBPAGE" + ], + "type": "string" + }, + "type": { + "const": "create_conversion_action", + "type": "string" + } + }, + "required": [ + "type", + "name", + "category" + ], + "type": "object" + }, + { + "description": "Set how many conversions one ad click can produce for a conversion action", + "properties": { + "conversion_action_id": { + "description": "conversion_action.id from run_gaql", + "pattern": "^\\d+$", + "type": "string" + }, + "counting": { + "enum": [ + "ONE_PER_CLICK", + "MANY_PER_CLICK" + ], + "type": "string" + }, + "type": { + "const": "set_conversion_counting", + "type": "string" + } + }, + "required": [ + "type", + "conversion_action_id", + "counting" + ], + "type": "object" + } +]
1 tool update
- Changed
propose_changes1 field changed- changed
Input schema / properties / changes / items / oneOfPrevious value: -[ - { - "description": "Block searches containing these words in one campaign", - "properties": { - "campaign_id": { - "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)", - "pattern": "^\\d+$", - "type": "string" - }, - "keywords": { - "items": { - "properties": { - "match_type": { - "description": "PHRASE blocks any search containing the words in order; the usual choice", - "enum": [ - "EXACT", - "PHRASE", - "BROAD" - ], - "type": "string" - }, - "text": { - "description": "The search words to block, e.g. \"free\"", - "maxLength": 80, - "minLength": 1, - "type": "string" - } - }, - "required": [ - "text", - "match_type" - ], - "type": "object" - }, - "maxItems": 50, - "minItems": 1, - "type": "array" - }, - "type": { - "const": "add_negative_keywords", - "type": "string" - } - }, - "required": [ - "type", - "campaign_id", - "keywords" - ], - "type": "object" - }, - { - "description": "Pause one keyword", - "properties": { - "ad_group_id": { - "description": "Ad group id, digits only (ad_group.id from run_gaql)", - "pattern": "^\\d+$", - "type": "string" - }, - "criterion_id": { - "description": "Keyword criterion id, digits only (ad_group_criterion.criterion_id from run_gaql)", - "pattern": "^\\d+$", - "type": "string" - }, - "type": { - "const": "pause_keyword", - "type": "string" - } - }, - "required": [ - "type", - "ad_group_id", - "criterion_id" - ], - "type": "object" - }, - { - "description": "Re-enable one paused keyword", - "properties": { - "ad_group_id": { - "description": "Ad group id, digits only (ad_group.id from run_gaql)", - "pattern": "^\\d+$", - "type": "string" - }, - "criterion_id": { - "description": "Keyword criterion id, digits only (ad_group_criterion.criterion_id from run_gaql)", - "pattern": "^\\d+$", - "type": "string" - }, - "type": { - "const": "enable_keyword", - "type": "string" - } - }, - "required": [ - "type", - "ad_group_id", - "criterion_id" - ], - "type": "object" - }, - { - "description": "Pause a whole campaign (stops all its spend)", - "properties": { - "campaign_id": { - "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)", - "pattern": "^\\d+$", - "type": "string" - }, - "type": { - "const": "pause_campaign", - "type": "string" - } - }, - "required": [ - "type", - "campaign_id" - ], - "type": "object" - }, - { - "description": "Turn a paused campaign back on. It starts spending again; the summary says how much", - "properties": { - "campaign_id": { - "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)", - "pattern": "^\\d+$", - "type": "string" - }, - "type": { - "const": "enable_campaign", - "type": "string" - } - }, - "required": [ - "type", - "campaign_id" - ], - "type": "object" - }, - { - "description": "Pause one ad group", - "properties": { - "ad_group_id": { - "description": "Ad group id, digits only (ad_group.id from run_gaql)", - "pattern": "^\\d+$", - "type": "string" - }, - "type": { - "const": "pause_ad_group", - "type": "string" - } - }, - "required": [ - "type", - "ad_group_id" - ], - "type": "object" - }, - { - "description": "Re-enable one paused ad group", - "properties": { - "ad_group_id": { - "description": "Ad group id, digits only (ad_group.id from run_gaql)", - "pattern": "^\\d+$", - "type": "string" - }, - "type": { - "const": "enable_ad_group", - "type": "string" - } - }, - "required": [ - "type", - "ad_group_id" - ], - "type": "object" - }, - { - "description": "Change a campaign's daily budget (not shared budgets)", - "properties": { - "amount": { - "description": "New average daily budget in the account's currency, e.g. 10 for $10.00/day (not micros)", - "exclusiveMinimum": 0, - "maximum": 1000000, - "type": "number" - }, - "campaign_id": { - "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)", - "pattern": "^\\d+$", - "type": "string" - }, - "type": { - "const": "set_daily_budget", - "type": "string" - } - }, - "required": [ - "type", - "campaign_id", - "amount" - ], - "type": "object" - }, - { - "description": "Set the last day a campaign runs, so it stops spending on its own", - "properties": { - "campaign_id": { - "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)", - "pattern": "^\\d+$", - "type": "string" - }, - "end_date": { - "anyOf": [ - { - "pattern": "^\\d{4}-\\d{2}-\\d{2}$", - "type": "string" - }, - { - "const": "none", - "type": "string" - } - ], - "description": "Last day the campaign runs, YYYY-MM-DD in the account's time zone (it stops after 23:59:59 that day), or \"none\" to remove the end date" - }, - "type": { - "const": "set_end_date", - "type": "string" - } - }, - "required": [ - "type", - "campaign_id", - "end_date" - ], - "type": "object" - }, - { - "description": "Build a new Search campaign with its ad groups, keywords, ads, targeting, negatives and sitelinks, in one step. It is created PAUSED: nothing spends until a separate enable_campaign", - "properties": { - "ad_groups": { - "items": { - "properties": { - "ads": { - "items": { - "description": "A responsive search ad", - "properties": { - "descriptions": { - "description": "2 to 4 descriptions, each at most 90 characters", - "items": { - "maxLength": 90, - "minLength": 1, - "type": "string" - }, - "maxItems": 4, - "minItems": 2, - "type": "array" - }, - "final_url": { - "description": "The landing page", - "maxLength": 2048, - "pattern": "^https?:\\/\\/", - "type": "string" - }, - "headlines": { - "description": "3 to 15 headlines, each at most 30 characters", - "items": { - "maxLength": 30, - "minLength": 1, - "type": "string" - }, - "maxItems": 15, - "minItems": 3, - "type": "array" - }, - "path1": { - "description": "Display path part 1, at most 15 characters", - "maxLength": 15, - "minLength": 1, - "type": "string" - }, - "path2": { - "description": "Display path part 2, at most 15 characters", - "maxLength": 15, - "minLength": 1, - "type": "string" - } - }, - "required": [ - "headlines", - "descriptions", - "final_url" - ], - "type": "object" - }, - "maxItems": 3, - "minItems": 1, - "type": "array" - }, - "default_max_cpc": { - "description": "Default max cost per click for the ad group (required when the campaign uses manual CPC)", - "exclusiveMinimum": 0, - "maximum": 1000, - "type": "number" - }, - "keywords": { - "items": { - "properties": { - "match_type": { - "description": "PHRASE matches searches containing the words in order; the usual choice", - "enum": [ - "EXACT", - "PHRASE", - "BROAD" - ], - "type": "string" - }, - "max_cpc": { - "description": "Max cost per click for this keyword in the account's currency (manual CPC only); omit to use the ad group's", - "exclusiveMinimum": 0, - "maximum": 1000, - "type": "number" - }, - "text": { - "description": "The keyword, e.g. \"cleaning invoice template\"", - "maxLength": 80, - "minLength": 1, - "type": "string" - } - }, - "required": [ - "text", - "match_type" - ], - "type": "object" - }, - "maxItems": 50, - "minItems": 1, - "type": "array" - }, - "name": { - "maxLength": 255, - "minLength": 1, - "type": "string" - } - }, - "required": [ - "name", - "keywords", - "ads" - ], - "type": "object" - }, - "maxItems": 10, - "minItems": 1, - "type": "array" - }, - "bidding": { - "default": "MANUAL_CPC", - "description": "MANUAL_CPC uses the ad group and keyword max CPCs; MAXIMIZE_CLICKS and MAXIMIZE_CONVERSIONS let Google bid within the budget", - "enum": [ - "MANUAL_CPC", - "MAXIMIZE_CLICKS", - "MAXIMIZE_CONVERSIONS" - ], - "type": "string" - }, - "daily_budget": { - "description": "Average daily budget in the account's currency, e.g. 20 for $20.00/day", - "exclusiveMinimum": 0, - "maximum": 1000000, - "type": "number" - }, - "end_date": { - "description": "Last day the campaign runs, YYYY-MM-DD", - "pattern": "^\\d{4}-\\d{2}-\\d{2}$", - "type": "string" - }, - "language_ids": { - "default": [ - "1000" - ], - "description": "Google language ids, e.g. 1000 English, 1003 Spanish", - "items": { - "pattern": "^\\d+$", - "type": "string" - }, - "maxItems": 20, - "minItems": 1, - "type": "array" - }, - "location_ids": { - "default": [ - "2840" - ], - "description": "Google geo target ids, e.g. 2840 United States, 2826 United Kingdom, 2124 Canada (look others up in geo_target_constant)", - "items": { - "pattern": "^\\d+$", - "type": "string" - }, - "maxItems": 50, - "minItems": 1, - "type": "array" - }, - "max_cpc_ceiling": { - "description": "MAXIMIZE_CLICKS only: the most Google may bid per click", - "exclusiveMinimum": 0, - "maximum": 1000, - "type": "number" - }, - "name": { - "description": "Campaign name; must not match an existing campaign", - "maxLength": 255, - "minLength": 1, - "type": "string" - }, - "negative_keywords": { - "default": [], - "description": "Searches to block across the campaign", - "items": { - "properties": { - "match_type": { - "enum": [ - "EXACT", - "PHRASE", - "BROAD" - ], - "type": "string" - }, - "text": { - "maxLength": 80, - "minLength": 1, - "type": "string" - } - }, - "required": [ - "text", - "match_type" - ], - "type": "object" - }, - "maxItems": 200, - "type": "array" - }, - "presence_only": { - "default": true, - "description": "Show ads only to people IN the locations (true), not merely interested in them", - "type": "boolean" - }, - "search_partners": { - "default": false, - "description": "Also show on Google's search partner sites", - "type": "boolean" - }, - "sitelinks": { - "default": [], - "items": { - "properties": { - "description1": { - "description": "At most 35 characters; give both descriptions or neither", - "maxLength": 35, - "minLength": 1, - "type": "string" - }, - "description2": { - "maxLength": 35, - "minLength": 1, - "type": "string" - }, - "text": { - "description": "Link text, at most 25 characters", - "maxLength": 25, - "minLength": 1, - "type": "string" - }, - "url": { - "maxLength": 2048, - "pattern": "^https?:\\/\\/", - "type": "string" - } - }, - "required": [ - "text", - "url" - ], - "type": "object" - }, - "maxItems": 8, - "type": "array" - }, - "type": { - "const": "create_campaign", - "type": "string" - } - }, - "required": [ - "type", - "name", - "daily_budget", - "ad_groups" - ], - "type": "object" - }, - { - "description": "Add an ad group, with its keywords and ads, to an existing Search campaign", - "properties": { - "ad_group": { - "properties": { - "ads": { - "items": { - "description": "A responsive search ad", - "properties": { - "descriptions": { - "description": "2 to 4 descriptions, each at most 90 characters", - "items": { - "maxLength": 90, - "minLength": 1, - "type": "string" - }, - "maxItems": 4, - "minItems": 2, - "type": "array" - }, - "final_url": { - "description": "The landing page", - "maxLength": 2048, - "pattern": "^https?:\\/\\/", - "type": "string" - }, - "headlines": { - "description": "3 to 15 headlines, each at most 30 characters", - "items": { - "maxLength": 30, - "minLength": 1, - "type": "string" - }, - "maxItems": 15, - "minItems": 3, - "type": "array" - }, - "path1": { - "description": "Display path part 1, at most 15 characters", - "maxLength": 15, - "minLength": 1, - "type": "string" - }, - "path2": { - "description": "Display path part 2, at most 15 characters", - "maxLength": 15, - "minLength": 1, - "type": "string" - } - }, - "required": [ - "headlines", - "descriptions", - "final_url" - ], - "type": "object" - }, - "maxItems": 3, - "minItems": 1, - "type": "array" - }, - "default_max_cpc": { - "description": "Default max cost per click for the ad group (required when the campaign uses manual CPC)", - "exclusiveMinimum": 0, - "maximum": 1000, - "type": "number" - }, - "keywords": { - "items": { - "properties": { - "match_type": { - "description": "PHRASE matches searches containing the words in order; the usual choice", - "enum": [ - "EXACT", - "PHRASE", - "BROAD" - ], - "type": "string" - }, - "max_cpc": { - "description": "Max cost per click for this keyword in the account's currency (manual CPC only); omit to use the ad group's", - "exclusiveMinimum": 0, - "maximum": 1000, - "type": "number" - }, - "text": { - "description": "The keyword, e.g. \"cleaning invoice template\"", - "maxLength": 80, - "minLength": 1, - "type": "string" - } - }, - "required": [ - "text", - "match_type" - ], - "type": "object" - }, - "maxItems": 50, - "minItems": 1, - "type": "array" - }, - "name": { - "maxLength": 255, - "minLength": 1, - "type": "string" - } - }, - "required": [ - "name", - "keywords", - "ads" - ], - "type": "object" - }, - "campaign_id": { - "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)", - "pattern": "^\\d+$", - "type": "string" - }, - "type": { - "const": "add_ad_group", - "type": "string" - } - }, - "required": [ - "type", - "campaign_id", - "ad_group" - ], - "type": "object" - }, - { - "description": "Add keywords to an existing ad group", - "properties": { - "ad_group_id": { - "description": "Ad group id, digits only (ad_group.id from run_gaql)", - "pattern": "^\\d+$", - "type": "string" - }, - "keywords": { - "items": { - "properties": { - "match_type": { - "description": "PHRASE matches searches containing the words in order; the usual choice", - "enum": [ - "EXACT", - "PHRASE", - "BROAD" - ], - "type": "string" - }, - "max_cpc": { - "description": "Max cost per click for this keyword in the account's currency (manual CPC only); omit to use the ad group's", - "exclusiveMinimum": 0, - "maximum": 1000, - "type": "number" - }, - "text": { - "description": "The keyword, e.g. \"cleaning invoice template\"", - "maxLength": 80, - "minLength": 1, - "type": "string" - } - }, - "required": [ - "text", - "match_type" - ], - "type": "object" - }, - "maxItems": 50, - "minItems": 1, - "type": "array" - }, - "type": { - "const": "add_keywords", - "type": "string" - } - }, - "required": [ - "type", - "ad_group_id", - "keywords" - ], - "type": "object" - }, - { - "description": "Add a responsive search ad to an existing ad group", - "properties": { - "ad": { - "description": "A responsive search ad", - "properties": { - "descriptions": { - "description": "2 to 4 descriptions, each at most 90 characters", - "items": { - "maxLength": 90, - "minLength": 1, - "type": "string" - }, - "maxItems": 4, - "minItems": 2, - "type": "array" - }, - "final_url": { - "description": "The landing page", - "maxLength": 2048, - "pattern": "^https?:\\/\\/", - "type": "string" - }, - "headlines": { - "description": "3 to 15 headlines, each at most 30 characters", - "items": { - "maxLength": 30, - "minLength": 1, - "type": "string" - }, - "maxItems": 15, - "minItems": 3, - "type": "array" - }, - "path1": { - "description": "Display path part 1, at most 15 characters", - "maxLength": 15, - "minLength": 1, - "type": "string" - }, - "path2": { - "description": "Display path part 2, at most 15 characters", - "maxLength": 15, - "minLength": 1, - "type": "string" - } - }, - "required": [ - "headlines", - "descriptions", - "final_url" - ], - "type": "object" - }, - "ad_group_id": { - "description": "Ad group id, digits only (ad_group.id from run_gaql)", - "pattern": "^\\d+$", - "type": "string" - }, - "type": { - "const": "add_responsive_search_ad", - "type": "string" - } - }, - "required": [ - "type", - "ad_group_id", - "ad" - ], - "type": "object" - }, - { - "description": "Add sitelinks to a campaign", - "properties": { - "campaign_id": { - "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)", - "pattern": "^\\d+$", - "type": "string" - }, - "sitelinks": { - "items": { - "properties": { - "description1": { - "description": "At most 35 characters; give both descriptions or neither", - "maxLength": 35, - "minLength": 1, - "type": "string" - }, - "description2": { - "maxLength": 35, - "minLength": 1, - "type": "string" - }, - "text": { - "description": "Link text, at most 25 characters", - "maxLength": 25, - "minLength": 1, - "type": "string" - }, - "url": { - "maxLength": 2048, - "pattern": "^https?:\\/\\/", - "type": "string" - } - }, - "required": [ - "text", - "url" - ], - "type": "object" - }, - "maxItems": 8, - "minItems": 1, - "type": "array" - }, - "type": { - "const": "add_sitelinks", - "type": "string" - } - }, - "required": [ - "type", - "campaign_id", - "sitelinks" - ], - "type": "object" - }, - { - "description": "Make a campaign count and bid on ONE conversion category only (e.g. SIGNUP), so another product's or step's conversions don't steer it", - "properties": { - "campaign_id": { - "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)", - "pattern": "^\\d+$", - "type": "string" - }, - "category": { - "description": "Conversion category, e.g. SIGNUP, PURCHASE, SUBMIT_LEAD_FORM, QUALIFIED_LEAD (see conversion_action.category in run_gaql)", - "pattern": "^[A-Z_]+$", - "type": "string" - }, - "type": { - "const": "set_conversion_goal", - "type": "string" - } - }, - "required": [ - "type", - "campaign_id", - "category" - ], - "type": "object" - }, - { - "description": "Change one keyword's max CPC (manual CPC campaigns)", - "properties": { - "ad_group_id": { - "description": "Ad group id, digits only (ad_group.id from run_gaql)", - "pattern": "^\\d+$", - "type": "string" - }, - "criterion_id": { - "description": "Keyword criterion id, digits only (ad_group_criterion.criterion_id from run_gaql)", - "pattern": "^\\d+$", - "type": "string" - }, - "max_cpc": { - "anyOf": [ - { - "exclusiveMinimum": 0, - "maximum": 1000, - "type": "number" - }, - { - "type": "null" - } - ], - "description": "New max cost per click for this keyword, or null to clear it so the keyword uses the ad group's bid" - }, - "type": { - "const": "set_keyword_bid", - "type": "string" - } - }, - "required": [ - "type", - "ad_group_id", - "criterion_id", - "max_cpc" - ], - "type": "object" - }, - { - "description": "Change an ad group's default max CPC, which its keywords use unless they have their own", - "properties": { - "ad_group_id": { - "description": "Ad group id, digits only (ad_group.id from run_gaql)", - "pattern": "^\\d+$", - "type": "string" - }, - "max_cpc": { - "description": "New default max cost per click for the ad group", - "exclusiveMinimum": 0, - "maximum": 1000, - "type": "number" - }, - "type": { - "const": "set_ad_group_bid", - "type": "string" - } - }, - "required": [ - "type", - "ad_group_id", - "max_cpc" - ], - "type": "object" - }, - { - "description": "Pause one ad", - "properties": { - "ad_group_id": { - "description": "Ad group id, digits only (ad_group.id from run_gaql)", - "pattern": "^\\d+$", - "type": "string" - }, - "ad_id": { - "description": "Ad id, digits only (ad_group_ad.ad.id from run_gaql)", - "pattern": "^\\d+$", - "type": "string" - }, - "type": { - "const": "pause_ad", - "type": "string" - } - }, - "required": [ - "type", - "ad_group_id", - "ad_id" - ], - "type": "object" - }, - { - "description": "Re-enable one paused ad", - "properties": { - "ad_group_id": { - "description": "Ad group id, digits only (ad_group.id from run_gaql)", - "pattern": "^\\d+$", - "type": "string" - }, - "ad_id": { - "description": "Ad id, digits only (ad_group_ad.ad.id from run_gaql)", - "pattern": "^\\d+$", - "type": "string" - }, - "type": { - "const": "enable_ad", - "type": "string" - } - }, - "required": [ - "type", - "ad_group_id", - "ad_id" - ], - "type": "object" - }, - { - "description": "Add locations and/or languages a campaign targets", - "properties": { - "campaign_id": { - "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)", - "pattern": "^\\d+$", - "type": "string" - }, - "language_ids": { - "default": [], - "description": "Language ids to add, e.g. 1000 English", - "items": { - "pattern": "^\\d+$", - "type": "string" - }, - "maxItems": 20, - "type": "array" - }, - "location_ids": { - "default": [], - "description": "Geo target ids to add, e.g. 2840 United States", - "items": { - "pattern": "^\\d+$", - "type": "string" - }, - "maxItems": 50, - "type": "array" - }, - "type": { - "const": "add_campaign_targeting", - "type": "string" - } - }, - "required": [ - "type", - "campaign_id" - ], - "type": "object" - }, - { - "description": "Stop targeting some of a campaign's locations and/or languages", - "properties": { - "campaign_id": { - "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)", - "pattern": "^\\d+$", - "type": "string" - }, - "language_ids": { - "default": [], - "items": { - "pattern": "^\\d+$", - "type": "string" - }, - "maxItems": 20, - "type": "array" - }, - "location_ids": { - "default": [], - "items": { - "pattern": "^\\d+$", - "type": "string" - }, - "maxItems": 50, - "type": "array" - }, - "type": { - "const": "remove_campaign_targeting", - "type": "string" - } - }, - "required": [ - "type", - "campaign_id" - ], - "type": "object" - }, - { - "description": "Choose whether a campaign shows to people in its locations only, or also to people interested in them", - "properties": { - "campaign_id": { - "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)", - "pattern": "^\\d+$", - "type": "string" - }, - "presence_only": { - "description": "true: only people IN the locations; false: also people interested in them", - "type": "boolean" - }, - "type": { - "const": "set_location_mode", - "type": "string" - } - }, - "required": [ - "type", - "campaign_id", - "presence_only" - ], - "type": "object" - }, - { - "description": "Switch a campaign's bid strategy. Google re-learns after a switch, so performance can wobble for a week or two", - "properties": { - "campaign_id": { - "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)", - "pattern": "^\\d+$", - "type": "string" - }, - "max_cpc_ceiling": { - "description": "MAXIMIZE_CLICKS only: the most Google may bid per click", - "exclusiveMinimum": 0, - "maximum": 1000, - "type": "number" - }, - "strategy": { - "enum": [ - "MANUAL_CPC", - "MAXIMIZE_CLICKS", - "MAXIMIZE_CONVERSIONS" - ], - "type": "string" - }, - "target_cpa": { - "description": "MAXIMIZE_CONVERSIONS only: target cost per conversion", - "exclusiveMinimum": 0, - "maximum": 1000, - "type": "number" - }, - "type": { - "const": "set_bidding_strategy", - "type": "string" - } - }, - "required": [ - "type", - "campaign_id", - "strategy" - ], - "type": "object" - }, - { - "description": "Set or clear a campaign's final URL suffix (tracking parameters on every ad click)", - "properties": { - "campaign_id": { - "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)", - "pattern": "^\\d+$", - "type": "string" - }, - "suffix": { - "description": "Query string Google appends to every landing page in the campaign, e.g. \"utm_source=google&utm_medium=cpc&utm_term={keyword}\", or \"none\" to clear it", - "maxLength": 1000, - "type": "string" - }, - "type": { - "const": "set_url_suffix", - "type": "string" - } - }, - "required": [ - "type", - "campaign_id", - "suffix" - ], - "type": "object" - }, - { - "description": "Create a conversion action to measure sign-ups, leads or purchases", - "properties": { - "category": { - "description": "Conversion category, e.g. SIGNUP, PURCHASE, SUBMIT_LEAD_FORM, QUALIFIED_LEAD (see conversion_action.category in run_gaql)", - "pattern": "^[A-Z_]+$", - "type": "string" - }, - "counting": { - "default": "ONE_PER_CLICK", - "description": "ONE_PER_CLICK for sign-ups and leads; MANY_PER_CLICK for purchases", - "enum": [ - "ONE_PER_CLICK", - "MANY_PER_CLICK" - ], - "type": "string" - }, - "default_value": { - "description": "Value per conversion when none is sent", - "maximum": 1000000, - "minimum": 0, - "type": "number" - }, - "name": { - "maxLength": 100, - "minLength": 1, - "type": "string" - }, - "primary": { - "default": true, - "description": "Primary actions count in Conversions and can steer bidding", - "type": "boolean" - }, - "source": { - "default": "UPLOAD_CLICKS", - "description": "UPLOAD_CLICKS: your server uploads ad click ids (no Google tag). WEBPAGE: Google gives you a tag to put on the page", - "enum": [ - "UPLOAD_CLICKS", - "WEBPAGE" - ], - "type": "string" - }, - "type": { - "const": "create_conversion_action", - "type": "string" - } - }, - "required": [ - "type", - "name", - "category" - ], - "type": "object" - }, - { - "description": "Set how many conversions one ad click can produce for a conversion action", - "properties": { - "conversion_action_id": { - "description": "conversion_action.id from run_gaql", - "pattern": "^\\d+$", - "type": "string" - }, - "counting": { - "enum": [ - "ONE_PER_CLICK", - "MANY_PER_CLICK" - ], - "type": "string" - }, - "type": { - "const": "set_conversion_counting", - "type": "string" - } - }, - "required": [ - "type", - "conversion_action_id", - "counting" - ], - "type": "object" - } -]New value: +[ + { + "description": "Block searches containing these words in one campaign", + "properties": { + "campaign_id": { + "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "keywords": { + "items": { + "properties": { + "match_type": { + "description": "PHRASE blocks any search containing the words in order; the usual choice", + "enum": [ + "EXACT", + "PHRASE", + "BROAD" + ], + "type": "string" + }, + "text": { + "description": "The search words to block, e.g. \"free\"", + "maxLength": 80, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "text", + "match_type" + ], + "type": "object" + }, + "maxItems": 50, + "minItems": 1, + "type": "array" + }, + "type": { + "const": "add_negative_keywords", + "type": "string" + } + }, + "required": [ + "type", + "campaign_id", + "keywords" + ], + "type": "object" + }, + { + "description": "Pause one keyword", + "properties": { + "ad_group_id": { + "description": "Ad group id, digits only (ad_group.id from run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "criterion_id": { + "description": "Keyword criterion id, digits only (ad_group_criterion.criterion_id from run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "type": { + "const": "pause_keyword", + "type": "string" + } + }, + "required": [ + "type", + "ad_group_id", + "criterion_id" + ], + "type": "object" + }, + { + "description": "Re-enable one paused keyword", + "properties": { + "ad_group_id": { + "description": "Ad group id, digits only (ad_group.id from run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "criterion_id": { + "description": "Keyword criterion id, digits only (ad_group_criterion.criterion_id from run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "type": { + "const": "enable_keyword", + "type": "string" + } + }, + "required": [ + "type", + "ad_group_id", + "criterion_id" + ], + "type": "object" + }, + { + "description": "Pause a whole campaign (stops all its spend)", + "properties": { + "campaign_id": { + "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "type": { + "const": "pause_campaign", + "type": "string" + } + }, + "required": [ + "type", + "campaign_id" + ], + "type": "object" + }, + { + "description": "Turn a paused campaign back on. It starts spending again; the summary says how much", + "properties": { + "campaign_id": { + "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "type": { + "const": "enable_campaign", + "type": "string" + } + }, + "required": [ + "type", + "campaign_id" + ], + "type": "object" + }, + { + "description": "Pause one ad group", + "properties": { + "ad_group_id": { + "description": "Ad group id, digits only (ad_group.id from run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "type": { + "const": "pause_ad_group", + "type": "string" + } + }, + "required": [ + "type", + "ad_group_id" + ], + "type": "object" + }, + { + "description": "Re-enable one paused ad group", + "properties": { + "ad_group_id": { + "description": "Ad group id, digits only (ad_group.id from run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "type": { + "const": "enable_ad_group", + "type": "string" + } + }, + "required": [ + "type", + "ad_group_id" + ], + "type": "object" + }, + { + "description": "Change a campaign's daily budget (not shared budgets)", + "properties": { + "amount": { + "description": "New average daily budget in the account's currency, e.g. 10 for $10.00/day (not micros)", + "exclusiveMinimum": 0, + "maximum": 1000000, + "type": "number" + }, + "campaign_id": { + "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "type": { + "const": "set_daily_budget", + "type": "string" + } + }, + "required": [ + "type", + "campaign_id", + "amount" + ], + "type": "object" + }, + { + "description": "Set the last day a campaign runs, so it stops spending on its own", + "properties": { + "campaign_id": { + "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "end_date": { + "anyOf": [ + { + "pattern": "^\\d{4}-\\d{2}-\\d{2}$", + "type": "string" + }, + { + "const": "none", + "type": "string" + } + ], + "description": "Last day the campaign runs, YYYY-MM-DD in the account's time zone (it stops after 23:59:59 that day), or \"none\" to remove the end date" + }, + "type": { + "const": "set_end_date", + "type": "string" + } + }, + "required": [ + "type", + "campaign_id", + "end_date" + ], + "type": "object" + }, + { + "description": "Build a new Search campaign with its ad groups, keywords, ads, targeting, negatives and sitelinks, in one step. It is created PAUSED: nothing spends until a separate enable_campaign", + "properties": { + "ad_groups": { + "items": { + "properties": { + "ads": { + "items": { + "description": "A responsive search ad", + "properties": { + "descriptions": { + "description": "2 to 4 descriptions, each at most 90 characters", + "items": { + "maxLength": 90, + "minLength": 1, + "type": "string" + }, + "maxItems": 4, + "minItems": 2, + "type": "array" + }, + "final_url": { + "description": "The landing page", + "maxLength": 2048, + "pattern": "^https?:\\/\\/", + "type": "string" + }, + "headlines": { + "description": "3 to 15 headlines, each at most 30 characters", + "items": { + "maxLength": 30, + "minLength": 1, + "type": "string" + }, + "maxItems": 15, + "minItems": 3, + "type": "array" + }, + "path1": { + "description": "Display path part 1, at most 15 characters", + "maxLength": 15, + "minLength": 1, + "type": "string" + }, + "path2": { + "description": "Display path part 2, at most 15 characters", + "maxLength": 15, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "headlines", + "descriptions", + "final_url" + ], + "type": "object" + }, + "maxItems": 3, + "minItems": 1, + "type": "array" + }, + "default_max_cpc": { + "description": "Default max cost per click for the ad group (required when the campaign uses manual CPC)", + "exclusiveMinimum": 0, + "maximum": 1000, + "type": "number" + }, + "keywords": { + "items": { + "properties": { + "match_type": { + "description": "PHRASE matches searches containing the words in order; the usual choice", + "enum": [ + "EXACT", + "PHRASE", + "BROAD" + ], + "type": "string" + }, + "max_cpc": { + "description": "Max cost per click for this keyword in the account's currency (manual CPC only); omit to use the ad group's", + "exclusiveMinimum": 0, + "maximum": 1000, + "type": "number" + }, + "text": { + "description": "The keyword, e.g. \"cleaning invoice template\"", + "maxLength": 80, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "text", + "match_type" + ], + "type": "object" + }, + "maxItems": 50, + "minItems": 1, + "type": "array" + }, + "name": { + "maxLength": 255, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "name", + "keywords", + "ads" + ], + "type": "object" + }, + "maxItems": 10, + "minItems": 1, + "type": "array" + }, + "bidding": { + "default": "MANUAL_CPC", + "description": "MANUAL_CPC uses the ad group and keyword max CPCs; MAXIMIZE_CLICKS and MAXIMIZE_CONVERSIONS let Google bid within the budget", + "enum": [ + "MANUAL_CPC", + "MAXIMIZE_CLICKS", + "MAXIMIZE_CONVERSIONS" + ], + "type": "string" + }, + "daily_budget": { + "description": "Average daily budget in the account's currency, e.g. 20 for $20.00/day", + "exclusiveMinimum": 0, + "maximum": 1000000, + "type": "number" + }, + "end_date": { + "description": "Last day the campaign runs, YYYY-MM-DD", + "pattern": "^\\d{4}-\\d{2}-\\d{2}$", + "type": "string" + }, + "language_ids": { + "default": [ + "1000" + ], + "description": "Google language ids, e.g. 1000 English, 1003 Spanish", + "items": { + "pattern": "^\\d+$", + "type": "string" + }, + "maxItems": 20, + "minItems": 1, + "type": "array" + }, + "location_ids": { + "default": [ + "2840" + ], + "description": "Google geo target ids, e.g. 2840 United States, 2826 United Kingdom, 2124 Canada (look others up in geo_target_constant)", + "items": { + "pattern": "^\\d+$", + "type": "string" + }, + "maxItems": 50, + "minItems": 1, + "type": "array" + }, + "max_cpc_ceiling": { + "description": "MAXIMIZE_CLICKS only: the most Google may bid per click", + "exclusiveMinimum": 0, + "maximum": 1000, + "type": "number" + }, + "name": { + "description": "Campaign name; must not match an existing campaign", + "maxLength": 255, + "minLength": 1, + "type": "string" + }, + "negative_keywords": { + "default": [], + "description": "Searches to block across the campaign", + "items": { + "properties": { + "match_type": { + "enum": [ + "EXACT", + "PHRASE", + "BROAD" + ], + "type": "string" + }, + "text": { + "maxLength": 80, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "text", + "match_type" + ], + "type": "object" + }, + "maxItems": 200, + "type": "array" + }, + "presence_only": { + "default": true, + "description": "Show ads only to people IN the locations (true), not merely interested in them", + "type": "boolean" + }, + "search_partners": { + "default": false, + "description": "Also show on Google's search partner sites", + "type": "boolean" + }, + "sitelinks": { + "default": [], + "items": { + "properties": { + "description1": { + "description": "At most 35 characters; give both descriptions or neither", + "maxLength": 35, + "minLength": 1, + "type": "string" + }, + "description2": { + "maxLength": 35, + "minLength": 1, + "type": "string" + }, + "text": { + "description": "Link text, at most 25 characters", + "maxLength": 25, + "minLength": 1, + "type": "string" + }, + "url": { + "maxLength": 2048, + "pattern": "^https?:\\/\\/", + "type": "string" + } + }, + "required": [ + "text", + "url" + ], + "type": "object" + }, + "maxItems": 8, + "type": "array" + }, + "type": { + "const": "create_campaign", + "type": "string" + } + }, + "required": [ + "type", + "name", + "daily_budget", + "ad_groups" + ], + "type": "object" + }, + { + "description": "Build a new Display campaign (image ads across Google's Display Network of sites and apps) with ad groups and responsive display ads. Google's optimized targeting finds the audience. It is created PAUSED: nothing spends until a separate enable_campaign", + "properties": { + "ad_groups": { + "items": { + "properties": { + "ads": { + "items": { + "description": "A responsive display ad: Google assembles ads from these headlines, descriptions and images", + "properties": { + "business_name": { + "description": "The advertiser's name, at most 25 characters", + "maxLength": 25, + "minLength": 1, + "type": "string" + }, + "descriptions": { + "description": "1 to 5 descriptions, each at most 90 characters", + "items": { + "maxLength": 90, + "minLength": 1, + "type": "string" + }, + "maxItems": 5, + "minItems": 1, + "type": "array" + }, + "final_url": { + "description": "The landing page", + "maxLength": 2048, + "pattern": "^https?:\\/\\/", + "type": "string" + }, + "headlines": { + "description": "1 to 5 short headlines, each at most 30 characters", + "items": { + "maxLength": 30, + "minLength": 1, + "type": "string" + }, + "maxItems": 5, + "minItems": 1, + "type": "array" + }, + "logo_images": { + "default": [], + "description": "0 to 5 landscape logos, 4:1 (e.g. 1200×300, at least 512×128)", + "items": { + "description": "An https URL of a PNG, JPEG or GIF (at most 5120 KB), or the id of an image asset already in the account (asset.id from run_gaql WHERE asset.type = 'IMAGE')", + "maxLength": 2048, + "minLength": 1, + "type": "string" + }, + "maxItems": 5, + "minItems": 0, + "type": "array" + }, + "long_headline": { + "description": "One long headline, at most 90 characters", + "maxLength": 90, + "minLength": 1, + "type": "string" + }, + "marketing_images": { + "description": "1 to 15 landscape images, 1.91:1 (e.g. 1200×628, at least 600×314)", + "items": { + "description": "An https URL of a PNG, JPEG or GIF (at most 5120 KB), or the id of an image asset already in the account (asset.id from run_gaql WHERE asset.type = 'IMAGE')", + "maxLength": 2048, + "minLength": 1, + "type": "string" + }, + "maxItems": 15, + "minItems": 1, + "type": "array" + }, + "square_logo_images": { + "default": [], + "description": "0 to 5 square logos, 1:1 (e.g. 1200×1200, at least 128×128)", + "items": { + "description": "An https URL of a PNG, JPEG or GIF (at most 5120 KB), or the id of an image asset already in the account (asset.id from run_gaql WHERE asset.type = 'IMAGE')", + "maxLength": 2048, + "minLength": 1, + "type": "string" + }, + "maxItems": 5, + "minItems": 0, + "type": "array" + }, + "square_marketing_images": { + "description": "1 to 15 square images, 1:1 (e.g. 1200×1200, at least 300×300)", + "items": { + "description": "An https URL of a PNG, JPEG or GIF (at most 5120 KB), or the id of an image asset already in the account (asset.id from run_gaql WHERE asset.type = 'IMAGE')", + "maxLength": 2048, + "minLength": 1, + "type": "string" + }, + "maxItems": 15, + "minItems": 1, + "type": "array" + } + }, + "required": [ + "headlines", + "long_headline", + "descriptions", + "business_name", + "final_url", + "marketing_images", + "square_marketing_images" + ], + "type": "object" + }, + "maxItems": 3, + "minItems": 1, + "type": "array" + }, + "default_max_cpc": { + "description": "Default max cost per click (required when the campaign uses manual CPC)", + "exclusiveMinimum": 0, + "maximum": 1000, + "type": "number" + }, + "name": { + "maxLength": 255, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "name", + "ads" + ], + "type": "object" + }, + "maxItems": 5, + "minItems": 1, + "type": "array" + }, + "bidding": { + "default": "MAXIMIZE_CLICKS", + "description": "MANUAL_CPC uses the ad groups' max CPCs; MAXIMIZE_CLICKS and MAXIMIZE_CONVERSIONS let Google bid within the budget", + "enum": [ + "MANUAL_CPC", + "MAXIMIZE_CLICKS", + "MAXIMIZE_CONVERSIONS" + ], + "type": "string" + }, + "daily_budget": { + "description": "Average daily budget in the account's currency, e.g. 20 for $20.00/day", + "exclusiveMinimum": 0, + "maximum": 1000000, + "type": "number" + }, + "end_date": { + "description": "Last day the campaign runs, YYYY-MM-DD", + "pattern": "^\\d{4}-\\d{2}-\\d{2}$", + "type": "string" + }, + "language_ids": { + "default": [ + "1000" + ], + "description": "Google language ids, e.g. 1000 English", + "items": { + "pattern": "^\\d+$", + "type": "string" + }, + "maxItems": 20, + "minItems": 1, + "type": "array" + }, + "location_ids": { + "default": [ + "2840" + ], + "description": "Google geo target ids, e.g. 2840 United States", + "items": { + "pattern": "^\\d+$", + "type": "string" + }, + "maxItems": 50, + "minItems": 1, + "type": "array" + }, + "max_cpc_ceiling": { + "description": "MAXIMIZE_CLICKS only: the most Google may bid per click", + "exclusiveMinimum": 0, + "maximum": 1000, + "type": "number" + }, + "name": { + "description": "Campaign name; must not match an existing campaign", + "maxLength": 255, + "minLength": 1, + "type": "string" + }, + "presence_only": { + "default": true, + "description": "Show ads only to people IN the locations (true), not merely interested in them", + "type": "boolean" + }, + "type": { + "const": "create_display_campaign", + "type": "string" + } + }, + "required": [ + "type", + "name", + "daily_budget", + "ad_groups" + ], + "type": "object" + }, + { + "description": "Build a new Demand Gen campaign with YouTube video ads, which is how to advertise on YouTube through the API (Google doesn't allow creating Video campaigns there). It is created PAUSED: nothing spends until a separate enable_campaign", + "properties": { + "ad_groups": { + "items": { + "properties": { + "ads": { + "items": { + "description": "A Demand Gen video ad: runs on YouTube (in-stream, in-feed and Shorts), Discover and Gmail", + "properties": { + "business_name": { + "description": "The advertiser's name, at most 25 characters", + "maxLength": 25, + "minLength": 1, + "type": "string" + }, + "descriptions": { + "description": "1 to 5 descriptions, each at most 90 characters", + "items": { + "maxLength": 90, + "minLength": 1, + "type": "string" + }, + "maxItems": 5, + "minItems": 1, + "type": "array" + }, + "final_url": { + "description": "The landing page", + "maxLength": 2048, + "pattern": "^https?:\\/\\/", + "type": "string" + }, + "headlines": { + "description": "1 to 5 headlines, each at most 40 characters", + "items": { + "maxLength": 40, + "minLength": 1, + "type": "string" + }, + "maxItems": 5, + "minItems": 1, + "type": "array" + }, + "logo_image": { + "description": "A square 1:1 logo (e.g. 1200×1200, at least 128×128): an https URL, or an image asset id from the account", + "maxLength": 2048, + "minLength": 1, + "type": "string" + }, + "long_headlines": { + "description": "1 to 5 long headlines, each at most 90 characters", + "items": { + "maxLength": 90, + "minLength": 1, + "type": "string" + }, + "maxItems": 5, + "minItems": 1, + "type": "array" + }, + "videos": { + "description": "1 to 5 YouTube videos", + "items": { + "description": "A YouTube video id (e.g. dQw4w9WgXcQ) or its youtube.com / youtu.be URL. The video must be public or unlisted", + "maxLength": 200, + "minLength": 1, + "type": "string" + }, + "maxItems": 5, + "minItems": 1, + "type": "array" + } + }, + "required": [ + "videos", + "headlines", + "long_headlines", + "descriptions", + "business_name", + "logo_image", + "final_url" + ], + "type": "object" + }, + "maxItems": 3, + "minItems": 1, + "type": "array" + }, + "language_ids": { + "default": [ + "1000" + ], + "description": "Google language ids, e.g. 1000 English", + "items": { + "pattern": "^\\d+$", + "type": "string" + }, + "maxItems": 20, + "minItems": 1, + "type": "array" + }, + "location_ids": { + "default": [ + "2840" + ], + "description": "Google geo target ids, e.g. 2840 United States (Demand Gen targets locations per ad group, not per campaign)", + "items": { + "pattern": "^\\d+$", + "type": "string" + }, + "maxItems": 50, + "minItems": 1, + "type": "array" + }, + "name": { + "maxLength": 255, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "name", + "ads" + ], + "type": "object" + }, + "maxItems": 5, + "minItems": 1, + "type": "array" + }, + "bidding": { + "default": "MAXIMIZE_CONVERSIONS", + "description": "Demand Gen bids automatically: MAXIMIZE_CONVERSIONS (needs conversion tracking) or MAXIMIZE_CLICKS", + "enum": [ + "MAXIMIZE_CONVERSIONS", + "MAXIMIZE_CLICKS" + ], + "type": "string" + }, + "daily_budget": { + "description": "Average daily budget in the account's currency, e.g. 20 for $20.00/day", + "exclusiveMinimum": 0, + "maximum": 1000000, + "type": "number" + }, + "end_date": { + "description": "Last day the campaign runs, YYYY-MM-DD", + "pattern": "^\\d{4}-\\d{2}-\\d{2}$", + "type": "string" + }, + "name": { + "description": "Campaign name; must not match an existing campaign", + "maxLength": 255, + "minLength": 1, + "type": "string" + }, + "type": { + "const": "create_demand_gen_campaign", + "type": "string" + } + }, + "required": [ + "type", + "name", + "daily_budget", + "ad_groups" + ], + "type": "object" + }, + { + "description": "Add an ad group, with its keywords and ads, to an existing Search campaign", + "properties": { + "ad_group": { + "properties": { + "ads": { + "items": { + "description": "A responsive search ad", + "properties": { + "descriptions": { + "description": "2 to 4 descriptions, each at most 90 characters", + "items": { + "maxLength": 90, + "minLength": 1, + "type": "string" + }, + "maxItems": 4, + "minItems": 2, + "type": "array" + }, + "final_url": { + "description": "The landing page", + "maxLength": 2048, + "pattern": "^https?:\\/\\/", + "type": "string" + }, + "headlines": { + "description": "3 to 15 headlines, each at most 30 characters", + "items": { + "maxLength": 30, + "minLength": 1, + "type": "string" + }, + "maxItems": 15, + "minItems": 3, + "type": "array" + }, + "path1": { + "description": "Display path part 1, at most 15 characters", + "maxLength": 15, + "minLength": 1, + "type": "string" + }, + "path2": { + "description": "Display path part 2, at most 15 characters", + "maxLength": 15, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "headlines", + "descriptions", + "final_url" + ], + "type": "object" + }, + "maxItems": 3, + "minItems": 1, + "type": "array" + }, + "default_max_cpc": { + "description": "Default max cost per click for the ad group (required when the campaign uses manual CPC)", + "exclusiveMinimum": 0, + "maximum": 1000, + "type": "number" + }, + "keywords": { + "items": { + "properties": { + "match_type": { + "description": "PHRASE matches searches containing the words in order; the usual choice", + "enum": [ + "EXACT", + "PHRASE", + "BROAD" + ], + "type": "string" + }, + "max_cpc": { + "description": "Max cost per click for this keyword in the account's currency (manual CPC only); omit to use the ad group's", + "exclusiveMinimum": 0, + "maximum": 1000, + "type": "number" + }, + "text": { + "description": "The keyword, e.g. \"cleaning invoice template\"", + "maxLength": 80, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "text", + "match_type" + ], + "type": "object" + }, + "maxItems": 50, + "minItems": 1, + "type": "array" + }, + "name": { + "maxLength": 255, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "name", + "keywords", + "ads" + ], + "type": "object" + }, + "campaign_id": { + "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "type": { + "const": "add_ad_group", + "type": "string" + } + }, + "required": [ + "type", + "campaign_id", + "ad_group" + ], + "type": "object" + }, + { + "description": "Add keywords to an existing ad group", + "properties": { + "ad_group_id": { + "description": "Ad group id, digits only (ad_group.id from run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "keywords": { + "items": { + "properties": { + "match_type": { + "description": "PHRASE matches searches containing the words in order; the usual choice", + "enum": [ + "EXACT", + "PHRASE", + "BROAD" + ], + "type": "string" + }, + "max_cpc": { + "description": "Max cost per click for this keyword in the account's currency (manual CPC only); omit to use the ad group's", + "exclusiveMinimum": 0, + "maximum": 1000, + "type": "number" + }, + "text": { + "description": "The keyword, e.g. \"cleaning invoice template\"", + "maxLength": 80, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "text", + "match_type" + ], + "type": "object" + }, + "maxItems": 50, + "minItems": 1, + "type": "array" + }, + "type": { + "const": "add_keywords", + "type": "string" + } + }, + "required": [ + "type", + "ad_group_id", + "keywords" + ], + "type": "object" + }, + { + "description": "Add a responsive search ad to an existing ad group", + "properties": { + "ad": { + "description": "A responsive search ad", + "properties": { + "descriptions": { + "description": "2 to 4 descriptions, each at most 90 characters", + "items": { + "maxLength": 90, + "minLength": 1, + "type": "string" + }, + "maxItems": 4, + "minItems": 2, + "type": "array" + }, + "final_url": { + "description": "The landing page", + "maxLength": 2048, + "pattern": "^https?:\\/\\/", + "type": "string" + }, + "headlines": { + "description": "3 to 15 headlines, each at most 30 characters", + "items": { + "maxLength": 30, + "minLength": 1, + "type": "string" + }, + "maxItems": 15, + "minItems": 3, + "type": "array" + }, + "path1": { + "description": "Display path part 1, at most 15 characters", + "maxLength": 15, + "minLength": 1, + "type": "string" + }, + "path2": { + "description": "Display path part 2, at most 15 characters", + "maxLength": 15, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "headlines", + "descriptions", + "final_url" + ], + "type": "object" + }, + "ad_group_id": { + "description": "Ad group id, digits only (ad_group.id from run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "type": { + "const": "add_responsive_search_ad", + "type": "string" + } + }, + "required": [ + "type", + "ad_group_id", + "ad" + ], + "type": "object" + }, + { + "description": "Add sitelinks to a campaign", + "properties": { + "campaign_id": { + "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "sitelinks": { + "items": { + "properties": { + "description1": { + "description": "At most 35 characters; give both descriptions or neither", + "maxLength": 35, + "minLength": 1, + "type": "string" + }, + "description2": { + "maxLength": 35, + "minLength": 1, + "type": "string" + }, + "text": { + "description": "Link text, at most 25 characters", + "maxLength": 25, + "minLength": 1, + "type": "string" + }, + "url": { + "maxLength": 2048, + "pattern": "^https?:\\/\\/", + "type": "string" + } + }, + "required": [ + "text", + "url" + ], + "type": "object" + }, + "maxItems": 8, + "minItems": 1, + "type": "array" + }, + "type": { + "const": "add_sitelinks", + "type": "string" + } + }, + "required": [ + "type", + "campaign_id", + "sitelinks" + ], + "type": "object" + }, + { + "description": "Make a campaign count and bid on ONE conversion category only (e.g. SIGNUP), so another product's or step's conversions don't steer it", + "properties": { + "campaign_id": { + "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "category": { + "description": "Conversion category, e.g. SIGNUP, PURCHASE, SUBMIT_LEAD_FORM, QUALIFIED_LEAD (see conversion_action.category in run_gaql)", + "pattern": "^[A-Z_]+$", + "type": "string" + }, + "type": { + "const": "set_conversion_goal", + "type": "string" + } + }, + "required": [ + "type", + "campaign_id", + "category" + ], + "type": "object" + }, + { + "description": "Change one keyword's max CPC (manual CPC campaigns)", + "properties": { + "ad_group_id": { + "description": "Ad group id, digits only (ad_group.id from run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "criterion_id": { + "description": "Keyword criterion id, digits only (ad_group_criterion.criterion_id from run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "max_cpc": { + "anyOf": [ + { + "exclusiveMinimum": 0, + "maximum": 1000, + "type": "number" + }, + { + "type": "null" + } + ], + "description": "New max cost per click for this keyword, or null to clear it so the keyword uses the ad group's bid" + }, + "type": { + "const": "set_keyword_bid", + "type": "string" + } + }, + "required": [ + "type", + "ad_group_id", + "criterion_id", + "max_cpc" + ], + "type": "object" + }, + { + "description": "Change an ad group's default max CPC, which its keywords use unless they have their own", + "properties": { + "ad_group_id": { + "description": "Ad group id, digits only (ad_group.id from run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "max_cpc": { + "description": "New default max cost per click for the ad group", + "exclusiveMinimum": 0, + "maximum": 1000, + "type": "number" + }, + "type": { + "const": "set_ad_group_bid", + "type": "string" + } + }, + "required": [ + "type", + "ad_group_id", + "max_cpc" + ], + "type": "object" + }, + { + "description": "Pause one ad", + "properties": { + "ad_group_id": { + "description": "Ad group id, digits only (ad_group.id from run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "ad_id": { + "description": "Ad id, digits only (ad_group_ad.ad.id from run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "type": { + "const": "pause_ad", + "type": "string" + } + }, + "required": [ + "type", + "ad_group_id", + "ad_id" + ], + "type": "object" + }, + { + "description": "Re-enable one paused ad", + "properties": { + "ad_group_id": { + "description": "Ad group id, digits only (ad_group.id from run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "ad_id": { + "description": "Ad id, digits only (ad_group_ad.ad.id from run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "type": { + "const": "enable_ad", + "type": "string" + } + }, + "required": [ + "type", + "ad_group_id", + "ad_id" + ], + "type": "object" + }, + { + "description": "Add locations and/or languages a campaign targets", + "properties": { + "campaign_id": { + "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "language_ids": { + "default": [], + "description": "Language ids to add, e.g. 1000 English", + "items": { + "pattern": "^\\d+$", + "type": "string" + }, + "maxItems": 20, + "type": "array" + }, + "location_ids": { + "default": [], + "description": "Geo target ids to add, e.g. 2840 United States", + "items": { + "pattern": "^\\d+$", + "type": "string" + }, + "maxItems": 50, + "type": "array" + }, + "type": { + "const": "add_campaign_targeting", + "type": "string" + } + }, + "required": [ + "type", + "campaign_id" + ], + "type": "object" + }, + { + "description": "Stop targeting some of a campaign's locations and/or languages", + "properties": { + "campaign_id": { + "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "language_ids": { + "default": [], + "items": { + "pattern": "^\\d+$", + "type": "string" + }, + "maxItems": 20, + "type": "array" + }, + "location_ids": { + "default": [], + "items": { + "pattern": "^\\d+$", + "type": "string" + }, + "maxItems": 50, + "type": "array" + }, + "type": { + "const": "remove_campaign_targeting", + "type": "string" + } + }, + "required": [ + "type", + "campaign_id" + ], + "type": "object" + }, + { + "description": "Choose whether a campaign shows to people in its locations only, or also to people interested in them", + "properties": { + "campaign_id": { + "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "presence_only": { + "description": "true: only people IN the locations; false: also people interested in them", + "type": "boolean" + }, + "type": { + "const": "set_location_mode", + "type": "string" + } + }, + "required": [ + "type", + "campaign_id", + "presence_only" + ], + "type": "object" + }, + { + "description": "Switch a campaign's bid strategy. Google re-learns after a switch, so performance can wobble for a week or two", + "properties": { + "campaign_id": { + "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "max_cpc_ceiling": { + "description": "MAXIMIZE_CLICKS only: the most Google may bid per click", + "exclusiveMinimum": 0, + "maximum": 1000, + "type": "number" + }, + "strategy": { + "enum": [ + "MANUAL_CPC", + "MAXIMIZE_CLICKS", + "MAXIMIZE_CONVERSIONS" + ], + "type": "string" + }, + "target_cpa": { + "description": "MAXIMIZE_CONVERSIONS only: target cost per conversion", + "exclusiveMinimum": 0, + "maximum": 1000, + "type": "number" + }, + "type": { + "const": "set_bidding_strategy", + "type": "string" + } + }, + "required": [ + "type", + "campaign_id", + "strategy" + ], + "type": "object" + }, + { + "description": "Set or clear a campaign's final URL suffix (tracking parameters on every ad click)", + "properties": { + "campaign_id": { + "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "suffix": { + "description": "Query string Google appends to every landing page in the campaign, e.g. \"utm_source=google&utm_medium=cpc&utm_term={keyword}\", or \"none\" to clear it", + "maxLength": 1000, + "type": "string" + }, + "type": { + "const": "set_url_suffix", + "type": "string" + } + }, + "required": [ + "type", + "campaign_id", + "suffix" + ], + "type": "object" + }, + { + "description": "Create a conversion action to measure sign-ups, leads or purchases", + "properties": { + "category": { + "description": "Conversion category, e.g. SIGNUP, PURCHASE, SUBMIT_LEAD_FORM, QUALIFIED_LEAD (see conversion_action.category in run_gaql)", + "pattern": "^[A-Z_]+$", + "type": "string" + }, + "counting": { + "default": "ONE_PER_CLICK", + "description": "ONE_PER_CLICK for sign-ups and leads; MANY_PER_CLICK for purchases", + "enum": [ + "ONE_PER_CLICK", + "MANY_PER_CLICK" + ], + "type": "string" + }, + "default_value": { + "description": "Value per conversion when none is sent", + "maximum": 1000000, + "minimum": 0, + "type": "number" + }, + "name": { + "maxLength": 100, + "minLength": 1, + "type": "string" + }, + "primary": { + "default": true, + "description": "Primary actions count in Conversions and can steer bidding", + "type": "boolean" + }, + "source": { + "default": "UPLOAD_CLICKS", + "description": "UPLOAD_CLICKS: your server uploads ad click ids (no Google tag). WEBPAGE: Google gives you a tag to put on the page", + "enum": [ + "UPLOAD_CLICKS", + "WEBPAGE" + ], + "type": "string" + }, + "type": { + "const": "create_conversion_action", + "type": "string" + } + }, + "required": [ + "type", + "name", + "category" + ], + "type": "object" + }, + { + "description": "Set how many conversions one ad click can produce for a conversion action", + "properties": { + "conversion_action_id": { + "description": "conversion_action.id from run_gaql", + "pattern": "^\\d+$", + "type": "string" + }, + "counting": { + "enum": [ + "ONE_PER_CLICK", + "MANY_PER_CLICK" + ], + "type": "string" + }, + "type": { + "const": "set_conversion_counting", + "type": "string" + } + }, + "required": [ + "type", + "conversion_action_id", + "counting" + ], + "type": "object" + } +]
17 tool updates
- Changed
account_overview1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
apply_changes1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
change_history1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
discard_proposal1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
disconnect1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
keyword_ideas1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
keyword_metrics1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
paid_organic_overlap1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
propose_changes1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
run_gaql1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
search_console_inspect_urls1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
search_console_opportunities1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
search_console_performance1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
search_console_sitemaps1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
search_console_summary1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
search_console_trend1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
undo_changes1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
15 tool updates
- Changed
change_history1 field changed- added
Input schema / properties / limit / descriptionAdded value: +"Most proposals to return, newest first"
- Changed
discard_proposal1 field changed- added
Input schema / properties / proposal_id / descriptionAdded value: +"The id returned by propose_changes"
- Removed
find_wasted_spend - Added
keyword_ideas - Added
keyword_metrics - Added
paid_organic_overlap - Changed
propose_changes2 fields changed- changed
Input schema / properties / changes / descriptionPrevious value: -"Changes to propose"New value: +"Changes to propose; several can go in one proposal" - changed
Input schema / properties / changes / items / oneOfPrevious value: -[ - { - "properties": { - "campaign_id": { - "pattern": "^\\d+$", - "type": "string" - }, - "keywords": { - "items": { - "properties": { - "match_type": { - "enum": [ - "EXACT", - "PHRASE", - "BROAD" - ], - "type": "string" - }, - "text": { - "maxLength": 80, - "minLength": 1, - "type": "string" - } - }, - "required": [ - "text", - "match_type" - ], - "type": "object" - }, - "maxItems": 50, - "minItems": 1, - "type": "array" - }, - "type": { - "const": "add_negative_keywords", - "type": "string" - } - }, - "required": [ - "type", - "campaign_id", - "keywords" - ], - "type": "object" - }, - { - "properties": { - "ad_group_id": { - "pattern": "^\\d+$", - "type": "string" - }, - "criterion_id": { - "pattern": "^\\d+$", - "type": "string" - }, - "type": { - "const": "pause_keyword", - "type": "string" - } - }, - "required": [ - "type", - "ad_group_id", - "criterion_id" - ], - "type": "object" - }, - { - "properties": { - "ad_group_id": { - "pattern": "^\\d+$", - "type": "string" - }, - "criterion_id": { - "pattern": "^\\d+$", - "type": "string" - }, - "type": { - "const": "enable_keyword", - "type": "string" - } - }, - "required": [ - "type", - "ad_group_id", - "criterion_id" - ], - "type": "object" - }, - { - "properties": { - "ad_group_id": { - "pattern": "^\\d+$", - "type": "string" - }, - "type": { - "const": "pause_ad_group", - "type": "string" - } - }, - "required": [ - "type", - "ad_group_id" - ], - "type": "object" - }, - { - "properties": { - "ad_group_id": { - "pattern": "^\\d+$", - "type": "string" - }, - "type": { - "const": "enable_ad_group", - "type": "string" - } - }, - "required": [ - "type", - "ad_group_id" - ], - "type": "object" - }, - { - "properties": { - "amount": { - "exclusiveMinimum": 0, - "maximum": 1000000, - "type": "number" - }, - "campaign_id": { - "pattern": "^\\d+$", - "type": "string" - }, - "type": { - "const": "set_daily_budget", - "type": "string" - } - }, - "required": [ - "type", - "campaign_id", - "amount" - ], - "type": "object" - }, - { - "properties": { - "campaign_id": { - "pattern": "^\\d+$", - "type": "string" - }, - "resource_names": { - "items": { - "type": "string" - }, - "minItems": 1, - "type": "array" - }, - "type": { - "const": "remove_negative_keywords", - "type": "string" - } - }, - "required": [ - "type", - "campaign_id", - "resource_names" - ], - "type": "object" - } -]New value: +[ + { + "description": "Block searches containing these words in one campaign", + "properties": { + "campaign_id": { + "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "keywords": { + "items": { + "properties": { + "match_type": { + "description": "PHRASE blocks any search containing the words in order; the usual choice", + "enum": [ + "EXACT", + "PHRASE", + "BROAD" + ], + "type": "string" + }, + "text": { + "description": "The search words to block, e.g. \"free\"", + "maxLength": 80, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "text", + "match_type" + ], + "type": "object" + }, + "maxItems": 50, + "minItems": 1, + "type": "array" + }, + "type": { + "const": "add_negative_keywords", + "type": "string" + } + }, + "required": [ + "type", + "campaign_id", + "keywords" + ], + "type": "object" + }, + { + "description": "Pause one keyword", + "properties": { + "ad_group_id": { + "description": "Ad group id, digits only (ad_group.id from run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "criterion_id": { + "description": "Keyword criterion id, digits only (ad_group_criterion.criterion_id from run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "type": { + "const": "pause_keyword", + "type": "string" + } + }, + "required": [ + "type", + "ad_group_id", + "criterion_id" + ], + "type": "object" + }, + { + "description": "Re-enable one paused keyword", + "properties": { + "ad_group_id": { + "description": "Ad group id, digits only (ad_group.id from run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "criterion_id": { + "description": "Keyword criterion id, digits only (ad_group_criterion.criterion_id from run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "type": { + "const": "enable_keyword", + "type": "string" + } + }, + "required": [ + "type", + "ad_group_id", + "criterion_id" + ], + "type": "object" + }, + { + "description": "Pause a whole campaign (stops all its spend)", + "properties": { + "campaign_id": { + "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "type": { + "const": "pause_campaign", + "type": "string" + } + }, + "required": [ + "type", + "campaign_id" + ], + "type": "object" + }, + { + "description": "Turn a paused campaign back on. It starts spending again; the summary says how much", + "properties": { + "campaign_id": { + "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "type": { + "const": "enable_campaign", + "type": "string" + } + }, + "required": [ + "type", + "campaign_id" + ], + "type": "object" + }, + { + "description": "Pause one ad group", + "properties": { + "ad_group_id": { + "description": "Ad group id, digits only (ad_group.id from run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "type": { + "const": "pause_ad_group", + "type": "string" + } + }, + "required": [ + "type", + "ad_group_id" + ], + "type": "object" + }, + { + "description": "Re-enable one paused ad group", + "properties": { + "ad_group_id": { + "description": "Ad group id, digits only (ad_group.id from run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "type": { + "const": "enable_ad_group", + "type": "string" + } + }, + "required": [ + "type", + "ad_group_id" + ], + "type": "object" + }, + { + "description": "Change a campaign's daily budget (not shared budgets)", + "properties": { + "amount": { + "description": "New average daily budget in the account's currency, e.g. 10 for $10.00/day (not micros)", + "exclusiveMinimum": 0, + "maximum": 1000000, + "type": "number" + }, + "campaign_id": { + "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "type": { + "const": "set_daily_budget", + "type": "string" + } + }, + "required": [ + "type", + "campaign_id", + "amount" + ], + "type": "object" + }, + { + "description": "Set the last day a campaign runs, so it stops spending on its own", + "properties": { + "campaign_id": { + "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "end_date": { + "anyOf": [ + { + "pattern": "^\\d{4}-\\d{2}-\\d{2}$", + "type": "string" + }, + { + "const": "none", + "type": "string" + } + ], + "description": "Last day the campaign runs, YYYY-MM-DD in the account's time zone (it stops after 23:59:59 that day), or \"none\" to remove the end date" + }, + "type": { + "const": "set_end_date", + "type": "string" + } + }, + "required": [ + "type", + "campaign_id", + "end_date" + ], + "type": "object" + }, + { + "description": "Build a new Search campaign with its ad groups, keywords, ads, targeting, negatives and sitelinks, in one step. It is created PAUSED: nothing spends until a separate enable_campaign", + "properties": { + "ad_groups": { + "items": { + "properties": { + "ads": { + "items": { + "description": "A responsive search ad", + "properties": { + "descriptions": { + "description": "2 to 4 descriptions, each at most 90 characters", + "items": { + "maxLength": 90, + "minLength": 1, + "type": "string" + }, + "maxItems": 4, + "minItems": 2, + "type": "array" + }, + "final_url": { + "description": "The landing page", + "maxLength": 2048, + "pattern": "^https?:\\/\\/", + "type": "string" + }, + "headlines": { + "description": "3 to 15 headlines, each at most 30 characters", + "items": { + "maxLength": 30, + "minLength": 1, + "type": "string" + }, + "maxItems": 15, + "minItems": 3, + "type": "array" + }, + "path1": { + "description": "Display path part 1, at most 15 characters", + "maxLength": 15, + "minLength": 1, + "type": "string" + }, + "path2": { + "description": "Display path part 2, at most 15 characters", + "maxLength": 15, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "headlines", + "descriptions", + "final_url" + ], + "type": "object" + }, + "maxItems": 3, + "minItems": 1, + "type": "array" + }, + "default_max_cpc": { + "description": "Default max cost per click for the ad group (required when the campaign uses manual CPC)", + "exclusiveMinimum": 0, + "maximum": 1000, + "type": "number" + }, + "keywords": { + "items": { + "properties": { + "match_type": { + "description": "PHRASE matches searches containing the words in order; the usual choice", + "enum": [ + "EXACT", + "PHRASE", + "BROAD" + ], + "type": "string" + }, + "max_cpc": { + "description": "Max cost per click for this keyword in the account's currency (manual CPC only); omit to use the ad group's", + "exclusiveMinimum": 0, + "maximum": 1000, + "type": "number" + }, + "text": { + "description": "The keyword, e.g. \"cleaning invoice template\"", + "maxLength": 80, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "text", + "match_type" + ], + "type": "object" + }, + "maxItems": 50, + "minItems": 1, + "type": "array" + }, + "name": { + "maxLength": 255, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "name", + "keywords", + "ads" + ], + "type": "object" + }, + "maxItems": 10, + "minItems": 1, + "type": "array" + }, + "bidding": { + "default": "MANUAL_CPC", + "description": "MANUAL_CPC uses the ad group and keyword max CPCs; MAXIMIZE_CLICKS and MAXIMIZE_CONVERSIONS let Google bid within the budget", + "enum": [ + "MANUAL_CPC", + "MAXIMIZE_CLICKS", + "MAXIMIZE_CONVERSIONS" + ], + "type": "string" + }, + "daily_budget": { + "description": "Average daily budget in the account's currency, e.g. 20 for $20.00/day", + "exclusiveMinimum": 0, + "maximum": 1000000, + "type": "number" + }, + "end_date": { + "description": "Last day the campaign runs, YYYY-MM-DD", + "pattern": "^\\d{4}-\\d{2}-\\d{2}$", + "type": "string" + }, + "language_ids": { + "default": [ + "1000" + ], + "description": "Google language ids, e.g. 1000 English, 1003 Spanish", + "items": { + "pattern": "^\\d+$", + "type": "string" + }, + "maxItems": 20, + "minItems": 1, + "type": "array" + }, + "location_ids": { + "default": [ + "2840" + ], + "description": "Google geo target ids, e.g. 2840 United States, 2826 United Kingdom, 2124 Canada (look others up in geo_target_constant)", + "items": { + "pattern": "^\\d+$", + "type": "string" + }, + "maxItems": 50, + "minItems": 1, + "type": "array" + }, + "max_cpc_ceiling": { + "description": "MAXIMIZE_CLICKS only: the most Google may bid per click", + "exclusiveMinimum": 0, + "maximum": 1000, + "type": "number" + }, + "name": { + "description": "Campaign name; must not match an existing campaign", + "maxLength": 255, + "minLength": 1, + "type": "string" + }, + "negative_keywords": { + "default": [], + "description": "Searches to block across the campaign", + "items": { + "properties": { + "match_type": { + "enum": [ + "EXACT", + "PHRASE", + "BROAD" + ], + "type": "string" + }, + "text": { + "maxLength": 80, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "text", + "match_type" + ], + "type": "object" + }, + "maxItems": 200, + "type": "array" + }, + "presence_only": { + "default": true, + "description": "Show ads only to people IN the locations (true), not merely interested in them", + "type": "boolean" + }, + "search_partners": { + "default": false, + "description": "Also show on Google's search partner sites", + "type": "boolean" + }, + "sitelinks": { + "default": [], + "items": { + "properties": { + "description1": { + "description": "At most 35 characters; give both descriptions or neither", + "maxLength": 35, + "minLength": 1, + "type": "string" + }, + "description2": { + "maxLength": 35, + "minLength": 1, + "type": "string" + }, + "text": { + "description": "Link text, at most 25 characters", + "maxLength": 25, + "minLength": 1, + "type": "string" + }, + "url": { + "maxLength": 2048, + "pattern": "^https?:\\/\\/", + "type": "string" + } + }, + "required": [ + "text", + "url" + ], + "type": "object" + }, + "maxItems": 8, + "type": "array" + }, + "type": { + "const": "create_campaign", + "type": "string" + } + }, + "required": [ + "type", + "name", + "daily_budget", + "ad_groups" + ], + "type": "object" + }, + { + "description": "Add an ad group, with its keywords and ads, to an existing Search campaign", + "properties": { + "ad_group": { + "properties": { + "ads": { + "items": { + "description": "A responsive search ad", + "properties": { + "descriptions": { + "description": "2 to 4 descriptions, each at most 90 characters", + "items": { + "maxLength": 90, + "minLength": 1, + "type": "string" + }, + "maxItems": 4, + "minItems": 2, + "type": "array" + }, + "final_url": { + "description": "The landing page", + "maxLength": 2048, + "pattern": "^https?:\\/\\/", + "type": "string" + }, + "headlines": { + "description": "3 to 15 headlines, each at most 30 characters", + "items": { + "maxLength": 30, + "minLength": 1, + "type": "string" + }, + "maxItems": 15, + "minItems": 3, + "type": "array" + }, + "path1": { + "description": "Display path part 1, at most 15 characters", + "maxLength": 15, + "minLength": 1, + "type": "string" + }, + "path2": { + "description": "Display path part 2, at most 15 characters", + "maxLength": 15, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "headlines", + "descriptions", + "final_url" + ], + "type": "object" + }, + "maxItems": 3, + "minItems": 1, + "type": "array" + }, + "default_max_cpc": { + "description": "Default max cost per click for the ad group (required when the campaign uses manual CPC)", + "exclusiveMinimum": 0, + "maximum": 1000, + "type": "number" + }, + "keywords": { + "items": { + "properties": { + "match_type": { + "description": "PHRASE matches searches containing the words in order; the usual choice", + "enum": [ + "EXACT", + "PHRASE", + "BROAD" + ], + "type": "string" + }, + "max_cpc": { + "description": "Max cost per click for this keyword in the account's currency (manual CPC only); omit to use the ad group's", + "exclusiveMinimum": 0, + "maximum": 1000, + "type": "number" + }, + "text": { + "description": "The keyword, e.g. \"cleaning invoice template\"", + "maxLength": 80, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "text", + "match_type" + ], + "type": "object" + }, + "maxItems": 50, + "minItems": 1, + "type": "array" + }, + "name": { + "maxLength": 255, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "name", + "keywords", + "ads" + ], + "type": "object" + }, + "campaign_id": { + "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "type": { + "const": "add_ad_group", + "type": "string" + } + }, + "required": [ + "type", + "campaign_id", + "ad_group" + ], + "type": "object" + }, + { + "description": "Add keywords to an existing ad group", + "properties": { + "ad_group_id": { + "description": "Ad group id, digits only (ad_group.id from run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "keywords": { + "items": { + "properties": { + "match_type": { + "description": "PHRASE matches searches containing the words in order; the usual choice", + "enum": [ + "EXACT", + "PHRASE", + "BROAD" + ], + "type": "string" + }, + "max_cpc": { + "description": "Max cost per click for this keyword in the account's currency (manual CPC only); omit to use the ad group's", + "exclusiveMinimum": 0, + "maximum": 1000, + "type": "number" + }, + "text": { + "description": "The keyword, e.g. \"cleaning invoice template\"", + "maxLength": 80, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "text", + "match_type" + ], + "type": "object" + }, + "maxItems": 50, + "minItems": 1, + "type": "array" + }, + "type": { + "const": "add_keywords", + "type": "string" + } + }, + "required": [ + "type", + "ad_group_id", + "keywords" + ], + "type": "object" + }, + { + "description": "Add a responsive search ad to an existing ad group", + "properties": { + "ad": { + "description": "A responsive search ad", + "properties": { + "descriptions": { + "description": "2 to 4 descriptions, each at most 90 characters", + "items": { + "maxLength": 90, + "minLength": 1, + "type": "string" + }, + "maxItems": 4, + "minItems": 2, + "type": "array" + }, + "final_url": { + "description": "The landing page", + "maxLength": 2048, + "pattern": "^https?:\\/\\/", + "type": "string" + }, + "headlines": { + "description": "3 to 15 headlines, each at most 30 characters", + "items": { + "maxLength": 30, + "minLength": 1, + "type": "string" + }, + "maxItems": 15, + "minItems": 3, + "type": "array" + }, + "path1": { + "description": "Display path part 1, at most 15 characters", + "maxLength": 15, + "minLength": 1, + "type": "string" + }, + "path2": { + "description": "Display path part 2, at most 15 characters", + "maxLength": 15, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "headlines", + "descriptions", + "final_url" + ], + "type": "object" + }, + "ad_group_id": { + "description": "Ad group id, digits only (ad_group.id from run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "type": { + "const": "add_responsive_search_ad", + "type": "string" + } + }, + "required": [ + "type", + "ad_group_id", + "ad" + ], + "type": "object" + }, + { + "description": "Add sitelinks to a campaign", + "properties": { + "campaign_id": { + "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "sitelinks": { + "items": { + "properties": { + "description1": { + "description": "At most 35 characters; give both descriptions or neither", + "maxLength": 35, + "minLength": 1, + "type": "string" + }, + "description2": { + "maxLength": 35, + "minLength": 1, + "type": "string" + }, + "text": { + "description": "Link text, at most 25 characters", + "maxLength": 25, + "minLength": 1, + "type": "string" + }, + "url": { + "maxLength": 2048, + "pattern": "^https?:\\/\\/", + "type": "string" + } + }, + "required": [ + "text", + "url" + ], + "type": "object" + }, + "maxItems": 8, + "minItems": 1, + "type": "array" + }, + "type": { + "const": "add_sitelinks", + "type": "string" + } + }, + "required": [ + "type", + "campaign_id", + "sitelinks" + ], + "type": "object" + }, + { + "description": "Make a campaign count and bid on ONE conversion category only (e.g. SIGNUP), so another product's or step's conversions don't steer it", + "properties": { + "campaign_id": { + "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "category": { + "description": "Conversion category, e.g. SIGNUP, PURCHASE, SUBMIT_LEAD_FORM, QUALIFIED_LEAD (see conversion_action.category in run_gaql)", + "pattern": "^[A-Z_]+$", + "type": "string" + }, + "type": { + "const": "set_conversion_goal", + "type": "string" + } + }, + "required": [ + "type", + "campaign_id", + "category" + ], + "type": "object" + }, + { + "description": "Change one keyword's max CPC (manual CPC campaigns)", + "properties": { + "ad_group_id": { + "description": "Ad group id, digits only (ad_group.id from run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "criterion_id": { + "description": "Keyword criterion id, digits only (ad_group_criterion.criterion_id from run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "max_cpc": { + "anyOf": [ + { + "exclusiveMinimum": 0, + "maximum": 1000, + "type": "number" + }, + { + "type": "null" + } + ], + "description": "New max cost per click for this keyword, or null to clear it so the keyword uses the ad group's bid" + }, + "type": { + "const": "set_keyword_bid", + "type": "string" + } + }, + "required": [ + "type", + "ad_group_id", + "criterion_id", + "max_cpc" + ], + "type": "object" + }, + { + "description": "Change an ad group's default max CPC, which its keywords use unless they have their own", + "properties": { + "ad_group_id": { + "description": "Ad group id, digits only (ad_group.id from run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "max_cpc": { + "description": "New default max cost per click for the ad group", + "exclusiveMinimum": 0, + "maximum": 1000, + "type": "number" + }, + "type": { + "const": "set_ad_group_bid", + "type": "string" + } + }, + "required": [ + "type", + "ad_group_id", + "max_cpc" + ], + "type": "object" + }, + { + "description": "Pause one ad", + "properties": { + "ad_group_id": { + "description": "Ad group id, digits only (ad_group.id from run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "ad_id": { + "description": "Ad id, digits only (ad_group_ad.ad.id from run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "type": { + "const": "pause_ad", + "type": "string" + } + }, + "required": [ + "type", + "ad_group_id", + "ad_id" + ], + "type": "object" + }, + { + "description": "Re-enable one paused ad", + "properties": { + "ad_group_id": { + "description": "Ad group id, digits only (ad_group.id from run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "ad_id": { + "description": "Ad id, digits only (ad_group_ad.ad.id from run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "type": { + "const": "enable_ad", + "type": "string" + } + }, + "required": [ + "type", + "ad_group_id", + "ad_id" + ], + "type": "object" + }, + { + "description": "Add locations and/or languages a campaign targets", + "properties": { + "campaign_id": { + "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "language_ids": { + "default": [], + "description": "Language ids to add, e.g. 1000 English", + "items": { + "pattern": "^\\d+$", + "type": "string" + }, + "maxItems": 20, + "type": "array" + }, + "location_ids": { + "default": [], + "description": "Geo target ids to add, e.g. 2840 United States", + "items": { + "pattern": "^\\d+$", + "type": "string" + }, + "maxItems": 50, + "type": "array" + }, + "type": { + "const": "add_campaign_targeting", + "type": "string" + } + }, + "required": [ + "type", + "campaign_id" + ], + "type": "object" + }, + { + "description": "Stop targeting some of a campaign's locations and/or languages", + "properties": { + "campaign_id": { + "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "language_ids": { + "default": [], + "items": { + "pattern": "^\\d+$", + "type": "string" + }, + "maxItems": 20, + "type": "array" + }, + "location_ids": { + "default": [], + "items": { + "pattern": "^\\d+$", + "type": "string" + }, + "maxItems": 50, + "type": "array" + }, + "type": { + "const": "remove_campaign_targeting", + "type": "string" + } + }, + "required": [ + "type", + "campaign_id" + ], + "type": "object" + }, + { + "description": "Choose whether a campaign shows to people in its locations only, or also to people interested in them", + "properties": { + "campaign_id": { + "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "presence_only": { + "description": "true: only people IN the locations; false: also people interested in them", + "type": "boolean" + }, + "type": { + "const": "set_location_mode", + "type": "string" + } + }, + "required": [ + "type", + "campaign_id", + "presence_only" + ], + "type": "object" + }, + { + "description": "Switch a campaign's bid strategy. Google re-learns after a switch, so performance can wobble for a week or two", + "properties": { + "campaign_id": { + "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "max_cpc_ceiling": { + "description": "MAXIMIZE_CLICKS only: the most Google may bid per click", + "exclusiveMinimum": 0, + "maximum": 1000, + "type": "number" + }, + "strategy": { + "enum": [ + "MANUAL_CPC", + "MAXIMIZE_CLICKS", + "MAXIMIZE_CONVERSIONS" + ], + "type": "string" + }, + "target_cpa": { + "description": "MAXIMIZE_CONVERSIONS only: target cost per conversion", + "exclusiveMinimum": 0, + "maximum": 1000, + "type": "number" + }, + "type": { + "const": "set_bidding_strategy", + "type": "string" + } + }, + "required": [ + "type", + "campaign_id", + "strategy" + ], + "type": "object" + }, + { + "description": "Set or clear a campaign's final URL suffix (tracking parameters on every ad click)", + "properties": { + "campaign_id": { + "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)", + "pattern": "^\\d+$", + "type": "string" + }, + "suffix": { + "description": "Query string Google appends to every landing page in the campaign, e.g. \"utm_source=google&utm_medium=cpc&utm_term={keyword}\", or \"none\" to clear it", + "maxLength": 1000, + "type": "string" + }, + "type": { + "const": "set_url_suffix", + "type": "string" + } + }, + "required": [ + "type", + "campaign_id", + "suffix" + ], + "type": "object" + }, + { + "description": "Create a conversion action to measure sign-ups, leads or purchases", + "properties": { + "category": { + "description": "Conversion category, e.g. SIGNUP, PURCHASE, SUBMIT_LEAD_FORM, QUALIFIED_LEAD (see conversion_action.category in run_gaql)", + "pattern": "^[A-Z_]+$", + "type": "string" + }, + "counting": { + "default": "ONE_PER_CLICK", + "description": "ONE_PER_CLICK for sign-ups and leads; MANY_PER_CLICK for purchases", + "enum": [ + "ONE_PER_CLICK", + "MANY_PER_CLICK" + ], + "type": "string" + }, + "default_value": { + "description": "Value per conversion when none is sent", + "maximum": 1000000, + "minimum": 0, + "type": "number" + }, + "name": { + "maxLength": 100, + "minLength": 1, + "type": "string" + }, + "primary": { + "default": true, + "description": "Primary actions count in Conversions and can steer bidding", + "type": "boolean" + }, + "source": { + "default": "UPLOAD_CLICKS", + "description": "UPLOAD_CLICKS: your server uploads ad click ids (no Google tag). WEBPAGE: Google gives you a tag to put on the page", + "enum": [ + "UPLOAD_CLICKS", + "WEBPAGE" + ], + "type": "string" + }, + "type": { + "const": "create_conversion_action", + "type": "string" + } + }, + "required": [ + "type", + "name", + "category" + ], + "type": "object" + }, + { + "description": "Set how many conversions one ad click can produce for a conversion action", + "properties": { + "conversion_action_id": { + "description": "conversion_action.id from run_gaql", + "pattern": "^\\d+$", + "type": "string" + }, + "counting": { + "enum": [ + "ONE_PER_CLICK", + "MANY_PER_CLICK" + ], + "type": "string" + }, + "type": { + "const": "set_conversion_counting", + "type": "string" + } + }, + "required": [ + "type", + "conversion_action_id", + "counting" + ], + "type": "object" + } +]
- Added
search_console_inspect_urls - Added
search_console_opportunities - Added
search_console_performance - Added
search_console_sitemaps - Added
search_console_sites - Added
search_console_summary - Added
search_console_trend - Changed
undo_changes1 field changed- added
Input schema / properties / proposal_id / descriptionAdded value: +"The id of an applied proposal, from change_history or apply_changes"
11 tool updates
- First observed
account_overview - First observed
apply_changes - First observed
billing - First observed
change_history - First observed
discard_proposal - First observed
disconnect - First observed
find_wasted_spend - First observed
list_accounts - First observed
propose_changes - First observed
run_gaql - First observed
undo_changes
Publisher details
- Operator
- camberstack.io
- Operator website
- https://camberstack.io
- Vendor relationship
- Not applicable
- Documentation
- https://camberstack.io/#setup
- Trust center
- Not applicable
- Restrictions
- After 3 applies requires pro plan
Related MCP Connectors
Google Ads MCP: reports, search terms, negatives, budgets, campaigns. Approval on every write.
Google Ads MCP with 20,000+ account peer context and staged approve-then-execute writes.
Google Ads MCP server — manage campaigns, keywords, and metrics.
Hosted Google Ads MCP server for Claude, ChatGPT and Cursor, with each action switched per account.
Related MCP Servers
- AlicenseAqualityAmaintenanceAn MCP server that enables safe, audited mutation of Google Ads campaigns—creating ads, ad groups, keywords, and assets or adjusting budgets and statuses—with a dry-run default and an optional guarded remove operation, plus read-only Keyword Planner ideas.221MIT
- FlicenseNot gradedqualityCmaintenanceEnables management of Google Ads accounts via MCP, providing read and write tools for campaigns, ad groups, keywords, assets, and more, with support for reporting and mutations.-
- AlicenseNot gradedqualityCmaintenanceEnables reading and mutating Google Ads campaigns via MCP tools, and includes structured marketer workflows for search term mining, budget optimization, and weekly reviews.19 npm6MIT
- AlicenseNot gradedqualityCmaintenanceMCP server for managing Google Ads campaigns through the official Google Ads API, covering accounts, campaigns, budgets, keywords, search terms, and keyword ideas. It provides tools for both reading and mutating live ads data, such as pausing campaigns, updating budgets, and adding keywords.MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.