mcpField
P
pricewatcha

pricewatcha

リモート
github.com/pricewatchaビジネス・マーケティング12 日前に更新
リポジトリ

pricewatcha について

Pricewatchaは、商品価格、価格履歴、アラートなどを扱う公開HTTP APIのドキュメントです。開発者、自動化処理、AIエージェントが価格追跡をワークフローに組み込む用途を想定しています。

主な機能

  1. 01商品カタログの検索
  2. 02URLによる商品の追跡
  3. 03価格履歴とトレンドの取得
  4. 04価格アラートとWebhookの作成
  5. 05OpenAPIスキーマとSDK

活用シーン

  1. 01商品の現在価格を確認
  2. 02価格の推移を継続して監視
  3. 03Webhook経由で通知を送信
  4. 04スクリプトやエージェントに価格情報を統合

MCP 対応

READMEではAPI関連資料の一つとしてMCPサーバーに触れていますが、ツールや動作の説明はありません。

設定

リモートサーバーはインストール不要です。クライアントを選んで設定をコピーするか、ワンクリックで導入できます。

エンドポイントhttps://mcp.pricewatcha.com
インストールコマンドをコピー
Claude CodeTerminal
Cursor.cursor/mcp.json
VS Code.vscode/mcp.json
Claude Desktopclaude_desktop_config.json
Windsurf~/.codeium/windsurf/mcp_config.json

コマンドはターミナルで実行し、JSON は各クライアントの MCP 設定に貼り付けて再起動します。認可が必要なサーバーは初回接続時にログインを求めます。

ツール

15

このツールにパラメーターはありません。

詳細

Pricewatcha API

Pricewatcha API は、開発者、自動化、AI エージェント向けの 構造化された製品価格インテリジェンスプラットフォーム です。

Pricewatcha API は、pricewatcha.com アプリケーションに由来します。Pricewatcha ダッシュボードの機能を超えた価格追跡、アラート、製品インテリジェンスを提供します。このリポジトリでは、公開 HTTP API、OpenAPI スキーマ、公式 SDK、MCP サーバー、使用例について説明します。本番用 Web アプリケーションやスクレイパーは含まれていません。

ステータス: 利用可能 · バージョン: v1 · ベース URL: https://pricewatcha.com/api/v1

API キーの操作(ブラウザー): プロフィールと API キー


任意:GET https://pricewatcha.com/api/v1/health で接続を確認してください。その後、以下の 3 つの方法から 1 つを選んでください。

クイックスタート
方法 1:価格を閲覧する(認証不要)

デモカタログのデモ製品 ID を使うか、カタログを検索します。

curl -s "https://pricewatcha.com/api/v1/products/demo_iphone_15_pro"
curl -s "https://pricewatcha.com/api/v1/search?q=iphone+15&limit=10"

検索では、大文字と小文字を区別せず、トークンの AND 条件が使われます(すべての語句を含む必要があり、語順は問いません)。結果には、POST /track で送信された URL だけでなく、Pricewatcha のカタログ全体が含まれます。製品および価格履歴のエンドポイントには、検索結果の product_id(prod_* または demo_*)を使用してください。

方法 2:製品を追跡して価格履歴を取得する
curl -s -X POST "https://pricewatcha.com/api/v1/track" \
  -H "Content-Type: application/json" \
  -d '{"url": "https://www.backmarket.de/de-de/p/example-product"}'

curl -s "https://pricewatcha.com/api/v1/products/{productId}/price-history"

POST /track は、サーバー側で上限が設定されたロングポーリング(約 25 秒)を伴って HTTP 200 を返します。価格履歴には、レスポンスの product_id を使用してください。任意:Authorization: Bearer pwk_live_… を送信すると、追跡、検索、製品読み取りの上限が引き上げられます。

応答の速いショップでは、1 回の呼び出しで製品全体を含む status: "completed" が返されます。応答の遅いショップでは、job_id とともに status: "running" が返されます。ジョブが completed または failed になるまで、GET https://pricewatcha.com/api/v1/jobs/{jobId} をポーリングしてください。詳しくは、非同期の追跡とポーリングをご覧ください。

方法 3:Webhook を使った価格アラート(API キーが必要)

プロフィールと API キーでキーを作成してから、次を実行します。

curl -s -X POST "https://pricewatcha.com/api/v1/alerts" \
  -H "Authorization: Bearer pwk_live_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "product_id": "prod_a1b2c3d4e5",
    "notify_on_drop": true,
    "min_threshold_price": 500.00,
    "webhook_url": "https://your-n8n-instance.com/webhook/abc",
    "notify_email": true
  }'

認証とデータ境界については、認証とデータ境界をご覧ください。


認証

カタログの検索、製品の詳細、価格履歴、非同期の追跡とポーリングには、認証情報は不要です。キーを指定しない場合、これらのエンドポイントには匿名ユーザー向けのレート制限が適用されます。アカウントごとの追跡、検索、製品読み取りの上限を引き上げるには、API キーを送信してください。

保護された API v1 エンドポイント(アラート、Webhook、認証済みの追跡コールバック)には、次を使用します。

Authorization: Bearer pwk_live_…
認証情報形式使用場面
API キーpwk_live_…スクリプト、エージェント、n8n、サーバー連携には推奨です。プロフィールと API キーで作成してください。
ログインセッショントークンPOST https://pricewatcha.com/api/auth/login から取得する JWTWeb サイトの UI とヘッドレスでのキー作成のみ

API キーを取得した後は、ログインセッショントークンをアラート、Webhook、その他の API v1 呼び出しに使用しないでください。

公開ルートと認証が必要なルートについては、アクセスモデルをご覧ください。


API キー(ブラウザー)

ログインし、プロフィールと API キーを開くと、ブラウザーで API キーを作成、管理できます。完全なシークレットが表示されるのは、作成時の1 回のみです。

ブラウザーを使わないエージェントの場合は、以下のヘッドレスでのキー作成を使用してください。

保護されたエンドポイントでのキーの使用方法:

curl -s -X POST "https://pricewatcha.com/api/v1/alerts" \
  -H "Authorization: Bearer pwk_live_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{"product_id": "prod_a1b2c3d4e5", "notify_on_drop": true}'

ヘッドレスでのキー作成(エージェント向け)

エージェントがブラウザーを使わずに API 認証情報を取得する必要がある場合は、Web サイトと同じメールアドレスとパスワードで一度認証して API キーを作成し、その後のすべての呼び出しで pwk_live_… を使用してください。これはエージェント専用の別のログイン方法ではなく、HTTP エンドポイントとして提供されている通常の Pricewatcha アカウントへのログインです。

API 経由でのログインの仕組み

