Solución de problemas 8 min de lectura

Failed to Fetch: qué significa y cómo solucionarlo

¿Te sale "Failed to fetch" en una app, una web o tu propio código? No es tu internet ni un virus. Qué significa en español y cómo quitarlo en 2 minutos, paso a paso.

Shabnam Katoch

Shabnam Katoch

Growth Head

Ilustración: qué significa el error Failed to Fetch

¿Qué significa "Failed to Fetch"?

"Failed to fetch" significa que tu navegador, app o programa intentó conectarse a un servidor y no pudo. No es un virus. No es un problema de tu internet (casi nunca). Es un error de conexión entre dos sistemas.

Hay dos situaciones distintas. Elige la tuya:

→ Me sale en una app o página web (Instagram, ChatGPT, una tienda online, un juego, una app de banco) — saltar a esa sección

→ Me sale en mi propio código (JavaScript, Node.js, Python, un agente de IA) — saltar a esa sección

Me sale en una app o página web

No siempre estás depurando tu propio código. A veces el error aparece en ChatGPT, en OneDrive, en un formulario de pago, en una tienda online o en el panel de administración de una herramienta que usas todos los días. Ahí no puedes tocar el servidor, pero sí puedes descartar tu lado en un minuto.

Prueba en este orden:

  1. Recarga la página con Ctrl + Shift + R (Cmd + Shift + R en Mac). Fuerza al navegador a bajar todo de nuevo y salta la caché. Arregla más casos de los que parece.
  2. Abre la misma página en una ventana de incógnito. Si ahí funciona, el culpable es una extensión: un bloqueador de anuncios, una VPN del navegador o una extensión de privacidad. Desactívalas una por una hasta encontrarla.
  3. Cambia de red. Si estás en la wifi de la oficina o de la universidad, prueba con los datos del móvil. Los firewalls corporativos bloquean puertos y dominios sin avisar.
  4. Comprueba si el servicio está caído. Busca la app en DownDetector, o su nombre junto con "status" o "down". Si el fallo es de ellos, no hay nada que hacer en tu lado más que esperar 10-15 minutos.
  5. Si usas una app de escritorio o móvil, actualízala. Las versiones antiguas a veces apuntan a endpoints que ya no existen.

Si después de esto sigue fallando y solo te pasa a ti, borra las cookies de ese sitio y vuelve a iniciar sesión (te cerrará la sesión en ese sitio, nada más). Si les pasa a todos, el problema está en su servidor y lo mejor que puedes hacer es reportarlo con una captura de la consola.

Un caso muy común: "failed to fetch payment methods"

Aparece en pasarelas de pago cuando el navegador bloquea la petición al proveedor (Stripe, PayPal, MercadoPago). Casi siempre es un bloqueador de anuncios que filtra dominios de terceros. Desactívalo para ese sitio o paga desde incógnito.

Me sale en mi propio código

Son las once de la noche y llevas cuarenta minutos revisando el código de tu endpoint.

La consola solo dice esto:

TypeError: Failed to fetch

Y aquí está el detalle que casi todo el mundo pasa por alto. Esa distinción te ahorra la mitad del tiempo de depuración, porque cambia por completo dónde tienes que buscar.

Un 404 no lanza este error. Un 500 tampoco. Cuando el servidor responde, aunque responda mal, fetch() cumple su promesa sin problema y te deja un objeto Response con ok: false. El error que estás viendo es distinto: el navegador ni siquiera pudo entregar la petición, o se negó a dejarte leer la respuesta.

Así que deja de revisar tu controlador. El problema está antes.

Qué significa exactamente el error failed to fetch

fetch() devuelve una promesa. Esa promesa se rechaza con un TypeError únicamente en dos situaciones: cuando la petición no pudo salir o llegar, y cuando el navegador bloqueó tu acceso a la respuesta por política de seguridad.

Todo lo demás, cualquier código de estado entre 200 y 599, se resuelve correctamente.

Por eso este código te engaña:

const res = await fetch(url);
const data = await res.json(); // esto sí revienta con un 404

Si esperabas que fetch lanzara una excepción con un 404, no lo hace. Comprueba siempre res.ok antes de parsear.

