CursosEmpresasBlogLiveConfPrecios

Creando un nuevo middleware

Clase 12 de 22 • Curso de APIs con .NET

Clase anteriorSiguiente clase

Contenido del curso

Introducción a API en .NET
  • 1
    Domina las API con .NET

    Domina las API con .NET

    02:50
  • 2
    Prerrequisitos

    Prerrequisitos

    02:36
  • 3
    ¿Qué es una API?

    ¿Qué es una API?

    04:22
  • 4
    ¿Qué es REST?

    ¿Qué es REST?

    08:18
  • 5
    Creando tu primera API con .NET

    Creando tu primera API con .NET

    04:04
Funcionamiento de una API en .NET
  • 6
    Consumiendo API desde Postman

    Consumiendo API desde Postman

    05:33
  • 7
    Análisis del template para APIs de .NET

    Análisis del template para APIs de .NET

    10:51
  • 8
    Atributos para verbos HTTP

    Atributos para verbos HTTP

    14:56
  • 9
    Manejo de rutas

    Manejo de rutas

    09:51
  • 10
    Minimal API vs. Web API

    Minimal API vs. Web API

    08:36
Arquitectura y configuración
  • 11
    ¿Qué son los middlewares?

    ¿Qué son los middlewares?

    08:54
  • 12
    Creando un nuevo middleware

    Creando un nuevo middleware

    14:46
  • 13
    Inyección de dependencias

    Inyección de dependencias

    16:43
  • 14
    Agregando Logging a API

    Agregando Logging a API

    09:25
  • 15
    Documentando API con Swagger

    Documentando API con Swagger

    08:03
Manipulación de datos con Entity Framework
  • 16
    Agregando librerías para Entity Framework

    Agregando librerías para Entity Framework

    04:38
  • 17
    Configuración de Entity framework y clases base

    Configuración de Entity framework y clases base

    08:31
  • 18
    Creación de servicios

    Creación de servicios

    12:24
  • 19
    Inyectando servicios como dependencia

    Inyectando servicios como dependencia

    04:43
  • 20
    Creando controladores

    Creando controladores

    11:32
  • 21
    Probando API con una base de datos SQL server

    Probando API con una base de datos SQL server

    14:03
