Fire TVとFireタブレット向けのアプリを開発中であれば、Amazonの開発者コンソールを使用したアプリの更新プロセスはすでにご存知かと思います。アプリのAPKを更新するたびに、改善した点についての説明やスクリーンショット、メタデータを更新することになるでしょう。開発者コンソールに加えて、新たに登場したアプリ申請APIを通じてこれらをアップデートできるということはご存知でしょうか?
アプリ申請APIを使用することで時間を短縮し、アプリの申請をプログラムによって処理できるため、開発者コンソールを使用して手動で操作する必要がなくなります。REST APIを使えば、既存の自動的ワークフローに加えて、スムーズにアップデートすることができます。この手順ガイドでは、アプリ申請APIの使用方法を順を追って説明します。
最初に、主要な概念をいくつか説明します。
ℹ️ 注: 開発者認証情報とアプリIDを取得するために、開発者コンソールにアクセスする必要があります。
このアプリ申請APIは、アプリファイルのアップロード、メタデータの管理、アプリの申請をサポートします。APIへのHTTP呼び出しを行うコードを使用することで、継続的なデプロイのためのCI/CDパイプラインに申請プロセスを直接統合できます。
アプリ申請APIを使用する場合、理解しておく必要がある概念が2つあります。 EditとETagです。
Editは、アプリに加える必要がある保留中の変更内容をすべて保持するコンテナやセッションのようなものです。アプリの更新は、新しいEditを作成することから始まります。次に、新しいAPKのアップロード、ローカリゼーションリスティングの更新、ロゴの置換など、すべての変更がEditに適用されます。準備ができたら、Editをコミットして、検証と公開のために変更内容を送信します。
ETagは、Edit内の現在の更新内容が互いに上書きされないようにするためにAPIが使用する一意の識別子です。アプリ申請APIはRESTfulであるため、このAPIには、APK、スクリーンショット、プレビュービデオなど、さまざまなリソースに対するGETリクエストのエンドポイントがあります。このようなGETリクエストのレスポンスヘッダーにはETagが含まれています。これは最新の状態でリソースを識別する一意の値です。
これらのリソースに影響するリクエストを送信する場合、リクエストヘッダーにリソースのETagを含めてください。これにより、サーバーは、開発者が特定のリソースの最新バージョンに変更を加えようとしていることを検証できます。すべてのPUTリクエストとDELETEリクエストに加え、一部のPOSTリクエストでは、検証のためにETagを指定する必要があります。
アプリ申請APIを初めて使用するときは、認証を容易にするために設定することがいくつかあります。APIの呼び出しにはベアラー認可トークンを含める必要があり、このトークンはLogin with Amazon(LWA)を介して取得します。
3. [セキュリティプロファイルを新規作成] をクリックします。
4. 新しいセキュリティプロファイルの名前と説明を入力します。
5. その後、[保存] をクリックします。
6. 新規作成したセキュリティプロファイルの一般情報が表示されます。 [ウェブ設定] タブをクリックします。
7. [ウェブ設定] ページに、クライアントIDとクライアントシークレットが表示されます。これらの情報をコピーして安全な場所に保存します。これらの値はLWAアクセストークンをリクエストする際に使用します。
8. [アプリ&サービス] > [APIアクセス] に移動します。
9. [アプリ申請API] で、作成した既存のセキュリティプロファイルを選択します。[関連付ける] をクリックします。
このセキュリティプロファイルを使用してアプリ申請APIを使用できるようにしたので、LWAトークンをリクエストできます。
10. [Login with Amazon] ページに移動します。
11. 使用するセキュリティプロファイルを選択します。
次に、[確認する] をクリックします。
LWAを使用する場合、ユーザーの個人データへのアクセスをリクエストするたびに、ユーザーにプライバシー規約同意書が表示されます。
13. 次の画面で、開発者の組織のプライバシー規約同意書のURLを入力します。
14. その後、[保存] をクリックします。
これで、LWAの構成は完了です。
ここまでで、LWAアクセストークンを取得するためのリクエストを送信し、セキュリティプロファイルのクライアントIDとクライアントシークレットを使用して認証できるようになりました。curlリクエストは次の例のようになります。
$ curl \
--url https://api.amazon.com/auth/O2/token
--request POST \
--header 'Content-Type: application/json' \
--data '{"grant_type":"client_credentials","client_id":"SECURITY-PROFILE-CLIENT-ID","client_secret":"SECURITY-PROFILE-CLIENT-SECRET","scope":"appstore::apps:readwrite"}'
{"access_token":"Atc|MQEBIEfESLSMKydIgiJPi-fhYvSSyOPXzgNvvT7WaWoBxKVfyCzexE31mmhC5w6rI-uI7kuoIAf4hSxIK33HSXeyO570fEHeb4gere8t5bUShE3iZgjXOQa5nGlNXsf01ZvOjig8M0Zdjd5s2_q5-2xMq6nQEZdCR3MOQtcM1SqZdLmnmEiTEQ-PwTWTAXAovkbY4i5NAdp9hhpvDneh7zQuOjDqnWyBqxG-qjCcxtRFVEhx9TZRDhsCUbUUiDLCFKMqWz8","scope":"appstore::apps:readwrite","token_type":"bearer","expires_in":3600}
取得されたaccess_tokenの値をコピーします。この値は、これ以降に行うアプリ申請APIのすべてのリクエストで使用します。このベアラー認可トークンを使用するには、次のようなAuthorizationヘッダーを追加します。
Authorization: Bearer Atc|MQEBIEfESLSMKydIgiJPi-fhYvSSyOPXzgNvvT7WaWoBxKVfyCzexE31mmhC5w6rI-uI7kuoIAf4hSxIK33HSXeyO570fEHeb4gere8t5bUShE3iZgjXOQa5nGlNXsf01ZvOjig8M0Zdjd5s2_q5-2xMq6nQEZdCR3MOQtcM1SqZdLmnmEiTEQ-PwTWTAXAovkbY4i5NAdp9hhpvDneh7zQuOjDqnWyBqxG-qjCcxtRFVEhx9TZRDhsCUbUUiDLCFKMqWz8
注: このトークンは、3,600秒(1時間)後に有効期限が切れます。現在のトークンが期限切れになった場合は、いつでも上記のリクエストを使用して新しいaccess_tokenを生成できます。
簡単に使用できるように、ターミナルセッションでアクセストークンを環境変数として保存します。
$ export \
TOKEN="Atc|MQEBIEfESLSMKydIgiJPi-fhYvSSyOPXzgNvvT7WaWoBxKVfyCzexE31mmhC5w6rI-uI7kuoIAf4hSxIK33HSXeyO570fEHeb4gere8t5bUShE3iZgjXOQa5nGlNXsf01ZvOjig8M0Zdjd5s2_q5-2xMq6nQEZdCR3MOQtcM1SqZdLmnmEiTEQ-PwTWTAXAovkbY4i5NAdp9hhpvDneh7zQuOjDqnWyBqxG-qjCcxtRFVEhx9TZRDhsCUbUUiDLCFKMqWz8"
アプリ申請APIのすべてのエンドポイントには、パスパラメーターとしてアプリIDが含まれています。
1. 開発者コンソールから、[アプリ一覧] に移動します。
2. 一覧でアプリを探してクリックします。アプリの [現行バージョン] セクションの最初のステップが表示されます。
3. ページの一番下までスクロールすると、[関連情報] にアプリIDが表示されています。
4. この値をコピーします。
APIのベースURLはhttps://developer.amazon.com/api/appstoreで、APIバージョンはv1です。すべてのリクエストのエンドポイントURLは、次のようになります。
https://developer.amazon.com/api/appstore/{apiVersion}/applications/{appId}
したがって、このサンプルアプリに関連するリクエストは、先頭が次のようなURLに送信されます。
https://developer.amazon.com/api/appstore/v1/applications/amzn1.devportal.mobileapp.a486d052fb504c08a80c221db7479ecb
5. 簡単に使用できるように、ターミナルセッションでAPIルートパスを環境変数として保存します。
$ export API_ROOT_PATH="https://developer.amazon.com/api/appstore/v1/applications/amzn1.devportal.mobileapp.a486d052fb504c08a80c221db7479ecb"
LWAトークンが有効で、APIパスが正しいことを確認するために、テストリクエストを送信します。アプリの現在アクティブなEditに関する詳細情報のリクエストを送信します。この情報は存在していないことが想定されますが、少なくともAPIリクエストが正しく処理されることは確認できます。
アプリ申請APIのリファレンスに記載されているように、アプリのアクティブなEditを取得するためのAPIリクエストは次のようになります。
$ curl \
--request GET \
--header "Authorization: Bearer $TOKEN" \
--url $API_ROOT_PATH/edits
{}
環境変数$TOKENと$API_ROOT_PATHを使用していることに注意してください。このプロセス全体でこれらの環境変数を使用します。
APIリクエストは成功し、レスポンスの{}はアプリのアクティブなEditがないことを示しています。
“Request is not authorized”
APIリクエストを送信したときに、次のようなレスポンスを受信することがあります。
{"message":"Request is not authorized."}
これは、LWAアクセストークンが無効であるか、期限切れであることを示している可能性があります。LWAアクセストークンを取得するための別のリクエストを送信します。次に、もう一度TOKEN環境変数を新しい値に割り当てます。
“API Version not supported”
受信したHTTPレスポンスコードが400で、errorMessageがAPI Version not supportedである場合は、APIルートパスのapiVersionの部分でv1を使用していることを確認します。
“No app found with the entered inputs”
受信したHTTPレスポンスコードが404で、errorMessageがNo app found with the entered inputsである場合は、APIルートパスにアプリIDを正しく追加していることを確認します。
“Unable to fetch the request scope for uri”
Unable to fetch the request scope for uriというレスポンスメッセージを受信した場合は、リクエストURLの残りの部分(API_ROOT_PATHの後)が、アプリ申請APIのリファレンスに記載されている有効なエンドポイントであることを確認します。さらに、そのエンドポイントに適切なリクエストコマンド(GET、POST、PUT、DELETEなど)を使用していることを確認します。
アプリ申請APIを使用するには、まずEditを新規作成します。このEdit内でアプリへのさまざまな変更を準備した後、すべての変更内容を一度にデプロイします。
Editを新規作成するには、POSTリクエストを/editsパスに送信します。
$ curl \
--request POST \
--header "Authorization: Bearer $TOKEN" \
--url $API_ROOT_PATH/edits
{"id":"amzn1.devportal.apprelease.a81b826e3e3743ea8a7886ac77f52c56","status":"IN_PROGRESS"}
このレスポンスには、新規作成されたEditのidが含まれています。ここで、現在アクティブなEditを取得するリクエストを再送信すると、この新規作成されたEditに関する情報が返されます。
$ curl \
--request GET \
--header "Authorization: Bearer $TOKEN" \
--url $API_ROOT_PATH/edits
{"id":"amzn1.devportal.apprelease.a81b826e3e3743ea8a7886ac77f52c56","status":"IN_PROGRESS"}
簡単に使用できるように、ターミナルセッションでEdit IDを新しい環境変数として設定します。
$ export \
EDIT_ID="amzn1.devportal.apprelease.a81b826e3e3743ea8a7886ac77f52c56"
Amazonアプリを更新する場合、通常、アプリのAPKファイルを管理する作業が発生します。アプリのAPKの一覧を取得するには、次のリクエストを送信します。
$ curl \
--request GET \
--header "Authorization: Bearer $TOKEN" \
--url $API_ROOT_PATH/edits/$EDIT_ID/apks
[{"versionCode":10000,"id":"M8NUQH070UH2I","name":"AAB1"}]
特定のAPKに関する詳細を取得するには、RESTful APIの表記規則に従って、APK IDを使用します。
$ curl \
--request GET \
--header "Authorization: Bearer $TOKEN" \
--url $API_ROOT_PATH/edits/$EDIT_ID/apks/M8NUQH070UH2I
{"versionCode":10000,"id":"M8NUQH070UH2I","name":"AAB1"}
Editに関連付けられたAPKをアップロードする場合、リクエストは次のようになります。
$ curl \
--request POST \
--header "Authorization: Bearer $TOKEN" \
--header "Content-type: application/octet-stream" \
--header "fileName: app-release-02.apk" \
--data-binary @/absolute/path/to/app-release-02.apk \
--url $API_ROOT_PATH/edits/$EDIT_ID/apks/upload
{"versionCode":10001,"id":"M4UQXH84SMZ4","name":"APK1"}
レスポンスには、新しくアップロードされたAPKのIDが示されます。
APKを置換(PUTを使用)したり、削除(DELETEを使用)したりすることもできます。ただし、これらのメソッドでは、APKリソースのETagを含める必要があります。ETagは、リソースのGETリクエストを実行したときに、レスポンスヘッダーに表示されます。たとえば、前の手順でアップロードしたAPKのETagを取得する場合、リクエストとレスポンスは次のようになります。
$ curl \
--include \
--request GET \
--header "Authorization: Bearer $TOKEN" \
--url $API_ROOT_PATH/edits/$EDIT_ID/apks/M4UQXH84SMZ4
HTTP/1.1 200 OK
Server: Server
Date: Mon, 06 Jan 2025 22:17:24 GMT
Content-Type: application/json
Content-Length: 55
Connection: keep-alive
x-amz-rid: H9SBRPW0R3WMK95ZVP62
x-amzn-RequestId: b3c3cd98-c5c5-4578-9efc-94e17d8d13df
ETag: 43d8a4205f9c59155cd7a104cc627d9b6694c3f2
Vary: Content-Type,Accept-Encoding,User-Agent
Strict-Transport-Security: max-age=47474747; includeSubDomains; preload
{"versionCode":10001,"id":"M4UQXH84SMZ4","name":"APK1"}
curl呼び出しに--includeを追加することで、レスポンスヘッダーが表示されます。このヘッダーは、このAPKリソースのETagが、43d8a4205f9c59155cd7a104cc627d9b6694c3f2であることを示しています。このAPKを削除するには、If-matchリクエストヘッダーにこの値を含めます。
$ curl \
--include \
--request DELETE \
--header "Authorization: Bearer $TOKEN" \
--header "If-Match: 43d8a4205f9c59155cd7a104cc627d9b6694c3f2" \
--url $API_ROOT_PATH/edits/$EDIT_ID/apks/M4UQXH84SMZ4
HTTP/1.1 204 No Content
…
もう一度APKの詳細を取得すると、正常に削除されたことが示されます。
$ curl \
--request GET \
--header "Authorization: Bearer $TOKEN" \
--url $API_ROOT_PATH/edits/$EDIT_ID/apks/M4UQXH84SMZ4 | json_pp
{
"errors" : [
{
"errorCode" : "error_apk_not_found",
"errorMessage" : "No APK found with the given APK ID."
}
],
"httpCode" : 404,
"message" : "Not Found"
}
APKファイルが非常に大きい場合は、/large/uploadエンドポイントを使用します。
アプリの申請ごとに、複数言語のリスティングの詳細を含めることができます。リスティングの形式は次のとおりです。
{
"language": "string",
"title": "string",
"fullDescription": "string",
"shortDescription": "string",
"recentChanges": "string",
"featureBullets": [
"string"
],
"keywords": [
"string"
]
}
注:keywordsは文字列の配列で、各文字列はスペースを含まない1つの単語である必要があります。
サポート対象の言語のリストは、こちらを参照してください。アプリのローカライズされたリスティングをすべて表示するには、次のコマンドを実行します。
$ curl \
--request GET \
--header "Authorization: Bearer $TOKEN" \
--url $API_ROOT_PATH/edits/$EDIT_ID/listings | json_pp
{
"listings" : {
"en-US" : {
"featureBullets" : [
"Images of coffee"
],
"fullDescription" : "This is a store that sells digital assets for use in websites and other promotional materials.",
"keywords" : [
"digital",
"images",
"assets",
"Coffee"
],
"language" : "en-US",
"recentChanges" : null,
"shortDescription" : "This is a store that sells digital assets for use in websites and other promotional materials.",
"title" : "Digital Assets Store"
}
}
}
前の呼び出しは、アプリのすべてのローカリゼーションリスティングを返します。現在はen-USの1つのみです。特定のリスティングの詳細を取得するには、GETエンドポイントパスに言語を追加します。
$ curl \
--include \
--request GET \
--header "Authorization: Bearer $TOKEN" \
--url $API_ROOT_PATH/edits/$EDIT_ID/listings/en-US
HTTP/1.1 200 OK
…
ETag: 5c8149f2f9f3d9b818e89ec9b797648bd32d7cec
…
{"language":"en-US","title":"Digital Assets Store","fullDescription":"This is a store that sells digital assets for use in websites and other promotional materials.","shortDescription":"This is a store that sells digital assets for use in websites and other promotional materials.","recentChanges":null,"featureBullets":["Images of coffee"],"keywords":["digital","images","assets","Coffee"]}
レスポンスヘッダーを表示するために--include引数を追加したため、このローカリゼーションリスティングリソースのETagが含まれています。たとえば、このETagを使用してリスティングを更新できます。
$ curl \
--include \
--request PUT \
--header "Authorization: Bearer $TOKEN" \
--header "If-Match: 5c8149f2f9f3d9b818e89ec9b797648bd32d7cec" \
--url $API_ROOT_PATH/edits/$EDIT_ID/listings/en-US \
--data '{"language":"en-US", "title":"DAS: Digital Assets Store", "fullDescription":"The Digital Assets Store sells images and logos for use in websites and other promotional materials.", "shortDescription":"Promotional/website images and logos for sale.", "recentChanges":"Updated title and descriptions, added keywords", "featureBullets":["Images of coffee"], "keywords":["digital","images","AI-generated","Coffee"]}'
HTTP/1.1 200 OK
…
ETag: 8d531dc2aa6ed59072055cfc83e86c419a7032a9
…
{"language":"en-US","title":"DAS: Digital Assets Store","fullDescription":"The Digital Assets Store sells images and logos for use in websites and other promotional materials.","shortDescription":"Promotional/website images and logos for sale.","recentChanges":"Updated title and descriptions, added keywords","featureBullets":["Images of coffee"],"keywords":["digital","images","Coffee","AI-generated"]}
まだ存在していないローカリゼーション用に新しいリスティングを追加する場合は、まずリスティングのGETで、レスポンスヘッダーからそのETagを取得します。レスポンスの本文は空ですが、以降のPUTリクエストでリスティングを新規作成するには、この空のリスティングのETagを使用する必要があります。
既存のローカリゼーションリスティングを削除するには、ETagを使用してDELETEリクエストを送信します。
すべてのAmazonアプリには、次の形式の基本的な詳細情報が含まれます。
{
"defaultLanguage": "string",
"contactWebsite": "string",
"contactEmail": "string",
"contactPhone": "string"
}
アプリ申請APIでは、次のようなGETリクエストでアプリの詳細を取得できます。これらの詳細をPUTリクエストで変更する場合は、このレスポンスヘッダーからETagを取得する必要があります。
$ curl \
--include \
--request GET \
--header "Authorization: Bearer $TOKEN" \
--url $API_ROOT_PATH/edits/$EDIT_ID/details
…
ETag: 10963098c5cf18378c3d47058b5355d44dd5d050
…
{"defaultLanguage":"en-US","contactWebsite":null,"contactEmail":"amazon_app_developer@example.com","contactPhone":null}
アプリの詳細を更新するリクエストは、次のようになります。
$ curl \
--include \
--request PUT \
--header "If-Match: 10963098c5cf18378c3d47058b5355d44dd5d050" \
--header "Content-type: application/json" \
--header "Authorization: Bearer $TOKEN" \
--url $API_ROOT_PATH/edits/$EDIT_ID/details \
--data '{"defaultLanguage":"en-US","contactWebsite":"https://developer.amazon.com","contactEmail":"appdevboss@example.com","contactPhone":"111-222-3333"}'
HTTP/1.1 200 OK
…
ETag: 0560792b04b84d0893379f79fc5464c03178ba77
…
{"defaultLanguage":"en-US","contactWebsite":"https://developer.amazon.com","contactEmail":"appdevboss@example.com","contactPhone":"111-222-3333"}
APKで指定されている複数のターゲットデバイスを確認するには、リクエストパスでAPK IDを指定して、次のリクエストを送信します。
$ curl \
--request GET \
--header "Authorization: Bearer $TOKEN" \
--url $API_ROOT_PATH/edits/$EDIT_ID/apks/M8NUQH070UH2I/targeting \
| json_pp
{
"amazonDevices" : [
{
"id" : "amzn1.appstore.device.1S3STLD1YMVDD",
"name" : "Funai 4K - Fire TV F560 Series",
"reason" : {},
"status" : "NOT_TARGETING"
},
{
"id" : "amzn1.appstore.device.2NHA4WR6DZVME",
"name" : "Fire TV 2-Series",
"reason" : {},
"status" : "NOT_TARGETING"
},
{
"id" : "amzn1.appstore.device.D8MCACTJ5P8M",
"name" : "Fire HD 10 (2023)",
"reason" : {},
"status" : "TARGETING"
},
…
{
"id" : "amzn1.appstore.device.F5BFMITYX6KI",
"name" : "Galaxy S4",
"reason" : {
"details" : [
"android:minSdkVersion = '24'; device requires '21'"
],
"reason" : "The device is incompatible with manifest."
},
"status" : "DISABLED"
}
],
"otherAndroidDevices" : "TARGETING"
}
結果のJSONに含まれるデバイスのリストは広範囲にわたり、各デバイスのstatusは指定されたAPKが適用されるかどうかを示します。APKのデバイスターゲティングの情報を変更するには、前のリクエストのレスポンスヘッダーからETagを取得し、その後のPUTリクエストに更新したJSONの本文を含めて送信します。
アプリのローカライズされたリスティングには、それぞれ画像とビデオも関連付けられています。複数の画像のエンドポイントは、ローカリゼーションリスティングのパスで始まり、その後にimageTypeが続きます。指定できるimageTypeの値の一覧は、こちらを参照してください。たとえば、en-USリスティングのlarge-iconsに関する情報を取得するには、次のリクエストを送信します。
$ curl \
--include \
--request GET \
--header "Authorization: Bearer $TOKEN" \
--url $API_ROOT_PATH/edits/$EDIT_ID/listings/en-US/large-icons
HTTP/1.1 200 OK
…
ETag: 8d531dc2aa6ed59072055cfc83e86c419a7032a9
…
{"images":[{"id":"amzn1.dex.asset.69c2f76ae9604091a4dd2e10f8ec9a50"}]}
既存の画像を削除するには、画像アセットIDをパスに追加して、DELETEリクエストを送信します。リクエストのヘッダーに必ずETagを含めてください。
$ curl \
--request DELETE \
--header "If-Match: 8d531dc2aa6ed59072055cfc83e86c419a7032a9" \
--header "Authorization: Bearer $TOKEN" \
--url $API_ROOT_PATH/edits/$EDIT_ID/listings/en-US/large-icons/amzn1.dex.asset.69c2f76ae9604091a4dd2e10f8ec9a50
APIには、特定のimageTypeのすべての画像を削除するためのエンドポイントや、1つの特定の画像を削除するためのエンドポイントがあります。
新しい画像をアップロードするには、application/octet-streamコンテンツを指定して、POSTリクエストを送信します。次に例を示します。
$ curl \
--request POST \
--header "Authorization: Bearer $TOKEN" \
--header "Content-type: application/octet-stream" \
--data-binary @/absolute/path/to/image-file.png \
--url $API_ROOT_PATH/edits/$EDIT_ID/listings/en-US/large-icons/upload
{"image":{"id":"amzn1.dex.asset.5e90a58830e048a796aef9db6ebf6a02"}}
ビデオの場合も同様ですが、ビデオには複数のタイプはありません。特定のローカリゼーションリスティングのすべてのビデオの情報を取得するには、次のGETリクエストを送信します。
$ curl \
--include \
--request GET \
--header "Authorization: Bearer $TOKEN" \
--url $API_ROOT_PATH/edits/$EDIT_ID/listings/en-US/videos
HTTP/1.1 200 OK
…
ETag: ee763ba20a0fc41c263ad5d9547cab1f1b021015
…
{"videos":[]}
ビデオをアップロードするには、If-MatchヘッダーにETagを含めて、同じエンドポイントパスにPOSTリクエストを送信します。画像と同様に、リスティングのすべてのビデオを削除するエンドポイントや、アセットIDに基づいて特定のビデオを削除するエンドポイントがあります。
デフォルトでは、Editをコミットすると、審査と公開の手続きがすぐに開始されます。ただし、Editの公開日を設定する場合は、/availabilityエンドポイントを使用します。現在の公開日の設定を確認するには、次のリクエストを送信します。
$ curl \
--include \
--request GET \
--header "Authorization: Bearer $TOKEN" \
--url $API_ROOT_PATH/edits/$EDIT_ID/availability
HTTP/1.1 200 OK
…
ETag: ee763ba20a0fc41c263ad5d9547cab1f1b021015
…
{"publishingDate":{"dateTime":null,"zoneId":null}}
提供状況を変更するには、前のリクエストで取得したETagをPUTリクエストで使用します。
$ curl \
--request PUT \
--header "If-Match: ee763ba20a0fc41c263ad5d9547cab1f1b021015" \
--header "Content-type: application/json" \
--header "Authorization: Bearer $TOKEN" \
--url $API_ROOT_PATH/edits/$EDIT_ID/availability \
--data '{"publishingDate":{"dateTime":"2025-03-01T12:00:00","zoneId":"US/Pacific"}}'
{"publishingDate":{"dateTime":"2025-03-01T12:00:00","zoneId":"US/Pacific"}}
アクティブなEditで必要な更新をすべて行ったら、Editをコミットする準備は完了です。POSTリクエストを送信してEditをコミットする前に、現在のEditリソースのETagを取得します。
$ curl \
--include \
--request GET \
--header "Authorization: Bearer $TOKEN" \
--url $API_ROOT_PATH/edits
…
ETag: 437b8a79adec568ce90e5d3c275808a36fdb5869
…
{"id":"amzn1.devportal.apprelease.a81b826e3e3743ea8a7886ac77f52c56","status":"IN_PROGRESS"}
このETagを使用してEditをコミットします。
$ curl \
--request POST \
--header "If-Match: 437b8a79adec568ce90e5d3c275808a36fdb5869" \
--header "Authorization: Bearer $TOKEN" \
--url $API_ROOT_PATH/edits/$EDIT_ID/commit
{"id":"amzn1.devportal.apprelease.a81b826e3e3743ea8a7886ac77f52c56"}
Editをコミットした後、ステータスが変更されていることを確認します。
$ curl \
--request GET \
--header "Authorization: Bearer $TOKEN" \
--url $API_ROOT_PATH/edits/
{"id":"amzn1.devportal.apprelease.a81b826e3e3743ea8a7886ac77f52c56","status":"SUBMITTED"}
開発者コンソールでは、コミットしたEditに基づく [次期バージョン] がアプリに追加されていることを確認できます。
これで完了です。 アプリ申請APIを正しく使用して、開発者コンソールのUIではなく、APIリクエストでアプリを更新するすべての手順を処理できました。
アプリ申請APIによって、開発者がアプリの申請プロセスを容易に効率化できるようになります。作成したコードをCI/CDパイプラインに統合することで、アプリの申請プロセスの自動化と一貫性を実現でき、手動で介入する必要がなくなります。
詳しくは、以下のリソースを参照してください。