# Create Responsive Search Ad — Google Ads

> Creates a Responsive Search Ad (RSA) in an ad group. RSA copy (headlines, descriptions) cannot be edited in-place after creation — to change ad copy, remove the existing ad and create a new one. URL fields (finalUrls, trackingUrlTemplate…

- Key: `google_ads-create-responsive-search-ad`
- Type: Action (Write)
- Version: 0.0.3
- App: Google Ads (`google_ads`) — https://pipedream.com/apps/google-ads.md
- This page (HTML): https://pipedream.com/apps/google-ads/actions/create-responsive-search-ad
- Hints: open-world
- Source: https://github.com/PipedreamHQ/pipedream/blob/master/components/google_ads/actions/create-responsive-search-ad/create-responsive-search-ad.mjs

## Description

Creates a Responsive Search Ad (RSA) in an ad group. RSA copy (headlines, descriptions) cannot be edited in-place after creation — to change ad copy, remove the existing ad and create a new one. URL fields (`finalUrls`, `trackingUrlTemplate`, etc.) can be updated in-place via the **Create or Update Ad Group Ad** action. [See the documentation](https://developers.google.com/google-ads/api/docs/ads/ad-types)

## Props

| Prop | Type | Required | Description |
|---|---|---|---|
| `accountId` | `string` | Yes | The ID of an account of a customer directly accessible by the authenticated user. This is usually a Manager Account, used as login-customer-id (e.g., 1234567890). Use the List Account ID Options action to get the list of accessible accounts. Options are loaded from the connected account. |
| `customerClientId` | `string` | No | The ID of a customer client from the list of customers linked to the selected account (e.g., 1234567890). Use the List Customer Clients action to get the list of customer clients. Options are loaded from the connected account. |
| `adGroupId` | `string` | Yes | The ad group to create this ad in. Options are loaded from the connected account. |
| `status` | `string` | No | The initial status of the ad. Defaults to ENABLED. |
| `headlines` | `string[]` | Yes | 3–15 headline assets. Each value is either plain text (max 30 characters) or a JSON object to pin to a specific slot: {"text": "Buy Now", "pinnedField": "HEADLINE_1"}. Valid pinnedField values: HEADLINE_1, HEADLINE_2, HEADLINE_3. |
| `descriptions` | `string[]` | Yes | 2–4 description assets. Each value is either plain text (max 90 characters) or a JSON object to pin to a specific slot: {"text": "Shop today", "pinnedField": "DESCRIPTION_1"}. Valid pinnedField values: DESCRIPTION_1, DESCRIPTION_2. |
| `finalUrls` | `string[]` | Yes | The landing page URL(s). At least one is required. |
| `finalMobileUrls` | `string[]` | No | The landing page URL(s) for mobile devices. |
| `trackingUrlTemplate` | `string` | No | The URL template for constructing a tracking URL. |
| `finalUrlSuffix` | `string` | No | The suffix appended to landing page URLs when serving. |

## Run it

**MCP**

```ts
import { Client } from "@modelcontextprotocol/sdk/client/index.js"
import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js"
import { PipedreamClient } from "@pipedream/sdk"

const pd = new PipedreamClient({
  projectId: process.env.PIPEDREAM_PROJECT_ID!,
  clientId: process.env.PIPEDREAM_CLIENT_ID!,
  clientSecret: process.env.PIPEDREAM_CLIENT_SECRET!,
  projectEnvironment: "production",
})

const accessToken = await pd.rawAccessToken

const transport = new StreamableHTTPClientTransport(
  new URL("https://remote.mcp.pipedream.net/v3"),
  {
    requestInit: {
      headers: {
        Authorization: `Bearer ${accessToken}`,
        "x-pd-project-id": process.env.PIPEDREAM_PROJECT_ID!,
        "x-pd-environment": "production",
        "x-pd-external-user-id": "{external_user_id}", // any stable ID for this user in your system
        "x-pd-app-slug": "google_ads",
      },
    },
  },
)

const mcp = new Client({ name: "my-agent", version: "1.0.0" })
await mcp.connect(transport)

const { tools } = await mcp.listTools()

// listTools() hands your model this tool's input schema, so it can
// fill the arguments itself:
const result = await mcp.callTool({
  name: "google_ads-create-responsive-search-ad",
  arguments: {
    accountId: "Use Google Ads As",
    customerClientId: "Managed Account",
  },
})
```

**TypeScript**

```ts
import { PipedreamClient } from "@pipedream/sdk"

const pd = new PipedreamClient({
  projectId: process.env.PIPEDREAM_PROJECT_ID!,
  clientId: process.env.PIPEDREAM_CLIENT_ID!,
  clientSecret: process.env.PIPEDREAM_CLIENT_SECRET!,
  projectEnvironment: "production",
})

const result = await pd.actions.run({
  id: "google_ads-create-responsive-search-ad",
  externalUserId: "{external_user_id}", // any stable ID for this user in your system
  configuredProps: {
    google_ads: { authProvisionId: "apn_xxxxxxx" },
    accountId: "Use Google Ads As",
    customerClientId: "Managed Account",
  },
})

console.log(result)
```

**cURL**

```bash
curl -X POST https://api.pipedream.com/v1/connect/{project_id}/actions/run \
  -H "Content-Type: application/json" \
  -H "X-PD-Environment: production" \
  -H "Authorization: Bearer {access_token}" \
  -d '{
    "external_user_id": "{external_user_id}",
    "id": "google_ads-create-responsive-search-ad",
    "configured_props": {
      "google_ads": { "authProvisionId": "apn_xxxxxxx" },
      "accountId": "Use Google Ads As",
      "customerClientId": "Managed Account"
    }
  }'
```

---

- App: https://pipedream.com/apps/google-ads.md · All apps: https://pipedream.com/apps
