העלה סרטונים

YouTubeVideoUploadService מאפשר לכם להעלות סרטונים ישירות ל-YouTube דרך Google Ads API. אחר כך אפשר להשתמש בסרטונים האלה כדי ליצור נכסי וידאו בסוגים שונים של מודעות, כמו קמפיינים למיקסום הביצועים או קמפיינים ליצירת ביקוש.

השירות הזה מייעל את תהליך העבודה של יצירת מודעות וידאו. הוא מטפל בתהליך ההעלאה ל-YouTube, ומבטיח שהסרטונים ישויכו לחשבון שלכם בצורה נכונה.

מושגים מרכזיים

לפני שמתחילים, חשוב להבין איך מתנהלת העלאת סרטונים ואת המצבים השונים שהם יכולים לעבור.

תהליך עבודה מקצה לקצה

כדי להעלות קובץ וידאו ולהציג אותו במודעה, צריך לבצע ארבעה שלבים ברצף:

שלב שירות ושיטה סיכום
1. הפעלה והעלאה של בייטים של סרטונים CreateYouTubeVideoUpload ב-YouTubeVideoUploadService מעלים את המטא-נתונים של הסרטון ואת הקובץ הבינארי כדי ליצור משאב YouTubeVideoUpload (customers/{customer_id}/youTubeVideoUploads/{video_upload_id}).
2. מצב עיבוד הסקר SearchStream ב-GoogleAdsService מריצים שאילתה על you_tube_video_upload עד state = 'PROCESSED' ומאכלסים את video_id של YouTube באורך 11 תווים.
3. יצירת נכס וידאו לשימוש חוזר MutateAssets ב-AssetService יוצרים YoutubeVideoAsset (youtube_video_id = video_id) כדי לקבל שם משאב של נכס (customers/{customer_id}/assets/{asset_id}).
4. קישור הנכס לקמפיינים או למודעות ‫MutateAssetGroupAssets ב-AssetGroupAssetService או MutateAdGroupAds ב-AdGroupAdService מקשרים את הנכס לקמפיין למיקסום הביצועים AssetGroupAsset (field_type = YOUTUBE_VIDEO) או לקמפיין ליצירת ביקוש DemandGenVideoResponsiveAdInfo (videos[].asset).

בעלות על ערוץ

כשאתם מעלים סרטון, אתם יכולים לציין את ערוץ YouTube היעד באמצעות השדה channel_id במשאב YouTubeVideoUpload:

  • ערוץ בבעלות המפרסם (מותג): צריך לספק את channel_id של ערוץ YouTube קיים בבעלות המפרסם. האפשרות הזו נתמכת רק בתהליך אימות המשתמש, ולא ניתן להשתמש בה עם חשבונות שירות.
  • ערוץ בניהול Google: אם לא מציינים את channel_id, הסרטון מועלה לערוץ YouTube בניהול Google שמשויך לחשבון Google Ads.

סטטוסים של העלאות

מחזור החיים של העלאת סרטון ל-YouTube מתועד בשדה state. ה-enum‏ YouTubeVideoUploadState מגדיר את הסטטוסים הבאים:

מדינה (State) תיאור
PENDING הסרטון בתהליך העלאה.
UPLOADED הסרטון הועלה בהצלחה ועובר עיבוד על ידי YouTube.
PROCESSED העיבוד של הסרטון הסתיים והוא מוכן לשימוש.
FAILED ההעלאה או העיבוד נכשלו ואי אפשר להשלים אותם.
REJECTED הסרטון נדחה בגלל בעיות באימות או בגלל הפרות מדיניות.
UNAVAILABLE סטטוס הסרטון לא זמין. יכול להיות שהוא הוסר מ-YouTube.

הגדרות פרטיות

