こんにちは、DXCEL WAVEの運営者(@dxcelwave)です!
- PythonでAmazon SP-APIを操作できるようになる。
- Amazon SP-APIでの商品価格(参照価格や最安値価格)の調査方法が分かる。
- Amazon SP-APIでの競合の出品状況(コンディション・在庫数など)の調査方法が分かる。
Amazon セリングパートナーAPI(SP-API)とは
Amazon SP-API(セリングパートナーAPI)とは、Amazonのセリングパートナー向けに、商品リサーチ・出品・注文対応・配送・その他会計管理などの機能を多数揃えた、業務効率化・自動化を実現するためのWebサービスです。
Amazon SP-APIでできること
Amazon SP-APIを用いることで商品リサーチの自動化をはじめ、自社商品の出品状況・注文状況・配送内容・売上情報のレポーティングなどの情報が操作できるようになるため、Amazonサプライチェーン全体での業務効率化が実現できます。
具体的にSP-APIには次のような機能が踏襲されています。
- Amazon商品データ(商品詳細・価格・在庫・売上ランキング)の取得
- 商品販売にかかる手数料計算
- 商品の出品状況の管理(商品登録・参照・更新・削除)
- 商品の注文状況の管理
- FBA配送に対する適格性(禁止・規制品)データの取得
- 会計(商品売上等)データの取得・レポーティング
- 顧客との問い合わせ・メッセージの管理
- 通知情報の管理
Amazon SP-APIの利用条件
Amazon SP-APIは、Amazon開発者として登録することで利用できるようになります。開発者登録の条件として以下を満たす必要があることに注意が必要です。
- Amazonセラーセントラルのアカウントを保有していること
- 上記アカウントステータスが「大口出品」であること
【参考】物販業務を効率化する代替手段
前述で述べた通り、Amazon SP-APIの利用にはAmazonセラーセントラルの大口出品者としてのアカウント登録が必須です。
大口出品者になると、月額4,900円の支払いが発生することに考慮が必要です。
SP-APIを利用しない代替手段として、既存のツールを用いて物販自動化を検討する方法もあります。筆者おすすめの使い勝手が良い既存ツールも合わせて紹介します。
こんな方におすすめ!
- オンラインショッピングにおける販路を拡大したい
- 商品リサーチに時間をかけたくない
- 中国輸入やOEMに興味がある
- 競合他社を効率的に分析したい
- 自社ショップの商品売上等の時系列分析をやりたい
本記事で紹介する内容
本記事ではPythonとAmazon SP-APIを用いて下記を実現するプログラミング手法を解説します。
- 競合商品の価格(参考価格・最安値価格)調査の効率化
- 競合商品の出品状況(在庫数・コンディション・フルフィルメントチャネル・発送時間)調査の効率化
【事前準備】Python×Amazon SP-API
Amazon SP-APIの活用には、下記Pythonライブラリの事前インストールが必要です。
pip install python-amazon-sp-api
後述で紹介するプログラミングコードの実行には、API情報の紐付けが必須です。下記credentials
内に示すAPI情報を事前に入力し、Pythonスクリプト先頭にこのコードを貼り付けておきましょう。
credentials=dict(
refresh_token = 'リフレッシュトークン', # Amazon Seller開発者登録後に入手可能
lwa_app_id = 'クライアントID', # Amazon Seller開発者登録後に入手可能
lwa_client_secret = 'クライアント機密情報', # Amazon Seller開発者登録後に入手可能
aws_access_key = 'AWS アクセスキー', #(AWS IAMユーザーロール登録時に取得可能)
aws_secret_key = 'AWS シークレットキー', #(AWS IAMユーザーロール登録時に取得可能)
role_arn = 'AWS IAM ARN', #(AWS IAMユーザーロール登録時に取得可能)
)
【実践】Amazon SP-API|競合商品の価格・在庫データ分析
実際にPythonとAmazonセリングパートナーAPI(SP-API)を用いて競合商品の価格調査および在庫状況の調査を行う方法について解説します。
以下「Pythonコード」と「コード実行後の出力イメージ」をそれぞれ示します。
ASINコードが同一の商品の参照価格・在庫数を抽出
引数にASINコードリストを渡し、次のようなコードを実行すると、下記出力結果が得られます。
- ASINコード指定商品の参考価格(Listing Price)と送料込み参考価格(Landed Price)
- ASINコード指定商品における出品中の新品在庫数と中古在庫数
- ASINコード指定商品のセールスランキング
from sp_api.api import Products
from sp_api.base.marketplaces import Marketplaces
def productCompetitive_asin(ASIN_LIST):
# 商品検索用オブジェクト
products = Products(marketplace=Marketplaces.JP, # 対象のマーケットプレイスを指定
credentials=credentials) # API情報を指定
# 結果取得
result = products.get_competitive_pricing_for_asins(ASIN_LIST)
return result()
# 引数(ASINのリスト)
ASIN_LIST = ['B07SK4W1VJ','B097B2HQ5R']
# 関数実行
productCompetitive_asin(ASIN_LIST)
# 出力イメージ
# [{'ASIN': 'B07SK4W1VJ',
# 'Product': {'CompetitivePricing': {'CompetitivePrices': [{'belongsToRequester': False,
# 'condition': 'New',
# 'subcondition': 'New',
# 'Price': {'Points': {'PointsMonetaryValue': {'CurrencyCode': 'JPY',
# 'Amount': 93},
# 'PointsNumber': 93},
# 'LandedPrice': {'CurrencyCode': 'JPY', 'Amount': 9166},
# 'ListingPrice': {'CurrencyCode': 'JPY', 'Amount': 9259},
# 'Shipping': {'CurrencyCode': 'JPY', 'Amount': 0}},
# 'CompetitivePriceId': '1'}],
# 'NumberOfOfferListings': [{'condition': 'New', 'Count': 7},
# {'condition': 'Any', 'Count': 7}]},
# 'Identifiers': {'MarketplaceASIN': {'MarketplaceId': 'A1VC38T7YXB528',
# 'ASIN': 'B07SK4W1VJ'}},
# 'SalesRankings': []},
# 'status': 'Success'},
アメリカなど海外のAmazonマーケットプレイスで商品検索・データ収集したい場合は、
上記のmarketplace=Marketplaces.JP
をmarketplace=Marketplaces.US
に変更します。
ただし、海外Amazonマーケットプレイスでの商品検索には、その国でのAmazon開発者登録が別途必要です。
セラーSKUが同一の商品の参照価格・在庫情報を抽出
引数にSeller SKU(商品管理番号)のリストを渡し、コードを実行すると、下記出力結果が得られます。
- SKU指定商品の参考価格(Listing Price)と送料込み参考価格(Landed Price)
- SKU指定商品における出品中の新品在庫数と中古在庫数
- SKU指定商品のセールスランキング
from sp_api.api import Products
from sp_api.base.marketplaces import Marketplaces
def productCompetitive_skus(SELLER_SKU_LIST):
# 商品検索用オブジェクト
products = Products(marketplace=Marketplaces.JP, # 対象のマーケットプレイスを指定
credentials=credentials) # API情報を指定
# 結果取得
result = products.get_competitive_pricing_for_skus(SELLER_SKU_LIST)
return result()
# 引数(セラーSKUのリスト)
SELLER_SKU_LIST = ['sku_1','sku_2']
# 関数実行
productCompetitive_skus(SELLER_SKU_LIST)
ASINコードが同一の商品の在庫一覧情報・商品最安値価格を抽出
引数にASINコードおよび在庫のコンディション(新品or中古)を渡し、コードを実行すると、下記出力結果が得られます。
- ASINコード指定商品の在庫サマリー情報(出品中の商品数・最安値価格)
- 各種出品商品の参考価格(Listing Price)と送料込み参考価格(Landed Price)
- 各種出品商品購入時の獲得予定ポイント
- 各種出品商品のフルフィルメントチャネル(FBAなど)
- 各種出品商品のコンディション(新品 or 中古)およびコンディションノート
- 各種出品商品の在庫数
- 各種出品商品のセラーID
- 各種出品商品の発送時間
- 各種出品商品の発送国
from sp_api.api import Products
from sp_api.base.marketplaces import Marketplaces
def ItemOffer_asin(ASIN,CONDITION):
# 商品検索用オブジェクト
products = Products(marketplace=Marketplaces.JP, # 対象のマーケットプレイスを指定
credentials=credentials) # API情報を指定
# 結果取得
result = products.get_item_offers(asin=ASIN,item_condition=CONDITION)
return result()
# 引数情報
ASIN = 'B07WXL5YPW' # ASINコード
CONDITION = 'NEW' # 新品の場合:NEW、中古の場合:USED
# 関数実行
ItemOffer_asin(ASIN,CONDITION)
# 出力イメージ
# {'ASIN': 'B07WXL5YPW',
# 'status': 'Success',
# 'ItemCondition': 'NEW',
# 'Identifier': {'MarketplaceId': 'A1VC38T7YXB528',
# 'ItemCondition': 'New',
# 'ASIN': 'B07WXL5YPW'},
# 'Summary': {'LowestPrices': [{'condition': 'used',
# 'fulfillmentChannel': 'Merchant',
# 'LandedPrice': {'CurrencyCode': 'JPY', 'Amount': 25899.0},
# 'ListingPrice': {'CurrencyCode': 'JPY', 'Amount': 25559.0},
# 'Shipping': {'CurrencyCode': 'JPY', 'Amount': 340.0},
# 'Points': {'PointsNumber': 0}},
# {'condition': 'new',
# 'fulfillmentChannel': 'Merchant',
# 'LandedPrice': {'CurrencyCode': 'JPY', 'Amount': 33480.0},
# 'ListingPrice': {'CurrencyCode': 'JPY', 'Amount': 33480.0},
# 'Shipping': {'CurrencyCode': 'JPY', 'Amount': 0.0}}],
# 'BuyBoxPrices': [{'condition': 'new',
# 'LandedPrice': {'CurrencyCode': 'JPY', 'Amount': 32640.0},
# 'ListingPrice': {'CurrencyCode': 'JPY', 'Amount': 32970.0},
# 'Shipping': {'CurrencyCode': 'JPY', 'Amount': 0.0},
# 'Points': {'PointsNumber': 330}},
# {'condition': 'used',
# 'LandedPrice': {'CurrencyCode': 'JPY', 'Amount': 28215.0},
# 'ListingPrice': {'CurrencyCode': 'JPY', 'Amount': 28500.0},
# 'Shipping': {'CurrencyCode': 'JPY', 'Amount': 0.0},
# 'Points': {'PointsNumber': 285}}],
# 'NumberOfOffers': [{'condition': 'used',
# 'fulfillmentChannel': 'Merchant',
# 'OfferCount': 44},
# {'condition': 'new', 'fulfillmentChannel': 'Amazon', 'OfferCount': 22},
# {'condition': 'collectible',
# 'fulfillmentChannel': 'Merchant',
# 'OfferCount': 1},
# {'condition': 'used', 'fulfillmentChannel': 'Amazon', 'OfferCount': 24},
# {'condition': 'new', 'fulfillmentChannel': 'Merchant', 'OfferCount': 40}],
# 'BuyBoxEligibleOffers': [{'condition': 'used',
# 'fulfillmentChannel': 'Merchant',
# 'OfferCount': 40},
# {'condition': 'new', 'fulfillmentChannel': 'Amazon', 'OfferCount': 22},
# {'condition': 'collectible',
# 'fulfillmentChannel': 'Merchant',
# 'OfferCount': 1},
# {'condition': 'used', 'fulfillmentChannel': 'Amazon', 'OfferCount': 24},
# {'condition': 'new', 'fulfillmentChannel': 'Merchant', 'OfferCount': 37}],
# 'SalesRankings': [{'ProductCategoryId': 'video_games_display_on_website',
# 'Rank': 6},
# {'ProductCategoryId': '4731379051', 'Rank': 2}],
# 'ListPrice': {'CurrencyCode': 'JPY', 'Amount': 29980.0},
# 'CompetitivePriceThreshold': {'CurrencyCode': 'JPY', 'Amount': 32640.0},
# 'TotalOfferCount': 131},
# 'Offers': [{'Shipping': {'CurrencyCode': 'JPY', 'Amount': 0.0},
# 'ListingPrice': {'CurrencyCode': 'JPY', 'Amount': 32970.0},
# 'ShippingTime': {'maximumHours': 0,
# 'minimumHours': 0,
# 'availabilityType': 'NOW'},
# 'PrimeInformation': {'IsPrime': True, 'IsNationalPrime': True},
# 'Points': {'PointsNumber': 330},
# 'SubCondition': 'new',
# 'SellerId': 'AN1VRQENFRJN5',
# 'IsFeaturedMerchant': True,
# 'IsBuyBoxWinner': True,
# 'IsFulfilledByAmazon': True},
# {'Shipping': {'CurrencyCode': 'JPY', 'Amount': 0.0},
# 'ListingPrice': {'CurrencyCode': 'JPY', 'Amount': 33480.0},
# 'ShippingTime': {'maximumHours': 24,
# 'minimumHours': 24,
# 'availabilityType': 'NOW'},
# 'SellerFeedbackRating': {'FeedbackCount': 460,
# 'SellerPositiveFeedbackRating': 96.0},
# 'ShipsFrom': {'Country': 'JP'},
# 'PrimeInformation': {'IsPrime': False, 'IsNationalPrime': False},
# 'SubCondition': 'new',
# 'SellerId': 'A2DNCF9Q801XL6',
# 'ConditionNotes': '■新品・未開封です。★複数台まとめ購入歓迎★送料無料。バッテリー強化版。■プライム対応:ヤマト宅急便にてプチプチで梱包し、迅速に発送しております。15時までにご注文の場合即日発送させていただきます。お急ぎ便対応。■店舗併用販売をしていますので売切れの場合はご注文を速やかにキャンセル、ご返金をさせていただきます。■保証印欄は未記入品となります。■お客様のご都合による、返品・出荷後のキャンセルにつきましては原則お受けしておりません、ご了承ください。',
# 'IsFeaturedMerchant': True,
# 'IsBuyBoxWinner': False,
# 'IsFulfilledByAmazon': False},
SKU(商品管理番号)が同一の商品の在庫一覧情報・商品最安値価格を抽出
引数にSeller SKUおよび在庫のコンディション(新品or中古)を渡し、コードを実行すると、下記出力結果が得られます。
- ASINコード指定商品の在庫サマリー情報(出品中の商品数・最安値価格)
- 各種出品商品の参考価格(Listing Price)と送料込み参考価格(Landed Price)
- 各種出品商品購入時の獲得予定ポイント
- 各種出品商品のフルフィルメントチャネル(FBAなど)
- 各種出品商品のコンディション(新品 or 中古)およびコンディションノート
- 各種出品商品の在庫数
- 各種出品商品のセラーID
- 各種出品商品の発送時間
- 各種出品商品の発送国
from sp_api.api import Products
from sp_api.base.marketplaces import Marketplaces
def listingOffer_skus(SKU,CONDITION):
# 商品検索用オブジェクト
products = Products(marketplace=Marketplaces.JP, # 対象のマーケットプレイスを指定
credentials=credentials) # API情報を指定
# 結果取得
result = products.get_listings_offer(seller_sku=SKU,item_condition=CONDITION)
return result()
# 引数情報
SKU = 'sku_1' # SKU(商品管理番号)
CONDITION = 'NEW' # 新品の場合:NEW、中古の場合:USED
# 関数実行
listingOffer_skus(SKU,CONDITION)
【参考】Amazon SP-API その他機能の使い方
最後までご覧いただきありがとうございました。当サイトではAmazon物販の効率化に向けたAPI情報を多数配信しております。是非合わせてご覧下さい。
最後に
お問い合わせフォーム
上記課題に向けてご気軽にご相談下さい。
お問い合わせはこちら