AWS Marketplace Agreement APIの2026年5月アップデートを検証

こんにちは。今回はアップデートで追加されたAgreement APIの新しいエンドポイントについて検証した結果を備忘録として残します。

これまでAWS Marketplaceでの製品購入やプライベートオファーの受諾は、AWSコンソール上での手動操作(UI操作)が必要になっていました。

https://aws.amazon.com/jp/about-aws/whats-new/2026/05/aws-marketplace-agreements-api/

2026年5月のアップデートにより、Agreement APIに新しいエンドポイントが複数追加され、プログラム経由で見積もりの生成から契約の受諾までを完結できるようになったようです。今回はその中でもプライベートオファー受諾の挙動を検証した結果をまとめます。

1. 従来の Agreement API の使い方

アップデート以前よりAgreement APIは、主に以下のような参照系の操作で利用することができました。

  • search-agreements:契約一覧の検索
  • describe-agreement:詳細な契約情報の確認
  • get-agreement-terms:契約条件の取得

「現在の契約状態を参照する」ことは可能でしたが、「提示されたオファーを受け入れて契約を成立させる」というアクションはAPI化されておらず、最終的な購買アクションは手動で行う必要がありました。

2. 検証:新エンドポイントによるオファー受諾の実行

今回のアップデートにより、契約の作成を制御するエンドポイントが追加されました。セラーからプライベートオファー(offer-xxxxxxxxxxxxx)が提示されている状態を前提に、AWS CLIを用いて契約の生成から受諾までのフローを検証してみました。

なお、create-agreement-request を実行するためには、事前にいくつかの情報を収集する必要があります。具体的には agreement-proposal-identifier と各 term の id が必要ですが、これらはオファーIDから Discovery API を利用して取得します。

ステップ1:Discovery API でオファー情報を取得する

まず、marketplace-discoveryget-offer を使って agreement-proposal-identifier を取得します。

aws marketplace-discovery get-offer \
    --offer-id "offer-xxxxxxxxxxxxx" \
    --region us-east-1

レスポンス:

{
    "offerId": "offer-xxxxxxxxxxxxx",
    "catalog": "AWSMarketplace",
    "offerName": "test offer",
    "agreementProposalId": "at-xxxxxxxxxxxxxxxxxxxxxxxxx",
    "expirationTime": "2026-07-01T08:59:59.999000+09:00",
    "availableFromTime": "2026-06-10T02:31:07+09:00",
    "sellerOfRecord": {
        "sellerProfileId": "seller-xxxxxxxxxxxxx",
        "displayName": "Example Corp."
    },
    "pricingModel": {
        "pricingModelType": "CONTRACT",
        "displayName": "Contract"
    },
    "badges": [
        {
            "displayName": "Private Pricing",
            "badgeType": "PRIVATE_PRICING"
        }
    ],
    "associatedEntities": [
        {
            "product": {
                "productId": "prod-xxxxxxxxxxxxx",
                "productName": "SaaS Product Example"
            }
        }
    ]
}

ここで agreementProposalIdat- で始まる値)を控えておきます。

ステップ2:Discovery API で term の ID を取得する

次に、get-offer-terms で各 term の id を取得します。

aws marketplace-discovery get-offer-terms \
    --offer-id "offer-xxxxxxxxxxxxx" \
    --region us-east-1

レスポンス:

{
    "offerTerms": [
        {
            "legalTerm": {
                "id": "term-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
                "type": "LegalTerm",
                "documents": [
                    {
                        "type": "StandardEula",
                        "url": "https://...",
                        "version": "2022-07-14"
                    }
                ]
            }
        },
        {
            "fixedUpfrontPricingTerm": {
                "id": "term-yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy",
                "type": "FixedUpfrontPricingTerm",
                "currencyCode": "USD",
                "price": "0",
                "grants": [
                    {
                        "dimensionKey": "api",
                        "displayName": "apiname",
                        "maxQuantity": 1
                    },
                    {
                        "dimensionKey": "api2",
                        "displayName": "api2",
                        "maxQuantity": 1
                    }
                ]
            }
        },
        {
            "validityTerm": {
                "id": "term-zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz",
                "type": "ValidityTerm",
                "agreementDuration": "P2M"
            }
        },
        {
            "paymentScheduleTerm": {
                "id": "term-wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww",
                "type": "PaymentScheduleTerm",
                "currencyCode": "USD",
                "schedule": [
                    {
                        "chargeDate": "2026-06-09T09:00:00+09:00",
                        "chargeAmount": "0"
                    }
                ]
            }
        }
    ]
}

各 term の id を控えます。これで create-agreement-request に必要な情報がすべて揃いました。

注意: Discovery API は CloudShell(コンソールセッション認証情報)からは実行できません。IAMユーザーの認証情報を使ってローカル環境等から実行する必要があります。

ステップ3:create-agreement-request による見積もり起票

ステップ1・2で取得した agreementProposalId と各 term の id を指定し、契約リクエストを作成します。

aws marketplace-agreement create-agreement-request \
    --intent "NEW" \
    --agreement-proposal-identifier "at-xxxxxxxxxxxxxxxxxxxxxxxxx" \
    --requested-terms '[
        {"id": "term-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"},
        {"id": "term-yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy"},
        {"id": "term-zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz"},
        {"id": "term-wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww"}
    ]' \
    --region us-east-1

レスポンス:

{
    "agreementRequestId": "ar-xxxxxxxxxxxxxxxxxxxxxxxxx",
    "chargeSummary": {
        "currencyCode": "USD",
        "newAgreementValue": "0.00",
        "expectedCharges": [],
        "itemizedCharges": []
    }
}

コマンドが成功すると agreementRequestId が発行され、見積もり内容(chargeSummary)が返却されます。この時点ではまだ契約は成立しておらず、内容の確認ができる状態です。

ステップ4:accept-agreement-request による契約の受諾(締結)

ステップ3で取得した agreementRequestId を指定し、契約を正式に受諾します。

aws marketplace-agreement accept-agreement-request \
    --agreement-request-id "ar-xxxxxxxxxxxxxxxxxxxxxxxxx" \
    --region us-east-1

レスポンス:

{
    "agreementId": "agmt-xxxxxxxxxxxxxxxxxxxxxxxxx"
}

処理が完了すると agreementId が返却され、契約が成立します。Marketplace製品の利用権(エンタイトルメント)が有効化されます。

一度もAWSコンソールを介することなく、CLIベースで契約手続きが完了することを確認できました。

まとめ

セラー側の自動化は視野に入れていましたが、今回の新しいエンドポイントを見て、受け手である「買い手側の受諾手動」というプロセスにも改善の余地があったのだな、と少し視点が変わった感覚があります。購買側も自社システムにMarketplaceを組み込めるようになることで、今後のB2B取引がよりスムーズになっていくと期待しています。