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

# Đặt YouTube Watermark

> Đặt watermark trên kênh YouTube của bạn

export const HeaderAPI = ({noProfileKey, profileKeyRequired}) => <>
    <ParamField header="Authorization" type="string" required>
      <a href="/apis/overview#authorization">API Key</a> of the Primary Profile.
      <br />
      <br />
      Format: <code>Authorization: Bearer API_KEY</code>
    </ParamField>
    {!noProfileKey && (profileKeyRequired ? <ParamField header="Profile-Key" type="string" required>
          <a href="/apis/overview#profile-key-format">Profile Key</a> of a User Profile.
          <br />
          <br />
          Format: <code>Profile-Key: PROFILE_KEY</code>
        </ParamField> : <ParamField header="Profile-Key" type="string">
          <a href="/apis/overview#profile-key-format">Profile Key</a> of a User Profile.
          <br />
          <br />
          Format: <code>Profile-Key: PROFILE_KEY</code>
        </ParamField>)}
  </>;

export const PlansAvailable = ({plans = [], maxPackRequired}) => {
  let displayPlans = plans;
  if (plans && plans.length === 1) {
    const lowerCasePlan = plans[0].toLowerCase();
    if (lowerCasePlan === "business") {
      displayPlans = ["Launch", "Business", "Enterprise"];
    } else if (lowerCasePlan === "premium") {
      displayPlans = ["Premium", "Launch", "Business", "Enterprise"];
    }
  }
  return <Note>
Available on {displayPlans.length === 1 ? "the " : ""}
{displayPlans.join(", ").replace(/\b\w/g, l => l.toUpperCase())}{" "}
{displayPlans.length > 1 ? "plans" : "plan"}.

{maxPackRequired && <span onClick={() => window.open('https://www.ayrshare.com/docs/additional/maxpack', '_self')} className="flex items-center mt-2 cursor-pointer">
 <span className="px-1.5 py-0.5 rounded text-sm" style={{
    backgroundColor: '#C264B6',
    color: 'white',
    fontSize: '12px'
  }}>
   Max Pack required
 </span>
</span>}
</Note>;
};

<PlansAvailable plans={["premium"]} maxPackRequired={false} />

Đặt hình ảnh watermark trên kênh YouTube của bạn để xuất hiện trên tất cả các video. Watermark có thể được cấu hình để xuất hiện tại các thời điểm cụ thể trong quá trình phát video.

