{"openapi":"3.1.0","info":{"title":"Freecom API","description":"V\u00eddeo, canales y tareas as\u00edncronas. Sesi\u00f3n HttpOnly y X-CSRF-Token; obt\u00e9n el token en GET \/api\/v1\/auth\/csrf.","version":"1.0.0"},"servers":[{"url":"\/","description":""}],"paths":{"\/api\/v1\/channels\/{slug}":{"get":{"operationId":"channel","tags":["Canales"],"responses":{"200":{"description":"Operaci\u00f3n completada.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Channel"}}}},"400":{"description":"JSON inv\u00e1lido","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"401":{"description":"Sesi\u00f3n o firma inv\u00e1lida","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"403":{"description":"CSRF o rol insuficiente","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"404":{"description":"Recurso no visible o inexistente","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"409":{"description":"Conflicto de estado, cuota o unicidad","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"413":{"description":"M\u00e1s de 16 KiB","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"415":{"description":"Content-Type incorrecto","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"422":{"description":"Validaci\u00f3n de campos","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"429":{"description":"L\u00edmite temporal: Retry-After","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"500":{"description":"Error interno","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"503":{"description":"Dependencia no disponible","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}}},"summary":"Consultar canal","description":"Consulta p\u00fablica; recursos privados limitados al propietario o administrador. ","parameters":[{"name":"slug","in":"path","description":"Endpoint identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}],"security":[]}},"\/api\/v1\/channels\/{slug}\/videos":{"get":{"operationId":"channel_videos","tags":["Canales"],"responses":{"200":{"description":"Operaci\u00f3n completada.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/VideoPage"}}}},"400":{"description":"JSON inv\u00e1lido","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"401":{"description":"Sesi\u00f3n o firma inv\u00e1lida","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"403":{"description":"CSRF o rol insuficiente","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"404":{"description":"Recurso no visible o inexistente","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"409":{"description":"Conflicto de estado, cuota o unicidad","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"413":{"description":"M\u00e1s de 16 KiB","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"415":{"description":"Content-Type incorrecto","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"422":{"description":"Validaci\u00f3n de campos","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"429":{"description":"L\u00edmite temporal: Retry-After","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"500":{"description":"Error interno","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"503":{"description":"Dependencia no disponible","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}}},"summary":"Listar v\u00eddeos p\u00fablicos del canal","description":"Consulta p\u00fablica; recursos privados limitados al propietario o administrador. ","parameters":[{"name":"slug","in":"path","description":"Endpoint identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false},{"name":"page","in":"query","description":"Paginaci\u00f3n limitada.","required":false,"deprecated":false,"schema":{"type":"integer","minimum":1,"maximum":10000,"default":1},"style":"form","explode":true},{"name":"limit","in":"query","description":"Paginaci\u00f3n limitada.","required":false,"deprecated":false,"schema":{"type":"integer","minimum":1,"maximum":50,"default":24},"style":"form","explode":true}],"security":[]}},"\/api\/v1\/me\/channel":{"patch":{"operationId":"channel_edit","tags":["Canales"],"responses":{"200":{"description":"Operaci\u00f3n completada.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Channel"}}}},"400":{"description":"JSON inv\u00e1lido","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"401":{"description":"Sesi\u00f3n o firma inv\u00e1lida","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"403":{"description":"CSRF o rol insuficiente","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"404":{"description":"Recurso no visible o inexistente","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"409":{"description":"Conflicto de estado, cuota o unicidad","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"413":{"description":"M\u00e1s de 16 KiB","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"415":{"description":"Content-Type incorrecto","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"422":{"description":"Validaci\u00f3n de campos","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"429":{"description":"L\u00edmite temporal: Retry-After","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"500":{"description":"Error interno","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"503":{"description":"Dependencia no disponible","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}}},"summary":"Editar mi canal","description":"Requiere sesi\u00f3n. Requiere X-CSRF-Token obtenido con GET \/api\/v1\/auth\/csrf, usando la misma cookie. ","parameters":[],"requestBody":{"description":"Objeto JSON validado. Campos adicionales rechazados.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ChannelInput"}}},"required":true},"security":[{"session":[],"csrf":[]}]}},"\/api\/v1\/comments\/{id}":{"delete":{"operationId":"comment_delete","tags":["Comentarios"],"responses":{"204":{"description":"Operaci\u00f3n completada sin cuerpo."},"400":{"description":"JSON inv\u00e1lido","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"401":{"description":"Sesi\u00f3n o firma inv\u00e1lida","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"403":{"description":"CSRF o rol insuficiente","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"404":{"description":"Recurso no visible o inexistente","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"409":{"description":"Conflicto de estado, cuota o unicidad","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"413":{"description":"M\u00e1s de 16 KiB","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"415":{"description":"Content-Type incorrecto","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"422":{"description":"Validaci\u00f3n de campos","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"429":{"description":"L\u00edmite temporal: Retry-After","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"500":{"description":"Error interno","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"503":{"description":"Dependencia no disponible","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}}},"summary":"Eliminar comentario propio o como administrador","description":"Requiere sesi\u00f3n. Requiere X-CSRF-Token obtenido con GET \/api\/v1\/auth\/csrf, usando la misma cookie. ","parameters":[{"name":"id","in":"path","description":"Endpoint identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}],"security":[{"session":[],"csrf":[]}]}},"\/api\/v1\/videos\/{id}\/comments":{"get":{"operationId":"comments","tags":["Comentarios"],"responses":{"200":{"description":"Operaci\u00f3n completada.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/CommentPage"}}}},"400":{"description":"JSON inv\u00e1lido","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"401":{"description":"Sesi\u00f3n o firma inv\u00e1lida","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"403":{"description":"CSRF o rol insuficiente","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"404":{"description":"Recurso no visible o inexistente","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"409":{"description":"Conflicto de estado, cuota o unicidad","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"413":{"description":"M\u00e1s de 16 KiB","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"415":{"description":"Content-Type incorrecto","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"422":{"description":"Validaci\u00f3n de campos","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"429":{"description":"L\u00edmite temporal: Retry-After","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"500":{"description":"Error interno","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"503":{"description":"Dependencia no disponible","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}}},"summary":"Listar comentarios visibles","description":"Consulta p\u00fablica; recursos privados limitados al propietario o administrador. ","parameters":[{"name":"id","in":"path","description":"Endpoint identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false},{"name":"page","in":"query","description":"Paginaci\u00f3n limitada.","required":false,"deprecated":false,"schema":{"type":"integer","minimum":1,"maximum":10000,"default":1},"style":"form","explode":true},{"name":"limit","in":"query","description":"Paginaci\u00f3n limitada.","required":false,"deprecated":false,"schema":{"type":"integer","minimum":1,"maximum":50,"default":24},"style":"form","explode":true}],"security":[]},"post":{"operationId":"comment","tags":["Comentarios"],"responses":{"201":{"description":"Operaci\u00f3n completada.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Comment"}}}},"400":{"description":"JSON inv\u00e1lido","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"401":{"description":"Sesi\u00f3n o firma inv\u00e1lida","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"403":{"description":"CSRF o rol insuficiente","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"404":{"description":"Recurso no visible o inexistente","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"409":{"description":"Conflicto de estado, cuota o unicidad","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"413":{"description":"M\u00e1s de 16 KiB","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"415":{"description":"Content-Type incorrecto","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"422":{"description":"Validaci\u00f3n de campos","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"429":{"description":"L\u00edmite temporal: Retry-After","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"500":{"description":"Error interno","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"503":{"description":"Dependencia no disponible","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}}},"summary":"Publicar comentario","description":"Requiere sesi\u00f3n. Requiere X-CSRF-Token obtenido con GET \/api\/v1\/auth\/csrf, usando la misma cookie. ","parameters":[{"name":"id","in":"path","description":"Endpoint identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}],"requestBody":{"description":"Objeto JSON validado. Campos adicionales rechazados.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/CommentInput"}}},"required":true},"security":[{"session":[],"csrf":[]}]}},"\/api\/v1\/auth\/csrf":{"get":{"operationId":"csrf","tags":["Identidad"],"responses":{"200":{"description":"Operaci\u00f3n completada.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Csrf"}}}},"400":{"description":"JSON inv\u00e1lido","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"401":{"description":"Sesi\u00f3n o firma inv\u00e1lida","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"403":{"description":"CSRF o rol insuficiente","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"404":{"description":"Recurso no visible o inexistente","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"409":{"description":"Conflicto de estado, cuota o unicidad","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"413":{"description":"M\u00e1s de 16 KiB","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"415":{"description":"Content-Type incorrecto","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"422":{"description":"Validaci\u00f3n de campos","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"429":{"description":"L\u00edmite temporal: Retry-After","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"500":{"description":"Error interno","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"503":{"description":"Dependencia no disponible","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}}},"summary":"Obtener token CSRF","description":"Consulta p\u00fablica; recursos privados limitados al propietario o administrador. ","parameters":[],"security":[]}},"\/api\/v1\/auth\/login":{"post":{"operationId":"login","tags":["Identidad"],"responses":{"200":{"description":"Operaci\u00f3n completada.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Identity"}}}},"400":{"description":"JSON inv\u00e1lido","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"401":{"description":"Sesi\u00f3n o firma inv\u00e1lida","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"403":{"description":"CSRF o rol insuficiente","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"404":{"description":"Recurso no visible o inexistente","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"409":{"description":"Conflicto de estado, cuota o unicidad","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"413":{"description":"M\u00e1s de 16 KiB","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"415":{"description":"Content-Type incorrecto","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"422":{"description":"Validaci\u00f3n de campos","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"429":{"description":"L\u00edmite temporal: Retry-After","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"500":{"description":"Error interno","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"503":{"description":"Dependencia no disponible","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}}},"summary":"Iniciar sesi\u00f3n","description":"Consulta p\u00fablica; recursos privados limitados al propietario o administrador. Requiere X-CSRF-Token obtenido con GET \/api\/v1\/auth\/csrf, usando la misma cookie. ","parameters":[],"requestBody":{"description":"Objeto JSON validado. Campos adicionales rechazados.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/LoginInput"}}},"required":true},"security":[{"csrf":[]}]}},"\/api\/v1\/auth\/logout":{"post":{"operationId":"logout","tags":["Identidad"],"responses":{"204":{"description":"Operaci\u00f3n completada sin cuerpo."},"400":{"description":"JSON inv\u00e1lido","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"401":{"description":"Sesi\u00f3n o firma inv\u00e1lida","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"403":{"description":"CSRF o rol insuficiente","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"404":{"description":"Recurso no visible o inexistente","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"409":{"description":"Conflicto de estado, cuota o unicidad","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"413":{"description":"M\u00e1s de 16 KiB","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"415":{"description":"Content-Type incorrecto","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"422":{"description":"Validaci\u00f3n de campos","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"429":{"description":"L\u00edmite temporal: Retry-After","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"500":{"description":"Error interno","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"503":{"description":"Dependencia no disponible","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}}},"summary":"Cerrar sesi\u00f3n","description":"Requiere sesi\u00f3n. Requiere X-CSRF-Token obtenido con GET \/api\/v1\/auth\/csrf, usando la misma cookie. ","parameters":[],"requestBody":{"description":"The new Endpoint resource","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Endpoint"}}},"required":true},"security":[{"session":[],"csrf":[]}]}},"\/api\/v1\/auth\/register":{"post":{"operationId":"register","tags":["Identidad"],"responses":{"201":{"description":"Operaci\u00f3n completada.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Identity"}}}},"400":{"description":"JSON inv\u00e1lido","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"401":{"description":"Sesi\u00f3n o firma inv\u00e1lida","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"403":{"description":"CSRF o rol insuficiente","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"404":{"description":"Recurso no visible o inexistente","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"409":{"description":"Conflicto de estado, cuota o unicidad","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"413":{"description":"M\u00e1s de 16 KiB","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"415":{"description":"Content-Type incorrecto","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"422":{"description":"Validaci\u00f3n de campos","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"429":{"description":"L\u00edmite temporal: Retry-After","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"500":{"description":"Error interno","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"503":{"description":"Dependencia no disponible","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}}},"summary":"Crear usuario y canal","description":"Consulta p\u00fablica; recursos privados limitados al propietario o administrador. Requiere X-CSRF-Token obtenido con GET \/api\/v1\/auth\/csrf, usando la misma cookie. ","parameters":[],"requestBody":{"description":"Objeto JSON validado. Campos adicionales rechazados.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/RegisterInput"}}},"required":true},"security":[{"csrf":[]}]}},"\/api\/v1\/me":{"get":{"operationId":"me","tags":["Identidad"],"responses":{"200":{"description":"Operaci\u00f3n completada.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Identity"}}}},"400":{"description":"JSON inv\u00e1lido","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"401":{"description":"Sesi\u00f3n o firma inv\u00e1lida","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"403":{"description":"CSRF o rol insuficiente","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"404":{"description":"Recurso no visible o inexistente","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"409":{"description":"Conflicto de estado, cuota o unicidad","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"413":{"description":"M\u00e1s de 16 KiB","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"415":{"description":"Content-Type incorrecto","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"422":{"description":"Validaci\u00f3n de campos","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"429":{"description":"L\u00edmite temporal: Retry-After","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"500":{"description":"Error interno","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"503":{"description":"Dependencia no disponible","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}}},"summary":"Consultar mi cuenta","description":"Requiere sesi\u00f3n. ","parameters":[],"security":[{"session":[]}]}},"\/api\/v1\/videos\/{id}\/like":{"put":{"operationId":"like","tags":["Likes"],"responses":{"200":{"description":"Operaci\u00f3n completada.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Like"}}}},"400":{"description":"JSON inv\u00e1lido","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"401":{"description":"Sesi\u00f3n o firma inv\u00e1lida","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"403":{"description":"CSRF o rol insuficiente","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"404":{"description":"Recurso no visible o inexistente","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"409":{"description":"Conflicto de estado, cuota o unicidad","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"413":{"description":"M\u00e1s de 16 KiB","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"415":{"description":"Content-Type incorrecto","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"422":{"description":"Validaci\u00f3n de campos","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"429":{"description":"L\u00edmite temporal: Retry-After","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"500":{"description":"Error interno","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"503":{"description":"Dependencia no disponible","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}}},"summary":"Dar me gusta idempotente","description":"Requiere sesi\u00f3n. Requiere X-CSRF-Token obtenido con GET \/api\/v1\/auth\/csrf, usando la misma cookie. Idempotente incluso con solicitudes concurrentes: restricci\u00f3n \u00fanica usuario\/v\u00eddeo.","parameters":[{"name":"id","in":"path","description":"Endpoint identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}],"requestBody":{"description":"The updated Endpoint resource","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Endpoint"}}},"required":true},"security":[{"session":[],"csrf":[]}]},"delete":{"operationId":"unlike","tags":["Likes"],"responses":{"200":{"description":"Operaci\u00f3n completada.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Like"}}}},"400":{"description":"JSON inv\u00e1lido","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"401":{"description":"Sesi\u00f3n o firma inv\u00e1lida","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"403":{"description":"CSRF o rol insuficiente","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"404":{"description":"Recurso no visible o inexistente","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"409":{"description":"Conflicto de estado, cuota o unicidad","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"413":{"description":"M\u00e1s de 16 KiB","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"415":{"description":"Content-Type incorrecto","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"422":{"description":"Validaci\u00f3n de campos","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"429":{"description":"L\u00edmite temporal: Retry-After","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"500":{"description":"Error interno","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"503":{"description":"Dependencia no disponible","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}}},"summary":"Quitar me gusta idempotente","description":"Requiere sesi\u00f3n. Requiere X-CSRF-Token obtenido con GET \/api\/v1\/auth\/csrf, usando la misma cookie. Idempotente incluso con solicitudes concurrentes: restricci\u00f3n \u00fanica usuario\/v\u00eddeo.","parameters":[{"name":"id","in":"path","description":"Endpoint identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}],"security":[{"session":[],"csrf":[]}]}},"\/api\/v1\/admin\/videos\/{id}\/hide":{"post":{"operationId":"hide","tags":["Moderaci\u00f3n"],"responses":{"200":{"description":"Operaci\u00f3n completada.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Video"}}}},"400":{"description":"JSON inv\u00e1lido","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"401":{"description":"Sesi\u00f3n o firma inv\u00e1lida","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"403":{"description":"CSRF o rol insuficiente","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"404":{"description":"Recurso no visible o inexistente","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"409":{"description":"Conflicto de estado, cuota o unicidad","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"413":{"description":"M\u00e1s de 16 KiB","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"415":{"description":"Content-Type incorrecto","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"422":{"description":"Validaci\u00f3n de campos","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"429":{"description":"L\u00edmite temporal: Retry-After","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"500":{"description":"Error interno","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"503":{"description":"Dependencia no disponible","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}}},"summary":"Ocultar v\u00eddeo como administrador","description":"Requiere ROLE_ADMIN y CSRF. Impide nuevas autorizaciones p\u00fablicas de reproducci\u00f3n.","parameters":[{"name":"id","in":"path","description":"Endpoint identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}],"requestBody":{"description":"The new Endpoint resource","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Endpoint"}}},"required":true},"security":[{"session":[],"csrf":[]}]}},"\/api\/v1\/webhooks\/bunny\/stream":{"post":{"operationId":"webhook","tags":["Proveedor"],"responses":{"202":{"description":"Solicitud aceptada de forma durable; procesamiento pendiente.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/EventAccepted"}}}},"400":{"description":"JSON inv\u00e1lido","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"401":{"description":"Sesi\u00f3n o firma inv\u00e1lida","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"403":{"description":"CSRF o rol insuficiente","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"404":{"description":"Recurso no visible o inexistente","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"409":{"description":"Conflicto de estado, cuota o unicidad","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"413":{"description":"M\u00e1s de 16 KiB","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"415":{"description":"Content-Type incorrecto","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"422":{"description":"Validaci\u00f3n de campos","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"429":{"description":"L\u00edmite temporal: Retry-After","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"500":{"description":"Error interno","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"503":{"description":"Dependencia no disponible","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}}},"summary":"Aceptar notificaci\u00f3n firmada de Bunny","description":"Firma HMAC-SHA256 v1 del cuerpo original con Read-Only API key de la biblioteca. Registro durable + outbox; 202 confirma recepci\u00f3n del evento, no tarea completada. Payload es se\u00f1al: un worker confirma por API. Duplicados y desorden tolerados; no lleva sesi\u00f3n ni CSRF.","parameters":[{"name":"X-BunnyStream-Signature-Version","in":"header","description":"Firma Bunny Stream.","required":true,"deprecated":false,"schema":{"type":"string","example":"v1"},"style":"simple","explode":false},{"name":"X-BunnyStream-Signature-Algorithm","in":"header","description":"Firma Bunny Stream.","required":true,"deprecated":false,"schema":{"type":"string","example":"hmac-sha256"},"style":"simple","explode":false},{"name":"X-BunnyStream-Signature","in":"header","description":"Firma Bunny Stream.","required":true,"deprecated":false,"schema":{"type":"string","example":"64 caracteres hex"},"style":"simple","explode":false}],"requestBody":{"description":"Objeto JSON validado. Campos adicionales rechazados.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Webhook"}}},"required":true},"security":[]}},"\/api\/v1\/me\/tasks":{"get":{"operationId":"tasks","tags":["Tareas"],"responses":{"200":{"description":"Operaci\u00f3n completada.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/TaskPage"}}}},"400":{"description":"JSON inv\u00e1lido","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"401":{"description":"Sesi\u00f3n o firma inv\u00e1lida","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"403":{"description":"CSRF o rol insuficiente","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"404":{"description":"Recurso no visible o inexistente","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"409":{"description":"Conflicto de estado, cuota o unicidad","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"413":{"description":"M\u00e1s de 16 KiB","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"415":{"description":"Content-Type incorrecto","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"422":{"description":"Validaci\u00f3n de campos","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"429":{"description":"L\u00edmite temporal: Retry-After","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"500":{"description":"Error interno","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"503":{"description":"Dependencia no disponible","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}}},"summary":"Listar mis tareas","description":"Requiere sesi\u00f3n. ","parameters":[{"name":"page","in":"query","description":"Paginaci\u00f3n limitada.","required":false,"deprecated":false,"schema":{"type":"integer","minimum":1,"maximum":10000,"default":1},"style":"form","explode":true},{"name":"limit","in":"query","description":"Paginaci\u00f3n limitada.","required":false,"deprecated":false,"schema":{"type":"integer","minimum":1,"maximum":50,"default":24},"style":"form","explode":true}],"security":[{"session":[]}]}},"\/api\/v1\/tasks\/{id}":{"get":{"operationId":"task","tags":["Tareas"],"responses":{"200":{"description":"Operaci\u00f3n completada.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Task"}}}},"400":{"description":"JSON inv\u00e1lido","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"401":{"description":"Sesi\u00f3n o firma inv\u00e1lida","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"403":{"description":"CSRF o rol insuficiente","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"404":{"description":"Recurso no visible o inexistente","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"409":{"description":"Conflicto de estado, cuota o unicidad","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"413":{"description":"M\u00e1s de 16 KiB","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"415":{"description":"Content-Type incorrecto","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"422":{"description":"Validaci\u00f3n de campos","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"429":{"description":"L\u00edmite temporal: Retry-After","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"500":{"description":"Error interno","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"503":{"description":"Dependencia no disponible","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}}},"summary":"Consultar tarea propia o como administrador","description":"Requiere sesi\u00f3n. Transiciones: queued \u2192 running \u2192 waiting_upload \u2192 waiting_provider \u2192 succeeded; fallos\/cancelaci\u00f3n son terminales. progress nullable procede de Bunny, nunca estimado. Polling con backoff hasta terminal.","parameters":[{"name":"id","in":"path","description":"Endpoint identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}],"security":[{"session":[]}]}},"\/api\/v1\/tasks\/{id}\/retry":{"post":{"operationId":"retry","tags":["Tareas"],"responses":{"202":{"description":"Solicitud aceptada de forma durable; procesamiento pendiente.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Accepted"}}},"headers":{"Location":{"description":"URL de consulta de tarea","schema":{"type":"string"}}}},"400":{"description":"JSON inv\u00e1lido","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"401":{"description":"Sesi\u00f3n o firma inv\u00e1lida","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"403":{"description":"CSRF o rol insuficiente","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"404":{"description":"Recurso no visible o inexistente","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"409":{"description":"Conflicto de estado, cuota o unicidad","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"413":{"description":"M\u00e1s de 16 KiB","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"415":{"description":"Content-Type incorrecto","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"422":{"description":"Validaci\u00f3n de campos","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"429":{"description":"L\u00edmite temporal: Retry-After","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"500":{"description":"Error interno","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"503":{"description":"Dependencia no disponible","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}}},"summary":"Reanudar tarea recuperable","description":"Requiere sesi\u00f3n. Requiere X-CSRF-Token obtenido con GET \/api\/v1\/auth\/csrf, usando la misma cookie. Solo propietario\/administrador y estado failed con provider_transient o create_uncertain. Reanuda el paso guardado; create_sent solo busca el recurso por correlaci\u00f3n, nunca repite la creaci\u00f3n. Cuotas, encoding_failed y expiraciones requieren nueva intenci\u00f3n.","parameters":[{"name":"id","in":"path","description":"Endpoint identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}],"requestBody":{"description":"The new Endpoint resource","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Endpoint"}}},"required":true},"security":[{"session":[],"csrf":[]}]}},"\/api\/v1\/me\/videos":{"get":{"operationId":"my_videos","tags":["V\u00eddeos"],"responses":{"200":{"description":"Operaci\u00f3n completada.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/VideoPage"}}}},"400":{"description":"JSON inv\u00e1lido","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"401":{"description":"Sesi\u00f3n o firma inv\u00e1lida","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"403":{"description":"CSRF o rol insuficiente","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"404":{"description":"Recurso no visible o inexistente","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"409":{"description":"Conflicto de estado, cuota o unicidad","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"413":{"description":"M\u00e1s de 16 KiB","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"415":{"description":"Content-Type incorrecto","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"422":{"description":"Validaci\u00f3n de campos","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"429":{"description":"L\u00edmite temporal: Retry-After","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"500":{"description":"Error interno","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"503":{"description":"Dependencia no disponible","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}}},"summary":"Listar mis v\u00eddeos","description":"Requiere sesi\u00f3n. ","parameters":[{"name":"page","in":"query","description":"Paginaci\u00f3n limitada.","required":false,"deprecated":false,"schema":{"type":"integer","minimum":1,"maximum":10000,"default":1},"style":"form","explode":true},{"name":"limit","in":"query","description":"Paginaci\u00f3n limitada.","required":false,"deprecated":false,"schema":{"type":"integer","minimum":1,"maximum":50,"default":24},"style":"form","explode":true}],"security":[{"session":[]}]}},"\/api\/v1\/videos":{"get":{"operationId":"videos","tags":["V\u00eddeos"],"responses":{"200":{"description":"Operaci\u00f3n completada.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/VideoPage"}}}},"400":{"description":"JSON inv\u00e1lido","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"401":{"description":"Sesi\u00f3n o firma inv\u00e1lida","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"403":{"description":"CSRF o rol insuficiente","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"404":{"description":"Recurso no visible o inexistente","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"409":{"description":"Conflicto de estado, cuota o unicidad","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"413":{"description":"M\u00e1s de 16 KiB","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"415":{"description":"Content-Type incorrecto","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"422":{"description":"Validaci\u00f3n de campos","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"429":{"description":"L\u00edmite temporal: Retry-After","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"500":{"description":"Error interno","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"503":{"description":"Dependencia no disponible","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}}},"summary":"Buscar v\u00eddeos publicados","description":"Consulta p\u00fablica; recursos privados limitados al propietario o administrador. ","parameters":[{"name":"page","in":"query","description":"Paginaci\u00f3n limitada.","required":false,"deprecated":false,"schema":{"type":"integer","minimum":1,"maximum":10000,"default":1},"style":"form","explode":true},{"name":"limit","in":"query","description":"Paginaci\u00f3n limitada.","required":false,"deprecated":false,"schema":{"type":"integer","minimum":1,"maximum":50,"default":24},"style":"form","explode":true},{"name":"q","in":"query","description":"B\u00fasqueda parcial por t\u00edtulo, hasta 100 caracteres.","required":false,"deprecated":false,"schema":{"type":"string","maxLength":100},"style":"form","explode":true}],"security":[]}},"\/api\/v1\/videos\/upload-intents":{"post":{"operationId":"intent","tags":["V\u00eddeos"],"responses":{"202":{"description":"Solicitud aceptada de forma durable; procesamiento pendiente.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Accepted"}}},"headers":{"Location":{"description":"URL de consulta de tarea","schema":{"type":"string"}}}},"400":{"description":"JSON inv\u00e1lido","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"401":{"description":"Sesi\u00f3n o firma inv\u00e1lida","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"403":{"description":"CSRF o rol insuficiente","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"404":{"description":"Recurso no visible o inexistente","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"409":{"description":"Conflicto de estado, cuota o unicidad","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"413":{"description":"M\u00e1s de 16 KiB","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"415":{"description":"Content-Type incorrecto","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"422":{"description":"Validaci\u00f3n de campos","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"429":{"description":"L\u00edmite temporal: Retry-After","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"500":{"description":"Error interno","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"503":{"description":"Dependencia no disponible","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}}},"summary":"Solicitar preparaci\u00f3n as\u00edncrona de subida","description":"Requiere sesi\u00f3n. Requiere X-CSRF-Token obtenido con GET \/api\/v1\/auth\/csrf, usando la misma cookie. 202 acepta la tarea, no confirma preparaci\u00f3n, transferencia ni codificaci\u00f3n. Cuotas: 3 activas, 20 v\u00eddeos, 20 GiB\/usuario; archivo 2 GiB y 60 min. Subida directa TUS, sin archivo en este endpoint.","parameters":[{"name":"Idempotency-Key","in":"header","description":"Clave por intenci\u00f3n: reutilizar con el mismo cuerpo devuelve la misma tarea; cuerpo distinto devuelve 409.","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[a-zA-Z0-9_-]{16,100}$","example":"upload-ana-20260909-001"},"style":"simple","explode":false}],"requestBody":{"description":"Objeto JSON validado. Campos adicionales rechazados.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/UploadInput"}}},"required":true},"security":[{"session":[],"csrf":[]}]}},"\/api\/v1\/videos\/{id}":{"get":{"operationId":"video","tags":["V\u00eddeos"],"responses":{"200":{"description":"Operaci\u00f3n completada.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Video"}}}},"400":{"description":"JSON inv\u00e1lido","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"401":{"description":"Sesi\u00f3n o firma inv\u00e1lida","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"403":{"description":"CSRF o rol insuficiente","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"404":{"description":"Recurso no visible o inexistente","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"409":{"description":"Conflicto de estado, cuota o unicidad","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"413":{"description":"M\u00e1s de 16 KiB","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"415":{"description":"Content-Type incorrecto","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"422":{"description":"Validaci\u00f3n de campos","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"429":{"description":"L\u00edmite temporal: Retry-After","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"500":{"description":"Error interno","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"503":{"description":"Dependencia no disponible","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}}},"summary":"Consultar v\u00eddeo visible","description":"Consulta p\u00fablica; recursos privados limitados al propietario o administrador. ","parameters":[{"name":"id","in":"path","description":"Endpoint identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}],"security":[]},"delete":{"operationId":"delete","tags":["V\u00eddeos"],"responses":{"202":{"description":"Solicitud aceptada de forma durable; procesamiento pendiente.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Accepted"}}},"headers":{"Location":{"description":"URL de consulta de tarea","schema":{"type":"string"}}}},"400":{"description":"JSON inv\u00e1lido","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"401":{"description":"Sesi\u00f3n o firma inv\u00e1lida","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"403":{"description":"CSRF o rol insuficiente","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"404":{"description":"Recurso no visible o inexistente","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"409":{"description":"Conflicto de estado, cuota o unicidad","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"413":{"description":"M\u00e1s de 16 KiB","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"415":{"description":"Content-Type incorrecto","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"422":{"description":"Validaci\u00f3n de campos","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"429":{"description":"L\u00edmite temporal: Retry-After","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"500":{"description":"Error interno","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"503":{"description":"Dependencia no disponible","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}}},"summary":"Ocultar y solicitar borrado remoto","description":"Requiere sesi\u00f3n. Requiere X-CSRF-Token obtenido con GET \/api\/v1\/auth\/csrf, usando la misma cookie. Oculta inmediatamente. Borrado remoto as\u00edncrono e idempotente; consultar taskUrl hasta succeeded. Eventos tard\u00edos no reactivan el v\u00eddeo.","parameters":[{"name":"id","in":"path","description":"Endpoint identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}],"security":[{"session":[],"csrf":[]}]},"patch":{"operationId":"video_edit","tags":["V\u00eddeos"],"responses":{"200":{"description":"Operaci\u00f3n completada.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Video"}}}},"400":{"description":"JSON inv\u00e1lido","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"401":{"description":"Sesi\u00f3n o firma inv\u00e1lida","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"403":{"description":"CSRF o rol insuficiente","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"404":{"description":"Recurso no visible o inexistente","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"409":{"description":"Conflicto de estado, cuota o unicidad","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"413":{"description":"M\u00e1s de 16 KiB","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"415":{"description":"Content-Type incorrecto","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"422":{"description":"Validaci\u00f3n de campos","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"429":{"description":"L\u00edmite temporal: Retry-After","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"500":{"description":"Error interno","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"503":{"description":"Dependencia no disponible","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}}},"summary":"Editar metadatos propios","description":"Requiere sesi\u00f3n. Requiere X-CSRF-Token obtenido con GET \/api\/v1\/auth\/csrf, usando la misma cookie. ","parameters":[{"name":"id","in":"path","description":"Endpoint identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}],"requestBody":{"description":"Objeto JSON validado. Campos adicionales rechazados.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/VideoInput"}}},"required":true},"security":[{"session":[],"csrf":[]}]}},"\/api\/v1\/videos\/{id}\/playback":{"get":{"operationId":"playback","tags":["V\u00eddeos"],"responses":{"200":{"description":"Operaci\u00f3n completada.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Playback"}}}},"400":{"description":"JSON inv\u00e1lido","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"401":{"description":"Sesi\u00f3n o firma inv\u00e1lida","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"403":{"description":"CSRF o rol insuficiente","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"404":{"description":"Recurso no visible o inexistente","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"409":{"description":"Conflicto de estado, cuota o unicidad","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"413":{"description":"M\u00e1s de 16 KiB","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"415":{"description":"Content-Type incorrecto","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"422":{"description":"Validaci\u00f3n de campos","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"429":{"description":"L\u00edmite temporal: Retry-After","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"500":{"description":"Error interno","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"503":{"description":"Dependencia no disponible","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}}},"summary":"Obtener reproducci\u00f3n temporal autorizada","description":"Consulta p\u00fablica; recursos privados limitados al propietario o administrador. URL firmada de 300 segundos. La biblioteca debe proteger iframe y CDN. URLs emitidas permanecen v\u00e1lidas hasta expirar.","parameters":[{"name":"id","in":"path","description":"Endpoint identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}],"security":[]}},"\/api\/v1\/videos\/{id}\/publish":{"post":{"operationId":"publish","tags":["V\u00eddeos"],"responses":{"200":{"description":"Operaci\u00f3n completada.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Video"}}}},"400":{"description":"JSON inv\u00e1lido","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"401":{"description":"Sesi\u00f3n o firma inv\u00e1lida","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"403":{"description":"CSRF o rol insuficiente","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"404":{"description":"Recurso no visible o inexistente","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"409":{"description":"Conflicto de estado, cuota o unicidad","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"413":{"description":"M\u00e1s de 16 KiB","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"415":{"description":"Content-Type incorrecto","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"422":{"description":"Validaci\u00f3n de campos","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"429":{"description":"L\u00edmite temporal: Retry-After","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"500":{"description":"Error interno","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"503":{"description":"Dependencia no disponible","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}}},"summary":"Publicar un v\u00eddeo preparado","description":"Requiere sesi\u00f3n. Requiere X-CSRF-Token obtenido con GET \/api\/v1\/auth\/csrf, usando la misma cookie. Solo technicalState=ready puede pasar a visibility=public. Hidden requiere administrador. La ingesti\u00f3n completada no publica autom\u00e1ticamente.","parameters":[{"name":"id","in":"path","description":"Endpoint identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}],"requestBody":{"description":"The new Endpoint resource","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Endpoint"}}},"required":true},"security":[{"session":[],"csrf":[]}]}},"\/api\/v1\/videos\/{id}\/upload-authorization":{"post":{"operationId":"authorization","tags":["V\u00eddeos"],"responses":{"200":{"description":"Operaci\u00f3n completada.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Authorization"}}}},"400":{"description":"JSON inv\u00e1lido","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"401":{"description":"Sesi\u00f3n o firma inv\u00e1lida","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"403":{"description":"CSRF o rol insuficiente","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"404":{"description":"Recurso no visible o inexistente","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"409":{"description":"Conflicto de estado, cuota o unicidad","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"413":{"description":"M\u00e1s de 16 KiB","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"415":{"description":"Content-Type incorrecto","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"422":{"description":"Validaci\u00f3n de campos","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"429":{"description":"L\u00edmite temporal: Retry-After","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"500":{"description":"Error interno","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}},"503":{"description":"Dependencia no disponible","content":{"application\/problem+json":{"schema":{"$ref":"#\/components\/schemas\/Problem"}}}}},"summary":"Obtener o renovar autorizaci\u00f3n TUS","description":"Requiere sesi\u00f3n. Requiere X-CSRF-Token obtenido con GET \/api\/v1\/auth\/csrf, usando la misma cookie. Reutiliza siempre el mismo v\u00eddeo remoto. Solo waiting_upload, ventana de 24 h. Firma TUS de 1 hora; renovar en caso de 401 del proveedor. No crea otro v\u00eddeo.","parameters":[{"name":"id","in":"path","description":"Endpoint identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}],"requestBody":{"description":"The new Endpoint resource","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Endpoint"}}},"required":true},"security":[{"session":[],"csrf":[]}]}}},"components":{"schemas":{"ConstraintViolation":{"type":"object","description":"Unprocessable entity","properties":{"status":{"default":422,"type":"integer"},"violations":{"type":"array","items":{"type":"object","properties":{"propertyPath":{"type":"string","description":"The property path of the violation"},"message":{"type":"string","description":"The message associated with the violation"},"code":{"type":"string","description":"The code of the violation"},"hint":{"type":"string","description":"An extra hint to understand the violation"},"payload":{"type":"object","additionalProperties":true,"description":"The serialized payload of the violation"}},"required":["propertyPath","message"]}},"detail":{"readOnly":true,"type":"string"},"type":{"readOnly":true,"type":"string"},"title":{"readOnly":true,"type":["string","null"]},"instance":{"readOnly":true,"type":["string","null"]}}},"ConstraintViolation.jsonld":{"type":"object","description":"Unprocessable entity","properties":{"status":{"default":422,"type":"integer"},"violations":{"type":"array","items":{"type":"object","properties":{"propertyPath":{"type":"string","description":"The property path of the violation"},"message":{"type":"string","description":"The message associated with the violation"},"code":{"type":"string","description":"The code of the violation"},"hint":{"type":"string","description":"An extra hint to understand the violation"},"payload":{"type":"object","additionalProperties":true,"description":"The serialized payload of the violation"}},"required":["propertyPath","message"]}},"detail":{"readOnly":true,"type":"string"},"description":{"readOnly":true,"type":"string"},"type":{"readOnly":true,"type":"string"},"title":{"readOnly":true,"type":["string","null"]},"instance":{"readOnly":true,"type":["string","null"]}}},"Endpoint":{"type":"object"},"Endpoint.jsonMergePatch":{"type":"object"},"Error":{"type":"object","description":"A representation of common errors.","properties":{"title":{"readOnly":true,"description":"A short, human-readable summary of the problem.","type":["string","null"]},"detail":{"readOnly":true,"description":"A human-readable explanation specific to this occurrence of the problem.","type":["string","null"]},"status":{"type":["integer","null"],"examples":[404],"default":400},"instance":{"readOnly":true,"description":"A URI reference that identifies the specific occurrence of the problem. It may or may not yield further information if dereferenced.","type":["string","null"]},"type":{"readOnly":true,"description":"A URI reference that identifies the problem type","type":"string"}}},"Error.jsonld":{"type":"object","description":"A representation of common errors.","properties":{"title":{"readOnly":true,"description":"A short, human-readable summary of the problem.","type":["string","null"]},"detail":{"readOnly":true,"description":"A human-readable explanation specific to this occurrence of the problem.","type":["string","null"]},"status":{"type":["integer","null"],"examples":[404],"default":400},"instance":{"readOnly":true,"description":"A URI reference that identifies the specific occurrence of the problem. It may or may not yield further information if dereferenced.","type":["string","null"]},"type":{"readOnly":true,"description":"A URI reference that identifies the problem type","type":"string"},"description":{"readOnly":true,"type":["string","null"]}}},"Csrf":{"type":"object","properties":{"token":{"type":"string","example":"opaque-session-csrf-token"},"header":{"type":"string","example":"X-CSRF-Token"}},"required":["token","header"]},"Identity":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"email":{"type":"string","format":"email"},"channelSlug":{"type":"string"},"roles":{"type":"array","items":{"type":"string"}},"channel":{"$ref":"#\/components\/schemas\/Channel"}},"required":["id","email"]},"Channel":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"slug":{"type":"string","example":"ana-crea"},"name":{"type":"string","example":"Ana crea"},"description":{"type":"string","example":"Historias de naturaleza y viajes."}},"required":["id","slug","name","description"]},"Video":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"title":{"type":"string","example":"Un paseo por la sierra"},"description":{"type":"string"},"channel":{"type":"object","properties":{"slug":{"type":"string"},"name":{"type":"string"}},"required":["slug","name"]},"technicalState":{"type":"string","enum":["pending","waiting_upload","processing","ready","failed","deleted"]},"visibility":{"type":"string","enum":["private","public","hidden"]},"duration":{"type":"integer","nullable":true},"createdAt":{"type":"string"},"likes":{"type":"integer"},"canEdit":{"type":"boolean"},"thumbnailUrl":{"type":"string","nullable":true},"liked":{"type":"boolean","description":"Presente en consulta individual; me gusta del usuario actual."}},"required":["id","title","description","channel","technicalState","visibility","duration","createdAt","likes","canEdit","thumbnailUrl"]},"Accepted":{"type":"object","properties":{"taskId":{"type":"string","format":"uuid"},"videoId":{"type":"string","format":"uuid"},"status":{"type":"string","example":"queued"},"taskUrl":{"type":"string","example":"\/api\/v1\/tasks\/0199aee0-1111-7111-8111-111111111111"}},"required":["taskId","videoId","status","taskUrl"]},"EventAccepted":{"type":"object","properties":{"eventId":{"type":"string","format":"uuid"},"status":{"type":"string","example":"accepted"}},"required":["eventId","status"]},"Authorization":{"type":"object","properties":{"mode":{"type":"string","enum":["real","fake"]},"endpoint":{"type":"string","nullable":true,"example":"https:\/\/video.bunnycdn.com\/tusupload"},"headers":{"type":"object","additionalProperties":{"type":"string"}},"expiresAt":{"type":"integer"},"videoId":{"type":"string","format":"uuid"},"maxBytes":{"type":"integer"},"maxDuration":{"type":"integer"}},"required":["mode","endpoint","headers","expiresAt","videoId"]},"Playback":{"type":"object","properties":{"url":{"type":"string"},"expiresIn":{"type":"integer","example":300}},"required":["url","expiresIn"]},"Comment":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"body":{"type":"string","example":"Qu\u00e9 luz tan bonita."},"ownerId":{"type":"string","format":"uuid"},"createdAt":{"type":"string"},"name":{"type":"string"},"slug":{"type":"string"}},"required":["id","body"]},"Like":{"type":"object","properties":{"liked":{"type":"boolean"},"count":{"type":"integer"}},"required":["liked","count"]},"Problem":{"type":"object","properties":{"type":{"type":"string","example":"about:blank"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"},"instance":{"type":"string"},"requestId":{"type":"string"},"violations":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"message":{"type":"string"}},"required":["field","message"]}}},"required":["type","title","status","detail"]},"Webhook":{"type":"object","properties":{"VideoLibraryId":{"type":"integer","example":123},"VideoGuid":{"type":"string","format":"uuid"},"Status":{"type":"integer","minimum":0,"maximum":10,"example":3}},"required":["VideoLibraryId","VideoGuid","Status"]},"Task":{"type":"object","properties":{"id":{"type":"string","nullable":false},"type":{"type":"string","nullable":false},"ownerId":{"type":"string","nullable":false},"videoId":{"type":"string","nullable":false},"parentTaskId":{"type":"string","nullable":true},"status":{"type":"string","enum":["pending","queued","running","waiting_upload","waiting_provider","succeeded","failed","cancelled"]},"step":{"type":"string","nullable":false},"provider":{"type":"string","nullable":false},"correlationId":{"type":"string","nullable":false},"idempotencyKey":{"type":"string","nullable":false},"createdAt":{"type":"string","nullable":false},"startedAt":{"type":"string","nullable":true},"updatedAt":{"type":"string","nullable":false},"finishedAt":{"type":"string","nullable":true},"nextRetryAt":{"type":"string","nullable":true},"expiresAt":{"type":"string","nullable":false},"errorCode":{"type":"string","nullable":true},"errorMessage":{"type":"string","nullable":true},"progressSource":{"type":"string","nullable":true},"progressUpdatedAt":{"type":"string","nullable":true},"url":{"type":"string","nullable":false},"attempts":{"type":"integer"},"progress":{"type":"integer","nullable":true,"minimum":0,"maximum":100},"retryable":{"type":"boolean"},"externalReferences":{"type":"object","additionalProperties":{"type":"string"}},"events":{"type":"array","items":{"type":"object","properties":{"state":{"type":"string"},"step":{"type":"string"},"code":{"type":"string","nullable":true},"createdAt":{"type":"string"}},"required":["state","step","code","createdAt"]}}},"required":["id","type","ownerId","videoId","parentTaskId","status","step","provider","correlationId","idempotencyKey","createdAt","startedAt","updatedAt","finishedAt","nextRetryAt","expiresAt","errorCode","errorMessage","progressSource","progressUpdatedAt","url","attempts","progress","retryable","externalReferences"]},"VideoPage":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#\/components\/schemas\/Video"}},"page":{"type":"integer","minimum":1},"limit":{"type":"integer","minimum":1,"maximum":50}},"required":["items","page","limit"]},"TaskPage":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#\/components\/schemas\/Task"}},"page":{"type":"integer","minimum":1},"limit":{"type":"integer","minimum":1,"maximum":50}},"required":["items","page","limit"]},"CommentPage":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#\/components\/schemas\/Comment"}},"page":{"type":"integer","minimum":1},"limit":{"type":"integer","minimum":1,"maximum":50}},"required":["items","page","limit"]},"RegisterInput":{"type":"object","properties":{"email":{"type":"string","maxLength":254,"format":"email","example":"ana@example.org"},"password":{"type":"string","maxLength":128,"minLength":12,"format":"password","example":"Frase-segura-de-prueba-2026"},"name":{"type":"string","maxLength":80,"example":"Ana crea"},"slug":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{2,39}$","example":"ana-crea"}},"required":["email","password","name","slug"],"additionalProperties":false},"LoginInput":{"type":"object","properties":{"email":{"type":"string","format":"email","example":"ana@example.org"},"password":{"type":"string","format":"password","example":"Frase-segura-de-prueba-2026"}},"required":["email","password"],"additionalProperties":false},"UploadInput":{"type":"object","properties":{"title":{"type":"string","maxLength":150,"example":"Un paseo por la sierra"},"description":{"type":"string","maxLength":5000},"sizeBytes":{"type":"integer","maximum":2147483648,"minimum":1,"example":104857600}},"required":["title","sizeBytes"],"additionalProperties":false},"VideoInput":{"type":"object","properties":{"title":{"type":"string","maxLength":150,"minLength":1,"example":"Un paseo por la sierra"},"description":{"type":"string","maxLength":5000}},"required":["title","description"],"additionalProperties":false},"ChannelInput":{"type":"object","properties":{"name":{"type":"string","maxLength":80,"minLength":1,"example":"Ana crea"},"slug":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{2,39}$","example":"ana-crea"},"description":{"type":"string","maxLength":5000}},"required":["name","slug","description"],"additionalProperties":false},"CommentInput":{"type":"object","properties":{"body":{"type":"string","maxLength":2000}},"required":["body"],"additionalProperties":false}},"responses":{},"parameters":{},"examples":{},"requestBodies":{},"headers":{},"securitySchemes":{"csrf":{"type":"apiKey","in":"header","name":"X-CSRF-Token"},"session":{"type":"apiKey","in":"cookie","name":"FREECOMSESSID"}}},"security":[{"csrf":[]}],"tags":[{"name":"Identidad","description":"Resource 'Identidad' operations."},{"name":"Canales","description":"Resource 'Canales' operations."},{"name":"V\u00eddeos","description":"Resource 'V\u00eddeos' operations."},{"name":"Moderaci\u00f3n","description":"Resource 'Moderaci\u00f3n' operations."},{"name":"Comentarios","description":"Resource 'Comentarios' operations."},{"name":"Likes","description":"Resource 'Likes' operations."},{"name":"Tareas","description":"Resource 'Tareas' operations."},{"name":"Proveedor","description":"Resource 'Proveedor' operations."}],"webhooks":{}}