POST https://pricewatcha.com/api/auth/login は、JSON の email と password を受け取り、有効期間の短い access_token(ログインセッショントークン)を返します。開発者ページのログインモーダルも同じエンドポイントを呼び出します。スクリプトやエージェントでは、curl または HTTP クライアントから直接呼び出します。

  • 既存のアカウントが必要です(サイトまたは POST https://pricewatcha.com/api/auth/register から登録してください)。
  • メールアドレスの認証が必要です。認証されていない場合、API は 403 を返します。
  • 認証情報が間違っている場合は 401 を返します。
  • access_token はキーの作成にのみ使用してください。アラートやウェブフックには、手順 2 の pwk_live_… キーを使用してください。

手順 1:ログイン

curl -s -X POST "https://pricewatcha.com/api/auth/login" \
  -H "Content-Type: application/json" \
  -d '{"email": "[email protected]", "password": "YOUR_PASSWORD"}'

レスポンス(HTTP 200)、AuthResponse:

  • access_token(string):ログインセッショントークン(JWT)
  • token_type(string):常に "bearer"
  • user(object):id(string、UUID)、email(string)、email_verified(boolean)
{
  "access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
  "token_type": "bearer",
  "user": {
    "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
    "email": "[email protected]",
    "email_verified": true
  }
}

手順 2 では、トークンを Authorization: Bearer <access_token> として送信します。セッショントークンには有効期限があります。エージェントの長期的な認証情報として保存しないでください。

手順 2:API キーの作成

curl -s -X POST "https://pricewatcha.com/api/keys" \
  -H "Authorization: Bearer ACCESS_TOKEN_FROM_STEP_1" \
  -H "Content-Type: application/json" \
  -d '{"name": "agent bootstrap"}'

レスポンス(HTTP 200)、CreateApiKeyResponse:

  • id(integer):キー ID
  • name(string):リクエストで指定したラベル
  • key_prefix(string):キーの先頭 12 文字(表示用)
  • key(string):完全なシークレット。作成時にのみ返され、一覧取得時には返されません
  • is_active(boolean)
  • created_at(string、ISO 8601 日時)
  • last_used_at(string または null)
  • revoked_at(string または null)
{
  "id": 42,
  "name": "agent bootstrap",
  "key_prefix": "pwk_live_ab",
  "key": "pwk_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
  "is_active": true,
  "created_at": "2026-05-27T14:30:00.123456",
  "last_used_at": null,
  "revoked_at": null
}

key は安全に保管してください。アラート、ウェブフック、その他の保護された API v1 エンドポイントでは、手順 1 のセッショントークンではなく、このキーを使用してください。


API エンドポイント(概要)
メソッドパス認証説明
GET/api/v1/health-ヘルスチェック
GET/api/v1-ディスカバリーと免責事項
POST/api/v1/track-URL の取り込み(ロングポーリング)
GET/api/v1/jobs/{jobId}-ジョブのステータス
GET/api/v1/products/{productId}-商品インテリジェンス
GET/api/v1/products/{productId}/price-history-価格履歴とトレンド
GET/api/v1/search?q=-キーワード検索(limit の最大値は 200)
GET/api/v1/openapi.json-最新の OpenAPI 3.1
POST/api/auth/login-ログイン(有効期間の短いセッショントークン)
POST/api/keysセッショントークンAPI キーの作成
GET / DELETE/api/keys …セッショントークンまたはキーキーの一覧表示/取り消し
*/api/v1/alerts …API キー価格アラート
*/api/v1/watchlist / …/watchAPI キー継続的な価格ウォッチリスト
*/api/v1/webhooks …API キーウェブフックのサブスクリプション

機械可読な仕様:openapi/openapi.yaml · 最新版:GET https://pricewatcha.com/api/v1/openapi.json


レート制限

現在の制限(目安)

以下の制限が適用されます。予告なく変更される場合があります。

分類エンドポイント匿名認証済み(API キー)
トラック(同時実行)POST /track~2 件の処理中ジョブ~4 件の処理中ジョブ
トラック(バースト)POST /track~10 件 / 60s~20 件 / 60s
トラック(1 時間あたり)POST /track~40 件 / 時間~120 件 / 時間
トラック(1 日あたり)POST /track~80 件 / 日~400 件 / 日
ジョブのポーリングGET /jobs/{id}クライアントあたり ~40 req/min同じ
検索(バースト)GET /search~20 req / 60s~40 req / 60s
検索(1 時間あたり)GET /search~60 req / 時間~180 req / 時間
検索(1 日あたり)GET /search~200 req / 日~1000 req / 日
読み取り(バースト)/products、/price-historyクライアントあたり ~60–120 req/min~240 req / 60s
読み取り(1 時間あたり)/products、/price-history~180 req / 時間~540 req / 時間
読み取り(1 日あたり)/products、/price-history~600 req / 日~3000 req / 日
ヘルスチェック/health および /無制限無制限

認証済みの制限を利用するには、POST /track、GET /search、または商品読み取り時に Authorization: Bearer pwk_live_… を送信します。これらのエンドポイントは、匿名の制限内であればキーなしでも引き続き利用できます。

クライアントの識別: 匿名の制限はクライアント IP をキーに適用されます。Cloudflare 経由の場合、API は X-Forwarded-For よりも CF-Connecting-IP を優先するため、エッジプロキシの IP が別々のクライアントとして扱われることはありません。ホスト型 MCP サーバーは、共有プロキシシークレットとともに、安定した X-Pricewatcha-Client-Id(OAuth トークンのハッシュ、または接続元 IP のハッシュ)を転送するため、MCP の呼び出し元がすべて 1 つの送信元 IP にまとめられることはありません。認証済みのトラック、検索、商品読み取りのクォータは IP ではなくアカウント(owner_id)をキーに適用されます。

X-RateLimit-Remaining を監視し、429 が返された場合は指数バックオフを行ってください。X-RateLimit-Policy は、ヘッダーがどの期間を対象としているか(track、track_hourly、track_daily、track_concurrent、job_read、search、search_hourly、search_daily、read、read_hourly、または read_daily)を示します。

トラックのクォータは永続化されたジョブからカウントされます(クライアントキーまたはアカウントごとの api_track_jobs)。そのため、複数のアプリインスタンスにまたがって適用されます。HTTP 接続を約 25 秒維持するロングポーリングでも、作成時にトラックジョブ 1 件としてカウントされます。60 秒より長い間隔で順次トラックを実行してもバースト期間の上限には達しませんが、1 時間あたり、1 日あたり、同時実行の上限は引き続き適用されます。

エージェントは、トラックを開始し、バックオフを適用しながら GET /jobs/{id} をポーリングし(1~2 秒ごとには行わないでください)、完了後に商品と履歴を一度読み取る手順を優先してください。ジョブがまだ queued/processing の間に同じ URL で POST /track を再試行すると、既存のジョブが再利用され、同時実行枠は追加で消費されません。queued/processing のままスクレイピングタイムアウト(デフォルト 600s)を超えたジョブは失敗扱いとなり、デプロイをまたいで枠が残り続けることはありません。

検索と商品読み取りのクォータはアプリインスタンスごとのインメモリ管理であり、トラックジョブのように Railway のレプリカ間で共有されません。認証済みの呼び出し元には、引き続きアカウントごとの高い期間別上限が適用されます。同じカタログ検索を短い間隔で繰り返しポーリングすると、1 時間あたりまたは 1 日あたりの検索上限に達します。

正確な数値は予告なく変更される場合があります(環境変数による上書き:API_V1_TRACK_*、API_V1_TRACK_AUTH_*、API_V1_JOB_READ_*、API_V1_READ_*、API_V1_READ_AUTH_*、API_V1_SEARCH_*、API_V1_SEARCH_AUTH_*)。

ヘッダー

レート制限が有効な場合、レスポンスに以下が含まれることがあります。

ヘッダー説明
X-RateLimit-Limit期間内の最大リクエスト数
X-RateLimit-Remaining期間内に残っているリクエスト数
X-RateLimit-Reset期間がリセットされる Unix タイムスタンプ
X-RateLimit-Policyヘッダーが示す期間
HTTP 429

レート制限に達すると、API は JSON 本文とともに 429 Too Many Requests を返します。

{
  "error": {
    "code": "rate_limited",
    "message": "Rate limit exceeded (track daily). Try again later.",
    "http_status": 429,
    "retry_recommended": true,
    "retry_after_seconds": 3600
  }
}

エージェント向けのガイダンス: 429 を受け取ったら、その指示に従い、retry_after_seconds / X-RateLimit-Reset で指定された時間まで待機し、ジョブステータスエンドポイントへのポーリング頻度を下げてください。時間単位/日単位の上限に近いタイミングで一斉にリクエストを送るのではなく、時間を分散してトラックすることをおすすめします。匿名での 429 レスポンスには、API キーを使用すると割り当て上限が引き上げられる旨が記載されます。

時間単位/日単位/同時実行のトラック上限、または時間単位/日単位の検索と商品読み取りの上限に達すると、運用担当者にメールで通知できます(クライアントごとにクールダウンがあります。API_V1_RATE_LIMIT_ALERT_* を参照してください)。

不正利用と IP 制限

匿名利用の日次上限(トラック、検索、商品読み取り)を継続的に悪用した場合(たとえば、同じ IP から数日にわたって日次上限を使い切った場合)、429 だけでなく、アプリ内での制限が適用されることがあります。

  1. 通知(猶予期間)。 API 呼び出しは引き続き成功します。レスポンスには、保留中のブロックに関する警告を含む X-Pricewatcha-Restriction: notice と X-Pricewatcha-Restriction-Message が含まれます。レート制限は引き続き適用されます。
  2. ブロック。 返信がない場合、IP がブロックされます。以降の呼び出しは、error.code が access_restricted の HTTP 403 を返します。

利用条件の確認またはアクセスの復元については、[email protected] にメールでお問い合わせください。アクセスが復元されるまで再試行しないでください。再試行しても制限は解除されません。


非同期トラックとポーリング

POST /api/v1/track は商品 URL を送信し、最大 約 25 秒(ロングポーリング)待機します。API キーは不要です。アカウントごとのトラック割り当て上限の引き上げを利用するには、Authorization: Bearer pwk_live_… を送信してください。

  • 処理の速いショップ:同じレスポンスに status: "completed" と完全な product が含まれます
  • 処理の遅いショップ:status: "running" と job_id が返されます。completed または failed になるまで GET /api/v1/jobs/{jobId} をポーリングしてください
  • ジョブの実行中に同じ URL で POST /track を繰り返すと、新しいジョブを開始する代わりに、そのジョブが返されます(同時実行による 429 も発生しません)
  • API キーを使用する場合:watch: true を指定すると、商品が継続的なスケジューラー更新の対象になります。refresh: true を指定すると、URL がすでにカタログにある場合でも再スクレイプを強制します

ジョブは 72 時間保持されます。期限切れ後に GET /jobs/{jobId} を呼び出すと 404 が返されます。その場合は、代わりに GET /products/{productId} を使用してください。

一般的なフロー
処理の速いショップ(1 回の呼び出し)
POST /api/v1/track → { "status": "completed", "product": { ... } }
処理の遅いショップ
POST /api/v1/track → { "status": "running", "job_id": "job_xxx", "hint": "..." }
GET  /api/v1/jobs/{jobId} → poll until terminal state
GET  /api/v1/products/{productId} and .../price-history
商品をトラックする
curl -s -X POST "https://pricewatcha.com/api/v1/track" \
  -H "Content-Type: application/json" \
  -d '{"url": "https://www.backmarket.de/de-de/p/example-product"}'

スクレイプがロングポーリングの時間内に完了した場合のレスポンス(200):

{
  "job_id": "job_xxxxxxxx",
  "status": "completed",
  "product": {
    "product_id": "prod_xxxxxxxx",
    "name": "Example product",
    "shop": "Back Market",
    "current_price": 563,
    "currency": "EUR"
  },
  "error": null
}

ロングポーリングのタイムアウト後も処理中の場合のレスポンス(200):

{
  "job_id": "job_xxxxxxxx",
  "status": "running",
  "product": null,
  "error": null,
  "hint": "Job still running. Call the get_job_status tool with this job_id to poll for the result."
}
ジョブのステータスをポーリングする
curl -s "https://pricewatcha.com/api/v1/jobs/job_xxxxxxxx"
完了時のレスポンス
{
  "job_id": "job_xxxxxxxx",
  "status": "completed",
  "product": {
    "product_id": "prod_xxxxxxxx",
    "name": "Example product",
    "shop": "Back Market",
    "current_price": 563,
    "currency": "EUR"
  }
}
ジョブの状態
ステータス意味
queuedジョブは受け付けられ、開始待ちです
running取り込み中です
completed商品情報が product に含まれています
failedスクレイプに失敗しました。構造化された error を確認してください(HTTP 200 のジョブ照会)
推奨されるクライアントフロー
  1. { "url": "..." } を指定して POST /track を呼び出します → 200
  2. running または queued の場合は、2~5 秒ごとに GET /jobs/{jobId} をポーリングします
  3. completed になったら、ジョブ内の product または GET /products/{productId} から product を読み取ります
  4. failed の場合は、error.code を表示し、再試行前にバックオフします
ジョブの照会とスクレイプの失敗

GET /jobs/{jobId} をポーリングするときは、HTTP ステータスと本文をあわせて判断してください。

レスポンス意味対応
HTTP 404この job_id のジョブがありません(ID が間違っているか、72 時間経過してジョブの期限が切れています)ポーリングを停止します。商品が引き続き必要な場合は、新しい POST /track を開始してください
HTTP 200("status": "failed")ジョブは存在しますが、スクレイプに失敗しましたJSON 本文の error.code(例:scrape_target_not_found)を確認してください

404 は照会の問題です。failed を含む 200 は、ジョブが完了したもののスクレイプに成功しなかったことを示します。

トラックジョブの Webhook(プッシュ)

認証済みのクライアントは、トラックジョブの完了時にプッシュ通知を受け取れます。callback_url(単発)またはwebhook_id(既存のサブスクリプション)を使用します。両方を同時に指定することはできません。コールバックによって、認証済みトラックジョブ以外の追加クォータが消費されることはありません。

curl -s -X POST "https://pricewatcha.com/api/v1/track" \
  -H "Authorization: Bearer pwk_live_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://www.backmarket.de/de-de/p/example-product",
    "callback_url": "https://n8n.example.com/webhook/track-done"
  }'

