---
title: "Video banners"
description: "Serve video with an uploaded file, a hosted file, a third-party VAST/VPAID tag, a VPAID framework or multi-rendition Advanced Local Videos — plus companions and VAST event tracking."
type: "howto"
audience: [network-manager]
keywords: [video banner, VAST, VPAID, local video, external video, companions, media files, in-stream, skip button, VAST tracking, ISCI, Ad-ID, UniversalAdId, CTV, SSAI, mezzanine, creative id, MediaTailor]
ui_path: "Account → Advertisers → campaign → Add banner for Video Placement"
---

Fetch the complete documentation index at: https://epom.com/ad-server/docs/llms.txt. Use this file to discover all available pages before exploring further. Append .md to any documentation page URL to get its markdown version.

# Video banners

Five banner types cover video demand on [video placements](https://epom.com/ad-server/docs/guides/inventory/placement-video.md):

| Type | Use when |
|---|---|
| **Local Video** | You have the file. Epom hosts it and wraps it in VAST. |
| **External Video** | The file sits on your CDN; you give Epom its URL. |
| **Third Party VAST/VPAID Tag URL** | Another ad server hands you a VAST or VPAID tag. |
| **VPAID Framework** | You use an interactive framework your network administrator installed, with per-banner parameters. |
| **Advanced Local Video(s) (Beta)** | You want several renditions of one creative in a single VAST response. |

**Local Video** and **External Video** are also offered on **email** placements. The other three
are video-placement-only.

## Who this is for

Advertisers and network managers running in-stream or out-stream video. Each video type is its own
role permission, and the stock Advertiser role has no video creatives at all. If a type you need
is missing, ask your network manager to switch it on for your role.

## Prerequisites

- A [campaign](https://epom.com/ad-server/docs/guides/advertising/campaigns.md) you can edit and a video placement to link to.
- The media file, its hosted URL, or the third-party tag.

## Steps

1. On the campaign, **Add new banner** → **Add banner for Video Placement**. The form opens on
   *Local Video*.
2. Fill the fields for your type — they differ more than you'd expect, so see
   [what each type asks for](#what-each-type-asks-for) below.
3. Optionally set the click-through **URL** and the **Title** (the ad title in the VAST response).
   For CTV and broadcast buys, enter the spot's **ISCI / Ad-ID code** (see
   [below](#isci--ad-id-code)).
4. **Save**. The video-specific cards described further down appear only once the banner exists.
5. Link the banner to the video placement.

### Local Video

Drop the file into **Banner creative**. The **File source** switch above the drop zone offers two
other ways in: **From link**, where you paste the file's address (public http/https only, within
the network's video size limit and never more than 100 MB) and it is downloaded once when you
save and stored exactly like an upload — so the host need not stay online — and **Media
library**, which uses a [library](https://epom.com/ad-server/docs/guides/advertising/media-library.md) video. After saving, the upload zone is
replaced by a **Video file** row that plays the creative right there in the form, with download
and delete buttons.

![A saved Local Video banner](https://epom.com/docs-images/ad-server/banner-video/local-video-form.webp)

Underneath it, **Video info** reports what the platform read from the file: resolution, duration,
video bitrate, frame rate, codecs, container, audio, loudness and file size. With the *Video
Creative Requirements* permission it also lists each linked site whose
[publisher spec](https://epom.com/ad-server/docs/guides/inventory/video-creative-requirements.md) is switched on, with whether the file
is served there — see [Publisher video requirements](#publisher-video-requirements). Nothing in it
blocks the save.

### External Video

Paste the file's URL into **Banner link** — required. Tick **Serve from our server** to keep the
link but play Epom's own copy of the file; see
[Serving an external file from our server](#serving-an-external-file-from-our-server).

### Third Party VAST/VPAID Tag URL

Paste the tag into **URL** — required here, unlike the file types — and pick the **In-Stream video
type**. The **VAST properties** fieldset carries three wrapper switches.

![A VAST tag banner](https://epom.com/docs-images/ad-server/banner-video/vast-tag-form.webp)

> **Note:** this type has **no Title field**. The tag's own VAST response supplies the ad title.

## What each type asks for

Verified by opening the create form for each type on both placement types it accepts:

| Field | Local Video | External Video | VAST/VPAID tag | VPAID Framework | Advanced Local Videos |
|---|---|---|---|---|---|
| Banner creative (upload, **From link** or **Media library**) | ✓ | — | — | — | — (added after save: the Media files card takes an upload or **Media library**) |
| Banner link (file URL) | — | **required** | — | — | — |
| Serve from our server | — | optional | — | — | — |
| URL (click-through) | optional | optional | **required** — the tag | optional | optional |
| Title | ✓ | ✓ | **absent** | ✓ | ✓ |
| ISCI / Ad-ID code | ✓ | ✓ | — | ✓ | ✓ |
| Ad-ID registry | ✓ | ✓ | — | ✓ | ✓ |
| VPAID framework | — | — | — | **required** | — |
| In-Stream video type | — | — | ✓ | — | — |
| VAST properties | — | — | ✓ | — | — |
| Ad unit | — | — | — | — | — |

No video type asks for an ad unit. (Ad units are required on a video placement only for the
*non-video* types — HTML Code, Local File and External File.)

**In-Stream video type** offers *Linear Video ad* and *Non-linear Video ad*. Only a subset of
banner types can be non-linear — HTML Code, Local File, External File and the VAST tag — so the
video-file types are always linear.

**VAST properties** are the three wrapper switches: **Follow additional wrappers**, **Allow
multiple ads**, **Fallback on no ads**. (Earlier *Sandboxed iframe*, *Always hide controls*, *Max
execution time* and *Max iterations* settings were removed — they matched no IAB schema and no
player read them.)

## Publisher video requirements

A publisher can set a video spec on a site (resolution, duration, bitrate, codecs, loudness and so
on) and switch it on. An uploaded video that misses it is not served on that site. The verdict
shows where you link:

- **Which creatives are checked.** Only a **Local Video** (its file) and an **Advanced Local
  Video(s)** banner (its best file — the highest-bitrate one, the same file the mezzanine uses).
  Every other creative — External Video, VAST tag, VPAID framework, HTML Code, image — reads *Not
  checked* and is never stopped. A spec that is switched off checks nothing.
- **On the banner.** *Video info* lists each linked site, as a link to that site's requirements,
  with a **Meets spec**, **Not checked** or **Not served: …** badge (the reasons follow the colon). The **Linked placements** card opens with *Not served
  on N linked placement(s): the file misses that publisher's spec*; in the tree each failing link
  carries a red **Not served** pill whose tooltip lists what is missed, and the grid has a
  **Publisher spec** column.
- **Before you link.** Ticking a not-yet-linked placement whose site spec the file misses shows a
  warning above **Save**: *N of the placements you are linking have video requirements this file
  misses: it will be linked but not served there.* The link is still made.

The verdicts need the *Video Creative Requirements* permission (enabled or read-only); without it
the badges, pills and warnings are absent. The spec itself is set on the site — see
[Video creative requirements](https://epom.com/ad-server/docs/guides/inventory/video-creative-requirements.md).

## Video file too big? Size limit, format and compression

- **Format.** A Local Video upload must be a video file — anything else is refused with "Must
  be video (mp4 or flv)". Whether a player can play it is a separate question: MP4 with H.264
  video and AAC audio is what web and mobile players accept most widely.
- **Size limit.** The upload is refused with "File is bigger than N MB" above the network's
  **Max allowed video file size** (20 MB by default; Epom sets it network-wide). Native
  video assets use the same limit.
- **Epom does not shrink your file by default.** Compress the video before uploading — lower the
  bitrate or the resolution in any video encoder — or serve it from your own host as an
  **External Video**, which has no upload limit (unless **Serve from our server** is ticked, which
  checks the downloaded copy like an upload).
- **Server-side compression (set by Epom).** Epom can configure a network to re-encode
  video uploads (H.264, AAC stereo, web-optimized): a Local Video file on save, and an Advanced
  Local Videos original into each resolution you tick. It is off by default; when it is on, the
  Local Video size limit applies to the **re-encoded** file. When it is off, Advanced Local
  Videos stores only the original you uploaded. Ask Epom support or your account manager whether it is enabled before
  relying on it.
- A **publisher's video spec** (bitrate, codec, loudness…) is checked separately, per site — see
  [Check video creatives against a publisher's spec](https://epom.com/ad-server/docs/guides/inventory/video-creative-requirements.md).

## Serving an external file from our server

An External Video normally plays from its link on every impression, so the advertiser's host has
to stay up and fast for the whole flight. **Serve from our server** keeps the link in the banner
but, when you save, downloads the file behind it, checks it like an upload and plays that copy
instead — the VAST `MediaFile` then points at our storage.

![Serve from our server on an External Video banner](https://epom.com/docs-images/ad-server/banner-video/hosted-copy.webp)

- **A changed link is downloaded again** on the next save. **Refresh copy** downloads the same
  link again, for a file that changed behind an unchanged address — nothing is re-fetched on its own.
- **A download that fails blocks the save**, with the reason under the link (not reachable, too
  large, not a video, not a public address).
- **Clearing the box** plays the link again and drops the copy.
- The same box exists for **External File** images and **External Native** assets.

## The saved-banner video sections

These exist only on a **saved** banner. If you don't see one, save the banner first.

### VAST tracking

A card of its own at the bottom of the banner, on video placements only and **never for OpenRTB
banners** — event tracking for RTB video comes from the bid's own markup. A new video banner
starts with the events an admin set under **Default VAST tracking events → New video banners**
(see [Rules, defaults and taxonomies](https://epom.com/ad-server/docs/guides/admin/rules-and-defaults.md)).

![The VAST tracking card](https://epom.com/docs-images/ad-server/banner-video/vast-tracking.webp)

Three parts:

- **Playback events** — the standard VAST milestones, grouped as *Quartiles & completion* (Ad
  Loaded, Ad Creative View, Ad Start, the three quartiles, Ad Complete), *Interaction* (Ad Skip,
  Mute, Unmute, Pause, Resume, Fullscreen, Exit Fullscreen, Expand, Collapse) and *Viewability &
  other* (Ad Viewable Impression, Ad Repeated Viewable Impression, Ad Not Viewable Impression, Ad
  View Undetermined Impression). Tick the ones you want and **Save** — this section has its own
  Save button.
- **Third-party pixels** — a tracking URL that fires on impression, on click, or on a chosen VAST
  event.
- **Progress points** — fire a conversion action at a custom time or percentage. The Title list is
  your conversion actions, so it is empty until you have some.

### Video files — Advanced Local Videos only

A **Video files** subsection inside Basic information. Upload one original and tick the
resolutions to produce (where the installation's video compression is on — with it off, only the
original is stored): *Original resolution*, 1080p, 720p, 480p, 360p, 320p, 240p (the first four
are ticked by default). Each rendition becomes a media-file row — duration, content type, width,
height — and all of them go into the VAST response so the player can choose. Switching the file
to **Media library** adds a [media library](https://epom.com/ad-server/docs/guides/advertising/media-library.md) video as a row without copying it.

### Companions

A **Companions** subsection on Local Video, External Video and Advanced Local Videos banners.
Companion banners render beside the player. Four resource types:

| Resource type | You provide |
|---|---|
| Static Resource | an uploaded image file (Local Video, Advanced Local Video(s)) or an image URL (External Video) |
| HTML Resource (Static Markup) | markup, plus width and height |
| HTML Resource (Template Markup) | a video-companion template, plus width and height |
| IFrame Resource | a URL, plus width and height |

![The Companions subsection](https://epom.com/docs-images/ad-server/banner-video/vast-companions.webp)

## Companion banners next to the video (VAST CompanionAds)

Companions you add on the **Companion ads** card go into the VAST response as `<CompanionAds>`
of the same creative as the video. Whether and where they appear is decided by the **player**
(and the page around it) — the player must support companions and have a slot of a matching
size; Epom only delivers them in the response. A **Third Party VAST/VPAID Tag URL** banner has no
Companion ads card: whatever companions the partner's own VAST carries are passed on as they are.
For a banner placed *inside* the player (an overlay or a non-linear ad), use the banner's
**In-Stream video type → Non-linear** instead — see
[Linear vs non-linear](https://epom.com/ad-server/docs/concepts/video-vast-vpaid-explained.md#linear-vs-non-linear-the-in-stream-video-type).

## ISCI / Ad-ID code

CTV and broadcast publishers identify every spot by its industry code: the Ad-ID (formerly ISCI)
in the US, or a Clearcast clock number in the UK. They check the code on delivery and reconcile
their invoices against it, so it has to reach them unchanged. Enter it on the video banner, and
Epom sends it in every VAST response for that creative:

| VAST version | Where the code goes |
|---|---|
| 4.1, 4.2, 4.3 | `<UniversalAdId idRegistry="ad-id.org">ABCD1234000H</UniversalAdId>` and the Creative's `adId` attribute |
| 4.0 | `<UniversalAdId idRegistry="ad-id.org" idValue="ABCD1234000H"/>` and the Creative's `adId` attribute |
| 2.0, 3.0 | the Creative's `AdID` attribute, described by those schemas as "Ad-ID for the creative (formerly ISCI)", plus a `UniversalAdId` extension as the IAB VAST CTV Addendum 2024 defines it (see [below](#what-a-server-side-ad-insertion-stitcher-receives)) |

The registry defaults to `ad-id.org`. Change it only when the code comes from another registry,
for example `clearcast.co.uk`. The code and the registry each take up to 64 characters. A banner
without a code keeps sending `unknown`, which is what VAST 4 prescribes when no code exists.

The code is also an analytics dimension. Group a General report by **ISCI / Ad-ID** to add up
delivery per spot across every banner that carries it. Filter a General report or an
Impressions, Clicks or Conversions log by one or more codes; the filter offers the codes set on
the banners you can report on. The logs also show the code as a column next to the banner. See
[Analytics dimensions](https://epom.com/ad-server/docs/reference/analytics-dimensions.md).

**Who sees it:** the code fields, the group-by, the filter and the log column all need the
**Banner ISCI / Ad-ID Code** permission — ask your network admin to switch it on for the roles that
traffic video. The fields appear on a **video
placement** only, for Local Video, External Video, VPAID Framework and Advanced Local Video(s) — an
email placement's Local or External Video has none. Without it the banner form has
no code fields, the API leaves a code it is sent unchanged and lists it under `ignoredFields`,
and reports offer neither the dimension nor the filter. Codes already saved keep going out in VAST whoever edits the banner.

> **Corner case:** reports read the code from the banner at the time the report runs. If you
> change a banner's code, its past delivery moves to the new code too — they are not stored
> per impression.

> **Corner case:** companion creatives in the same response keep `unknown`. The code identifies
> the video spot, not the companion banner next to it.

> **Corner case:** a Third Party VAST/VPAID Tag URL banner has no code field. The creative, and
> its UniversalAdId, come from the other ad server's response.

## What a server-side ad insertion stitcher receives

On CTV a stitcher (AWS MediaTailor, Google DAI, …) transcodes the video once, caches the result and
splices it into the stream. Every Local Video, External Video and Advanced Local Video(s) response
is built for that:

- **A stable creative id.** `<Creative id="4512-a1b2c3d4">` is the banner id plus a short hash of
  the video file. Stitchers cache their transcode under it and never expire it, so it stays the
  same while the file does — the ad plays straight from the cache — and changes the moment you
  upload a different file, so the old version never plays in its place. The first request after a
  new file is still skipped while the stitcher transcodes; that happens once per file.
- **A mezzanine file** — the source a stitcher transcodes from. Videos are served as uploaded, so
  it is the same file the `<MediaFile>` points at: `<Mezzanine>` in `<MediaFiles>` on VAST 4.x
  (with its delivery, type and size from 4.1), and a `Mezzanine` extension on 2.0 (in the ad's
  `<Extensions>`) and 3.0 (in `<CreativeExtensions>`), as the IAB VAST CTV Addendum 2024 defines.
  Upload the best-quality file you have: the mezzanine is only as good as the upload, and the
  network's **maximum video file size** (Preferences) caps it.
- **Best file first.** With several media files (Advanced Local Video(s)) the highest-bitrate one
  comes first, and the response duration is taken from it.
- **Only standard event names.** MediaTailor rejects a whole response over one event name the VAST
  specification does not define. Epom translates the player-size events per version and leaves
  out what a version lacks:

| Event | 2.0 | 3.0 | 4.0 | 4.1 – 4.3 |
|---|---|---|---|---|
| Fullscreen / Exit fullscreen | `fullscreen` / — | `fullscreen` / `exitFullscreen` | `playerExpand` / `playerCollapse` | `playerExpand` / `playerCollapse` |
| Expand / Collapse (linear video) | `expand` / `collapse` | `expand` / `collapse` | — | — |
| Ad loaded | — | — | — | `loaded` |

  The event settings, their conversion actions and the reports are unchanged — only the name
  written into the response differs. `skip` and `progress` are sent on 2.0 as well: 2.0 is what a
  tag without a version gets, and progress points often drive conversions.

## Several networks in one slot: waterfalls, pods and wrapper flags

A video request returns **one** banner unless the placement's **Return (ads in pod)** (or
`maxAds` on the tag) is above 1 — then the response is a numbered **ad pod**, and players such
as JW Player and Google IMA play every ad in it. For a waterfall across several VAST tags keep
the pod at 1 and either give the player one Epom placement per network in order, or let Epom
pick one wrapper per request by priority. The **VAST 4.0 Wrapper properties** (*Follow
additional wrappers*, *Allow multiple ads*, *Fallback on no ads*) are written into the
`<Wrapper>` only when the tag is requested as VAST 4.0 or later, and only steer how the player
treats that one partner's answer. Full recipe, macros for the partner's tag URL and how to read
fill per network: [Run a pre-roll waterfall across several video networks](https://epom.com/ad-server/docs/use-cases/vast-waterfall-several-networks.md).

## Macros in the video’s click-through URL (domain, placement, click ID)

The banner's **URL** becomes the VAST `<ClickThrough>`, and it goes through the same macro
processing as any landing page before it is written — so
`https://offer.example.com/?src=$$REFERER_DOMAIN$$&pl=$$PLACEMENT_ID$$&cid=$$CLICK_ID$$` reaches
the viewer filled in. By default the `<ClickThrough>` is Epom's click redirect with that landing
page inside it, so the click is counted on the way.

Two limits:

- **The page domain is often not known in video.** A player that loads the VAST from its own
  frame sends its own address, so `$$REFERER_DOMAIN$$` can read `imasdk.googleapis.com` or be
  empty. Pass the domain in the VAST tag instead and read it back — see
  [Why is `$$REFERER_DOMAIN$$` empty?](https://epom.com/ad-server/docs/reference/macros.md#why-is-referer_domain-or-referer-empty).
- **A partner's VAST tag keeps its own click-through.** On a *Third Party VAST/VPAID Tag URL*
  banner Epom writes a wrapper: the tag URL itself is macro-processed (so you can pass the domain
  or placement *to the partner*), and Epom adds its own click tracking, but the `<ClickThrough>`
  is the partner's, inside their VAST. Epom cannot rewrite it — ask the partner to put the
  parameter in their landing URL.

## Corner cases and gotchas

> **Corner case:** **VAST tracking, Video files and Companions exist only on saved banners.** On a
> brand-new banner they are absent, not broken — save first, then scroll down.

> **Corner case:** the VAST tracking card opens **collapsed** and its playback events have their
> own **Save** button, separate from the banner's. Ticking events and pressing the banner's Save
> does not store them.

> **Corner case:** **Video files** appears only for *Advanced Local Video(s)* — a plain Local Video
> banner has one file and no rendition list. Switching an existing banner to Advanced does not move
> its file into the rendition set.

> **Corner case:** the **VAST/VPAID tag type has no Title**, and its **URL is required** where the
> file types treat URL as an optional click-through. If you are copying settings between types,
> that field changes meaning.

> **Corner case — companions need a landing URL.** A banner's companions are written into the
> VAST only when the banner has a click-through (landing) URL; without one the response carries
> the video alone. Third Party VAST tag banners and DSP video never get Epom companions — the
> partner's own VAST decides.

> **Corner case — AdParameters are VPAID only.** `<AdParameters>` appears in VPAID responses,
> where it configures the VPAID unit. A plain VAST response has none.

> **Corner case:** **Show skip button after (seconds)** is gated on the *Banner Video Skip Button*
> permission. On networks where that permission was never granted to any role the field never
> appears, whatever the placement's own skip settings say.

> **Note:** for video bought programmatically, use an [OpenRTB banner](https://epom.com/ad-server/docs/guides/advertising/banner-openrtb-dsp.md)
> with video mime types rather than a file type.

## Over the API

- `POST /rest-api/banner/{bannerId}/update.do` takes the video settings of this page: `skipButtonShowAfterSeconds`
  (with the Video Skip Button permission), `returnAsIframe`, `title`, and for a VAST tag banner the three VAST 4.0
  wrapper flags — which apply even when `bannerType` is not resent. `GET /rest-api/banner/{bannerId}.do` returns them.
- **The file.** A **Local Video** takes a multipart `videoFile`; or `videoFileUrl`, a public http/https address the
  server downloads once and stores (up to the video size limit — 20 MB by default, never more than 100 MB); or
  `mediaAssetId`, a [Media Library](https://epom.com/ad-server/docs/guides/advertising/media-library.md) video. An **External Video** takes `videoFileLink`, with
  `hostExternalFiles=true` for **Serve from our server** and `refreshHostedFiles=true` (update only) to download the
  link again. A save reads the link to confirm it is a video and to fill **Video info**, but an
  update that keeps the link of a banner that already is an External Video with its video info
  stored does not read it again, so an unrelated update does not depend on the advertiser's host
  being up; a new link, a change of banner type or `refreshHostedFiles=true` reads it again.
- **ISCI / Ad-ID.** `universalAdIdValue` and `universalAdIdRegistry` (an empty value clears the code). Without the
  *Banner ISCI / Ad-ID Code* permission they are left unchanged and listed under `ignoredFields`.
- `GET /rest-api/banner/{bannerId}/video-compliance.do` returns the file's facts and, with the *Video Creative
  Requirements* permission, the verdict per linked site.
- The **Companions** card is `/rest-api/banner/{bannerId}/vast/companions.do`: `GET` lists, `POST` adds one without an
  upload (`type=STATIC` with an image URL in `externalCreativeLink`; `IFRAME` with the frame URL; `HTML_STATIC` with
  `markup`; `HTML_TEMPLATE` with a Video Companion `templateId` — the last three with `width` and `height`), and
  `DELETE .../companions/{companionId}.do` removes one. It needs the VAST Companion Ads permission.
- The **Media files** card of an Advanced Local Video(s) banner is `/rest-api/banner/{bannerId}/vast/media-files.do`:
  `GET` lists the renditions (with `mediaAssetId` on a library file and a public `url`); `POST` uploads a multipart
  `file` or downloads a public `url`, with `scaleTo` picking the renditions where the network compresses video
  (`ORIGINAL`, `_1080P` … `_240P`); `POST .../media-files/from-library.do` adds a media library video by reference;
  `DELETE .../media-files/{mediaFileId}.do` removes one — an uploaded file is erased, a library file stays in the
  library. It needs the Advanced Local Video(s) permission (`whoami.may.advancedLocalVideos` for the assistant).

## Per-role notes

- **Advertiser** — no **Add banner for Video Placement** on the stock role. Your network manager
  switches video creatives on for your role, and links them to placements.
- **Network manager** — video creatives are on the stock role; a role is changed in **Admin →
  Users & access → User roles & permissions**.
- **Can view share** — uploads and grids are read-only, the add and delete buttons on media files
  and companions are hidden, and the VAST tracking card appears at all only if something is already
  configured. Ask the owner for **Can edit** if you need to change the creative.
- **Custom roles** — each video type, companions, VAST event tracking, Advanced media files and
  **Show skip button after** can be switched off per role. A hidden field's value sent anyway is
  not saved.

## Related

- [Reuse creative files with the Media Library](https://epom.com/ad-server/docs/guides/advertising/media-library.md) — upload a video once and pick it in many Local Video or Advanced Local Video(s) creatives
- [Video placements](https://epom.com/ad-server/docs/guides/inventory/placement-video.md)
- [Diagnose video ad playback failures (VAST errors)](https://epom.com/ad-server/docs/troubleshooting/vast-errors-and-playback.md)
- [Banner types — decision guide](https://epom.com/ad-server/docs/guides/advertising/banners-overview.md)
- [OpenRTB (DSP) banners](https://epom.com/ad-server/docs/guides/advertising/banner-openrtb-dsp.md)
- [Other admin tools](https://epom.com/ad-server/docs/guides/admin/admin-tools.md) — where your network administrator installs a VPAID framework