Bỏ qua tới nội dung
Mục lục

Tham chiếu API REST

Mọi thao tác của API Belvador: đường gọi, quyền cần có, thao tác nào cần người duyệt, cách chống gửi lặp và khoá phiên bản; sinh từ cùng danh sách máy chủ dùng.

Bản Markdown
Trong bài này

Trạng thái: đang chạy (beta). REST API trả lời ở https://api.belvador.dev. Trang này sinh ra từ đúng danh sách thao tác mà cổng API chạy, nên chỉ thay đổi khi API thay đổi. Công cụ hỗ trợ OAuth có thể kết nối bằng cách đăng nhập thay vì dùng token. Coding agent dùng được đúng các thao tác này qua MCP server.

Cơ bản#

  • Địa chỉ gốc: https://api.belvador.dev/v1. JSON dùng snake_case, thời gian theo RFC 3339 giờ UTC, mã định danh là chuỗi.

  • Xác thực: gửi token cá nhân (blv_pat_…, tạo ở Tài khoản → API token) hoặc token service (blv_svc_…, tạo ở Cài đặt workspace → Service account) trong header Authorization dạng Bearer blv_… (các loại khoá). Token sống tối đa 365 ngày. Token chỉ dùng được trong workspace của nó, trong các project và môi trường được cấp, và không bao giờ vượt vai trò hiện tại của người hoặc service account đứng sau.

  • Đăng nhập bằng OAuth: công cụ hỗ trợ OAuth 2.1, ví dụ MCP client, tìm Belvador qua https://api.belvador.dev/.well-known/oauth-protected-resource và https://belvador.dev/.well-known/oauth-authorization-server. Công cụ tự đăng ký (RFC 7591, hoặc Client ID Metadata Document), đưa bạn tới belvador.dev để chọn workspace và quyền, và phải dùng PKCE với S256. Access token (blv_oat_…) sống 60 phút; refresh token (blv_ort_…) đổi sau mỗi lần dùng và dừng sau 30 ngày không dùng. Một mã hoặc refresh token bị dùng hai lần sẽ chấm dứt kết nối đó — hai lần refresh gửi cùng lúc cũng tính là dùng lại, nên hãy refresh lần lượt. Xem và ngắt kết nối ứng dụng ở Tài khoản → Ứng dụng đã kết nối.

  • Lỗi theo RFC 9457 (application/problem+json): code là mã lỗi cố định, request_id nhận diện lời gọi, errors[].pointer chỉ từng trường sai, ví dụ /name.

  • Tạo mới cần header Idempotency-Key. Gửi lại cùng khoá với cùng nội dung trong 24 giờ sẽ nhận lại đúng câu trả lời lần đầu, có Idempotent-Replayed: true, và không tạo thêm gì. Bí mật chỉ hiện một lần trong câu trả lời đó (ping token, khoá) không bao giờ được lặp lại: lần gửi lại trả null và ghi tên trường trong Belvador-Secret-Withheld. Cùng khoá nhưng nội dung khác bị từ chối với 422 IDEMPOTENCY_KEY_REUSED.

  • Sửa hoặc xoá monitor, uptime check, SLO, cấu hình project hay quy tắc cảnh báo cần If-Match với ETag bạn đọc gần nhất. Thiếu thì nhận 428; nếu ai đó đã sửa trong lúc đó thì 412 — đọc lại rồi thử lại.

  • Danh sách trả { "data": [...], "next_cursor": "...", "complete": true }. Gửi cursor cùng bộ lọc cũ để lấy trang sau; cursor dùng được 24 giờ và chỉ cho đúng danh sách đã tạo ra nó.

  • Thao tác nhạy cảm — khoá, thành viên, nơi nhận cảnh báo, thay đổi node — trả 403 APPROVAL_REQUIRED và chờ một người duyệt; xem Duyệt thao tác.

  • Dữ liệu nằm trên node của bạn (issue, event, trace, log, lượt chạy monitor) được đánh dấu dữ liệu node bên dưới. Cổng API đọc từ node của bạn bằng vé chỉ dùng được vài phút rồi chuyển nguyên câu trả lời; máy chủ của Belvador không lưu và không ghi log phần này. Node đang tắt thì nhận 503 NODE_OFFLINE — không có bản sao nào để trả thay. Tìm trace và log cần start và end, cách nhau tối đa 168 giờ.

  • Giới hạn tốc độ: 300 lời gọi mỗi phút cho mỗi token và 1200 cho cả workspace, tối đa 4 lời gọi dữ liệu node cùng lúc cho mỗi token. Mọi câu trả lời có header IETF RateLimit-Policy và RateLimit; vượt giới hạn thì nhận 429 RATE_LIMITED kèm Retry-After.

  • Tắt đi: thu hồi token thì token ngừng chạy trong khoảng 30 giây. Khi khẩn cấp, Belvador có thể tạm dừng API cho một workspace hoặc cho tất cả; lúc đó lời gọi nhận 503 PUBLIC_API_PAUSED, còn app vẫn chạy bình thường.

