Langsung ke konten

Referensi kontrol akses

Capgo menggunakan kontrol akses berbasis peran (RBAC) untuk mengatur izin setiap anggota tim. Role diatur berdasarkan scope — mulai dari seluruh organisasi hingga ke satu bundle saja.

Untuk panduan visual cara mengelola member di dashboard, lihat Organisasi.


Setiap role memiliki scope yang menentukan resource mana saja yang bisa diakses.

ScopeBerlaku untukContoh penggunaan
OrganisasiSeluruh org dan semua app-nyaCo-founder Anda menjadi Super Admin; akuntan Anda menjadi Billing Manager
AppSatu aplikasi dan channel-nyaKontraktor yang mengerjakan satu aplikasi mendapat peran App Developer
ChannelSatu channel di dalam aplikasiQA engineer hanya mengelola staging channel
BundleSatu versi bundle tunggalReviewer butuh akses baca ke satu rilis spesifik

Seorang anggota bisa memiliki satu peran per target scope — contohnya, satu peran org, satu peran di App A, dan peran berbeda di App B.


Peran ini diberikan saat mengundang anggota. Peran ini memberikan akses ke seluruh organisasi.

PeranNama internalDeskripsi
Super Adminorg_super_adminSetara Owner. Kontrol penuh termasuk menghapus org, mengelola billing, dan transfer apps. Diberikan otomatis ke pembuat org.
Adminorg_adminAdministrasi penuh — kelola members, apps, channels. Tidak bisa menghapus org, update billing, transfer apps, atau mempromosikan user ke Super Admin.
Manajer Penagihanorg_billing_adminAkses khusus billing: lihat dan update info billing, invoice, dan billing audit logs. Tidak ada akses ke apps atau members.
Memberorg_memberAkses baca-saja ke organisasi dan semua aplikasinya.
IzinDeskripsiSuper AdminAdminManajer PenagihanMember
org.readLihat organisasi✅✅✅✅
org.update_settingsEdit nama, logo, dan email manajemen org✅✅❌❌
org.deleteHapus organisasi secara permanen✅❌❌❌
org.read_membersLihat daftar anggota✅✅❌✅
org.invite_userUndang anggota baru✅✅❌❌
org.update_user_rolesUbah role anggota (Admin tidak bisa mempromosikan ke Super Admin — dibatasi hierarki role)✅✅❌❌
org.read_billingLihat info billing dan paket saat ini✅✅✅❌
org.update_billingUpdate metode pembayaran dan paket✅❌✅❌
org.read_invoicesLihat invoice✅✅✅❌
org.read_auditLihat log aktivitas organisasi✅✅❌❌
org.read_billing_auditLihat audit log khusus billing✅✅✅❌

Terbatas pada satu app saja. Gunakan ini jika anggota tim hanya boleh mengerjakan satu app, bukan seluruh organisasi.

RoleNama internalDeskripsi
Admin Aplikasiapp_adminKontrol penuh atas satu aplikasi — channel, device, dan role pengguna untuk aplikasi tersebut. Tidak bisa menghapus atau mentransfer aplikasi (itu operasi tingkat organisasi).
Developer Aplikasiapp_developerUpload bundle, kelola device, trigger native build, dan update pengaturan channel. Tidak bisa menghapus, mengubah pengaturan aplikasi, atau membuat channel baru.
App Uploaderapp_uploaderAkses baca + upload versi bundle baru.
App Readerapp_readerRead-only — stats, bundle, channel, logs, dan device.
Pratinjau Aplikasiapp_previewPreview lifecycle CI yang terikat pada organisasi dan aplikasi: upload bundle dan buat preview channel. Membuat channel tersebut otomatis memberikan hak lifecycle hanya untuk channel itu.
IzinDeskripsiAdmin AplikasiDeveloper AplikasiApp UploaderApp Reader
app.readLihat detail, statistik, dan metadata app✅✅✅✅
app.update_settingsEdit pengaturan app✅❌❌❌
app.read_bundlesLihat daftar bundle yang di-upload✅✅✅✅
app.upload_bundleUpload versi bundle baru✅✅✅❌
app.create_channelBuat channel baru✅❌❌❌
app.read_channelsLihat channel✅✅✅✅
app.read_logsLihat log pengiriman update✅✅✅✅
app.manage_devicesTetapkan, override, atau unlink device✅✅❌❌
app.read_devicesLihat daftar device✅✅✅✅
app.build_nativePicu native cloud build✅✅❌❌
app.read_auditLihat log aktivitas level app✅✅✅✅
app.update_user_rolesKelola assignment role per app✅❌❌❌
bundle.deleteHapus bundle✅❌❌❌

Gunakan Pratinjau Aplikasi (app_preview) untuk CI key yang terikat ke organisasi dan app guna mengelola lifecycle PR preview tanpa akses luas ke seluruh app atau organisasi.

Panduan app_preview binding ini hanya memberikan izin di level app berikut:

IzinKegunaan
app.readBaca app yang dipilih
app.read_bundlesBaca bundle yang di-upload
app.upload_bundleUpload bundle
app.create_channelBuat channel

