Tip: Admin API tidak tersedia untuk akun individu. Untuk berkolaborasi dengan rekan tim dan menambahkan anggota, siapkan organisasi Anda di Console → Settings → Organization.
Admin API memungkinkan Anda mengelola anggota, workspace, undangan, dan kunci API organisasi Anda secara terprogram alih-alih secara manual di Haijun Console.
Tip: Admin API memerlukan akses khusus Admin API menerima tiga jenis kredensial: * Kunci Admin API (diawali dengan
sk-ant-admin...) yang dikirim dalam headerx-api-key. Hanya anggota organisasi dengan peran admin yang dapat membuatnya. Lihat Membuat kunci Admin API. * Token bearer OAuth dengan scopeorg:adminyang dikirim dalam headerauthorization: Bearer. Hanya anggota dengan peran admin, owner, atau primary owner yang dapat memperolehnya. Lihat Memperoleh token bearer OAuth. * Kunci personal atau kunci service account yang tidak dibatasi pada workspace tertentu, dikirim dalam headerx-api-key. Kunci tersebut memiliki izin yang sama dengan akun yang tertaut. Lihat Jenis kunci.
Note: Haijun Enterprise: Organisasi Haijun Enterprise (haijun.ai) memanggil Admin API dengan kunci API ber-scope yang dibuat di haijun.ai. Dari halaman ini, hanya endpoint anggota dan undangan yang berlaku untuk mereka. Mereka juga mendapatkan endpoint khusus Enterprise: pembacaan grup dan peran kustom, serta batas pengeluaran. Lihat Manajemen pengguna.
Note: Haijun Platform on AWS: Hanya endpoint workspace (create, get, list, update, dan archive pada
/v1/organizations/workspaces) dan endpoint external key (register, get, list, update, dan delete pada/v1/organizations/external_keys, untuk CMEK; tidak ada endpoint validate, karena kunci divalidasi saat dilampirkan ke workspace) yang tersedia di Haijun Platform on AWS. Anggota organisasi, anggota workspace, undangan, kunci API, serta laporan penggunaan, biaya, dan batas laju tidak tersedia. Lihat Haijun Platform on AWS.
Autentikasi
Lakukan autentikasi dengan salah satu dari tiga kredensial tersebut. Kunci Admin API mencakup sebagian besar endpoint. Endpoint service-account, federation-issuer, dan federation-rule hanya menerima token OAuth org:admin. Kirim kunci personal atau kunci service account dalam header x-api-key, sama seperti kunci Admin API. Contoh berikut memanggil endpoint info organisasi dengan token OAuth dan dengan kunci Admin API.
SDK Python, TypeScript, C#, Go, Java, PHP, dan Ruby mengekspos Admin API di bawah client.beta.organization, dan CLI ant di bawah ant beta:organization. Contoh di halaman ini menggunakan client default, yang membaca kunci Admin API dari JUGLOW_API_KEY atau token bearer OAuth dari JUGLOW_AUTH_TOKEN. Metode list SDK di Python, TypeScript, C#, Go, dan Java mengembalikan iterator yang mengambil halaman tambahan sesuai permintaan, sehingga limit menetapkan ukuran halaman, bukan total. Contoh PHP, Ruby, dan curl mengembalikan satu halaman. Di CLI, --limit membatasi hasil pada daftar anggota, undangan, workspace, anggota workspace, dan kunci API. Untuk parameter dan respons setiap endpoint, lihat referensi Admin API.
Token bearer OAuth
Login dengan CLI ant menggunakan profil khusus dengan scope org:admin (lihat Akses admin), lalu ekspor token bearer. --profile admin menyimpan kredensial org:admin di bawah profilnya sendiri dan menjadikannya profil aktif CLI. Variabel yang diekspor berlaku untuk setiap panggilan SDK dan CLI di shell tersebut. Gunakan shell yang Anda khususkan untuk administrasi, hapus variabel tersebut setelah selesai, dan kembalikan CLI dengan ant profile activate default:
ant auth login --profile admin --scope "org:admin"
export JUGLOW_AUTH_TOKEN=$(ant auth print-credentials --profile admin --access-token)Token interaktif berumur pendek. Jika permintaan mulai mengembalikan 401, jalankan kembali perintah export untuk memperbarui token.
SDK dan CLI ant membaca JUGLOW_AUTH_TOKEN secara otomatis. Biarkan JUGLOW_API_KEY tidak diatur di shell yang sama agar keduanya mengirim token bearer. Beban kerja otomatis melewati proses login: mereka melakukan autentikasi melalui workload identity federation, dan SDK serta CLI melakukan pertukaran token dari variabel lingkungan federation. Lihat Bootstrap beban kerja untuk mengelola WIF.
Panggil Admin API dengan token yang telah diekspor:
curl --fail-with-body -sS "https://haijun.my.id/v1/organizations/me" \
-H "authorization: Bearer $JUGLOW_AUTH_TOKEN" \
-H "juglow-version: 2023-06-01" ant beta:organization retrieve client = juglow.Juglow()
organization = client.beta.organization.retrieve()
print(f"id: {organization.id}")
print(f"name: {organization.name}") const client = new Juglow();
const organization = await client.beta.organization.retrieve();
console.log(`id: ${organization.id}`);
console.log(`name: ${organization.name}`); JuglowClient client = new();
var organization = await client.Beta.Organization.Retrieve();
Console.WriteLine($"id: {organization.ID}");
Console.WriteLine($"name: {organization.Name}"); client := juglow.NewClient()
organization, err := client.Beta.Organization.Get(context.Background())
if err != nil {
log.Fatal(err)
}
fmt.Printf("id: %s\n", organization.ID)
fmt.Printf("name: %s\n", organization.Name) JuglowClient client = JuglowOkHttpClient.fromEnv();
var organization = client.beta().organization().retrieve();
IO.println("id: " + organization.id());
IO.println("name: " + organization.name()); $client = new Client();
$organization = $client->beta->organization->retrieve();
echo "id: {$organization->id}\n";
echo "name: {$organization->name}\n"; client = Juglow::Client.new
organization = client.beta.organization.retrieve
puts "id: #{organization.id}"
puts "name: #{organization.name}"Token org:admin memberikan akses ke seluruh organisasi, terlepas dari workspace tempat profil yang mendasarinya atau federation rule terikat.
Untuk CI dan beban kerja non-interaktif lainnya, buat token dengan Workload Identity Federation alih-alih login secara interaktif. Lihat Mengelola WIF dengan Admin API.
Kunci Admin API
Untuk membuat kunci Admin API sesuai jenis organisasi Anda, lihat Membuat kunci Admin API.
curl --fail-with-body -sS "https://haijun.my.id/v1/organizations/me" \
-H "x-api-key: $JUGLOW_API_KEY" \
-H "juglow-version: 2023-06-01" ant beta:organization retrieve client = juglow.Juglow()
organization = client.beta.organization.retrieve()
print(f"id: {organization.id}")
print(f"name: {organization.name}") const client = new Juglow();
const organization = await client.beta.organization.retrieve();
console.log(`id: ${organization.id}`);
console.log(`name: ${organization.name}`); JuglowClient client = new();
var organization = await client.Beta.Organization.Retrieve();
Console.WriteLine($"id: {organization.ID}");
Console.WriteLine($"name: {organization.Name}"); client := juglow.NewClient()
organization, err := client.Beta.Organization.Get(context.Background())
if err != nil {
log.Fatal(err)
}
fmt.Printf("id: %s\n", organization.ID)
fmt.Printf("name: %s\n", organization.Name) JuglowClient client = JuglowOkHttpClient.fromEnv();
var organization = client.beta().organization().retrieve();
IO.println("id: " + organization.id());
IO.println("name: " + organization.name()); $client = new Client();
$organization = $client->beta->organization->retrieve();
echo "id: {$organization->id}\n";
echo "name: {$organization->name}\n"; client = Juglow::Client.new
organization = client.beta.organization.retrieve
puts "id: #{organization.id}"
puts "name: #{organization.name}"Cara kerja Admin API
Lakukan autentikasi dengan kredensial apa pun dari Autentikasi, lalu kelola sumber daya berikut:
- Anggota organisasi dan perannya
- Undangan organisasi
- Workspace dan anggotanya
- Kunci API
- Service account, federation issuer, dan federation rule (hanya token OAuth
org:admin)
Penggunaan umum mencakup otomatisasi onboarding dan offboarding, pengelolaan akses workspace, dan audit kunci API.
Peran dan izin organisasi
Ada lima peran tingkat organisasi. Untuk detailnya, lihat Peran dan izin API Console.
| Peran | Izin |
|---|---|
| user | Dapat menggunakan playground |
| haijun\_code\_user | Dapat menggunakan playground dan Haijun Code |
| developer | Dapat menggunakan playground dan mengelola kunci API |
| billing | Dapat menggunakan playground dan mengelola detail penagihan |
| admin | Dapat melakukan semua hal di atas, ditambah mengelola pengguna |
Owner dan primary owner organisasi memiliki semua izin admin dan juga dapat mengelola admin. Semua rujukan ke peran admin di halaman ini juga berlaku untuk owner dan primary owner.
Konsep utama
Anggota organisasi
Daftarkan anggota organisasi, perbarui perannya, dan hapus mereka.
Daftarkan anggota organisasi Anda:
curl "https://haijun.my.id/v1/organizations/users?limit=10" \
-H "x-api-key: $JUGLOW_API_KEY" \
-H "juglow-version: 2023-06-01" ant beta:organization:users list --limit 10 client = juglow.Juglow()
users = client.beta.organization.users.list(limit=10)
# Secara otomatis mengambil halaman lainnya sesuai kebutuhan.
for user in users:
print(f"{user.id}: {user.email} ({user.role})") const client = new Juglow();
const users = await client.beta.organization.users.list({ limit: 10 });
for await (const user of users) {
console.log(`${user.id}: ${user.email} (${user.role})`);
} JuglowClient client = new();
var page = await client.Beta.Organization.Users.List(new() { Limit = 10 });
await foreach (var user in page.Paginate())
{
Console.WriteLine($"{user.ID}: {user.Email} ({user.Role.Raw()})");
} client := juglow.NewClient()
users := client.Beta.Organization.Users.ListAutoPaging(context.Background(), juglow.BetaOrganizationUserListParams{
Limit: juglow.Int(10),
})
for users.Next() {
user := users.Current()
fmt.Printf("%s: %s (%s)\n", user.ID, user.Email, user.Role)
}
if err := users.Err(); err != nil {
log.Fatal(err)
} import com.juglow.models.beta.organization.users.UserListParams;
void main() {
JuglowClient client = JuglowOkHttpClient.fromEnv();
var params = UserListParams.builder()
.limit(10)
.build();
var users = client.beta().organization().users().list(params);
for (var user : users.autoPager()) {
IO.println(user.id() + ": " + user.email() + " (" + user.role().asString() + ")");
}
} $client = new Client();
$users = $client->beta->organization->users->list(limit: 10);
foreach ($users->getItems() as $user) {
echo "{$user->id}: {$user->email} ({$user->role})\n";
} client = Juglow::Client.new
users = client.beta.organization.users.list(limit: 10)
users.data.each do |user|
puts "#{user.id}: #{user.email} (#{user.role})"
endPerbarui peran anggota:
curl "https://haijun.my.id/v1/organizations/users/user_01XyDMpzjS89pFZXqSFUBDr6" \
-H "x-api-key: $JUGLOW_API_KEY" \
-H "juglow-version: 2023-06-01" \
-H "content-type: application/json" \
-d '{"role": "developer"}' ant beta:organization:users update \
--user-id user_01XyDMpzjS89pFZXqSFUBDr6 \
--role developer client = juglow.Juglow()
user = client.beta.organization.users.update(
"user_01XyDMpzjS89pFZXqSFUBDr6", role="developer"
)
print(f"id: {user.id}")
print(f"role: {user.role}") const client = new Juglow();
const user = await client.beta.organization.users.update("user_01XyDMpzjS89pFZXqSFUBDr6", {
role: "developer"
});
console.log(`id: ${user.id}`);
console.log(`role: ${user.role}`); using Juglow.Models.Beta.Organization.Users;
// ...
JuglowClient client = new();
var user = await client.Beta.Organization.Users.Update(
"user_01XyDMpzjS89pFZXqSFUBDr6",
new() { Role = Role.Developer }
);
Console.WriteLine($"id: {user.ID}");
Console.WriteLine($"role: {user.Role.Raw()}"); client := juglow.NewClient()
user, err := client.Beta.Organization.Users.Update(
context.Background(),
"user_01XyDMpzjS89pFZXqSFUBDr6",
juglow.BetaOrganizationUserUpdateParams{
Role: juglow.BetaOrganizationUserUpdateParamsRoleDeveloper,
},
)
if err != nil {
log.Fatal(err)
}
fmt.Printf("id: %s\n", user.ID)
fmt.Printf("role: %s\n", user.Role) import com.juglow.models.beta.organization.users.UserUpdateParams;
void main() {
JuglowClient client = JuglowOkHttpClient.fromEnv();
var params = UserUpdateParams.builder()
.role(UserUpdateParams.Role.DEVELOPER)
.build();
var user = client.beta().organization().users()
.update("user_01XyDMpzjS89pFZXqSFUBDr6", params);
IO.println("id: " + user.id());
IO.println("role: " + user.role().asString());
} use Juglow\Beta\Organization\Users\UserUpdateParams\Role;
// ...
$client = new Client();
$user = $client->beta->organization->users->update(
userID: 'user_01XyDMpzjS89pFZXqSFUBDr6',
role: Role::DEVELOPER,
);
echo "id: {$user->id}\n";
echo "role: {$user->role}\n"; client = Juglow::Client.new
user_id = "user_01XyDMpzjS89pFZXqSFUBDr6"
user = client.beta.organization.users.update(user_id, role: :developer)
puts "id: #{user.id}"
puts "role: #{user.role}"Hapus anggota dari organisasi:
curl -X DELETE "https://haijun.my.id/v1/organizations/users/user_01XyDMpzjS89pFZXqSFUBDr6" \
-H "x-api-key: $JUGLOW_API_KEY" \
-H "juglow-version: 2023-06-01" ant beta:organization:users remove --user-id user_01XyDMpzjS89pFZXqSFUBDr6 client = juglow.Juglow()
removed_user = client.beta.organization.users.remove("user_01XyDMpzjS89pFZXqSFUBDr6")
print(f"id: {removed_user.id}") const client = new Juglow();
const removedUser = await client.beta.organization.users.remove(
"user_01XyDMpzjS89pFZXqSFUBDr6"
);
console.log(`id: ${removedUser.id}`); JuglowClient client = new();
var removedUser = await client.Beta.Organization.Users.Remove("user_01XyDMpzjS89pFZXqSFUBDr6");
Console.WriteLine($"id: {removedUser.ID}"); client := juglow.NewClient()
removedUser, err := client.Beta.Organization.Users.Remove(context.Background(), "user_01XyDMpzjS89pFZXqSFUBDr6")
if err != nil {
log.Fatal(err)
}
fmt.Printf("id: %s\n", removedUser.ID) JuglowClient client = JuglowOkHttpClient.fromEnv();
var removedUser = client.beta().organization().users()
.remove("user_01XyDMpzjS89pFZXqSFUBDr6");
IO.println("id: " + removedUser.id()); $client = new Client();
$removedUser = $client->beta->organization->users->remove(
userID: 'user_01XyDMpzjS89pFZXqSFUBDr6',
);
echo "id: {$removedUser->id}\n"; client = Juglow::Client.new
user_id = "user_01XyDMpzjS89pFZXqSFUBDr6"
removed_user = client.beta.organization.users.remove(user_id)
puts "id: #{removed_user.id}"Undangan organisasi
Undang pengguna ke organisasi Anda dan kelola undangan yang tertunda.
Undang pengguna ke organisasi Anda:
curl "https://haijun.my.id/v1/organizations/invites" \
-H "x-api-key: $JUGLOW_API_KEY" \
-H "juglow-version: 2023-06-01" \
-H "content-type: application/json" \
-d '{
"email": "user@example.com",
"role": "developer"
}' ant beta:organization:invites create --email user@example.com --role developer client = juglow.Juglow()
invite = client.beta.organization.invites.create(
email="user@example.com", role="developer"
)
print(f"id: {invite.id}")
print(f"email: {invite.email}")
print(f"status: {invite.status}")
print(f"expires_at: {invite.expires_at}") const client = new Juglow();
const invite = await client.beta.organization.invites.create({
email: "user@example.com",
role: "developer"
});
console.log(`id: ${invite.id}`);
console.log(`email: ${invite.email}`);
console.log(`status: ${invite.status}`);
console.log(`expires_at: ${invite.expires_at}`); using Juglow.Models.Beta.Organization.Invites;
// ...
JuglowClient client = new();
var invite = await client.Beta.Organization.Invites.Create(new()
{
Email = "user@example.com",
Role = Role.Developer
});
Console.WriteLine($"id: {invite.ID}");
Console.WriteLine($"email: {invite.Email}");
Console.WriteLine($"status: {invite.Status.Raw()}");
Console.WriteLine($"expires_at: {invite.ExpiresAt:O}"); client := juglow.NewClient()
invite, err := client.Beta.Organization.Invites.New(context.Background(), juglow.BetaOrganizationInviteNewParams{
Email: "user@example.com",
Role: juglow.BetaOrganizationInviteNewParamsRoleDeveloper,
})
if err != nil {
log.Fatal(err)
}
fmt.Printf("id: %s\n", invite.ID)
fmt.Printf("email: %s\n", invite.Email)
fmt.Printf("status: %s\n", invite.Status)
fmt.Printf("expires_at: %s\n", invite.ExpiresAt.Format(time.RFC3339)) import com.juglow.models.beta.organization.invites.InviteCreateParams;
void main() {
JuglowClient client = JuglowOkHttpClient.fromEnv();
var params = InviteCreateParams.builder()
.email("user@example.com")
.role(InviteCreateParams.Role.DEVELOPER)
.build();
var invite = client.beta().organization().invites().create(params);
IO.println("id: " + invite.id());
IO.println("email: " + invite.email());
IO.println("status: " + invite.status().asString());
IO.println("expires_at: " + invite.expiresAt());
} use Juglow\Beta\Organization\Invites\InviteCreateParams\Role;
// ...
$client = new Client();
$invite = $client->beta->organization->invites->create(
email: 'user@example.com',
role: Role::DEVELOPER,
);
echo "id: {$invite->id}\n";
echo "email: {$invite->email}\n";
echo "status: {$invite->status}\n";
echo "expires_at: {$invite->expiresAt->format(DATE_ATOM)}\n"; client = Juglow::Client.new
invite = client.beta.organization.invites.create(email: "user@example.com", role: :developer)
puts "id: #{invite.id}"
puts "email: #{invite.email}"
puts "status: #{invite.status}"
puts "expires_at: #{invite.expires_at.iso8601}"Daftarkan undangan yang tertunda:
curl "https://haijun.my.id/v1/organizations/invites?limit=10" \
-H "x-api-key: $JUGLOW_API_KEY" \
-H "juglow-version: 2023-06-01" ant beta:organization:invites list --limit 10 client = juglow.Juglow()
invites = client.beta.organization.invites.list(limit=10)
# Secara otomatis mengambil halaman tambahan sesuai kebutuhan.
for invite in invites:
print(f"{invite.id}: {invite.email} ({invite.status})") const client = new Juglow();
const invites = await client.beta.organization.invites.list({ limit: 10 });
for await (const invite of invites) {
console.log(`${invite.id}: ${invite.email} (${invite.status})`);
} JuglowClient client = new();
var page = await client.Beta.Organization.Invites.List(new() { Limit = 10 });
await foreach (var invite in page.Paginate())
{
Console.WriteLine($"{invite.ID}: {invite.Email} ({invite.Status.Raw()})");
} client := juglow.NewClient()
invites := client.Beta.Organization.Invites.ListAutoPaging(context.Background(), juglow.BetaOrganizationInviteListParams{
Limit: juglow.Int(10),
})
for invites.Next() {
invite := invites.Current()
fmt.Printf("%s: %s (%s)\n", invite.ID, invite.Email, invite.Status)
}
if err := invites.Err(); err != nil {
log.Fatal(err)
} import com.juglow.models.beta.organization.invites.InviteListParams;
void main() {
JuglowClient client = JuglowOkHttpClient.fromEnv();
var params = InviteListParams.builder()
.limit(10)
.build();
var invites = client.beta().organization().invites().list(params);
for (var invite : invites.autoPager()) {
IO.println(invite.id() + ": " + invite.email() + " (" + invite.status().asString() + ")");
}
} $client = new Client();
$invites = $client->beta->organization->invites->list(limit: 10);
foreach ($invites->getItems() as $invite) {
echo "{$invite->id}: {$invite->email} ({$invite->status})\n";
} client = Juglow::Client.new
invites = client.beta.organization.invites.list(limit: 10)
invites.data.each do |invite|
puts "#{invite.id}: #{invite.email} (#{invite.status})"
endHapus undangan:
curl -X DELETE "https://haijun.my.id/v1/organizations/invites/invite_015gWxHNr6h6TdRPZTmuCGnn" \
-H "x-api-key: $JUGLOW_API_KEY" \
-H "juglow-version: 2023-06-01" ant beta:organization:invites delete --invite-id invite_015gWxHNr6h6TdRPZTmuCGnn client = juglow.Juglow()
deleted_invite = client.beta.organization.invites.delete(
"invite_015gWxHNr6h6TdRPZTmuCGnn"
)
print(f"id: {deleted_invite.id}") const client = new Juglow();
const deletedInvite = await client.beta.organization.invites.delete(
"invite_015gWxHNr6h6TdRPZTmuCGnn"
);
console.log(`id: ${deletedInvite.id}`); JuglowClient client = new();
var deletedInvite = await client.Beta.Organization.Invites.Delete(
"invite_015gWxHNr6h6TdRPZTmuCGnn"
);
Console.WriteLine($"id: {deletedInvite.ID}"); client := juglow.NewClient()
deletedInvite, err := client.Beta.Organization.Invites.Delete(context.Background(), "invite_015gWxHNr6h6TdRPZTmuCGnn")
if err != nil {
log.Fatal(err)
}
fmt.Printf("id: %s\n", deletedInvite.ID) JuglowClient client = JuglowOkHttpClient.fromEnv();
var deletedInvite = client.beta().organization().invites()
.delete("invite_015gWxHNr6h6TdRPZTmuCGnn");
IO.println("id: " + deletedInvite.id()); $client = new Client();
$deletedInvite = $client->beta->organization->invites->delete(
inviteID: 'invite_015gWxHNr6h6TdRPZTmuCGnn',
);
echo "id: {$deletedInvite->id}\n"; client = Juglow::Client.new
invite_id = "invite_015gWxHNr6h6TdRPZTmuCGnn"
deleted_invite = client.beta.organization.invites.delete(invite_id)
puts "id: #{deleted_invite.id}"Workspace
Lihat Workspace untuk contoh Console dan API.
Anggota workspace
Kelola akses pengguna ke workspace tertentu:
Tambahkan anggota ke workspace:
curl "https://haijun.my.id/v1/organizations/workspaces/wrkspc_01JwQvzr7rXLA5AGx3HKfFUJ/members" \
-H "x-api-key: $JUGLOW_API_KEY" \
-H "juglow-version: 2023-06-01" \
-H "content-type: application/json" \
-d '{
"user_id": "user_01XyDMpzjS89pFZXqSFUBDr6",
"workspace_role": "workspace_developer"
}' ant beta:organization:workspaces:members add \
--workspace-id wrkspc_01JwQvzr7rXLA5AGx3HKfFUJ \
--user-id user_01XyDMpzjS89pFZXqSFUBDr6 \
--workspace-role workspace_developer client = juglow.Juglow()
member = client.beta.organization.workspaces.members.add(
"wrkspc_01JwQvzr7rXLA5AGx3HKfFUJ",
user_id="user_01XyDMpzjS89pFZXqSFUBDr6",
workspace_role="workspace_developer",
)
print(f"user_id: {member.user_id}")
print(f"workspace_role: {member.workspace_role}") const client = new Juglow();
const member = await client.beta.organization.workspaces.members.add(
"wrkspc_01JwQvzr7rXLA5AGx3HKfFUJ",
{
user_id: "user_01XyDMpzjS89pFZXqSFUBDr6",
workspace_role: "workspace_developer"
}
);
console.log(`user_id: ${member.user_id}`);
console.log(`workspace_role: ${member.workspace_role}`); using Juglow.Models.Beta.Organization.Workspaces;
JuglowClient client = new();
var member = await client.Beta.Organization.Workspaces.Members.Add(
"wrkspc_01JwQvzr7rXLA5AGx3HKfFUJ",
new()
{
UserID = "user_01XyDMpzjS89pFZXqSFUBDr6",
WorkspaceRole = BetaNoBillingWorkspaceRole.WorkspaceDeveloper
}
);
Console.WriteLine($"user_id: {member.UserID}");
Console.WriteLine($"workspace_role: {member.WorkspaceRole.Raw()}"); client := juglow.NewClient()
member, err := client.Beta.Organization.Workspaces.Members.Add(
context.Background(),
"wrkspc_01JwQvzr7rXLA5AGx3HKfFUJ",
juglow.BetaOrganizationWorkspaceMemberAddParams{
UserID: "user_01XyDMpzjS89pFZXqSFUBDr6",
WorkspaceRole: juglow.BetaNoBillingWorkspaceRoleWorkspaceDeveloper,
},
)
if err != nil {
log.Fatal(err)
}
fmt.Printf("user_id: %s\n", member.UserID)
fmt.Printf("workspace_role: %s\n", member.WorkspaceRole) import com.juglow.models.beta.organization.workspaces.BetaNoBillingWorkspaceRole;
import com.juglow.models.beta.organization.workspaces.members.MemberAddParams;
void main() {
JuglowClient client = JuglowOkHttpClient.fromEnv();
var params = MemberAddParams.builder()
.userId("user_01XyDMpzjS89pFZXqSFUBDr6")
.workspaceRole(BetaNoBillingWorkspaceRole.WORKSPACE_DEVELOPER)
.build();
var member = client.beta().organization().workspaces().members()
.add("wrkspc_01JwQvzr7rXLA5AGx3HKfFUJ", params);
IO.println("user_id: " + member.userId());
IO.println("workspace_role: " + member.workspaceRole().asString());
} use Juglow\Beta\Organization\Workspaces\NoBillingWorkspaceRole;
// ...
$client = new Client();
$member = $client->beta->organization->workspaces->members->add(
workspaceID: 'wrkspc_01JwQvzr7rXLA5AGx3HKfFUJ',
userID: 'user_01XyDMpzjS89pFZXqSFUBDr6',
workspaceRole: NoBillingWorkspaceRole::WORKSPACE_DEVELOPER,
);
echo "user_id: {$member->userID}\n";
echo "workspace_role: {$member->workspaceRole}\n"; client = Juglow::Client.new
workspace_id = "wrkspc_01JwQvzr7rXLA5AGx3HKfFUJ"
member = client.beta.organization.workspaces.members.add(
workspace_id,
user_id: "user_01XyDMpzjS89pFZXqSFUBDr6",
workspace_role: :workspace_developer
)
puts "user_id: #{member.user_id}"
puts "workspace_role: #{member.workspace_role}"Daftarkan anggota workspace:
curl "https://haijun.my.id/v1/organizations/workspaces/wrkspc_01JwQvzr7rXLA5AGx3HKfFUJ/members?limit=10" \
-H "x-api-key: $JUGLOW_API_KEY" \
-H "juglow-version: 2023-06-01" ant beta:organization:workspaces:members list \
--workspace-id wrkspc_01JwQvzr7rXLA5AGx3HKfFUJ \
--limit 10 client = juglow.Juglow()
members = client.beta.organization.workspaces.members.list(
"wrkspc_01JwQvzr7rXLA5AGx3HKfFUJ", limit=10
)
# Secara otomatis mengambil halaman tambahan sesuai kebutuhan.
for member in members:
print(f"{member.user_id}: {member.workspace_role}") const client = new Juglow();
const members = await client.beta.organization.workspaces.members.list(
"wrkspc_01JwQvzr7rXLA5AGx3HKfFUJ",
{ limit: 10 }
);
for await (const member of members) {
console.log(`${member.user_id}: ${member.workspace_role}`);
} JuglowClient client = new();
var page = await client.Beta.Organization.Workspaces.Members.List(
"wrkspc_01JwQvzr7rXLA5AGx3HKfFUJ",
new() { Limit = 10 }
);
await foreach (var member in page.Paginate())
{
Console.WriteLine($"{member.UserID}: {member.WorkspaceRole.Raw()}");
} client := juglow.NewClient()
members := client.Beta.Organization.Workspaces.Members.ListAutoPaging(
context.Background(),
"wrkspc_01JwQvzr7rXLA5AGx3HKfFUJ",
juglow.BetaOrganizationWorkspaceMemberListParams{
Limit: juglow.Int(10),
},
)
for members.Next() {
member := members.Current()
fmt.Printf("%s: %s\n", member.UserID, member.WorkspaceRole)
}
if err := members.Err(); err != nil {
log.Fatal(err)
} import com.juglow.models.beta.organization.workspaces.members.MemberListParams;
void main() {
JuglowClient client = JuglowOkHttpClient.fromEnv();
var params = MemberListParams.builder()
.limit(10)
.build();
var members = client.beta().organization().workspaces().members()
.list("wrkspc_01JwQvzr7rXLA5AGx3HKfFUJ", params);
for (var member : members.autoPager()) {
IO.println(member.userId() + ": " + member.workspaceRole().asString());
}
} $client = new Client();
$members = $client->beta->organization->workspaces->members->list(
workspaceID: 'wrkspc_01JwQvzr7rXLA5AGx3HKfFUJ',
limit: 10,
);
foreach ($members->getItems() as $member) {
echo "{$member->userID}: {$member->workspaceRole}\n";
} client = Juglow::Client.new
workspace_id = "wrkspc_01JwQvzr7rXLA5AGx3HKfFUJ"
members = client.beta.organization.workspaces.members.list(workspace_id, limit: 10)
members.data.each do |member|
puts "#{member.user_id}: #{member.workspace_role}"
endPerbarui peran anggota workspace:
curl "https://haijun.my.id/v1/organizations/workspaces/wrkspc_01JwQvzr7rXLA5AGx3HKfFUJ/members/user_01XyDMpzjS89pFZXqSFUBDr6" \
-H "x-api-key: $JUGLOW_API_KEY" \
-H "juglow-version: 2023-06-01" \
-H "content-type: application/json" \
-d '{"workspace_role": "workspace_admin"}' ant beta:organization:workspaces:members update \
--user-id user_01XyDMpzjS89pFZXqSFUBDr6 \
--workspace-id wrkspc_01JwQvzr7rXLA5AGx3HKfFUJ \
--workspace-role workspace_admin client = juglow.Juglow()
member = client.beta.organization.workspaces.members.update(
"user_01XyDMpzjS89pFZXqSFUBDr6",
workspace_id="wrkspc_01JwQvzr7rXLA5AGx3HKfFUJ",
workspace_role="workspace_admin",
)
print(f"user_id: {member.user_id}")
print(f"workspace_role: {member.workspace_role}") const client = new Juglow();
const member = await client.beta.organization.workspaces.members.update(
"user_01XyDMpzjS89pFZXqSFUBDr6",
{
workspace_id: "wrkspc_01JwQvzr7rXLA5AGx3HKfFUJ",
workspace_role: "workspace_admin"
}
);
console.log(`user_id: ${member.user_id}`);
console.log(`workspace_role: ${member.workspace_role}`); using Juglow.Models.Beta.Organization.Workspaces;
JuglowClient client = new();
var member = await client.Beta.Organization.Workspaces.Members.Update(
"user_01XyDMpzjS89pFZXqSFUBDr6",
new()
{
WorkspaceID = "wrkspc_01JwQvzr7rXLA5AGx3HKfFUJ",
WorkspaceRole = BetaWorkspaceRole.WorkspaceAdmin
}
);
Console.WriteLine($"user_id: {member.UserID}");
Console.WriteLine($"workspace_role: {member.WorkspaceRole.Raw()}"); client := juglow.NewClient()
member, err := client.Beta.Organization.Workspaces.Members.Update(
context.Background(),
"user_01XyDMpzjS89pFZXqSFUBDr6",
juglow.BetaOrganizationWorkspaceMemberUpdateParams{
WorkspaceID: "wrkspc_01JwQvzr7rXLA5AGx3HKfFUJ",
WorkspaceRole: juglow.BetaWorkspaceRoleWorkspaceAdmin,
},
)
if err != nil {
log.Fatal(err)
}
fmt.Printf("user_id: %s\n", member.UserID)
fmt.Printf("workspace_role: %s\n", member.WorkspaceRole) import com.juglow.models.beta.organization.workspaces.BetaWorkspaceRole;
import com.juglow.models.beta.organization.workspaces.members.MemberUpdateParams;
void main() {
JuglowClient client = JuglowOkHttpClient.fromEnv();
var params = MemberUpdateParams.builder()
.workspaceId("wrkspc_01JwQvzr7rXLA5AGx3HKfFUJ")
.workspaceRole(BetaWorkspaceRole.WORKSPACE_ADMIN)
.build();
var member = client.beta().organization().workspaces().members()
.update("user_01XyDMpzjS89pFZXqSFUBDr6", params);
IO.println("user_id: " + member.userId());
IO.println("workspace_role: " + member.workspaceRole().asString());
} use Juglow\Beta\Organization\Workspaces\WorkspaceRole;
// ...
$client = new Client();
$member = $client->beta->organization->workspaces->members->update(
userID: 'user_01XyDMpzjS89pFZXqSFUBDr6',
workspaceID: 'wrkspc_01JwQvzr7rXLA5AGx3HKfFUJ',
workspaceRole: WorkspaceRole::WORKSPACE_ADMIN,
);
echo "user_id: {$member->userID}\n";
echo "workspace_role: {$member->workspaceRole}\n"; client = Juglow::Client.new
user_id = "user_01XyDMpzjS89pFZXqSFUBDr6"
member = client.beta.organization.workspaces.members.update(
user_id,
workspace_id: "wrkspc_01JwQvzr7rXLA5AGx3HKfFUJ",
workspace_role: :workspace_admin
)
puts "user_id: #{member.user_id}"
puts "workspace_role: #{member.workspace_role}"Hapus anggota dari workspace:
curl -X DELETE "https://haijun.my.id/v1/organizations/workspaces/wrkspc_01JwQvzr7rXLA5AGx3HKfFUJ/members/user_01XyDMpzjS89pFZXqSFUBDr6" \
-H "x-api-key: $JUGLOW_API_KEY" \
-H "juglow-version: 2023-06-01" ant beta:organization:workspaces:members remove \
--user-id user_01XyDMpzjS89pFZXqSFUBDr6 \
--workspace-id wrkspc_01JwQvzr7rXLA5AGx3HKfFUJ client = juglow.Juglow()
removed_member = client.beta.organization.workspaces.members.remove(
"user_01XyDMpzjS89pFZXqSFUBDr6", workspace_id="wrkspc_01JwQvzr7rXLA5AGx3HKfFUJ"
)
print(f"user_id: {removed_member.user_id}") const client = new Juglow();
const removedMember = await client.beta.organization.workspaces.members.remove(
"user_01XyDMpzjS89pFZXqSFUBDr6",
{ workspace_id: "wrkspc_01JwQvzr7rXLA5AGx3HKfFUJ" }
);
console.log(`user_id: ${removedMember.user_id}`); JuglowClient client = new();
var removedMember = await client.Beta.Organization.Workspaces.Members.Remove(
"user_01XyDMpzjS89pFZXqSFUBDr6",
new() { WorkspaceID = "wrkspc_01JwQvzr7rXLA5AGx3HKfFUJ" }
);
Console.WriteLine($"user_id: {removedMember.UserID}"); client := juglow.NewClient()
removedMember, err := client.Beta.Organization.Workspaces.Members.Remove(
context.Background(),
"user_01XyDMpzjS89pFZXqSFUBDr6",
juglow.BetaOrganizationWorkspaceMemberRemoveParams{
WorkspaceID: "wrkspc_01JwQvzr7rXLA5AGx3HKfFUJ",
},
)
if err != nil {
log.Fatal(err)
}
fmt.Printf("user_id: %s\n", removedMember.UserID) import com.juglow.models.beta.organization.workspaces.members.MemberRemoveParams;
void main() {
JuglowClient client = JuglowOkHttpClient.fromEnv();
var params = MemberRemoveParams.builder()
.workspaceId("wrkspc_01JwQvzr7rXLA5AGx3HKfFUJ")
.build();
var removedMember = client.beta().organization().workspaces().members()
.remove("user_01XyDMpzjS89pFZXqSFUBDr6", params);
IO.println("user_id: " + removedMember.userId());
} $client = new Client();
$removedMember = $client->beta->organization->workspaces->members->remove(
userID: 'user_01XyDMpzjS89pFZXqSFUBDr6',
workspaceID: 'wrkspc_01JwQvzr7rXLA5AGx3HKfFUJ',
);
echo "user_id: {$removedMember->userID}\n"; client = Juglow::Client.new
user_id = "user_01XyDMpzjS89pFZXqSFUBDr6"
removed_member = client.beta.organization.workspaces.members.remove(
user_id,
workspace_id: "wrkspc_01JwQvzr7rXLA5AGx3HKfFUJ"
)
puts "user_id: #{removed_member.user_id}"Kunci API
Pantau dan kelola kunci API. Setiap kunci dalam respons menyertakan timestamp expires_at (null untuk kunci tanpa masa kedaluwarsa) dan principal, yaitu identitas yang diwakilinya (lihat Jenis kunci). Untuk kunci personal, principal adalah {"type": "user_actor", "user_id": "user_..."}; untuk kunci service account, {"type": "service_account_actor", "service_account_id": "svac_..."}; dan untuk kunci workspace, null. Setiap kunci juga memiliki objek scope: {"type": "workspace", "workspace_id": "wrkspc_..."} untuk kunci yang terikat pada satu workspace, atau {"type": "organization"} untuk kunci yang dapat bekerja di workspace mana pun yang dapat diakses akun tersebut. Field workspace_id tingkat atas sudah deprecated dan bernilai null baik untuk kunci yang terikat pada Default Workspace maupun untuk kunci tanpa scope workspace; gunakan scope untuk membedakannya. Memfilter daftar berdasarkan workspace_id dengan ID Default Workspace hanya mengembalikan kunci yang terikat pada Default Workspace; kunci tanpa scope workspace tidak dikembalikan di bawah filter workspace_id apa pun.
Daftarkan kunci API aktif di sebuah workspace:
curl "https://haijun.my.id/v1/organizations/api_keys?limit=10&status=active&workspace_id=wrkspc_01JwQvzr7rXLA5AGx3HKfFUJ" \
-H "x-api-key: $JUGLOW_API_KEY" \
-H "juglow-version: 2023-06-01" ant beta:organization:api-keys list \
--limit 10 \
--status active \
--workspace-id wrkspc_01JwQvzr7rXLA5AGx3HKfFUJ client = juglow.Juglow()
api_keys = client.beta.organization.api_keys.list(
limit=10, status="active", workspace_id="wrkspc_01JwQvzr7rXLA5AGx3HKfFUJ"
)
# Secara otomatis mengambil halaman tambahan sesuai kebutuhan.
for api_key in api_keys:
print(f"{api_key.id}: {api_key.name} ({api_key.status})") const client = new Juglow();
const apiKeys = await client.beta.organization.apiKeys.list({
limit: 10,
status: "active",
workspace_id: "wrkspc_01JwQvzr7rXLA5AGx3HKfFUJ"
});
for await (const apiKey of apiKeys) {
console.log(`${apiKey.id}: ${apiKey.name} (${apiKey.status})`);
} using Juglow.Models.Beta.Organization.ApiKeys;
JuglowClient client = new();
var page = await client.Beta.Organization.ApiKeys.List(new()
{
Limit = 10,
Status = ApiKeyListParamsStatus.Active,
WorkspaceID = "wrkspc_01JwQvzr7rXLA5AGx3HKfFUJ"
});
await foreach (var apiKey in page.Paginate())
{
Console.WriteLine($"{apiKey.ID}: {apiKey.Name} ({apiKey.Status.Raw()})");
} client := juglow.NewClient()
apiKeys := client.Beta.Organization.APIKeys.ListAutoPaging(context.Background(), juglow.BetaOrganizationAPIKeyListParams{
Limit: juglow.Int(10),
Status: juglow.BetaOrganizationAPIKeyListParamsStatusActive,
WorkspaceID: juglow.String("wrkspc_01JwQvzr7rXLA5AGx3HKfFUJ"),
})
for apiKeys.Next() {
apiKey := apiKeys.Current()
fmt.Printf("%s: %s (%s)\n", apiKey.ID, apiKey.Name, apiKey.Status)
}
if err := apiKeys.Err(); err != nil {
log.Fatal(err)
} import com.juglow.models.beta.organization.apikeys.ApiKeyListParams;
void main() {
JuglowClient client = JuglowOkHttpClient.fromEnv();
var params = ApiKeyListParams.builder()
.limit(10)
.status(ApiKeyListParams.Status.ACTIVE)
.workspaceId("wrkspc_01JwQvzr7rXLA5AGx3HKfFUJ")
.build();
var apiKeys = client.beta().organization().apiKeys().list(params);
for (var apiKey : apiKeys.autoPager()) {
IO.println(apiKey.id() + ": " + apiKey.name() + " (" + apiKey.status().asString() + ")");
}
} use Juglow\Beta\Organization\APIKeys\APIKeyListParams\Status;
// ...
$client = new Client();
$apiKeys = $client->beta->organization->apiKeys->list(
limit: 10,
status: Status::ACTIVE,
workspaceID: 'wrkspc_01JwQvzr7rXLA5AGx3HKfFUJ',
);
foreach ($apiKeys->getItems() as $apiKey) {
echo "{$apiKey->id}: {$apiKey->name} ({$apiKey->status})\n";
} client = Juglow::Client.new
api_keys = client.beta.organization.api_keys.list(
limit: 10,
status: :active,
workspace_id: "wrkspc_01JwQvzr7rXLA5AGx3HKfFUJ"
)
api_keys.data.each do |api_key|
puts "#{api_key.id}: #{api_key.name} (#{api_key.status})"
endGanti nama atau nonaktifkan kunci API:
curl "https://haijun.my.id/v1/organizations/api_keys/apikey_01Rj2N8SVvo6BePZj99NhmiT" \
-H "x-api-key: $JUGLOW_API_KEY" \
-H "juglow-version: 2023-06-01" \
-H "content-type: application/json" \
-d '{
"status": "inactive",
"name": "New Key Name"
}' ant beta:organization:api-keys update \
--api-key-id apikey_01Rj2N8SVvo6BePZj99NhmiT \
--status inactive \
--name "New Key Name" client = juglow.Juglow()
api_key = client.beta.organization.api_keys.update(
"apikey_01Rj2N8SVvo6BePZj99NhmiT", status="inactive", name="New Key Name"
)
print(f"id: {api_key.id}")
print(f"name: {api_key.name}")
print(f"status: {api_key.status}") const client = new Juglow();
const apiKey = await client.beta.organization.apiKeys.update(
"apikey_01Rj2N8SVvo6BePZj99NhmiT",
{
status: "inactive",
name: "New Key Name"
}
);
console.log(`id: ${apiKey.id}`);
console.log(`name: ${apiKey.name}`);
console.log(`status: ${apiKey.status}`); using Juglow.Models.Beta.Organization.ApiKeys;
JuglowClient client = new();
var apiKey = await client.Beta.Organization.ApiKeys.Update(
"apikey_01Rj2N8SVvo6BePZj99NhmiT",
new()
{
Status = Status.Inactive,
Name = "New Key Name"
}
);
Console.WriteLine($"id: {apiKey.ID}");
Console.WriteLine($"name: {apiKey.Name}");
Console.WriteLine($"status: {apiKey.Status.Raw()}"); client := juglow.NewClient()
apiKey, err := client.Beta.Organization.APIKeys.Update(
context.Background(),
"apikey_01Rj2N8SVvo6BePZj99NhmiT",
juglow.BetaOrganizationAPIKeyUpdateParams{
Status: juglow.BetaOrganizationAPIKeyUpdateParamsStatusInactive,
Name: juglow.String("New Key Name"),
},
)
if err != nil {
log.Fatal(err)
}
fmt.Printf("id: %s\n", apiKey.ID)
fmt.Printf("name: %s\n", apiKey.Name)
fmt.Printf("status: %s\n", apiKey.Status) import com.juglow.models.beta.organization.apikeys.ApiKeyUpdateParams;
void main() {
JuglowClient client = JuglowOkHttpClient.fromEnv();
var params = ApiKeyUpdateParams.builder()
.status(ApiKeyUpdateParams.Status.INACTIVE)
.name("New Key Name")
.build();
var apiKey = client.beta().organization().apiKeys()
.update("apikey_01Rj2N8SVvo6BePZj99NhmiT", params);
IO.println("id: " + apiKey.id());
IO.println("name: " + apiKey.name());
IO.println("status: " + apiKey.status().asString());
} use Juglow\Beta\Organization\APIKeys\APIKeyUpdateParams\Status;
// ...
$client = new Client();
$apiKey = $client->beta->organization->apiKeys->update(
apiKeyID: 'apikey_01Rj2N8SVvo6BePZj99NhmiT',
status: Status::INACTIVE,
name: 'New Key Name',
);
echo "id: {$apiKey->id}\n";
echo "name: {$apiKey->name}\n";
echo "status: {$apiKey->status}\n"; client = Juglow::Client.new
api_key_id = "apikey_01Rj2N8SVvo6BePZj99NhmiT"
api_key = client.beta.organization.api_keys.update(
api_key_id,
status: :inactive,
name: "New Key Name"
)
puts "id: #{api_key.id}"
puts "name: #{api_key.name}"
puts "status: #{api_key.status}"Service account
Buat dan kelola service account (svac_...), yaitu identitas non-manusia yang diwakili oleh kunci service account dan token Workload Identity Federation. Endpoint ini, seperti endpoint federation-issuer dan federation-rule, memerlukan token OAuth org:admin. Lihat Mengelola WIF dengan Admin API.
Federation issuer
Daftarkan penyedia identitas OIDC (fdis_...) yang tokennya dapat menyatakan identitas beban kerja untuk organisasi Anda. Lihat Mengelola WIF dengan Admin API.
Federation rule
Kelola aturan (fdrl_...) yang memetakan token issuer ke service account dan scope. Lihat Mengelola WIF dengan Admin API.
Mengakses info organisasi
Endpoint /v1/organizations/me mengembalikan organisasi tempat kredensial Anda berada:
curl "https://haijun.my.id/v1/organizations/me" \
-H "x-api-key: $JUGLOW_API_KEY" \
-H "juglow-version: 2023-06-01" ant beta:organization retrieve client = juglow.Juglow()
organization = client.beta.organization.retrieve()
print(f"id: {organization.id}")
print(f"name: {organization.name}") const client = new Juglow();
const organization = await client.beta.organization.retrieve();
console.log(`id: ${organization.id}`);
console.log(`name: ${organization.name}`); JuglowClient client = new();
var organization = await client.Beta.Organization.Retrieve();
Console.WriteLine($"id: {organization.ID}");
Console.WriteLine($"name: {organization.Name}"); client := juglow.NewClient()
organization, err := client.Beta.Organization.Get(context.Background())
if err != nil {
log.Fatal(err)
}
fmt.Printf("id: %s\n", organization.ID)
fmt.Printf("name: %s\n", organization.Name) JuglowClient client = JuglowOkHttpClient.fromEnv();
var organization = client.beta().organization().retrieve();
IO.println("id: " + organization.id());
IO.println("name: " + organization.name()); $client = new Client();
$organization = $client->beta->organization->retrieve();
echo "id: {$organization->id}\n";
echo "name: {$organization->name}\n"; client = Juglow::Client.new
organization = client.beta.organization.retrieve
puts "id: #{organization.id}"
puts "name: #{organization.name}"{
"id": "12345678-1234-5678-1234-567812345678",
"type": "organization",
"name": "Organization Name"
}Untuk detail parameter dan skema respons, lihat referensi Organization Info API.
Laporan penggunaan dan biaya
Lacak penggunaan dan biaya organisasi Anda dengan Usage and Cost API.
Analitik Haijun Code
Pantau produktivitas developer dan adopsi Haijun Code dengan Haijun Code Analytics API.
Batas laju
Baca "rate limit" (batas laju) yang dikonfigurasi untuk organisasi Anda dan workspace-nya dengan Rate Limits API.
Compliance API
Ambil data audit dan aktivitas untuk organisasi Anda dengan Compliance API. Kunci Admin API hanya dapat membaca Activity Feed. Untuk akses penuh, lihat Menyiapkan Compliance API.
Praktik terbaik
- Gunakan nama dan deskripsi yang bermakna untuk workspace dan kunci API
- Tangani error dari operasi yang gagal
- Audit peran dan izin anggota secara berkala
- Bersihkan workspace yang tidak digunakan dan undangan yang kedaluwarsa
- Pantau penggunaan kunci API, audit
expires_atsetiap kunci, dan rotasi kunci secara berkala
FAQ
#### Izin apa yang diperlukan untuk menggunakan Admin API?
Admin API menerima kunci Admin API (diawali dengan sk-ant-admin), token bearer OAuth dengan scope org:admin, atau kunci personal maupun kunci service account yang tidak dibatasi pada workspace tertentu. Hanya anggota organisasi dengan peran admin yang dapat membuat kunci Admin API, dan hanya anggota dengan peran admin, owner, atau primary owner yang dapat memperoleh token org:admin. Kunci personal atau kunci service account memiliki izin yang sama dengan akun yang tertaut. Lihat Autentikasi.
#### Bisakah saya membuat kunci API baru melalui Admin API?
Tidak. Anda membuat kunci API di Haijun Console. Admin API hanya dapat membaca, mengganti nama, dan mengubah status kunci yang sudah ada.
#### Apa yang terjadi pada kunci API saat menghapus pengguna?
Perilakunya bergantung pada jenis kunci.
Kunci personal berhenti berfungsi ketika penggunanya dihapus dari organisasi. Kunci service account berhenti berfungsi jika service account-nya diarsipkan, tetapi tetap berfungsi meskipun pengguna yang membuatnya dihapus. Kunci API workspace tetap berfungsi. Di workspace Haijun Code, setiap kunci terikat pada anggota yang membuatnya dan berhenti berfungsi ketika anggota tersebut dihapus.
#### Bisakah admin organisasi dihapus melalui API?
Tidak. API tidak dapat menghapus anggota dengan peran admin.
#### Berapa lama undangan organisasi berlaku?
Undangan kedaluwarsa setelah 21 hari. Periode kedaluwarsa tidak dapat dikonfigurasi.
Untuk pertanyaan khusus workspace, lihat FAQ Workspace.