Duyệt thao tác#

Thao tác nhạy cảm không bao giờ chạy thẳng từ token: khoá DSN, khoá upload và ingest, ping token, thành viên và lời mời, token và service account, nơi nhận cảnh báo và thay đổi node. Trong danh sách bên dưới chúng được đánh dấu cần duyệt.

  1. Lời gọi trả 403 APPROVAL_REQUIRED kèm approval_id, approval_url (một trang trên belvador.dev), expires_at và state, cùng header Link: <…>; rel="approval". Chưa có gì thay đổi.

  2. Một người mở link, xem đúng những gì sẽ thay đổi, rồi duyệt bằng mã từ ứng dụng xác thực không cũ hơn 10 phút — hoặc từ chối. Đa số thao tác cần admin; xoá, dựng lại hay khôi phục node cần owner; token cá nhân mới chỉ chính người giữ token đó duyệt được. Yêu cầu từ service account và ứng dụng OAuth còn được gửi email cho owner và admin của workspace.

  3. Gửi lại đúng lời gọi với cùng Idempotency-Key, hoặc hỏi GET /v1/approvals/{approval_id}, để biết kết quả: executed kèm các mã định danh vừa tạo (200), rejected, expired sau 15 phút (410), hoặc failed với lý do trong code.

Những điều luôn đúng:

  • Chỉ chạy đúng yêu cầu người duyệt đã xem, một lần, dưới tên người đó. Nếu yêu cầu đã lưu không còn khớp, hoặc token bị thu hồi hay mất quyền trong lúc chờ, thao tác thất bại và không có gì chạy.

  • Bí mật được tạo ra — khoá mới, token hay link mời — chỉ hiện một lần cho người duyệt, không bao giờ cho bên gọi.

  • Những gì người duyệt phải tự gõ — tên project hay node để xác nhận xoá, token bot, webhook URL hay mật khẩu mail — không bao giờ nhận từ bên gọi.

  • Mỗi workspace có tối đa 20 yêu cầu đang chờ; quá số đó nhận 429 RATE_LIMITED.

  • failed với APPROVAL_OUTCOME_UNKNOWN nghĩa là đã được duyệt nhưng kết quả chưa được ghi lại. Hãy kiểm tra lại tài nguyên trước khi yêu cầu lại.

Các thao tác#

alert_deliveries#

GọiQuyềnVai tròGhi chú
POST /v1/alert-deliveries/{delivery_id}/replayalerts:writeadmin—

alert_rules#

GọiQuyềnVai tròGhi chú
GET /v1/alert-rulesalerts:readviewerphân trang
POST /v1/alert-rulesalerts:writeadmin—
PUT /v1/alert-rules/{rule_id}/enabledalerts:writeadmin—
DELETE /v1/alert-rules/{rule_id}alerts:writeadminIf-Match

alerts#

GọiQuyềnVai tròGhi chú
GET /v1/alertsalerts:readviewerphân trang

approvals#

GọiQuyềnVai tròGhi chú
GET /v1/approvals/{approval_id}org:readviewer—

