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

# Google Ads Integration for AI Agents & Workflows

> Google Ads API integration: run GAQL reports across Campaigns, Ad Groups, Ads, and Customers; create customer lists; send offline conversions; generate keyword ideas.

{/* Self-hosted logo — build-time vendored from modulex.json / Iconify (see scripts/lib/logo.js). */}

<img src="https://mintcdn.com/modulexaillc/zKB2qsP6Q61VNLfB/logos/google-ads.svg?fit=max&auto=format&n=zKB2qsP6Q61VNLfB&q=85&s=1cc8a843858c3ecc08e430e7d801d52a" alt="Google Ads logo" width="72" height="72" data-path="logos/google-ads.svg" />

## Overview

Add **Google Ads** to any ModuleX agent or workflow. Google Ads API integration covering GAQL reports across Campaigns, Ad Groups, Ads, and Customers; Customer Match list management; offline conversion uploads; and keyword idea generation against the REST API at `googleads.googleapis.com`.

<Info>
  **Categories**: Marketing & Advertising · Analytics · Business Services · **Auth**: OAuth2 · **Actions**: 10
</Info>

## Authentication

### OAuth2 Authentication

Connect using Google OAuth2 (recommended). Requires a Google Ads API developer token in addition to the OAuth credentials.

#### Required Credentials