callback_urlを指定すると、トラックのレスポンスにcallback_secret(whsec_…)が一度だけ含まれる場合があります。署名方式はサブスクリプションの Webhook と同じです。

ジョブが完了すると、Pricewatcha はイベントタイプtrack_job_completedまたはtrack_job_failedの Webhook を送信します(ペイロードの形式は他の Webhook と同じです)。プッシュ配信を使用しない場合でも、POST /track(ロングポーリング)の応答を待つか、ジョブが最終状態になるまでGET /jobs/{jobId}をポーリングできます。

Note: callback_urlまたはwebhook_idを指定した匿名のPOST /trackは、400 auth_required_for_callbackを返します。MCP ツールでは、トラックの後にポーリングします(v1 ではcallback_urlを使用しません)。

SDK の便利な機能

公式の Python および TypeScript SDK では、track_and_wait() / trackAndWait()が提供される場合があります。これは、POST /trackを呼び出した後、ジョブがcompletedまたはfailedになるまでGET /jobs/{jobId}をポーリングし、結果を返すヘルパーです。HTTP API は引き続き非同期処理を基本とします。このヘルパーを使えば、ポーリングループを自分で記述する手間を省けます。SDKを参照してください。

重複排除

同じ URL に対してPOST /trackを繰り返すと、既存のインテリジェンスを使って、すぐにcompletedが返される場合があります。

タイムアウト

ロングポーリングのデフォルトは約25秒です。処理が遅いショップでは、トラックのタイムアウトを延長するのではなく、GET /jobs/{jobId}をポーリングしてください。


検索

キーワード検索では大文字と小文字は区別されません。クエリはトークンに分割され、すべてのトークンが正規化された商品名、URL、プラットフォーム/ショップ、または関連フィールドに含まれる場合に商品が一致します。単語の順序は問いません。ハイフンやスラッシュなどの句読点は空白として扱われます(Darth-VaderはDarth Vaderに一致します)。検索結果はPricewatcha の全カタログを対象とし、POST /trackで送信された URL に限りません。

連続した完全一致フレーズは、他のトークン一致もある場合、引き続き高い順位になります。

エンドポイント

GET https://pricewatcha.com/api/v1/search?q=…&limit=…

limitは任意です。デフォルトは50、最大値は200です。除外語によるフィルタリングの後に適用されます。

検索のレート制限は、商品読み取りとは別に設定されています。匿名の呼び出し元は約20リクエスト/60秒、約60/時間、約200/日までです。API キーを使用すると、アカウントあたり約40/60秒、約180/時間、約1000/日まで引き上げられます。HTTP 429とX-RateLimit-Policyに従ってください。レート制限を参照してください。

qでは、Google スタイルのマイナス記号を付けた除外語を指定できます。q=iPhone+15+-cover+-caseは、検索対象フィールドに「cover」または「case」が含まれない(大文字と小文字は区別しない)、「iPhone」と「15」の両方に一致する商品を返します。単独の-は無視されます。

curl -s "https://pricewatcha.com/api/v1/search?q=iphone&limit=10"
curl -s "https://pricewatcha.com/api/v1/search?q=iPhone+15+-cover+-case"
curl -s "https://pricewatcha.com/api/v1/search?q=Darth+Vader+DX27"
レスポンス例
[
  {
    "product_id": "demo_iphone_15_pro",
    "name": "Apple iPhone 15 Pro 128GB (Refurbished)",
    "shop": "Back Market",
    "product_url": "https://www.backmarket.de/de-de/p/example-iphone-15-pro",
    "current_price": 563,
    "currency": "EUR",
    "status": "active",
    "preview": true,
    "google_product_category_id": null,
    "google_product_category_name": null
  },
  {
    "product_id": "prod_a1b2c3d4e5",
    "name": "iPhone 15 Pro",
    "shop": "Swappie",
    "product_url": "https://swappie.com/de/p/iphone-15-pro/",
    "current_price": 505,
    "currency": "EUR",
    "status": "active",
    "google_product_category_id": null,
    "google_product_category_name": null
  }
]

追加のGET /products/{id}呼び出しを行わずに直接リンクするには、product_urlを使用してください。

結果には常にgoogle_product_category_idとgoogle_product_category_nameが含まれます(未設定の場合はnull)。追加のクエリパラメーターは不要です。

デモカタログ(スクレイピング不要)

プレビュー用のデモ商品は、統合テストでいつでも利用できます。

curl -s "https://pricewatcha.com/api/v1/products/demo_iphone_15_pro"
curl -s "https://pricewatcha.com/api/v1/products/demo_iphone_15_pro/price-history"
curl -s "https://pricewatcha.com/api/v1/search?q=iphone+15+pro"

GitHub のデモカタログを参照してください。


データの境界

カタログの価格インテリジェンス(現在価格、履歴、商品メタデータ)は、認証なしで利用できます。ユーザー固有のデータ(アカウント、メールアドレス、アラート設定)が公開読み取りエンドポイントで公開されることはありません。

認証済みのクライアントは、/api/v1/watchlistおよび/api/v1/products/{id}/watchを使って自分のウォッチリストを管理できます(API キーが必要です)。他のユーザーのウォッチリストが返されることはありません。

読み取り可能なフィールド
  • product_id、名前、ショップ/プラットフォーム、商品 URL
  • 現在の価格、通貨、最終確認日時、ステータス
  • 価格履歴、過去の最安値/最高値、平均、傾向
  • 価格データが販売者のフィードから直接取得される場合の data_source と data_source_label(merchant_feed → "Direct merchant data")
  • 商品詳細と検索結果の google_product_category_id および google_product_category_name(未設定の場合は null)。検索に追加のクエリパラメーターは不要です。
  • デモ項目には "preview": true が含まれることがあります。

検索、商品詳細、価格履歴では、商品がダッシュボード、API、MCP、デモデータのいずれから追加されたかにかかわらず、同じフィールドが返されます。

継続的な更新

価格スケジューラーによって更新されるのは、アカウントのウォッチリストに登録された商品(ダッシュボードまたは API の watch/アラート/商品単位の価格 webhook)のみです。watch を指定しない単発の POST /track では、継続的な更新の対象に登録されません。

商品 ID
プレフィックス意味
demo_*静的なプレビュー用サンプル(例:demo_iphone_15_pro)
prod_*カタログ内の商品ごとの不透明で安定した ID(URL エンティティごとに 1 つ)

