Android Developer Console API

Android Developer Console API は、確認済みのデベロッパーが Android Developer Console で Android デベロッパーの確認 ワークフローを自動化できるようにする RESTful サービスです。これには、デベロッパー アカウントの取得、主要な資格要件の確認、Android パッケージ名の登録、アプリ署名鍵の登録、鍵の所有権の確認などが含まれます。

概要、ユースケース、実装コンテキスト

主なユースケースと機能

  • 自動化された CI/CD パッケージ名の登録: 数十または数百の Android パッケージ名をプログラムで登録します(CreateAndroidPackage)。
  • 過去の鍵ポリシーの事前検査: Google がエコシステムでパッケージ名を以前に確認したかどうか、特定の署名証明書の登録に鍵の所有権の確認(GetAndroidPackageRegistrationPolicy)が必要かどうかをプログラムで検査します。
  • アプリ署名鍵の自動登録と所有権の確認: 公開署名証明書の SHA-256 フィンガープリントを登録し(CreateAndroidPackageKey)、一意の確認チャレンジ トークンを取得して(verificationToken)、単一リクエストまたは再開可能な署名付き APK のアップロードを使用して秘密鍵の所有証明を自動化します(VerifyAndroidPackageKeyOwnership)。
  • プログラムによる理由の送信: 所有権の理由(JustifyAndroidPackageKeyRegistration)を送信します。
  • ステータスのモニタリング: デベロッパー アカウント、パッケージ名、アプリ署名鍵(GetDeveloperAccount、ListDeveloperAccounts、GetAndroidPackage、ListAndroidPackages、GetAndroidPackageKey、ListAndroidPackageKeys)全体で登録ステータスをモニタリングします。

エンドツーエンドの実装ワークフロー

  1. UI でデベロッパーの身元確認を 1 回行う: Android Developer Console でデベロッパーの身元確認(INDIVIDUAL または ORGANIZATION)を完了し、verificationState が VERIFIED になるようにします。
  2. API を有効にして認証する: Google Cloud プロジェクトで androiddeveloperconsole.googleapis.com を有効にし、スコープ https://www.googleapis.com/auth/androiddeveloperconsole を持つユーザー委任 OAuth 2.0 Bearer アクセス トークンを取得します。
  3. デベロッパー アカウントのリソース名を確認する: GET /v1/developerAccounts(ListDeveloperAccounts)を呼び出して developerAccounts/{developer_account} を取得し、verificationState が VERIFIED であることを確認します。
  4. パッケージ名の登録ポリシーを確認する: GET /v1/developerAccounts/{id}/androidPackages/{pkg}/registrationPolicy(GetAndroidPackageRegistrationPolicy)を呼び出して、keySelectionStrategy(SELECT_KEY_FROM_LIST または USE_ANY_KEY)と既知の過去の署名鍵(knownKeys)を検査します。
  5. Android パッケージ リソースを作成する: 本文 {"name": ""} を指定して POST /v1/developerAccounts/{id}/androidPackages?androidPackageId={pkg}(CreateAndroidPackage)を呼び出します(DRAFT 状態でリソースが作成されます)。
  6. アプリ署名鍵のフィンガープリントを登録する: JSON 本文 {"certificateFingerprintSha256": "..."} を指定して POST /v1/developerAccounts/{id}/androidPackages/{pkg}/keys(CreateAndroidPackageKey)を呼び出します。返された状態を調べます。
    • DRAFT: 秘密鍵の所有権の証明が必要です。レスポンスには、ステップ 7 の一意の verificationToken が含まれます。
    • IN_REVIEW: 所有権の証明と正当性の証明は自動的にスキップされます(たとえば、Android でこれまでに確認されたことがない新しいパッケージ名を登録する場合や、同じ DeveloperAccount 内の別のパッケージ名に対してこの署名鍵の所有権をすでに確認している場合)。ステップ 7 とステップ 8 の正当性の証明の呼び出しをスキップし、GetAndroidPackage と GetAndroidPackageKey のポーリングに直接進みます。
  7. 確認用 APK をビルドしてアップロードする(状態が DRAFT の場合): 返された verificationToken 文字列を、packageName に一致する最小限の APK 内の assets/adi-registration.properties に埋め込み、秘密のアプリ署名鍵で署名して、POST /upload/v1/developerAccounts/{id}/androidPackages/{pkg}/keys/{sha256}:verify(VerifyAndroidPackageKeyOwnership)を使用してアップロードします。
  8. 理由を送信し(必要な場合)、登録ステータスをポーリングする: 鍵が OWNERSHIP_VERIFIED 状態で、registrationJustificationRequired が true の場合は、POST /v1/developerAccounts/{id}/androidPackages/{pkg}/keys/{sha256}:justifyAndroidPackageKeyRegistration(JustifyAndroidPackageKeyRegistration)を呼び出します。state が REGISTERED に達するまで、GetAndroidPackage と GetAndroidPackageKey をポーリングします。