audit#

GọiQuyềnVai tròGhi chú
GET /v1/audit-logaudit:readadminphân trang

coverage#

GọiQuyềnVai tròGhi chú
GET /v1/coveragecoverage:readviewer—
PUT /v1/projects/{project_id}/coverage-expectationscoverage:writemember—

deployments#

GọiQuyềnVai tròGhi chú
POST /v1/projects/{project}/deploymentsreleases:writememberdữ liệu node

destinations#

GọiQuyềnVai tròGhi chú
GET /v1/destinationsalerts:readviewerphân trang
POST /v1/destinationsdestinations:manageadmincần duyệt · Idempotency-Key
PATCH /v1/destinations/{destination_id}destinations:manageadmincần duyệt
POST /v1/destinations/{destination_id}/connectiondestinations:manageadmincần duyệt
DELETE /v1/destinations/{destination_id}destinations:manageadmincần duyệt
PUT /v1/destinations/{destination_id}/recipientsdestinations:manageadmincần duyệt
POST /v1/destination-recipients/{recipient_id}/resenddestinations:manageadmin—
POST /v1/destinations/{destination_id}/testnotifications:writeadmin—

events#

GọiQuyềnVai tròGhi chú
GET /v1/issues/{issue_id}/eventsevents:readviewerdữ liệu node · phân trang
GET /v1/issues/{issue_id}/events/{event_id}events:readviewerdữ liệu node

incident_rules#

GọiQuyềnVai tròGhi chú
GET /v1/incident-rulesalerts:readviewer—
POST /v1/incident-rulesalerts:writeadmin—
DELETE /v1/incident-rules/{rule_id}alerts:writeadmin—

incidents#

GọiQuyềnVai tròGhi chú
GET /v1/incidentsincidents:readviewerphân trang
GET /v1/incidents/{incident_id}incidents:readviewer—
POST /v1/incidents/{incident_id}/ackincidents:writemember—
POST /v1/incidents/{incident_id}/resolveincidents:writemember—
POST /v1/incidents/{incident_id}/notesincidents:writemember—
PATCH /v1/incidents/{incident_id}incidents:writemember—

ingest_keys#

GọiQuyềnVai tròGhi chú
POST /v1/projects/{project_id}/ingest-keyskeys:managemembercần duyệt · Idempotency-Key
DELETE /v1/ingest-keys/{key_id}keys:managemembercần duyệt

invites#

GọiQuyềnVai tròGhi chú
POST /v1/invitesmembers:manageadmincần duyệt · Idempotency-Key
DELETE /v1/invites/{invite_id}members:manageadmin—

issues#

GọiQuyềnVai tròGhi chú
GET /v1/issuesissues:readviewerdữ liệu node · phân trang
GET /v1/issues/{issue_id}issues:readviewerdữ liệu node
GET /v1/issues/{issue_id}/statsissues:readviewerdữ liệu node
GET /v1/issues/{issue_id}/tagsissues:readviewerdữ liệu node
GET /v1/issues/{issue_id}/activityissues:readviewerdữ liệu node
GET /v1/issues/{issue_id}/fix-statusreleases:readviewerdữ liệu node
PATCH /v1/issues/{issue_id}issues:writememberdữ liệu node
POST /v1/issues/bulkissues:writememberdữ liệu node

logs#

GọiQuyềnVai tròGhi chú
GET /v1/logslogs:readviewerdữ liệu node · start/end · phân trang
GET /v1/logs/histogramlogs:readviewerdữ liệu node · start/end
GET /v1/logs/facetslogs:readviewerdữ liệu node · start/end
GET /v1/logs/{log_id}/aroundlogs:readviewerdữ liệu node

maintenance#

GọiQuyềnVai tròGhi chú
GET /v1/maintenance-windowsmonitors:readviewerphân trang
POST /v1/maintenance-windowsmonitors:writememberIdempotency-Key
PATCH /v1/maintenance-windows/{window_id}monitors:writemember—
DELETE /v1/maintenance-windows/{window_id}monitors:writemember—