השדה video_privacy קובע מי יכול לראות את הסרטון שהועלה. ‫enum‏ YouTubeVideoPrivacy תומך בערכים הבאים:

  • PUBLIC: הסרטון זמין לכולם ב-YouTube. (מותר רק בערוצי מותג).
  • ‫UNLISTED: אי אפשר לחפש את הסרטון, אבל כל מי שיש לו את הקישור יכול לצפות בו. זוהי אפשרות ברירת המחדל והאפשרות היחידה לערוצים בניהול Google.

גילוי נאות לגבי תוכן שנוצר על ידי AI

החל מגרסה 26, בהתאם לתקנות כמו EU AI Act (חוק הבינה המלאכותית של האיחוד האירופי), מפרסמים יכולים לציין אם קטע וידאו שהועלה מכיל תוכן שנוצר על ידי AI או מדיה סינתטית.

השדה video_content_metadata ב-YouTubeVideoUpload מכיל את הערך VideoContentMetadata. מגדירים את השדה המקונן generative_content_disclosure באמצעות הערך YouTubeVideoUploadGenerativeContentDisclosure enum:

ערך תיאור
NON_GENERATIVE_CONTENT המפרסם הצהיר שהסרטון לא נוצר באמצעות AI.
GENERATIVE_CONTENT המפרסם ציין שהסרטון נוצר על ידי AI.

העלאת סרטון

כדי להעלות סרטון, צריך להשתמש בבקשה מרובת חלקים ל-method‏ CreateYouTubeVideoUpload. הבקשה מכילה גם את המטא-נתונים של ההעלאה וגם את קובץ הווידאו עצמו.

1. התחלת ההעלאה

יוצרים CreateYouTubeVideoUploadRequest עם השדות הבאים:

שדה דרישה תיאור ומגבלות
customer_id חובה מספר הלקוח ב-Google Ads שכולל 10 ספרות (ללא מקפים).
you_tube_video_upload.video_title חובה (INPUT_ONLY, IMMUTABLE) שם הסרטון שהועלה ל-YouTube (עד 100 תווים, לא יכול להכיל את התווים < או >).
you_tube_video_upload.video_description אופציונלי (INPUT_ONLY, ‏ IMMUTABLE) תיאור הסרטון ב-YouTube (עד 5,000 תווים, לא יכול להכיל את התווים < או >).
you_tube_video_upload.channel_id אופציונלי (IMMUTABLE) מזהה ערוץ היעד ב-YouTube (24 תווים שמתחילים ב-UC) של ערוץ מותג בבעלות המפרסם. אם משמיטים את הפרמטר הזה, ההעלאה תתבצע לערוץ בניהול Google.
you_tube_video_upload.video_privacy אופציונלי (ניתן לשינוי בערוצי מותג) YouTubeVideoPrivacy (ברירת המחדל היא UNLISTED, או PUBLIC לערוצי מותג בבעלות המפרסם).
you_tube_video_upload.video_content_metadata אופציונלי (INPUT_ONLY, ‏ IMMUTABLE) זמין החל מגרסה 26: VideoContentMetadata עם generative_content_disclosure שמוגדר לערך YouTubeVideoUploadGenerativeContentDisclosure (NON_GENERATIVE_CONTENT או GENERATIVE_CONTENT).

אם אתם משתמשים בספריית לקוח, צריך להפעיל את ה-method‏ CreateYouTubeVideoUpload, להעביר את קובץ הווידאו והעלאת הסרטון תטופל באופן פנימי.

Java

String videoUploadResourceName;
try (YouTubeVideoUploadServiceClient youTubeVideoUploadServiceClient =
    googleAdsClient.getLatestVersion().createYouTubeVideoUploadServiceClient()) {
  YouTubeVideoUpload youTubeVideoUpload =
      YouTubeVideoUpload.newBuilder()
          .setVideoTitle("Test Video")
          .setVideoDescription("Test Video Description")
          .setVideoPrivacy(YouTubeVideoPrivacy.UNLISTED)
          .build();

  CreateYouTubeVideoUploadRequest createUploadRequest =
      CreateYouTubeVideoUploadRequest.newBuilder()
          .setCustomerId(Long.toString(customerId))
          .setYouTubeVideoUpload(youTubeVideoUpload)
          .build();

  CreateYouTubeVideoUploadResponse response =
      youTubeVideoUploadServiceClient.createYouTubeVideoUpload(
          createUploadRequest, () -> new FileInputStream(videoFile), null);

  videoUploadResourceName = response.getResourceName();
  System.out.printf("Created YouTube video upload: %s%n", videoUploadResourceName);
}
      

