Por que o navegador bloqueia?
Uma página segue a política de mesma origem. Para fetch entre origens, o servidor de destino precisa autorizar o acesso com cabeçalhos CORS. Alguns métodos e cabeçalhos acionam primeiro uma requisição OPTIONS de pré-verificação. Se ela falhar, a requisição real pode nem ser enviada.
Qual é a diferença do cURL?
cURL não segue as regras CORS do navegador. Sucesso no terminal prova o acesso daquele computador, não que uma página pode ler a resposta. O navegador também controla Host e Cookie e pode bloquear HTTP inseguro a partir de uma página HTTPS.
Como investigar?
No painel Rede, inspecione a pré-verificação, Origin e os cabeçalhos de resposta. Confira Access-Control-Allow-Origin e os métodos e cabeçalhos permitidos. no-cors não resolve: a resposta se torna opaca e não pode ser examinada. Se a API não habilitar CORS, use um cliente local confiável ou um relay com proteção adequada.