---
title: "Generate Google Ads campaign brief"
method: POST
path: "/api/apps/{app_id}/google-ads/campaign-briefs/generate"
---

# Generate Google Ads campaign brief

`POST /api/apps/{app_id}/google-ads/campaign-briefs/generate`

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

Writes a campaign brief for you from a few business details, and saves it.

Send the business name, what it does, its landing page, and any keywords you already have. Base44 writes ad headlines and descriptions from those details, and saves them as a new brief. `source` on the response is `ai`, which is how you tell a generated brief from one you wrote.

The copy is written in whichever language the details you send are in, and that language is recorded on the brief. Base44 does not open the landing page to work this out, so it passes the URL along as text and nothing more. A German site described in English produces English copy.

This runs a language model, so it is slower than the other endpoints here and it draws on a per-app quota shared with the other Google Ads generation endpoints. The default is 20 requests a minute, and your workspace's plan can raise it, so treat the 429 rather than a fixed count as the signal you have run out.

<Warning>A generation failure still returns a 200 with a saved brief. Base44 records the failure on its side and hands back a brief whose `headlines` and `descriptions` are empty, still marked `source: ai`. Check that those two lists are non-empty before you use the result.</Warning>

<Warning>This creates a new brief every time it is called. There is nothing that keeps one brief per campaign type, so a retried request leaves you with duplicates. Read the list first and use [Update campaign brief](/api-reference/update-google-ads-campaign-brief) when you already have one.</Warning>

<Warning>The response includes fields beyond the ones documented here. Don't rely on undocumented response fields, as they can change at any time. Send only the fields documented here. Other request fields are not supported and their behavior can change.</Warning>

## Path parameters

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

## Request body

- object
  - `platform_type` string — Which campaign type the brief is for, `SMART` or `PERFORMANCE_MAX`. Stored as sent and not checked against that list.
  - `business_name` string — Business name to advertise.
  - `business_description` string — What the business does. Used when Base44 generates copy.
  - `landing_page_url` string — URL the ads will send clicks to.
  - `keywords` string[] — Keywords the campaign should match.

## Response `200`

Successful Response

- CampaignBriefResource — A saved campaign brief.
  - `id` string, required — ID of the brief. Pass this as `brief_id` to read, update, or delete it.
  - `platform_type` string, required — Which campaign type the brief is for, `SMART` or `PERFORMANCE_MAX`.
  - `source` string, required — Who wrote the brief. The value is `ai` when Base44 generated it and `user` when you created it.
  - `business_name` string, required — Business name to advertise.
  - `business_description` string, required — What the business does. Base44 uses this when it generates copy.
  - `landing_page_url` string, required — URL the ads will send clicks to.
  - `language` string, required — Language the ad copy is written in, as a lowercase two-letter code. See the note on this field in each endpoint. Create and update echo what you send, while list and get report the normalized value.
  - `keywords` string[], required — Keywords the campaign should match.
  - `target_audience` string, required — Free-text description of who the campaign is for. Empty when unset.
  - `daily_budget_micros` integer, required — Planned daily budget in micros of the account currency, so `15000000` is 15.00. The value is `0` when unset.
  - `geo_targets` string[], required — Google Ads geo target constant IDs to target.
  - `headlines` string[], required — Ad headlines. Populated by generate, or by you.
  - `descriptions` string[], required — Ad description lines.
  - `schedule_type` string, required — When the campaign runs. Use `always` to run continuously, or `custom` to use `schedule_days`.
  - `schedule_days` object[], required — Day and hour windows to run in, used only when `schedule_type` is `custom`.
  - `created_date` string, date-time, required — When the brief was created.
  - `updated_date` string, date-time, required — When the brief was last changed.

## 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.
- `422` — Validation Error
- `429` — The app has used up its Google Ads generation quota for the current window. Retry later.

---

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