C#‎

YouTubeVideoUploadServiceClient ytService = client.GetService(
    Services.V26.YouTubeVideoUploadService);

CreateYouTubeVideoUploadRequest createUploadRequest =
    new CreateYouTubeVideoUploadRequest()
    {
        CustomerId = customerId.ToString(),
        YouTubeVideoUpload = new YouTubeVideoUpload()
        {
            VideoTitle = "Test Video",
            VideoDescription = "Test Video Description",
            VideoPrivacy = YouTubeVideoPrivacy.Unlisted
        }
    };

string videoUploadResourceName;
using (FileStream stream = File.OpenRead(videoFilePath))
{
    ResumableUploadSession<CreateYouTubeVideoUploadRequest, CreateYouTubeVideoUploadResponse> session =
        ytService.CreateYouTubeVideoUpload();
    CreateYouTubeVideoUploadResponse response =
        session.BeginUploadAsync(createUploadRequest, stream).Result;

    videoUploadResourceName = response.ResourceName;
    Console.WriteLine($"Created YouTube video upload: {videoUploadResourceName}");
}
      

PHP

$youTubeVideoUploadServiceClient = $googleAdsClient->getYouTubeVideoUploadServiceClient();

$youTubeVideoUpload = new YouTubeVideoUpload([
    'video_title' => 'Test Video',
    'video_description' => 'Test Video Description',
    'video_privacy' => YouTubeVideoPrivacy::UNLISTED
]);

$createYouTubeVideoUploadRequest = CreateYouTubeVideoUploadRequest::build(
    $customerId,
    $youTubeVideoUpload
);

/** @var ResumableUpload $resumableUpload */
$resumableUpload = $youTubeVideoUploadServiceClient->createYouTubeVideoUpload(
    $createYouTubeVideoUploadRequest
);

$stream = Utils::streamFor(fopen($videoFilePath, 'rb'));
/** @var CreateYouTubeVideoUploadResponse $response */
$response = $resumableUpload->startUpload($stream);

$videoUploadResourceName = $response->getResourceName();
printf("Created YouTube video upload: '%s'%s", $videoUploadResourceName, PHP_EOL);
      

Python

yt_service: YouTubeVideoUploadServiceClient = client.get_service(
    "YouTubeVideoUploadService"
)

create_upload_request: CreateYouTubeVideoUploadRequest = (
    youtube_video_upload_service.CreateYouTubeVideoUploadRequest()
)
create_upload_request.customer_id = customer_id
create_upload_request.you_tube_video_upload.video_title = "Test Video"
create_upload_request.you_tube_video_upload.video_description = (
    "Test Video Description"
)
create_upload_request.you_tube_video_upload.video_privacy = (
    client.enums.YouTubeVideoPrivacyEnum.UNLISTED
)

video_upload_resource_name: str
with open(video_file_path, "rb") as stream:
    response: CreateYouTubeVideoUploadResponse = (
        yt_service.create_you_tube_video_upload(
            stream=stream,
            request=create_upload_request,
            retry=None,
        )
    )
    video_upload_resource_name = response.resource_name
    print(f"Created YouTube video upload: {video_upload_resource_name}")
      

Ruby

video_upload = client.resource.you_tube_video_upload do |v|
  v.video_title = "Test Video"
  v.video_description = "Test Video Description"
  v.video_privacy = :UNLISTED
end

upload = client.service.you_tube_video_upload.create_you_tube_video_upload(
  customer_id: customer_id,
  you_tube_video_upload: video_upload,
)

