OffersをOffersV2へ|Creators APIで価格・在庫の取り方が変わる点

PA-API 5で価格や在庫をOffersから取っていた場合、Creators APIではそのままでは動きません。移行ガイドの比較表で、Offersは「Not Available. use OffersV2」とされています。OffersV2では価格の入れ物が1段深くなり(Price.Money.Amount)、最安値や出品数(Summaries)、プライム対象かどうか(DeliveryInfo)などは提供されなくなりました。この記事では、公式の対応表から項目の移り先を整理し、公式のサンプル応答から価格・割引・在庫を取り出すPythonを動かします。

(確認:Amazonアソシエイト「Creators API Documentation」の Migrating to Creators API from PA-API・OffersV2・Best Programming Practices。確認日:2026年10月29日)

何が変わったか

項目 PA-API 5 Creators API
価格・在庫の取り方 Offers.Listings・Offers.Summaries OffersV2.Listingsだけ
パラメーターの書き方 先頭が大文字(ItemIds) 先頭が小文字(itemIds)

OffersV2 のページには「OffersV2 provides only featured listings as shown to retail customers on Amazon Detail Page buybox」とあり、商品ページで一番上に出る出品だけが返ります。カートの出品が無い商品は、在庫切れとして返ります。

項目の移り先(公式の対応表から抜粋)

旧 Offers OffersV2
Offers.Listings.Price.Amount OffersV2.Listings.Price.Money.Amount
Offers.Listings.Price.DisplayAmount OffersV2.Listings.Price.Money.DisplayAmount
Offers.Listings.SavingBasis.Amount OffersV2.Listings.Price.SavingBasis.Money.Amount
Offers.Listings.Availability.Type OffersV2.Listings.Availability.Type
Offers.Listings.LoyaltyPoints.Points OffersV2.Listings.LoyaltyPoints.Points(ポイントは日本だけ)
Offers.Summaries(最安値・最高値・出品数) なし
Offers.Listings.DeliveryInfo(プライム対象・送料無料・送料) なし
Offers.Listings.Promotions なし
Offers.Listings.MerchantInfo.FeedbackRating なし

「Not Available」の項目は、対応表に「intentionally discontinued(意図して廃止)」と書かれています。記事のテンプレートで「最安値」「プライム対象」を表示していた場合は、その欄を消すか、別の書き方に変える必要があります。

代わりに新しく加わった項目として、セールの情報(DealDetails:対象者・バッジ・開始と終了の時刻・消化率)と、割引の元になった価格の種類(SavingBasisType)があります。

コード:価格・割引・在庫を取り出す

公式の OffersV2 のページにあるサンプル応答(米国の商品の例)の一部(dealDetailsなどを省略)を入れ、価格・比べる元の価格・割引・在庫を取り出します。前半では、旧項目の移り先を表示しています。

# OffersV2 の応答から、価格・在庫・割引を取り出す
# 応答は公式ドキュメント「OffersV2」の Sample Response(米国の例)の一部。dealDetails・pricePerUnit を省略(2026年10月29日に確認)
import json

SAMPLE = '''{"itemsResult": {"items": [{"asin": "B00MNV8E0C",
 "offersV2": {"listings": [{
  "availability": {"maxOrderQuantity": 1, "minOrderQuantity": 1, "type": "IN_STOCK"},
  "condition": {"conditionNote": "", "subCondition": "Unknown", "value": "New"},
  "isBuyBoxWinner": true,
  "merchantInfo": {"name": "Amazon.com"},
  "price": {"money": {"amount": 59.49, "currency": "USD", "displayAmount": "$59.49"},
            "savingBasis": {"money": {"amount": 69.99, "currency": "USD", "displayAmount": "$69.99"},
                            "savingBasisType": "LIST_PRICE", "savingBasisTypeLabel": "List Price"},
            "savings": {"money": {"amount": 10.5, "currency": "USD", "displayAmount": "$10.50"}, "percentage": 15}},
  "type": "LIGHTNING_DEAL", "violatesMAP": false}]}}]}}'''

# 旧 Offers(V1)の項目が OffersV2 のどこに移ったか(公式の対応表から抜粋)
MAP = {
    'Offers.Listings.Price.Amount': 'OffersV2.Listings.Price.Money.Amount',
    'Offers.Listings.Price.DisplayAmount': 'OffersV2.Listings.Price.Money.DisplayAmount',
    'Offers.Listings.SavingBasis.Amount': 'OffersV2.Listings.Price.SavingBasis.Money.Amount',
    'Offers.Listings.Availability.Type': 'OffersV2.Listings.Availability.Type',
    'Offers.Summaries.LowestPrice': None,
    'Offers.Listings.DeliveryInfo.IsPrimeEligible': None,
}