Saat App Preview key membuat channel, Capgo secara otomatis memberikan key tersebut child channel_preview binding hanya untuk channel baru:

IzinMengizinkan
channel.readBaca channel yang dibuat oleh key
channel.promote_bundleSet bundle yang di-upload oleh key tersebut pada channel itu
channel.deleteHapus channel tersebut

Karena app_preview mempertahankan app.read, key tersebut dapat mencantumkan metadata channel pada app yang dipilih. Automatic child binding adalah manajemen boundary: key tidak memberikan izin mutasi lifecycle untuk channel yang tidak dibuat oleh key tersebut.

Capgo mencatat preview key yang membuat setiap channel dan mengunggah setiap bundle. Oleh karena itu, App Preview key dapat membuat setiap non-public preview channel yang dibutuhkan, mempromosikan bundle miliknya sendiri, dan menghapus channel serta bundle tersebut secara atomik dengan channel delete --delete-bundle; hal tersebut tidak dapat dilakukan pada channel default/utama yang sudah ada, channel dari preview key lain, atau bundle milik key lain.

Ini tidak mencakup app.update_settings, manajemen device atau role, channel.update_settings, channel.rollback_bundle, manajemen forced-device, atau bundle.delete.


Terbatas pada satu channel saja. Berguna untuk memberikan akses terarah ke channel rilis tertentu.

RoleNama internalDeskripsi
Admin Channelchannel_adminKontrol penuh satu channel: pengaturan, promote/rollback bundle, dan kelola forced devices.
Viewer Channelchannel_readerRead-only — bundle saat ini, riwayat, forced devices, dan audit log.
Preview Channelchannel_previewDiberikan otomatis ke App Preview key pembuat channel: baca, promote bundle sendiri, dan hapus channel tersebut.
IzinDeskripsiAdmin ChannelPemantau ChannelPratinjau Channel
channel.readLihat channel dan bundle saat ini✅✅✅
channel.update_settingsEdit pengaturan channel (toggle platform, kebijakan update…)✅❌❌
channel.deleteHapus channel✅❌✅
channel.read_historyLihat riwayat assignment bundle✅✅❌
channel.promote_bundleSet bundle aktif pada channel✅❌✅
channel.rollback_bundleRoll back ke bundle sebelumnya✅❌❌
channel.manage_forced_devicesPaksa perangkat tertentu ke channel ini✅❌❌
channel.read_forced_devicesLihat daftar perangkat yang dipaksa✅✅❌
channel.read_auditLihat log aktivitas channel✅✅❌

Terbatas pada satu versi bundle saja. Jarang dibutuhkan — kebanyakan tim lebih memilih menggunakan role di level app.

RoleNama internalDeskripsi
Admin Bundlebundle_adminBaca, update metadata, dan hapus bundle tertentu.
Bundle Viewerbundle_readerAkses baca-saja ke bundle tertentu.

Di dashboard, akses channel secara default ditentukan oleh role app pengguna. Untuk kontrol yang lebih granular, Anda bisa melakukan override izin channel tertentu per user atau grup tanpa mengubah role app mereka.

Override dikonfigurasi dari tab Akses app dengan mengklik tombol channel permissions (ikon shield) di samping user. Lihat Organisasi — Menimpa izin channel untuk panduan visualnya.

IzinDeskripsiPerilaku default
BacaMelihat channel dan bundle saat iniDiwarisi dari role app
RiwayatMelihat riwayat penugasan bundleDiwarisi dari role app
Hubungkan bundleAtur atau ubah bundle aktif pada channelDiwarisi dari role app

Setiap permission dapat diatur ke:

  • Default — inherit dari role app (default)
  • Izinkan — berikan akses secara eksplisit, terlepas dari role app
  • Tolak — blokir secara eksplisit, terlepas dari role app

Dengan ini Anda dapat, misalnya, memberikan kemampuan kepada App Reader untuk mengasosiasikan bundle pada staging channel tanpa harus mempromosikannya menjadi App Developer.


Role membentuk sebuah hierarki. Role induk mewarisi semua permission dari role anaknya. Ini berarti org_admin bisa melakukan semua yang bisa dilakukan app_admin yang kemudian dapat melakukan semua hal seperti channel_admin role berikutnya, dan seterusnya.

Super Admin (org_super_admin)
└── Admin (org_admin)
└── App Admin (app_admin)
├── App Developer (app_developer)
│ └── App Uploader (app_uploader)
│ └── App Reader (app_reader)
├── Bundle Admin (bundle_admin)
│ └── Bundle Viewer (bundle_reader)
└── Channel Admin (channel_admin)
└── Channel Viewer (channel_reader)

Cara kerjanya secara praktis:

  • Sebuah Admin di level org bisa melakukan semua yang bisa dilakukan Admin Aplikasi bisa, di setiap aplikasi dalam organisasi.
  • Sebuah Admin Aplikasi on a specific app can do everything a Admin Channel bisa, di setiap channel pada aplikasi tersebut.
  • Sebuah Developer Aplikasi bisa melakukan semua yang dilakukan App Uploader bisa, ditambah fitur lainnya.

