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

# Adding Logo to Videos

> Add your logo to videos with custom positioning and styling

This guide shows you how to add your company logo or watermark to videos with full control over positioning and size. Perfect for branding videos without creating a full brand preset.

## What You'll Learn

<CardGroup cols={2}>
  <Card title="Logo Integration" icon="image">
    Add logos from URL to any video
  </Card>

  <Card title="Custom Positioning" icon="arrows-up-down-left-right">
    Place logo anywhere on screen
  </Card>

  <Card title="Size Customization" icon="maximize">
    Control logo width as a percentage of video
  </Card>

  <Card title="Format Support" icon="file-image">
    PNG, JPG, SVG, and GIF logos
  </Card>
</CardGroup>

## Before You Begin

Make sure you have:

* A [Pictory API key](https://app.pictory.ai/api-access)
* Node.js or Python installed on your machine
* Logo image file accessible via public URL
* Basic understanding of image positioning

<CodeGroup>
  ```bash npm theme={null}
  npm install axios
  ```

  ```bash pip theme={null}
  pip install requests
  ```
</CodeGroup>

## How Logo Placement Works

When you add a logo to your video:

1. **Logo Access** - Your logo image is downloaded from the provided URL
2. **Position Calculation** - Logo is placed at the specified screen position
3. **Size Application** - Logo is sized based on the width percentage you specify
4. **Video Rendering** - Logo appears on all scenes throughout the video

<Note>
  The logo appears on every scene in your video by default. For scene-specific logos, you can apply logo settings at the scene level instead of the video level.
</Note>

## Complete Example

<CodeGroup>
  ```javascript Node.js theme={null}
  import axios from "axios";

  const API_BASE_URL = "https://api.pictory.ai/pictoryapis";
  const API_KEY = "YOUR_API_KEY";

  const SAMPLE_TEXT = "AI is poised to significantly impact educators and course creators on social media.";
  const LOGO_URL = "https://pictory-static.pictorycontent.com/logo.png";

  async function createVideoWithLogo() {
    try {
      console.log("Creating video with logo...");

      const response = await axios.post(
        `${API_BASE_URL}/v2/video/storyboard/render`,
        {
          videoName: "text_to_video_with_logo",

          // Logo configuration
          logo: {
            url: LOGO_URL,              // Public URL to logo image
            position: "top-right",      // Logo placement
            width: "15%",               // 15% of video width
          },

          // Scene configuration
          scenes: [
            {
              story: SAMPLE_TEXT,
              createSceneOnNewLine: false,
              createSceneOnEndOfSentence: false,
            },
          ],
        },
        {
          headers: {
            "Content-Type": "application/json",
            Authorization: API_KEY,
          },
        }
      );

      const jobId = response.data.data.jobId;
      console.log("✓ Video creation started!");
      console.log("Job ID:", jobId);

      // Monitor progress
      console.log("\nMonitoring video creation...");
      let jobCompleted = false;
      let jobResult = null;

      while (!jobCompleted) {
        const statusResponse = await axios.get(
          `${API_BASE_URL}/v1/jobs/${jobId}`,
          {
            headers: { Authorization: API_KEY },
          }
        );

        const status = statusResponse.data.data.status;
        console.log("Status:", status);

        if (status === "completed") {
          jobCompleted = true;
          jobResult = statusResponse.data;
          console.log("\n✓ Video with logo is ready!");
          console.log("Video URL:", jobResult.data.videoURL);
        } else if (status === "failed") {
          throw new Error("Video creation failed: " + JSON.stringify(statusResponse.data));
        }

        await new Promise(resolve => setTimeout(resolve, 5000));
      }

      return jobResult;
    } catch (error) {
      console.error("Error:", error.response?.data || error.message);
      throw error;
    }
  }

  createVideoWithLogo();
  ```

  ```python Python theme={null}
  import requests
  import time
  import json

  API_BASE_URL = 'https://api.pictory.ai/pictoryapis'
  API_KEY = 'YOUR_API_KEY'

  SAMPLE_TEXT = "AI is poised to significantly impact educators and course creators on social media."
  LOGO_URL = "https://pictory-static.pictorycontent.com/logo.png"

  def create_video_with_logo():
      try:
          print("Creating video with logo...")

          response = requests.post(
              f'{API_BASE_URL}/v2/video/storyboard/render',
              json={
                  'videoName': 'text_to_video_with_logo',

                  # Logo configuration
                  'logo': {
                      'url': LOGO_URL,              # Public URL to logo image
                      'position': 'top-right',      # Logo placement
                      'width': '15%'                # 15% of video width
                  },

                  # Scene configuration
                  'scenes': [
                      {
                          'story': SAMPLE_TEXT,
                          'createSceneOnNewLine': False,
                          'createSceneOnEndOfSentence': False
                      }
                  ]
              },
              headers={
                  'Content-Type': 'application/json',
                  'Authorization': API_KEY
              }
          )
          response.raise_for_status()

          job_id = response.json()['data']['jobId']
          print("✓ Video creation started!")
          print(f"Job ID: {job_id}")

          # Monitor progress
          print("\nMonitoring video creation...")
          job_completed = False
          job_result = None

          while not job_completed:
              status_response = requests.get(
                  f'{API_BASE_URL}/v1/jobs/{job_id}',
                  headers={'Authorization': API_KEY}
              )
              status_response.raise_for_status()

              status = status_response.json()['data']['status']
              print(f"Status: {status}")

              if status == 'completed':
                  job_completed = True
                  job_result = status_response.json()
                  print("\n✓ Video with logo is ready!")
                  print(f"Video URL: {job_result['data']['videoURL']}")
              elif status == 'failed':
                  raise Exception(f"Video creation failed: {status_response.json()}")

              time.sleep(5)

          return job_result

      except requests.exceptions.RequestException as error:
          print(f"Error: {error}")
          if hasattr(error, 'response') and error.response is not None:
              print(f"Response: {error.response.text}")
          raise

  if __name__ == '__main__':
      create_video_with_logo()
  ```
</CodeGroup>

## Understanding the Parameters

### Logo Configuration

| Parameter       | Type   | Required | Description                                             |
| --------------- | ------ | -------- | ------------------------------------------------------- |
| `logo.url`      | string | Yes      | Public URL to your logo image file                      |
| `logo.position` | string | No       | Logo placement on screen (default: `top-right`)         |
| `logo.width`    | string | No       | Logo width as percentage of video width (e.g., `"15%"`) |

## Logo Position Options

Choose where to place your logo on the video:

| Position        | Location           | Best Used For                    |
| --------------- | ------------------ | -------------------------------- |
| `top-left`      | Upper left corner  | Alternative watermark placement  |
| `top-center`    | Upper center       | Centered branding                |
| `top-right`     | Upper right corner | Standard watermark (most common) |
| `center-left`   | Middle left        | Side branding                    |
| `center-center` | Center of frame    | Intro/outro logos                |
| `center-right`  | Middle right       | Side branding                    |
| `bottom-left`   | Lower left corner  | Legal/copyright notices          |
| `bottom-center` | Lower center       | Centered footer branding         |
| `bottom-right`  | Lower right corner | Alternative watermark            |

<Tip>
  **Most Popular:** `top-right` is the standard position for watermarks and brand logos, as it is visible but does not interfere with subtitles (typically at bottom).
</Tip>

## Width (Size) Reference

Control logo size relative to video width using a percentage string:

| Width Value | Effect                        |
| ----------- | ----------------------------- |
| `"5%"`      | Very small, minimal watermark |
| `"10%"`     | Small, subtle branding        |
| `"15%"`     | Standard size (recommended)   |
| `"20%"`     | Medium, noticeable branding   |
| `"25%"`     | Large logo                    |
| `"30%"`     | Very large, dominant logo     |

<Warning>
  **Avoid Extremes:** Logos smaller than `"5%"` may be hard to see, while logos larger than `"30%"` can be distracting and cover important content.
</Warning>

## Supported Image Formats

| Format   | Extension       | Supports Transparency | Recommended For                        |
| -------- | --------------- | --------------------- | -------------------------------------- |
| PNG      | `.png`          | Yes                   | Logos with transparency (best choice)  |
| JPG/JPEG | `.jpg`, `.jpeg` | No                    | Photographic logos                     |
| SVG      | `.svg`          | Yes                   | Vector logos, scalable graphics        |
| GIF      | `.gif`          | Yes                   | Static logos (animation not supported) |

<Tip>
  **Best Format:** Use PNG with transparent background for professional-looking logos that blend seamlessly with any video background.
</Tip>

## Common Use Cases

### Professional Watermark

```javascript theme={null}
{
  logo: {
    url: "https://example.com/company-logo.png",
    position: "top-right",
    width: "15%"
  }
}
```

**Result:** Subtle, professional watermark in the standard position.

### Prominent Branding

```javascript theme={null}
{
  logo: {
    url: "https://example.com/brand-logo.png",
    position: "top-center",
    width: "25%"
  }
}
```

**Result:** Large, visible logo for strong brand presence.

### Minimal Copyright Notice

```javascript theme={null}
{
  logo: {
    url: "https://example.com/copyright-mark.png",
    position: "bottom-left",
    width: "8%"
  }
}
```

**Result:** Small, subtle copyright or trademark symbol.

### Intro/Outro Logo

```javascript theme={null}
{
  logo: {
    url: "https://example.com/large-logo.png",
    position: "center-center",
    width: "40%"
  }
}
```

**Result:** Large centered logo for introduction or conclusion scenes.

## Best Practices

<AccordionGroup>
  <Accordion title="Choose the Right Logo Image">
    Prepare your logo file for best results:

    * **PNG Format:** Use PNG with transparent background for clean edges
    * **High Resolution:** Minimum 512x512 pixels for clarity
    * **Simple Design:** Logos with less detail scale better
    * **Appropriate Colors:** Ensure logo is visible on various backgrounds
    * **Test First:** Preview logo on different content types before production
  </Accordion>

  <Accordion title="Position for Maximum Impact">
    Select logo placement strategically:

    * **Top-Right:** Standard for watermarks, does not conflict with subtitles
    * **Top-Left:** Alternative for different visual balance
    * **Avoid Center:** Center placement can distract from main content
    * **Consider Subtitles:** Do not overlap with caption placement (usually bottom)
    * **Test Visibility:** Ensure logo is visible on light and dark scenes
  </Accordion>

  <Accordion title="Size Appropriately">
    Choose width based on video type:

    * **Standard Videos:** `"12%"` to `"18%"` works well for most content
    * **Social Media:** `"10%"` to `"15%"` for subtle branding
    * **Corporate Videos:** `"15%"` to `"20%"` for stronger presence
    * **Intro/Outro Only:** Consider scene-level logos instead
    * **Consistency:** Use same size across all videos for brand recognition
  </Accordion>

  <Accordion title="Ensure Logo Accessibility">
    Make your logo file accessible to the API:

    * **Cloud Storage:** Upload to Google Drive, Dropbox, AWS S3, or CDN
    * **Public URL:** Ensure the URL is publicly accessible (no authentication)
    * **Direct Link:** Use direct file URL, not preview or viewer links
    * **Test Access:** Open URL in incognito browser to verify
    * **HTTPS:** Use secure HTTPS URLs for best compatibility
  </Accordion>
</AccordionGroup>

## Troubleshooting

<AccordionGroup>
  <Accordion title="Logo Does Not Appear in Video">
    **Problem:** Video is created but logo is missing.

    **Solution:**

    * Verify the logo URL is publicly accessible (test in incognito browser)
    * Check that the image file format is supported (PNG, JPG, SVG, GIF)
    * Confirm the URL is a direct link to the image file
    * Try a different image URL to test if it is a file-specific issue
  </Accordion>

  <Accordion title="Logo appears pixelated or blurry">
    **Problem:** Logo quality is poor in the final video.

    **Solution:**

    * Use a higher resolution logo image (minimum 512x512 pixels)
    * Avoid scaling logo too large (keep width below `"30%"`)
    * Use PNG or SVG format instead of JPG for sharper edges
    * Check source image quality before using
    * For vector logos, use SVG format when possible
  </Accordion>

  <Accordion title="Logo has white box around it">
    **Problem:** Logo appears with a white or colored background instead of being transparent.

    **Solution:**

    * Use PNG format with transparent background
    * Re-export logo with alpha channel (transparency) enabled
    * Check original file has transparent background (open in image editor)
    * Avoid JPG format which does not support transparency
    * Use online tools to remove background if needed
  </Accordion>

  <Accordion title="Logo is too big or too small">
    **Problem:** Logo size does not match expectations.

    **Solution:**

    * Adjust the `width` parameter (e.g., `"5%"` to `"30%"`)
    * Width is relative to video width, not height
    * Test different width values: `"10%"` (small), `"15%"` (medium), `"20%"` (large)
    * Remember larger videos will show logos larger at same width percentage
    * Preview before full production
  </Accordion>

  <Accordion title="Logo position is off-center or incorrect">
    **Problem:** Logo does not appear where expected.

    **Solution:**

    * Verify position value matches available options
    * Position names are case-sensitive (e.g., "top-right" not "Top-Right")
    * Check for typos in position parameter
    * Logo is positioned based on its center point
    * Try different positions to find best placement
  </Accordion>

  <Accordion title="Logo blocks important content">
    **Problem:** Logo covers subtitles or key visuals.

    **Solution:**

    * Move logo to a different position (avoid bottom if using subtitles)
    * Reduce logo size (lower width value, e.g., `"10%"`)
    * Consider placing logo in corner with least content
    * Test with actual video content before production
  </Accordion>
</AccordionGroup>

## Next Steps

Explore more branding and customization options:

<CardGroup cols={2}>
  <Card title="Brand Settings" icon="palette" href="/guides/branding-customization/brand-settings">
    Use complete brand presets for full consistency
  </Card>

  <Card title="Subtitle Styles" icon="closed-captioning" href="/guides/branding-customization/subtitle-styles">
    Apply saved subtitle styling to videos
  </Card>

  <Card title="Custom Subtitle Style" icon="font" href="/guides/branding-customization/custom-subtitle-style">
    Create custom subtitle styles inline
  </Card>

  <Card title="Highlight Keywords" icon="highlighter" href="/guides/branding-customization/highlight-keywords">
    Emphasize important words in subtitles
  </Card>
</CardGroup>

## API Reference

For complete technical details, see:

* [Render Storyboard Video](/api-reference/videos/render-storyboard-video) - Full API specification
* [Get Job Status](/api-reference/jobs/get-video-render-job-by-id) - Monitor job status and progress
