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.
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ên | Vị trí | Kiểu | Bắt buộc | Mặc định | |
|---|---|---|---|---|---|
url | body | string | có | Trang công khai cần theo dõi (bắt buộc khi tạo). | |
name | body | string | không | Tên hiển thị (tối đa 100 ký tự). | |
selector | body | string | không | CSS selector của phần cần theo dõi (mọi phần tử khớp); để trống = cả trang. | |
mode | body | string | không | text | text, html hoặc regex. |
pattern | body | string | không | mode 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ự. | |
ignore | body | array | không | Biể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_presets | body | string | không | Danh sách cách nhau bởi dấu phẩy: dates, times, numbers. | |
interval_minutes | body | number | không | Chu 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_email | body | boolean | không | true | Gửi e-mail tới địa chỉ đã xác minh của tài khoản khi có thay đổi. |
webhook_url | body | string | không | URL nhận request POST JSON (page.changed / page.error); để trống để gỡ. | |
paused | body | boolean | không | false | Tạm dừng hoặc tiếp tục kiểm tra. |
dry_run | body | boolean | không | false | Chỉ tải và trả về nội dung đã chuẩn hoá (không cần tài khoản, không lưu gì). |
id | path | string | không | /v1/page-watch/{id} (GET, PATCH, POST, DELETE), /{id}/events, /{id}/check (POST: chạy thử). | |
include_snapshot | query | boolean | không | false | GET /{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"}'const res = await fetch('https://apibox.io.vn/v1/page-watch', {
method: 'POST',
headers: {
Authorization: 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json',
},
body: JSON.stringify({
"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"
}),
});
const data = await res.json();
console.log(data);import requests
res = requests.post(
"https://apibox.io.vn/v1/page-watch",
headers={"Authorization": "Bearer YOUR_API_KEY"},
json={"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"},
timeout=30,
)
print(res.json())<?php
$ch = curl_init('https://apibox.io.vn/v1/page-watch');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_HTTPHEADER => ['Authorization: Bearer YOUR_API_KEY', 'Content-Type: application/json'],
CURLOPT_POSTFIELDS => '{"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"}',
]);
$response = curl_exec($ch);
print_r(json_decode($response, true));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
Webhook Tester
Tạo một URL riêng ghi lại mọi request HTTP gửi tới nó – method, header, query, body – rồi xem trực tiếp trên trình duyệt hoặc qua API.
👤Dữ liệu giả tiếng Việt
Dữ liệu test tiếng Việt như thật: họ tên, địa chỉ theo bản đồ hành chính 2025, số di động theo nhà mạng, CCCD và MST đúng cấu trúc, công ty, tài khoản ngân hàng.
{?}Dữ liệu mẫu từ JSON Schema
Sinh JSON mẫu như thật từ JSON Schema (kiểu, format, enum, pattern, khoảng giá trị, $ref, oneOf / allOf), có kiểm tra lại theo schema.