---
title: "Sync Google Ads campaigns"
method: POST
path: "/api/apps/{app_id}/google-ads/campaigns/sync"
---

# Sync Google Ads campaigns

`POST /api/apps/{app_id}/google-ads/campaigns/sync`

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

Reads the account's campaigns from Google Ads now, saves them to Base44, and returns what Google reported.

For each campaign it reads, Base44 replaces its own record of the name, status, type, daily budget, and serving and policy status with Google's. A campaign on the account that Base44 has no record of, such as one created outside Base44, is added. Deleted campaigns are skipped.

Base44 already refreshes campaign statuses and metrics from Google in the background about once an hour, and that refresh never adds a campaign Base44 doesn't know about. Call this when you need Google's current state right away, or to bring in campaigns created outside Base44.

The rows carry `google_campaign_id` but not Base44's `id`. To act on a campaign afterwards, find its `id` in [List campaigns](/api-reference/list-google-ads-campaigns). The metrics are not limited to a date range. Use [Get campaign metrics](/api-reference/get-google-ads-campaign-metrics) for figures over a window.

<Warning>A sync reads at most 50 campaigns, the ones with the most impressions, and there is no pagination. On an account with more campaigns than that, the rest are neither refreshed nor returned, and nothing in the response says so.</Warning>

This keeps working while the workspace is on a billing hold, so the campaigns it owes for can still be refreshed.

This is limited to 6 requests a minute per app. Some workspaces have a different limit.

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

<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>

## Path parameters

- `app_id` string, required — ID of the app whose Google Ads campaigns to manage.

## Response `200`

The campaigns Google reported, as Base44 saved them.

- SyncedCampaign[]
  - `google_campaign_id` string, required — The campaign's ID in Google Ads. Match it against `google_campaign_id` from [List campaigns](/api-reference/list-google-ads-campaigns) to find Base44's `id` for the campaign.
  - `name` string, required — Name shown for the campaign.
  - `status` string, required — Serving state Google reports, `ENABLED` or `PAUSED`.
  - `campaign_type` string, required — Campaign type, passed through as Google reports it. Base44 creates `SMART` and `PERFORMANCE_MAX`. The other values appear only on campaigns created outside Base44.
  - `impressions` integer, required — Times the campaign's ads were shown.
  - `clicks` integer, required — Clicks the campaign received.
  - `cost_micros` integer, required — Spend in micros of the account currency, where 1,000,000 micros is one unit, so `248000000` is 248.00.
  - `conversions` number, required — Conversions Google attributed to the campaign.
  - `review_status` string, required — Google's policy review status as Base44 last recorded it (`REVIEWED`, `UNDER_REVIEW`, …). A sync doesn't refresh it, and it's empty on a campaign the sync just added.
  - `serving_status` string, required — Google's serving status, passed through as Google reports it.
  - `primary_status` string, required — Google's summary of whether the campaign is serving well, passed through as Google reports it (`ELIGIBLE`, `LIMITED`, `NOT_SERVING`, …).
  - `primary_status_reasons` string[], required — Google's reasons behind `primary_status`, for example why a campaign is limited. Empty when there is nothing to explain.

## Other responses

- `400` — Google Ads rejected the read.
- `401` — Missing or invalid credentials.
- `403` — You don't have access to this app, the app does not exist, you used a read-only or workspace API key, or Google Ads refused access to the account. A missing app and an app you cannot reach are deliberately the same answer.
- `404` — The app has no connected Google Ads account.
- `429` — The app has used up its sync quota for the current minute, or Google Ads is rate limiting the account. Retry later.

## Changes

- **2026-09-29** `347e2afcf94a` — 1 info
  - endpoint added

[Change history](https://skmtc.dev/idealspot/apis/base44-app-management-api/changes/api/apps/:app_id/google-ads/campaigns/sync/post.md)

---

[API](https://skmtc.dev/idealspot/apis/base44-app-management-api.md) · [All operations](https://skmtc.dev/idealspot/apis/base44-app-management-api/llms.txt) · [OpenAPI document](https://skmtc.dev/idealspot/apis/base44-app-management-api/revisions/e2a6a9f1fe4c?raw)