video_upload_resource_name = nil
File.open(video_file_path, "rb") do |stream|
  response = upload.start(
    stream: stream,
    content_type: "application/octet-stream",
  )
  video_upload_resource_name = response.resource_name
  puts "Created YouTube video upload: #{video_upload_resource_name}"
end
      

Perl

This example is not yet available in Perl; you can take a look at the other languages.
    

curl

# 
# Use the --i curl parameter to capture response headers in the $RESPONSE
# variable.
FILE_SIZE=$(wc -c < "${VIDEO_FILE_NAME}" | tr -d '\r')
RESPONSE=$(curl -i -f -v -s --request POST \
"https://googleads.googleapis.com/resumable/upload/v${API_VERSION}/customers/${CUSTOMER_ID}/youTubeVideoUploads:create" \
--header "Content-Type: application/json" \
--header "login-customer-id: ${MANAGER_CUSTOMER_ID}" \
--header "Authorization: Bearer ${OAUTH2_ACCESS_TOKEN}" \
--header "X-Goog-Upload-Protocol: resumable" \
--header "X-Goog-Upload-Command: start" \
--header "X-Goog-Upload-Header-Content-Length: ${FILE_SIZE}" \
--data @- <<EOF
{
  "customer_id": "${CUSTOMER_ID}",
  "you_tube_video_upload": {
    "video_title": "${VIDEO_TITLE}",
    "video_description": "${VIDEO_DESCRIPTION}",
    "video_privacy": "UNLISTED"
  }
}
EOF
)

# Extract the value of the "x-goog-upload-url" header from the HTTP response.
UPLOAD_URL=$(echo "${RESPONSE}" \
  | grep -i '^x-goog-upload-url' \
  | awk '{print $2}' \
  | tr -d '\r')
CHUNK_SIZE=$(echo "${RESPONSE}" \
  | grep -i '^x-goog-upload-chunk-granularity' \
  | awk '{print $2}' \
  | tr -d '\r')
      

אם אתם משתמשים ב-REST, בקטע הבא מוסבר איך לנהל את העלאת הסרטון.

2. מעלים את הסרטון

כשמעלים באמצעות REST, ‏ CreateYouTubeVideoUpload משתמש בפרוטוקול העלאה שניתן להמשיך בשני שלבים:

  1. התחלת סשן ההעלאה: שולחים בקשת POST ראשונית לנקודת הקצה להעלאה CreateYouTubeVideoUpload (/upload/v26/customers/{customer_id}/youTubeVideoUploads:create) עם x-goog-upload-command: start (ואפשר גם עם x-goog-upload-header-content-length כדי להצהיר על גודל הקובץ). התגובה מחזירה את כתובת ה-URL של סשן ההעלאה בכותרת התגובה x-goog-upload-url של HTTP, יחד עם מטא-נתונים כמו גודל החלק הצפוי.
  2. הזרמת בייטים של הסרטון וסגירת ההעלאה: שליחת מטען ייעודי בינארי של הסרטון לנקודת הקצה x-goog-upload-url עם x-goog-upload-command: upload, finalize. בסיום ההעלאה, התגובה מחזירה את ה-resource_name שנוצר (customers/{customer_id}/youTubeVideoUploads/{video_upload_id}).

כדי לקבל תיאור מלא של כותרות ה-HTTP שמשמשות בפרוטוקול להעלאת סרטונים, עיינו בדוגמת הקוד הבאה:

# Take the first ${CHUNK_SIZE} bytes of the video file and upload them.
head -c ${CHUNK_SIZE} ${VIDEO_FILE_NAME} | curl -i -v -X PUT "${UPLOAD_URL}" \
--header "Authorization: Bearer ${OAUTH2_ACCESS_TOKEN}" \
--header "X-Goog-Upload-Offset: 0" \
--header "X-Goog-Upload-Command: upload" \
--header "Content-Length: ${CHUNK_SIZE}" \
--data-binary @-

