Theo dõi thay đổi trang web API

Theo dõi một trang web hoặc một phần của trang (CSS selector) và nhận e-mail hay webhook kèm diff khi nội dung thay đổi.

GETPOSTPATCHDELETEhttps://apibox.io.vn/v1/page-watch

POST /v1/page-watch với url để tạo watcher: trang được tải ngay để lấy bản gốc, sau đó định kỳ mỗi interval_minutes. Bạn chọn phần được so sánh: selector CSS tuỳ chọn (lấy mọi phần tử khớp), mode text (chữ hiển thị, giữ xuống dòng, bỏ script và style), html (mã HTML, mỗi thẻ một dòng) hoặc regex (chỉ phần do pattern trích ra, ví dụ giá). Loại bỏ phần hay thay đổi trước khi so sánh bằng ignore (tối đa 20 biểu thức chính quy) và ignore_presets (dates, times, numbers, có cả dạng tiếng Việt như “ngày 11 tháng 11”, “5 phút trước”). Nội dung đã chuẩn hoá (tối đa 200 KB) được lưu nén cùng mã SHA-256.

Khi mã băm thay đổi, một sự kiện change kèm diff dạng unified (cắt còn 4 KB; giữ 20 sự kiện gần nhất) được lưu lại và gửi tới webhook_url ({"event": "page.changed", "watcher", "added", "removed", "diff", "hash", "previous_hash"}) cùng e-mail đã xác minh của tài khoản (tối đa một e-mail mỗi giờ cho mỗi watcher, có giới hạn theo ngày). Ba lần kiểm tra lỗi liên tiếp tạo một cảnh báo page.error. Website trả về 429 / 503 sẽ được để yên theo Retry-After (hoặc gấp đôi chu kỳ); robots.txt được kiểm tra khi tạo và hằng tuần, bot của chúng tôi tự giới thiệu là APIBoxBot.

GET /v1/page-watch liệt kê các watcher, /{id} xem một watcher kèm sự kiện (include_snapshot=true để lấy cả nội dung đã lưu), PATCH để sửa (URL hoặc quy tắc mới sẽ lấy lại bản gốc), DELETE để xoá, /{id}/events trả về lịch sử và POST /{id}/check chạy thử mà không thay đổi gì. dry_run=true xem trước nội dung đã chuẩn hoá mà không cần tài khoản. Theo gói: Free 3 watcher, chu kỳ từ 60 phút; Starter 20, từ 30 phút; Pro 100, từ 15 phút.

Tham số

TênVị tríKiểuBắt buộcMặc định
urlbodystringcóTrang công khai cần theo dõi (bắt buộc khi tạo).
namebodystringkhôngTên hiển thị (tối đa 100 ký tự).
selectorbodystringkhôngCSS selector của phần cần theo dõi (mọi phần tử khớp); để trống = cả trang.
modebodystringkhôngtexttext, html hoặc regex.
patternbodystringkhôngmode regex: phần cần trích (nhóm 1 nếu có), cho phép cú pháp /…/i, tối đa 200 ký tự.
ignorebodyarraykhôngBiểu thức chính quy bị loại bỏ trước khi so sánh (mảng hoặc mỗi dòng một mẫu, tối đa 20).
ignore_presetsbodystringkhôngDanh sách cách nhau bởi dấu phẩy: dates, times, numbers.
interval_minutesbodynumberkhôngChu kỳ kiểm tra: từ mức tối thiểu của gói (Free 60, Starter 30, Pro 15) đến 10080. Mặc định: max(mức tối thiểu, 60).
alert_emailbodybooleankhôngtrueGửi e-mail tới địa chỉ đã xác minh của tài khoản khi có thay đổi.
webhook_urlbodystringkhôngURL nhận request POST JSON (page.changed / page.error); để trống để gỡ.
pausedbodybooleankhôngfalseTạm dừng hoặc tiếp tục kiểm tra.
dry_runbodybooleankhôngfalseChỉ tải và trả về nội dung đã chuẩn hoá (không cần tài khoản, không lưu gì).
idpathstringkhông/v1/page-watch/{id} (GET, PATCH, POST, DELETE), /{id}/events, /{id}/check (POST: chạy thử).
include_snapshotquerybooleankhôngfalseGET /{id}: trả về cả nội dung đã lưu.

Ví dụ

curl -X POST "https://apibox.io.vn/v1/page-watch" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"url":"https://example.edu.vn/tuyen-sinh","name":"Tuyển sinh","selector":".news","ignore_presets":"dates","interval_minutes":60,"webhook_url":"https://example.com/hooks/page"}'

Kết quả trả về

{
  "id": "pw_ubts7ip9hp6nsep1qj1d",
  "name": "Tuyển sinh",
  "url": "https://example.edu.vn/tuyen-sinh",
  "selector": ".news",
  "mode": "text",
  "pattern": null,
  "ignore": [],
  "ignore_presets": [
    "dates"
  ],
  "interval_minutes": 60,
  "alert_email": true,
  "webhook_url": "https://example.com/hooks/page",
  "paused": false,
  "status": "ok",
  "last_check": {
    "at": "2026-11-11T03:20:00.000Z",
    "error": null
  },
  "last_change_at": null,
  "changes_total": 0,
  "checks_total": 1,
  "snapshot": {
    "sha256": "1d6fb694b0d75af3154ba70809eeb475aa4c1ff4a50a170581797e7028520d3d",
    "bytes": 92
  },
  "next_check_at": "2026-11-11T04:20:00.000Z",
  "created_at": "2026-11-11T03:20:00.000Z",
  "first_check": {
    "status_code": 200,
    "selector_matches": 1,
    "lines": 3,
    "truncated": false,
    "preview": "Thông báo tuyển sinh\nĐề án tuyển sinh năm 2027\nLịch thi đánh giá năng lực"
  }
}

Ứng dụng

  • Nhận thông báo khi trường, bộ, sở đăng thông báo mới
  • Theo dõi trang mời thầu, tuyển dụng, văn bản mới mà không phải vào xem thủ công
  • Theo dõi điều khoản dịch vụ hoặc bảng giá của đối tác
  • Đẩy thay đổi sang Slack, Telegram hoặc hệ thống riêng qua webhook

Hỏi đáp

Làm sao tránh cảnh báo vì bộ đếm lượt xem, ngày giờ?

Dùng CSS selector cho đúng phần cần theo dõi, thêm ignore_presets=dates,times,numbers hoặc mẫu ignore riêng, và kiểm tra trước bằng dry_run=true.

Có theo dõi được trang cần đăng nhập không?

Không. Chỉ tải trang công khai, không gửi cookie, và từ chối URL mà robots.txt không cho bot của chúng tôi truy cập.

Việc kiểm tra định kỳ có trừ quota không?

Không. Tạo, sửa, chạy thử và xem trước tính một request mỗi lần; các lệnh đọc GET miễn phí.

API liên quan

Bắt đầu với 1.000 request miễn phí mỗi tháng. Nhận API key miễn phí →