Android Developer Console API

Android Developer Console API adalah layanan RESTful yang memungkinkan developer terverifikasi mengotomatiskan alur kerja verifikasi developer Android di Konsol Developer Android, termasuk mengambil akun developer, memeriksa persyaratan kelayakan utama, mendaftarkan nama paket Android, mendaftarkan kunci penandatanganan aplikasi, dan memverifikasi kepemilikan kunci.

Ringkasan, kasus penggunaan, dan konteks penerapan

Kasus penggunaan dan fitur utama

  • Pendaftaran nama paket CI/CD otomatis: Daftarkan puluhan atau ratusan nama paket Android secara terprogram (CreateAndroidPackage).
  • Pemeriksaan kebijakan kunci historis sebelum peluncuran: Memeriksa secara terprogram apakah Google telah mengamati nama paket dalam ekosistem dan apakah mendaftarkan sertifikat penandatanganan tertentu memerlukan verifikasi kepemilikan kunci (GetAndroidPackageRegistrationPolicy).
  • Pendaftaran kunci penandatanganan aplikasi dan verifikasi kepemilikan otomatis: Daftarkan sidik jari SHA-256 sertifikat penandatanganan publik (CreateAndroidPackageKey), ambil token verifikasi unik (verificationToken), dan otomatiskan bukti kepemilikan kunci pribadi menggunakan upload APK bertanda tangan yang dapat dilanjutkan atau permintaan tunggal (VerifyAndroidPackageKeyOwnership).
  • Pengiriman justifikasi terprogram: Kirim justifikasi kepemilikan (JustifyAndroidPackageKeyRegistration).
  • Pemantauan status: Pantau status pendaftaran di seluruh akun developer, nama paket, dan kunci penandatanganan aplikasi (GetDeveloperAccount, ListDeveloperAccounts, GetAndroidPackage, ListAndroidPackages, GetAndroidPackageKey, ListAndroidPackageKeys).

Alur kerja penerapan menyeluruh

  1. Verifikasi identitas developer sekali di UI: Selesaikan verifikasi identitas developer (INDIVIDUAL atau ORGANIZATION) di Konsol Developer Android sehingga verificationState adalah VERIFIED.
  2. Aktifkan API dan lakukan autentikasi: Aktifkan androiddeveloperconsole.googleapis.com di project Google Cloud Anda dan dapatkan token akses Bearer OAuth 2.0 yang didelegasikan pengguna dengan cakupan https://www.googleapis.com/auth/androiddeveloperconsole.
  3. Temukan nama resource akun developer Anda: Panggil GET /v1/developerAccounts (ListDeveloperAccounts) untuk mengambil developerAccounts/{developer_account} dan verifikasi verificationState adalah VERIFIED.
  4. Periksa kebijakan pendaftaran untuk nama paket: Panggil GET /v1/developerAccounts/{id}/androidPackages/{pkg}/registrationPolicy (GetAndroidPackageRegistrationPolicy) untuk memeriksa keySelectionStrategy (SELECT_KEY_FROM_LIST atau USE_ANY_KEY) dan kunci penandatanganan historis yang diketahui (knownKeys).
  5. Membuat resource paket Android: Panggil POST /v1/developerAccounts/{id}/androidPackages?androidPackageId={pkg} (CreateAndroidPackage) dengan isi {"name": ""} (membuat resource dalam status DRAFT).
  6. Daftarkan sidik jari kunci penandatanganan aplikasi Anda: Panggil POST /v1/developerAccounts/{id}/androidPackages/{pkg}/keys (CreateAndroidPackageKey) dengan isi JSON {"certificateFingerprintSha256": "..."}. Periksa status yang ditampilkan:
    • DRAFT: Bukti kepemilikan kunci pribadi diperlukan, dan responsnya mencakup verificationToken unik untuk Langkah 7.
    • IN_REVIEW: Bukti kepemilikan dan justifikasi akan otomatis dilewati (misalnya, saat mendaftarkan nama paket baru yang belum pernah terlihat di Android, atau saat Anda telah memverifikasi kepemilikan kunci penandatanganan ini untuk nama paket lain di DeveloperAccount yang sama). Lewati Langkah 7 dan panggilan justifikasi di Langkah 8, lalu lanjutkan langsung ke polling GetAndroidPackage dan GetAndroidPackageKey.
  7. Buat dan upload APK verifikasi (jika statusnya DRAFT): Sematkan string verificationToken yang ditampilkan ke dalam assets/adi-registration.properties di dalam APK minimal yang cocok dengan packageName, tanda tangani dengan kunci penandatanganan aplikasi pribadi Anda, lalu upload menggunakan POST /upload/v1/developerAccounts/{id}/androidPackages/{pkg}/keys/{sha256}:verify (VerifyAndroidPackageKeyOwnership).
  8. Kirimkan justifikasi (jika diperlukan) dan status pendaftaran polling: Jika kunci berada dalam status OWNERSHIP_VERIFIED dan registrationJustificationRequired adalah true, panggil POST /v1/developerAccounts/{id}/androidPackages/{pkg}/keys/{sha256}:justifyAndroidPackageKeyRegistration (JustifyAndroidPackageKeyRegistration). Polling GetAndroidPackage dan GetAndroidPackageKey hingga state mencapai REGISTERED.