Failed to fetch no es un error de tu backend. Es un error de que tu backend nunca se enteró.

Qué lanza TypeError Failed to fetch y qué no: CORS, red y cortes del navegador sí, 404 y 500 no

Las cinco causas más comunes y cómo solucionar cada una

Ordenadas por frecuencia real, no por orden alfabético.

1. CORS, el sospechoso número uno

Si tu petición sale de un origen y va hacia otro, el navegador exige permiso explícito del servidor. Sin la cabecera Access-Control-Allow-Origin correcta, el navegador descarta la respuesta y tú recibes Failed to fetch.

Lo confuso es que la petición sí llegó al servidor. Puedes verla en tus logs. El bloqueo ocurre después, en el navegador.

Cómo confirmarlo: abre la consola, no la pestaña de red. El mensaje de CORS aparece ahí, en rojo, con el origen exacto que fue rechazado. El TypeError es solo el eco.

La solución está en el servidor, siempre. Añade el origen a Access-Control-Allow-Origin, y si tu petición usa métodos distintos de GET o cabeceras personalizadas, asegúrate de responder también al preflight OPTIONS. Poner mode: "no-cors" en el cliente no arregla nada, solo te devuelve una respuesta opaca que no puedes leer.

CORS en tres pasos: la petición llega al servidor pero el navegador bloquea la respuesta

2. La URL, el puerto o el DNS

Menos glamuroso, igual de frecuente.

Un localhost:3000 cuando el servidor escucha en el 3001. Una variable de entorno vacía que deja la URL como undefined/api/users. Un dominio mal escrito. Un servicio que se cayó hace veinte minutos.

Prueba el mismo endpoint desde la terminal con curl. Si curl también falla, el problema no está en tu JavaScript y puedes cerrar el editor.

3. Contenido mixto

Tu página se sirve por HTTPS y tu petición apunta a http://. Los navegadores modernos bloquean eso sin preguntar.

Suele aparecer al pasar de desarrollo local a un entorno desplegado, y sorprende porque en local todo funcionaba.

La solución es servir el endpoint por HTTPS. Un certificado autofirmado en tu API tiene el mismo efecto: el navegador rechaza la conexión y tú ves Failed to fetch sin más pistas.

Errores de URL, puerto, DNS y contenido mixto que causan Failed to fetch

4. Algo entre tu navegador y la red

Un bloqueador de anuncios que filtra por patrón de URL. Una extensión de privacidad. Una VPN corporativa. Un firewall que no deja salir ese puerto.

Esta causa tiene una señal muy clara: funciona en ventana de incógnito con las extensiones desactivadas, o funciona en otro navegador, o funciona desde otra red.

Si tu URL contiene palabras como ads, track, analytics o pixel, un bloqueador la va a matar aunque tu endpoint sea completamente legítimo. Es más común de lo que parece.

5. La petición se interrumpió antes de terminar

Aquí hay que hilar fino, porque casi toda la web repite un dato falso.

Un AbortController no produce Failed to fetch. Cuando llamas a abort(), la promesa de fetch() se rechaza con un DOMException cuyo name es AbortError, no con un TypeError. Si le pasas un motivo, abort(motivo), se rechaza con ese valor. Y un timeout hecho con AbortSignal.timeout() se rechaza con otro DOMException distinto, de nombre TimeoutError.

Así que el componente de React que se desmonta y cancela la petición en el cleanup del useEffect te va a dar AbortError. Eso es una buena noticia: el error viene etiquetado, y distinguirlo es trivial.

try {
  const res = await fetch(url, { signal });
} catch (e) {
  if (e.name === 'AbortError') return;      // cancelación deliberada
  if (e.name === 'TimeoutError') return;    // AbortSignal.timeout()
  // aquí sí: TypeError "Failed to fetch"
}

Lo que sí produce Failed to fetch es que el navegador tire la conexión por su cuenta, sin que tu código cancele nada: el usuario recarga o navega a otra página a mitad de la llamada, cierra la pestaña, o el dispositivo pierde la red. En esos casos no hay AbortError que te avise, porque no hubo un abort(). Solo el TypeError genérico.

Es la causa más difícil de ver porque tu código es correcto. Simplemente dejó de existir la página que lo estaba ejecutando.

