Tony Wang7 min de lecturaCómo scrapear datos de MLB en 2026 (API y Python)
Consigue datos de MLB en 2026: Stats API no documentada, no-code o API estructurada, con ejemplos JSON reales y lo legal básico.
MLB ya tiene una forma gratuita de obtener datos de béisbol: una API JSON muy usada y sin key en statsapi.mlb.com que alimenta a MLB.com y está detrás de las populares librerías de Python MLB-StatsAPI y pybaseball de la comunidad. La trampa es que MLB nunca la ha publicado oficialmente — no hay portal para desarrolladores, ni changelog, ni garantía de que un campo no se mueva o desaparezca en el próximo deploy. Esta guía cubre ese endpoint no documentado, herramientas sin código y una API de MLB estructurada y documentada, además de lo que realmente dicen los Términos de Uso de MLB sobre reproducir y redistribuir sus datos.
¿Por qué scrapear datos de MLB?
Los datos de calendario, standings, roster y stats de MLB alimentan un conjunto reconocible de productos:
- Herramientas de fantasy baseball — rosters, stats de jugadores y calendarios de enfrentamientos para decisiones de alineación.
- Contexto de apuestas deportivas y cuotas — calendarios de partidos, resultados y standings junto a datos de cuotas de otras fuentes.
- Investigación histórica y analítica — splits de stats de liga y de jugadores por temporada para análisis de rendimiento.
- Apps de fans y medios — marcadores en vivo, widgets de standings y rastreadores de transacciones.
- Cobertura deportiva multi-liga — combina la profundidad específica de béisbol de MLB con los marcadores multideporte de ESPN o la cobertura de eventos en vivo de SofaScore para un pipeline de datos deportivos más amplio.
¿Es legal scrapear datos de MLB?
Opción 1: la propia Stats API no documentada de MLB (y por qué depender de ella es riesgoso)
statsapi.mlb.com no exige ninguna autenticación — sin API key, sin bearer token, solo un GET:
curl "https://statsapi.mlb.com/api/v1/schedule?sportId=1&date=2026-04-15"
# team lookups work the same way:
curl "https://statsapi.mlb.com/api/v1/teams?sportId=1"
Esto es real, es gratis, y es exactamente lo que llaman por debajo los paquetes de Python MLB-StatsAPI y pybaseball mantenidos por la comunidad — se usan mucho en proyectos de hobby y de analítica, y ambos dejan claro que son wrappers no oficiales y no afiliados sobre este mismo endpoint. Así que el planteamiento honesto no es "MLB no tiene API" — sí la tiene, y lleva años abierta y sin key. El problema es lo que "no documentada" te cuesta de verdad en producción:
- Nunca hay documentación oficial. Cada endpoint, parámetro y nombre de campo en circulación (
sportId,hydrate, las formas anidadasteams.home/teams.away) fue obtenido por terceros mediante ingeniería inversa, no publicado por MLB. - Sin changelog, sin garantía de estabilidad. Como no es un producto de desarrollador sancionado, MLB puede renombrar, reestructurar o eliminar campos entre deploys sin avisar a nadie que dependa de ellos.
- Sin rate limits publicados. No hay nada sobre lo que diseñar una estrategia de retry/backoff, más allá de prueba y error de la comunidad.
- La profundidad del esquema varía según la llamada. Recursos anidados como boxscores o jugada a jugada necesitan parámetros
hydrateque la documentación de la comunidad tuvo que averiguar por inspección, no a partir de una especificación. - Estás a un rediseño de MLB.com de tener un pipeline roto, sin canal de soporte al que preguntar qué cambió.
Opción 2: herramientas sin código
Los scrapers genéricos sin código y los actors de marketplace pueden traer el marcador de un solo día o una tabla de standings para una exportación puntual. En su mayoría envuelven por debajo los mismos endpoints no documentados de statsapi.mlb.com — así que heredan el mismo riesgo de schema drift que la Opción 1 — y no resuelven el problema de normalizar MLB junto a otras plataformas deportivas en un solo esquema.
Opción 3: una API de MLB estructurada (vía Crawlora)
Una API de MLB estructurada te da un esquema documentado y normalizado en vez de confiar en un endpoint que MLB podría reformar sin avisar — un único header de auth, JSON consistente, junto a otras plataformas deportivas como ESPN y SofaScore. Trae el calendario de un equipo:
curl -G "https://api.crawlora.net/api/v1/mlb/schedule" \
-H "x-api-key: $CRAWLORA_API_KEY" \
--data-urlencode "team_id=147" \
--data-urlencode "start_date=2026-04-01" \
--data-urlencode "end_date=2026-04-07"
{
"code": 200,
"data": {
"start_date": "2026-04-01",
"end_date": "2026-04-07",
"team_id": 147,
"total_games": 6,
"games": [],
"fetched_at": "2026-08-09T12:00:00Z",
"source_url": "https://statsapi.mlb.com/api/v1/schedule"
}
}
Luego trae stats de jugadores o equipos por id en Python (campos reales — revisa los docs para la forma completa de splits[]):
import requests
h = {"x-api-key": "YOUR_API_KEY"}
base = "https://api.crawlora.net/api/v1/mlb"
teams = requests.get(f"{base}/teams", headers=h, params={"season": 2026}).json()["data"]["teams"]
stats = requests.get(
f"{base}/player-stats", headers=h,
params={"id": 660271, "season": 2026, "group": "hitting"},
).json()["data"]
print(stats["player_id"], stats["season"], stats["group"], stats["total"])
Las stats a nivel de equipo siguen la misma forma (una respuesta real, vacía en pretemporada, del endpoint en vivo):
{
"code": 200,
"data": { "team_id": 147, "season": 2026, "group": "hitting", "splits": [] }
}
Los endpoints de roster, standings, transactions y detalle de partido siguen el mismo patrón de id-in, JSON-out: /mlb/team-roster (team_id, season, roster_type), /mlb/standings (season, type), /mlb/transactions (start_date, end_date, team_id, player_id) y /mlb/game / /mlb/game-boxscore / /mlb/game-play-by-play (id — un game_id de una respuesta de schedule o transactions). Guarda una fila por partido o por jugador-temporada y vuelve a ejecutarlo con un cronograma.
Qué puedes recolectar
Datos públicos de la MLB Stats API, normalizados: schedule (por fecha, rango de fechas o equipo, con total_games y un array games); standings (agrupados por temporada y tipo); teams (roster completo de la temporada de todas las franquicias); team roster (por equipo y temporada, con roster_type); detalle de jugador y stats de jugador (por id, temporada y grupo de stats — bateo, pitcheo, fildeo); stats de equipo (el mismo split de grupo/temporada a nivel de equipo); líderes de stats de toda la liga (league-stats, por temporada y grupo); detalle de partido, boxscore y jugada a jugada (por game_id, con plays[], linescore y decisions); y transactions (canjes, firmas y movimientos de roster por rango de fechas, equipo o jugador).
Limitaciones y desafíos comunes
- Dos superficies legales distintas. Los Términos de Uso de
mlb.comrigen el sitio web y su contenido;statsapi.mlb.comno tiene términos propios publicados — delimita con cuidado el uso comercial o a gran escala frente a las ToU reales de MLB, en vez de asumir que el acceso sin key significa uso sin restricciones. - El endpoint no documentado puede cambiar sin aviso. Si construyes directamente sobre
statsapi.mlb.com, presupuesta renombrados silenciosos de campos y la ausencia de un changelog que revisar. - Fan-out por id. Un registro de partido completo (boxscore, jugada a jugada, decisions) es una llamada por
game_id; una temporada entera de stats de jugadores implica iterar ids a partir de una respuesta de roster o búsqueda. - Los datos de pretemporada y entretemporada son escasos. Las respuestas de stat-split y schedule pueden devolver arrays vacíos legítimamente fuera de temporada, como se mostró arriba — eso no es una llamada rota.
- Solo datos públicos. Esto recolecta lo que MLB ya sirve a través de sus propios endpoints en vivo — nunca una forma de saltarse la licencia de MLB para la redistribución comercial de su contenido.
Dónde se usa esto
- Herramientas de fantasy baseball — decisiones de alineación y waivers a partir de rosters y splits de stats.
- Analítica e investigación — rendimiento histórico de jugadores y equipos por temporada.
- Dashboards de medios deportivos — marcadores en vivo, standings y feeds de transacciones.
- Productos deportivos multi-liga — la profundidad de béisbol de MLB junto a los marcadores multideporte de ESPN o la cobertura de eventos en vivo de SofaScore.
Fuentes
Empieza a recolectar
Pruébalo primero, gratis: pasa cualquier URL pública por el Free Web Scraper, o comprueba si un sitio bloquea bots con el Anti-Bot Checker — sin registro.
Prueba los endpoints de schedule, standings y player-stats en el Playground, revisa el esquema en los API docs y consulta los precios. ESPN es la mejor opción para marcadores y noticias multi-liga en varios deportes; MLB es la fuente más profunda y específica de béisbol cuando necesitas splits de stats de toda la temporada, rosters o jugada a jugada. SofaScore completa la cobertura de eventos en vivo para los deportes fuera del alcance propio de MLB. Del lado gaming del mismo hub cluster, how to scrape PlayStation Store cubre precios y ofertas del catálogo de consolas. Una vez que tengas el calendario, how to scrape Ticketmaster cubre el lado del mercado de entradas de esos mismos partidos. Consulta también how to choose a web scraping API y is web scraping legal.
Preguntas frecuentes
¿MLB tiene una API pública oficial?
No una de autoservicio y documentada. MLB opera en statsapi.mlb.com una API JSON gratuita y sin key que alimenta a MLB.com y que está detrás de librerías de la comunidad como MLB-StatsAPI y pybaseball — pero MLB nunca ha publicado documentación oficial, un changelog ni un portal para desarrolladores. Fue obtenida por ingeniería inversa de la comunidad, no ofrecida como producto oficial.
¿Es legal usar statsapi.mlb.com?
Es una pregunta distinta de los Términos de Uso de mlb.com, que restringen la reproducción o redistribución de MLB Digital Properties sin permiso por escrito. statsapi.mlb.com en sí no tiene términos publicados a los que un tercero pueda apelar. El uso no comercial y personal de datos que MLB ya sirve sin key es de bajo riesgo en la práctica; consigue tu propia opinión legal antes de construir algo comercial o a gran escala. Esto no es asesoría legal.
¿Puedo depender de statsapi.mlb.com para una app en producción?
Puedes, pero debes contar con el riesgo: no hay changelog, no hay SLA, y los campos pueden renombrarse o reestructurarse sin aviso porque MLB nunca se ha comprometido con un esquema estable para uso de terceros.
¿Qué datos obtengo a través de la MLB Stats API?
Schedule, standings, teams, team rosters, stats de jugadores y equipos por temporada y grupo (bateo/pitcheo/fildeo), líderes de stats de toda la liga, detalle de partido con boxscores y jugada a jugada, y transactions (canjes, firmas, movimientos de roster).
¿Cómo encuentro las stats de un jugador en concreto?
Resuelve el id de MLB del jugador a partir de una respuesta de team roster, y luego llama a player-stats con ese id, una temporada y un grupo de stats (por ejemplo, hitting o pitching).
¿La API cubre partidos que se están jugando en vivo?
Los endpoints de game y jugada a jugada devuelven el estado actual de un partido según game_id, incluyendo linescore y decisions — así que reflejan partidos en vivo o ya terminados según el momento en que los llames.
¿En qué se diferencia MLB de ESPN o SofaScore en esta serie?
ESPN y SofaScore cubren marcadores y standings de muchos deportes y ligas a la vez. La API estructurada de MLB va más a fondo en un solo deporte — splits de stats de toda la temporada, rosters y jugada a jugada — para productos que necesitan profundidad específica de béisbol en vez de amplitud multi-liga.