Tài liệu API

Mọi thứ làm được trên giao diện đều gọi được bằng API. Mọi ví dụ dưới đây chạy được ngay bằng cách dán vào terminal.

Tổng quan

Địa chỉ gốchttps://apitoolhub.tiengvang.com/api/v1
Định dạngJSON cho cả request và response; Content-Type: application/json
Mã hoáUTF-8. Chỉ nhận HTTPS.
Múi giờMọi mốc thời gian trả về theo chuẩn RFC 3339 (UTC).

Một số công cụ chạy được không cần tài khoản. Hãy thử ngay câu lệnh sau trước khi đọc tiếp:

curl -s https://apitoolhub.tiengvang.com/api/v1/tools/dns.checker/exec \
  -H 'Content-Type: application/json' \
  -d '{"domain":"example.com"}'

Xác thực

Hai cách, dùng cách nào cũng được:

1. Bearer token (dành cho ứng dụng có người đăng nhập)

# Đăng nhập → nhận access_token (hạn 15 phút) và refresh_token
curl -s -X POST https://apitoolhub.tiengvang.com/api/v1/auth/login \
  -H 'Content-Type: application/json' \
  -d '{"email":"ban@example.com","password":"mat-khau"}'

# Tài khoản bật xác thực hai bước thì gửi kèm mã 6 số:
#   {"email":"…","password":"…","code":"123456"}
# Chưa gửi mã sẽ nhận 401 kèm error = "mfa_required".

# Hết hạn thì làm mới, KHÔNG cần đăng nhập lại:
curl -s -X POST https://apitoolhub.tiengvang.com/api/v1/auth/refresh \
  -H 'Content-Type: application/json' \
  -d '{"refresh_token":"…"}'

Gửi kèm mọi request: Authorization: Bearer <access_token>

2. API key (dành cho máy chủ, script, cron)

Tạo trong ứng dụng tại Gói, tài khoản & API. Cần gói có quyền api_access (từ Plus trở lên).

curl -s https://apitoolhub.tiengvang.com/api/v1/tools/dns.checker/exec \
  -H 'X-API-Key: pat_abc123.secret…' \
  -H 'Content-Type: application/json' \
  -d '{"domain":"example.com"}'

Quyền của key luôn nhỏ hơn hoặc bằng quyền của bạn. Khi cấp key, phạm vi được cắt theo quyền thật của tài khoản tại thời điểm gọi — nâng phạm vi trong yêu cầu tạo key không làm key mạnh hơn chủ của nó. Secret chỉ hiện một lần; hệ thống lưu dạng băm.

Hạn mức theo gói

Hạn mức là dữ liệu động, đọc số hiện hành bằng GET /plans hoặc GET /me/entitlements.

GóiLượt/ngày mỗi công cụLượt/phútBulkTác vụ nềnAPI key
Vãng lai10101Không
Free10030101Không
Plus5001201003
Pro5.0006001.00010
EnterpriseKhông giới hạnKhông giới hạnKhông giới hạnKhông giới hạn

Mỗi công cụ có một gói tối thiểu riêng (min_plan). Gọi công cụ ngoài gói trả về 403 plan_required kèm gói cần có.

Danh mục công cụ

GET /tools — danh sách công cụ đang bật, kèm min_planmode.

curl -s https://apitoolhub.tiengvang.com/api/v1/tools | head -40

GET /tools/{toolId} — chi tiết một công cụ.

Trường mode quyết định cách chạy: sync dùng /exec, async dùng /run.

Chạy nhanh — công cụ sync

POST /tools/{toolId}/exec — trả kết quả ngay trong response.

curl -s -X POST https://apitoolhub.tiengvang.com/api/v1/tools/ssl.expiry/exec \
  -H 'Content-Type: application/json' \
  -d '{"host":"example.com"}'
{
  "tool": "ssl.expiry",
  "output": { "host": "example.com", "con_lai_ngay": 85, "muc_do": "tot", "ket_luan": "Còn 85 ngày, chưa cần lo." },
  "elapsed_ms": 96
}