Cuándo es un problema de red y cuándo es de código

Tres comprobaciones, en este orden, y en menos de dos minutos sabes de qué lado está el problema.

  1. curl desde la terminal. Si falla, es red, servidor o URL, y no es tu JavaScript.
  2. Si curl funciona pero el navegador no, es casi con total seguridad CORS o contenido mixto. El navegador aplica reglas que curl ignora.
  3. Incógnito sin extensiones. Si ahí funciona, tienes un bloqueador o una extensión interfiriendo.

Si curl funciona y el navegador no, el problema es una política del navegador, no una caída del servidor.

Diagrama de decisión: curl, navegador e incógnito para localizar el fallo

Diagnóstico rápido

SituaciónCausa probableSolución
Sale en una app (Instagram, ChatGPT, etc.)Servidor de la app caídoEspera 10-15 min, revisa DownDetector
Sale al pagar en una tienda onlineBloqueo del banco o del antivirusPrueba otro navegador o desactiva VPN
Sale en todas las páginasTu red bloquea algoCambia de WiFi a datos móviles y prueba
Sale en mi código JavaScriptError de CORS o URL incorrectaRevisa la consola del navegador (F12)
Sale en Node.js / PythonDNS, SSL, o el servidor no respondePrueba con curl desde la terminal
Sale en un agente de IA (n8n, OpenClaw)API key inválida o endpoint caídoRevisa la key y el status del proveedor

El mismo error en Node.js: "fetch failed" no es "failed to fetch"

Aquí es donde mucha gente se pierde, sobre todo si trabaja con agentes de IA o servicios en el servidor.

En Node.js el mensaje es ligeramente distinto: TypeError: fetch failed. Y en Node no hay CORS, así que puedes descartar la causa número uno de inmediato.

Lo importante es que Node adjunta el motivo real en error.cause. Imprímelo:

catch (e) { console.error(e.cause); }

Ahí verás lo que de verdad pasó: ECONNREFUSED si nada escucha en ese puerto, ENOTFOUND si el DNS no resuelve, o un error de certificado si el TLS falló. Esa propiedad convierte un error genérico en un diagnóstico exacto.

Este es exactamente el caso que aparece cuando un agente local intenta hablar con Ollama y el servicio no está levantado. Lo explicamos a fondo en nuestra guía sobre el error fetch failed con Ollama, que cubre la configuración de host y puerto que casi siempre es la culpable.

Failed to fetch en el navegador frente a fetch failed en Node.js con error.cause

Failed to fetch en agentes de IA: n8n, MCP, OpenClaw y Ollama

Si el error te sale en un agente o una automatización, la causa casi siempre es una de estas.

OpenClaw y Ollama. El agente intenta hablar con Ollama en localhost:11434 y nadie responde: Ollama no está arrancado, escucha en otro host o puerto, o el agente corre dentro de Docker, donde localhost apunta al propio contenedor y no a tu máquina. Lo explicamos paso a paso en la guía del error fetch failed con Ollama.

n8n. Si n8n corre en Docker y Ollama (o cualquier API local) en tu máquina, localhost no funciona desde el contenedor. En la credencial de Ollama usa http://host.docker.internal:11434. Tienes todas las URLs correctas por entorno en nuestra guía de fetch failed y connection refused en Ollama.

MCP. Un cliente MCP que se conecta a un servidor remoto por HTTP devuelve fetch failed si la URL o el puerto del servidor están mal, o si el servidor no está levantado. Si el cliente corre en el navegador, como MCP Inspector, un servidor sin cabeceras CORS produce Failed to fetch aunque esté funcionando. Para ver qué llamada falla exactamente, consulta cómo depurar las llamadas a herramientas MCP.

API key inválida. Muchas APIs responden a una key incorrecta con un 401 sin cabeceras CORS. En el navegador, ese 401 no se ve como 401: se ve como Failed to fetch. Si todo lo demás está bien, revisa la key y la página de status del proveedor.

Un último apunte antes de que vuelvas a tu consola

Failed to fetch tiene mala fama por ser vago, pero en realidad es honesto. Te está diciendo la única cosa que sabe con certeza: la petición no completó el viaje.

