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 the renderer enforces.
This specification applies only to bids that CloudX renders. See the Demand Partner Overview for how rendering is routed.
Routing
A bid is rendered by CloudX when the bid response carries ext.cloudx.render.provider = "cloudx". The renderer 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); 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.
| Format | HTML (MRAID 3.0) | VAST video |
|---|
| Banner (320×50) | Supported | — |
| MREC (300×250) | Supported | — |
| Interstitial | Supported | Supported |
| Rewarded | Supported | Supported |
Native and App Open are not served by the CloudX renderer.
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.
{
"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 renderer 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
The renderer 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.
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.
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 — the renderer fails closed and reports the error, allowing the exchange to serve a fallback creative rather than showing a broken ad.