for v1, v2 in MAP.items():
    print(f'{v1:<46} → {v2 or "なし(OffersV2 では提供されない)"}')
print()

for item in json.loads(SAMPLE)['itemsResult']['items']:
    for lst in item.get('offersV2', {}).get('listings', []):
        p = lst.get('price', {})
        money = p.get('money', {})
        basis = p.get('savingBasis', {}).get('money', {})
        sv = p.get('savings', {})
        print('ASIN', item['asin'])
        print('  価格', money.get('displayAmount'), '/ 比べる元の価格', basis.get('displayAmount'), p.get('savingBasis', {}).get('savingBasisType'))
        print('  割引', sv.get('money', {}).get('displayAmount'), f"{sv.get('percentage')}%")
        print('  在庫', lst.get('availability', {}).get('type'), '/ 種類', lst.get('type'), '/ カート獲得', lst.get('isBuyBoxWinner'))

実行の結果(Python 3)

Offers.Listings.Price.Amount                   → OffersV2.Listings.Price.Money.Amount
Offers.Listings.Price.DisplayAmount            → OffersV2.Listings.Price.Money.DisplayAmount
Offers.Listings.SavingBasis.Amount             → OffersV2.Listings.Price.SavingBasis.Money.Amount
Offers.Listings.Availability.Type              → OffersV2.Listings.Availability.Type
Offers.Summaries.LowestPrice                   → なし(OffersV2 では提供されない)
Offers.Listings.DeliveryInfo.IsPrimeEligible   → なし(OffersV2 では提供されない)

ASIN B00MNV8E0C
  価格 $59.49 / 比べる元の価格 $69.99 LIST_PRICE
  割引 $10.50 15%
  在庫 IN_STOCK / 種類 LIGHTNING_DEAL / カート獲得 True

価格はprice.moneyの下、割引の元の価格はprice.savingBasis.moneyの下、割引額と割合はprice.savingsの下にあります。項目は無いこともあるので、.get()で取り、無ければ表示しない作りにしています。

在庫の種類(Availability.Type)

値 意味(公式の説明)
IN_STOCK 在庫あり
IN STOCK SCARCE 在庫はあるが少ない
OUT OF STOCK 在庫切れ
PREORDER 予約受付中
AVAILABLE_DATE 今は買えず、将来の日付から買える
LEADTIME 注文から出荷まで時間がかかる
UNAVAILABLE / UNKNOWN 買えない/不明

表記は公式ドキュメントのとおりで、アンダースコアの有る値と無い値が混ざっています。実際の応答で返る文字列を確かめてから、判定の条件を書いてください。

記事に価格を載せる時の注意

  • Best Programming Practices のキャッシュの表では、Offers の保存時間(TTL)は1時間。取得した価格を長く使い回さない
  • 価格は変わるため、いつ時点の価格かを添え、最終的な価格はAmazonの商品ページで確認するよう書く(Amazonアソシエイトで価格を載せる時の規約)
  • セールの終了時刻(EndTime)は、公式の説明では入っていないこともある。入っていないセールは期限が決まっていない

PA-API 5の403から移行の全体の流れはAmazon PA-APIが403になる理由と、Creators APIへの移行、資格情報の発行はAmazon Creators API 資格情報の取得手順にまとめています。Creators APIを使うには、過去30日間に10件以上の適格売上が必要です。

当サイトが開発・販売しているAmazon Auto Posts(¥9,800・買い切り)は、Creators APIで商品名・画像・価格などを取得し、商品ボックスとして本文に入れます。自社製品なので割り引いて読んでいただいて構いません。使うには Creators API の利用資格(過去30日間に10件以上の適格売上)が要り、OpenAIの利用料は購入代金に含まれません。

この記事で確かめていないこと

  • 日本の商品で実際に返る応答(APIは呼んでいない。サンプルは公式ドキュメントの米国の例)
  • LoyaltyPointsが日本の商品で常に返るか
  • カートの出品が無い商品で、在庫の値が実際にどれになるか(公式は「out of stock」と説明)

まとめ

  • Creators APIでは Offers が使えず、OffersV2 を使う。価格はPrice.Money.Amountに移った
  • 最安値・出品数・プライム対象・送料・プロモーションは提供されない。記事のテンプレートの欄を見直す
  • 返るのはカートの出品だけ。価格の保存は1時間を目安にする

本記事は2026年10月29日時点のCreators API公式ドキュメントにもとづく整理です。仕様は変わる可能性があるため、移行の作業前に公式の記載を確認してください。