Lo que no te dice es por qué, y eso no es un defecto de la API. Es que el navegador, por diseño de seguridad, no te cuenta los detalles de una petición que bloqueó. Si lo hiciera, cualquier página podría sondear tu red interna.

Así que el mensaje seguirá siendo genérico. La habilidad no está en descifrarlo, está en saber qué comprobar primero.

Si quieres dejar de mantener este tipo de errores por tu cuenta, empieza gratis en BetterClaw. Un agente y 100 créditos al mes, sin tarjeta. El plan Pro cuesta 49 dólares al mes por cinco agentes, conectores ilimitados y 90 días de memoria, con un 20 por ciento de descuento en el plan anual. Precios completos aquí.

Preguntas frecuentes

¿Cómo se traduce "failed to fetch" al español?

Literalmente, "error al obtener" o "no se pudo recuperar". Fetch significa "traer" o "ir a buscar", y en JavaScript es la función que hace peticiones a un servidor. El mensaje completo, TypeError: Failed to fetch, quiere decir que esa petición no llegó a completarse.

¿Qué significa el error failed to fetch?

Significa que la petición hecha con fetch() no llegó a completarse a nivel de red, o que el navegador bloqueó el acceso a la respuesta por una política de seguridad. No significa que el servidor devolviera un error, porque un 404 o un 500 se resuelven correctamente y hay que comprobarlos con res.ok.

¿Por qué me sale "failed to fetch" en una web que no es mía?

Porque la petición que hace esa web a su propio servidor se bloqueó en tu navegador o en tu red. Recarga forzando la caché, prueba en incógnito sin extensiones y cambia de red. Si sigue fallando para todo el mundo, el problema está en el servidor de la web y no en tu equipo.

¿En qué se diferencia de "fetch failed" en Node.js?

Es el mismo tipo de fallo pero en un entorno distinto y con un mensaje ligeramente distinto. En Node no existe CORS, así que esa causa queda descartada, y además el error incluye la propiedad error.cause con el motivo exacto, normalmente ECONNREFUSED, ENOTFOUND o un fallo de certificado.

¿Cómo soluciono un failed to fetch causado por CORS?

La solución siempre está en el servidor, no en el cliente. Añade el origen que hace la petición a la cabecera Access-Control-Allow-Origin y responde correctamente a la petición preflight OPTIONS si usas métodos distintos de GET o cabeceras personalizadas. Usar mode: "no-cors" no lo arregla, solo devuelve una respuesta opaca que no puedes leer.

¿Cuánto tiempo lleva identificar la causa?

Normalmente menos de dos minutos si sigues el orden correcto: prueba con curl, luego compara navegador contra terminal, y luego abre una ventana de incógnito sin extensiones. Esas tres comprobaciones separan un problema de red de uno de configuración del navegador antes de tocar una sola línea de código.

¿Es seguro ignorar este error con un try catch vacío?

No, y es un patrón que esconde caídas reales de servicio durante semanas. Como mínimo comprueba error.name en tu catch y descarta AbortError y TimeoutError antes de tratar el resto como fallo real, registra esos con contexto suficiente, e imprime error.cause si estás en Node. Un error silenciado no desaparece, solo se vuelve invisible hasta que un usuario lo reporta.

¿Un AbortController provoca "failed to fetch"?

No, y es la confusión más repetida sobre este error. Cuando llamas a abort(), fetch() rechaza con un DOMException cuyo name es AbortError, y si pasas un motivo con abort(motivo) rechaza con ese valor. Un timeout creado con AbortSignal.timeout() rechaza con un DOMException de nombre TimeoutError. Ninguno de los dos es un TypeError: Failed to fetch. Lo que sí produce ese TypeError es que el navegador corte la conexión por su cuenta: una recarga, una navegación a otra página o una pérdida de red a mitad de la petición.

¿Cansado de depurar?

BetterClaw se encarga de la configuración, OAuth y el despliegue. Tu agente está en marcha en 60 segundos.

Empieza gratis
Etiquetas:failed to fetch que significaque significa failed to fetchfailed to fetch significadofetch failed que significaerror failed to fetch solucionfailed to fetch corsfailed to fetch traduccionfailed to fetch en español
Share this article
Was this helpful?