この記事でわかること: SellerSprite ASIN検索APIにおける単件取得と一括処理の実装方法。LookupとSearchの使い分け、単件リクエストの実装例、一括処理のキュー設計パターン、重複排除と再試行戦略、レート制限への対応、マーケットプレイス検証、処理量とクレジットコストの試算方法を解説します。
SellerSprite ASIN APIを本番環境で活用するには、単一ASINの確認から大量のASINを効率的に処理する設計 までを考慮する必要があります。本記事では、APIの速度だけでなく、結果検証、クレジット消費、エラーリカバリー を含めた実装パターンを解説します。単発のスクリプトから本番バッチ処理まで、段階的に実装を拡張するための設計指針を提供します。
目次 LookupとSearchの使い分け 単件リクエスト例 一括処理・キュー設計 重複排除・再試行・レート制限 マーケットプレイスとバリエーションの検証 処理量とコストの試算 関連記事 よくある質問 1. LookupとSearchの使い分け SellerSprite ASIN APIには、単件取得(Lookup) と検索(Search) の2つのアプローチがあります。目的に応じて適切に使い分けることが重要です。
比較項目 ASIN Lookup(単件取得) ASIN Search(検索) 入力 特定のASIN(1つ) キーワードやカテゴリ条件 出力 指定ASINの詳細商品情報 条件に合致する商品一覧(複数件) 主な用途 既知のASINの詳細確認・モニタリング 市場調査・新規商品発掘・カテゴリ分析 クレジット消費 1件あたり 1クレジット 検索結果件数に応じて消費(例:1ページあたり) 推奨ユースケース 競合モニタリング・価格トラッキング 新商品リサーチ・トレンド発見
LookupとSearchの組合せ: Searchで候補商品を発見した後、Lookupで詳細情報を取得するという二段階アプローチ が効率的です。Searchで大量の候補を絞り込み、Lookupでピンポイントに詳細を取得することで、クレジットの無駄遣いを防げます。
2. 単件リクエスト例 Lookup APIを使った単一件の商品情報取得は、以下のように実装します。
cURL 実装例 curl -X GET "https://api.sellersprite.com/v1/product/asin/B0XXXXXX?marketplace=JP" \ -H "X-API-Key: your_api_key_here" \ -H "Content-Type: application/json"
Python 実装例(エラーハンドリング付き) import requests import time API_KEY = "your_api_key_here" BASE_URL = "https://api.sellersprite.com/v1/product/asin" def get_product_by_asin(asin, marketplace="JP", retries=3): url = f"{BASE_URL}/{asin}" headers = {"X-API-Key": API_KEY, "Content-Type": "application/json"} params = {"marketplace": marketplace} for attempt in range(retries): try: response = requests.get(url, headers=headers, params=params, timeout=30) response.raise_for_status() data = response.json() if data.get("code") == 200: return data.get("data") elif data.get("code") == 429: wait_time = 2 ** attempt print(f"Rate limit exceeded. Waiting {wait_time} seconds...") time.sleep(wait_time) continue else: print(f"API Error: {data.get('message', 'Unknown error')}") return None except requests.exceptions.RequestException as e: print(f"Request failed (attempt {attempt + 1}/{retries}): {e}") time.sleep(2 ** attempt) return None product = get_product_by_asin("B0XXXXXX", marketplace="JP") if product: print(f"商品名: {product.get('title')}") print(f"価格: {product.get('price')} {product.get('currency')}")
3. 一括処理・キュー設計 大量のASINを処理する場合は、キュー(Queue) を用いた非同期処理パターンが有効です。
基本的なバッチ処理パターン チャンク分割: 一度に処理するASIN数を一定数(例:50件)に分割し、段階的に処理するワーカー並列化: 複数のワーカープロセスで並列にリクエストを送信し、処理時間を短縮するステータス管理: 各ASINの処理状態(未処理・処理中・完了・エラー)をデータベースで管理する再試行キュー: エラーが発生したASINは別のキューに移動し、後で再処理するバッチ処理システムの構成例 タスクキュー(Redis / SQS): 処理対象のASINリストを管理ワーカー(複数インスタンス): キューからASINを取り出してAPIリクエストを実行結果データベース(PostgreSQL / MongoDB): 取得した商品情報を保存エラーハンドリング(DLQ): リトライ失敗したタスクを隔離モニタリング(Prometheus / CloudWatch): 処理状況とレート制限の監視 from rq import Queue from redis import Redis import time redis_conn = Redis() task_queue = Queue("asin_lookup", connection=redis_conn) def process_asin(asin, marketplace="JP"): product = get_product_by_asin(asin, marketplace) if product: save_to_database(product) return {"asin": asin, "status": "success", "data": product} else: retry_queue.enqueue(process_asin, asin, marketplace, retry_count=1) return {"asin": asin, "status": "failed"} asin_list = ["B0XXXXXX", "B0YYYYYY", "B0ZZZZZZ"] for asin in asin_list: task_queue.enqueue(process_asin, asin, "JP")
一括処理の推奨設定: ワーカー数は5〜10 程度、チャンクサイズは50〜100件 を目安に、レート制限を超えない範囲で調整してください。プロフェッショナルプラン(20 req/sec)の場合は、ワーカー数を10、各ワーカーの間隔を0.5秒に設定すると、安定した処理が可能です。
4. 重複排除・再試行・レート制限 本番環境では、以下の対策が必須です。
重複排除(Deduplication) 処理済みASINの記録: データベースやキャッシュ(Redis)に処理済みASINを保存し、二重処理を防止冪等性(Idempotency): 同じASINのリクエストが複数回送信されても、結果が変わらない設計にする一意制約(Unique Constraint): データベースのASINカラムにユニーク制約を設定し、重複挿入を防ぐ再試行戦略(Retry Strategy) 指数バックオフ(Exponential Backoff): リトライ間隔を段階的に増やす(例:1秒 → 2秒 → 4秒 → 8秒)最大リトライ回数の設定: 3〜5回程度に設定し、それ以上はDLQ(Dead Letter Queue)に隔離するエラー種別による分岐: 429(レート制限)→ 時間をおいて再試行404(ASIN不存在)→ リトライせずスキップ(無駄なリクエストを防止)500(サーバーエラー)→ 指数バックオフで再試行401(認証エラー)→ 即時停止(APIキーの再発行が必要)レート制限への対応 トークンバケット方式の実装: リクエスト間隔を一定に保つためのスロットリング分散環境での調整: 複数ワーカーが同時に稼働する場合は、集中管理型のレートリミッター(例:Redisベース)を導入バッファの確保: 制限値に対して10〜20%の余裕を持った設計にするレート制限対応の実装例(Python) import time from threading import Lock class RateLimiter: def __init__(self, max_requests, time_window): self.max_requests = max_requests self.time_window = time_window self.requests = [] self.lock = Lock() def wait_if_needed(self): with self.lock: now = time.time() self.requests = [t for t in self.requests if t > now - self.time_window] if len(self.requests) >= self.max_requests: sleep_time = self.time_window - (now - self.requests[0]) + 0.1 time.sleep(max(0, sleep_time)) self.requests.append(time.time()) limiter = RateLimiter(max_requests=5, time_window=1.0) for asin in asin_list: limiter.wait_if_needed() product = get_product_by_asin(asin)
5. マーケットプレイスとバリエーションの検証 一括処理では、マーケットプレイスとバリエーションの検証 も重要な設計ポイントです。
マーケットプレイスの正規化: 入力されたマーケットコード(JP、US、UKなど)をAPI仕様に合わせて正規化する。大文字/小文字の違いに対応する。ASINのマーケットプレイス帰属確認: ASINはマーケットプレイスごとに異なる場合があるため、指定されたマーケットプレイスにそのASINが存在するか事前に検証する。バリエーション構造の取得: 親ASINを指定した場合は、子ASINの一覧を取得し、各子ASINの詳細を個別に取得する設計にする。バリエーション情報のキャッシュ: 頻繁にアクセスされるバリエーション構造は、キャッシュ(Redis等)に保存してAPIコールを削減する。 def get_variation_asins(parent_asin, marketplace="JP"): product = get_product_by_asin(parent_asin, marketplace) if not product or "variations" not in product: return [parent_asin] return [v.get("asin") for v in product["variations"] if v.get("asin")] parent_asin = "B0XXXXXX" child_asins = get_variation_asins(parent_asin) for asin in child_asins: process_asin(asin)
6. 処理量とコストの試算 一括処理を設計する前に、処理量とクレジットコスト を試算しておくことが重要です。
コスト試算のステップ 対象ASIN数の見積もり: 例:競合10社 × バリエーション平均3点 = 30ASIN更新頻度の設定: 例:1日1回(30回/月)月間APIコール数: 30ASIN × 30日 = 900コール/月クレジット消費量の試算: 900コール × 1クレジット = 900クレジット/月プランとの照合: スタータープラン(例:月間1,000クレジット)の範囲内か確認ユースケース別のコスト試算例 ユースケース ASIN数 更新頻度 月間コール数 目安クレジット 自社商品モニタリング(小規模) 10 1日1回 300 300 競合モニタリング(中規模) 50 1日1回 1,500 1,500 市場調査バッチ(大規模) 500 週1回 2,000 2,000 全商品データ同期 5,000 月1回 5,000 5,000
コスト最適化のポイント: ①更新頻度を日次から週次に変更する ②キャッシュを活用して不要なAPIコールを削減する ③バッチ処理はオフピーク時に実行する ④データの重要度に応じて更新頻度を段階化する(例:主要商品は日次、それ以外は週次)。
プランとクレジットの詳細は、ご購入ガイド またはダッシュボードの「API利用状況」ページでご確認ください。
よくある質問(FAQ) LookupとSearchはどちらを優先して使うべきですか? 目的によって使い分ける ことをおすすめします。既にASINが分かっている場合はLookup(単件取得)を、キーワードやカテゴリから商品を発掘したい場合はSearch(検索)を使用してください。効率的なアプローチとしては、Searchで候補を絞り込み、Lookupで詳細を取得する二段階方式 が最もクレジット効率が良いです。
一括処理でレート制限を超えないためのベストプラクティスは? トークンバケット方式のレートリミッター を実装し、リクエスト間隔を制御することを推奨します。また、複数ワーカーを並列で動かす場合は、Redisベースの集中管理型レートリミッター を導入することで、ワーカー間でのリクエスト調整が可能です。レート制限(429)が発生した場合は、指数バックオフ を用いた再試行を必ず実装してください。
バリエーション商品の全バリエーションを効率的に取得する方法は? まず親ASIN をLookupしてバリエーション情報(variationsフィールド)を取得し、子ASINの一覧を抽出します。その後、各子ASINをLookupして詳細情報を取得します。この際、バリエーション構造をキャッシュ しておくことで、次回以降のAPIコールを削減できます。
バッチ処理でエラーが発生したASINはどう管理すればいいですか? エラーキュー(DLQ:Dead Letter Queue) を設計し、リトライを繰り返しても成功しなかったASINを隔離することを推奨します。エラーの原因(ASIN不存在・レート制限・認証エラーなど)を分類し、人手での調査が必要なものと自動リトライで対応可能なものを区別 することで、効率的な運用が可能になります。
APIのクレジット消費を最適化するコツはありますか? ①不要なAPIコールを減らす (キャッシュの活用、更新頻度の見直し)、②バッチ処理の頻度を調整する (日次→週次、重要度に応じた頻度変更)、③SearchとLookupを適切に使い分ける (Searchで候補を絞ってからLookupで詳細取得)、④fieldsパラメータで必要なフィールドのみを指定 する(全フィールドよりクレジット消費が少ない場合があります)。これらの工夫で、同じ予算でより多くのデータを取得できます。
著者: セラースプライト(SellerSprite) 編集部
Amazon外部サービスプロバイダー(Amazon SPN)として、Amazon市場向けのリサーチツールを提供している私たちは、日々変化するAmazon市場において、セラーの皆様が抱える「何が売れるのか?」「どうすれば利益を出せるのか?」という悩みを解決するための情報を発信しています。 私たちは単なるツールの提供者ではなく、伴走型パートナーとしてセラー様と一緒に成長しようと考えています。 EC事業者やこれから物販ビジネスを始める方に向けて、実用的な情報をお届けしています。