検索結果または完了した track ジョブから取得した product_id を、GET /products/{productId} および .../price-history で使用してください。

Webhook ペイロード

配信には商品単位のイベントデータ(価格、商品 ID、イベントタイプ)のみが含まれ、ユーザーのメールアドレスやアカウント情報は含まれません。サブスクリプションの署名シークレット(whsec_...)を使用して真正性を検証してください。Webhookを参照してください。

コンプライアンス

この API を利用する場合は、価格は参考情報であり、販売者のサイトが正確な情報源であることをユーザーに開示してください。


エラーとエラーコード

成功以外のレスポンスでは、構造化された error オブジェクトが使用されます。error.code を確認してください。自由形式の message 値を解析してはいけません。

形式
{
  "error": {
    "code": "invalid_url_type",
    "message": "url looks like a search or listing page (query parameter 'k')",
    "http_status": 400,
    "retry_recommended": false,
    "retry_after_seconds": null
  }
}
フィールド説明
code安定した機械処理用識別子
message人間が読める詳細(分岐ロジックには使用しないでください)
http_status本文内に含まれる HTTP ステータス
retry_recommended再試行が有効な可能性があるかどうか
retry_after_secondsレート制限時の目安(null の場合があります)
公開 API/track/カタログのコード
コード一般的な HTTP ステータス発生条件
invalid_input_format400JSON またはパラメーターの形式が不正です
invalid_url_type400URL が検索/商品一覧ページ、未対応のショップなどです
job_not_found404job_id が不明または期限切れです(ジョブは 72h 後に期限切れになります)
product_not_found404product_id が不明です
scrape_target_not_found404ショップ上に商品ページが見つかりません
scrape_chain_exhausted502すべてのスクレイパー戦略が失敗しました
scrape_timeout200(ジョブ失敗)track ジョブがスクレイピングのタイムアウトを超えた場合、またはワーカーの障害後にキュー内/処理中のジョブが回収された場合
rate_limited429track/検索/読み取りのクォータを超過しました。retry_after_seconds に従ってください。匿名トラフィックはクライアント IP ごとに制限されます。API キーでは、アカウントごとの track、検索、商品読み取りクォータがより高く設定されています。
access_restricted403不正使用の通知後、クライアント IP がブロックされました。[email protected] までメールでお問い合わせください。アクセスが復元されるまで再試行しないでください。それ以前の猶予期間中は API を引き続き利用でき、X-Pricewatcha-Restriction: notice が送信されます。
internal_error500予期しないサーバーエラー
認証と API キー
コード一般的な HTTP ステータス発生条件
unauthenticated401ベアラートークンがないか、無効です
invalid_session_token401ログインセッションが期限切れまたは無効です(API キーではありません)
invalid_api_key401API キーが失効しているか、不明です
api_key_limit_reached403アカウントのキー上限を超過しました
api_key_not_found404キー ID が見つかりません
アラートとWebhook
コード一般的なHTTPステータス発生する条件
alert_already_exists409ユーザーごと、商品ごとにアラートは1件です。PATCHを使用してください
alert_not_found404不明なalert_idです
webhook_not_found404不明なサブスクリプションです
webhook_limit_reached403サブスクリプションの上限を超えています
auth_required_for_callback400認証なしでPOST /trackにcallback_url/webhook_idを指定しています
callback_conflict400callback_urlとwebhook_idの両方が設定されています
invalid_callback_url400コールバックURLがHTTPSではないか、接続先がブロックされています
エージェント向けガイダンス
  • messageではなくerror.codeに基づいて分岐してください。
  • retry_recommendedがtrueの場合は、指数バックオフを使用し、retry_after_secondsを守ってください。
  • GET /jobs/{jobId}がHTTP 200を返し、status: "failed"の場合は、ジョブの失敗であり、トランスポートエラーではありません。

完全なスキーマ:ライブのGET https://pricewatcha.com/api/v1/openapi.jsonと、GitHub上のOpenAPI仕様をご覧ください。


Price Alert API

価格が変動したときにメール通知を送信したり、Webhookを発火させたりする価格アラートを作成します。

追跡対象の商品には、ユーザーごとにアラートレコードが1件あります。次の設定を任意に組み合わせてください。

  • notify_on_drop:価格が下がるたびに通知します(しきい値は不要です)
  • notify_on_rise:価格が上がるたびに通知します(しきい値は不要です)
  • min_threshold_price:価格がこの値以下に下がったときに通知します
  • max_threshold_price:価格がこの値以上に上がったときに通知します

上記4つの設定のうち、少なくとも1つが必要です。

アラートを作成すると、アカウントで商品もウォッチ対象になり、価格スケジューラーによって最新の状態に保たれます(ウォッチリストをご覧ください)。

すべてのエンドポイントでは、Authorization: Bearer …にAPIキーが必要です。完全なスキーマ:GET https://pricewatcha.com/api/v1/openapi.json(タグalerts)。

エンドポイント
メソッドパス説明
GET/api/v1/alertsアラートを一覧表示します。オプション:?product_id=prod_…
POST/api/v1/alertsアラートを作成します。すでに存在する場合は409 alert_already_existsが返されます。PATCHを使用してください
GET/api/v1/alerts/{alertId}1件のアラートを取得します
PATCH/api/v1/alerts/{alertId}しきい値、方向フラグ、Webhook URL、メールアドレス、名前、is_activeを更新します
DELETE/api/v1/alerts/{alertId}削除します(204)
しきい値なしの方向アラートを作成する

価格が下がるたびに通知します。ダッシュボードのより安いトグルと同じです。

curl -s -X POST "https://pricewatcha.com/api/v1/alerts" \
  -H "Authorization: Bearer pwk_live_YOUR_KEY_HERE" \
  -H "Content-Type: application/json" \
  -d '{
    "product_id": "prod_a1b2c3d4e5",
    "notify_on_drop": true,
    "notify_email": true,
    "name": "Any drop"
  }'
しきい値アラートを作成する
curl -s -X POST "https://pricewatcha.com/api/v1/alerts" \
  -H "Authorization: Bearer pwk_live_YOUR_KEY_HERE" \
  -H "Content-Type: application/json" \
  -d '{
    "product_id": "prod_a1b2c3d4e5",
    "min_threshold_price": 499.00,
    "max_threshold_price": 599.00,
    "webhook_url": "https://n8n.example.com/webhook/alert",
    "notify_email": true,
    "name": "Deal range"
  }'

応答例(201):

{
  "alert_id": 76,
  "product_id": "prod_a1b2c3d4e5",
  "min_threshold_price": 499.00,
  "max_threshold_price": 599.00,
  "notify_on_drop": false,
  "notify_on_rise": false,
  "currency": "EUR",
  "webhook_url": "https://n8n.example.com/webhook/alert",
  "notify_email": true,
  "name": "Deal range",
  "is_active": true,
  "created_at": "2026-05-24T12:00:00Z",
  "updated_at": "2026-05-24T12:00:00Z",
  "last_triggered_at": null
}
一覧表示と取得
curl -s "https://pricewatcha.com/api/v1/alerts" \
  -H "Authorization: Bearer pwk_live_YOUR_KEY_HERE"

curl -s "https://pricewatcha.com/api/v1/alerts?product_id=prod_a1b2c3d4e5" \
  -H "Authorization: Bearer pwk_live_YOUR_KEY_HERE"

curl -s "https://pricewatcha.com/api/v1/alerts/76" \
  -H "Authorization: Bearer pwk_live_YOUR_KEY_HERE"
更新と削除
curl -s -X PATCH "https://pricewatcha.com/api/v1/alerts/76" \
  -H "Authorization: Bearer pwk_live_YOUR_KEY_HERE" \
  -H "Content-Type: application/json" \
  -d '{"notify_on_drop": true, "min_threshold_price": null}'

curl -s -X PATCH "https://pricewatcha.com/api/v1/alerts/76" \
  -H "Authorization: Bearer pwk_live_YOUR_KEY_HERE" \
  -H "Content-Type: application/json" \
  -d '{"is_active": false}'

curl -s -X DELETE "https://pricewatcha.com/api/v1/alerts/76" \
  -H "Authorization: Bearer pwk_live_YOUR_KEY_HERE"

Watchlist API

関心のある商品の継続的な価格更新を有効にします。ウォッチ対象の商品には、ダッシュボードのウォッチリスト(user_products)と同じスケジューラーパスが適用されます。

匿名のPOST /trackは、引き続き1回限りのカタログ取り込みです。ウォッチ(またはアラート/商品単位の価格Webhook)がない場合、価格はスケジュールに沿って更新されません。

エンドポイント
メソッドパス説明
GET/api/v1/watchlistウォッチ対象の商品を一覧表示します(limit、offset)
GET/api/v1/products/{productId}/watch1件の商品のウォッチ状態を取得します
POST/api/v1/products/{productId}/watchウォッチを開始します(冪等)
DELETE/api/v1/products/{productId}/watchウォッチを停止します

すべてのエンドポイントでは、Authorization: Bearer …にAPIキーが必要です。上限:アカウントごとにウォッチできる商品は200件です(403 watch_limit_reached)。

