API HTTPplayback-svc

POST /sessions/{sessionId}/metrics

Reportar métricas de reproducción de una entrega propia (OB2)

ImplementadoSin versión del tren todavía· generada desde apps/docs/generated/openapi/playback-svc.json

Página generada desde apps/playback-svc/src/app.aot.ts. No se edita a mano: bun run docs:gen la regenera y bun run docs:check falla 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.

CampoValor
Servicioplayback-svc
operationIdplayback.reportMetrics
Policy (dec-0118 §3)resource:playback-session:report
Tagsplayback

Parámetros

NombreEnRequeridoEsquema
sessionIdpathsí{"type":"string","pattern":"^(pkg|sess)_[0-9a-f]{32}$"}

Cuerpo

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)."
}

Respuestas

200

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."
}

401

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"
}

403

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"
}

404

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"
}

422

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"
}

429

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"
}