curl --request POST \
--url https://app.base44.com/api/apps/{app_id}/google-ads/launch \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"campaign": {
"campaign_name": "Spring sale",
"campaign_type": "SMART",
"daily_budget_micros": 15000000,
"landing_page": "https://example.com",
"keyword_themes": [
"oak furniture",
"dining table"
],
"business_name": "Nordwind Furniture"
},
"timezone": "Europe/Berlin"
}
'{
"account": {
"id": "68b1c0d4e7b91d003c45a1f0",
"status": "ACTIVE",
"account_name": "Nordwind Furniture",
"currency_code": "EUR",
"timezone": "Europe/Berlin",
"google_customer_id": "1234567890"
},
"campaign": {
"id": "68b1c0d4e7b91d003c45a1f2",
"google_campaign_id": "21098765432",
"campaign_name": "Spring sale in Berlin",
"campaign_type": "SMART",
"status": "ENABLED",
"daily_budget_micros": 15000000,
"landing_page": "https://example.com/spring",
"geo_targets": [
"1003854"
],
"phone_number": "+493012345678",
"review_status": "REVIEWED",
"serving_status": "SERVING",
"primary_status": "ELIGIBLE",
"primary_status_reasons": [
"CAMPAIGN_BUDGET_LIMITED"
],
"created_date": "2026-08-25T11:20:00Z",
"updated_date": "2026-08-25T14:05:00Z",
"learning_ends_at": "2026-09-08T11:20:00Z"
}
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>"
}
]
}Launch Google Ads campaign
Creates the app’s Google Ads account if it does not have one, then creates a campaign on it. This is what starts spending money.
Call Get launch readiness first and send its landing_page back here. Its currency_code is informational: there is no currency field on this request, and Base44 derives the account’s currency itself.
Base44 checks these from the request before creating anything, and a request that fails one creates nothing:
- A Performance Max campaign has a
logo_url, plus at least oneMARKETING_IMAGEand oneSQUARE_MARKETING_IMAGEwhoseurlis on a host Base44 fetches images from. - The budget sits inside the per-currency range for the campaign type.
- The business name is within its length limit.
sitelinksandphone_numberare well formed.- Targeting that can reach the EU carries a political-advertising declaration.
Anything Base44 only finds out by fetching, or that only Google can judge, fails after the account exists. That includes an image or logo that doesn’t download and a landing page Google can’t crawl.
A 409 has four different causes and they are not all safe to retry:
- the workspace is on billing hold, or the account is, so no new spend is allowed. Fix the billing problem and retry.
- the campaign was already launched from this draft. Retrying will not create a second one.
- the request to Google Ads timed out after being sent. The campaign may be live and spending. Do not retry: read List campaigns and check before doing anything else.
The response carries the account and the campaign. A campaign can come back paused when its conversion tracking is not wired yet; Base44 enables it on its own once tracking verifies.
Launching is refused, rather than allowed through, while Base44 cannot reach its payment provider to confirm a card is on file. Get launch readiness reports that state as stripe_unavailable, so check it there instead of inferring it from a failed launch.
curl --request POST \
--url https://app.base44.com/api/apps/{app_id}/google-ads/launch \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"campaign": {
"campaign_name": "Spring sale",
"campaign_type": "SMART",
"daily_budget_micros": 15000000,
"landing_page": "https://example.com",
"keyword_themes": [
"oak furniture",
"dining table"
],
"business_name": "Nordwind Furniture"
},
"timezone": "Europe/Berlin"
}
'{
"account": {
"id": "68b1c0d4e7b91d003c45a1f0",
"status": "ACTIVE",
"account_name": "Nordwind Furniture",
"currency_code": "EUR",
"timezone": "Europe/Berlin",
"google_customer_id": "1234567890"
},
"campaign": {
"id": "68b1c0d4e7b91d003c45a1f2",
"google_campaign_id": "21098765432",
"campaign_name": "Spring sale in Berlin",
"campaign_type": "SMART",
"status": "ENABLED",
"daily_budget_micros": 15000000,
"landing_page": "https://example.com/spring",
"geo_targets": [
"1003854"
],
"phone_number": "+493012345678",
"review_status": "REVIEWED",
"serving_status": "SERVING",
"primary_status": "ELIGIBLE",
"primary_status_reasons": [
"CAMPAIGN_BUDGET_LIMITED"
],
"created_date": "2026-08-25T11:20:00Z",
"updated_date": "2026-08-25T14:05:00Z",
"learning_ends_at": "2026-09-08T11:20:00Z"
}
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>"
}
]
}Authorizations
Personal access token, sent as Authorization: Bearer <token>.
Path Parameters
ID of the app to advertise.
Body
The campaign to create. Same fields as Create campaign.
Show child attributes
Show child attributes
Time zone to create the Google Ads account in, as an IANA name. Only used when the account does not exist yet, and fixed for its lifetime after that. Defaults to UTC.
Response
The account the campaign lives on, and the campaign.
The account and the campaign, after both exist.
Was this page helpful?