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ステータスコードを返した場合、配信は成功とみなされます。