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公式ドキュメントにもとづく整理です。仕様は変わる可能性があるため、移行の作業前に公式の記載を確認してください。

