網頁搜尋 (Keenable)
直接在你的程式碼裡搜尋網際網路、讀取網頁——用的還是呼叫模型的那把金鑰。有兩種方式:透過 /v1/chat/completions 當成一般模型呼叫,或是使用回傳純 JSON 的專用端點。
價格
每次請求 0.005 美元,也就是每 1000 次請求 5 美元。
按呼叫計費:一次呼叫就是一次請求,不論回傳多少筆結果。找到 50 個來源與找到 1 個來源,價格完全相同。
請求失敗不計費——無論是搜尋本身出錯,還是參數寫錯。
| 情況 | 計為 |
|---|---|
| 回傳 1 筆結果的搜尋 | 1 次請求 |
| 回傳 50 筆結果的搜尋 | 1 次請求 |
| 讀取一個網頁 | 1 次請求 |
| 任何類型的錯誤 | 0 |
方式一 —— 當成模型
在 Cursor、Claude Code、OpenCode 以及任何 OpenAI 用戶端裡都能直接使用,不需要改動任何設定:選擇模型即可。
模型:
| 模型 | 作用 |
|---|---|
keenable/search | 搜尋網際網路,回傳附摘錄的來源清單 |
keenable/read | 讀取網頁,以 markdown 回傳內文 |
搜尋
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": "今天比特幣價格"}]
}'回傳的是一則一般的助理訊息,裡面是來源清單:標題、發布日期、完整網址,以及每筆來源的摘錄。
讀取網頁
訊息的第一個詞是網址。之後可以補上你在這個頁面上具體關心什麼。
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://zh.wikipedia.org/wiki/東京 人口數量"}]
}'不加說明時回傳整頁 markdown。加了說明就只回傳你要的部分:當結果還要送進模型時,這樣更快,你這邊的 token 開銷也明顯更低。
說明有什麼用
一篇維基百科條目有數萬個字元。如果你只需要一個數字,這句說明既省時間,也省下一步的 token。
Python
from openai import OpenAI
client = OpenAI(
api_key="你的金鑰",
base_url="https://nordrouter.com/v1",
)
found = client.chat.completions.create(
model="keenable/search",
messages=[{"role": "user", "content": "本週人工智慧新聞"}],
)
print(found.choices[0].message.content)方式二 —— 專用端點
如果你需要帶欄位、日期與篩選條件的結果,而不是一段文字,就使用 JSON。
POST /v1/search
curl https://nordrouter.com/v1/search \
-H "Authorization: Bearer $NORDROUTER_KEY" \
-H "Content-Type: application/json" \
-d '{
"query": "神經網路新聞",
"max_results": 5,
"published_after": "7d"
}'參數:
| 參數 | 型別 | 預設值 | 作用 |
|---|---|---|---|
query | 字串 | 必填 | 搜尋什麼 |
site | 字串 | — | 只在該網域內搜尋,例如 ithome.com.tw |
max_results | 數字 | 10 | 回傳多少筆結果,1 到 50 |
snippet_max_chars | 數字 | — | 摘錄長度,180 到 10000 個字元 |
published_after | 字串 | — | 在此時刻之後發布的內容 |
published_before | 字串 | — | 在此之前發布的 |
acquired_after | 字串 | — | 在此之後進入索引的 |
acquired_before | 字串 | — | 在此之前進入索引的 |
query_time | 字串 | — | 依索引在該時刻的狀態搜尋 |
日期接受三種寫法:2026-08-01、完整的 ISO 8601 時間戳記,或相對寫法——30min、12h、7d、3mo、1y。
發布時間與入庫時間不是同一回事
published_* 依內容本身的發布日期篩選,acquired_* 依頁面進入索引的日期篩選。這個差別很重要:頁面可能被改寫過,而發布日期沒有變動。如果你想知道「一天之內網路上新出現了什麼」,請用 acquired_after。
回應:
{
"query": "神經網路新聞",
"count": 5,
"results": [
{
"title": "文章標題",
"url": "https://example.com/article",
"description": "簡短描述",
"snippet": "頁面內文的一段摘錄…",
"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=擷取價格表"參數:
| 參數 | 型別 | 預設值 | 作用 |
|---|---|---|---|
url | 字串 | 必填 | 頁面網址 |
max_chars | 數字 | 50000 | 回傳多少個字元 |
prompt | 字串 | — | 具體要擷取什麼,最多 2000 個字元 |
live | true / false | false | 直接從網站抓取,而非走索引 |
回應:
{
"url": "https://example.com/article",
"title": "標題",
"description": "描述",
"author": "作者",
"content": "# 頁面內文,markdown 格式…",
"published_at": 1787777084
}什麼時候需要 live
走索引比較快,但索引裡並非什麼都有。如果頁面很新,或對爬蟲關閉,就設定 live=true——這樣會直接從網站讀取。價格相同。
限制
| 頻率 | 每把金鑰每秒 2 次請求 |
| 摘錄長度 | 180 到 10000 個字元 |
| 每次呼叫的結果數 | 最多 50 筆 |
| 讀取時說明的長度 | 最多 2000 個字元 |
超出頻率會回傳 429,並附上 Retry-After 標頭——請隔一秒後重試。
錯誤
| 狀態碼 | 含意 | 該怎麼辦 |
|---|---|---|
400 | 缺少 query 或 url,或網址沒有 http:// | 修正請求 |
401 | 金鑰未被接受 | 檢查 Authorization |
402 | 餘額用盡 | 在個人後台儲值 |
429 | 請求過於頻繁 | 隔一秒後重試 |
502 | 搜尋沒有回應 | 重試;未產生扣款 |
503 | 搜尋暫時無法使用 | 我們正在處理;未產生扣款 |
常見問題
搜不到結果也要收費嗎? 是的,只要搜尋確實執行過並如實回答「什麼都沒找到」——工作已經完成了。只有出錯才免費。
可以使用串流回傳嗎? 不行,也沒有必要:結果會在幾分之一秒內一次回傳。
會統計 token 嗎? 價格按呼叫計算,token 不影響費用。模型回應中仍會列出 token 數,以免用戶端函式庫把這次回應當成空的。
這和 search/… 系列模型有什麼差別? 那些模型先搜尋,再用語言模型把找到的內容整理成回答——你要為兩份工作付費。這裡你拿到的是原始結果,怎麼用由你自己決定。