Pencarian web (Keenable)
Mencari di internet dan membaca halaman langsung dari kode Anda — dengan kunci yang sama seperti untuk model. Ada dua cara: sebagai model biasa lewat /v1/chat/completions, atau lewat endpoint tersendiri yang mengembalikan JSON murni.
Berapa biayanya
$0,005 per permintaan — artinya $5 per 1000 permintaan.
Harganya per panggilan: satu panggilan adalah satu permintaan, berapa pun hasil yang kembali. Menemukan 50 sumber berbiaya sama dengan menemukan satu.
Permintaan yang gagal tidak ditagih — baik kegagalan pencarian maupun parameter yang salah.
| apa | dihitung sebagai |
|---|---|
| pencarian dengan 1 hasil | 1 permintaan |
| pencarian dengan 50 hasil | 1 permintaan |
| membaca satu halaman | 1 permintaan |
| kesalahan jenis apa pun | 0 |
Cara 1 — sebagai model
Bekerja di Cursor, Claude Code, OpenCode dan klien OpenAI mana pun tanpa satu perubahan pun: cukup pilih modelnya.
Model:
| model | apa yang dilakukan |
|---|---|
keenable/search | mencari di internet, mengembalikan daftar sumber beserta kutipan |
keenable/read | membaca halaman dan mengembalikan teksnya dalam markdown |
Pencarian
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": "harga bitcoin hari ini"}]
}'Anda akan menerima pesan asisten biasa berisi daftar sumber: judul, tanggal terbit, alamat lengkap dan kutipan untuk masing-masing.
Membaca halaman
Kata pertama dalam pesan adalah alamatnya. Setelah itu Anda bisa menambahkan apa persisnya yang Anda cari di halaman tersebut.
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://id.wikipedia.org/wiki/Tokyo jumlah penduduk"}]
}'Tanpa keterangan tambahan Anda mendapat seluruh halaman dalam markdown. Dengan keterangan — hanya yang Anda minta: itu lebih cepat dan jauh lebih hemat token di sisi Anda ketika hasilnya diteruskan ke model.
Untuk apa keterangan itu
Satu artikel Wikipedia berisi puluhan ribu karakter. Kalau Anda hanya butuh satu angka, keterangan itu menghemat waktu sekaligus token pada langkah berikutnya.
Python
from openai import OpenAI
client = OpenAI(
api_key="kunci-anda",
base_url="https://nordrouter.com/v1",
)
found = client.chat.completions.create(
model="keenable/search",
messages=[{"role": "user", "content": "berita AI minggu ini"}],
)
print(found.choices[0].message.content)Cara 2 — endpoint tersendiri
Kalau Anda butuh hasil dengan bidang, tanggal dan penyaring alih-alih teks mengalir, ambil JSON-nya.
POST /v1/search
curl https://nordrouter.com/v1/search \
-H "Authorization: Bearer $NORDROUTER_KEY" \
-H "Content-Type: application/json" \
-d '{
"query": "berita jaringan saraf tiruan",
"max_results": 5,
"published_after": "7d"
}'Parameter:
| parameter | tipe | bawaan | apa yang dilakukan |
|---|---|---|---|
query | teks | wajib | apa yang dicari |
site | teks | — | cari hanya di domain ini, misalnya kompas.com |
max_results | angka | 10 | berapa hasil, dari 1 sampai 50 |
snippet_max_chars | angka | — | panjang kutipan, dari 180 sampai 10 000 karakter |
published_after | teks | — | materi yang terbit setelah saat ini |
published_before | teks | — | yang terbit sebelumnya |
acquired_after | teks | — | yang masuk indeks setelahnya |
acquired_before | teks | — | yang masuk indeks sebelumnya |
query_time | teks | — | cari di indeks sebagaimana keadaannya pada saat itu |
Tanggal diterima dalam tiga bentuk: 2026-08-01, cap waktu ISO 8601 lengkap, atau secara relatif — 30min, 12h, 7d, 3mo, 1y.
Terbit dan terindeks bukan hal yang sama
published_* menyaring berdasarkan tanggal materinya sendiri, acquired_* berdasarkan tanggal halaman masuk ke indeks. Perbedaannya penting: sebuah halaman bisa ditulis ulang tanpa mengubah tanggal terbitnya. Kalau Anda ingin tahu «apa yang muncul di jaringan dalam sehari», pakai acquired_after.
Jawaban:
{
"query": "berita jaringan saraf tiruan",
"count": 5,
"results": [
{
"title": "Judul artikel",
"url": "https://example.com/article",
"description": "Keterangan singkat",
"snippet": "Kutipan dari teks halaman…",
"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=ambil tabel harganya"Parameter:
| parameter | tipe | bawaan | apa yang dilakukan |
|---|---|---|---|
url | teks | wajib | alamat halaman |
max_chars | angka | 50 000 | berapa karakter yang dikembalikan |
prompt | teks | — | apa persisnya yang diambil, sampai 2000 karakter |
live | true / false | false | ambil langsung dari situs, bukan dari indeks |
Jawaban:
{
"url": "https://example.com/article",
"title": "Judul",
"description": "Keterangan",
"author": "Penulis",
"content": "# Teks halaman dalam markdown…",
"published_at": 1787777084
}Kapan live diperlukan
Dari indeks halaman datang lebih cepat, tetapi indeks tidak memuat segalanya. Kalau halamannya baru atau tertutup bagi perayap, pasang live=true — halaman akan dibaca langsung dari situsnya. Harganya sama.
Batasan
| laju | 2 permintaan per detik per kunci |
| panjang kutipan | dari 180 sampai 10 000 karakter |
| hasil per panggilan | sampai 50 |
| panjang keterangan saat membaca | sampai 2000 karakter |
Melampaui laju akan mengembalikan 429 dengan header Retry-After — ulangi setelah satu detik.
Kesalahan
| kode | artinya | apa yang harus dilakukan |
|---|---|---|
400 | query atau url tidak ada, atau alamat tanpa http:// | perbaiki permintaannya |
401 | kunci tidak diterima | periksa Authorization |
402 | saldo habis | isi ulang di panel |
429 | terlalu sering | ulangi setelah satu detik |
502 | pencarian tidak menjawab | ulangi; tidak ada yang ditagih |
503 | pencarian sementara tidak tersedia | kami sedang menanganinya; tidak ada yang ditagih |
Pertanyaan umum
Apakah hasil kosong ditagih? Ya, kalau pencarian berjalan dan menjawab jujur «tidak ditemukan apa pun» — pekerjaannya sudah dilakukan. Yang gratis hanyalah kesalahan.
Bisakah dialirkan (streaming)? Tidak, dan memang tidak perlu: hasil datang sekaligus dalam pecahan detik.
Apakah token dihitung? Harganya per panggilan, token tidak memengaruhinya. Token tetap ditampilkan dalam jawaban model supaya pustaka klien tidak menganggapnya kosong.
Apa bedanya dengan model search/…? Model-model itu mencari dulu, lalu menjawab dengan model bahasa — Anda membayar dua pekerjaan. Di sini Anda menerima hasil mentah dan memutuskan sendiri mau diapakan.