بحث الويب (Keenable)
ابحث في الإنترنت واقرأ الصفحات مباشرةً من داخل شيفرتك، بالمفتاح نفسه الذي تستعمله مع النماذج. هناك طريقتان: كنموذج عادي عبر /v1/chat/completions، أو عبر نقاط نهاية خاصة تُعيد JSON صِرفًا.
كم يكلّف
0.005 دولار لكل طلب — أي 5 دولارات لكل 1000 طلب.
التسعير بالاستدعاء: استدعاء واحد يعني طلبًا واحدًا مهما كان عدد النتائج العائدة. العثور على 50 مصدرًا يكلّف مثل العثور على مصدر واحد.
الطلبات الفاشلة لا تُحتسب — لا عطل البحث ولا الوسائط الخاطئة.
| ماذا | يُحتسب كـ |
|---|---|
| بحث أعاد نتيجة واحدة | طلب واحد |
| بحث أعاد 50 نتيجة | طلب واحد |
| قراءة صفحة | طلب واحد |
| أي خطأ من أي نوع | 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://ar.wikipedia.org/wiki/طوكيو عدد السكان"}]
}'من دون توجيه تحصل على الصفحة كاملة بصيغة markdown. ومع التوجيه تحصل على ما طلبته فقط: وهذا أسرع، وأرخص بوضوح من ناحية الرموز عندك حين ينتقل الناتج إلى نموذج.
لماذا التوجيه مفيد
مقالة ويكيبيديا تبلغ عشرات آلاف المحارف. إن كنت تحتاج رقمًا واحدًا فقط، فالتوجيه يوفّر الوقت ورموز الخطوة التالية معًا.
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 | نص | — | البحث في هذا النطاق فقط، مثل aljazeera.net |
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 وستُقرأ من الموقع مباشرةً. والسعر هو نفسه.
الحدود
| المعدّل | طلبان في الثانية لكل مفتاح |
| طول المقتطف | من 180 إلى 10000 محرف |
| النتائج لكل استدعاء | حتى 50 |
| طول توجيه القراءة | حتى 2000 محرف |
تجاوز المعدّل يُعيد 429 مع ترويسة Retry-After — أعِد المحاولة بعد ثانية.
الأخطاء
| الرمز | معناه | ما العمل |
|---|---|---|
400 | ينقص query أو url، أو العنوان بلا http:// | صحّح الطلب |
401 | المفتاح غير مقبول | تحقّق من Authorization |
402 | نفد الرصيد | اشحن من لوحة التحكّم |
429 | متكرّر أكثر من اللازم | أعِد المحاولة بعد ثانية |
502 | البحث لم يستجب | أعِد المحاولة؛ لم يُحتسب شيء |
503 | البحث غير متاح مؤقتًا | نحن نعالج الأمر؛ لم يُحتسب شيء |
أسئلة متكرّرة
هل تُحتسب نتيجة فارغة؟ نعم، إن كان البحث قد نُفّذ وأجاب بصدق «لم يُعثر على شيء» — فالعمل قد تمّ. المجاني هو الأخطاء وحدها.
هل يمكن البثّ المتدفّق؟ لا، ولا حاجة إليه: النتائج تصل دفعة واحدة خلال جزء من الثانية.
هل تُحسب الرموز؟ السعر بالاستدعاء، والرموز لا تؤثّر فيه. ومع ذلك تظهر في استجابة النموذج كي لا تعدّها مكتبات العملاء استجابةً فارغة.
ما الفرق عن نماذج search/…؟ تلك تبحث أولًا ثم تجيب بما وجدته عبر نموذج لغوي — فتدفع ثمن عملين. أما هنا فتحصل على النتائج الخام وتقرّر بنفسك ما تفعله بها.