Быстрый старт
От нуля до сохранённого credential — токен, каталог, создание, статус — за четыре вызова.
Кратчайший полезный путь через сервис: аутентифицируйтесь, посмотрите, какие провайдеры существуют, сохраните ключ для одного из них и убедитесь, что платформа действительно будет им пользоваться.
Предварительные условия
- Базовый URL сервиса. Экспортируйте его один раз:
export CREDS_BASE=http://localhost:8000(или домен вашего развёртывания). - Токен пользовательской плоскости. В реальных окружениях это короткоживущий exchange-токен от identity-провайдера с
audience: provider-credentials-service— полный флоу описан в User Plane Tokens. Экспортируйте его:export TOKEN=....
Локальный шорткат: dev-режим аутентификации
Локально запущенный сервис с DEV_AUTH_ENABLED=true принимает identity-заголовки вместо JWT: X-Dev-User-Id: <любой канонический UUID> и X-Dev-Roles: user (плюс X-Dev-Org-Id/X-Dev-Org-Roles для контекста организации). Замените заголовок Authorization этими двумя в любом примере ниже. В production-сборках dev-аутентификация отклоняется.
1. Посмотрите, какие провайдеры существуют
Вызовите GET /v1/providers:
curl -s "$CREDS_BASE/v1/providers?category=mt" \
-H "Authorization: Bearer $TOKEN"
Каждый элемент несёт code — это идентификатор, под которым вы храните credentials. Выберите один, например deepl_api, и заберите его полную карточку через GET /v1/providers/{provider_code} — credential_schema в ответе точно скажет, какие секретные поля должен отправить следующий шаг. Подробности в Provider Schemas.
2. Сохраните credential
Вызовите POST /v1/credentials. Сервер берёт владельца из вашего токена — тело запроса никогда его не называет:
curl -s -X POST "$CREDS_BASE/v1/credentials" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"provider_code": "deepl_api",
"name": "My DeepL key",
"credentials": {"api_key": "your-secret-key"},
"make_default": true
}'
import httpx
CREDS_BASE = "http://localhost:8000"
headers = {"Authorization": f"Bearer {TOKEN}"}
r = httpx.post(f"{CREDS_BASE}/v1/credentials", headers=headers, json={
"provider_code": "deepl_api",
"name": "My DeepL key",
"credentials": {"api_key": "your-secret-key"},
"make_default": True,
})
assert r.status_code == 201, r.text
credential = r.json()
Ожидаемый 201: запись возвращается с masked_credentials (например, you***key) вместо секрета — ни один эндпоинт пользовательской плоскости никогда не возвращает plaintext (Personal Credentials). make_default: true сделал её вашей default-записью для deepl_api, так что resolve выберет именно её.
3. Убедитесь, чем воспользуется платформа
Вызовите GET /v1/providers/{provider_code}/credential-status:
curl -s "$CREDS_BASE/v1/providers/deepl_api/credential-status" \
-H "Authorization: Bearer $TOKEN"
Ожидаемо: "user_credentials_configured": true и "effective_credential_source": "user" — запросы на перевод от вашего имени будут работать на только что сохранённом ключе. Полное значение каждого поля (включая различие null и false на уровне организации) — в Credential Status.
Куда дальше
- Концепции за тем, что вы только что сделали: Core Concepts.
- Общий ключ на целую организацию: Organization Credentials.
- Исполняемая end-to-end версия этой страницы: сценарий cookbook 02.