商品をウォッチする
curl -s -X POST "https://pricewatcha.com/api/v1/products/prod_a1b2c3d4e5/watch" \
  -H "Authorization: Bearer pwk_live_YOUR_KEY_HERE"

応答例(200):

{
  "product_id": "prod_a1b2c3d4e5",
  "watching": true,
  "watched_at": "2026-09-07T18:00:00Z"
}
1回の呼び出しで追跡とウォッチを行う

認証済みのPOST /trackでは、次の値を指定できます。

  • watch: true — ジョブが商品に紐付けられたときに、その商品をウォッチリストに追加します
  • refresh: true — URLがすでにカタログにある場合でも、スクレイピングを強制的に再実行します
curl -s -X POST "https://pricewatcha.com/api/v1/track" \
  -H "Authorization: Bearer pwk_live_YOUR_KEY_HERE" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://www.backmarket.de/de-de/p/example",
    "watch": true,
    "refresh": true
  }'
自動ウォッチ

以下の操作でも、アカウントで商品がウォッチ対象になります。

  • 価格アラートの作成(POST /alerts)
  • 価格イベント(price_dropped、price_changed、…)を含む商品スコープのWebhookの作成/更新
ウォッチ解除

商品に有効なアラートが残っている場合、DELETE /products/{productId}/watch は 409 alert_requires_watch で失敗します。先にアラートを削除または無効化してください。


Webhook

価格の変更、アラートしきい値への到達、または認証済みトラックジョブの完了時に、署名付きのHTTP POSTリクエストを送信します。

イベントタイプはグローバルに、または単一の product_id に対して登録できます。各イベントタイプは個別のリクエストとして配信されます。

スコープ動作
グローバル(product_id を省略)あなたがウォッチしている(ウォッチリストにある)商品、または有効な価格アラートを設定している商品の価格イベントが対象です。カタログ全体ではありません。
スコープ指定(product_id を設定)その商品の価格イベントのみが対象です。価格イベントを含む商品スコープのサブスクリプションを作成/更新すると、スケジューラーによる更新のためにその商品もウォッチされます。
テスト(POST /webhooks/{id}/test)エンドポイントを検証するために webhook_test ペイロードを送信します。商品スコープはありません。

カタログ全体の価格ストリーミングには対応していません。テストエンドポイントで配信を検証した後、関心のあるイベントに合わせて商品を追跡するか、アラートを作成してください。

サブスクリプションは POST https://pricewatcha.com/api/v1/webhooks で管理します。スキーマ全体は GET https://pricewatcha.com/api/v1/openapi.json(タグ webhooks、alerts)で確認できます。

注: URLのスキームはHTTPSである必要があります。また、プライベートIP範囲または内部IP範囲に名前解決されないようにしてください。

イベントタイプ
イベントタイプトリガー
price_changed価格が €0.01 を超えて変動した場合
price_dropped価格が €0.01 を超えて下落した場合
price_increased価格が €0.01 を超えて上昇した場合
new_historical_low過去のすべての観測値を下回る新しい価格が記録された場合
price_alert_triggeredユーザーのアラートが発動した場合(最小/最大しきい値、または方向指定の下落/上昇)
track_job_completed認証済みの POST /track が正常に完了した場合
track_job_failed認証済みの POST /track が失敗した場合
webhook_testPOST /api/v1/webhooks/{webhook_id}/test からのみ
ペイロード形式
price_dropped
{
  "event_id": "evt_a1b2c3d4e5",
  "event_type": "price_dropped",
  "occurred_at": "2026-05-24T14:00:00Z",
  "product": {
    "product_id": "prod_a1b2c3d4e5",
    "name": "Apple iPhone 15 Pro 128GB (Refurbished)",
    "shop": "Back Market",
    "product_url": "https://www.backmarket.de/...",
    "currency": "EUR"
  },
  "price": {
    "old_price": 599.00,
    "new_price": 536.00,
    "historical_low": 536.00,
    "historical_high": 729.00,
    "average_price": 612.50
  },
  "metadata": {
    "source": "pricewatcha",
    "api_version": "v1"
  }
}
price_alert_triggered

同じ product ブロックと price ブロックに加えて、alert オブジェクトが含まれます。

{
  "event_id": "evt_b2c3d4e5f6",
  "event_type": "price_alert_triggered",
  "occurred_at": "2026-05-24T14:00:00Z",
  "alert": {
    "alert_id": "76",
    "min_threshold_price": 549.00,
    "max_threshold_price": 599.00,
    "threshold_reached": "min",
    "name": "Under €550"
  },
  "metadata": {
    "source": "pricewatcha",
    "api_version": "v1"
  }
}
署名と検証

各配信には以下が含まれます。

  • X-Pricewatcha-Event-Id
  • X-Pricewatcha-Event-Type
  • X-Pricewatcha-Timestamp(Unix秒)
  • X-Pricewatcha-Signature(sha256=<hex>)

署名対象の文字列は "{timestamp}.{raw_body}" です。HMAC-SHA256とWebhookシークレット(whsec_…。サブスクリプションの作成時に一度だけ表示)を使用します。

警告: Webhookシークレットは一度しか表示されません。 安全に保管してください。以降は secret_prefix のみ表示されます。

Python
import hmac
import hashlib

def verify_pricewatcha_webhook(secret: str, timestamp: str, raw_body: bytes, signature: str) -> bool:
    expected = hmac.new(
        secret.encode("utf-8"),
        f"{timestamp}.{raw_body.decode('utf-8')}".encode("utf-8"),
        hashlib.sha256,
    ).hexdigest()
    return hmac.compare_digest(f"sha256={expected}", signature or "")
JavaScript(Node.js)
import crypto from "node:crypto";

function verifyPricewatchaWebhook(secret, timestamp, rawBody, signature) {
  const expected = crypto
    .createHmac("sha256", secret)
    .update(`${timestamp}.${rawBody}`)
    .digest("hex");
  const expectedHeader = `sha256=${expected}`;
  return crypto.timingSafeEqual(
    Buffer.from(expectedHeader),
    Buffer.from(signature || "")
  );
}
配信と再試行

配信に失敗した場合、最大5回再試行します:1分 → 5分 → 30分 → 2時間 → 12時間。

失敗が10回連続すると、サブスクリプションは自動的に無効化されます。

配信ログ
curl -s "https://pricewatcha.com/api/v1/webhooks/{webhook_id}/deliveries" \
  -H "Authorization: Bearer pwk_live_YOUR_KEY_HERE"
例
サブスクリプションを作成する
curl -s -X POST "https://pricewatcha.com/api/v1/webhooks" \
  -H "Authorization: Bearer pwk_live_YOUR_KEY_HERE" \
  -H "Content-Type: application/json" \
  -d '{
    "target_url": "https://n8n.example.com/webhook/abc123",
    "event_types": ["price_dropped", "new_historical_low"],
    "product_id": "prod_a1b2c3d4e5"
  }'
テストWebhookを送信する
curl -s -X POST "https://pricewatcha.com/api/v1/webhooks/42/test" \
  -H "Authorization: Bearer pwk_live_YOUR_KEY_HERE"

AI エージェントと MCP

Pricewatcha は リモート MCP エンドポイントを公開しているため、ローカルへのインストールは不要です。以下の URL を使って AI クライアントを接続してください。利用可能なツールには、カタログの読み取り(get_api_status、search_products、track_product、get_job_status、get_product、get_price_history)、継続的な監視(watch_product、unwatch_product、list_watchlist、get_watch_status)、価格アラート(create_price_alert、list_price_alerts、get_price_alert、update_price_alert、delete_price_alert)があります。アラートとウォッチリストのツールには Pricewatcha API キーが必要です。数値のしきい値を指定せず、値下がりまたは値上がりがあった場合に通知するアラートを設定できます。アラートを作成すると、スケジューラーによる更新のために、その商品も監視対象になります。

https://mcp.pricewatcha.com

手順を追ったセットアップ方法は、以下のClaude、ChatGPT、n8n、Makeをご覧ください。


Claude

できること: Claude.ai または Claude デスクトップアプリから、自然な言葉で直接 Claude に商品の検索、価格の追跡、価格履歴の確認、継続的な更新のための商品監視、アラートの設定、Webhook の管理を依頼できます。

接続方法:Claude.ai(ウェブ)

手順 1:Customize パネルを開く
Claude.ai の左サイドバーで Customize(スライダーアイコン)をクリックするか、claude.ai/settings/connectors にアクセスします。

手順 2:カスタムコネクターを追加する
Connectors の下にある + をクリックして、新しいコネクターを追加します。

手順 3:MCP サーバーの URL を入力する
名前(例:「Pricewatcha」)を入力し、以下を貼り付けます。

https://mcp.pricewatcha.com

Add をクリックします。

手順 4:完了
Pricewatcha がコネクターの一覧に表示されます。読み取り専用ツール(get_api_status、get_job_status、get_product、get_price_history、search_products、list_price_alerts、get_price_alert、list_watchlist、get_watch_status)と書き込みツール(track_product、create_price_alert、update_price_alert、delete_price_alert、watch_product、unwatch_product)が利用できます。これで、どの Claude の会話でも Pricewatcha を使用できます。

