Tính Năng Nâng Cao

Webhooks

Nhận callback HTTP thời gian thực cho các sự kiện chính: ngưỡng chi tiêu, thay đổi trạng thái khóa API, cảnh báo giới hạn tốc độ và sự cố hệ thống.

Sự Kiện Khả Dụng

Sự KiệnKích HoạtHành Động Khuyến Nghị
spending.alertChi tiêu hàng tháng đạt 50%, 80%, 90%, 100% ngân sáchThông báo cho bộ phận tài chính; ở mức 100%, khóa bị tự động vô hiệu hóa
key.disabledKhóa API bị vô hiệu hóa (chạm trần ngân sách, thủ công hoặc bị xâm phạm)Cảnh báo trực ban; chuyển sang khóa dự phòng
rate_limit.warningMức sử dụng đạt 80% giới hạn RPM hoặc TPMĐiều tiết client; yêu cầu tăng giới hạn
system.incidentSự cố suy giảm hoặc gián đoạn dịch vụ được phát hiệnKích hoạt chuyển đổi dự phòng thủ công nếu cần

Thiết Lập

  1. Đăng nhập vào Bảng điều khiển tại api.tokspan.com/dashboard
  2. Điều hướng đến Cài đặt → Webhooks
  3. Nhấp Thêm Endpoint và nhập URL HTTPS của bạn
  4. Chọn những sự kiện để đăng ký
  5. Sao chép khóa bí mật ký (bắt đầu bằng whsec_) — bạn sẽ cần khóa này để xác minh payload
Luôn xác minh chữ ký. Bất kỳ ai cũng có thể gửi yêu cầu HTTP đến endpoint webhook của bạn. Header X-TokSpan-Signature chứa chữ ký HMAC-SHA256 của payload sử dụng khóa bí mật của bạn. Luôn xác thực trước khi xử lý.

Xác Minh Chữ Ký

Mỗi lần gửi webhook bao gồm header X-TokSpan-Signature với digest hex HMAC-SHA256 của nội dung yêu cầu thô:

python
import hmac
import hashlib
import json

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

# In your webhook endpoint handler:
def handle_webhook(request):
    signature = request.headers.get("X-TokSpan-Signature", "")
    if not verify_webhook_signature(request.body, signature, "whsec_your_secret"):
        return 401, "Invalid signature"

    event = json.loads(request.body)
    print(f"Received event: {event['type']}")
    return 200, "OK"

Định Dạng Payload

Tất cả payload webhook đều tuân theo cấu trúc này:

json — Example: spending.alert
{
  "type": "spending.alert",
  "created": 1700000000,
  "data": {
    "api_key_id": "key_abc123",
    "api_key_name": "production-backend",
    "threshold_pct": 80,
    "monthly_budget": 500.00,
    "current_spend": 400.00,
    "currency": "USD"
  }
}

Gửi & Thử Lại

  • Thời gian chờ: Endpoint của bạn phải phản hồi trong vòng 10 giây với mã trạng thái 2xx
  • Thử lại: Các lần gửi thất bại được thử lại với exponential backoff: 5s → 30s → 5phút → 30phút → 1h. Sau 5 lần thất bại, lần gửi bị hủy
  • Thứ tự: Sự kiện có thể đến không theo thứ tự. Hãy dùng timestamp created, không dùng thứ tự đến
  • Idempotency: Cùng một sự kiện có thể được gửi nhiều lần. Dùng id để loại bỏ trùng lặp