Hierarki ini hanya mengalir ke bawah — seorang channel_admin tidak akan mendapat izin level organisasi, meski mereka punya role di level app.


Daripada memberikan role ke tiap user satu per satu, Anda bisa membuat group dan memberikan role ke group tersebut. Setiap anggota group akan otomatis mewarisi role itu.

  • Sebuah group termasuk dalam satu organisasi — tidak bisa mencakup beberapa org.
  • Group dapat menyimpan role binding di scope apa pun: org, app, channel, atau bundle. Contohnya, sebuah group bisa diberi Developer Aplikasi role di App A dan Admin Channel role pada staging channel di App B.
  • Saat izin user dievaluasi, semua keanggotaan group mereka akan diproses secara transparan. Jika salah satu group memberikan izin yang diperlukan, akses akan diberikan.
  • Seorang user bisa tergabung dalam beberapa grup, dan izin dari semua grup bersifat akumulatif.
  • Izin berbasis grup hanya berlaku untuk prinsipal pengguna — API keys tidak mewarisi role grup.
SkenarioTanpa grupDengan grup
5 QA engineer butuh akses Developer ke 3 app15 role bindings individual1 grup + 3 role binding
Seseorang bergabung ke tim QATambah 3 role binding secara manualTambahkan mereka ke grup
Seseorang keluar dari tim QAHapus 3 role binding secara manualHapus mereka dari grup

Semua endpoint grup memerlukan autentikasi dan tersedia di /private/groups.

Jendela terminal
curl -X GET "https://api.capgo.app/private/groups/<ORG_ID>" \
-H "authorization: <API_KEY>"

Membutuhkan org.read_members izinnya.

Jendela terminal
curl -X POST "https://api.capgo.app/private/groups/<ORG_ID>" \
-H "authorization: <API_KEY>" \
-H "Content-Type: application/json" \
-d '{
"name": "QA Team",
"description": "Quality assurance engineers"
}'

Membutuhkan org.update_user_roles permission (Super Admin atau Admin).

Jendela terminal
curl -X PUT "https://api.capgo.app/private/groups/<GROUP_ID>" \
-H "authorization: <API_KEY>" \
-H "Content-Type: application/json" \
-d '{
"name": "QA Team",
"description": "Updated description"
}'
Jendela terminal
curl -X DELETE "https://api.capgo.app/private/groups/<GROUP_ID>" \
-H "authorization: <API_KEY>"

Menghapus grup juga akan menghapus semua role binding-nya. Anggota tidak akan dihapus dari organisasi.

Jendela terminal
curl -X GET "https://api.capgo.app/private/groups/<GROUP_ID>/members" \
-H "authorization: <API_KEY>"
Jendela terminal
curl -X POST "https://api.capgo.app/private/groups/<GROUP_ID>/members" \
-H "authorization: <API_KEY>" \
-H "Content-Type: application/json" \
-d '{ "user_id": "<USER_UUID>" }'

User harus sudah menjadi anggota organisasi. Menambahkan anggota yang sudah ada tidak akan melakukan perubahan apa pun.

Jendela terminal
curl -X DELETE "https://api.capgo.app/private/groups/<GROUP_ID>/members/<USER_UUID>" \
-H "authorization: <API_KEY>"

Jendela terminal
curl -X GET "https://api.capgo.app/organization/members" \
-H "authorization: <API_KEY>" \
-H "Content-Type: application/json" \
-d '{ "orgId": "<ORG_ID>" }'

Respons:

[
{
"uid": "user-uuid",
"email": "alice@example.com",
"image_url": "https://...",
"role": "org_admin",
"is_tmp": false
}
]
Jendela terminal
curl -X POST "https://api.capgo.app/organization/members" \
-H "authorization: <API_KEY>" \
-H "Content-Type: application/json" \
-d '{
"orgId": "<ORG_ID>",
"email": "bob@example.com",
"invite_type": "org_admin"
}'

Nilai yang diterima untuk invite_type:

NilaiRole yang diberikan
org_super_adminSuper Admin
org_adminAdmin
org_billing_adminManajer Penagihan
org_memberMember
Jendela terminal
curl -X DELETE "https://api.capgo.app/organization/members" \
-H "authorization: <API_KEY>" \
-H "Content-Type: application/json" \
-d '{
"orgId": "<ORG_ID>",
"email": "bob@example.com"
}'

Jendela terminal
npx @capgo/cli organization list --apikey <API_KEY>
Jendela terminal
npx @capgo/cli organization members <ORG_ID> --apikey <API_KEY>

Role bawaan sudah mencakup sebagian besar struktur tim. Pembuatan custom role ada dalam roadmap kami — jika tim Anda membutuhkannya, hubungi kami. Use case Anda akan membantu kami memprioritaskan fitur ini.

Jika Anda menggunakan Referensi kontrol akses untuk merencanakan operasi dashboard dan API, hubungkan dengan Ringkasan API untuk detail implementasi di API Overview, Pendahuluan untuk detail implementasi di Introduction, Kunci API untuk detail implementasi di API Keys, Perangkat untuk detail implementasi di Devices, dan Bundle untuk detail implementasi di Bundles.