---
title: "Upload a Google Ads video"
method: POST
path: "/api/apps/{app_id}/google-ads/assets/upload-video"
---

# Upload a Google Ads video

`POST /api/apps/{app_id}/google-ads/assets/upload-video`

## Request

- Base URL: `https://app.base44.com`
- URL: `https://app.base44.com/api/apps/{app_id}/google-ads/assets/upload-video`
- Auth: HTTP bearer

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

Uploads a video file to YouTube so you can use it in a campaign.

Google Ads only takes video as a YouTube video, so a file has to reach YouTube before a campaign can show it. Base44 fetches the file from `file_url` and uploads it as an unlisted video to a YouTube channel Google manages for Base44, not to your own channel. The upload is not tied to a campaign: pass the returned `video_id` as a campaign video the same way you would pass the ID from a YouTube link. An uploaded video that no campaign uses stays on that channel, unlisted.

The request waits while the file is fetched and uploaded, and then a few seconds more while YouTube assigns the video ID. If YouTube is still processing by then, the response carries an empty `video_id` and an `upload_rn`. The upload has succeeded in that case. Do not upload the file again: call [Poll a Google Ads video upload](/api-reference/poll-a-google-ads-video-upload) with `upload_rn` every few seconds until `video_id` comes back. A file that cannot be fetched, one over 64 MB, and a video YouTube rejects return a 400.

Each upload publishes a video, so this is limited to 5 uploads every 5 minutes per app. Some workspaces have a different limit. Polling has its own, looser limit. It is refused with a 409 while the workspace is on a Google Ads billing hold.

<Note>This endpoint accepts a personal API key from anyone who can edit the app. A read-only key is refused with a 403, and so are workspace API keys.</Note>

## Path parameters

- `app_id` string, required: ID of the app whose Google Ads creative you want to generate or read.

## Request body

- GoogleAdsVideoUploadRequest: A video file to upload to YouTube for Google Ads.
  - `file_url` string, required: Address of the video file. It has to be `https` on a host Base44 fetches media from, such as an address on `base44.com` or `base44.app`, and the file can be at most 64 MB. Base44 does not fetch any other address and rejects it with a 400.
  - `title` string, nullable: Title of the unlisted YouTube video. Only the first 100 characters are used. It is shown on the video itself, never in the ad. Leave it out for a generic title.

## Response `200`

The uploaded video, or a reference to poll while YouTube processes it.

- GoogleAdsVideoUpload: A video uploaded to YouTube for Google Ads.
  - `video_id` string, required: The YouTube video ID. Pass it as a video on a campaign, exactly as you would the ID from a YouTube link. Empty while YouTube is still processing the upload, in which case poll with `upload_rn`.
  - `upload_rn` string, required: Google's reference for the upload. Keep it until `video_id` is filled in, and pass it to [Poll a Google Ads video upload](/api-reference/poll-a-google-ads-video-upload).

## Other responses

- `400`: The file could not be fetched from `file_url`, including an address on a host Base44 does not fetch from and a file over 64 MB, or YouTube or Google Ads rejected the video.
- `401`: Missing or invalid credentials.
- `403`: You can't edit this app, the app does not exist, or you used a read-only or workspace API key. A missing app and an app you cannot reach are deliberately the same answer.
- `404`: The app has no connected Google Ads account.
- `409`: The workspace is on a Google Ads billing hold.
- `422`: Validation Error
- `429`: The app has used up its 5 uploads in the last 5 minutes, or Google Ads is rate limiting the account. Retry later.

## Changes

> 58 revisions in range; 1 not diffed.

- **2026-10-12** `5e139db2e643`: 1 info
  - the endpoint scheme security `PersonalAccessTokenAuth` was added to the API
- **2026-10-09** `fc604cdcc3a2`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/adexad/apis/base44-app-management-api/changes/api/apps/:app_id/google-ads/assets/upload-video/post.md)

---

[API](https://skmtc.dev/adexad/apis/base44-app-management-api.md) · [All operations](https://skmtc.dev/adexad/apis/base44-app-management-api/llms.txt) · [OpenAPI document](https://skmtc.dev/adexad/apis/base44-app-management-api/revisions/fa29e915c226?raw)
