ドキュメント/アクセス/Webhooks
アクセス

Webhook

EDINETに新しい報告書が公開されたとき、または株主構造シグナルが検出されたとき、プッシュ通知を受け取れます。URLを登録し、受信するイベントを選択し、署名シークレットでペイロードを検証してください。

Webhookの登録

/v1/webhooksにPOSTリクエストを送信し、受信先URLと購読するイベントを指定します。URLはHTTPSかつパブリックIPに解決される必要があります。

POST /v1/webhooks
curl "https://api.axiora.dev/v1/webhooks" \
  -H "Authorization: Bearer ax_live_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://example.com/webhooks/axiora",
    "events": ["new_filing", "amendment"]
  }'

レスポンスにはsecret(署名検証用の64文字の16進文字列)が含まれます:

Response · 201 Created
{
  "data": {
    "id": 1,
    "url": "https://example.com/webhooks/axiora",
    "events": ["amendment", "new_filing"],
    "active": true,
    "secret": "a1b2c3d4e5f6...64 hex characters",
    "created_at": "2026-02-24T10:00:00Z"
  },
  "meta": { "request_id": "req_abc123def456" }
}
!
重要:secretはWebhook作成時に一度だけ返されます。安全に保管してください。後から取得することはできません。

利用可能なイベント

以下のイベントタイプから1つ以上を購読できます:

イベント発火条件
new_filingEDINETから新しい有価証券報告書(年次・半期・四半期)が取り込まれたとき。
amendment過去に提出された報告書の訂正報告書が公開されたとき。
correction過去に提出された報告書の修正が公開されたとき。
ownership.accumulation保有比率の買い増しシグナルが検出されたとき(連続増加ストリーク、大幅増加、ペース加速)。
ownership.exit保有比率の売却シグナルが検出されたとき(5%未満への低下、大幅減少)。
ownership.activistアクティビスト活動が検出されたとき(保有目的の重要提案行為への変更等)。
ownership.new_position新規の大量保有(5%以上)の初回報告が提出されたとき。

各配信は報告書データを含むJSONボディを送信します。イベントタイプはX-Axiora-Eventヘッダーで送信されます:

Payload
{
  "doc_id": "S100ABCD",
  "edinet_code": "E02144",
  "name_jp": "トヨタ自動車株式会社",
  "fiscal_year": 2025,
  "accounting_standard": "IFRS",
  "doc_type": "120",
  "fields_count": 25
}

署名検証

すべてのWebhook配信にはHMAC-SHA256署名が含まれ、Axioraからの送信であり改ざんされていないことを検証できます。署名はWebhookシークレットを鍵としてリクエストボディから計算されます。

ヘッダー説明
X-Axiora-Webhook-SignatureWebhookシークレットで署名されたリクエストボディのHMAC-SHA256 16進ダイジェスト
X-Axiora-Eventイベントタイプ(例:new_filing、amendment、correction)
Content-Typeapplication/json

配信を検証するには:

  • リクエストボディをバイト列として読み取ります(先にパースしないでください)。
  • Webhookシークレットを鍵としてボディのHMAC-SHA256を計算します。
  • 結果をX-Axiora-Webhook-Signatureヘッダーと定数時間比較で照合します。

Python:

Python
import hmac, hashlib

def verify_webhook(payload: bytes, secret: str, signature: str) -> bool:
    expected = hmac.new(
        secret.encode(), payload, hashlib.sha256
    ).hexdigest()
    return hmac.compare_digest(expected, signature)

Node.js:

Node.js
const crypto = require("crypto");

function verifyWebhook(payload, secret, signature) {
  const expected = crypto
    .createHmac("sha256", secret)
    .update(payload)
    .digest("hex");
  return crypto.timingSafeEqual(
    Buffer.from(expected),
    Buffer.from(signature)
  );
}

配信の動作

  • Webhook URLはHTTPS必須。プライベート/内部IPはブロックされます(SSRF対策)。
  • 各配信の試行は10秒でタイムアウトします。
  • 失敗した配信は指数バックオフ(1秒、2秒)で最大2回リトライされます。合計3回試行。
  • エンドポイントが2xxステータスコードを返した場合、配信は成功とみなされます。