<ul class="custom-bullets">
  <li>Vị trí được tự động đặt ở góc dưới bên phải (mặc định của YouTube API)</li>
  <li>Tất cả các tham số thời gian `timingType`, `offsetMs`, và `durationMs` đều bắt buộc khi đặt watermark</li>
  <li>Watermark áp dụng cho tất cả các video trên kênh (hiện có và tương lai)</li>
  <li>Hình ảnh watermark phải đáp ứng [nguyên tắc phương tiện watermark](/media-guidelines/youtube#watermark) của YouTube</li>
  <li>Bạn phải có quyền phù hợp để quản lý kênh YouTube</li>
</ul>

## Tham số Header

<HeaderAPI noProfileKey={false} />

## Tham số Body

<ParamField body="mediaUrls" type="array" required>
  Mảng chứa URL hình ảnh watermark. Chỉ URL đầu tiên sẽ được sử dụng.
</ParamField>

<ParamField body="timingType" type="string" required>
  Khi nào hiển thị watermark trong quá trình phát video.

  Các tùy chọn timingType có sẵn:

  * `offsetFromStart` - Hiển thị watermark bắt đầu từ một thời điểm cụ thể sau khi video bắt đầu
  * `offsetFromEnd` - Hiển thị watermark bắt đầu từ một thời điểm cụ thể trước khi video kết thúc
</ParamField>

<ParamField body="offsetMs" type="number" required>
  Độ lệch thời gian tính bằng mili giây. Phải là số dương.

  * Với `offsetFromStart`: Thời gian sau khi video bắt đầu để hiển thị watermark
  * Với `offsetFromEnd`: Thời gian trước khi video kết thúc để hiển thị watermark
</ParamField>

<ParamField body="durationMs" type="number" required>
  Thời gian hiển thị watermark tính bằng mili giây. Phải là số dương.
</ParamField>

<RequestExample>
  ```bash cURL theme={"system"}
  curl \
  -H "Authorization: Bearer API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{
    "mediaUrls": ["https://example.com/watermark.png"],
    "timingType": "offsetFromStart",
    "offsetMs": 15000,
    "durationMs": 30000
  }' \
  -X POST https://api.ayrshare.com/api/post/youTubeWatermark
  ```

  ```javascript JavaScript theme={"system"}
  const API_KEY = "API_KEY";

  fetch("https://api.ayrshare.com/api/post/youTubeWatermark", {
    method: "POST",
    headers: {
      "Content-Type": "application/json",
      "Authorization": `Bearer ${API_KEY}`
    },
    body: JSON.stringify({
      mediaUrls: ["https://example.com/watermark.png"],
      timingType: "offsetFromStart",
      offsetMs: 15000,
      durationMs: 30000
    }),
  })
    .then((res) => res.json())
    .then((json) => console.log(json))
    .catch(console.error);
  ```

  ```python Python theme={"system"}
  import requests

  payload = {
      'mediaUrls': ['https://example.com/watermark.png'],
      'timingType': 'offsetFromStart',
      'offsetMs': 15000,
      'durationMs': 30000
  }
  headers = {
      'Content-Type': 'application/json',
      'Authorization': 'Bearer API_KEY'
  }

  r = requests.post('https://api.ayrshare.com/api/post/youTubeWatermark',
      json=payload,
      headers=headers)

  print(r.json())
  ```

  ```php PHP theme={"system"}
  <?php

  $apiUrl = 'https://api.ayrshare.com/api/post/youTubeWatermark';
  $apiKey = 'API_KEY';  // Replace 'API_KEY' with your actual API key

  $headers = [
      'Content-Type: application/json',
      'Authorization: Bearer ' . $apiKey,
  ];

  $data = json_encode([
      'mediaUrls' => ['https://example.com/watermark.png'],
      'timingType' => 'offsetFromStart',
      'offsetMs' => 15000,
      'durationMs' => 30000
  ]);

  $curl = curl_init($apiUrl);
  curl_setopt_array($curl, [
      CURLOPT_RETURNTRANSFER => true,
      CURLOPT_POST => true,
      CURLOPT_HTTPHEADER => $headers,
      CURLOPT_POSTFIELDS => $data
  ]);

  $response = curl_exec($curl);

  if ($response === false) {
      echo 'Curl error: ' . curl_error($curl);
  } else {
      echo json_encode(json_decode($response), JSON_PRETTY_PRINT);
  }

  curl_close($curl);
  ```

  ```csharp C# theme={"system"}
  using System;
  using System.Net.Http;
  using System.Text;
  using System.Threading.Tasks;

  namespace SetYouTubeWatermark_csharp
  {
      class SetYouTubeWatermark
      {
          private static readonly HttpClient client = new HttpClient();

          static async Task Main(string[] args)
          {
              string API_KEY = "API_KEY";
              string url = "https://api.ayrshare.com/api/post/youTubeWatermark";

              // Set up request headers
              client.DefaultRequestHeaders.Add("Authorization", "Bearer " + API_KEY);

              // Prepare JSON content
              string json = @"{
                  ""mediaUrls"": [""https://example.com/watermark.png""],
                  ""timingType"": ""offsetFromStart"",
                  ""offsetMs"": 15000,
                  ""durationMs"": 30000
              }";
              var content = new StringContent(json, Encoding.UTF8, "application/json");

              try
              {
                  // Send POST request
                  HttpResponseMessage response = await client.PostAsync(url, content);
                  response.EnsureSuccessStatusCode();

                  // Read response
                  string responseBody = await response.Content.ReadAsStringAsync();
                  Console.WriteLine(responseBody);
              }
              catch (HttpRequestException e)
              {
                  Console.WriteLine($"Error: {e.Message}");
              }
          }
      }
  }
  ```
</RequestExample>

<ResponseExample>
  ```json 200 theme={"system"}
  {
    "status": "success",
    "message": "Watermark set successfully",
    "mediaUrls": [
      "https://example.com/watermark.png"
    ],
    "timingType": "offsetFromStart",
    "offsetMs": 1000,
    "durationMs": 5000
  }
  ```

  ```json 400 - Invalid Image Dimensions theme={"system"}
  {
      "action": "post",
      "status": "error",
      "code": 140,
      "message": "The image aspect ratio must be between 1 and 1. Current image aspect ratio: 1085/723 (1.50). https://www.ayrshare.com/docs/media-guidelines/youtube "
  }
  ```

  ```json 400 - Unsupported Format theme={"system"}
  {
      "status": "error",
      "code": 307,
      "message": "Media type 'image/webp' is not supported. "
  }
  ```

  ```json 403 - Permission Error theme={"system"}
  {
    "status": "error",
    "code": 250,
    "message": "The watermark cannot be set for this channel. Please check that you have proper permissions and the channel is valid."
  }
  ```
</ResponseExample>
