Tìm kiếm web (Keenable)
Tìm trên internet và đọc trang web ngay từ mã nguồn của bạn — bằng chính chiếc khoá bạn dùng cho các mô hình. Có hai cách gọi: như một mô hình thông thường qua /v1/chat/completions, hoặc qua các endpoint riêng trả về JSON thuần.
Giá bao nhiêu
0,005 $ mỗi yêu cầu — tức là 5 $ cho 1000 yêu cầu.
Giá tính theo lượt gọi: một lượt gọi là một yêu cầu, bất kể trả về bao nhiêu kết quả. Tìm được 50 nguồn cũng bằng giá tìm được một nguồn.
Yêu cầu thất bại không bị tính tiền — dù là lỗi của tìm kiếm hay tham số sai.
| việc gì | tính là |
|---|---|
| tìm kiếm trả về 1 kết quả | 1 yêu cầu |
| tìm kiếm trả về 50 kết quả | 1 yêu cầu |
| đọc một trang | 1 yêu cầu |
| lỗi bất kỳ loại nào | 0 |
Cách 1 — như một mô hình
Chạy được trong Cursor, Claude Code, OpenCode và bất kỳ client OpenAI nào mà không cần sửa gì: chỉ cần chọn mô hình.
Các mô hình:
| mô hình | làm gì |
|---|---|
keenable/search | tìm trên internet, trả về danh sách nguồn kèm đoạn trích |
keenable/read | đọc một trang và trả về nội dung dưới dạng markdown |
Tìm kiếm
curl https://nordrouter.com/v1/chat/completions \
-H "Authorization: Bearer $NORDROUTER_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "keenable/search",
"messages": [{"role": "user", "content": "giá bitcoin hôm nay"}]
}'Bạn sẽ nhận được một tin nhắn trợ lý bình thường với danh sách nguồn: tiêu đề, ngày đăng, địa chỉ đầy đủ và một đoạn trích cho mỗi nguồn.
Đọc một trang
Từ đầu tiên trong tin nhắn là địa chỉ. Sau đó bạn có thể thêm điều bạn quan tâm cụ thể trên trang ấy.
curl https://nordrouter.com/v1/chat/completions \
-H "Authorization: Bearer $NORDROUTER_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "keenable/read",
"messages": [{"role": "user", "content": "https://vi.wikipedia.org/wiki/Tokyo dân số"}]
}'Không có phần chỉ dẫn, bạn nhận cả trang dưới dạng markdown. Có chỉ dẫn thì chỉ nhận đúng phần bạn hỏi: nhanh hơn và rẻ hơn đáng kể về token ở phía bạn khi kết quả được đưa tiếp vào một mô hình.
Phần chỉ dẫn để làm gì
Một bài Wikipedia dài hàng chục nghìn ký tự. Nếu bạn chỉ cần một con số, phần chỉ dẫn tiết kiệm cả thời gian lẫn token của bước tiếp theo.
Python
from openai import OpenAI
client = OpenAI(
api_key="khoá-của-bạn",
base_url="https://nordrouter.com/v1",
)
found = client.chat.completions.create(
model="keenable/search",
messages=[{"role": "user", "content": "tin tức AI tuần này"}],
)
print(found.choices[0].message.content)Cách 2 — endpoint riêng
Nếu bạn cần kết quả có trường, ngày tháng và bộ lọc thay vì văn xuôi, hãy dùng JSON.
POST /v1/search
curl https://nordrouter.com/v1/search \
-H "Authorization: Bearer $NORDROUTER_KEY" \
-H "Content-Type: application/json" \
-d '{
"query": "tin tức mạng nơ-ron",
"max_results": 5,
"published_after": "7d"
}'Tham số:
| tham số | kiểu | mặc định | làm gì |
|---|---|---|---|
query | chuỗi | bắt buộc | tìm gì |
site | chuỗi | — | chỉ tìm trong tên miền này, ví dụ vnexpress.net |
max_results | số | 10 | bao nhiêu kết quả, từ 1 đến 50 |
snippet_max_chars | số | — | độ dài đoạn trích, từ 180 đến 10 000 ký tự |
published_after | chuỗi | — | tài liệu đăng sau thời điểm này |
published_before | chuỗi | — | đăng trước đó |
acquired_after | chuỗi | — | vào chỉ mục sau đó |
acquired_before | chuỗi | — | vào chỉ mục trước đó |
query_time | chuỗi | — | tìm trong chỉ mục ở đúng trạng thái tại thời điểm ấy |
Ngày tháng nhận ba dạng: 2026-08-01, dấu thời gian ISO 8601 đầy đủ, hoặc tương đối — 30min, 12h, 7d, 3mo, 1y.
Ngày đăng và ngày vào chỉ mục không giống nhau
published_* lọc theo ngày của chính tài liệu, còn acquired_* theo ngày trang được đưa vào chỉ mục. Khác biệt này quan trọng: một trang có thể được viết lại mà không đụng đến ngày đăng. Nếu bạn muốn biết «có gì mới xuất hiện trên mạng trong một ngày», hãy dùng acquired_after.
Phản hồi:
{
"query": "tin tức mạng nơ-ron",
"count": 5,
"results": [
{
"title": "Tiêu đề bài viết",
"url": "https://example.com/article",
"description": "Mô tả ngắn",
"snippet": "Một đoạn trích từ nội dung trang…",
"published_at": "2026-08-25T10:30:00Z",
"acquired_at": "2026-08-25T11:02:00Z"
}
]
}GET /v1/fetch
curl -G https://nordrouter.com/v1/fetch \
-H "Authorization: Bearer $NORDROUTER_KEY" \
--data-urlencode "url=https://example.com/article" \
--data-urlencode "prompt=lấy bảng giá"Tham số:
| tham số | kiểu | mặc định | làm gì |
|---|---|---|---|
url | chuỗi | bắt buộc | địa chỉ trang |
max_chars | số | 50 000 | trả về bao nhiêu ký tự |
prompt | chuỗi | — | cần lấy chính xác điều gì, tối đa 2000 ký tự |
live | true / false | false | lấy thẳng từ trang thay vì từ chỉ mục |
Phản hồi:
{
"url": "https://example.com/article",
"title": "Tiêu đề",
"description": "Mô tả",
"author": "Tác giả",
"content": "# Nội dung trang dưới dạng markdown…",
"published_at": 1787777084
}Khi nào cần live
Lấy từ chỉ mục thì nhanh hơn, nhưng chỉ mục không chứa mọi thứ. Nếu trang mới hoặc chặn trình thu thập, hãy đặt live=true — khi ấy trang được đọc thẳng từ website. Giá vẫn như cũ.
Giới hạn
| tốc độ | 2 yêu cầu mỗi giây trên mỗi khoá |
| độ dài đoạn trích | từ 180 đến 10 000 ký tự |
| kết quả mỗi lượt gọi | tối đa 50 |
| độ dài chỉ dẫn khi đọc | tối đa 2000 ký tự |
Vượt tốc độ sẽ nhận 429 kèm header Retry-After — hãy thử lại sau một giây.
Lỗi
| mã | nghĩa là gì | cần làm gì |
|---|---|---|
400 | thiếu query hoặc url, hoặc địa chỉ không có http:// | sửa lại yêu cầu |
401 | khoá không được chấp nhận | kiểm tra Authorization |
402 | hết số dư | nạp thêm trong bảng điều khiển |
429 | quá dày | thử lại sau một giây |
502 | tìm kiếm không phản hồi | thử lại; không bị tính tiền |
503 | tìm kiếm tạm thời không khả dụng | chúng tôi đang xử lý; không bị tính tiền |
Câu hỏi thường gặp
Kết quả rỗng có bị tính tiền không? Có, nếu tìm kiếm đã chạy và trả lời trung thực «không tìm thấy gì» — công việc đã được làm. Chỉ lỗi mới miễn phí.
Có thể stream không? Không, và cũng không cần: kết quả về một lần trong tích tắc.
Token có được đếm không? Giá tính theo lượt gọi, token không ảnh hưởng. Chúng vẫn hiện trong phản hồi của mô hình để các thư viện client không coi đó là phản hồi rỗng.
Khác gì so với các mô hình search/…? Những mô hình ấy tìm trước rồi mới trả lời bằng một mô hình ngôn ngữ — bạn trả tiền cho hai công việc. Ở đây bạn nhận kết quả thô và tự quyết định làm gì với chúng.