

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

# Construcción y creación de plantillas de ofertas
<a name="yield-optimization-bid-construction"></a>

En esta página, se explica cómo crear MediaTailor una solicitud de oferta de OpenRTB a partir de tu plantilla, cómo funciona la interpolación de variables y qué valores se establecen automáticamente. MediaTailor 

## Campos de configuración
<a name="yield-optimization-bid-construction-config-fields"></a>

Al activar la optimización del rendimiento en una configuración de reproducción, se proporcionan cuatro campos:


| Campo | Description (Descripción) | Obligatorio | 
| --- | --- | --- | 
| PublisherId | Su ID de editor de APS (obtenido del registro de APS). Se incluye app.publisher.id en cada solicitud de oferta. | Sí | 
| Region | Región APS:AMERICAS,EUROPE, oASIA\_PACIFIC. Determina el punto final del APS. | Sí | 
| MinimumUnfilledDuration | Es necesario un mínimo de segundos sin rellenar antes de que se MediaTailor active una solicitud de oferta. También se usa comoimp.video.minduration. | Sí | 
| OpenRtbTemplate | Tu plantilla JSON de ORTB (máximo 100 KB). Define el cuerpo de la solicitud de oferta. | Sí | 

## Cómo se construye la solicitud de oferta
<a name="yield-optimization-bid-construction-how"></a>

Cuando a una pausa publicitaria le queda tiempo sin cubrir, elabora MediaTailor la solicitud de oferta siguiendo estos pasos:

1. **Interpolación de plantillas. ** MediaTailor resuelve`{{session.*}}`,, `{{player_params.*}}` `{{avail.*}}` `{{request.*}}``{{asset.*}}`, y los `{{scte.*}}` marcadores de posición de la plantilla mediante la sintaxis estándar de creación de plantillas de [ Mustache. ](https://mustache.github.io/mustache.5.html) Moustache utiliza corchetes dobles`{{ }}`, que difieren de los corchetes que se `[ ]` utilizan en la sustitución de variables URL de ADS.

1. **Análisis de JSON. ** La plantilla interpolada se analiza como JSON.

1. **Extracción y validación de campos. ** MediaTailorextrae los campos obligatorios y arroja un `BidRequestConfigurationError` mensaje si falta alguno o está vacío.

1. **Inyección de campos codificados. ** MediaTailor anula o inyecta los campos que administra automáticamente utilizando los valores de la configuración de la consola y del contexto disponible actual (por ejemplo, a partir del ID de editor que configuró, `app.publisher.id` a partir de la duración sin `imp.video.maxduration` rellenar calculada).

1. **Serialización y envío. ** El final BidRequest se serializa en JSON y se envía como HTTP POST al punto final de APS.

**importante**  
Si falta algún campo obligatorio o está vacío después de la interpolación, la solicitud de oferta falla con un `BidRequestConfigurationError` y no se envía ninguna solicitud a APS. El error se registra, pero la reproducción continúa con normalidad (se abre por error).

## Plantilla predeterminada de la consola
<a name="yield-optimization-bid-construction-default-template"></a>

Al activar la optimización del rendimiento en la MediaTailor consola, se proporciona la siguiente plantilla precumplimentada como punto de partida. Debe personalizar los valores de su aplicación:

```
{
  "imp": [
    {
      "bidfloor": 5
    }
  ],
  "app": {
    "id": "{{player_params.app_id}}",
    "name": "{{player_params.app_name}}",
    "bundle": "{{player_params.bundle}}",
    "storeurl": "{{player_params.storeurl}}",
    "domain": "{{player_params.domain}}",
    "content": {
      "genre": "{{asset.genre}}",
      "contentrating": "{{asset.content_rating}}"
    }
  },
  "device": {
    "dnt": "{{player_params.dnt}}",
    "ua": "{{session.user_agent}}",
    "ip": "{{session.client_ip}}",
    "ifa": "{{player_params.device_ifa}}",
    "w": "{{player_params.device_width}}",
    "h": "{{player_params.device_height}}",
    "language": "{{player_params.language}}",
    "model": "{{player_params.model}}",
    "os": "{{player_params.os}}",
    "osv": "{{player_params.osv}}",
    "devicetype": "{{player_params.devicetype}}",
    "make": "{{player_params.make}}"
  },
  "user": {
    "consent": "{{player_params.consent}}"
  },
  "regs": {
    "gdpr": "{{player_params.gdpr}}",
    "us_privacy": "{{player_params.us_privacy}}",
    "gpp": "{{player_params.gpp_consent}}",
    "gpp_sid": "{{player_params.gpp_sid}}"
  }
}
```

**Field-by-field explicación: **


| Campo | Categoría | Solución | 
| --- | --- | --- | 
| imp[0].bidfloor | Opcional (predeterminado: 1.0) | Establezca su CPM mínimo. El valor predeterminado de la consola es de 5$. Baje para obtener mejores tasas de llenado durante las pruebas. | 
| app.id | Se recomienda APS | El identificador de tu aplicación. El jugador debe enviarplayerParams.app\_id. | 
| app.name | Se recomienda APS | El nombre de tu aplicación. El jugador debe enviarplayerParams.app\_name. | 
| app.bundle | Obligatorio  | Tu ID de paquete de aplicaciones. El jugador debe enviar playerParams.bundle o reemplazar por un valor estático (recomendado). | 
| app.storeurl | Obligatorio  | La URL de tu tienda de aplicaciones. El jugador debe enviar playerParams.storeurl o reemplazar por un valor estático (recomendado). | 
| app.domain | Se recomienda APS | El dominio de tu aplicación. El jugador debe enviarplayerParams.domain. | 
| app.content.genre | Se recomienda APS | Se completa a partir de los metadatos del activo de la fuente de contenido. | 
| app.content.contentrating | Se recomienda APS | Se completa a partir de los metadatos del activo de la fuente de contenido. | 
| device.dnt | Se recomienda APS | Bandera de no rastrear. El jugador debe enviarplayerParams.dnt. | 
| device.ua | Obligatorio  | Se rellena automáticamente desde el User-Agent encabezado del usuario hasta el final{{session.user\_agent}}. No se necesita ningún parámetro de jugador. | 
| device.ip | Obligatorio  | Se rellena automáticamente desde la IP del espectador hasta{{session.client\_ip}}. No se necesita ningún parámetro de jugador. | 
| device.ifa | Se recomienda APS | ID de publicidad. El jugador debe enviarplayerParams.device\_ifa. | 
| device.w / device.h | Se recomienda APS | Dimensiones de la pantalla. El jugador debe enviarplayerParams.device\_width/device\_height. | 
| device.language | Se recomienda APS | Idioma del dispositivo. El jugador debe enviarplayerParams.language. | 
| device.model | Se recomienda APS | Modelo de dispositivo. El jugador debe enviarplayerParams.model. | 
| device.os / device.osv | Se recomienda APS | Sistema operativo y versión. El jugador debe enviarplayerParams.os/osv. | 
| device.devicetype | Anulable (predeterminado: 3) | Tipo de dispositivo IAB. El jugador debe enviarplayerParams.devicetype. El valor predeterminado es 3 (CTV) si está vacío. | 
| device.make | Se recomienda APS | Fabricante del dispositivo. El jugador debe enviarplayerParams.make. | 
| user.consent | Se recomienda APS (UE) | Cadena de consentimiento (TCF) del RGPD. El jugador debe enviarplayerParams.consent. | 
| regs.gdpr | Se recomienda APS (UE) | Indicador de GDPR (0 o 1). El jugador debe enviarplayerParams.gdpr. | 
| regs.us\_privacy | Se recomienda APS (EE. UU.) | Cadena CCPA (por ejemplo,1YNY). El jugador debe enviarplayerParams.us\_privacy. | 
| regs.gpp | Se recomienda APS | Cadena de consentimiento de Global Privacy Platform. El jugador debe enviarplayerParams.gpp\_consent. Preferido en lugar us\_privacy de para obtener mejores tasas de llenado. | 
| regs.gpp\_sid | Se recomienda APS | Identificadores de sección GPP (por ejemplo, [7] para los nacionales de EE. UU.). El jugador debe enviarplayerParams.gpp\_sid. | 

**importante**  
La consola usa `{{player_params.*}}` por defecto campos obligatorios como `app.bundle` y`app.storeurl`. Si tu reproductor no envía estos parámetros, la solicitud de oferta fallará`BidRequestConfigurationError`. En el caso de los campos que son los mismos para todas las sesiones (normalmente `app.bundle``app.storeurl`,`app.name`, y otros identificadores a nivel de aplicación), considera reemplazar el marcador de posición por un valor estático (por ejemplo,). `"bundle": "com.yourcompany.app"` No codifique campos que varíen según el usuario, como las cadenas de consentimiento del RGPD y el GPP `device.ua` `device.ip``device.ifa`, ni ningún campo de registro o objeto de usuario. Estos deben provenir de o. `{{session.*}}` `{{player_params.*}}`

**nota**  
El valor predeterminado de la consola no incluye `video.mimes` ni `video.protocols` en la plantilla. MediaTailor utiliza valores alternativos codificados (`["video/mp4"]`para mimos y protocolos) cuando no se proporcionan. `[1,2,3,4,5,6,7,8]` Puede añadirlos a la plantilla si desea restringir los formatos admitidos.

## Interpolación de plantillas (creación de plantillas en forma de bigote)
<a name="yield-optimization-bid-construction-interpolation"></a>

La plantilla ORTB utiliza la sintaxis de plantillas de [ Mustache para la sustitución dinámica de valores](https://mustache.github.io/mustache.5.html). Los marcadores de posición utilizan corchetes dobles. `{{ }}`

### Variables de plantilla disponibles
<a name="yield-optimization-bid-construction-variables"></a>

La plantilla de ORTB puede usar las mismas variables dinámicas disponibles en las plantillas de URL de ADS. Entre ellas se incluyen las variables de sesión (por ejemplo,`{{session.user_agent}}`,`{{session.client_ip}}`), los parámetros del reproductor (`{{player_params.*}}`), los metadatos de los activos (`{{asset.*}}`), el contexto de avail (`{{avail.*}}`) y los datos de señal SCTE (). `{{scte.*}}`

Para obtener la lista completa de las variables disponibles y sus descripciones, consulte. [MediaTailor variables de anuncios dinámicos para solicitudes de ADS](variables.md) Para saber cómo MediaTailor URL-decodes valoran los parámetros del jugador antes de sustituirlos en la plantilla, consulte [Comportamiento de codificación y decodificación](#yield-optimization-bid-construction-encoding) más adelante en esta página.

Las variables que se utilizan con más frecuencia en las plantillas de ORTB son:
+ `{{session.user_agent}}`: User-Agent Encabezado del visor (se usa para`device.ua`).
+ `{{session.client_ip}}`: Dirección IP del espectador (se usa para`device.ip`).
+ `{{player_params.*}}`: valores personalizados transmitidos por el jugador durante la inicialización de la sesión.
+ `{{asset.*}}`: Metadatos de contenido del origen (por ejemplo`asset.genre`,`asset.content_rating`).

**aviso**  
Escriba siempre los marcadores de posición entre comillas, incluso para campos numéricos como `dnt` o. `devicetype` Si un marcador de posición se convierte en una cadena vacía y no está entre comillas (por ejemplo,`"dnt": {{player_params.dnt}}`), el resultado es un JSON no válido y toda la solicitud de oferta falla con un. `BidRequestConfigurationError` En su lugar, use `"dnt": "{{player_params.dnt}}"`. APS acepta los campos numéricos pasados como cadenas. Este comportamiento está diseñado porque la sustitución automática de cadenas vacías entre comillas entraría en conflicto con el modo RAW-JSON utilizado en otras partes del interpolador. La restricción se documenta en lugar de aplicarse. Consulta también cómo se [Comportamiento de codificación y decodificación](#yield-optimization-bid-construction-encoding) gestionan los valores de MediaTailor los parámetros del reproductor antes de la interpolación.

### ¿Cómo pasar los parámetros del jugador
<a name="yield-optimization-bid-construction-pass-params"></a>

Hay dos maneras de transferir los parámetros del jugador durante la inicialización de la sesión.

**Método 1: solicitud POST con cuerpo JSON (recomendado) **

```
POST https://<mediatailor-endpoint>/v1/session/<config-hash>/<origin-id>/master.m3u8
Content-Type: application/json

{
  "playerParams": {
    "app_id": "558775_example",
    "slot_id": "608109df-2378-4bc5-8da5-24bc355f01a4",
    "os": "Tizen",
    "make": "Samsung",
    "model": "Tizen TV",
    "language": "en",
    "us_privacy": "1YNY"
  }
}
```

Se prefiere este método porque evita URL-encoding problemas con valores complejos, como las cadenas de agentes de usuario.

**Método 2: parámetros de consulta de URL **

```
GET https://<mediatailor-endpoint>/v1/session/<config-hash>/<origin-id>/master.m3u8
  ?playerParams.app_id=558775_example
```

Con este método, los valores deben ser URL-encoded. MediaTailor URL-decodes ellos antes de la interpolación.

### Comportamiento de codificación y decodificación
<a name="yield-optimization-bid-construction-encoding"></a>

MediaTailor realiza ** un nivel de decodificación de URL ** en los valores de los parámetros del reproductor antes de interpolarlos en la plantilla. Esto se aplica independientemente de cómo se transfieran los parámetros (parámetros de consulta URL o del cuerpo del POST).

**Ejemplos de valores decodificados: **


| Valor enviado | Valor después de la decodificación (usado en la plantilla) | 
| --- | --- | 
| Test%20Os | Test Os | 
| https%3A%2F%2Flocalhost | https://localhost | 
| foo%20bar | foo bar | 
| Mozilla%2F5.0%20(SMART-TV) | Mozilla/5.0 (SMART-TV) | 

**Puntos clave: **
+ MediaTailor decodifica en ** un solo ** nivel. Double-encoded los valores (por ejemplo,`%2520`) se decodificarán en`%20`, no en un espacio.
+ **Los valores del cuerpo POST también ** se decodifican. Si el cuerpo del POST contiene URL-encoded valores, se decodificarán antes de la interpolación.
+ **Los valores de texto plano ** (sin codificación) se transmiten sin cambios.
+ Tras la decodificación y la interpolación, toda la plantilla se analiza como JSON. Los caracteres especiales de los valores interpolados (como las comillas sin escapes o las barras invertidas) pueden interrumpir el análisis de JSON.

**sugerencia**  
Si tu reproductor envía valores que ya están en texto plano (no URL-encoded), funcionan tal cual. Solo tienes que saber decodificar los URL-encodes valores de tu reproductor antes de enviarlos.

### ¿Qué ocurre cuando falta una variable
<a name="yield-optimization-bid-construction-missing-variable"></a>

Si el reproductor no envía un parámetro al que se hace referencia en tu plantilla (por ejemplo, `{{player_params.app_name}}` pero no `app_name` en los parámetros del reproductor), el marcador de posición se convierte en una cadena ** vacía. ** `""`

**Impacto: ** si la cadena vacía está en un campo obligatorio (por ejemplo`app.bundle`), la solicitud de oferta no se realiza correctamente. `BidRequestConfigurationError` Si está en un campo opcional, APS recibe un valor vacío que puede provocar una respuesta sin oferta (HTTP 204).

## ¿Qué se MediaTailor establece automáticamente
<a name="yield-optimization-bid-construction-auto-set"></a>

Los siguientes campos siempre se configuran MediaTailor con valores de la configuración de la consola y del contexto disponible actual. Si los incluye en la plantilla, sus valores se anulan:


| Campo | origen | 
| --- | --- | 
| id | Auto-generated: {sessionId}\_{availId} formato (por ejemplo,abc123-def456\_78901). Útil para correlacionar las solicitudes de oferta con los registros de sesión. | 
| app.publisher.id | Eres PublisherId de la configuración de la consola. | 
| imp[0].video.minduration | Eres MinimumUnfilledDuration de la configuración de la consola. | 
| imp[0].video.maxduration | Calculado: segundos reales sin rellenar para este uso. | 
| imp[0].video.maxseq | Calculado:. floor(unfilled\_duration / 6) | 
| imp[0].video.poddur | Calculado: segundos reales sin rellenar para este uso. | 
| ext.integrationType | Siempre configurado en. "EMT" | 

## Siguientes pasos
<a name="yield-optimization-bid-construction-next-steps"></a>
+ Para obtener la referencia completa campo por campo, consulte. [Referencia de campo ORTB](yield-optimization-ortb-reference.md)
+ Para ver las plantillas de copiar y pegar, consulte. [Plantillas de ejemplo](yield-optimization-examples.md)