# Query the status of the upload.
QUERY_RESPONSE=$(curl -i -s -X POST "${UPLOAD_URL}" \
--header "Authorization: Bearer ${OAUTH2_ACCESS_TOKEN}" \
--header "X-Goog-Upload-Command: query")

# Extract the value of the "x-goog-upload-size-received" header from the HTTP
# response.
UPLOADED_BYTES=$(echo "${QUERY_RESPONSE}" \
  | grep -i '^x-goog-upload-size-received' \
  | awk '{print $2}' \
  | tr -d '\r')

echo "Uploaded ${UPLOADED_BYTES} bytes."

REMAINING_BYTES=$((FILE_SIZE - UPLOADED_BYTES))
echo "${REMAINING_BYTES} bytes remaining to upload."

FINALIZE_RESPONSE=$(tail -c ${REMAINING_BYTES} ${VIDEO_FILE_NAME} | curl -v -X PUT "${UPLOAD_URL}" \
--header "Authorization: Bearer ${OAUTH2_ACCESS_TOKEN}" \
--header "X-Goog-Upload-Offset: ${UPLOADED_BYTES}" \
--header "X-Goog-Upload-Command: upload, finalize" \
--data-binary @-)
UPLOADED_VIDEO_RESOURCE_NAME=$(echo $FINALIZE_RESPONSE | jq -r '.resourceName')
      

3. אחזור מצב העלאת הסרטון

אחרי שמתחילים להעלות סרטון, שולחים שאילתה ל-GAQL כדי לבדוק את מצב העיבוד שלו. השאילתה צריכה לכלול את השדות שאפשר לבחור במשאב you_tube_video_upload (resource_name,‏ video_upload_id,‏ channel_id,‏ video_id,‏ state ו-video_privacy) עד שמקבלים את הערך state = 'PROCESSED' (אי אפשר לבחור את השדות INPUT_ONLY ב-GAQL):

Java

// Retrieve the metadata of the newly uploaded video.
String query =
    String.format(
        "SELECT "
            + "you_tube_video_upload.resource_name, "
            + "you_tube_video_upload.video_id, "
            + "you_tube_video_upload.state "
            + "FROM you_tube_video_upload "
            + "WHERE you_tube_video_upload.resource_name = '%s'",
        videoUploadResourceName);

try (GoogleAdsServiceClient googleAdsServiceClient =
    googleAdsClient.getLatestVersion().createGoogleAdsServiceClient()) {
  SearchGoogleAdsStreamRequest request =
      SearchGoogleAdsStreamRequest.newBuilder()
          .setCustomerId(Long.toString(customerId))
          .setQuery(query)
          .build();

  ServerStream<SearchGoogleAdsStreamResponse> stream =
      googleAdsServiceClient.searchStreamCallable().call(request);

  for (SearchGoogleAdsStreamResponse response : stream) {
    for (GoogleAdsRow googleAdsRow : response.getResultsList()) {
      YouTubeVideoUpload video = googleAdsRow.getYouTubeVideoUpload();
      System.out.printf(
          "Video with ID %s was found in state %s.%n",
          video.getVideoId(), video.getState());
    }
  }
}
      

C#‎

// Retrieve the metadata of the newly uploaded video.
string query = $@"
    SELECT
      you_tube_video_upload.resource_name,
      you_tube_video_upload.video_id,
      you_tube_video_upload.state
    FROM you_tube_video_upload
    WHERE you_tube_video_upload.resource_name = '{videoUploadResourceName}'";

GoogleAdsServiceClient gaService = client.GetService(
    Services.V26.GoogleAdsService);

gaService.SearchStream(customerId.ToString(), query,
    delegate (SearchGoogleAdsStreamResponse resp)
    {
        foreach (GoogleAdsRow row in resp.Results)
        {
            Console.WriteLine(
                $"Video with ID {row.YouTubeVideoUpload.VideoId} was found in " +
                $"state {row.YouTubeVideoUpload.State}.");
        }
    }
);
      

PHP