Gửi header Idempotency-Key nếu muốn gọi lại an toàn khi mất mạng giữa chừng — lần gọi lại cùng khoá trả đúng kết quả cũ, không tính thêm lượt.

Chạy nền — công cụ async

Việc nặng (ví dụ tra WHOIS hàng loạt) trả về mã tác vụ, chạy nền, lấy kết quả sau.

# 1. Tạo tác vụ → 202
curl -s -X POST https://apitoolhub.tiengvang.com/api/v1/tools/domain.bulk/run \
  -H "Authorization: Bearer $TOKEN" -H 'Content-Type: application/json' \
  -d '{"domains":"example.com\nexample.net\nexample.org"}'
# → {"job_id":"a6d7…","status":"queued"}

# 2. Theo dõi trạng thái
curl -s https://apitoolhub.tiengvang.com/api/v1/jobs/a6d7… -H "Authorization: Bearer $TOKEN"
# → {"status":"running","progress":66}

# 3. Lấy kết quả khi status = done
curl -s https://apitoolhub.tiengvang.com/api/v1/jobs/a6d7…/result -H "Authorization: Bearer $TOKEN"

Theo dõi tiến trình thời gian thực (SSE)

Trình duyệt không gửi được header xác thực trên EventSource, nên xin một vé ngắn hạn trước:

curl -s -X POST https://apitoolhub.tiengvang.com/api/v1/jobs/{jobId}/sse-ticket \
  -H "Authorization: Bearer $TOKEN"
# → {"ticket":"…","expires_in":120}
const es = new EventSource(BASE + '/jobs/' + jobId + '/events?ticket=' + ticket);
es.onmessage = e => console.log(JSON.parse(e.data).progress);

Vé sống 120 giây và chỉ mở đúng tác vụ đã xin — không dùng được cho tác vụ khác.

Kết quả tác vụ được giữ 30 ngày rồi dọn. Cần lưu lâu hơn thì tải về phía bạn.

Thông tin tài khoản & hạn mức

EndpointViệc
GET /meHồ sơ, gói, vai trò, trạng thái 2FA
GET /me/quotaĐã dùng bao nhiêu lượt hôm nay
GET /me/entitlementsGói mở khoá gì, công cụ nào được phép/bị khoá
GET /me/activityLịch sử lượt chạy
GET /me/usage-seriesSố lượt theo ngày (vẽ biểu đồ)
POST /me/passwordĐổi mật khẩu (đăng xuất mọi thiết bị khác)
POST /me/mfa/setup · /enable · /disableBật/tắt xác thực hai bước
GET /me/pins · POST /me/pins/{toolId}Ghim công cụ hay dùng

Quản lý API key

GET /me/api-keysDanh sách key (không bao giờ trả lại secret)
POST /me/api-keysCấp key mới — secret hiện một lần duy nhất
DELETE /me/api-keys/{keyId}Thu hồi ngay lập tức

Mã lỗi

HTTPerrorÝ nghĩa và cách xử lý
400invalid_inputDữ liệu nhập sai — trường detail nói rõ sai chỗ nào
401invalid_tokenToken sai/hết hạn → gọi /auth/refresh
401mfa_requiredTài khoản bật 2FA → gửi lại kèm code
403plan_requiredCông cụ ngoài gói; xem min_plan trong response
403tool_disabledQuản trị viên đang tắt công cụ này
404tool_not_foundSai mã công cụ — đối chiếu với GET /tools
429rate_limitedVượt số lượt mỗi phút của gói — chờ rồi thử lại
429quota_exceededHết lượt trong ngày; daily_limit cho biết mức của gói
502tool_errorLỗi khi công cụ gọi ra ngoài (máy chủ đích không phản hồi…)

Lỗi luôn có dạng {"error":"…","detail":"…"}; detail viết bằng tiếng Việt, đưa thẳng cho người dùng cuối được.

Giới hạn kỹ thuật