> ## 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 payment setup

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

Starts the flow for saving a card against the workspace's ad spend, and returns the page a person completes.

Google Ads spend is charged to a card on file. When [Get Google Ads workspace debt](/api-reference/get-google-ads-workspace-debt) reports `requires_payment_method` or `requires_payment_refresh`, this is what produces the link to fix it. Nothing is charged here, the session only validates and saves the card.

Send the two URLs Stripe should return the person to. Both must be `https://` on a `base44.com` or `base44.app` host, so the return trip always lands back inside Base44 rather than on a site you name. A URL outside that set is rejected with a 400.

<Note>Base44 never accepts card details through this API, and neither should you. This endpoint only produces the page a person fills in.</Note>

<Note>Use [Create embedded Google Ads payment setup](/api-reference/create-embedded-google-ads-payment-setup) instead when you are rendering the card form inside your own page rather than sending someone to Stripe.</Note>

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



## OpenAPI

````yaml /developers/references/app-management/app-management-openapi.json post /api/apps/{app_id}/google-ads/billing/payment-setup
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/billing/payment-setup:
    post:
      summary: Create Google Ads payment setup
      description: >-
        <Info>This API is in beta. Endpoints, fields, and behavior may still
        change, so avoid depending on it in production.</Info>


        Starts the flow for saving a card against the workspace's ad spend, and
        returns the page a person completes.


        Google Ads spend is charged to a card on file. When [Get Google Ads
        workspace debt](/api-reference/get-google-ads-workspace-debt) reports
        `requires_payment_method` or `requires_payment_refresh`, this is what
        produces the link to fix it. Nothing is charged here, the session only
        validates and saves the card.


        Send the two URLs Stripe should return the person to. Both must be
        `https://` on a `base44.com` or `base44.app` host, so the return trip
        always lands back inside Base44 rather than on a site you name. A URL
        outside that set is rejected with a 400.


        <Note>Base44 never accepts card details through this API, and neither
        should you. This endpoint only produces the page a person fills
        in.</Note>


        <Note>Use [Create embedded Google Ads payment
        setup](/api-reference/create-embedded-google-ads-payment-setup) instead
        when you are rendering the card form inside your own page rather than
        sending someone to Stripe.</Note>


        <Note>This endpoint accepts a personal API key. Workspace API keys are
        not authorized for it and are rejected with a 403.</Note>
      operationId: >-
        create_payment_setup_api_apps__app_id__google_ads_billing_payment_setup_post
      parameters:
        - name: app_id
          in: path
          required: true
          schema:
            type: string
            description: ID of the app whose Google Ads campaigns to manage.
            title: App Id
          description: ID of the app whose Google Ads campaigns to manage.
          example: 6820f3a4e7b91d003c45a1f2
      requestBody:
        required: true
        content:
          application/json:
            schema:
              title: CreatePaymentSetupSession
              type: object
              required:
                - success_url
                - cancel_url
              properties:
                success_url:
                  type: string
                  description: >-
                    Where Stripe sends the person after they save a card. It
                    must be an `https://` URL on a `base44.com` or `base44.app`
                    host, with no credentials in it, so you cannot send them
                    back to your own site.
                  example: >-
                    https://app.base44.com/apps/6820f3a4e7b91d003c45a1f2/settings/billing?setup=done
                cancel_url:
                  type: string
                  description: >-
                    Where Stripe sends the person if they abandon the form. Same
                    host rules as `success_url`.
                  example: >-
                    https://app.base44.com/apps/6820f3a4e7b91d003c45a1f2/settings/billing
            example:
              success_url: >-
                https://app.base44.com/apps/6820f3a4e7b91d003c45a1f2/settings/billing?setup=done
              cancel_url: >-
                https://app.base44.com/apps/6820f3a4e7b91d003c45a1f2/settings/billing
      responses:
        '200':
          description: The page a person completes to save a card.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaymentSetupSession'
        '400':
          description: >-
            `success_url` or `cancel_url` is not an `https://` URL, carries
            credentials, or is on a host outside `base44.com` and `base44.app`.
        '401':
          description: Missing or invalid credentials.
        '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.
        '422':
          description: >-
            `success_url` or `cancel_url` is missing from the body. Both are
            required, and the check runs before the host rules above.
components:
  schemas:
    PaymentSetupSession:
      properties:
        checkout_url:
          type: string
          title: Checkout Url
          description: >-
            Stripe-hosted page where a person enters their card details. Hand
            this to a human rather than trying to complete it programmatically.
            It expires, so fetch it when someone is ready to use it.
          example: https://checkout.stripe.com/c/pay/cs_live_a1B2c3D4e5
        session_id:
          type: string
          title: Session Id
          description: >-
            Stripe's ID for the session. Useful for correlating with your own
            logs; the API takes it nowhere.
          example: cs_live_a1B2c3D4e5
      type: object
      required:
        - checkout_url
        - session_id
      title: PaymentSetupSession
      description: A Stripe Checkout session for saving a card.
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: api_key
      description: Personal API key.

````