¿Por qué bloquea el navegador?
Las páginas siguen la política del mismo origen. Para fetch entre orígenes, el servidor de destino debe permitir el acceso mediante cabeceras CORS. Ciertos métodos y cabeceras provocan una solicitud OPTIONS previa. Si esta falla, la solicitud real quizá nunca se envíe.
¿En qué se diferencia cURL?
cURL no está sujeto a CORS del navegador. Que funcione en una terminal demuestra acceso desde ese equipo, no que una página pueda leer la respuesta. El navegador controla Host y Cookie, y puede bloquear HTTP inseguro desde una página HTTPS.
¿Cómo investigar?
En la pestaña Red, revisa la solicitud previa, Origin y las cabeceras de respuesta. Comprueba Access-Control-Allow-Origin y los métodos y cabeceras permitidos. no-cors no soluciona el problema: produce una respuesta opaca cuyo estado y contenido no se pueden leer. Si la API no permite CORS, usa un cliente local confiable o un relay protegido.