手順 5:ツールの権限を設定する(任意)
コネクターの一覧からコネクターを開くか、claude.ai/settings/connectors に戻って、Tool permissions を展開します。

各ツール、または Read-only/Write グループ全体について、Claude による呼び出しを許可する条件を選択します。

設定意味
Always allowClaude は毎回確認せずにツールを呼び出します
Require approval呼び出しのたびに Claude が確認します(新しいコネクターのデフォルト)
Never allowツールはブロックされます

日常的な価格確認や検索では、読み取り専用ツール(または読み取り専用グループ全体)を Always allow に設定してください。track_product、アラート、ウォッチリストのツールについては、書き込み時の確認を省略する場合は Always allow を選び、事前に確認したい場合は Require approval のままにします。アラートとウォッチリストのツールには Pricewatcha API キー(pwk_live_...)が必要です。

接続方法:Claude Desktop App

手順は同じです。Customize → Connectors → Add custom connector の順に進み、https://mcp.pricewatcha.com を貼り付けます。ツールの権限は、コネクター設定の Tool permissions で同じように設定できます。

以下を試してみてください。

  • 「550 ユーロ未満の整備済み iPhone 15 Pro を探して」
  • 「この商品の URL を追跡して、価格履歴を見せて」
  • 「価格が継続的に更新されるよう、この商品を監視してから、ウォッチリストを表示して」
  • 「この商品が 500 ユーロを下回ったらアラートを設定して」
  • 「価格目標を指定せず、この商品が安くなるたびに通知して」

注: track_product はバックグラウンドで追跡ジョブを作成するため、書き込みツールです。既存のデータを変更または削除することはありません。アラートツール(create_price_alert、update_price_alert、delete_price_alert)とウォッチリストのツール(watch_product、unwatch_product、list_watchlist、get_watch_status)には API キーが必要です。アラートを作成すると、スケジューラーによる継続的な更新のために、その商品も監視対象になります。

ChatGPT

できること: MCP を介して、ChatGPT 内で商品を検索したり、価格を追跡したり、価格履歴を取得したり、継続的な更新のために商品をウォッチしたり、価格アラートを設定したり、Webhook を管理したりできます。

Pricewatcha は、公式のプラグインストアで承認済みの ChatGPT プラグインとして利用できます。

ステップ 1: ChatGPT のサイドバーで Plugins を開き、Pricewatcha を検索します。

ステップ 2: リスティングを開き、Install plugin をクリックします。

ステップ 3: 認証画面で Connect Pricewatcha を確定します。OAuth を完了するため、ChatGPT から Pricewatcha のサインインページが一時的に開く場合があります。

ステップ 4:完了です。 プロンプトの例:

  • 「550ユーロ未満の整備済みiPhone 15 Proを検索して」
  • 「この商品のURLを追跡して、価格履歴を表示して」
  • 「価格が継続的に更新されるようにこの商品をウォッチして、それからウォッチリストを表示して」
  • 「この商品が安くなったら、目標価格なしで通知して」

アラートとウォッチリストのツール(create_price_alert、watch_product、list_watchlist、…)には、Pricewatcha API キー(pwk_live_...)が必要です。アラートを作成すると、スケジューラーによる継続的な更新のために商品もウォッチされます。

他の MCP クライアント向けのオプション: リモート MCP URL は https://mcp.pricewatcha.com です。コネクタのロゴ(PNG、最大 10 KB):https://pricewatcha.com/static/img/mcp/chatgpt-logo.png からダウンロード。


n8n

できること: 価格監視の自動化ワークフローを構築できます。コーディング不要で、価格の変動時やアラートのしきい値を超えたときにアクションを実行できます。

一般的なユースケース: 追跡中の商品が設定したしきい値を下回ったら、商品名、ショップ、現在価格、アラート名を含む通知を Telegram、Slack、またはメールで送信します。

注: 公開アクセス可能な URL が必要なのは、n8n をローカルで実行する場合(自分のマシン上でセルフホストする場合)のみです。n8n Cloud またはサーバーでホストされたインスタンスを使用する場合、n8n の Webhook URL はすでに公開アクセス可能です。トンネルの手順はスキップしてください。

方法 A:n8n Cloud またはサーバーでホスト(トンネル不要)
  1. n8n で Webhook ノードを作成し、Production URL をコピーします。
  2. webhook_url に n8n の URL を設定して Pricewatcha アラートを作成します(下記参照)。
  3. 完了です。しきい値に達すると、price_alert_triggered イベントが配信されます。
方法 B:n8n をローカルでセルフホスト(トンネルが必要)
  1. Cloudflare Tunnel を起動します:cloudflared tunnel --url http://localhost:5678(macOS では brew install cloudflared でインストールします)。
  2. トンネルの URL をコピーします(例:https://abc123.trycloudflare.com)。
  3. n8n で Webhook ノードを作成し、パスを確認します(例:/webhook-test/abc123)。
  4. URL を結合します:https://abc123.trycloudflare.com/webhook-test/abc123。
  5. Pricewatcha アラートの webhook_url にこの URL を使用します。
Webhook 配信を使った価格アラートの作成

API キーが必要です:

curl -s -X POST "https://pricewatcha.com/api/v1/alerts" \
  -H "Authorization: Bearer pwk_live_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "product_id": "prod_YOUR_PRODUCT_ID",
    "min_threshold_price": 600.00,
    "webhook_url": "https://YOUR_N8N_URL/webhook/YOUR_PATH",
    "notify_email": false,
    "name": "Price drop alert"
  }'

現在の価格が min_threshold_price 以下になると、Pricewatcha は次の形式のペイロードを含む price_alert_triggered イベントを送信します。

{
  "event_id": "evt_...",
  "event_type": "price_alert_triggered",
  "occurred_at": "2026-05-26T20:32:07Z",
  "product": {
    "product_id": "prod_...",
    "name": "iPhone 15 Pro",
    "shop": "Swappie",
    "current_price": 559.00,
    "currency": "EUR"
  },
  "price": {
    "old_price": 559.00,
    "new_price": 559.00,
    "historical_low": 7.99,
    "historical_high": 649.00,
    "average_price": 570.44
  },
  "alert": {
    "alert_id": "77",
    "min_threshold_price": 600.00,
    "threshold_reached": "min",
    "name": "Price drop alert"
  },
  "metadata": {
    "source": "pricewatcha",
    "api_version": "v1"
  }
}
おすすめの n8n ワークフロー
  1. Webhook ノード(トリガー):price_alert_triggered イベントを受信します。
  2. IF ノード:{{ $json.body.event_type }} が price_alert_triggered と等しい場合に絞り込みます。
  3. 通知ノード:メール/Telegram/Slack に以下を送信します:
    • 商品:{{ $json.body.product.name }}
    • ショップ:{{ $json.body.product.shop }}
    • 現在価格:{{ $json.body.price.new_price }} {{ $json.body.product.currency }}
    • アラート名:{{ $json.body.alert.name }}
接続をテストする
curl -s -X POST "https://pricewatcha.com/api/v1/webhooks/YOUR_WEBHOOK_ID/test" \
  -H "Authorization: Bearer pwk_live_YOUR_KEY"

