> ## Documentation Index
> Fetch the complete documentation index at: https://docs.base44.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Create Google Ads campaign

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

Creates a campaign on the app's Google Ads account and starts serving it.

This spends money. The workspace needs a payment method on file and an account in good standing; without either the call returns a 402 and no campaign is created. A campaign is also created paused when the app's conversion tracking is not yet verified, so check `status` on the response rather than assuming it is serving.

Set `campaign_type` to `SMART` or `PERFORMANCE_MAX`. `daily_budget_micros` is in micros of the account currency and has a per-currency floor Google enforces. A budget below it comes back as a 400 carrying Google's reason, and the campaign is not created. Advertisers in the EU must declare whether the campaign carries political advertising; the call is rejected until that declaration is on file.

Google validates the campaign as it is created, so a rejected ad text, an unreachable landing page, or a budget below the floor comes back as a 400 with Google's own reason.

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

<Warning>A 409 means the change may or may not have been applied: the request to Google Ads timed out after it was sent. Read the campaign back with [Get campaign](/api-reference/get-google-ads-campaign) before retrying, or you can end up applying it twice.</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>



## OpenAPI

````yaml /developers/references/app-management/app-management-openapi.json post /api/apps/{app_id}/google-ads/campaigns
openapi: 3.1.0
info:
  title: Base44 App Management API
  version: 1.0.0
servers:
  - url: https://app.base44.com
security:
  - ApiKeyAuth: []
paths:
  /api/apps/{app_id}/google-ads/campaigns:
    post:
      summary: Create Google Ads campaign
      description: >-
        <Info>This API is in beta. Endpoints, fields, and behavior may still
        change, so avoid depending on it in production.</Info>


        Creates a campaign on the app's Google Ads account and starts serving
        it.


        This spends money. The workspace needs a payment method on file and an
        account in good standing; without either the call returns a 402 and no
        campaign is created. A campaign is also created paused when the app's
        conversion tracking is not yet verified, so check `status` on the
        response rather than assuming it is serving.


        Set `campaign_type` to `SMART` or `PERFORMANCE_MAX`.
        `daily_budget_micros` is in micros of the account currency and has a
        per-currency floor Google enforces. A budget below it comes back as a
        400 carrying Google's reason, and the campaign is not created.
        Advertisers in the EU must declare whether the campaign carries
        political advertising; the call is rejected until that declaration is on
        file.


        Google validates the campaign as it is created, so a rejected ad text,
        an unreachable landing page, or a budget below the floor comes back as a
        400 with Google's own reason.


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


        <Warning>A 409 means the change may or may not have been applied: the
        request to Google Ads timed out after it was sent. Read the campaign
        back with [Get campaign](/api-reference/get-google-ads-campaign) before
        retrying, or you can end up applying it twice.</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>
      operationId: create_campaign_api_apps__app_id__google_ads_campaigns_post
      parameters:
        - name: app_id
          in: path
          required: true
          schema:
            type: string
            title: App Id
      requestBody:
        required: true
        content:
          application/json:
            schema:
              title: CreateCampaign
              type: object
              required:
                - campaign_name
                - daily_budget_micros
              properties:
                campaign_name:
                  type: string
                  description: Name for the campaign.
                campaign_type:
                  type: string
                  enum:
                    - SMART
                    - PERFORMANCE_MAX
                  default: SMART
                  description: Which campaign type to create.
                daily_budget_micros:
                  type: integer
                  description: >-
                    Daily budget in micros of the account currency, so
                    `15000000` is 15.00. Google enforces a per-currency minimum
                    and rejects anything below it with a 400.
                landing_page:
                  type: string
                  description: >-
                    URL the ads send clicks to. Google rejects the campaign if
                    it cannot reach this page.
                keyword_themes:
                  type: array
                  items:
                    type: string
                  description: Themes to match searches on, for a `SMART` campaign.
                headlines:
                  type: array
                  items:
                    type: string
                  description: >-
                    Ad headlines. Google reviews these against its advertising
                    policies.
                descriptions:
                  type: array
                  items:
                    type: string
                  description: >-
                    Ad description lines. Google reviews these against its
                    advertising policies.
                geo_targets:
                  type: array
                  items:
                    type: string
                  description: Google Ads geo target constant IDs to target.
                business_name:
                  type: string
                  description: Business name shown in the ad.
                phone_number:
                  type: string
                  description: Phone number for the call extension.
                contains_eu_political_advertising:
                  type: boolean
                  description: >-
                    Whether the campaign carries political advertising. Required
                    before an EU advertiser can create a campaign.
            example:
              campaign_name: Spring sale in Berlin
              campaign_type: SMART
              daily_budget_micros: 15000000
              landing_page: https://example.com/spring
              keyword_themes:
                - spring sale
                - discount furniture
              geo_targets:
                - '1003854'
      responses:
        '200':
          description: The campaign that was created.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CampaignResource'
        '400':
          description: >-
            Google Ads rejected the request, for example ad text that breaks its
            policies or a budget below the currency's minimum. The response
            message carries Google's reason.
        '401':
          description: Missing or invalid credentials.
        '402':
          description: No payment method on file, or the workspace has an unpaid balance.
        '403':
          description: >-
            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.
        '404':
          description: >-
            The app has no connected Google Ads account, or there is no campaign
            with this ID.
        '409':
          description: >-
            The request to Google Ads timed out after being sent, so the change
            may or may not have been applied. Read the campaign back before
            retrying.
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
        '429':
          description: Google Ads is rate limiting the account. Retry later.
