API агрегата клиента
Management API предоставляет customer-first профиль и сводку лицензий для сценариев Vendor Console. Tenant определяется только authenticated session или service account. Не передавайте Tenant ID в path, query или body.
Чтение профиля и лицензий
GET /api/v1/customers/organizations/{organizationId}/aggregate?licenseOffset=0&licenseLimit=50
Permission: customers.read
licenseOffset по умолчанию равен 0. licenseLimit по умолчанию равен 50
и принимает 1..200. Лицензии отсортированы от новых к старым со стабильным
tie-break по License ID. Archived, revoked, deprecated и migration-required
строки остаются видимыми.
Для каждой лицензии состояние Product разрешается явно:
Resolvedсодержит display name из каталога того же Tenant;MissingIdentityозначает отсутствие Product ID в строке BC-LIC;CatalogNotFoundозначает, что Product ID отсутствует в каталоге того же Tenant.
Ключ никогда не раскрывается. maskedKey присутствует только при
keyMaskStatus = Available; отсутствующие или неполные legacy metadata дают
null и явный статус.
Замена изменяемого профиля
PUT /api/v1/customers/organizations/{organizationId}/aggregate
Permission: customers.manage
Content-Type: application/json
{
"expectedRevision": 3,
"displayName": "Example Ltd",
"notes": "Заметки оператора",
"primaryContact": {
"contactId": null,
"displayName": "Jane Doe",
"email": "jane@example.test",
"phone": "+1 555 0100"
}
}
Успешный ответ содержит только committed profile. Отличающийся stale revision
возвращает customer_profile_revision_conflict; точный lost-result replay
сходится к committed state. После commit сервер не выполняет чтение License или
Product.
Ошибки и безопасность
Стабильные ошибки: customer_aggregate_invalid_request,
customer_aggregate_not_found, customer_primary_contact_not_found,
customer_profile_revision_conflict, customer_profile_not_editable и
customer_aggregate_dependency_unavailable. Ресурс другого Tenant неотличим
от отсутствующего. Plaintext keys, hashes, provider references и внутренние
License/Product codes в контракт не входят.