鍵フィンガープリントと検証用 APK を準備するためのローカル CLI コマンド

  • キーストア(keytool)から SHA-256 証明書のフィンガープリントを抽出する:

    keytool -list -v -keystore release-key.jks -alias my-key-alias
  • ビルドされた APK(apksigner)で SHA-256 署名証明書ダイジェストを確認する:

    apksigner verify --print-certs app-release.apk
  • アップロード前に APK パッケージ名と埋め込みトークン ファイルを検査する(aapt2 と unzip):

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

Android Developer Console の UI と API の機能

タスク Android Developer Console のウェブ UI(android.google.com/developerconsole) Android Developer Console API
デベロッパーの本人確認(KYC/KYB)と手数料の支払い サポート対象(1 回限りの前提条件が必要) API を使用したサポートなし(GetDeveloperAccount と ListDeveloperAccounts を使用した読み取り専用ステータス チェック)
リンクされたデベロッパー アカウントを表示する コンソール ヘッダーのアカウント切り替え GET /v1/developerAccounts(ListDeveloperAccounts)
パッケージ名の過去の署名鍵とポリシーを検査する 「パッケージ名を登録」ウィザード中に表示 GET /v1/.../registrationPolicy(GetAndroidPackageRegistrationPolicy)
新しい Android パッケージ名を登録する [パッケージ名] > [パッケージ名を登録] POST /v1/{parent}/androidPackages?androidPackageId=...(CreateAndroidPackage)
登録済みパッケージ名とパッケージ名の下書きを表示または一覧表示する [パッケージ名] ダッシュボードの表 GET /v1/{name}(GetAndroidPackage)、GET /v1/{parent}/androidPackages(ListAndroidPackages)
アプリ署名鍵を追加して、チャレンジ トークンを生成する [パッケージの詳細] > [署名鍵を追加] POST /v1/{parent}/keys(CreateAndroidPackageKey)
秘密鍵の所有権を証明する(adi-registration.properties) コンソール UI で署名済みスニペット APK をアップロードする POST /upload/v1/{name}:verify(VerifyAndroidPackageKeyOwnership)
鍵の手動審査が必要な場合に理由を送信する キー登録ワークフロー中のテキスト プロンプト POST /v1/{name}:justifyAndroidPackageKeyRegistration(JustifyAndroidPackageKeyRegistration)

サービス構成と認証

すべての API リクエストは HTTPS を使用し、Android Developer Console でデベロッパーの本人確認を完了した Google アカウントの OAuth 2.0 ウェブサーバー フローを使用して取得した Authorization: Bearer ACCESS_TOKEN ヘッダーを含める必要があります。

プロパティ 値
ベース REST エンドポイント https://androiddeveloperconsole.googleapis.com
メディア アップロード エンドポイント https://androiddeveloperconsole.googleapis.com/upload
API のバージョン v1
必要な OAuth 2.0 スコープ https://www.googleapis.com/auth/androiddeveloperconsole
デフォルトの割り当て上限 Google Cloud プロジェクトごと、メソッドごとの 1 日あたりの 2,000 リクエスト数

