K

tenants

테넌트·멤버·seat·그룹·email-domains·invite-links

테넌트(조직)와 멤버를 다루는 operation 모음이에요. 테넌트 단건 조회, 멤버 디렉터리·조직도 조회에 더해 멤버십을 완전히 삭제하는 관리자 op 가 있어요. 삭제(재가입 가능)와 비활성화(재가입까지 차단)는 다른 동작이라 골라 쓰는 기준이 중요해요. 멤버를 초대하고 정리하는 운영 흐름은 멤버 관리 가이드에서 볼 수 있어요.

5 operations — 테넌트·멤버·seat·그룹·email-domains·invite-links

GET /api/v1/tenants

tenantsGetApiV1Tenants

전체 테넌트 목록을 반환한다.

  • 호출 권한: platform_admin (RequirePlatformAdmin middleware — 일반 사용자는 403).
  • Phase 1: 페이징 미지원 — 응답은 항상 전체.
  • 부수 효과 없음 (read-only).
언어호출
node@ax-hub/sdk 미제공 — 운영 패키지 @ax-hub/admin-sdk@ax-hub/admin-sdk tenants.list 사용
goclient.Tenants().TenantsGetApiV1Tenants(ctx, axhub.OperationParams{PathParams: …, Query: …, Body: …})
javaclient.tenants().tenantsGetApiV1Tenants(pathParams, query, body) — 비동기: tenantsGetApiV1TenantsAsync(…) → CompletableFuture
kotlinclient.tenants.tenantsGetApiV1Tenants(pathParams, query, body) — suspend
pythonclient.tenants.tenants_get_api_v1_tenants(path_params=…, query=…, body=…) — AsyncAxHubClient 는 동일명 await
rubyclient.tenants.tenants_get_api_v1_tenants(path_params: …, query: …, body: …)
공통request("tenantsGetApiV1Tenants", pathParams, query, body)

응답 — 200 · 테넌트 목록

이름타입설명
itemsarray<object>
nextCursor (wire: next_cursor)string
totalinteger

에러 status: 401 403 500에러 처리

GET /api/v1/tenants/{tenantID}

tenantsGetApiV1TenantsByTenantID

테넌트 UUID 로 단건 조회 (id / slug / name / icon / description).

  • 호출 권한: 자기 테넌트 멤버만 (RequireTenantMemberOnPath). SaaS 격리 — 다른 테넌트 사용자에겐 조직 메타데이터도 노출 X.
  • path 의 tenantID 가 UUID 형식이 아니면 400.
  • 부수 효과 없음 (read-only).
언어호출
nodesdk.tenants.get(…) — 리소스 모델 — 인자·반환 타입은 패키지의 TypeScript 정의 참조
goclient.Tenants().TenantsGetApiV1TenantsByTenantID(ctx, axhub.OperationParams{PathParams: …, Query: …, Body: …})
javaclient.tenants().tenantsGetApiV1TenantsByTenantID(pathParams, query, body) — 비동기: tenantsGetApiV1TenantsByTenantIDAsync(…) → CompletableFuture
kotlinclient.tenants.tenantsGetApiV1TenantsByTenantID(pathParams, query, body) — suspend
pythonclient.tenants.tenants_get_api_v1_tenants_by_tenant_id(path_params=…, query=…, body=…) — AsyncAxHubClient 는 동일명 await
rubyclient.tenants.tenants_get_api_v1_tenants_by_tenant_id(path_params: …, query: …, body: …)
공통request("tenantsGetApiV1TenantsByTenantID", pathParams, query, body)

Path 파라미터pathParams 로 전달

이름타입설명
tenantID 필수string테넌트 UUID

응답 — 200 · 테넌트

