Почему браузер блокирует запрос?
Веб-страница подчиняется политике одного источника. Для междоменных вызовов fetch целевой сервер должен разрешить доступ заголовками CORS. Некоторые методы и заголовки вызывают предварительный OPTIONS-запрос. Если проверка не прошла, основной запрос может не отправиться.
Чем отличается cURL?
На cURL не распространяются браузерные правила CORS. Успех в терминале показывает доступность адреса с данного компьютера, но не право страницы читать ответ. Браузер также управляет заголовками Host и Cookie и может блокировать небезопасный HTTP с HTTPS-страницы.
Как искать причину?
В панели Network проверьте предварительный запрос, Origin и заголовки ответа. Сравните Access-Control-Allow-Origin и разрешённые методы и заголовки с запросом. Режим no-cors не решает проблему: он возвращает непрозрачный ответ, из которого нельзя прочитать статус, заголовки и тело. При отсутствии CORS используйте доверенный локальный клиент или защищённый ретранслятор.