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

# Creative Specification

> Creative types, supported formats, per-bid configuration, and behavior for CloudX-rendered (server-to-server) demand

For server-to-server (SDK-less) demand, the CloudX SDK renders your creative in-app directly from the `bid.adm` markup — there is no network SDK involved. This page is the rendering contract: which creative types and formats are accepted, the per-bid configuration you can send, and the user-experience behavior CloudX enforces.

This specification applies only to bids that CloudX renders. See the [Demand Partner Overview](/en/demand/overview) for how rendering is routed.

## Routing

A bid is rendered by CloudX when the bid response carries `ext.cloudx.render.provider = "cloudx"`. CloudX then selects a creative engine from `ext.crtype`:

| `ext.crtype`       | Rendered as      |
| ------------------ | ---------------- |
| `html` (or absent) | HTML / MRAID 3.0 |
| `vast` or `video`  | VAST video       |

The creative markup itself is read from `bid.adm` (HTML document or VAST XML).

## Creative types

* **HTML / MRAID 3.0** — Static and interactive HTML creatives. MRAID 3.0 host APIs are exposed to the creative. `mraid.useCustomClose()` is accepted but has no effect (see [Close control](#close-control)); on fullscreen placements `expand()` and `resize()` are rejected.
* **VAST video** — VAST 2.0 through 4.3 are supported. VAST 5.x and unrecognized versions fail closed with an unsupported-version error, allowing the exchange to deliver a fallback creative. VPAID is not supported.

## Supported formats

| Format          | HTML (MRAID 3.0) | VAST video |
| --------------- | ---------------- | ---------- |
| Banner (320×50) | ✓                | —          |
| MREC (300×250)  | ✓                | —          |
| Interstitial    | ✓                | ✓          |
| Rewarded        | ✓                | ✓          |

Native and App Open are not rendered by CloudX.

## Per-bid configuration

Optional per-creative behavior is carried in `ext.cloudx.render.player_config`. Every field is optional; omit the block to accept SDK defaults.

```json theme={null}
{
  "ext": {
    "cloudx": {
      "render": {
        "provider": "cloudx",
        "player_config": {
          "close":  { "delay_seconds": 5 },
          "skip":   { "delay_seconds": 5 },
          "audio":  { "muted_by_default": false },
          "cta":    { "text": "Learn More" },
          "orientation": "auto"
        }
      }
    }
  }
}
```

| Field                    | Type    | Applies to             | Meaning                                                                         |
| ------------------------ | ------- | ---------------------- | ------------------------------------------------------------------------------- |
| `close.delay_seconds`    | number  | Interstitial, Rewarded | Delay before the close control becomes visible. `0` = visible immediately.      |
| `skip.delay_seconds`     | number  | Interstitial (VAST)    | Playback time before the skip control appears. Overrides the VAST `skipoffset`. |
| `audio.muted_by_default` | boolean | VAST                   | Whether video playback starts muted. Defaults to unmuted.                       |
| `cta.text`               | string  | Interstitial, Rewarded | Call-to-action button copy. Falls back to the default.                          |
| `orientation`            | string  | Fullscreen             | `portrait`, `landscape`, or `auto`. Unrecognized values fall back to `auto`.    |
| `dec`                    | object  | Fullscreen             | Double-end-card configuration, passed through to the end-card renderer.         |

**Value handling**

* A negative number is ignored and treated as absent (SDK default applies).
* `0` or an absent field means "use the SDK default," never "instant." For example, an absent `close.delay_seconds` applies the default close delay rather than showing an instant close.
* Unknown keys are tolerated and ignored, so new server-side knobs are forward-compatible.

## User-experience behavior

CloudX applies a conservative, non-aggressive default experience, and enforces the close contract regardless of creative content.

### Close control

* The close control is drawn and owned by the SDK, with a fixed top-trailing safe-area position and a tap target of at least 50 pt. Creatives cannot replace, hide, or relocate it.
* `mraid.useCustomClose()` is accepted for compatibility but is an observe-only no-op — the SDK close control always remains.
* On a stall, a watchdog force-reveals the close control so the user is never trapped.

### Interstitial

The close control appears after `close.delay_seconds` (default 5 seconds). For VAST, a countdown precedes skip availability per `skip.delay_seconds`; the SDK close control remains available as a fail-safe.

### Rewarded

* Rewarded placements are non-skippable by default and expose no skip control; the user watches to completion.
* If a watch-to-earn threshold is configured, a close control (not a skip) appears once the threshold is crossed. The reward is retained if the user then exits.
* The reward is granted on completion, or on dismissal after eligibility is met. An escape-hatch exit during a stall does not grant a reward.
* Watch-to-earn eligibility accrues from foreground time only; backgrounding the app does not advance the timer.

<Warning>
  `close.delay_seconds` defaults to 5 seconds but is **not an enforced minimum**. A positive value below 5 seconds is honored as sent. There is no placement-level floor or filter on per-bid timing today.
</Warning>

## Measurement

* Open Measurement (OMID) viewability is supported for both HTML and VAST creatives.
* VAST 4.1 `ViewableImpression` and standard `Impression` events are tracked.
* VAST 4.0+ `AdVerifications` (OMID verification resources) are honored.

## Fallback behavior

When a creative cannot be rendered — an unsupported VAST version, an unparseable payload, or a creative-type mismatch — CloudX fails closed and reports the error, allowing the exchange to serve a fallback creative rather than showing a broken ad.
