create_app_campaign

Google Ads Write

🚨 **IF THIS TOOL RETURNS A QUOTA ERROR:** - The error message will include a clickable upgrade link - Show the FULL error message to the user (it contains the upgrade link) - DO NOT attempt to work ar

Endpoint

POST https://api.adspirer.ai/api/v1/tools/create_app_campaign/execute

Headers

Description

🚨 **IF THIS TOOL RETURNS A QUOTA ERROR:** - The error message will include a clickable upgrade link - Show the FULL error message to the user (it contains the upgrade link) - DO NOT attempt to work around the error or use alternative data - DO NOT create campaigns or perform actions without valid tool data - STOP and direct the user to upgrade via the provided link Create a Google App campaign (Universal App Campaign / UAC) to drive app installs, in-app engagement, or Play pre-registrations. ⚠️ Creates a REAL campaign (starts PAUSED — resume_campaign when ready). Call ONCE; do NOT auto-retry. PREREQUISITE: a real, published app listing. Pass its store id as `app_id` (Play package name for GOOGLE_APP_STORE, e.g. com.company.app; numeric App Store id for APPLE_APP_STORE, e.g. 1234567890) and the matching `app_store`. Google validates the app_id against the store — a made-up id is rejected. WHAT THIS BUILDS: budget + MULTI_CHANNEL/App campaign (with the app + bidding goal) + one auto-managed ad group + one app ad. App campaigns are largely automated — Google assembles ads from your store listing plus the assets you provide. TYPES (`app_campaign_type`): install (default) | engagement (re-engagement — needs a deep-link + audience) | pre_registration (Google Play only). Install is the common case. **Required:** campaign_name, budget_daily, app_id, app_store. **Bidding:** bidding_strategy (leave UNSET to auto-pick the strategy that matches the goal | TARGET_CPA | MAXIMIZE_CONVERSIONS | TARGET_ROAS) + target_cpa_micros / target_roas + optional bidding_goal_type. **Creative (`ad`):** headlines (≤30), descriptions (≤90), image_assets / video_assets (resource names of EXISTING assets). start_date/end_date (YYYYMMDD).

Request body

All tool arguments are wrapped in an arguments object.

FieldTypeDescription
campaign_namestring requiredCampaign name (e.g. 'Sahaayak Installs — US').
budget_dailynumber requiredDaily budget in the account's native currency. Do NOT convert currencies — pass as-is.
app_idstring requiredThe app's store id: the Play package name (e.g. com.company.app) for GOOGLE_APP_STORE, or the numeric App Store id (e.g. 1234567890) for APPLE_APP_STORE. Must be a real, published listing in that store.
app_storestring requiredGOOGLE_APP_STORE or APPLE_APP_STORE (which store app_id lives in).
app_campaign_typestring optionalinstall (default) | engagement (re-engagement; needs a deep-link + audience) | pre_registration (Google Play only). default: "install"
bidding_goal_typestring optionalAppCampaignBiddingStrategyGoalType override. Defaults per type (install→OPTIMIZE_INSTALLS_WITHOUT_TARGET_INSTALL_COST, pre_reg→OPTIMIZE_PRE_REGISTRATION_CONVERSION_VOLUME). Advanced; leave unset normally.
bidding_strategystring optionalTARGET_CPA | MAXIMIZE_CONVERSIONS | TARGET_ROAS. Leave unset to let the server pick the strategy that pairs with the goal (Google rejects incompatible combos).
target_cpa_microsinteger optionalTarget CPA in micros — used with TARGET_CPA / MAXIMIZE_CONVERSIONS.
target_roasnumber optionalTarget ROAS (e.g. 4.0). REQUIRED if bidding_strategy=TARGET_ROAS.
start_datestring optionalCampaign start date YYYYMMDD.
end_datestring optionalCampaign end date YYYYMMDD.
adany optionalThe app ad's creative assets (headlines/descriptions/image_assets/video_assets). Google auto-generates the rest from your store listing.
customer_idstring optionalGoogle Ads customer ID (10 digits, no dashes). REQUIRED whenever the user has more than one Google Ads account connected — this creates a REAL campaign that spends REAL money, so it must land in the account the user actually meant. Do NOT omit it and do NOT guess: carry over the customer_id already in use in this conversation, or call list_connected_accounts / get_connections_status and ask the user which account. If a call fails asking you to disambiguate, RETRY with this parameter — that error does NOT mean the account is disconnected.

Example request

{
  "arguments": {
    "campaign_name": "string",
    "budget_daily": 1.0,
    "app_id": "string",
    "app_store": "string",
    "app_campaign_type": "install",
    "bidding_goal_type": "string",
    "bidding_strategy": "string",
    "target_cpa_micros": 1,
    "target_roas": 1.0,
    "start_date": "string"
  }
}

Example responses

200 — Success

{
  "success": true,
  "data": {
    "text": "(tool-specific textual output for create_app_campaign)",
    "quota": {
      "used": 42,
      "limit": 150,
      "tier": "plus",
      "period_end": "2026-05-01"
    }
  },
  "tool": "create_app_campaign"
}

400 — Tool-level error (bad arguments / multi-account selection)

{
  "success": false,
  "error": "You have 25 meta_ads accounts connected. Please specify which account to use by passing the ad_account_id parameter:\n  - Acme Holdings (ad_account_id=\"act_123456789\")\n  - Acme EU (ad_account_id=\"act_987654321\")",
  "is_error": true,
  "tool": "create_app_campaign"
}

402 — Quota exhausted

{
  "success": false,
  "error": "\ud83d\udea8 Monthly limit reached (150/150 tool calls on Plus tier).\nUpgrade to Pro at https://adspirer.ai to keep building.",
  "is_error": true,
  "tool": "create_app_campaign",
  "quota": {
    "used": 150,
    "limit": 150,
    "tier": "plus",
    "period_end": "2026-05-01",
    "upgrade_url": "https://adspirer.ai"
  }
}

Try it live


Adspirer REST API — get an API key at adspirer.ai/keys · adspirer.ai