이름타입설명
adminEmail (wire: admin_email)stringAdminEmail 은 가장 오래된 active tenant_admin 의 email (없으면 null). 관리 UI 의 owner 컬럼 표시용 — 결정적 단일 admin (created_at ASC) 으로 페이지로드 간 안정.
appCount (wire: app_count)integerAppCount 는 not-soft-deleted 앱의 수. enrich 불가 시 0.
createdAt (wire: created_at)stringCreatedAt 은 생성 시각.
deletedAt (wire: deleted_at)stringDeletedAt 은 soft delete 시각 (활성 테넌트는 null).
descriptionstringDescription 은 테넌트 설명 (없으면 null).
iconUrl (wire: icon_url)stringIconURL 은 테넌트 아이콘 이미지 URL (없으면 null).
idstringID 는 테넌트 UUID.
memberCount (wire: member_count)integerMemberCount 는 active 멤버십 (is_active=true) 의 수. enrich 불가 시 0.
namestringName 은 사람이 읽는 표시 이름.
slugstringSlug 는 URL 식별자. [a-z][a-z0-9_]*[a-z0-9] 패턴, 전 시스템에서 unique.
updatedAt (wire: updated_at)stringUpdatedAt 은 마지막 수정 시각.

에러 status: 400 401 403 404 500에러 처리

GET /api/v1/tenants/{tenantID}/members/directory

tenantsGetApiV1TenantsByTenantIDMembersDirectory

같은 테넌트의 활성 멤버 목록을 반환한다. admin 멤버 목록(/members)과 달리 관리 메타데이터는 제외하되 user_id·이름·이메일·아바타·역할·그룹을 노출 — 일반 멤버가 같은 조직 동료를 식별·연락·@mention 하는 용도 (spec 095 — 조직도와 이메일 노출 정책 통일).

  • 호출 권한: tenant_member (테넌트의 활성 멤버, RequireTenantMemberOnPath). 비-멤버/다른 테넌트는 403.
  • 활성 멤버만 (비활성 멤버·삭제된 사용자 row 는 제외).
  • Phase 1: 페이징 미지원 — 응답은 항상 전체.
  • 부수 효과 없음 (read-only).
언어호출
nodesdk.tenants.membersDirectory(…) — 리소스 모델 — 인자·반환 타입은 패키지의 TypeScript 정의 참조
goclient.Tenants().TenantsGetApiV1TenantsByTenantIDMembersDirectory(ctx, axhub.OperationParams{PathParams: …, Query: …, Body: …})
javaclient.tenants().tenantsGetApiV1TenantsByTenantIDMembersDirectory(pathParams, query, body) — 비동기: tenantsGetApiV1TenantsByTenantIDMembersDirectoryAsync(…) → CompletableFuture
kotlinclient.tenants.tenantsGetApiV1TenantsByTenantIDMembersDirectory(pathParams, query, body) — suspend
pythonclient.tenants.tenants_get_api_v1_tenants_by_tenant_id_members_directory(path_params=…, query=…, body=…) — AsyncAxHubClient 는 동일명 await
rubyclient.tenants.tenants_get_api_v1_tenants_by_tenant_id_members_directory(path_params: …, query: …, body: …)
공통request("tenantsGetApiV1TenantsByTenantIDMembersDirectory", pathParams, query, body)

Path 파라미터pathParams 로 전달

이름타입설명
tenantID 필수string테넌트 UUID

응답 — 200 · 조직원 디렉토리 (PII 축소)

이름타입설명
itemsarray<object>
nextCursor (wire: next_cursor)string
totalinteger

에러 status: 400 401 403 500에러 처리

DELETE /api/v1/tenants/{tenantID}/members/{membershipID}

tenantsDeleteApiV1TenantsByTenantIDMembersByMembershipID

멤버십 행을 물리 삭제한다 — 멤버 목록에서 사라진다 (spec 173). 비활성화(차단)와 별개 동작: 삭제된 사람은 재초대 또는 SSO 자동 가입으로 새 멤버로 재가입할 수 있다. 접근을 계속 막아야 하면 비활성화를 쓸 것 (행이 남아 재가입까지 차단).

  • 호출 권한: tenant_admin (RequireTenantAdminOnPath — 일반 멤버는 403).
  • 활성/비활성 무관하게 삭제 가능. 단 마지막 활성 admin 은 409 (last_admin).
  • 부수 효과: 감사 기록 (tenants.member_removed, emit-first — 기록 실패 시 삭제 중단), AXRouter 연동 테넌트면 라우터 deprovision 미러 (best-effort), 멤버 전용 에이전트는 회수 스윕이 자동 정리, 점유 좌석은 행 삭제로 반환.
  • spec 173 신규 표면 — SDK 릴리스에 순차 반영 중 (미포함 버전에서는 아래 이름의 메서드가 아직 없다).
