---
title: "List Google Ads campaign optimization suggestions"
method: GET
path: "/api/apps/{app_id}/google-ads/campaigns/{campaign_id}/optimization-suggestions"
---

# List Google Ads campaign optimization suggestions

`GET /api/apps/{app_id}/google-ads/campaigns/{campaign_id}/optimization-suggestions`

<Info>This API is in beta. Endpoints, fields, and behavior may still change, so avoid depending on it in production.</Info>

Returns what to change on one campaign: budget, tracking and policy problems Base44 spotted, plus Google Ads' own recommendations for that campaign.

Base44's own suggestions are computed from its stored metrics for the last 14 days, so they cost no Google call. Google's recommendations for this campaign are merged in on top and carry `source` set to `google` along with `recommendation_type`; Base44's own suggestions have neither field, which is how you tell them apart.

When Google cannot be reached you still get a 200 with Base44's own suggestions only, and nothing in the response says the Google half is missing. An empty array means nothing needs attention.

A suggestion with `recommendation_type` `CAMPAIGN_BUDGET` can be applied with [Apply budget recommendation](/api-reference/apply-a-google-ads-budget-recommendation).

<Warning>The response includes fields beyond the ones documented here. Don't rely on undocumented response fields, as they can change at any time.</Warning>

<Note>This endpoint accepts a personal API key. Workspace API keys are not authorized for it and are rejected with a 403.</Note>

## Path parameters

- `app_id` string, required — ID of the app whose Google Ads campaigns to manage.
- `campaign_id` string, required — Base44's ID for the campaign, as returned in `id` by [List campaigns](/api-reference/list-google-ads-campaigns). This is not the Google Ads campaign ID, which is reported separately as `google_campaign_id`.

## Response `200`

What to change on this campaign.

- AccountInsight[]
  - `id` string, required — Stable ID for the suggestion. Pass it as `insight_id` to [Dismiss insight](/api-reference/dismiss-google-ads-insight) to stop it coming back.
  - `severity` string, required — How urgent the suggestion is: `high`, `medium`, or `low`.
  - `title` string, required — One-line summary of the suggestion.
  - `description` string, required — The suggestion in full, written for an app owner to read as-is.
  - `action` string, nullable — What resolving the suggestion involves: `edit_budget`, `edit_sitelinks`, `improve_assets`, or `open_campaign`. `null` when Base44 could not resolve a campaign to act on.
  - `action_payload` object — The values the suggestion proposes. `campaign_ids` names the campaigns it applies to, `field` and `value` carry a proposed budget in micros where there is one.
  - `source` string, nullable — `google` when the suggestion is Google Ads' own recommendation rather than Base44's. Absent on Base44's own suggestions.
  - `recommendation_type` string, nullable — Present with `source`. `CAMPAIGN_BUDGET` for a Google budget recommendation, `AD_STRENGTH_DROP` for an ad-strength one.

## Other responses

- `401` — Missing or invalid credentials.
- `403` — You don't have access to this app, the app does not exist, or you used a workspace API key. A missing app and an app you cannot reach are deliberately the same answer.
- `404` — The app has no connected Google Ads account, or there is no campaign with this ID.

---

[API](https://skmtc.dev/base44/apis/base44-app-management-api.md) · [All operations](https://skmtc.dev/base44/apis/base44-app-management-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/base44/base44-app-management-api/revisions/173e4e9c63c2/schema)