API リソースとエンドポイント

Android Developer Console API は、次の階層でリソースを整理します。

  • 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})

リソース: DeveloperAccount

デベロッパー ID に関連付けられた Android Developer Console のアカウントを表します。

フィールド タイプ 説明
name string ID。リソース名(developerAccounts/{developer_account} 形式)。
displayName string 出力専用。デベロッパー アカウントに関連付けられた、人が読める形式の名前(個人名または組織名)。
verificationState enum (VerificationState) 出力専用。アカウントの現在のデベロッパー身元確認ステータス。

列挙型: DeveloperAccount.VerificationState

値 説明
VERIFIED デベロッパーの身元確認が完了しました。このアカウントは、パッケージ名とアプリ署名鍵を登録できます。
NOT_VERIFIED Android Developer Console でデベロッパーの身元確認が完了していない。

メソッド: DeveloperAccount

メソッド HTTP リクエスト 説明
GetDeveloperAccount GET /v1/{name=developerAccounts/*} 1 つの DeveloperAccount のメタデータと確認状態を取得します。
ListDeveloperAccounts GET /v1/developerAccounts 認証済みの Google アカウントからアクセス可能なすべての DeveloperAccount オブジェクトを一覧表示します(ページ分けなし)。

リソース: AndroidPackage

DeveloperAccount に登録されている、または登録中の Android パッケージ名を表します。

フィールド タイプ 説明
name string ID。リソース名。developerAccounts/{developer_account}/androidPackages/{android_package} の形式で指定します。ここで、{android_package} は Android パッケージ名です(例: com.example.myapp)。
packageName string 出力専用。Android パッケージ名(例: com.example.myapp)。
state enum (AndroidPackage.State) 出力専用。パッケージ名の現在の登録ライフサイクル ステータス。
registeredAppStore boolean 出力専用。このパッケージ名が現在、登録済みアプリストアとして有効かどうかを示します。

列挙型: AndroidPackage.State

値 説明
DRAFT パッケージ名リソースが作成され、アプリ署名鍵の登録または所有権の確認が進行中です。
IN_REVIEW パッケージ名の登録と、必要なキーの理由が送信され、Google による審査中です。パッケージは、CreateAndroidPackageKey の直後(鍵の所有権の確認がスキップされた場合。同じ DeveloperAccount 内の別のパッケージ名で鍵がすでに確認されている場合など)または VerifyAndroidPackageKeyOwnership と JustifyAndroidPackageKeyRegistration(必要な場合)の完了後に、DRAFT から IN_REVIEW に移行します。
REGISTERED パッケージ名が、Android デベロッパーの確認のためにこのデベロッパー アカウントに登録されている。
PENDING_TRANSFER パッケージ名は、別のデベロッパー アカウントへの所有権の譲渡が完了するのを待機しています。

リソース: AndroidPackageRegistrationPolicy

GetAndroidPackageRegistrationPolicy によって返されるシングルトン リソース。パッケージ名で検出された過去の公開署名鍵と、指定された署名鍵でパッケージ名を登録する際に書面による理由が必要かどうかを示します。

フィールド タイプ 説明
name string ID。リソース名(developerAccounts/{developer_account}/androidPackages/{android_package}/registrationPolicy 形式)。
knownKeys[] object (KnownKey) このパッケージ名でアプリを配布していることが以前に確認された、過去のアプリ署名鍵のリスト。certificateFingerprintSha256 の辞書順に並べ替えられています。
knownKeys[].certificateFingerprintSha256 string 出力専用。以前の署名証明書の正規化された 64 文字の小文字の 16 進数 SHA-256 フィンガープリント(コロンなし)。
knownKeys[].justificationRequirement enum (JustificationRequirement) 出力専用。この鍵の登録に JustifyAndroidPackageKeyRegistration(REQUIRED または NOT_REQUIRED)の呼び出しが必要かどうかを示します。署名鍵が同じ DeveloperAccount の別のパッケージ名ですでに確認されている場合、justificationRequirement が REQUIRED であっても、VerifyAndroidPackageKeyOwnership と JustifyAndroidPackageKeyRegistration の両方がスキップされます。
keySelectionStrategy enum (KeySelectionStrategy) 出力専用。このパッケージ名を登録するための鍵選択ポリシー: SELECT_KEY_FROM_LIST(knownKeys の鍵を登録する必要があります)または USE_ANY_KEY(デベロッパーが所有する有効なアプリ署名鍵を登録できます)。

列挙型: KnownKey.JustificationRequirement

値 説明
REQUIRED この既知の鍵を登録するには、VerifyAndroidPackageKeyOwnership を完了した後に JustifyAndroidPackageKeyRegistration を使用して書面による正当な理由を提出する必要があります(ただし、同じ DeveloperAccount の別のパッケージ名で鍵がすでに確認されている場合は、VerifyAndroidPackageKeyOwnership と JustifyAndroidPackageKeyRegistration の両方がスキップされます)。
NOT_REQUIRED この既知の鍵を登録する際に、理由を説明する必要はありません。鍵は、VerifyAndroidPackageKeyOwnership の後に直接 IN_REVIEW に移行します(同じ DeveloperAccount の別のパッケージ名で以前に鍵が検証されていた場合は、CreateAndroidPackageKey の直後に移行します)。

列挙型: AndroidPackageRegistrationPolicy.KeySelectionStrategy

値 説明
SELECT_KEY_FROM_LIST 呼び出し元は、knownKeys にリストされている履歴鍵のいずれかを登録する必要があります。
USE_ANY_KEY knownKeys の鍵に加えて、呼び出し元は、Android エコシステムで以前に確認されていない有効なアプリ署名鍵を登録できます。

メソッド: AndroidPackage

メソッド HTTP リクエスト 説明
GetAndroidPackageRegistrationPolicy GET /v1/{name=developerAccounts/*/androidPackages/*/registrationPolicy} パッケージ名の鍵選択戦略と既知の過去の署名鍵を取得します。
CreateAndroidPackage POST /v1/{parent=developerAccounts/*}/androidPackages?androidPackageId={package_name} DRAFT 状態の新しい AndroidPackage リソースを作成して、パッケージ名の登録を開始します。
GetAndroidPackage GET /v1/{name=developerAccounts/*/androidPackages/*} 既存の AndroidPackage の詳細と現在の登録状態を取得します。
ListAndroidPackages GET /v1/{parent=developerAccounts/*}/androidPackages DeveloperAccount の AndroidPackage オブジェクトを一覧表示します(pageSize 最大 1000、pageToken)。

リソース: AndroidPackageKey

AndroidPackage に関連付けられた公開アプリ署名証明書のフィンガープリントを表し、所有権の確認と登録審査の状態を追跡します。

フィールド タイプ 説明
name string ID。サーバー割り当てのリソース名。developerAccounts/{developer_account}/androidPackages/{android_package}/keys/{key} 形式。ここで、{key} は、コロンなしの正規化された 64 文字の小文字の 16 進数 SHA-256 フィンガープリントです。CreateAndroidPackageKey を呼び出す場合は、省略するか空にする必要があります。
certificateFingerprintSha256 string 必須。変更不可。アプリ署名証明書の SHA-256 ハッシュ。CreateAndroidPackageKey の入力では、プレーンな 64 文字の 16 進数(60e860e8...)またはコロン区切りの 16 進数(60:E8:60:E8:...)のいずれかを受け入れます。出力では、常にコロンなしの 64 文字の小文字の 16 進数に正規化されます。
state enum (AndroidPackageKey.State) 出力専用。鍵の現在の検証と登録のライフサイクル状態。
verificationToken string 出力専用。Google が生成した一意のチャレンジ トークン。状態が DRAFT の場合にのみ使用されます(CreateAndroidPackageKey が鍵を IN_REVIEW に直接移行する場合は無視できます)。状態が DRAFT の場合、この文字列を署名付き APK の assets/adi-registration.properties に埋め込んで VerifyAndroidPackageKeyOwnership を完了します。
registrationJustificationRequired boolean 出力専用。true で、鍵が OWNERSHIP_VERIFIED 状態の場合、登録が IN_REVIEW に進む前に、JustifyAndroidPackageKeyRegistration を使用して書面による正当な理由を提出する必要があります。CreateAndroidPackageKey が鍵を IN_REVIEW に直接移行する場合(鍵が同じ DeveloperAccount の別のパッケージ名で以前に検証されているため)、正当化はスキップされます。

列挙型: AndroidPackageKey.State

値 説明
DRAFT 鍵リソースは作成されましたが、この鍵の所有権は、この DeveloperAccount のどのパッケージ名でもまだ確認されていないため、署名付き APK のアップロード(VerifyAndroidPackageKeyOwnership)による秘密鍵の所有証明が引き続き必要です。
OWNERSHIP_VERIFIED 秘密鍵の所有権は、署名済み APK のアップロードを使用して確認されています。registrationJustificationRequired が true の場合でも、審査を開始する前に理由が必要です。
IN_REVIEW キーの登録は Google による審査中です。鍵がこの状態に移行するのは、所有権の証明が不要な場合は CreateAndroidPackageKey の直後(たとえば、Android で一度も使用されたことのない新規のパッケージ名の場合や、同じ DeveloperAccount の別のパッケージ名で鍵が以前に確認されている場合。この場合は JustifyAndroidPackageKeyRegistration もスキップされます)、registrationJustificationRequired が false の場合は VerifyAndroidPackageKeyOwnership の直後、registrationJustificationRequired が true の場合は JustifyAndroidPackageKeyRegistration の後です。
REGISTERED アプリ署名鍵は、Android デベロッパーの確認のためにこのパッケージ名に登録されています。
PENDING_TRANSFER アプリ署名鍵の登録は、移管の完了を待機しています。

メソッド: AndroidPackageKey

メソッド HTTP リクエスト 説明
CreateAndroidPackageKey POST /v1/{parent=developerAccounts/*/androidPackages/*}/keys AndroidPackage に新しいアプリ署名証明書の SHA-256 フィンガープリントを登録します。DRAFT 状態(VerifyAndroidPackageKeyOwnership を使用した所有権の証明が必要な場合)または直接 IN_REVIEW 状態(所有権の確認がスキップされる場合。たとえば、Android で一度も使用されたことのない新規のパッケージ名や、同じ DeveloperAccount 内の別のパッケージ名ですでに確認済みの鍵の場合)の鍵を返します。
GetAndroidPackageKey GET /v1/{name=developerAccounts/*/androidPackages/*/keys/*} 特定の AndroidPackageKey のステータス、フィンガープリント、検証メタデータを取得します。
ListAndroidPackageKeys GET /v1/{parent=developerAccounts/*/androidPackages/*}/keys AndroidPackage に登録されているすべての AndroidPackageKey オブジェクトを一覧表示します(pageSize 最大 1000、pageToken)。
VerifyAndroidPackageKeyOwnership POST /upload/v1/{name=developerAccounts/*/androidPackages/*/keys/*}:verify assets/adi-registration.properties に verificationToken を含む署名済みの最小 APK をアップロードして、秘密鍵の所有権を確認し、準備ができた鍵を審査に送信します。
JustifyAndroidPackageKeyRegistration POST /v1/{name=developerAccounts/*/androidPackages/*/keys/*}:justifyAndroidPackageKeyRegistration registrationJustificationRequired が true の場合、追加の理由コンテキストを送信し、検証済みのキーを審査のために送信します。

エラー処理

API リクエストが失敗すると、Android Developer Console API は HTTP 4xx または 5xx ステータス コードと、標準の google.rpc.Status JSON エラー本文を返します。

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

HTTP ステータス コードと一般的な解決策

HTTP コード gRPC ステータス 一般的な原因 解決策
400 Bad Request INVALID_ARGUMENT Java スタイルの androidPackageId がないか無効、certificateFingerprintSha256 の形式が無効、CreateAndroidPackage または CreateAndroidPackageKey の name フィールドが空でない、アップロードされた APK が署名されていない、破損している、assets/adi-registration.properties がない、一致する verificationToken がない、または一致しない証明書で署名されている。 リソース スキーマに照らしてリクエスト形式を検証し、作成呼び出しで name を省略または空にし、アップロード前に apksigner verify --print-certs と unzip -p app-release.apk assets/adi-registration.properties を使用して APK 署名と埋め込みトークンを検証します。
400 Bad Request FAILED_PRECONDITION DeveloperAccount に verificationState: NOT_VERIFIED があります。キーの選択が AndroidPackageRegistrationPolicy(SELECT_KEY_FROM_LIST)に違反しています。不適格な状態で VerifyAndroidPackageKeyOwnership または JustifyAndroidPackageKeyRegistration を呼び出しています。 Android Developer Console でデベロッパーの本人確認を完了し、まず GetAndroidPackageRegistrationPolicy を確認して、リソースの現在の state を調べます。
401 Unauthorized UNAUTHENTICATED OAuth 2.0 Bearer アクセス トークンがない、期限切れ、または無効であるか、API キーまたはサービス アカウントを使用して認証しようとしています。 スコープ https://www.googleapis.com/auth/androiddeveloperconsole を指定して、ユーザー委任された新しい OAuth 2.0 Bearer アクセス トークンを取得します。
403 Forbidden PERMISSION_DENIED 認証されたユーザーに、ターゲットの DeveloperAccount または AndroidPackage に対する権限がないか、Google Cloud プロジェクトで Android Developer Console API が有効になっていません。 ListDeveloperAccounts を使用してアカウント メンバーシップを確認し、Google Cloud コンソールで androiddeveloperconsole.googleapis.com が有効になっていることを確認します。
404 Not Found NOT_FOUND 指定された DeveloperAccount、AndroidPackage、または AndroidPackageKey リソースパスが存在しません。 ListDeveloperAccounts、ListAndroidPackages、または ListAndroidPackageKeys を使用してリソースパスを確認します。{key} ID には、コロンなしの小文字の 16 進数を使用してください。
409 Conflict ALREADY_EXISTS パッケージ名または SHA-256 証明書フィンガープリントが、このデベロッパー アカウントまたは別のデベロッパー アカウントですでに登録されています。 GetAndroidPackage または GetAndroidPackageKey を使用して既存の登録を検査するか、GetAndroidPackageRegistrationPolicy を使用して過去の所有権を確認します。
429 Too Many Requests RESOURCE_EXHAUSTED Google Cloud プロジェクトごとに 1 日あたり 2,000 件のリクエストというメソッドごとの割り当てを超過しました。 ジッターを伴う指数バックオフを実装し、高頻度のポーリング ループを回避します。
500 / 503 INTERNAL / UNAVAILABLE 一時的なバックエンド エラーまたは一時的なサービス停止。 切り捨て型指数バックオフを使用して、べき等リクエストを再試行します。

HTTP リクエストとレスポンスの例

ACCESS_TOKEN、1234567890、com.example.myapp、60e860e8... などのプレースホルダの値は、独自の値に置き換えます。

1. GetDeveloperAccount

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

回答:

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

2. ListDeveloperAccounts

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

回答:

{
  "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"

回答:

{
  "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"

回答:

{
  "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"

回答:

{
  "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"

回答:

{
  "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"

回答:

{
  "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"

回答:

{
  "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"

回答:

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

10. VerifyAndroidPackageKeyOwnership

オプション A: 単一リクエストのメディア アップロード

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"

オプション B: 再開可能なアップロード プロトコル(サイズの大きい APK または CI/CD に推奨)

ステップ 1: 再開可能なアップロード セッションを開始し、返された X-Goog-Upload-URL ヘッダーを抽出します。

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"
  }'

ステップ 2: 署名済み APK バイナリを UPLOAD_SESSION_URI にアップロードし、セッションを終了します。

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"

回答:

{
  "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"

回答:

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

参考情報