members#

GọiQuyềnVai tròGhi chú
GET /v1/membersmembers:readviewerphân trang
PATCH /v1/members/{user_id}members:manageadmincần duyệt
DELETE /v1/members/{user_id}members:manageadmincần duyệt

metrics#

GọiQuyềnVai tròGhi chú
GET /v1/metrics/namesmetrics:readviewerdữ liệu node
GET /v1/metrics/seriesmetrics:readviewerdữ liệu node · phân trang
GET /v1/metrics/querymetrics:readviewerdữ liệu node · start/end

monitors#

GọiQuyềnVai tròGhi chú
GET /v1/monitorsmonitors:readviewerphân trang
GET /v1/monitors/{monitor_id}monitors:readviewer—
POST /v1/monitorsmonitors:writememberIdempotency-Key
PATCH /v1/monitors/{monitor_id}monitors:writememberIf-Match
DELETE /v1/monitors/{monitor_id}monitors:writememberIf-Match
PUT /v1/monitors/{monitor_id}/pausemonitors:writemember—
PUT /v1/monitors/{monitor_id}/mutemonitors:writemember—
DELETE /v1/monitor-discoveries/{discovery_id}monitors:writemember—
GET /v1/monitors/{monitor_id}/signalmonitors:readviewerdữ liệu node
GET /v1/monitors/{monitor_id}/occurrencesmonitors:readviewerdữ liệu node · phân trang
POST /v1/monitors/backtestmonitors:readviewerdữ liệu node

node#

GọiQuyềnVai tròGhi chú
GET /v1/nodeorg:readviewer—
POST /v1/nodenode:operateadmincần duyệt · Idempotency-Key
POST /v1/node/jobs/{job_id}/retrynode:operateadmin—
POST /v1/node/{node_id}/resizenode:operateadmincần duyệt
POST /v1/node/{node_id}/upgradenode:operateadmin—
DELETE /v1/node/{node_id}node:operateadmincần duyệt
POST /v1/node/{node_id}/restorenode:operateadmin—
POST /v1/node/backupsnode:operateadmin—
PUT /v1/node/backup-custodynode:operateadmincần duyệt
POST /v1/node/{node_id}/rebuildnode:operateadmincần duyệt · Idempotency-Key
POST /v1/node/jobs/{job_id}/recovery-kitnode:operateadmincần duyệt

notification_policies#

GọiQuyềnVai tròGhi chú
GET /v1/notification-policiesalerts:readviewer—
POST /v1/notification-policiesalerts:writeadmin—
DELETE /v1/notification-policies/{policy_id}alerts:writeadmin—

occurrences#

GọiQuyềnVai tròGhi chú
POST /v1/occurrencesmonitors:writememberdữ liệu node
DELETE /v1/occurrences/{monitor_slug}/{occurrence_id}monitors:writememberdữ liệu node

ping_tokens#

GọiQuyềnVai tròGhi chú
POST /v1/monitors/{monitor_id}/ping-tokens/rotatekeys:managemembercần duyệt
POST /v1/monitors/{monitor_id}/ping-tokens/revoke-previouskeys:managemembercần duyệt
POST /v1/monitors/{monitor_id}/ping-tokens/resetkeys:managemembercần duyệt

privacy#

GọiQuyềnVai tròGhi chú
GET /v1/projects/{project_id}/privacyprojects:readviewer—
PUT /v1/projects/{project_id}/privacyprivacy:writeadmincần duyệt

project_keys#

GọiQuyềnVai tròGhi chú
POST /v1/projects/{project_id}/keyskeys:managemembercần duyệt · Idempotency-Key
POST /v1/keys/{key_id}/rotatekeys:managemembercần duyệt
DELETE /v1/keys/{key_id}keys:managemembercần duyệt

projects#

