Configuring the ADS request
Use AdDecisionServerConfiguration to control how AWS Elemental MediaTailor calls your ad
decision server (ADS). This ensures your ADS receives the context it needs to return
relevant ads. Use it to configure any of the following:
-
A
POSTbody (for example, an OpenRTB bid request). -
Custom request headers (for example,
Accept-Language). -
A compressed payload.
By default, your ADS receives a GET request at the URL specified by
AdDecisionServerUrl. To customize the request beyond that default,
configure the AdDecisionServerConfiguration field on the playback
configuration.
Use AdDecisionServerConfiguration.HttpRequest to configure the ADS
request. The Headers and Body fields support dynamic
variables, which MediaTailor substitutes with session-scoped values at request time.
HttpRequest fields
The following table describes the fields under
AdDecisionServerConfiguration.HttpRequest.
| Field | Type | Description |
|---|---|---|
Method |
String enum | The HTTP method MediaTailor uses when it calls the ADS. Valid values
are GET and POST. Defaults to
GET if omitted. |
Headers |
Map of string to string | Custom HTTP request headers to attach to the outbound ADS call.
Header values support dynamic variable substitution using the
{{variable}} template syntax (see Template variable syntax).
MediaTailor sends these headers on both GET and
POST requests. |
Body |
String | The request body template. Use this field only when
Method is POST. Supports dynamic variable
substitution using the {{variable}} template syntax.
If a Content-Type header is set in Headers
and includes application/json, MediaTailor JSON-escapes
substituted values automatically. Otherwise, MediaTailor substitutes
values as plain text. |
CompressionMethod |
String enum | The compression to apply to the request body. Valid values are
NONE and GZIP. Defaults to
NONE. When set to GZIP, MediaTailor compresses
the interpolated body and sets the
Content-Encoding: gzip header on the request. Only
applies to POST requests. |
Template variable syntax
Headers and Body both support dynamic variable
substitution using the {{variable}} template syntax. This is different
from the [variable] syntax used by AdDecisionServerUrl.
The following table summarizes the two conventions.
| Where you reference variables | Syntax |
|---|---|
AdDecisionServerUrl |
[variable] – for example,
[session.user_agent] |
AdDecisionServerConfiguration.HttpRequest.Headers |
{{variable}} – for example,
{{session.user_agent}} |
AdDecisionServerConfiguration.HttpRequest.Body |
{{variable}} – for example,
{{session.uuid}} |
All dynamic variables that MediaTailor supports work in both locations. These include session variables, SCTE-35 variables, player parameters, and configuration aliases. Only the delimiter differs. For the complete list of supported variables, see MediaTailor session variables for ADS requests and MediaTailor player variables for ADS requests.
Forwarding Accept-Language as a request header
To serve language-specific ads, forward the viewer's language preference to your
ADS. The following playback configuration passes the Accept-Language
header (captured at session initialization) as an HTTP request header on every ADS
call:
{ "Name": "customerConfig", "VideoContentSourceUrl": "https://origin.example.com/", "AdDecisionServerUrl": "https://ads.example.com/vast", "AdDecisionServerConfiguration": { "HttpRequest": { "Method": "GET", "Headers": { "Accept-Language": "{{session.accept_language}}" } } } }
MediaTailor auto-populates session.accept_language from the
Accept-Language HTTP header that the player sends on the manifest
request. Header lookup is case-insensitive. If the player does not send an
Accept-Language header, session.accept_language is empty
and the outbound header value is empty.
CDN and proxy requirements
If you use a CDN or proxy in front of the manifest endpoint, configure it to
forward the Accept-Language header. This ensures the player's
language preference reaches MediaTailor.
The CloudFront managed policy
Managed-Elemental-MediaTailor-PersonalizedManifests does not
forward this header. Use a policy that does (such as AllViewer) or
add the header to a custom origin request policy allowlist.
Sending a POST request with a JSON body
The following playback configuration sends a POST request with a JSON
body and a matching Content-Type header:
{ "Name": "customerConfig", "VideoContentSourceUrl": "https://origin.example.com/", "AdDecisionServerUrl": "https://ads.example.com/ortb", "AdDecisionServerConfiguration": { "HttpRequest": { "Method": "POST", "Headers": { "Content-Type": "application/json", "Accept-Language": "{{session.accept_language}}" }, "Body": "{\"id\": \"{{session.uuid}}\", \"user\": {\"ua\": \"{{session.user_agent}}\", \"ip\": \"{{session.client_ip}}\"}}", "CompressionMethod": "GZIP" } } }
Because Content-Type contains application/json, MediaTailor
JSON-escapes substituted values so special characters (quotes, backslashes) in
variable values do not break the JSON document. MediaTailor then gzip-compresses the
interpolated body and sets Content-Encoding: gzip on the outbound
request.
HttpRequest limitations
The following limitations apply to
AdDecisionServerConfiguration.HttpRequest:
-
MediaTailor applies
CompressionMethodonly whenMethodisPOST. -
Variable substitution in
HeadersandBodyuses{{variable}}syntax. Substitution inAdDecisionServerUrluses[variable]syntax. The two are not interchangeable. -
Variables that are unresolved at request time render as an empty string in both headers and body.