Perintah CLI lokal untuk menyiapkan sidik jari kunci dan APK verifikasi

  • Mengekstrak sidik jari sertifikat SHA-256 dari keystore (keytool):

    keytool -list -v -keystore release-key.jks -alias my-key-alias
  • Memverifikasi ringkasan sertifikat penandatanganan SHA-256 pada APK yang di-build (apksigner):

    apksigner verify --print-certs app-release.apk
  • Periksa nama paket APK dan file token tersemat sebelum mengupload (aapt2 dan unzip):

    aapt2 dump badging app-release.apk | head -n 1
    unzip -p app-release.apk assets/adi-registration.properties

Kemampuan UI dan API Konsol Developer Android

Tugas UI Web Konsol Developer Android (android.google.com/developerconsole) Android Developer Console API
Verifikasi identitas developer (KYC/KYB) dan pembayaran biaya Didukung (memerlukan prasyarat satu kali) Tidak didukung menggunakan API (pemeriksaan status hanya baca menggunakan GetDeveloperAccount dan ListDeveloperAccounts)
Melihat akun developer tertaut Pengalih akun di header konsol GET /v1/developerAccounts (ListDeveloperAccounts)
Memeriksa kunci penandatanganan dan kebijakan historis untuk nama paket Ditampilkan selama wizard "Daftarkan nama paket" GET /v1/.../registrationPolicy (GetAndroidPackageRegistrationPolicy)
Mendaftarkan nama paket Android baru Nama paket > Daftarkan nama paket POST /v1/{parent}/androidPackages?androidPackageId=... (CreateAndroidPackage)
Melihat atau mencantumkan nama paket terdaftar dan draf Tabel dasbor Nama paket GET /v1/{name} (GetAndroidPackage), GET /v1/{parent}/androidPackages (ListAndroidPackages)
Menambahkan kunci penandatanganan aplikasi dan membuat token verifikasi Detail paket > Tambahkan kunci penandatanganan POST /v1/{parent}/keys (CreateAndroidPackageKey)
Membuktikan kepemilikan kunci pribadi (adi-registration.properties) Mengupload APK cuplikan yang ditandatangani di UI konsol POST /upload/v1/{name}:verify (VerifyAndroidPackageKeyOwnership)
Mengirimkan justifikasi saat kunci memerlukan peninjauan manual Perintah teks selama alur kerja pendaftaran kunci POST /v1/{name}:justifyAndroidPackageKeyRegistration (JustifyAndroidPackageKeyRegistration)

Konfigurasi dan autentikasi layanan

Semua permintaan API harus menggunakan HTTPS dan menyertakan header Authorization: Bearer ACCESS_TOKEN yang diperoleh menggunakan alur Server Web OAuth 2.0 untuk Akun Google yang telah menyelesaikan verifikasi identitas developer di Konsol Developer Android.

Properti Nilai
Endpoint REST dasar https://androiddeveloperconsole.googleapis.com
Endpoint upload media https://androiddeveloperconsole.googleapis.com/upload
Versi API v1
Cakupan OAuth 2.0 yang diperlukan https://www.googleapis.com/auth/androiddeveloperconsole
Batas kuota default 2,000 permintaan per hari per project Google Cloud per metode

Resource dan endpoint API