components:
  schemas:
    CampaignResource:
      properties:
        id:
          type: string
          title: Id
          description: >-
            Base44's ID for the campaign. Pass this as `campaign_id` on the
            other campaign endpoints.
          example: 68b1c0d4e7b91d003c45a1f2
        google_campaign_id:
          type: string
          title: Google Campaign Id
          description: >-
            The campaign's ID in Google Ads. Empty while a just-created campaign
            is still being pushed to Google.
          example: '21098765432'
        campaign_name:
          type: string
          title: Campaign Name
          description: Name shown for the campaign.
          example: Spring sale in Berlin
        campaign_type:
          type: string
          enum:
            - SMART
            - PERFORMANCE_MAX
            - SEARCH
            - DISPLAY
            - SHOPPING
            - VIDEO
            - DEMAND_GEN
            - LOCAL
            - UNKNOWN
          title: Campaign Type
          description: >-
            Campaign type. Base44 creates `SMART` and `PERFORMANCE_MAX`; the
            other values appear only on campaigns created outside Base44 and
            synced in.
          example: SMART
        status:
          type: string
          enum:
            - ENABLED
            - PAUSED
            - REMOVED
            - UNKNOWN
          title: Status
          description: >-
            Serving state in Base44's cache. `REMOVED` is a deleted campaign,
            which Google keeps for reporting.
          example: ENABLED
        daily_budget_micros:
          type: integer
          title: Daily Budget Micros
          description: >-
            Daily budget in micros of the account currency: 1,000,000 micros is
            one unit, so `15000000` is 15.00.
          example: 15000000
        landing_page:
          type: string
          title: Landing Page
          description: URL the ads send clicks to.
          example: https://example.com/spring
        geo_targets:
          items:
            type: string
          type: array
          title: Geo Targets
          description: Google Ads geo target constant IDs the campaign targets.
          example:
            - '1003854'
        phone_number:
          type: string
          title: Phone Number
          description: Call-extension phone number, empty when the campaign has none.
          example: '+493012345678'
        learning_ends_at:
          anyOf:
            - type: string
              format: date-time
            - type: 'null'
          title: Learning Ends At
          description: >-
            When Smart Bidding's learning period is expected to end, about 14
            days after creation. `null` on a campaign that has not started
            learning.
          example: '2026-09-08T11:20:00Z'
        review_status:
          type: string
          title: Review Status
          description: >-
            Google's policy review status, passed through as Google reports it
            (`REVIEWED`, `UNDER_REVIEW`, …). Empty until the first sync after
            creation.
          example: REVIEWED
        serving_status:
          type: string
          title: Serving Status
          description: >-
            Google's serving status, passed through as Google reports it. Can
            still report review gating after policy review clears, so read it
            alongside `review_status`.
          example: SERVING
        primary_status:
          type: string
          title: Primary Status
          description: >-
            Google's summary of whether the campaign is serving well, passed
            through as Google reports it (`ELIGIBLE`, `LIMITED`, `NOT_SERVING`,
            …).
          example: ELIGIBLE
        primary_status_reasons:
          items:
            type: string
          type: array
          title: Primary Status Reasons
          description: >-
            Google's reasons behind `primary_status`, e.g. why a campaign is
            limited. Empty when there is nothing to explain.
          example:
            - CAMPAIGN_BUDGET_LIMITED
        created_date:
          type: string
          format: date-time
          title: Created Date
          description: When the campaign was created in Base44.
          example: '2026-08-25T11:20:00Z'
        updated_date:
          type: string
          format: date-time
          title: Updated Date
          description: When Base44 last changed its record of the campaign.
          example: '2026-08-25T14:05:00Z'
      type: object
      required:
        - id
        - google_campaign_id
        - campaign_name
        - campaign_type
        - status
        - daily_budget_micros
        - landing_page
        - geo_targets
        - phone_number
        - review_status
        - serving_status
        - primary_status
        - primary_status_reasons
        - created_date
        - updated_date
      title: CampaignResource
      description: The campaign fields this API commits to.
    HTTPValidationError:
      properties:
        detail:
          items:
            $ref: '#/components/schemas/ValidationError'
          type: array
          title: Detail
      type: object
      title: HTTPValidationError
    ValidationError:
      properties:
        loc:
          items:
            anyOf:
              - type: string
              - type: integer
          type: array
          title: Location
        msg:
          type: string
          title: Message
        type:
          type: string
          title: Error Type
      type: object
      required:
        - loc
        - msg
        - type
      title: ValidationError
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: api_key
      description: Personal API key.

````