Reportar métricas de reproducción de una entrega propia (OB2)
apps/docs/generated/openapi/playback-svc.jsonPágina generada desde
apps/playback-svc/src/app.aot.ts. No se edita a mano:bun run docs:genla regenera ybun run docs:checkfalla si difiere.
POST /sessions/{sessionId}/metrics
Lote acotado (a lo sumo 32 eventos) de TTFF, seek, stalls, cambios de rendition y errores medidos por el reproductor del navegador. Sólo el dueño de la entrega; una ajena o inexistente responde 404. Cada entrega tiene un presupuesto de eventos: lo que lo excede se descarta (dropped), no se rechaza. El motor y el modo los pone el servidor.
Acceso: Bearer de identity con policy resource:playback-session:report.
| Campo | Valor |
|---|---|
| Servicio | playback-svc |
| operationId | playback.reportMetrics |
Policy (dec-0118 §3) | resource:playback-session:report |
| Tags | playback |
| Nombre | En | Requerido | Esquema |
|---|---|---|---|
sessionId | path | sí | {"type":"string","pattern":"^(pkg|sess)_[0-9a-f]{32}$"} |
Requerido: sí.
application/json{
"type": "object",
"required": [
"player",
"events"
],
"properties": {
"player": {
"type": "string",
"enum": [
"vidstack",
"limeplay"
]
},
"events": {
"type": "array",
"items": {
"anyOf": [
{
"type": "object",
"required": [
"t",
"ms"
],
"properties": {
"t": {
"type": "string",
"const": "ttff"
},
"ms": {
"type": "integer",
"minimum": 0,
"maximum": 600000,
"description": "Duración en milisegundos."
},
"origin": {
"type": "string",
"enum": [
"cta",
"gesture"
]
},
"prewarmed": {
"type": "boolean",
"description": "Trabajo previo a la intención."
},
"phases": {
"type": "object",
"required": [
"session",
"manifest",
"segment",
"frame"
],
"properties": {
"session": {
"type": "integer",
"minimum": 0,
"maximum": 600000,
"description": "Duración en milisegundos."
},
"manifest": {
"type": "integer",
"minimum": 0,
"maximum": 600000,
"description": "Duración en milisegundos."
},
"segment": {
"type": "integer",
"minimum": 0,
"maximum": 600000,
"description": "Duración en milisegundos."
},
"frame": {
"type": "integer",
"minimum": 0,
"maximum": 600000,
"description": "Duración en milisegundos."
}
},
"additionalProperties": false,
"description": "Fases del arranque en ms desde la intención."
}
},
"additionalProperties": false,
"description": "Intención de reproducir (dec-0135 D1) → primer frame presentado. No cuenta lo que tarda la persona en pulsar play."
},
{
"type": "object",
"required": [
"t",
"reason"
],
"properties": {
"t": {
"type": "string",
"const": "startup_abandoned"
},
"reason": {
"type": "string",
"enum": [
"paused",
"hidden",
"autoplay_blocked",
"error",
"closed"
]
}
},
"additionalProperties": false,
"description": "La intención de reproducir no llegó a un primer frame."
},
{
"type": "object",
"required": [
"t",
"ms",
"far"
],
"properties": {
"t": {
"type": "string",
"const": "seek"
},
"ms": {
"type": "integer",
"minimum": 0,
"maximum": 600000,
"description": "Duración en milisegundos."
},
"far": {
"type": "boolean",
"description": "El salto fue de más de 30 min."
}
},
"additionalProperties": false,
"description": "`seeking` → primer frame en la nueva posición."
},
{
"type": "object",
"required": [
"t",
"ms"
],
"properties": {
"t": {
"type": "string",
"const": "stall"
},
"ms": {
"type": "integer",
"minimum": 0,
"maximum": 600000,
"description": "Duración en milisegundos."
}
},
"additionalProperties": false,
"description": "Un `waiting` con reproducción en curso."
},
{
"type": "object",
"required": [
"t",
"dir"
],
"properties": {
"t": {
"type": "string",
"const": "switch"
},
"dir": {
"type": "string",
"enum": [
"up",
"down"
]
}
},
"additionalProperties": false,
"description": "Cambio de rendition."
},
{
"type": "object",
"required": [
"t",
"code",
"fatal"
],
"properties": {
"t": {
"type": "string",
"const": "error"
},
"code": {
"type": "string",
"enum": [
"network",
"media",
"decode",
"source",
"other"
]
},
"fatal": {
"type": "boolean"
}
},
"additionalProperties": false,
"description": "Error del reproductor."
}
],
"description": "Evento de métrica de reproducción."
},
"minItems": 1,
"maxItems": 32
}
},
"additionalProperties": false,
"description": "Lote de métricas de reproducción de una sesión propia (a lo sumo 32 eventos)."
}Cuántos eventos se registraron y cuántos se descartaron por presupuesto.
application/json
{
"type": "object",
"required": [
"accepted",
"dropped"
],
"properties": {
"accepted": {
"type": "integer",
"minimum": 0,
"description": "Eventos registrados."
},
"dropped": {
"type": "integer",
"minimum": 0,
"description": "Eventos descartados por el presupuesto de la sesión."
}
},
"description": "Cuántos eventos se registraron y cuántos se descartaron por presupuesto."
}Problem Details (RFC 9457), status 401. Códigos: unauthenticated, reauth-required.
application/problem+json
{
"type": "object",
"required": [
"type",
"title",
"status",
"code"
],
"properties": {
"type": {
"type": "string"
},
"title": {
"type": "string"
},
"status": {
"type": "number",
"const": 401
},
"code": {
"type": "string",
"enum": [
"unauthenticated",
"reauth-required"
]
},
"detail": {
"type": "string"
}
},
"x-styx-media-type": "application/problem+json"
}Problem Details (RFC 9457), status 403. Códigos: forbidden.
application/problem+json
{
"type": "object",
"required": [
"type",
"title",
"status",
"code"
],
"properties": {
"type": {
"type": "string"
},
"title": {
"type": "string"
},
"status": {
"type": "number",
"const": 403
},
"code": {
"type": "string",
"const": "forbidden"
},
"detail": {
"type": "string"
}
},
"x-styx-media-type": "application/problem+json"
}Problem Details (RFC 9457), status 404. Códigos: PLAYBACK_SESSION_NOT_FOUND.
application/problem+json
{
"type": "object",
"required": [
"type",
"title",
"status",
"code",
"retryable",
"category"
],
"properties": {
"type": {
"type": "string"
},
"title": {
"type": "string"
},
"status": {
"type": "number",
"const": 404
},
"code": {
"type": "string",
"const": "PLAYBACK_SESSION_NOT_FOUND"
},
"detail": {
"type": "string"
},
"instance": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"category": {
"type": "string",
"enum": [
"transient",
"permanent",
"recoverable"
]
}
},
"x-styx-media-type": "application/problem+json"
}Problem Details (RFC 9457), status 422. Códigos: validation.
application/problem+json
{
"type": "object",
"required": [
"type",
"title",
"status",
"code"
],
"properties": {
"type": {
"type": "string"
},
"title": {
"type": "string"
},
"status": {
"type": "number",
"const": 422
},
"code": {
"type": "string",
"const": "validation"
},
"on": {
"type": "string"
},
"property": {
"type": "string"
},
"detail": {
"type": "string"
}
},
"x-styx-media-type": "application/problem+json"
}Problem Details (RFC 9457), status 429. Códigos: rate-limited.
application/problem+json
{
"type": "object",
"required": [
"type",
"title",
"status",
"code"
],
"properties": {
"type": {
"type": "string"
},
"title": {
"type": "string"
},
"status": {
"type": "number",
"const": 429
},
"code": {
"type": "string",
"const": "rate-limited"
},
"detail": {
"type": "string"
}
},
"x-styx-media-type": "application/problem+json"
}