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

# List Google Ads campaign changes

`GET /api/apps/{app_id}/google-ads/campaigns/{campaign_id}/change-log`

## Request

- Base URL: `https://app.base44.com`
- URL: `https://app.base44.com/api/apps/{app_id}/google-ads/campaigns/{campaign_id}/change-log`
- Auth: HTTP bearer

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

Returns a campaign's change history, newest first: every pause, resume, edit, and deletion, with who made it and when.

`event_type` says what happened. An `EDITED` entry carries the field and its before and after values in `details`. `actor` is `system` for a change Base44 made on its own, such as pausing a campaign over an unpaid balance, and otherwise identifies the user who made it.

Use `limit` to cap how many entries come back. The default is 50 and the most you can ask for is 500. There is no paging, so a campaign with a long history returns only its most recent entries.

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

## Query parameters

- `limit` integer: Most entries to return, newest first.

## Response `200`

Successful Response

- CampaignChangeLogEntry[]
  - `id` string, required: ID of the log entry.
  - `campaign_id` string, required: Campaign the change applies to.
  - `event_type` string, required: What happened: `CREATED`, `PAUSED`, `RESUMED`, `DELETED`, `EDITED`, or `EU_POLITICAL_AUTO_DECLARED`.
  - `details` object, required: Extra detail about the change. For an `EDITED` entry this carries `field`, `before`, and `after`. It is empty for the other event types.
  - `actor` string, required: Who made the change: `system` for an automatic change such as a billing pause, otherwise the ID of the user who made it.
  - `created_date` string, date-time, required: When the change happened.

## 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. Marketing setup, campaign edits, generation and resuming also return `app_marketing_not_allowed` when the app's owning workspace has the FERPA designation. Historical reads, pausing, deletion and financial settlement remain available.
- `404`: The app has no connected Google Ads account, or there is no campaign with this ID.
- `422`: Validation Error

## Changes

> 58 revisions in range; 1 not diffed.

- **2026-10-13** `b92cc2f13639`: 2 info
  - the security scope `read_only` was added to the endpoint's security scheme `PersonalAccessTokenAuth`
  - the security scope `full_access` was removed from the endpoint's security scheme `PersonalAccessTokenAuth`
- **2026-10-12** `5e139db2e643`: 1 info
  - the endpoint scheme security `PersonalAccessTokenAuth` was added to the API

[Operation history](https://skmtc.dev/adexad/apis/base44-app-management-api/changes/api/apps/:app_id/google-ads/campaigns/:campaign_id/change-log/get.md)

---

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