API Konsol Developer Android mengatur resource dalam hierarki berikut:

  • DeveloperAccount (developerAccounts/{developer_account})
    • AndroidPackage (developerAccounts/{developer_account}/androidPackages/{android_package})
      • AndroidPackageRegistrationPolicy (developerAccounts/{developer_account}/androidPackages/{android_package}/registrationPolicy)
      • AndroidPackageKey (developerAccounts/{developer_account}/androidPackages/{android_package}/keys/{key})

Resource: DeveloperAccount

Mewakili akun di Konsol Developer Android yang terkait dengan identitas developer.

Kolom Jenis Deskripsi
name string ID. Nama resource dalam format developerAccounts/{developer_account}.
displayName string Hanya output. Nama yang dapat dibaca manusia yang terkait dengan akun developer (nama individu atau nama organisasi).
verificationState enum (VerificationState) Hanya output. Status verifikasi identitas developer saat ini untuk akun.

Enum: DeveloperAccount.VerificationState

Nilai Deskripsi
VERIFIED Verifikasi identitas developer selesai. Akun dapat mendaftarkan nama paket dan kunci penandatanganan aplikasi.
NOT_VERIFIED Verifikasi identitas developer belum diselesaikan di Konsol Developer Android.

Metode: DeveloperAccount

Metode Permintaan HTTP Deskripsi
GetDeveloperAccount GET /v1/{name=developerAccounts/*} Mengambil metadata dan status verifikasi untuk satu DeveloperAccount.
ListDeveloperAccounts GET /v1/developerAccounts Mencantumkan semua objek DeveloperAccount yang dapat diakses oleh Akun Google yang diautentikasi (tidak diberi nomor halaman).

Resource: AndroidPackage

Merepresentasikan nama paket Android yang terdaftar atau sedang didaftarkan di DeveloperAccount.

Kolom Jenis Deskripsi
name string ID. Nama resource dalam format developerAccounts/{developer_account}/androidPackages/{android_package}, dengan {android_package} adalah nama paket Android (misalnya, com.example.myapp).
packageName string Hanya output. Nama paket Android (misalnya, com.example.myapp).
state enum (AndroidPackage.State) Hanya output. Status siklus proses pendaftaran nama paket saat ini.
registeredAppStore boolean Hanya output. Menunjukkan apakah nama paket ini saat ini aktif sebagai app store terdaftar.

Enum: AndroidPackage.State

Nilai Deskripsi
DRAFT Resource nama paket telah dibuat, dan pendaftaran kunci penandatanganan aplikasi atau verifikasi kepemilikan masih dalam proses.
IN_REVIEW Pendaftaran nama paket dan justifikasi kunci yang diperlukan telah dikirimkan dan sedang ditinjau oleh Google. Paket bertransisi dari DRAFT ke IN_REVIEW segera setelah CreateAndroidPackageKey (saat verifikasi kepemilikan kunci dilewati, termasuk saat kunci telah diverifikasi untuk nama paket lain di DeveloperAccount yang sama) atau setelah menyelesaikan VerifyAndroidPackageKeyOwnership dan, jika diperlukan, JustifyAndroidPackageKeyRegistration.
REGISTERED Nama paket terdaftar secara aktif di akun developer ini untuk verifikasi developer Android.
PENDING_TRANSFER Nama paket sedang menunggu penyelesaian transfer kepemilikan ke akun developer lain.

Resource: AndroidPackageRegistrationPolicy

Resource singleton yang ditampilkan oleh GetAndroidPackageRegistrationPolicy yang menjelaskan kunci penandatanganan publik historis yang terdeteksi untuk nama paket dan apakah mendaftarkan nama paket dengan kunci penandatanganan tertentu memerlukan justifikasi tertulis.

Kolom Jenis Deskripsi
name string ID. Nama resource dalam format developerAccounts/{developer_account}/androidPackages/{android_package}/registrationPolicy.
knownKeys[] object (KnownKey) Daftar kunci penandatanganan aplikasi historis yang sebelumnya diamati mendistribusikan aplikasi dengan nama paket ini, diurutkan secara leksikografis menurut certificateFingerprintSha256.
knownKeys[].certificateFingerprintSha256 string Hanya output. Sidik jari SHA-256 heksadesimal huruf kecil 64 karakter yang dinormalisasi dari sertifikat penandatanganan historis (tanpa titik dua).
knownKeys[].justificationRequirement enum (JustificationRequirement) Hanya output. Menunjukkan apakah pendaftaran kunci ini memerlukan panggilan JustifyAndroidPackageKeyRegistration (REQUIRED atau NOT_REQUIRED). Jika kunci penandatanganan sebelumnya telah diverifikasi pada nama paket lain di bawah DeveloperAccount yang sama, VerifyAndroidPackageKeyOwnership dan JustifyAndroidPackageKeyRegistration akan dilewati meskipun justificationRequirement adalah REQUIRED.
keySelectionStrategy enum (KeySelectionStrategy) Hanya output. Kebijakan pemilihan kunci untuk mendaftarkan nama paket ini: SELECT_KEY_FROM_LIST (harus mendaftarkan kunci dari knownKeys) atau USE_ANY_KEY (kunci penandatanganan aplikasi yang valid dan dimiliki oleh developer dapat didaftarkan).

Enum: KnownKey.JustificationRequirement

Nilai Deskripsi
REQUIRED Untuk mendaftarkan kunci yang diketahui ini, Anda harus mengirimkan justifikasi tertulis menggunakan JustifyAndroidPackageKeyRegistration setelah menyelesaikan VerifyAndroidPackageKeyOwnership (kecuali jika kunci tersebut sebelumnya telah diverifikasi pada nama paket lain di bawah DeveloperAccount yang sama, sehingga VerifyAndroidPackageKeyOwnership dan JustifyAndroidPackageKeyRegistration akan dilewati).
NOT_REQUIRED Mendaftarkan kunci yang diketahui ini tidak memerlukan justifikasi. Kunci akan langsung beralih ke IN_REVIEW setelah VerifyAndroidPackageKeyOwnership (atau langsung setelah CreateAndroidPackageKey jika kunci sebelumnya diverifikasi pada nama paket lain di DeveloperAccount yang sama).

Enum: AndroidPackageRegistrationPolicy.KeySelectionStrategy

Nilai Deskripsi
SELECT_KEY_FROM_LIST Pemanggil harus mendaftarkan salah satu kunci historis yang tercantum di knownKeys.
USE_ANY_KEY Selain kunci apa pun di knownKeys, pemanggil dapat mendaftarkan kunci penandatanganan aplikasi yang valid dan belum pernah diamati sebelumnya di ekosistem Android.

Metode: AndroidPackage

Metode Permintaan HTTP Deskripsi
GetAndroidPackageRegistrationPolicy GET /v1/{name=developerAccounts/*/androidPackages/*/registrationPolicy} Mengambil strategi pemilihan kunci dan kunci penandatanganan historis yang diketahui untuk nama paket.
CreateAndroidPackage POST /v1/{parent=developerAccounts/*}/androidPackages?androidPackageId={package_name} Membuat resource AndroidPackage baru dalam status DRAFT untuk mulai mendaftarkan nama paket.
GetAndroidPackage GET /v1/{name=developerAccounts/*/androidPackages/*} Mengambil detail dan status pendaftaran saat ini untuk AndroidPackage yang ada.
ListAndroidPackages GET /v1/{parent=developerAccounts/*}/androidPackages Mencantumkan objek AndroidPackage di bawah DeveloperAccount (pageSize maks 1000, pageToken).

Resource: AndroidPackageKey

Merepresentasikan sidik jari sertifikat penandatanganan aplikasi publik yang terkait dengan AndroidPackage dan melacak status verifikasi kepemilikan dan peninjauan pendaftaran.

Kolom Jenis Deskripsi
name string ID. Nama resource yang ditetapkan server dalam format developerAccounts/{developer_account}/androidPackages/{android_package}/keys/{key}, dengan {key} adalah sidik jari SHA-256 heksadesimal huruf kecil 64 karakter yang dinormalisasi tanpa titik dua. Harus dihilangkan atau kosong saat memanggil CreateAndroidPackageKey.
certificateFingerprintSha256 string Wajib. Tidak dapat diubah. Hash SHA-256 dari sertifikat penandatanganan aplikasi. Pada input di CreateAndroidPackageKey, menerima hex 64 karakter biasa (60e860e8...) atau hex yang dipisahkan titik dua (60:E8:60:E8:...). Pada output, selalu dinormalisasi menjadi heksadesimal huruf kecil 64 karakter tanpa titik dua.
state enum (AndroidPackageKey.State) Hanya output. Status siklus proses verifikasi dan pendaftaran kunci saat ini.
verificationToken string Hanya output. Token verifikasi login unik yang dibuat oleh Google. Hanya digunakan saat statusnya adalah DRAFT (dapat diabaikan saat CreateAndroidPackageKey mentransisikan kunci langsung ke IN_REVIEW). Jika statusnya adalah DRAFT, sematkan string ini di dalam assets/adi-registration.properties di APK yang ditandatangani untuk menyelesaikan VerifyAndroidPackageKeyOwnership.
registrationJustificationRequired boolean Hanya output. Jika true dan kunci berada dalam status OWNERSHIP_VERIFIED, Anda harus mengirimkan justifikasi tertulis menggunakan JustifyAndroidPackageKeyRegistration sebelum pendaftaran dilanjutkan ke IN_REVIEW. Jika CreateAndroidPackageKey mentransisikan kunci langsung ke IN_REVIEW (karena kunci sebelumnya telah diverifikasi pada nama paket lain di DeveloperAccount yang sama), justifikasi akan dilewati.

Enum: AndroidPackageKey.State

Nilai Deskripsi
DRAFT Resource kunci telah dibuat, dan bukti kepemilikan kunci pribadi menggunakan upload APK yang ditandatangani (VerifyAndroidPackageKeyOwnership) masih diperlukan karena kepemilikan kunci ini belum diverifikasi pada nama paket apa pun di DeveloperAccount ini.
OWNERSHIP_VERIFIED Kepemilikan kunci pribadi telah diverifikasi menggunakan upload APK yang ditandatangani. Jika registrationJustificationRequired adalah true, justifikasi masih diperlukan sebelum peninjauan dimulai.
IN_REVIEW Pendaftaran kunci sedang dalam peninjauan oleh Google. Kunci akan beralih ke sini, baik segera setelah CreateAndroidPackageKey jika bukti kepemilikan tidak diperlukan (misalnya, pada nama paket baru yang belum pernah terlihat di Android, atau jika kunci sebelumnya telah diverifikasi pada nama paket lain di bawah DeveloperAccount yang sama, yang juga melewati JustifyAndroidPackageKeyRegistration), langsung setelah VerifyAndroidPackageKeyOwnership (jika registrationJustificationRequired adalah false), atau setelah JustifyAndroidPackageKeyRegistration (jika registrationJustificationRequired adalah true).
REGISTERED Kunci penandatanganan aplikasi terdaftar secara aktif ke nama paket ini untuk verifikasi developer Android.
PENDING_TRANSFER Pendaftaran kunci penandatanganan aplikasi sedang menunggu penyelesaian transfer.

Metode: AndroidPackageKey

Metode Permintaan HTTP Deskripsi
CreateAndroidPackageKey POST /v1/{parent=developerAccounts/*/androidPackages/*}/keys Mendaftarkan sidik jari SHA-256 sertifikat penandatanganan aplikasi baru di bagian AndroidPackage. Menampilkan kunci dalam status DRAFT (jika bukti kepemilikan menggunakan VerifyAndroidPackageKeyOwnership diperlukan) atau langsung dalam status IN_REVIEW (jika verifikasi kepemilikan dilewati, seperti untuk nama paket baru yang belum pernah terlihat di Android atau kunci yang sudah diverifikasi pada nama paket lain di DeveloperAccount yang sama).
GetAndroidPackageKey GET /v1/{name=developerAccounts/*/androidPackages/*/keys/*} Mengambil status, sidik jari, dan metadata verifikasi AndroidPackageKey tertentu.
ListAndroidPackageKeys GET /v1/{parent=developerAccounts/*/androidPackages/*}/keys Mencantumkan semua objek AndroidPackageKey yang terdaftar di bawah AndroidPackage (pageSize maks 1000, pageToken).
VerifyAndroidPackageKeyOwnership POST /upload/v1/{name=developerAccounts/*/androidPackages/*/keys/*}:verify Mengupload APK minimal yang ditandatangani yang berisi verificationToken di assets/adi-registration.properties untuk memverifikasi kepemilikan kunci pribadi dan mengirimkan kunci yang siap ditinjau.
JustifyAndroidPackageKeyRegistration POST /v1/{name=developerAccounts/*/androidPackages/*/keys/*}:justifyAndroidPackageKeyRegistration Mengirimkan konteks justifikasi tambahan saat registrationJustificationRequired adalah true dan mengirimkan kunci terverifikasi untuk ditinjau.

Penanganan error

Jika permintaan API gagal, Konsol Developer Android API akan menampilkan kode status HTTP 4xx atau 5xx dan isi error JSON google.rpc.Status standar:

{
  "error": {
    "code": 400,
    "message": "Invalid certificate fingerprint SHA256 format.",
    "status": "INVALID_ARGUMENT",
    "details": []
  }
}

Kode status HTTP dan penyelesaian umum

Kode HTTP Status gRPC Penyebab umum Resolusi
400 Bad Request INVALID_ARGUMENT androidPackageId gaya Java tidak ada atau tidak valid; format certificateFingerprintSha256 tidak valid; kolom name tidak kosong di CreateAndroidPackage atau CreateAndroidPackageKey; APK yang diupload tidak ditandatangani, rusak, tidak memiliki assets/adi-registration.properties, tidak memiliki verificationToken yang cocok, atau ditandatangani dengan sertifikat yang tidak cocok. Validasi format permintaan terhadap skema resource, hapus atau kosongkan name pada panggilan pembuatan, dan verifikasi tanda tangan APK serta token tersemat menggunakan apksigner verify --print-certs dan unzip -p app-release.apk assets/adi-registration.properties sebelum mengupload.
400 Bad Request FAILED_PRECONDITION DeveloperAccount memiliki verificationState: NOT_VERIFIED; pemilihan kunci melanggar AndroidPackageRegistrationPolicy (SELECT_KEY_FROM_LIST); memanggil VerifyAndroidPackageKeyOwnership atau JustifyAndroidPackageKeyRegistration dalam status tidak memenuhi syarat. Selesaikan verifikasi identitas developer di Konsol Developer Android, periksa GetAndroidPackageRegistrationPolicy terlebih dahulu, dan periksa state resource saat ini.
401 Unauthorized UNAUTHENTICATED Token akses Bearer OAuth 2.0 tidak ada, tidak berlaku, atau tidak valid, atau upaya untuk melakukan autentikasi menggunakan kunci API atau akun layanan. Dapatkan token akses Bearer OAuth 2.0 baru yang didelegasikan pengguna dengan cakupan https://www.googleapis.com/auth/androiddeveloperconsole.
403 Forbidden PERMISSION_DENIED Pengguna yang diautentikasi tidak memiliki izin pada DeveloperAccount atau AndroidPackage target, atau Android Developer Console API tidak diaktifkan di project Google Cloud. Verifikasi keanggotaan akun menggunakan ListDeveloperAccounts dan pastikan androiddeveloperconsole.googleapis.com diaktifkan di Konsol Google Cloud.
404 Not Found NOT_FOUND Jalur resource DeveloperAccount, AndroidPackage, atau AndroidPackageKey yang ditentukan tidak ada. Konfirmasi jalur resource menggunakan ListDeveloperAccounts, ListAndroidPackages, atau ListAndroidPackageKeys. Pastikan ID {key} menggunakan hex huruf kecil tanpa titik dua.
409 Conflict ALREADY_EXISTS Nama paket atau sidik jari sertifikat SHA-256 sudah terdaftar di akun developer ini atau akun developer lain. Periksa pendaftaran yang ada menggunakan GetAndroidPackage atau GetAndroidPackageKey, atau periksa kepemilikan historis menggunakan GetAndroidPackageRegistrationPolicy.
429 Too Many Requests RESOURCE_EXHAUSTED Melampaui kuota per metode sebesar 2,000 permintaan per hari per project Google Cloud. Terapkan backoff eksponensial dengan jitter dan hindari loop polling frekuensi tinggi.
500/503 INTERNAL/UNAVAILABLE Error backend sementara atau ketidaktersediaan layanan sementara. Coba lagi permintaan idempoten dengan backoff eksponensial terpotong.

Contoh permintaan dan respons HTTP

Ganti nilai placeholder seperti ACCESS_TOKEN, 1234567890, com.example.myapp, dan 60e860e8... dengan nilai Anda sendiri.

1. GetDeveloperAccount

curl -X GET \
  -H "Authorization: Bearer ACCESS_TOKEN" \
  "https://androiddeveloperconsole.googleapis.com/v1/developerAccounts/1234567890"

Respons:

{
  "name": "developerAccounts/1234567890",
  "displayName": "Example Developer",
  "verificationState": "VERIFIED"
}

2. ListDeveloperAccounts

curl -X GET \
  -H "Authorization: Bearer ACCESS_TOKEN" \
  "https://androiddeveloperconsole.googleapis.com/v1/developerAccounts"

Respons:

{
  "developerAccounts": [
    {
      "name": "developerAccounts/1234567890",
      "displayName": "Example Developer",
      "verificationState": "VERIFIED"
    }
  ]
}

3. GetAndroidPackageRegistrationPolicy

curl -X GET \
  -H "Authorization: Bearer ACCESS_TOKEN" \
  "https://androiddeveloperconsole.googleapis.com/v1/developerAccounts/1234567890/androidPackages/com.example.myapp/registrationPolicy"

Respons:

{
  "name": "developerAccounts/1234567890/androidPackages/com.example.myapp/registrationPolicy",
  "knownKeys": [
    {
      "certificateFingerprintSha256": "60e860e8d77251234567890abcdef1234567890abcdef1234567890abcdef123",
      "justificationRequirement": "NOT_REQUIRED"
    }
  ],
  "keySelectionStrategy": "SELECT_KEY_FROM_LIST"
}

4. CreateAndroidPackage

curl -X POST \
  -H "Authorization: Bearer ACCESS_TOKEN" \
  -H "Content-Type: application/json; charset=utf-8" \
  -d '{"name": ""}' \
  "https://androiddeveloperconsole.googleapis.com/v1/developerAccounts/1234567890/androidPackages?androidPackageId=com.example.myapp"

Respons:

{
  "name": "developerAccounts/1234567890/androidPackages/com.example.myapp",
  "packageName": "com.example.myapp",
  "state": "DRAFT",
  "registeredAppStore": false
}

5. GetAndroidPackage

curl -X GET \
  -H "Authorization: Bearer ACCESS_TOKEN" \
  "https://androiddeveloperconsole.googleapis.com/v1/developerAccounts/1234567890/androidPackages/com.example.myapp"

Respons:

{
  "name": "developerAccounts/1234567890/androidPackages/com.example.myapp",
  "packageName": "com.example.myapp",
  "state": "REGISTERED",
  "registeredAppStore": false
}

6. ListAndroidPackages

curl -X GET \
  -H "Authorization: Bearer ACCESS_TOKEN" \
  "https://androiddeveloperconsole.googleapis.com/v1/developerAccounts/1234567890/androidPackages?pageSize=100"

Respons:

{
  "androidPackages": [
    {
      "name": "developerAccounts/1234567890/androidPackages/com.example.myapp",
      "packageName": "com.example.myapp",
      "state": "REGISTERED",
      "registeredAppStore": false
    }
  ],
  "nextPageToken": ""
}

7. CreateAndroidPackageKey

curl -X POST \
  -H "Authorization: Bearer ACCESS_TOKEN" \
  -H "Content-Type: application/json; charset=utf-8" \
  -d '{
    "certificateFingerprintSha256": "60e860e8d77251234567890abcdef1234567890abcdef1234567890abcdef123"
  }' \
  "https://androiddeveloperconsole.googleapis.com/v1/developerAccounts/1234567890/androidPackages/com.example.myapp/keys"

Respons:

{
  "name": "developerAccounts/1234567890/androidPackages/com.example.myapp/keys/60e860e8d77251234567890abcdef1234567890abcdef1234567890abcdef123",
  "certificateFingerprintSha256": "60e860e8d77251234567890abcdef1234567890abcdef1234567890abcdef123",
  "state": "DRAFT",
  "verificationToken": "token_xyz987654321"
}

8. GetAndroidPackageKey

curl -X GET \
  -H "Authorization: Bearer ACCESS_TOKEN" \
  "https://androiddeveloperconsole.googleapis.com/v1/developerAccounts/1234567890/androidPackages/com.example.myapp/keys/60e860e8d77251234567890abcdef1234567890abcdef1234567890abcdef123"

Respons:

{
  "name": "developerAccounts/1234567890/androidPackages/com.example.myapp/keys/60e860e8d77251234567890abcdef1234567890abcdef1234567890abcdef123",
  "certificateFingerprintSha256": "60e860e8d77251234567890abcdef1234567890abcdef1234567890abcdef123",
  "state": "REGISTERED"
}

9. ListAndroidPackageKeys

curl -X GET \
  -H "Authorization: Bearer ACCESS_TOKEN" \
  "https://androiddeveloperconsole.googleapis.com/v1/developerAccounts/1234567890/androidPackages/com.example.myapp/keys?pageSize=100"

Respons:

{
  "androidPackageKeys": [
    {
      "name": "developerAccounts/1234567890/androidPackages/com.example.myapp/keys/60e860e8d77251234567890abcdef1234567890abcdef1234567890abcdef123",
      "certificateFingerprintSha256": "60e860e8d77251234567890abcdef1234567890abcdef1234567890abcdef123",
      "state": "REGISTERED"
    }
  ],
  "nextPageToken": ""
}

10. VerifyAndroidPackageKeyOwnership

Opsi A: Upload media permintaan tunggal

curl -X POST \
  -H "Authorization: Bearer ACCESS_TOKEN" \
  -H "Content-Type: application/octet-stream" \
  --data-binary @app-release.apk \
  "https://androiddeveloperconsole.googleapis.com/upload/v1/developerAccounts/1234567890/androidPackages/com.example.myapp/keys/60e860e8d77251234567890abcdef1234567890abcdef1234567890abcdef123:verify?uploadType=media"

Opsi B: Protokol upload yang dapat dilanjutkan (direkomendasikan untuk APK besar atau CI/CD)

Langkah 1: Mulai sesi upload yang dapat dilanjutkan dan ekstrak header X-Goog-Upload-URL yang ditampilkan:

curl -i -X POST \
  "https://androiddeveloperconsole.googleapis.com/upload/v1/developerAccounts/1234567890/androidPackages/com.example.myapp/keys/60e860e8d77251234567890abcdef1234567890abcdef1234567890abcdef123:verify" \
  -H "Authorization: Bearer ACCESS_TOKEN" \
  -H "X-Goog-Upload-Protocol: resumable" \
  -H "X-Goog-Upload-Command: start" \
  -H "X-Goog-Upload-Header-Content-Length: FILE_SIZE_IN_BYTES" \
  -H "X-Goog-Upload-Header-Content-Type: application/vnd.android.package-archive" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "developerAccounts/1234567890/androidPackages/com.example.myapp/keys/60e860e8d77251234567890abcdef1234567890abcdef1234567890abcdef123"
  }'

Langkah 2: Upload biner APK yang ditandatangani ke UPLOAD_SESSION_URI dan selesaikan sesi:

curl -X PUT \
  "UPLOAD_SESSION_URI" \
  -H "Content-Length: FILE_SIZE_IN_BYTES" \
  -H "X-Goog-Upload-Offset: 0" \
  -H "X-Goog-Upload-Command: upload, finalize" \
  --data-binary "@app-release.apk"

Respons:

{
  "name": "developerAccounts/1234567890/androidPackages/com.example.myapp/keys/60e860e8d77251234567890abcdef1234567890abcdef1234567890abcdef123",
  "certificateFingerprintSha256": "60e860e8d77251234567890abcdef1234567890abcdef1234567890abcdef123",
  "state": "IN_REVIEW"
}

11. JustifyAndroidPackageKeyRegistration

curl -X POST \
  -H "Authorization: Bearer ACCESS_TOKEN" \
  -H "Content-Type: application/json; charset=utf-8" \
  -d '{
    "justification": "We previously distributed com.example.myapp directly from https://downloads.example.com and are migrating to our rotated production key."
  }' \
  "https://androiddeveloperconsole.googleapis.com/v1/developerAccounts/1234567890/androidPackages/com.example.myapp/keys/60e860e8d77251234567890abcdef1234567890abcdef1234567890abcdef123:justifyAndroidPackageKeyRegistration"

Respons:

{
  "name": "developerAccounts/1234567890/androidPackages/com.example.myapp/keys/60e860e8d77251234567890abcdef1234567890abcdef1234567890abcdef123",
  "certificateFingerprintSha256": "60e860e8d77251234567890abcdef1234567890abcdef1234567890abcdef123",
  "state": "IN_REVIEW",
  "registrationJustificationRequired": true
}

Referensi lainnya