Пригласить команду
Пригласить участников по email с назначением групп, отозвать приглашение и добавить существующего пользователя в группу.
Регистрация в V3 Custody — только по приглашению. Вы приглашаете участника по email и сразу назначаете группы, в которые он попадёт при принятии; его доступ вытекает именно из этих групп. Про модель доступа — на страницах Аутентификация и Policy Engine.
Шаг 1. Создайте приглашение
POST /api/v1/invitations создаёт pending-приглашение со списком групп. Валидация: email свободен (нет пользователя и активного инвайта), все группы принадлежат Vault'у.
curl -X POST "[BASE_URL]/api/v1/invitations" \
-H "Authorization: Bearer $V3_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"vaultId": "VAULT_ID",
"email": "trader@acme.com",
"groups": ["POLICY_GROUP_ID"]
}'
const res = await fetch("[BASE_URL]/api/v1/invitations", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.V3_TOKEN}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
vaultId: "VAULT_ID",
email: "trader@acme.com",
groups: ["POLICY_GROUP_ID"],
}),
});
console.log(await res.json());
res = requests.post(
"[BASE_URL]/api/v1/invitations",
headers={"Authorization": f"Bearer {os.environ['V3_TOKEN']}"},
json={
"vaultId": "VAULT_ID",
"email": "trader@acme.com",
"groups": ["POLICY_GROUP_ID"],
},
)
print(res.json())
В ответ приходит созданный инвайт с token для magic-link.
Точные имена полей тела (здесь — vaultId, email, groups) сверьте со Справочником API на странице создания приглашения.
Шаг 2. Принятие приглашения
У инвайта есть token. Страница принятия читает его публичным эндпоинтом:
GET /api/v1/invitations/by-token/{token}— публичный, без авторизации (безопасность держится на энтропии токена). Показывает «You're invited to <vault> as <groups>»; для отозванных/принятых возвращает410 Gone.
При реальной регистрации принятие происходит автоматически: better-auth находит pending-инвайт по email, создаёт PolicyGroupMembership и помечает инвайт принятым. Для отладки есть POST /api/v1/invitations/accept-debug, который выполняет ту же логику для уже существующего пользователя.
Шаг 3. Управляйте приглашениями
GET /api/v1/vaults/{code}/invitations— список приглашений Vault'а.POST /api/v1/invitations/{id}/revoke— отозвать pending-инвайт.
Принятое приглашение отозвать нельзя — вместо этого уберите пользователя из групп.
Шаг 4. Роли — это группы
Права участника вытекают из групп, в которых он состоит — отдельных «скоупов» у токена нет. Чтобы добавить уже существующего пользователя в группу:
POST /api/v1/policy-groups— создать группу политик.POST /api/v1/policy-groups/{id}/members— добавить участника (userIdможет быть произвольной строкой — используется и для сервисов).
Убирание из группы снимает тот доступ, который она давала.