GọiQuyềnVai tròGhi chú
GET /v1/projectsprojects:readviewerphân trang
GET /v1/projects/{project_id}projects:readviewer—
POST /v1/projectsprojects:writememberIdempotency-Key
PATCH /v1/projects/{project_id}projects:writememberIf-Match
PATCH /v1/projects/{project_id}/intakeprojects:writememberIf-Match
PATCH /v1/projects/{project_id}/observabilityprojects:writememberIf-Match
PUT /v1/projects/{project_id}/scrub/{group}privacy:writeadmincần duyệt
PUT /v1/projects/{project_id}/checkin-authkeys:managemembercần duyệt
PUT /v1/projects/{project_id}/environments/{name}/hiddenprojects:writemember—
DELETE /v1/projects/{project_id}projects:deleteadmincần duyệt
POST /v1/projects/{project_id}/restoreprojects:writemember—
POST /v1/projects/{project_id}/test-eventprojects:writemember—

releases#

GọiQuyềnVai tròGhi chú
GET /v1/projects/{project}/releasesreleases:readviewerdữ liệu node
GET /v1/projects/{project}/releases/{version}/healthreleases:readviewerdữ liệu node

service_principals#

GọiQuyềnVai tròGhi chú
POST /v1/service-accountstokens:manageadmincần duyệt · Idempotency-Key
PATCH /v1/service-accounts/{id}tokens:manageadmincần duyệt

slos#

GọiQuyềnVai tròGhi chú
GET /v1/slosmonitors:readviewerphân trang
GET /v1/slos/{slo_id}monitors:readviewer—
POST /v1/slosmonitors:writememberIdempotency-Key
PATCH /v1/slos/{slo_id}monitors:writememberIf-Match
DELETE /v1/slos/{slo_id}monitors:writememberIf-Match
PUT /v1/slos/{slo_id}/holdmonitors:writemember—
POST /v1/slos/importmonitors:writemember—

spans#

GọiQuyềnVai tròGhi chú
GET /v1/spanstraces:readviewerdữ liệu node · start/end · phân trang
GET /v1/spans/histogramtraces:readviewerdữ liệu node · start/end

telemetry#

GọiQuyềnVai tròGhi chú
GET /v1/telemetry/usageusage:readviewerdữ liệu node

tickets#

GọiQuyềnVai tròGhi chú
POST /v1/ticketsissues:readviewerdữ liệu node

tokens#

GọiQuyềnVai tròGhi chú
POST /v1/tokenstokens:manageadmincần duyệt · Idempotency-Key
POST /v1/service-accounts/{service_principal_id}/tokenstokens:manageadmincần duyệt · Idempotency-Key
DELETE /v1/tokens/{id}tokens:manageadmin—
PUT /v1/token-policytokens:manageadmincần duyệt

traces#

GọiQuyềnVai tròGhi chú
GET /v1/traces/{trace_id}traces:readviewerdữ liệu node
GET /v1/traces/{trace_id}/spanstraces:readviewerdữ liệu node
GET /v1/traces/{trace_id}/spans/{span_id}traces:readviewerdữ liệu node

upload_tokens#

GọiQuyềnVai tròGhi chú
POST /v1/projects/{project_id}/upload-tokenskeys:managemembercần duyệt · Idempotency-Key
DELETE /v1/upload-tokens/{token_id}keys:managemembercần duyệt

uptime#

GọiQuyềnVai tròGhi chú
GET /v1/uptime-checksmonitors:readviewerphân trang
GET /v1/uptime-checks/{check_id}monitors:readviewer—
POST /v1/uptime-checksmonitors:writememberIdempotency-Key
PATCH /v1/uptime-checks/{check_id}monitors:writememberIf-Match
DELETE /v1/uptime-checks/{check_id}monitors:writememberIf-Match
PUT /v1/uptime-checks/{check_id}/holdmonitors:writemember—
POST /v1/uptime-checks/{check_id}/runsmonitors:writemember—

usage#

GọiQuyềnVai tròGhi chú
GET /v1/usageusage:readviewer—

workspace#

GọiQuyềnVai tròGhi chú
GET /v1/workspaceorg:readviewer—

Thấy chỗ sai hoặc thiếu? Gửi cho chúng tôi: hello@belvador.dev