| Field           | Description                                                                                                                                                  | Required | Format                                                  |
| --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------ | -------- | ------------------------------------------------------- |
| Client ID       | Google OAuth2 Client ID from Cloud Console.                                                                                                                  | Yes      | `123456789-xxxxxxxxxxxxxxxx.apps.googleusercontent.com` |
| Client Secret   | Google OAuth2 Client Secret.                                                                                                                                 | Yes      | `GOCSPX-xxxxxxxxxxxxxxxxxxxx`                           |
| Developer Token | Google Ads API developer-token header value. Apply at [https://ads.google.com/aw/apicenter](https://ads.google.com/aw/apicenter) (Manager Account required). | Yes      | `xxxxxxxxxxxxxxxxxxxxxx`                                |

#### OAuth Configuration

* **Authorization URL**: `https://accounts.google.com/o/oauth2/v2/auth`
* **Token URL**: `https://oauth2.googleapis.com/token`
* **Scopes**: `https://www.googleapis.com/auth/adwords`

## Available Actions

<AccordionGroup>
  <Accordion title="add_contact_to_list_by_email — Add a contact to a Google Ads Customer Match user list by email. Lists typically update in 6 to 12 hours. The email is SHA-256 hashed locally before upload.">
    ### Parameters

    <ResponseField name="account_id" type="string" required>
      Login customer ID (the Manager Account ID used as login-customer-id header). Digits only, no dashes.
    </ResponseField>

    <ResponseField name="user_list_id" type="string" required>
      ID of the CRM-based customer list to update.
    </ResponseField>

    <ResponseField name="contact_email" type="string" required>
      Email address of the contact to add.
    </ResponseField>

    <ResponseField name="customer_client_id" type="string">
      Managed customer (client) ID. Defaults to account\_id when omitted.
    </ResponseField>

    ### Response

    ```json theme={null}
    {
      "additionalProperties": false,
      "properties": {
        "success": {
          "title": "Success",
          "type": "boolean"
        },
        "error": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Error"
        },
        "offline_user_data_job_resource_name": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Offline User Data Job Resource Name"
        },
        "operation_resource_name": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Operation Resource Name"
        }
      },
      "required": [
        "success"
      ],
      "title": "AddContactToListByEmailOutput",
      "type": "object"
    }
    ```
  </Accordion>

  <Accordion title="create_ad_group_report — Run a GAQL search report for the ad_group resource via GoogleAdsService.search.">
    ### Parameters

    <ResponseField name="account_id" type="string" required>
      Login customer ID (login-customer-id header).
    </ResponseField>

    <ResponseField name="fields" type="array">
      List of ad\_group fields to select (e.g. 'ad\_group.id', 'ad\_group.name'). Each element is a string; the 'ad\_group.' prefix is auto-added if missing.
    </ResponseField>

    <ResponseField name="segments" type="array">
      List of segments (e.g. 'segments.date'). Each element is a string; the 'segments.' prefix is auto-added.
    </ResponseField>

    <ResponseField name="metrics" type="array">
      List of metric fields (e.g. 'metrics.clicks'). Each element is a string; the 'metrics.' prefix is auto-added.
    </ResponseField>

    <ResponseField name="object_filter" type="array">
      Optional list of ad\_group IDs to filter by. Each element is a string (the numeric ID).
    </ResponseField>

    <ResponseField name="date_range" type="string">
      Date range constant: CUSTOM, TODAY, YESTERDAY, LAST\_7\_DAYS, LAST\_14\_DAYS, LAST\_30\_DAYS, THIS\_MONTH, LAST\_MONTH, THIS\_WEEK\_SUN\_TODAY, THIS\_WEEK\_MON\_TODAY, LAST\_WEEK\_SUN\_SAT, LAST\_WEEK\_MON\_SUN, LAST\_BUSINESS\_WEEK.
    </ResponseField>

    <ResponseField name="start_date" type="string">
      Custom range start (YYYY-MM-DD); required when date\_range=CUSTOM.
    </ResponseField>

    <ResponseField name="end_date" type="string">
      Custom range end (YYYY-MM-DD); required when date\_range=CUSTOM.
    </ResponseField>

    <ResponseField name="order_by" type="string">
      Field name to order results by.
    </ResponseField>

    <ResponseField name="direction" type="string">
      Order direction: ASC or DESC. (Default: `ASC`)
    </ResponseField>

    <ResponseField name="limit" type="integer">
      Maximum number of results to return.
    </ResponseField>

    <ResponseField name="customer_client_id" type="string">
      Managed customer ID; defaults to account\_id when omitted.
    </ResponseField>

    ### Response

    ```json theme={null}
    {
      "additionalProperties": false,
      "properties": {
        "success": {
          "title": "Success",
          "type": "boolean"
        },
        "error": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Error"
        },
        "query": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Query"
        },
        "results": {
          "items": {
            "additionalProperties": true,
            "type": "object"
          },
          "title": "Results",
          "type": "array"
        },
        "field_mask": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Field Mask"
        },
        "request_id": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Request Id"
        }
      },
      "required": [
        "success"
      ],
      "title": "CreateAdGroupReportOutput",
      "type": "object"
    }
    ```
  </Accordion>

  <Accordion title="create_ad_report — Run a GAQL search report for the ad_group_ad resource via GoogleAdsService.search.">
    ### Parameters

    <ResponseField name="account_id" type="string" required>
      Login customer ID (login-customer-id header).
    </ResponseField>

    <ResponseField name="fields" type="array">
      List of ad\_group\_ad fields to select (strings).
    </ResponseField>

    <ResponseField name="segments" type="array">
      List of segments (strings).
    </ResponseField>

    <ResponseField name="metrics" type="array">
      List of metric fields (strings).
    </ResponseField>

    <ResponseField name="object_filter" type="array">
      Optional list of ad IDs to filter by (strings).
    </ResponseField>

    <ResponseField name="date_range" type="string">
      Date range constant. See create\_ad\_group\_report for valid values.
    </ResponseField>

    <ResponseField name="start_date" type="string">
      Custom range start (YYYY-MM-DD); required when date\_range=CUSTOM.
    </ResponseField>

    <ResponseField name="end_date" type="string">
      Custom range end (YYYY-MM-DD); required when date\_range=CUSTOM.
    </ResponseField>

    <ResponseField name="order_by" type="string">
      Field name to order results by.
    </ResponseField>

    <ResponseField name="direction" type="string">
      Order direction: ASC or DESC. (Default: `ASC`)
    </ResponseField>

    <ResponseField name="limit" type="integer">
      Maximum number of results to return.
    </ResponseField>

    <ResponseField name="customer_client_id" type="string">
      Managed customer ID; defaults to account\_id when omitted.
    </ResponseField>

    ### Response

    ```json theme={null}
    {
      "additionalProperties": false,
      "properties": {
        "success": {
          "title": "Success",
          "type": "boolean"
        },
        "error": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Error"
        },
        "query": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Query"
        },
        "results": {
          "items": {
            "additionalProperties": true,
            "type": "object"
          },
          "title": "Results",
          "type": "array"
        },
        "field_mask": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Field Mask"
        },
        "request_id": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Request Id"
        }
      },
      "required": [
        "success"
      ],
      "title": "CreateAdReportOutput",
      "type": "object"
    }
    ```
  </Accordion>

  <Accordion title="create_campaign_report — Run a GAQL search report for the campaign resource via GoogleAdsService.search.">
    ### Parameters

    <ResponseField name="account_id" type="string" required>
      Login customer ID (login-customer-id header).
    </ResponseField>

    <ResponseField name="fields" type="array">
      List of campaign fields to select (strings).
    </ResponseField>

    <ResponseField name="segments" type="array">
      List of segments (strings).
    </ResponseField>

    <ResponseField name="metrics" type="array">
      List of metric fields (strings).
    </ResponseField>

    <ResponseField name="object_filter" type="array">
      Optional list of campaign IDs to filter by (strings).
    </ResponseField>

    <ResponseField name="date_range" type="string">
      Date range constant. See create\_ad\_group\_report for valid values.
    </ResponseField>

    <ResponseField name="start_date" type="string">
      Custom range start (YYYY-MM-DD); required when date\_range=CUSTOM.
    </ResponseField>

    <ResponseField name="end_date" type="string">
      Custom range end (YYYY-MM-DD); required when date\_range=CUSTOM.
    </ResponseField>

    <ResponseField name="order_by" type="string">
      Field name to order results by.
    </ResponseField>

    <ResponseField name="direction" type="string">
      Order direction: ASC or DESC. (Default: `ASC`)
    </ResponseField>

    <ResponseField name="limit" type="integer">
      Maximum number of results to return.
    </ResponseField>

    <ResponseField name="customer_client_id" type="string">
      Managed customer ID; defaults to account\_id when omitted.
    </ResponseField>

    ### Response

    ```json theme={null}
    {
      "additionalProperties": false,
      "properties": {
        "success": {
          "title": "Success",
          "type": "boolean"
        },
        "error": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Error"
        },
        "query": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Query"
        },
        "results": {
          "items": {
            "additionalProperties": true,
            "type": "object"
          },
          "title": "Results",
          "type": "array"
        },
        "field_mask": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Field Mask"
        },
        "request_id": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Request Id"
        }
      },
      "required": [
        "success"
      ],
      "title": "CreateCampaignReportOutput",
      "type": "object"
    }
    ```
  </Accordion>

  <Accordion title="create_customer_list — Create a Google Ads UserList (CRM_BASED / RULE_BASED / LOGICAL / BASIC_USER_LIST / LOOKALIKE). Returns the new user list ID and resource name.">
    ### Parameters

    <ResponseField name="account_id" type="string" required>
      Login customer ID (login-customer-id header).
    </ResponseField>

    <ResponseField name="name" type="string" required>
      Name of the user list.
    </ResponseField>

    <ResponseField name="list_type" type="string" required>
      Which UserList variant to create. One of: crmBasedUserList, ruleBasedUserList, logicalUserList, basicUserList, lookalikeUserList. Determines which fields list\_type\_data should populate.
    </ResponseField>

    <ResponseField name="list_type_data" type="object">
      Variant-specific payload. Merged under the list\_type key. See [https://developers.google.com/google-ads/api/reference/rpc/v21/UserList](https://developers.google.com/google-ads/api/reference/rpc/v21/UserList) for the per-variant schema. (Default: `{}`)
    </ResponseField>

    <ResponseField name="description" type="string">
      Optional description of the user list.
    </ResponseField>

    <ResponseField name="additional_fields" type="object">
      Additional top-level UserList fields to merge into the create payload (e.g. membershipLifeSpan). (Default: `{}`)
    </ResponseField>

    <ResponseField name="customer_client_id" type="string">
      Managed customer ID; defaults to account\_id when omitted.
    </ResponseField>

    ### Response

    ```json theme={null}
    {
      "additionalProperties": false,
      "properties": {
        "success": {
          "title": "Success",
          "type": "boolean"
        },
        "error": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Error"
        },
        "id": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Id"
        },
        "resource_name": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Resource Name"
        }
      },
      "required": [
        "success"
      ],
      "title": "CreateCustomerListOutput",
      "type": "object"
    }
    ```
  </Accordion>

  <Accordion title="create_customer_report — Run a GAQL search report for the customer resource via GoogleAdsService.search.">
    ### Parameters

    <ResponseField name="account_id" type="string" required>
      Login customer ID (login-customer-id header).
    </ResponseField>

    <ResponseField name="fields" type="array">
      List of customer fields to select (strings).
    </ResponseField>

    <ResponseField name="segments" type="array">
      List of segments (strings).
    </ResponseField>

    <ResponseField name="metrics" type="array">
      List of metric fields (strings).
    </ResponseField>

    <ResponseField name="object_filter" type="array">
      Optional list of customer IDs to filter by (strings).
    </ResponseField>

    <ResponseField name="date_range" type="string">
      Date range constant. See create\_ad\_group\_report for valid values.
    </ResponseField>

    <ResponseField name="start_date" type="string">
      Custom range start (YYYY-MM-DD); required when date\_range=CUSTOM.
    </ResponseField>

    <ResponseField name="end_date" type="string">
      Custom range end (YYYY-MM-DD); required when date\_range=CUSTOM.
    </ResponseField>

    <ResponseField name="order_by" type="string">
      Field name to order results by.
    </ResponseField>

    <ResponseField name="direction" type="string">
      Order direction: ASC or DESC. (Default: `ASC`)
    </ResponseField>

    <ResponseField name="limit" type="integer">
      Maximum number of results to return.
    </ResponseField>

    <ResponseField name="customer_client_id" type="string">
      Managed customer ID; defaults to account\_id when omitted.
    </ResponseField>

    ### Response

    ```json theme={null}
    {
      "additionalProperties": false,
      "properties": {
        "success": {
          "title": "Success",
          "type": "boolean"
        },
        "error": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Error"
        },
        "query": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Query"
        },
        "results": {
          "items": {
            "additionalProperties": true,
            "type": "object"
          },
          "title": "Results",
          "type": "array"
        },
        "field_mask": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Field Mask"
        },
        "request_id": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Request Id"
        }
      },
      "required": [
        "success"
      ],
      "title": "CreateCustomerReportOutput",
      "type": "object"
    }
    ```
  </Accordion>

  <Accordion title="create_report — Run a GAQL search report against any resource via GoogleAdsService.search. Builds a SELECT/WHERE/ORDER/LIMIT query from the supplied fields/segments/metrics.">
    ### Parameters

    <ResponseField name="account_id" type="string" required>
      Login customer ID (login-customer-id header).
    </ResponseField>

    <ResponseField name="resource" type="string" required>
      Resource name to FROM-clause against (e.g. campaign, ad\_group, ad\_group\_ad, customer).
    </ResponseField>

    <ResponseField name="fields" type="array">
      List of resource fields to select (strings). The resource prefix is auto-added if missing.
    </ResponseField>

    <ResponseField name="segments" type="array">
      List of segments (strings).
    </ResponseField>

    <ResponseField name="metrics" type="array">
      List of metric fields (strings).
    </ResponseField>

    <ResponseField name="object_filter" type="array">
      Optional list of resource IDs to filter by (strings).
    </ResponseField>

    <ResponseField name="date_range" type="string">
      Date range constant. See create\_ad\_group\_report for valid values.
    </ResponseField>

    <ResponseField name="start_date" type="string">
      Custom range start (YYYY-MM-DD); required when date\_range=CUSTOM.
    </ResponseField>

    <ResponseField name="end_date" type="string">
      Custom range end (YYYY-MM-DD); required when date\_range=CUSTOM.
    </ResponseField>

    <ResponseField name="order_by" type="string">
      Field name to order results by.
    </ResponseField>

    <ResponseField name="direction" type="string">
      Order direction: ASC or DESC. (Default: `ASC`)
    </ResponseField>

    <ResponseField name="limit" type="integer">
      Maximum number of results to return.
    </ResponseField>

    <ResponseField name="customer_client_id" type="string">
      Managed customer ID; defaults to account\_id when omitted.
    </ResponseField>

    ### Response

    ```json theme={null}
    {
      "additionalProperties": false,
      "properties": {
        "success": {
          "title": "Success",
          "type": "boolean"
        },
        "error": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Error"
        },
        "query": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Query"
        },
        "results": {
          "items": {
            "additionalProperties": true,
            "type": "object"
          },
          "title": "Results",
          "type": "array"
        },
        "field_mask": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Field Mask"
        },
        "request_id": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Request Id"
        }
      },
      "required": [
        "success"
      ],
      "title": "CreateReportOutput",
      "type": "object"
    }
    ```
  </Accordion>

  <Accordion title="generate_keyword_ideas — Generate keyword ideas via KeywordPlanIdeaService.generateKeywordIdeas. Pass the GenerateKeywordIdeasRequest body fields under additional_fields.">
    ### Parameters

    <ResponseField name="account_id" type="string" required>
      Login customer ID (login-customer-id header).
    </ResponseField>

    <ResponseField name="customer_client_id" type="string" required>
      Managed customer ID to run the request against (required by the keyword ideas service).
    </ResponseField>

    <ResponseField name="additional_fields" type="object">
      Body of the GenerateKeywordIdeasRequest. See [https://developers.google.com/google-ads/api/reference/rpc/v22/KeywordPlanIdeaService/GenerateKeywordIdeas](https://developers.google.com/google-ads/api/reference/rpc/v22/KeywordPlanIdeaService/GenerateKeywordIdeas) for the required structure (e.g. language, geoTargetConstants, keywordSeed). (Default: `{}`)
    </ResponseField>

    ### Response

    ```json theme={null}
    {
      "additionalProperties": false,
      "properties": {
        "success": {
          "title": "Success",
          "type": "boolean"
        },
        "error": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Error"
        },
        "results": {
          "items": {
            "additionalProperties": true,
            "type": "object"
          },
          "title": "Results",
          "type": "array"
        },
        "total_size": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Total Size"
        },
        "next_page_token": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Next Page Token"
        }
      },
      "required": [
        "success"
      ],
      "title": "GenerateKeywordIdeasOutput",
      "type": "object"
    }
    ```
  </Accordion>

  <Accordion title="list_account_id_options — List customer resources directly accessible by the authenticated user via CustomerService.ListAccessibleCustomers. Useful to discover candidate account_id values.">
    ### Response

    ```json theme={null}
    {
      "$defs": {
        "AccessibleCustomer": {
          "additionalProperties": false,
          "description": "One entry returned from ``customers:listAccessibleCustomers``.",
          "properties": {
            "resource_name": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Resource Name"
            },
            "customer_id": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Customer Id"
            }
          },
          "title": "AccessibleCustomer",
          "type": "object"
        }
      },
      "additionalProperties": false,
      "properties": {
        "success": {
          "title": "Success",
          "type": "boolean"
        },
        "error": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Error"
        },
        "customers": {
          "items": {
            "$ref": "#/$defs/AccessibleCustomer"
          },
          "title": "Customers",
          "type": "array"
        }
      },
      "required": [
        "success"
      ],
      "title": "ListAccountIdOptionsOutput",
      "type": "object"
    }
    ```
  </Accordion>

  <Accordion title="send_offline_conversion — Create a ConversionAction (offline conversion tracking) via ConversionActionService.mutate.">
    ### Parameters

    <ResponseField name="account_id" type="string" required>
      Login customer ID (login-customer-id header).
    </ResponseField>

    <ResponseField name="name" type="string" required>
      Name of the conversion action.
    </ResponseField>

    <ResponseField name="type" type="string" required>
      ConversionActionType enum value (e.g. UPLOAD\_CLICKS, UPLOAD\_CALLS, WEBPAGE). See [https://developers.google.com/google-ads/api/reference/rpc/v21/ConversionActionTypeEnum.ConversionActionType](https://developers.google.com/google-ads/api/reference/rpc/v21/ConversionActionTypeEnum.ConversionActionType).
    </ResponseField>

    <ResponseField name="additional_fields" type="object">
      Additional ConversionAction fields to merge into the create payload (e.g. category, status, valueSettings). (Default: `{}`)
    </ResponseField>

    <ResponseField name="customer_client_id" type="string">
      Managed customer ID; defaults to account\_id when omitted.
    </ResponseField>

    ### Response

    ```json theme={null}
    {
      "additionalProperties": false,
      "properties": {
        "success": {
          "title": "Success",
          "type": "boolean"
        },
        "error": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Error"
        },
        "id": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Id"
        },
        "resource_name": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Resource Name"
        }
      },
      "required": [
        "success"
      ],
      "title": "SendOfflineConversionOutput",
      "type": "object"
    }
    ```
  </Accordion>
</AccordionGroup>

## Limits & Quotas

* **Daily operations quota** depends on the developer-token access level (Test, Basic, Standard). Standard tokens allow 15,000 operations/day initially. See [https://developers.google.com/google-ads/api/docs/access-levels](https://developers.google.com/google-ads/api/docs/access-levels).
* **Customer Match lists** typically take 6 to 12 hours to update after `add_contact_to_list_by_email` runs.
* **`generate_keyword_ideas`** counts against the same quota and may be rate-limited per minute on Basic-access tokens.
* **Error model**: non-2xx responses and timeouts are caught and returned as `success=False` + `error` rather than raising. The error string includes the API status code and body excerpt.

## Related integrations

<CardGroup cols={3}>
  <Card title="PostGrid" href="/integrations/tools/postgrid" />

  <Card title="Ahrefs" href="/integrations/tools/ahrefs" />

  <Card title="Coinbase" href="/integrations/tools/coinbase" />
</CardGroup>

## Links

* [Google Ads](https://ads.google.com)