注: テストエンドポイントには、アラートではなく Webhook サブスクリプション(POST https://pricewatcha.com/api/v1/webhooks)が必要です。

署名の検証: 本番環境では X-Pricewatcha-Signature(HMAC-SHA256)を検証してください。Webhook signingを参照してください。

別の方法: HTTP Request ノードを使用します:GET https://pricewatcha.com/api/v1/search?q=… または GET https://pricewatcha.com/api/v1/products/PRODUCT_ID/price-history。


Make

実現できること: n8n と同じ webhook ベースの自動化を、コード不要のビジュアルワークフローで実現できます。

n8nMake での同等機能
Webhook TriggerWebhooks → Custom webhook
IF nodeRouter または Filter
HTTP RequestHTTP → Make a request
Notification nodesEmail / Telegram / Slack
  1. トリガーに Custom webhook を設定してシナリオを作成し、URL をコピーします。
  2. Pricewatcha の webhook サブスクリプションを作成します(n8n ガイドと同じ curl を使用し、target_url に Make の URL を指定します)。
  3. event_type に Router を追加します。
  4. POST https://pricewatcha.com/api/v1/webhooks/{id}/test でテストします。

Make の無料プラン: webhook を含めて月間最大 1,000 オペレーションを利用できます。個人での価格モニタリングには十分です。


スマートホーム

価格アラート webhook を使って自動化を実行できます。追跡中の商品が目標価格に達したときに、シーン、通知、照明を作動させます。

以下のHome Assistant と Loxone を参照してください。


Home Assistant

実現できること: Pricewatcha の価格アラートが発生したときに、自動化をトリガーします。

一般的なユースケース: 価格がしきい値を下回ったら、モバイル通知を送信する、input_boolean.good_deal を切り替える、またはスクリプトを実行します。

方法 A:Webhook トリガー(推奨)
  1. Webhook トリガーを追加します(例:Webhook ID pricewatcha_price_drop → https://YOUR_HA_HOST/api/webhook/pricewatcha_price_drop)。
  2. URL にインターネット経由でアクセスできることを確認します(Nabu Casa、リバースプロキシ、またはトンネルを使用します)。
  3. その webhook_url を指定して Pricewatcha アラートを作成します(n8n ガイドに curl の例があります)。
  4. アクションで trigger.json.product.name、trigger.json.price.new_price などを使用します。

自動化の例(YAML):

automation:
  - alias: "Pricewatcha price drop"
    trigger:
      - platform: webhook
        webhook_id: pricewatcha_price_drop
        allowed_methods: [POST]
        local_only: false
    action:
      - service: notify.notify
        data:
          title: "Price alert: {{ trigger.json.product.name }}"
          message: >-
            {{ trigger.json.product.shop }} ·
            {{ trigger.json.price.new_price }}
            {{ trigger.json.product.currency }}
方法 B:REST センサー(ポーリング)
rest:
  - resource: "https://pricewatcha.com/api/v1/products/prod_YOUR_PRODUCT_ID"
    scan_interval: 3600
    sensor:
      - name: "Tracked product price"
        value_template: "{{ value_json.current_price }}"
        unit_of_measurement: "EUR"

読み取りエンドポイントに API キーは不要です。ポーリングのほうが簡単ですが、webhook よりリアルタイム性は劣ります。

署名の検証: 本番環境では X-Pricewatcha-Signature を検証してください。Webhook の署名を参照してください。


Loxone

実現できること: スケジュールに従って Pricewatcha から現在の価格をポーリングし、価格がしきい値に達したときに Loxone プログラムを実行します。Miniserver Generation 1 と Generation 2 の両方で動作します。

パス A — 現在の価格をポーリングする(Virtueller HTTP Eingang)

Loxone の Virtueller HTTP Eingang(仮想 HTTP 入力)は、設定可能な間隔で URL を取得し、コマンド認識によって値を抽出します。抽出された値はそれぞれ Loxone の入力となり、プログラムで使用できます。

Gen2 — HTTPS で直接接続(ミドルウェア不要)

Miniserver Gen2 は HTTPS にネイティブ対応しているため、Pricewatcha API を直接呼び出せます。

Gen1 — LoxBerry https2http Plugin 経由

Miniserver Gen1 は HTTPS に対応していません。LoxBerry に https2http Plugin をインストールしてください。これは HTTPS プロキシとして機能し、LoxBerry が Pricewatcha の HTTPS レスポンスを取得して、HTTP 経由で Loxone に提供します。

ステップ 1 — 製品 ID を確認する

製品を検索して、product_id(形式:prod_...)を控えるか、demo_iphone_15_pro などのデモ製品を使用します。

GET https://pricewatcha.com/api/v1/search?q=YOUR+PRODUCT

ステップ 2 — Loxone Config で Virtueller HTTP Eingang を作成する

Loxone Config で 周辺機器 → 仮想入力 → 仮想 HTTP 入力 に移動します。

Miniserver の世代に応じて URL を設定します。

世代入力する URL
Gen2(直接接続)https://pricewatcha.com/api/v1/products/prod_YOUR_PRODUCT_ID
Gen1(LoxBerry 経由)http://YOUR_LOXBERRY_IP/plugins/https2http/?url=https://pricewatcha.com/api/v1/products/prod_YOUR_PRODUCT_ID

ポーリング間隔(Abfragezyklus)を設定します。例:3600 秒(1 時間ごと)。

API キーや認証は不要です。製品エンドポイントは公開されています。

ステップ 3 — Virtueller HTTP Eingang Befehle(コマンド認識)を追加する

抽出したい値ごとに、入力に Virtueller HTTP Eingang Befehl(仮想 HTTP 入力コマンド)を追加します。コマンド認識は、未加工の JSON レスポンスからパターンを検索し、値を抽出します。

Pricewatcha の製品 API は、次のような JSON を返します。

{
  "product_id":"prod_...",
  "name":"Apple iPhone 15 Pro 128GB (Refurbished)",
  "shop":"Back Market",
  "current_price":563.0,
  "currency":"EUR",
  "status":"active"
}

必要な値ごとに Befehl を 1 つ追加します。

値コマンド認識パターン
現在の価格(数値)"current_price":\v
製品名(テキスト)"name":"\a
ショップ名(テキスト)"shop":"\a
通貨(テキスト)"currency":"\a

パターン構文リファレンス:

  • \v — この位置にある数値を抽出します
  • \a — テキスト値を抽出します(次の " まで読み取ります)
  • \i...\i — マーカー間のテキストをスキップ/無視します(JSON 内の適切な位置に移動するために使用します)

注: ヒント: Loxone Config にはパターンテスターが組み込まれています。コマンド認識パターンを入力するとき、入力フィールドの右側にある > ボタンをクリックします。Edit Command Recognition ダイアログが開きます。Pricewatcha の製品 URL を入力して "Daten abfragen" をクリックすると、Loxone Config が最新のレスポンスを取得し、一致した値を緑色でハイライト表示します。保存する前に各パターンを確認できます。

ステップ 4 — プログラムに接続する

各 Befehl の出力は数値またはテキスト値で、Loxone プログラムで直接使用できます。

  • current_price を 閾値スイッチ(Schalter mit Schwellwert)に接続します → 価格が目標値を下回ると作動します
  • 閾値スイッチの出力を プッシュ通知、照明シーン、またはその他の Loxone アクションに接続します

注: API キーは不要です — 製品詳細エンドポイントは公開されています。アラートとウェブフックには API キーが必要です(パス B)。

Path B — LoxBerry 経由のリアルタイム価格アラート

Pricewatcha は一般からアクセス可能な HTTPS エンドポイントを必要とするため、Loxone は Pricewatcha の Webhook を直接受信できません。また、Miniserver は通常、パブリック IP アドレスのない NAT の背後にあります。これは Gen1 と Gen2 の両方に当てはまります。

LoxBerry はミドルウェアとして機能し、Pricewatcha の Webhook を受信して、MQTT 経由で Miniserver にデータを転送します。

受信 URL は LoxBerry のバージョンによって異なります。

LoxBerry のバージョン受信 URL
3.0+(MQTT が組み込み済み。プラグイン不要)http://YOUR_LOXBERRY_IP/system/tools/mqtt/receive.php
2.x(先に MQTT Gateway Plugin をインストール)http://YOUR_LOXBERRY_IP/plugins/mqttgateway/receive.php

Step 1 — Pricewatcha API キーを作成する

Profile でAPI キーを作成します(ログインが必要です)。アラートと Webhook の利用には認証が必要です。

Step 2 — LoxBerry を送信先とする Pricewatcha の価格アラートを作成する

curl -s -X POST "https://pricewatcha.com/api/v1/alerts" \
  -H "Authorization: Bearer pwk_live_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "product_id": "prod_YOUR_PRODUCT_ID",
    "min_threshold_price": 500.00,
    "webhook_url": "http://YOUR_LOXBERRY_IP/system/tools/mqtt/receive.php",
    "notify_email": false,
    "name": "Price drop alert"
  }'

Step 3 — LoxBerry の MQTT サブスクリプションを設定する

LoxBerry の MQTT 設定で、トピック rcvr/# をサブスクライブします。受信した JSON ペイロードは自動的に解析されます。関連するフィールド(例:event_type、price/new_price)を、MQTT サブスクリプション経由で Loxone の Virtual Inputs に割り当てます。

Step 4 — Loxone Config で設定する

MQTT サブスクリプションによってトリガーされる Virtual Input を、通知または自動化プログラムに接続します。

Warning: パブリックアクセスが必要です: Pricewatcha がインターネット経由で LoxBerry の Webhook URL にアクセスできる必要があります。Loxone Remote Connect を使用するか、ルーターでポートフォワーディングを設定してください。インターネットに公開せずにローカルでテストする場合は、Pricewatcha のテストエンドポイントを使用して手動で配信を実行します:POST https://pricewatcha.com/api/v1/webhooks/{id}/test

Note: 別のミドルウェア: ioBroker とその Loxone アダプターも、Pricewatcha の Webhook を受信するミドルウェアとして利用できます。設定方法については、ioBroker のドキュメントを参照してください。


SDK

公式の Python および TypeScript クライアントライブラリは、GitHub の sdks/ にあります。

非同期の track → poll → read ワークフローに対応しています。ほかの言語では、OpenAPI スキーマまたはプレーン HTTP を使用してください。

Python
from pricewatcha import Pricewatcha

client = Pricewatcha()  # public endpoints, no key needed

## With an API key (alerts, webhooks, …)
client = Pricewatcha(api_key="pwk_live_YOUR_KEY")

GitHub の Python SDK からインストールします。セットアップ方法:sdks/python/README.md。

TypeScript
import { PricewatchaClient } from "@pricewatcha/sdk";

const client = new PricewatchaClient();  // public endpoints, no key needed

const authedClient = new PricewatchaClient({ apiKey: "pwk_live_YOUR_KEY" });

GitHub の TypeScript SDK からインストールします。セットアップ方法:sdks/typescript/README.md。

クライアントの生成

OpenAPI 仕様または稼働中の GET https://pricewatcha.com/api/v1/openapi.json から、ほかの言語のクライアントを生成できます(OpenAPI Generator、Speakeasy、Kiota などのツールを使用)。


変更履歴

このリポジトリにおける 公開 API コントラクト、SDK、MCP サーバーの主な変更点です。

パッケージ/リリースのバージョニングには 0.1.x を使用します。HTTP API のパスは /api/v1 のままです。

0.1.7 - 2026-09-07
追加
  • ウォッチリスト API: GET /api/v1/watchlist、GET|POST|DELETE /api/v1/products/{productId}/watch(API キー)。ウォッチ対象の商品は、価格スケジューラーにも含まれます(ダッシュボードと同じ user_products パスを使用します)。
  • POST /track のオプション(認証が必要): watch: true にすると、商品を継続的な更新の対象として登録します。refresh: true にすると、URL がすでにカタログにある場合でも、強制的に再スクレイピングします。
  • 自動ウォッチ: 価格アラートを作成すると、そのアカウントの商品がウォッチ対象になります。また、価格イベントを指定した商品スコープの Webhook を作成した場合も同様です。
  • MCP / SDK: watch_product、unwatch_product、list_watchlist、get_watch_status を追加しました。track は watch / refresh を受け付けます。
  • Claude / ChatGPT ガイド: ウォッチリストのツールとプロンプトの例を、コネクターのセットアップページに記載しました。
  • SDK / MCP パッケージ: 0.1.7 に更新しました。
0.1.6 - 2026-08-26
変更
  • 検索のレート制限: GET /api/v1/search に、一般的なカタログ読み取りとは別の、複数段階のクォータを設定しました。匿名の場合は約 20 回 / 60 秒、約 60 回 / 時間、約 200 回 / 日、認証済み(API キー)の場合はアカウントごとに約 40 回 / 60 秒、約 180 回 / 時間、約 1000 回 / 日です。同じ検索クエリを短い間隔でポーリングすると、X-RateLimit-Policy が search、search_hourly、または search_daily の HTTP 429 が返されます。
  • 商品読み取りのレート制限: GET /products/{id} と /price-history では、1 分あたりのバースト上限を維持したまま、時間ごと・日ごとの上限を追加しました。匿名の場合は約 120 回 / 60 秒、約 180 回 / 時間、約 600 回 / 日、認証済みの場合は約 240 回 / 60 秒、約 540 回 / 時間、約 3000 回 / 日です。
  • 不正利用に関する通知: 匿名ユーザーが検索または商品読み取りの日次クォータ(search_daily / read_daily)を使い切った場合、track_daily と同じ IP の違反回数しきい値に加算されます。異なる UTC 日に複数回上限に達すると、クライアントに [email protected] への連絡が求められます(X-Pricewatcha-Restriction: notice)。返信がない場合、IP はブロックされます。デフォルトの制限対象は、ヘルスチェックとディスカバリーを除く /api/v1 全体です。
0.1.5 - 2026-08-24
変更
  • 検索のマッチング: GET /api/v1/search?q= は、クエリ全体が連続した部分文字列であることを要求する代わりに、大文字と小文字を区別しない トークン AND(すべての語が含まれる必要があります。順序は問いません)を使用します。ハイフン、スラッシュなどの句読点は空白に正規化されます(Darth-Vader ≡ Darth Vader、1/6 ≡ 1 6)。連続したフレーズの一致は、引き続き高く順位付けされます。マイナス記号を前置する除外語の動作に変更はありません。
0.1.4 - 2026-08-23
追加
  • 価格の変動方向アラート: POST / PATCH / GET /api/v1/alerts で notify_on_drop と notify_on_rise を指定できます。どちらかのフラグがあれば十分です。数値のしきい値は不要になりました。
  • MCP アラートツール: create_price_alert、list_price_alerts、get_price_alert、update_price_alert、delete_price_alert を追加しました(API キーが必要)。HTTP API と同じ変動方向フラグを使用します。
  • Google 商品カテゴリ: GET /api/v1/products/{id}、GET /api/v1/search(および MCP の get_product / search_products / 完了した track ジョブ)で google_product_category_id と google_product_category_name を返します。レスポンスには常に含まれ、未設定の場合は null になります。検索に追加のクエリパラメーターは不要です。
  • 検索の除外語: GET /api/v1/search?q= は、マイナス記号を前置したトークン(例:iPhone 15 -cover -hülle)を受け付け、商品名、ショップ、または URL にそれらの語が含まれる商品を除外します。大文字と小文字は区別されません。limit は除外後に適用されます。
  • 不正利用 / IP 制限: 匿名ユーザーが日次制限に繰り返し達すると、猶予期間 / 通知期間が開始される場合があります(API は引き続き利用可能で、X-Pricewatcha-Restriction: notice が返されます)。その後、ブロックされます(403 access_restricted)。[email protected] までお問い合わせください。
0.1.3 - 2026-08-17
変更
  • Track の同時実行枠: スクレイピングのタイムアウトを超えた queued / processing ジョブは、自動的に失敗として処理されます(起動時および POST /track の実行時)。これにより、デプロイやワーカーのハングによってクライアントがいつまでもブロックされることを防ぎます。
  • 同じ URL の再試行: クライアントの進行中ジョブに同じ URL がすでに存在する場合、2 回目の POST /track は HTTP 429 の代わりに既存の job_id を返します。
0.1.2 - 2026-08-13
変更点
  • トラックのレート制限: 匿名ユーザーの上限は、同時実行数約2件/1分あたり10件/1時間あたり40件/1日あたり80件です。クライアントの識別には、CF-Connecting-IP(次にTrue-Client-IP、その次にX-Forwarded-For)を優先するため、CloudflareのエッジIPごとに別の枠が割り当てられることはありません。
  • 認証済みトラックの上限: APIキーまたはログインセッションを使用してPOST /trackを呼び出すと、アカウントごとの上限が引き上げられます(同時実行数約4件/1分あたり20件/1時間あたり120件/1日あたり400件)。コールバックがない場合も、アカウントはトラックジョブに保存されます。
  • MCPの呼び出し元は、共有の送信元IPではなく、安定した転送クライアントIDによってレート制限を受けることがあります。
0.1.1 - 2026-06-28
変更点
  • APIドキュメント、OpenAPI仕様、SDKからPublic Previewのブランド表記を削除しました。検出ステータスは利用可能です。
0.1.0 - 2026-06-03

パブリックAPI、公式SDK、リモートMCPサーバーの初回リリースです。

追加
  • GET /api/v1/health
  • GET /api/v1:検出ドキュメント
  • POST /api/v1/track:非同期取り込み(200、上限付きロングポーリング約25秒)
  • GET /api/v1/jobs/{jobId}
  • GET /api/v1/products/{productId}
  • GET /api/v1/products/{productId}/price-history
  • GET /api/v1/search?q=
  • GET /api/v1/openapi.json
  • デモカタログ:demo_iphone_15_pro、demo_galaxy_s24
  • v1エンドポイントのレスポンスにレート制限ヘッダーを追加
  • APIキー:POST /api/keys、GET /api/keys、DELETE /api/keys/{id}(pwk_live_...)
  • アラート:POST/GET/PATCH/DELETE /api/v1/alerts(APIキーが必要)
  • ウェブフック:/api/v1/webhooksでの完全なCRUD、テスト配信、配信ログ(APIキーが必要)
  • 公式MCPサーバー:https://mcp.pricewatcha.comでのリモートHTTP接続(MCP接続にAPIキーは不要)
  • ドキュメント:デフォルトの認証情報としてAPIキーを使用。ログインセッショントークンはヘッドレスでのキー取得のみに使用
注記
  • 読み取りエンドポイントは引き続き認証なしで利用できます。アラートとウェブフックにはAPIキーが必要です。
  • エンドポイントとフィールドは予告なく変更される場合があります。

リポジトリの構成
openapi/              OpenAPI 3.1 specification
docs/                 API guides (source for README and Developer page)
examples/             curl and SDK samples
sdks/python/          Official Python package
sdks/typescript/      Official TypeScript package
mcp/                  MCP tool schema (reference)
mcp-server/           MCP server (TypeScript)
public-demo/          Demo product IDs

使用例: examples/

MCP: mcp/README.md · mcp-server/


免責事項
  • APIの安定性: エンドポイント、フィールド、レート制限は変更される場合があります。
  • 価格はスナップショットです: 必ず販売元のサイトで確認してください。
  • 金融上の助言ではありません: トレンドは過去のデータのみから算出されています。
ライセンス

Apache License 2.0:詳細はLICENSEを参照してください。

セキュリティ

脆弱性は責任ある方法でご報告ください:SECURITY.md。


サポート

APIに関する質問、連携の問題、予期しない動作については、**[email protected]**までお問い合わせください。

IPアドレスがaccess_restrictedを伴うHTTP 403を受信した場合、または通知ヘッダー(X-Pricewatcha-Restriction: notice)が表示された場合は、**[email protected]**までご連絡ください。不正利用とIP制限をご覧ください。

このリポジトリのバグ報告やドキュメントの修正については、GitHub issueを作成してください。

コメント

MCP は初めてですか?

プロトコルの概要から最初のサーバーの導入まで、よくある疑問にまとめて答えます。

AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。