Webhook
Thay vì gọi API liên tục, đăng ký một địa chỉ https:// để BESfarm gửi dữ liệu mới tới bạn sau mỗi lần cập nhật buổi sáng (6h) và buổi chiều (18h) giờ Việt Nam. Mỗi khoá đăng ký tối đa 3 webhook.
Đăng ký
curl -X POST https://crm.besfarm.net/api/v1/webhooks \
-H "Authorization: Bearer bes_live_KHOA_CUA_BAN" \
-H "Content-Type: application/json" \
-d '{"url":"https://may-chu-cua-ban.vn/besfarm-hook"}'
Phản hồi có trường secret dạng whsec_…, chỉ hiện một lần. Dùng nó để kiểm chữ ký.
Sự kiện market.updated
POST https://may-chu-cua-ban.vn/besfarm-hook
X-BESfarm-Event: market.updated
X-BESfarm-Timestamp: 1791698868
X-BESfarm-Signature: sha256=5d41402abc4b2a76b9719d911017c592...
{
"event": "market.updated",
"api_version": "2026-10-14",
"sent_at": "2026-10-14T23:13:30.000Z",
"data": {
"shrimp_prices": [ ... cùng định dạng /api/v1/market/shrimp ... ],
"seed_report": { "week_start": "2026-10-12", "total_qty": 350000000, "shipments_count": 120 }
}
}
Kiểm chữ ký
Chữ ký là HMAC-SHA256 của chuỗi timestamp + "." + nội dung thô, khoá là secret. Từ chối yêu cầu có timestamp lệch quá 5 phút để chống gửi lại.
// Node.js
import crypto from "node:crypto";
function verify(rawBody, headers, secret) {
const ts = headers["x-besfarm-timestamp"];
if (Math.abs(Date.now() / 1000 - Number(ts)) > 300) return false;
const expected = "sha256=" + crypto.createHmac("sha256", secret).update(ts + "." + rawBody).digest("hex");
return crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(headers["x-besfarm-signature"]));
}
Phản hồi và gửi lại
- Trả về mã 2xx để xác nhận đã nhận.
- Webhook lỗi 10 lần liên tiếp sẽ tự tắt; đăng ký lại để bật.
- Xem danh sách:
GET /api/v1/webhooks. Tắt:DELETE /api/v1/webhooks/{id}.