Да, из браузера. Извините, если я не был достаточно ясен. Всё это происходит из другого веб-приложения: пользователь не авторизован, и встраивание Discourse через iframe отсутствует. Запрос исходит из браузера и передаёт API-ключ как параметр запроса.
Мое понимание API-ключей таково: как только у нас есть API-ключ пользователя, мы можем действовать от его имени из любого места, даже из консоли или терминала (через curl или аналогичные средства). Проблемы с CORS больше не возникают.