Tony Wang6 min de lecturaCómo scrapear SofaScore en 2026 (API y Python)
Scrapea SofaScore en 2026: marcadores, cuotas, alineaciones y clasificaciones con Python DIY, no-code o una API estructurada — y lo legal.
La forma más rápida de scrapear SofaScore en 2026 es llamar a una API estructurada que devuelve JSON normalizado — marcadores en vivo, detalles de partidos, alineaciones, cuotas, incidencias y clasificaciones — en lugar de hacer tú mismo ingeniería inversa de la API interna no documentada de SofaScore y de su protección de Cloudflare. Hacerlo por tu cuenta es posible, y existe una comunidad real de clientes no oficiales, pero SofaScore no publica ninguna API pública oficial y sus propios términos restringen el acceso automatizado. Esta guía cubre los tres enfoques, qué devuelve cada uno, dónde falla cada uno y los aspectos legales básicos.
¿Por qué scrapear SofaScore?
Los datos públicos de SofaScore alimentan toda una categoría de flujos de trabajo de datos deportivos:
- Monitoreo de marcadores en vivo y cuotas — sigue partidos en curso, marcadores y mercados de apuestas en fútbol, baloncesto y tenis.
- Investigación de equipos y jugadores — obtén plantillas, perfiles de equipo y el historial de partidos de un equipo en un solo lugar.
- Seguimiento de ligas y clasificaciones — sigue la posición en la tabla, la forma y los cambios de temporada a temporada.
- Analítica deportiva — alimenta estadísticas de partidos, alineaciones, incidencias e historial de enfrentamientos directos en un pipeline de análisis o predicción.
¿Es legal scrapear SofaScore?
Opción 1: hazlo tú mismo en Python (y por qué es más difícil de lo que parece)
No hay SDK oficial, así que hacerlo tú mismo implica llamar a la misma API interna que usan las propias apps de SofaScore:
import requests
resp = requests.get(
"https://api.sofascore.com/api/v1/search/all",
params={"q": "real madrid"},
)
data = resp.json() # frequently a Cloudflare 403 "challenge" page, not JSON
Funciona hasta que deja de funcionar, y el dolor recurrente está bien documentado por los clientes de la comunidad que hacen ingeniería inversa de esta API:
- Sin API oficial, sin garantía de estabilidad. SofaScore no publica una API pública para desarrolladores —
api.sofascore.comes la misma API interna no documentada que llaman sus apps web y móvil, y puede cambiar de forma o de reglas de acceso cada vez que SofaScore lanza una nueva versión de la app, sin changelog para desarrolladores externos. - El challenge de Cloudflare. Según la documentación del cliente Sofascore-API-Bundle, el edge de SofaScore responde a cualquier solicitud sin el header
X-Requested-Withcon un «challenge»403de Cloudflare. Superarlo de forma consistente también requiere un handshake TLS moderno — los stacks más antiguos son detectados por fingerprinting incluso desde una IP limpia — y, según la misma documentación, algunas IPs (ciertos rangos de datacenter, regiones geobloqueadas) reciben un403sin importar los headers. - Riesgo legal además de los obstáculos técnicos. El acceso automatizado y el scraping van en contra de los propios términos de SofaScore (ver arriba), independientemente de si tu cliente logra superar Cloudflare.
- Sin estructura una vez que entras. Una respuesta cruda refleja el esquema interno de la app de SofaScore, no un contrato público documentado — cada nombre de campo y cada decisión de anidamiento es algo que tienes que reverse-engineer y volver a parsear tú mismo si cambia.
Opción 2: herramientas sin código
Los extractores de navegador y los actors de marketplace tipo «SofaScore scraper» pueden exportar un solo partido o una tabla a CSV, lo cual está bien para algo puntual. Pero los marcadores en vivo y las cuotas cambian minuto a minuto, y seguir varios partidos a lo largo de una jornada es un pipeline de monitoreo, no una exportación única — ahí es donde gana una llamada a la API programada.
Opción 3: una API estructurada de SofaScore
La API de SofaScore de Crawlora expone endpoints documentados para búsqueda, eventos en vivo, detalles de partidos, cuotas, alineaciones, clasificaciones y más, devolviendo JSON normalizado con una sola API key.
curl -G "https://api.crawlora.net/api/v1/sofascore/search" \
-H "x-api-key: $CRAWLORA_API_KEY" \
--data-urlencode "q=real madrid"
Luego encadena búsqueda → detalle → cuotas/alineaciones en Python:
import requests
h = {"x-api-key": "YOUR_API_KEY"}
base = "https://api.crawlora.net/api/v1/sofascore"
# search resolves a team, player, or competition name to a numeric id
hits = requests.get(f"{base}/search", headers=h, params={"q": "real madrid"}).json()["data"]["results"]
event_id = 14025013 # from a search result's matches or the live-events endpoint
event = requests.get(f"{base}/event", headers=h, params={"id": event_id}).json()["data"]
odds = requests.get(f"{base}/event-odds", headers=h, params={"id": event_id}).json()["data"]
lineups = requests.get(f"{base}/event-lineups", headers=h, params={"id": event_id}).json()["data"]
Una respuesta de evento es JSON normalizado (los campos son ilustrativos — confirma el esquema en los docs):
{
"code": 200,
"msg": "OK",
"data": {
"event": {
"id": 14025013,
"slug": "bournemouth-liverpool",
"start_time": "2025-08-15T19:00:00Z",
"status": { "code": 100, "description": "Ended", "type": "finished" },
"tournament": { "id": 52, "name": "Premier League", "unique_tournament_id": 17 },
"home_team": { "id": 60, "name": "Bournemouth", "country": "England" },
"away_team": { "id": 44, "name": "Liverpool", "country": "England" },
"home_score": { "current": 2, "period1": 1, "period2": 1 },
"away_score": { "current": 4, "period1": 1, "period2": 3 },
"venue": { "name": "Vitality Stadium", "city": "Bournemouth", "capacity": 11307 }
}
}
}
Las clasificaciones y los eventos en vivo requieren sus propios parámetros obligatorios — un id de temporada (resuelto vía tournament-seasons) y una sport key, respectivamente:
standings = requests.get(f"{base}/standings", headers=h,
params={"id": 17, "season": 76986, "type": "total"}).json()["data"]
live = requests.get(f"{base}/live-events", headers=h, params={"sport": "football"}).json()["data"]
Guarda una fila por evento (o por snapshot de clasificación) con su timestamp fetched_at, y vuelve a ejecutarlo con una programación — hacer polling de live-events en intervalos es cómo sigues un partido mientras avanza.
Qué puedes recopilar
- Búsqueda universal entre equipos, jugadores y competiciones, cada uno con un id numérico, deporte y país
- Detalle del partido (evento): marcadores por período, estado, sede, árbitro y asistencia, además del torneo y la temporada a la que pertenece
- Estadísticas del evento, alineaciones (formación, once titular y suplentes), incidencias del partido (goles, tarjetas, sustituciones) e historial de enfrentamientos directos entre dos equipos
- Mercados de apuestas y cuotas por partido — solo informativo (ver sección legal)
- Perfiles de equipo y el historial de partidos y la plantilla de un equipo; perfiles de jugador
- Clasificaciones de liga (total, local, visitante) además de temporadas de torneo y el calendario ronda por ronda
- Eventos en vivo en curso por deporte (fútbol, baloncesto, tenis)
Limitaciones y desafíos comunes
- Sin API oficial de respaldo. Todo esto se basa por completo en la API interna de la app de SofaScore; cuando SofaScore la cambia, tanto el código DIY como cualquier scraper se adaptan después del hecho, no antes.
- Cloudflare más reputación de IP. Tener los headers correctos por sí solo no garantiza el acceso desde cualquier red — los rangos de datacenter y algunas geografías se bloquean directamente, según la documentación de clientes no oficiales citada arriba.
- Las cuotas son informativas, no un feed de apuestas. Los propios términos de SofaScore dicen que las cuotas que muestra son solo con fines informativos, no un servicio de apuestas ni asesoría legal o fiscal — trátalas como referencia de mercado, no como un feed de cuotas con licencia para un producto de apuestas.
- No es push ni tiempo real. «Live» aquí significa hacer polling del endpoint live-events con una programación; no hay un websocket ni un feed de streaming, así que elige un intervalo de polling que se ajuste a la velocidad real a la que necesitas que se actualice el marcador.
- Los season ids cambian. El id de temporada de una competición cambia cada año (por ejemplo, el id de temporada de la Premier League es distinto cada año) — resuélvelo de nuevo vía
tournament-seasonsen lugar de fijarlo en el código.
Fuentes
Dónde encaja esto
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.
Los datos de SofaScore alimentan dashboards de deportes en vivo, investigación de equipos y jugadores, y seguimiento de clasificaciones. Para marcadores, clasificaciones y plantillas centrados en EE. UU. en otras ligas, consulta la API de ESPN, y para una sola liga con toda la profundidad — calendarios, box scores y estadísticas de jugadores — consulta cómo scrapear la MLB. Una vez que tengas el calendario de partidos, cómo scrapear Ticketmaster cubre el mercado de entradas para esos mismos partidos. Para el interés de búsqueda y social alrededor de esos mismos partidos en lugar de los marcadores en sí, consulta qué buscó Estados Unidos tras la final del Mundial 2026. Para el conjunto de herramientas más amplio, consulta cómo elegir una API de web scraping, y para los aspectos legales básicos, es legal el web scraping en 2026.
Empieza probando el endpoint en el Playground, leyendo el esquema de request y response en los API docs, y revisando los costos en créditos en la página de precios.
Preguntas frecuentes
¿SofaScore tiene una API pública oficial?
No. SofaScore no publica una API pública para desarrolladores. Los datos provienen de una API interna no documentada (api.sofascore.com) que también usan sus propias apps web y móvil, y que proyectos de la comunidad han hecho ingeniería inversa — puede cambiar de forma o de reglas de acceso cada vez que SofaScore lanza una nueva versión de la app, sin changelog para desarrolladores externos.
¿Puedo scrapear SofaScore sin que me bloqueen?
Las solicitudes DIY a api.sofascore.com sin el header X-Requested-With reciben un «challenge» 403 de Cloudflare, y según la documentación de clientes de terceros, incluso los headers correctos no garantizan el acceso desde cualquier red — algunas IPs (ciertos rangos de datacenter, regiones geobloqueadas) igual reciben un 403. Una API estructurada se encarga de los headers, el TLS y el enrutamiento de IP detrás de una sola key.
¿Es legal scrapear SofaScore?
Los marcadores en vivo y las estadísticas de SofaScore son contenido web público, pero los propios términos de SofaScore prohíben el acceso automatizado o el scraping, tratan los datos como una base de datos protegida y restringen la Plataforma a uso personal y no comercial. Revisa los términos y la legislación de tu país antes de un uso comercial. No es asesoría legal.
¿Puedo usar las cuotas de SofaScore para un producto de apuestas?
No — los propios términos de SofaScore establecen que las cuotas de apuestas mostradas en la Plataforma son solo con fines informativos, no un servicio de apuestas ni asesoría legal o fiscal. Trata los datos de cuotas como referencia para investigación y análisis, no como un feed con licencia para un producto de apuestas.
¿Qué datos de SofaScore puedo recopilar?
Búsqueda universal entre equipos, jugadores y competiciones; detalles de partidos, estadísticas, alineaciones, incidencias e historial de enfrentamientos directos; cuotas de apuestas por partido; perfiles de equipo y jugador; clasificaciones de liga (total, local, visitante); temporadas de torneo y calendario ronda por ronda; y eventos en vivo en curso por deporte (fútbol, baloncesto, tenis).
¿Cómo encuentro el id de un equipo, jugador o evento?
Llama a /sofascore/search con un nombre en texto libre — la respuesta devuelve ids numéricos de tipo equipo, jugador o competición, junto con el deporte y el país. Para un partido concreto, obtén el historial de partidos de un equipo o el feed live-events en lugar de adivinar un id.
¿Con qué frecuencia puedo actualizar los marcadores en vivo?
El endpoint live-events devuelve los partidos en curso por deporte (fútbol, baloncesto, tenis) en el momento en que lo llamas — no hay un websocket ni un feed de streaming, así que elige un intervalo de polling que se ajuste a la velocidad real a la que necesitas que se actualice el marcador, dentro de tu plan y los límites de uso responsable.