// Retrieve the metadata of the newly uploaded video.
$query = sprintf(
    "SELECT you_tube_video_upload.resource_name, "
    . "you_tube_video_upload.video_id, "
    . "you_tube_video_upload.state "
    . "FROM you_tube_video_upload "
    . "WHERE you_tube_video_upload.resource_name = '%s'",
    $videoUploadResourceName
);

$googleAdsServiceClient = $googleAdsClient->getGoogleAdsServiceClient();
$stream = $googleAdsServiceClient->searchStream(
    SearchGoogleAdsStreamRequest::build($customerId, $query)
);

foreach ($stream->iterateAllElements() as $googleAdsRow) {
    /** @var GoogleAdsRow $googleAdsRow */
    printf(
        "Video with ID '%s' was found in state '%s'.%s",
        $googleAdsRow->getYouTubeVideoUpload()->getVideoId(),
        YouTubeVideoUploadState::name($googleAdsRow->getYouTubeVideoUpload()->getState()),
        PHP_EOL
    );
}
      

Python

# Retrieve the metadata of the newly uploaded video.
query: str = f"""
    SELECT
      you_tube_video_upload.resource_name,
      you_tube_video_upload.video_id,
      you_tube_video_upload.state
    FROM you_tube_video_upload
    WHERE you_tube_video_upload.resource_name = '{video_upload_resource_name}'"""

ga_service: GoogleAdsServiceClient = client.get_service("GoogleAdsService")
stream: Iterator[SearchGoogleAdsStreamResponse] = ga_service.search_stream(
    customer_id=customer_id, query=query
)

for row in itertools.chain.from_iterable(batch.results for batch in stream):
    video = row.you_tube_video_upload
    print(
        f"Video with ID {row.you_tube_video_upload.video_id} was found in state {row.you_tube_video_upload.state}."
    )
      

Ruby

# Retrieve the metadata of the newly uploaded video.
query = <<~EOQ
  SELECT
    you_tube_video_upload.resource_name,
    you_tube_video_upload.video_id,
    you_tube_video_upload.state
  FROM you_tube_video_upload
  WHERE you_tube_video_upload.resource_name = '#{video_upload_resource_name}'
EOQ

responses = client.service.google_ads.search_stream(
  customer_id: customer_id,
  query: query,
)

responses.each do |batch|
  batch.results.each do |row|
    puts "Video with ID #{row.you_tube_video_upload.video_id} was found in " \
      "state #{row.you_tube_video_upload.state}."
  end
end
      

Perl

This example is not yet available in Perl; you can take a look at the other languages.
    

curl

curl -i -v -X POST \
"https://qa-prod-googleads.sandbox.googleapis.com/v${API_VERSION}/customers/${CUSTOMER_ID}/googleAds:search" \
--header "Content-Type: application/json" \
  --header "Developer-Token: ${DEVELOPER_TOKEN}" \
  --header "login-customer-id: ${MANAGER_CUSTOMER_ID}" \
  --header "Authorization: Bearer ${OAUTH2_ACCESS_TOKEN}" \
  --data @- <<EOF
{
  "query": "SELECT you_tube_video_upload.resource_name, you_tube_video_upload.video_id, you_tube_video_upload.state FROM you_tube_video_upload WHERE you_tube_video_upload.resource_name = '$UPLOADED_VIDEO_RESOURCE_NAME'"
}
EOF
      

נהל העלאות

אחרי שהעלאת הסרטון מסתיימת, אפשר להשתמש בו כנכס וידאו.

שימוש בסרטון שהועלה

אחרי שהסרטון מגיע למצב PROCESSED, אפשר למצוא את מזהה הסרטון ב-YouTube (שמורכב מ-11 תווים) בשדה video_id של המשאב YouTubeVideoUpload.

