Quote3D ドキュメントへようこそ!⏳

Webhooks

Quote3Dをリアルタイム通知でワークフローに統合します。

Webhookとは何ですか?

Webhookを使用すると、Quote3Dで発生したイベントに関するリアルタイム通知をアプリケーションで受信できます。APIをポーリングして更新状況を確認する代わりに(たとえば、見積もりが完了したかどうかを確認するなど)、Quote3Dはイベントが発生するとすぐに、指定したURLにHTTP POSTリクエストを送信します。

これははるかに効率的であり、注文状況の更新、顧客への通知、または生産ジョブの開始など、独自のシステムで自動ワークフローをトリガーできます。

利用可能なイベント

  • quote.completed: 3D見積もり計算が正常に完了したときにトリガーされます。
  • quote.failed: 何らかの理由で、見積もり計算が失敗した場合にトリガーされます。
  • file.uploaded: 新しいモデルファイルがアカウントに正常にアップロードされたときにトリガーされます。
  • file.deleted: モデルファイルがストレージから削除されたときにトリガーされます。
  • job.status_changed: 非同期処理ジョブのさまざまな段階でトリガーされます。
  • widget.added_to_cart: 顧客が埋め込みウィジェットを使用してモデルをカートに追加したときにトリガーされます。

ペイロードの例

すべてのWebhookリクエストはJSON形式で送信されます。以下は、quote.completedイベントのペイロードの例です:

{
  "event": "quote.completed",
  "timestamp": "2026-03-10T14:30:00.000Z",
  "data": {
    "jobId": "job_01HXYZ123456789",
    "quoteId": "job_01HXYZ123456789",
    "status": "completed",
    "fileName": "gearbox-housing.stl",
    "fileId": "fl_987654321",
    "processingTimeMs": 22134,
    "result": {
      "quote_id": "job_01HXYZ123456789",
      "total_price": 25.5,
      "currency": "USD",
      "estimated_time": "2h 15m",
      "estimated_time_seconds": 8100,
      "filament_weight": 42.8,
      "printInfo": {
        "technology": "FDM",
        "material": "PLA",
        "color": "Black"
      }
    },
    "error": null
  }
}

セキュリティと検証

WebhookリクエストがQuote3Dから正当に送信され、改ざんされていないことを保証するために、X-Webhook-SignatureヘッダーにHMAC-SHA256署名を含めます。

ダッシュボードでWebhookを作成すると、一意のシークレットキーが表示されます。受信するすべてのリクエストの署名を検証するために、このキーを使用する必要があります。

検証手順:

  1. 生の要求ボディを文字列として読み取ります。
  2. X-Webhook-Signatureヘッダーから署名とX-Webhook-Eventからイベント名を取得します。
  3. Webhookシークレットを使用して、生のボディのHMAC-SHA256ハッシュを計算します。
  4. 計算されたダイジェストの前にsha256=を付けて署名と比較してください。一致すれば、リクエストは認証済みです。
const crypto = require('crypto');

// Secret Key from your Quote3D Dashboard
const SECRET = 'your_webhook_secret_here';

function verifySignature(req) {
  const signature = req.headers['x-webhook-signature'];
  const event = req.headers['x-webhook-event'];
  const body = req.rawBody; // Keep the exact raw JSON string

  const hmac = crypto.createHmac('sha256', SECRET);
  const digest = 'sha256=' + hmac.update(body).digest('hex');

  if (typeof signature !== 'string' || typeof event !== 'string') {
    return false;
  }

  const received = Buffer.from(signature, 'utf8');
  const expected = Buffer.from(digest, 'utf8');

  return received.length === expected.length &&
    crypto.timingSafeEqual(received, expected);
}

Webhook の管理

Webhook はダッシュボードから直接管理できます:

  1. ダッシュボードの Webhook ページに移動します。
  2. 新しいエンドポイントを追加するには、新しい Webhook をクリックします。
  3. エンドポイント URL (HTTPS である必要があります) を入力し、リッスンするイベントを選択します。
  4. すぐにシークレットキーをコピーして安全な場所に保管してください。後で確認することはできません!
  5. 特定のAPIトークンでのみアクションが実行された場合にWebhookをトリガーしたい場合は、オプションのAPIトークンリンクを提供してください。

配信失敗の再試行

Webhookの送信先が一時的に利用できない状態であったり、エラーを返した場合、ダッシュボードで配信内容を確認し、その特定の配信レコードに対して再送をトリガーできます。

POST /v2/webhooks/{webhook_id}/deliveries/{delivery_id}/resend

このエンドポイントは、既存のWebhook配信に対して新しい配信試行を作成します。受信サーバーを修正した後や、デバッグのために特定のイベントを再生したい場合に役立ちます。

  • Webhookの詳細ビューを使用して、再生したい配信IDを特定してください。
  • Webhook IDと配信IDの両方を使用して再送エンドポイントを呼び出します。APIは202 Acceptedで応答し、新しい保留中の配信レコードを作成します。
  • Webhookは依然としてアクティブであり、認証されたユーザーに属している必要があります。そうでない場合、再送リクエストは拒否されます。

ベストプラクティス

  • Webhookの受信を通知するために、直ちに200 OKステータスを返してください。
  • 時間切れを避けるため、重い処理は非同期的に実行してください(例:バックグラウンドタスクキューを使用)。
  • 常に署名を検証して、不正なリクエストからエンドポイントを保護してください。
  • べき等性:一時的なエラーが発生した場合に再試行する可能性があるため、システムが同じWebhookを複数回正常に処理できるようにしてください。