Статус credential
«Чем я буду переводить?» — один вызов, четыре факта, ноль секретов.
GET /v1/providers/{provider_code}/credential-status отвечает на вопрос, который каждый UI перевода задаёт перед отправкой задачи: если я переведу этим провайдером прямо сейчас, чей ключ это выполнит?
{
"provider_code": "deepl_api",
"user_credentials_configured": true,
"organization_credentials_configured": null,
"platform_fallback_available": true,
"effective_credential_source": "user"
}
user_credentials_configured— у вас есть активный default для этого провайдера.organization_credentials_configured— он есть у вашей организации. Внимательно читайте три состояния:true(org-default существует),false(уровень существует для вас и провайдера, но credential нет),null(ваш токен безorg_id, или провайдер вообще не допускает уровень организации — уровня попросту нет).platform_fallback_available— существует активный платформенный default, и политика провайдера разрешает fallback на него.effective_credential_source— уровень, который resolve выбрал бы прямо сейчас:user,organization,platformилиnull(ничего не настроено — resolve упал бы сCREDENTIAL_NOT_CONFIGURED).
Почему это может вызвать любая роль
В отличие от инвентаря credentials организации, статус намеренно открыт каждой аутентифицированной роли §5.1, включая участников организации без менеджерской роли: он сообщает факты конфигурации, а не записи — никаких имён, идентификаторов, масок или таймстемпов чьих-либо credentials. member видит «у организации это закрыто», не видя, чем именно закрыто.
Видимость провайдеров следует правилам каталога (Vendors and Providers): провайдер, которого вы не видите, и здесь 404.
Управляйте своим UI по
effective_credential_source
null → предложите добавить ключ (сценарий 02); platform → работает из коробки, предложите «использовать свой ключ» как апгрейд; user/organization → покажите, чей ключ выполнит работу, и дайте продвинутым пользователям переключать default-записи (Defaults and Lifecycle).