משתמשים ב-video_id הזה כדי ליצור YoutubeVideoAsset עם MutateAssets, ומקשרים את שם המשאב של הנכס שנוצר (customers/{customer_id}/assets/{asset_id}) לקמפיינים או למודעות:

  1. יוצרים את YoutubeVideoAsset על ידי העברת youtube_video_id אל AssetService.MutateAssets:

    POST https://googleads.googleapis.com/v26/customers/{customer_id}/assets:mutate
    {
      "operations": [
        {
          "create": {
            "name": "Product Launch Video",
            "youtubeVideoAsset": {
              "youtubeVideoId": "dQw4w9WgXcQ"
            }
          }
        }
      ]
    }
    
  2. מקשרים את Asset אל AssetGroup או AdGroupAd:

    • קמפיינים למיקסום הביצועים: יוצרים AssetGroupAsset באמצעות AssetGroupAssetService.MutateAssetGroupAssets, ומגדירים את field_type לערך YOUTUBE_VIDEO:

      POST https://googleads.googleapis.com/v26/customers/{customer_id}/assetGroupAssets:mutate
      {
        "operations": [
          {
            "create": {
              "assetGroup": "customers/{customer_id}/assetGroups/{asset_group_id}",
              "asset": "customers/{customer_id}/assets/{asset_id}",
              "fieldType": "YOUTUBE_VIDEO"
            }
          }
        ]
      }
      
    • קמפיין ליצירת ביקוש: צריך להפנות אל customers/{customer_id}/assets/{asset_id} ברשימה videos של אובייקט DemandGenVideoResponsiveAdInfo כשמבצעים קריאה אל AdGroupAdService.MutateAdGroupAds:

      POST https://googleads.googleapis.com/v26/customers/{customer_id}/adGroupAds:mutate
      {
        "operations": [
          {
            "create": {
              "adGroup": "customers/{customer_id}/adGroups/{ad_group_id}",
              "status": "PAUSED",
              "ad": {
                "name": "Demand Gen Video Ad",
                "finalUrls": ["https://www.example.com"],
                "demandGenVideoResponsiveAd": {
                  "videos": [
                    {
                      "asset": "customers/{customer_id}/assets/{asset_id}"
                    }
                  ],
                  "logoImages": [
                    {
                      "asset": "customers/{customer_id}/assets/{logo_asset_id}"
                    }
                  ],
                  "headlines": [
                    {
                      "text": "Example Headline"
                    }
                  ],
                  "longHeadlines": [
                    {
                      "text": "Example Long Headline"
                    }
                  ],
                  "descriptions": [
                    {
                      "text": "Example Description"
                    }
                  ],
                  "businessName": {
                    "text": "Example Business"
                  }
                }
              }
            }
          }
        ]
      }
      
  3. שליחת שאילתה לגבי נכסי YOUTUBE_VIDEO קיימים באמצעות GoogleAdsService.SearchStream:

    SELECT
      asset.id,
      asset.resource_name,
      asset.name,
      asset.type,
      asset.youtube_video_asset.youtube_video_id,
      asset.youtube_video_asset.youtube_video_title
    FROM asset
    WHERE asset.type = 'YOUTUBE_VIDEO'
      AND asset.youtube_video_asset.youtube_video_id = '{video_id}'
    

עדכון של מטא-נתונים

כדי לעדכן את הגדרת הפרטיות של סרטון שהועלה באמצעות ה-API הזה, צריך להשתמש ב-method‏ UpdateYouTubeVideoUpload ולהגדיר את update_mask בתור "video_privacy". אחרי היצירה, אפשר לעדכן רק את השדה video_privacy (PUBLIC או UNLISTED, לסרטונים שהועלו לערוץ מותג בבעלות המפרסם). השדות video_title, video_description, channel_id ו-video_content_metadata הם קבועים.

הסרת העלאות

אם אתם צריכים למחוק סרטונים שהועלו באמצעות Google Ads API, אתם צריכים להעביר את שמות המשאבים שלהם ב-customers/{customer_id}/youTubeVideoUploads/{video_upload_id} בשדה resource_names של השיטה RemoveYouTubeVideoUpload. הפעולה הזו מסירה את הסרטון גם מספריית הנכסים הדיגיטליים של Google Ads וגם מ-YouTube.