언어호출
node미제공
goclient.Tenants().TenantsDeleteApiV1TenantsByTenantIDMembersByMembershipID(ctx, axhub.OperationParams{PathParams: …, Query: …, Body: …})
javaclient.tenants().tenantsDeleteApiV1TenantsByTenantIDMembersByMembershipID(pathParams, query, body) — 비동기: tenantsDeleteApiV1TenantsByTenantIDMembersByMembershipIDAsync(…) → CompletableFuture
kotlinclient.tenants.tenantsDeleteApiV1TenantsByTenantIDMembersByMembershipID(pathParams, query, body) — suspend
pythonclient.tenants.tenants_delete_api_v1_tenants_by_tenant_id_members_by_membership_id(path_params=…, query=…, body=…) — AsyncAxHubClient 는 동일명 await
rubyclient.tenants.tenants_delete_api_v1_tenants_by_tenant_id_members_by_membership_id(path_params: …, query: …, body: …)
공통request("tenantsDeleteApiV1TenantsByTenantIDMembersByMembershipID", pathParams, query, body)

Path 파라미터pathParams 로 전달

이름타입설명
tenantID 필수string테넌트 UUID
membershipID 필수string멤버십 UUID

응답 — 204 · 삭제 성공 (no content)

본문 없음 → SDK 는 빈 map {} 반환

에러 status: 400 401 403 404 409 500에러 처리

GET /api/v1/tenants/{tenantID}/org-directory

tenantsGetApiV1TenantsByTenantIDOrgDirectory

회사 IdP(Okta/Azure)가 SCIM 으로 밀어넣은 조직 구조를 부서(그룹)→인원으로 반환한다.

  • 호출 권한: tenant_member (자기 테넌트의 활성 멤버면 관리자 아니어도 열람). 다른 테넌트는 403.
  • 아직 로그인/가입하지 않은 인원도 미러 데이터 그대로 노출 (joined 플래그로 구분).
  • v1 은 테넌트의 모든 그룹을 부서로 표시. 어느 부서에도 없는 인원은 unassigned 로.
  • 표시 이름이 없으면 이메일로 폴백. 부수 효과 없음 (read-only).
언어호출
nodesdk.tenants.orgDirectory(…) — 리소스 모델 — 인자·반환 타입은 패키지의 TypeScript 정의 참조
goclient.Tenants().TenantsGetApiV1TenantsByTenantIDOrgDirectory(ctx, axhub.OperationParams{PathParams: …, Query: …, Body: …})
javaclient.tenants().tenantsGetApiV1TenantsByTenantIDOrgDirectory(pathParams, query, body) — 비동기: tenantsGetApiV1TenantsByTenantIDOrgDirectoryAsync(…) → CompletableFuture
kotlinclient.tenants.tenantsGetApiV1TenantsByTenantIDOrgDirectory(pathParams, query, body) — suspend
pythonclient.tenants.tenants_get_api_v1_tenants_by_tenant_id_org_directory(path_params=…, query=…, body=…) — AsyncAxHubClient 는 동일명 await
rubyclient.tenants.tenants_get_api_v1_tenants_by_tenant_id_org_directory(path_params: …, query: …, body: …)
공통request("tenantsGetApiV1TenantsByTenantIDOrgDirectory", pathParams, query, body)

Path 파라미터pathParams 로 전달

이름타입설명
tenantID 필수string테넌트 UUID

응답 — 200 · 부서별 조직도 + 미배정

이름타입설명
departmentsarray<object>Departments 는 테넌트의 모든 그룹(부서)과 소속 인원.
unassignedarray<object>Unassigned 는 어느 부서에도 속하지 않은 인원.

에러 status: 400 401 403 500에러 처리