# Upload a Google Ads video

Upload MP4/WebM/QuickTime bytes (max 16 MiB) to the Google-managed YouTube channel for the selected ad account. Works on your own Google Ads account, connected through Get MCP Ads. The preview is free; the change costs $0.05 when you confirm it. Needs customer id, currency, bytes base64 and more.

Upload MP4/WebM/QuickTime bytes (max 16 MiB) to the Google-managed YouTube channel for the selected ad account. Visibility is UNLISTED: viewable by anyone with the link, not private. Default preview omits bytes and returns planHash; confirm requires expectedPlanHash. This API has no validateOnly. After upload, query you_tube_video_upload.state and video_id with google_ads_run_gaql; only use the video ID after PROCESSED, via google_ads_apply_plan assetOperation.youtubeVideoAsset. No automatic retry after an uncertain upload. Agentik price: free to preview; $0.05 when the change is applied (confirm: true without validateOnly).

- Tool ID: `google-ads/upload-video`
- Name in the catalog: Google Ads: Upload video
- Provider: [Google Ads](/providers/google-ads.md)
- Capability: [Google Ads creatives](/tools/google-ads/creatives.md)
- Price: free preview, $0.05 per applied change
- Workspace access is automatic. Connect a platform using the link and notice returned to your AI assistant; an owner or admin completes platform consent and returns to the conversation; see the [guide](/docs/getmcpads.md).
- Authentication: an authorised Agentik workspace is required for execution, including zero-price tools.

## Pricing contract

The provider’s price, with no markup. Billed for measured usage.


```json
{
  "model": "per_call",
  "amountUsd": 0,
  "multipliers": [
    {
      "all": [
        {
          "field": "confirm",
          "equals": true
        },
        {
          "field": "validateOnly",
          "truthy": false
        }
      ],
      "setUsd": 0.05
    }
  ]
}
```

## Complete input schema


```json
{
  "type": "object",
  "properties": {
    "customerId": {
      "type": "string",
      "pattern": "^[\\d-]+$",
      "description": "Selected Google Ads customer ID, not the manager account."
    },
    "currency": {
      "type": "string",
      "pattern": "^[A-Z]{3}$",
      "description": "Actual account currency as a three-letter ISO code; verified natively before writes."
    },
    "loginCustomerId": {
      "type": "string",
      "pattern": "^[\\d-]+$",
      "description": "Optional MCC ID; defaults to the selected account's inferred manager."
    },
    "testAccountOnly": {
      "type": "boolean",
      "description": "Require customer.test_account=true before writing. Always use true for sandbox acceptance."
    },
    "confirm": {
      "type": "boolean",
      "description": "Apply only when true and expectedPlanHash matches the exact preview."
    },
    "expectedPlanHash": {
      "type": "string",
      "pattern": "^[a-f0-9]{64}$",
      "description": "SHA-256 planHash from the preview of this exact payload, required for application."
    },
    "bytesBase64": {
      "type": "string",
      "minLength": 4,
      "maxLength": 22369624,
      "description": "Raw base64 video bytes, no data URL. Prefer an existing YouTube asset for large videos."
    },
    "mimeType": {
      "type": "string",
      "enum": [
        "video/mp4",
        "video/webm",
        "video/quicktime"
      ],
      "description": "Actual MIME type of the supplied video bytes."
    },
    "title": {
      "type": "string",
      "minLength": 1,
      "maxLength": 100,
      "description": "Nonempty title for this new video upload."
    },
    "description": {
      "type": "string",
      "minLength": 1,
      "maxLength": 5000,
      "description": "Nonempty video description; Google rejects an empty value during upload."
    },
    "visibility": {
      "type": "string",
      "const": "UNLISTED",
      "description": "Explicit acknowledgment of the visibility of this YouTube upload."
    },
    "workspace_id": {
      "type": "string",
      "description": "Authorized workspace ID from list_accounts/list_workspaces. Use the user's chosen workspace; never guess between clients. Optional when a unique account identifies it."
    },
    "reason": {
      "type": "string",
      "maxLength": 500,
      "description": "Why, in the person's words or from the evidence (e.g. CPA twice the target for 7 days). Saved with the change in the shared client journal."
    }
  },
  "required": [
    "customerId",
    "currency",
    "bytesBase64",
    "mimeType",
    "title",
    "description",
    "visibility"
  ]
}
```

## Published example

No example input is published for this tool. Ask for the inputs required by its schema.

## Execute and retrieve

Inspect again before execution, explain the price and obtain the required authority. Use MCP run_tool or POST /v1/run with this tool ID, valid input and an idempotency key. Save the returned run ID and follow the actual state. If Agentik answers that the tool is temporarily unavailable, do not retry it blindly; use discovery to propose an alternative.

A partial or uncertain result can still have consumed provider resources. Consult [billing](/docs/billing.md), [idempotency](/docs/idempotency.md) and [asynchronous results](/docs/async.md).

[REST inspection](https://api.agentik.cc/v1/tools/google-ads/upload-video) · [OpenAPI](/openapi.json) · [Connection guide](/connect.md)

---

[HTML page](/providers/google-ads/upload-video) · [Agent index](/llms.txt)