Outro
  • 22
    Retrospectiva: APIs con .NET

    Retrospectiva: APIs con .NET

    03:05
    Josian Francisco Cáceres Suazo

    Josian Francisco Cáceres Suazo

    student•
    hace 3 años

    Este comentario solo es para reconocer lo buena que estuvo esta clase y el buen docente que eres @Miguel Teheran, espero de verdad seguir viendo más cursos de tu parte.

      Alonso Cordova

      Alonso Cordova

      student•
      hace 3 años

      Espero lo mismo, me gusta mucho como enseña.

      Sabrina Sandí Quirós

      Sabrina Sandí Quirós

      student•
      hace 3 años

      Yo estoy desde cero y me siento muy motivada porque el tema es muy interesante y estoy logrando comprender muchas cosas!!

    Luis Angel Cruz Ruiz

    Luis Angel Cruz Ruiz

    student•
    hace 3 años

    Se lanzó una excepción cuando cambié de orden la ejecución del siguiente middleware. Lo solucioné colocando un simple return antes de que se ejecutara el siguiente:

    public async Task Invoke (HttpContext context) { if(context.Request.Query.Any( p=> p.Key == "time")) { await context.Response.WriteAsync(DateTime.Now.ToShortTimeString()); return; } await next(context); }

    Si a alguien le pasa lo mismo, espero que esto les auide a solucionarlo c;

      Rodrigo Chambi Quispe

      Rodrigo Chambi Quispe

      student•
      hace 3 años

      funcionó.

      Luis Cadme

      Luis Cadme

      student•
      hace 3 años

      gracias me sirvió

    Nestor Fabian Peña Estrella

    Nestor Fabian Peña Estrella

    student•
    hace 3 años

    En el minuto 4:05 Miguel agrega todo el namespace para corregir un problema supuestamente porque se está tomando el tipo de datos equivocado, el problema era más sencillo ... habia escrito "HttpContent" en lugar del correcto que era "HttpContext"

      Erick Alejandro Benitez Tenorio

      Erick Alejandro Benitez Tenorio

      student•
      hace 3 años

      Me paso el mismo caso jeje

      Alex Eugenio Gavidia Donayre

      Alex Eugenio Gavidia Donayre

      student•
      hace 3 años

      Buena

    José Javier Vásquez Ramos

    José Javier Vásquez Ramos

    student•
    hace 4 años

    Al momento que realizo el cambio de ejecución en el método de Invoke me lanza un error, no me funciona, esperaria solo la fecha pero en mi caso no es asi.

    public async Task Invoke(Microsoft.AspNetCore.Http.HttpContext context){ await next(context); if (context.Request.Query.Any(p => p.Key == "time")) { await context.Response.WriteAsync(DateTime.Now.ToShortDateString()); } }

    GET https://localhost:7147/api/WeatherForecast?time Error: aborted Request Headers User-Agent: PostmanRuntime/7.29.0 Accept: / Postman-Token: e5c4e3fb-53cc-4a8f-bf58-9d5c2286b98e Host: localhost:7147 Accept-Encoding: gzip, deflate, br Connection: keep-alive

    Tengo exactamente el mismo codigo, si no muevo la invocacion de next(), me funciona bien, se ejecuta el middleware.

    A alguien mas le sucede?

      cromero207

      cromero207

      student•
      hace 4 años

      Estuve mirando algo en foros y resulta que ese error sucede porque el response comenzó a enviarse al usuario, por que antes de ejecutar await next.Invoke(context) hay que anteponer esto:

      if (!context.Response.HasStarted) { await next.Invoke(context); }
      Marcos Avila Rodriguez

      Marcos Avila Rodriguez

      student•
      hace 4 años

      A mi me muestra un error en la consola pero el **statuscode ** es 200 y el **response ** me lo deja en blanco. Si lo dejo como en el primer ejemplo, funciona sin problemas.

    Erick Edgardo Marroquin Escobar

    Erick Edgardo Marroquin Escobar

    student•
    hace 3 años

    Es el curso más concreto y completo que he visto, sin tanta explicación de cosas que nada que ver

      Luis Vargas

      Luis Vargas

      student•
      hace 3 años

      Totalmente de acuerdo, a veces hablan tanto de muchos temas a la vez o se distraen contando cosas que no viene al caso y lo que hacen es enredar a uno aun más de lo que ya estamos. Espero poder seguir viendo más y más cursos de Miguel.

    Platzi Team

    Platzi Team

    student•
    hace 3 años

    Creando un nuevo middleware


    public class TimeMiddleware { private readonly RequestDelegate _next; public TimeMiddleware(RequestDelegate next) { _next = next; } public async Task InvokeAsync(HttpContext context) { await _next(context); if (context.Request.Query.Any(x => x.Key == "time")) { await context.Response.WriteAsync(DateTime.Now.ToShortTimeString()); } } } public static class TimeMiddlewareExtensions { public static IApplicationBuilder UseTimeMiddleware(this IApplicationBuilder builder) { return builder.UseMiddleware<TimeMiddleware>(); } }
    • Cree una clase que implemente la interfaz IMiddleware: Debe crear una clase que implemente la interfaz IMiddleware y tenga un método llamado Invoke. Este método es el que se ejecutará cuando se invoque el middleware.
    • Agregue el código personalizado: Dentro del método Invoke, puede agregar el código que desea ejecutar cuando se invoque el middleware. Por ejemplo, puede agregar lógica para capturar errores, realizar seguimiento de solicitudes o autenticar a un usuario.
    • La línea await _next(context); en el código de un middleware se usa para continuar con la siguiente etapa en la cadena de middlewares. En otras palabras, esta línea permite que el control pase al siguiente middleware en la cadena para que pueda realizar su procesamiento.
    • El objeto HttpContext que se pasa como argumento a la función InvokeAsync contiene información sobre la solicitud HTTP actual y la respuesta que se está construyendo. El argumento _next es un delegado RequestDelegate que representa la siguiente etapa en la cadena de middlewares.
    • Añada el middleware a la cadena de solicitudes: Finalmente, debe añadir el middleware a la cadena de solicitudes en el archivo program.cs . Esto se puede hacer llamando al método UseMiddleware y proporcionando una instancia de su clase de middleware personalizado.
    app.UseTimeMiddleware();
      Diego Fernando Pallares Ramirez

      Diego Fernando Pallares Ramirez

      student•
      hace 3 años

      Como supiste sacar tremenda solución, gracias ?

      Joel Prada

      Joel Prada

      student•
      hace 2 años

      Excelente síntesis.

    Jaime Eduardo Falla Cardozo

    Jaime Eduardo Falla Cardozo

    student•
    hace 3 años

    Hay que anotar que al parecer con la versión 7 se genera una excepción implementando el código como lo tenía. Por lo que tuve que dejarlo de la siguiente forma

    public async Task Invoke(HttpContext context){ if(context.Request.Query.Any(p => p.Key == "time")){ await context.Response.WriteAsync(DateTime.Now.ToShortTimeString()); return; } await _next(context); }
      Javi Llinares

      Javi Llinares

      student•
      hace 3 años

      Hola Jaime, ¿podrías explicar porqué añadiste el return?

      He probado tu código y efectivamente funciona así, pero no entiendo bien porque has añadido ese "return".

      ¡Gracias!

      Ivan David Martinez Baron

      Ivan David Martinez Baron

      student•
      hace 3 años

      Javi, eso se debe a que si no se termina el código dentro del if, se estaría llamando dos veces al middelware.

    Emi Lemus

    Emi Lemus

    student•
    hace 3 años

    Hola, sinceramente vi tres veces esta clase y no entendi nada, se van mencionando conceptos que no tengo claros, en conclusión, no se que hizo. Alguien me puede hacer un resumen para seguir con el curso ? Gracias.

      Juan Rosario

      Juan Rosario

      student•
      hace 3 años

      Emi, si ese fue el caso, es posible que no hayas tenido claros algunos conceptos de videos anteriores.

      Aqui se hacen cosas nuevas, pero viene de una base de explicaciones anteriores.

      Te recomiendo, cortésmente, que repases las clases anteriores a este video para que te queden claras las cosas que se hicieron aqui

      Diego Andrés Castillo Ospina

      Diego Andrés Castillo Ospina

      student•
      hace 2 años

      Igualmente me sucedió, sé que los middlewares se interponen en el flujo de un request para hacerle alguna función en específico, pero al ver esa función necesita de unos objetos e interfaces que me hizo perder mucho.

    John Sergio Ramirez Castañeda

    John Sergio Ramirez Castañeda

    student•
    hace 3 años

    Middlewares (Programas intermedios) • La base de como funciona cada uno de los request. • Es una serie de instrucciones de código que se agregan al ciclo de vida de una petición HTTP. • Provee una ejecución de peticiones a través de capas. • Facilitan la implementación de interceptores y filtros sobre las peticiones en una API. • Es mucho más fácil ver la secuencia de comandos que se ejecutan por cada petición e implementar middleware personalizados (con código a demanda ) para interceptar algún request y agregar algún comportamiento adicional.

    Middleware **página de bienvenida **

    app.UseWelcomePage();
    Ronald Ernesto Tejada Ríos

    Ronald Ernesto Tejada Ríos

    student•
    hace 3 años

    Excelente clase!! Definitivamente pienso borrar este middleware porque me está generando más problemas que beneficios, pero fue genial poder entender el concepto de middleware de una forma tan sencilla

    En mis palabras diría que los middlewares son procesos que se van realizando en cadena uno después del otro desde que empieza el request, hasta que se termina el proceso y se llega al endpoint que sería donde devolvemos datos al usuario

    Nestor Fabian Peña Estrella

    Nestor Fabian Peña Estrella

    student•
    hace 3 años

    En mi caso no muestra solo la hora, a mi me muestra un error en la consola que dice:

    The response has already started, the error page middleware will not be executed.

    el response es 200 pero sin ningun valor de response

    Diego Eduardo Téllez Contreras

    Diego Eduardo Téllez Contreras

    student•
    hace 2 años

    Entiendo que el TimeMiddlewareExtension lo que hace es permitirnos usar el middleware en el archivo Program.cs, pero la verdad no entiendo por qué tiene la palabra extension? Es obligatorio que lleve esa palabra?

    Por qué esa clase no tiene un constructor? En qué momento se está ejecutando esa clase TimeMiddlewareExtension?

      Miguel Teheran

      Miguel Teheran

      teacher•
      hace 2 años

      Es por buena practica para indicar que es un extesion method, este un concepto en C# que nos permite extenderlos metodos de un tipo para este escenario era la mejor opción, para que se pudiera usar como los demas middlewares y tener la misma forma de llamarlo

      https://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/extension-methods

      Diego Eduardo Téllez Contreras

      Diego Eduardo Téllez Contreras

      student•
      hace 2 años

      Gracias por la aclaración profe!

    Andrea Ruíz

    Andrea Ruíz

    student•
    hace 3 años

    Que plugin usan para que les funcione bien el autocompletado de C# en VSC?

      Miguel Teheran

      Miguel Teheran

      teacher•
      hace 3 años

      La extension de C# de microsoft : https://marketplace.visualstudio.com/items?itemName=ms-dotnettools.csharp

      Te recomiendo pack de extensiones de .NET https://marketplace.visualstudio.com/items?itemName=ms-dotnettools.vscode-dotnet-pack

      Pablo Cesar Lara Londoño

      Pablo Cesar Lara Londoño

      student•
      hace 2 años

      Que detallazo profe @Mteheran 👍🏻

    Erick Alexander Cabrera González

    Erick Alexander Cabrera González

    student•
    hace 2 años

    Hola, como dato adicional: Si están realizando la creación de Middlewares en Visual Studio (versión Community por ejemplo) recordar que hay que usar el Using "Namespace" del archivo TimeMiddleware en la clase Program para que funcione como en el video.

    JUAN PABLO MAYORGA MENDIETA

    JUAN PABLO MAYORGA MENDIETA

    student•
    hace 2 años

    me parece muy mal que en la nueva version omitan la fecha en la que se realizan los comentarios, esto nos da a simple vista que tanantiguo es el curso y que tan desactualizado es el contenido que estamos consumiendo. Como observación me gustaría que se mostrara esa información y que uno como usuario decida si hace o no el curso, como estaba en la versión anterior.

    Pablo Gabriel Mederos Caballero

    Pablo Gabriel Mederos Caballero

    student•
    hace 3 años

    En este video hay dos conceptos. La creación de Middlewares y también la creación de extensiones. Muy buen ejemplo en poco código.

    Camilo Garcia

    Camilo Garcia

    student•
    hace 3 años

    Cuando le coloqué el llamado a await next(context); Despues del bloque if, no me respondio el servicio, alguien sabe que puede ser ?

      Miguel Teheran

      Miguel Teheran

      teacher•
      hace 3 años

      Puedes colocar el código para hecharle un vistaso?

      Andre Huaman Yovera

      Andre Huaman Yovera

      student•
      hace 3 años
      if (!context.Response.HasStarted) { await next.Invoke(context); }``` Con esto se soluciona!
    Agustin Emilio Alcantara Corporan

    Agustin Emilio Alcantara Corporan

    student•
    hace 3 años

    Podemos envolver las respuestas en una estructura JSON general, para todas las respuestas ?

      Miguel Teheran

      Miguel Teheran

      teacher•
      hace 3 años

      Por defecto es un json cuando se usan elementos complejos como clases y colecciones no tienes que usar el Json(result)

    Francisco Javier Pineda Giraldo

    Francisco Javier Pineda Giraldo

    student•
    hace 3 años

    Como soy Nuevo en estos temas me Cuesta entender cuando utilizan metodos, y argumentos, ya propios de la API, y lo hacen escribiendo código con tanta facilidad, que me sugieren para desarrollar esa misma habilidad, Yo aún no lo asimilo tan facil

      Miguel Teheran

      Miguel Teheran

      teacher•
      hace 3 años

      Creo que al final es practicar, imaginarte unos demos o escenarios en tu cabeza e implementarlos usando los middlewares. de todas formas ya existen muchas librerías que hacen un montón de cosas esto es solo para ciertos casos o escenarios.

    Juan Sebastian Viazzo Perrone

    Juan Sebastian Viazzo Perrone

    student•
    hace 2 años

    Una consulta,

    de constumbre, y por codear en Vistual Studio, a la clase de TimeMiddleware le puse un namespace, por interpretacion mia, segun lo que entiendo de los namespaces...porque eso me tiraba error? los middleware y alguna otra clase de api no van con Using o namespaces?

      Miguel Teheran

      Miguel Teheran

      teacher•
      hace 2 años

      Si le colocas un namespace ya sea en la estructura de un archivoo como un static namespaces debes hacer referencia usando using en el archivo donde lo vayas a utilizar.

Escuelas

  • Desarrollo Web
    • Fundamentos del Desarrollo Web Profesional
    • Diseño y Desarrollo Frontend
    • Desarrollo Frontend con JavaScript
    • Desarrollo Frontend con Vue.js
    • Desarrollo Frontend con Angular
    • Desarrollo Frontend con React.js
    • Desarrollo Backend con Node.js
    • Desarrollo Backend con Python
    • Desarrollo Backend con Java
    • Desarrollo Backend con PHP
    • Desarrollo Backend con Ruby
    • Bases de Datos para Web
    • Seguridad Web & API
    • Testing Automatizado y QA para Web
    • Arquitecturas Web Modernas y Escalabilidad
    • DevOps y Cloud para Desarrolladores Web
  • English Academy
    • Inglés Básico A1
    • Inglés Básico A2
    • Inglés Intermedio B1
    • Inglés Intermedio Alto B2
    • Inglés Avanzado C1
    • Inglés para Propósitos Específicos
    • Inglés de Negocios
  • Marketing Digital
    • Fundamentos de Marketing Digital
    • Marketing de Contenidos y Redacción Persuasiva
    • SEO y Posicionamiento Web
    • Social Media Marketing y Community Management
    • Publicidad Digital y Paid Media
    • Analítica Digital y Optimización (CRO)
    • Estrategia de Marketing y Growth
    • Marketing de Marca y Comunicación Estratégica
    • Marketing para E-commerce
    • Marketing B2B
    • Inteligencia Artificial Aplicada al Marketing
    • Automatización del Marketing
    • Marca Personal y Marketing Freelance
    • Ventas y Experiencia del Cliente
    • Creación de Contenido para Redes Sociales
  • Inteligencia Artificial y Data Science
    • Fundamentos de Data Science y AI
    • Análisis y Visualización de Datos
    • Machine Learning y Deep Learning
    • Data Engineer
    • Inteligencia Artificial para la Productividad
    • Desarrollo de Aplicaciones con IA
    • AI Software Engineer
  • Ciberseguridad
    • Fundamentos de Ciberseguridad
    • Hacking Ético y Pentesting (Red Team)
    • Análisis de Malware e Ingeniería Forense
    • Seguridad Defensiva y Cumplimiento (Blue Team)
    • Ciberseguridad Estratégica
  • Liderazgo y Habilidades Blandas
    • Fundamentos de Habilidades Profesionales
    • Liderazgo y Gestión de Equipos
    • Comunicación Avanzada y Oratoria
    • Negociación y Resolución de Conflictos
    • Inteligencia Emocional y Autogestión
    • Productividad y Herramientas Digitales
    • Gestión de Proyectos y Metodologías Ágiles
    • Desarrollo de Carrera y Marca Personal
    • Diversidad, Inclusión y Entorno Laboral Saludable
    • Filosofía y Estrategia para Líderes
  • Diseño de Producto y UX
    • Fundamentos de Diseño UX/UI
    • Investigación de Usuarios (UX Research)
    • Arquitectura de Información y Usabilidad
    • Diseño de Interfaces y Prototipado (UI Design)
    • Sistemas de Diseño y DesignOps
    • Redacción UX (UX Writing)
    • Creatividad e Innovación en Diseño
    • Diseño Accesible e Inclusivo
    • Diseño Asistido por Inteligencia Artificial
    • Gestión de Producto y Liderazgo en Diseño
    • Diseño de Interacciones Emergentes (VUI/VR)
    • Desarrollo Web para Diseñadores
    • Diseño y Prototipado No-Code
  • Contenido Audiovisual
    • Fundamentos de Producción Audiovisual
    • Producción de Video para Plataformas Digitales
    • Producción de Audio y Podcast
    • Fotografía y Diseño Gráfico para Contenido Digital
    • Motion Graphics y Animación
    • Contenido Interactivo y Realidad Aumentada
    • Estrategia, Marketing y Monetización de Contenidos
  • Desarrollo Móvil
    • Fundamentos de Desarrollo Móvil
    • Desarrollo Nativo Android con Kotlin
    • Desarrollo Nativo iOS con Swift
    • Desarrollo Multiplataforma con React Native
    • Desarrollo Multiplataforma con Flutter
    • Arquitectura y Patrones de Diseño Móvil
    • Integración de APIs y Persistencia Móvil
    • Testing y Despliegue en Móvil
    • Diseño UX/UI para Móviles
  • Diseño Gráfico y Arte Digital
    • Fundamentos del Diseño Gráfico y Digital
    • Diseño de Identidad Visual y Branding
    • Ilustración Digital y Arte Conceptual
    • Diseño Editorial y de Empaques
    • Motion Graphics y Animación 3D
    • Diseño Gráfico Asistido por Inteligencia Artificial
    • Creatividad e Innovación en Diseño
  • Programación
    • Fundamentos de Programación e Ingeniería de Software
    • Herramientas de IA para el trabajo
    • Matemáticas para Programación
    • Programación con Python
    • Programación con JavaScript
    • Programación con TypeScript
    • Programación Orientada a Objetos con Java
    • Desarrollo con C# y .NET
    • Programación con PHP
    • Programación con Go y Rust
    • Programación Móvil con Swift y Kotlin
    • Programación con C y C++
    • Administración Básica de Servidores Linux
  • Negocios
    • Fundamentos de Negocios y Emprendimiento
    • Estrategia y Crecimiento Empresarial
    • Finanzas Personales y Corporativas
    • Inversión en Mercados Financieros
    • Ventas, CRM y Experiencia del Cliente
    • Operaciones, Logística y E-commerce
    • Gestión de Proyectos y Metodologías Ágiles
    • Aspectos Legales y Cumplimiento
    • Habilidades Directivas y Crecimiento Profesional
    • Diversidad e Inclusión en el Entorno Laboral
    • Herramientas Digitales y Automatización para Negocios
  • Blockchain y Web3
    • Fundamentos de Blockchain y Web3
    • Desarrollo de Smart Contracts y dApps
    • Finanzas Descentralizadas (DeFi)
    • NFTs y Economía de Creadores
    • Seguridad Blockchain
    • Ecosistemas Blockchain Alternativos (No-EVM)
    • Producto, Marketing y Legal en Web3
  • Recursos Humanos
    • Fundamentos y Cultura Organizacional en RRHH
    • Atracción y Selección de Talento
    • Cultura y Employee Experience
    • Gestión y Desarrollo de Talento
    • Desarrollo y Evaluación de Liderazgo
    • Diversidad, Equidad e Inclusión
    • AI y Automatización en Recursos Humanos
    • Tecnología y Automatización en RRHH
  • Finanzas e Inversiones
    • Fundamentos de Finanzas Personales y Corporativas
    • Análisis y Valoración Financiera
    • Inversión y Mercados de Capitales
    • Finanzas Descentralizadas (DeFi) y Criptoactivos
    • Finanzas y Estrategia para Startups
    • Inteligencia Artificial Aplicada a Finanzas
    • Domina Excel
    • Financial Analyst
    • Conseguir trabajo en Finanzas e Inversiones
  • Startups
    • Fundamentos y Validación de Ideas
    • Estrategia de Negocio y Product-Market Fit
    • Desarrollo de Producto y Operaciones Lean
    • Finanzas, Legal y Fundraising
    • Marketing, Ventas y Growth para Startups
    • Cultura, Talento y Liderazgo
    • Finanzas y Operaciones en Ecommerce
    • Startups Web3 y Blockchain
    • Startups con Impacto Social
    • Expansión y Ecosistema Startup
  • Cloud Computing y DevOps
    • Fundamentos de Cloud y DevOps
    • Administración de Servidores Linux
    • Contenerización y Orquestación
    • Infraestructura como Código (IaC) y CI/CD
    • Amazon Web Services
    • Microsoft Azure
    • Serverless y Observabilidad
    • Certificaciones Cloud (Preparación)
    • Plataforma Cloud GCP

Platzi y comunidad

  • Platzi Business
  • Live Classes
  • Lanzamientos
  • Executive Program
  • Trabaja con nosotros
  • Podcast

Recursos

  • Manual de Marca

Soporte

  • Preguntas Frecuentes
  • Contáctanos

Legal

  • Términos y Condiciones
  • Privacidad
  • Tyc promociones
Reconocimientos
Reconocimientos
Logo reconocimientoTop 40 Mejores EdTech del mundo · 2024
Logo reconocimientoPrimera Startup Latina admitida en YC · 2014
Logo reconocimientoPrimera Startup EdTech · 2018
Logo reconocimientoCEO Ganador Medalla por la Educación T4 & HP · 2024
Logo reconocimientoCEO Mejor Emprendedor del año · 2024
De LATAM conpara el mundo
YoutubeInstagramLinkedInTikTokFacebookX (Twitter)Threads