Websuche (Keenable)
Das Web durchsuchen und Seiten lesen — direkt aus Ihrem Code und mit demselben Schlüssel wie für Modelle. Es gibt zwei Wege: als gewöhnliches Modell über /v1/chat/completions oder über eigene Endpunkte mit reinem JSON.
Was es kostet
0,005 $ pro Anfrage — also 5 $ pro 1000 Anfragen.
Abgerechnet wird pro Aufruf: ein Aufruf ist eine Anfrage, gleichgültig wie viele Treffer zurückkommen. 50 Quellen zu finden kostet genauso viel wie eine einzige.
Fehlgeschlagene Anfragen werden nicht berechnet — weder ein Fehler der Suche noch falsche Parameter.
| was | zählt als |
|---|---|
| Suche mit 1 Treffer | 1 Anfrage |
| Suche mit 50 Treffern | 1 Anfrage |
| eine Seite lesen | 1 Anfrage |
| ein Fehler jeder Art | 0 |
Weg 1 — als Modell
Funktioniert in Cursor, Claude Code, OpenCode und jedem OpenAI-Client ohne eine einzige Änderung: Sie wählen einfach das Modell aus.
Modelle:
| Modell | was es tut |
|---|---|
keenable/search | durchsucht das Web und liefert eine Liste von Quellen mit Auszügen |
keenable/read | liest eine Seite und gibt ihren Text als Markdown zurück |
Suche
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": "Bitcoin Kurs heute"}]
}'Zurück kommt eine gewöhnliche Assistenten-Nachricht mit der Liste der Quellen: Titel, Veröffentlichungsdatum, vollständige Adresse und ein Auszug zu jedem Treffer.
Eine Seite lesen
Das erste Wort der Nachricht ist die Adresse. Danach können Sie ergänzen, was genau Sie auf dieser Seite interessiert.
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://de.wikipedia.org/wiki/Tokio Einwohnerzahl"}]
}'Ohne Zusatz erhalten Sie die ganze Seite als Markdown. Mit Zusatz nur das, worum Sie gebeten haben — das ist schneller und spürbar günstiger bei den Tokens auf Ihrer Seite, wenn das Ergebnis in ein Modell weiterläuft.
Wozu der Zusatz
Ein Wikipedia-Artikel hat Zehntausende Zeichen. Wenn Sie eine einzige Zahl brauchen, spart der Zusatz Zeit und die Tokens des nächsten Schritts.
Python
from openai import OpenAI
client = OpenAI(
api_key="ihr-schlüssel",
base_url="https://nordrouter.com/v1",
)
found = client.chat.completions.create(
model="keenable/search",
messages=[{"role": "user", "content": "KI-Nachrichten dieser Woche"}],
)
print(found.choices[0].message.content)Weg 2 — eigene Endpunkte
Wenn Sie Treffer mit Feldern, Daten und Filtern brauchen statt Fließtext, nehmen Sie das JSON.
POST /v1/search
curl https://nordrouter.com/v1/search \
-H "Authorization: Bearer $NORDROUTER_KEY" \
-H "Content-Type: application/json" \
-d '{
"query": "Nachrichten über neuronale Netze",
"max_results": 5,
"published_after": "7d"
}'Parameter:
| Parameter | Typ | Standard | was er tut |
|---|---|---|---|
query | Zeichenkette | erforderlich | wonach gesucht wird |
site | Zeichenkette | — | nur auf dieser Domain suchen, etwa heise.de |
max_results | Zahl | 10 | wie viele Treffer, von 1 bis 50 |
snippet_max_chars | Zahl | — | Länge des Auszugs, von 180 bis 10 000 Zeichen |
published_after | Zeichenkette | — | Material, das nach diesem Zeitpunkt veröffentlicht wurde |
published_before | Zeichenkette | — | vorher veröffentlicht |
acquired_after | Zeichenkette | — | nach diesem Zeitpunkt in den Index aufgenommen |
acquired_before | Zeichenkette | — | vorher aufgenommen |
query_time | Zeichenkette | — | im Index suchen, wie er zu diesem Zeitpunkt aussah |
Daten werden in drei Formen angenommen: 2026-08-01, ein vollständiger ISO-8601-Zeitstempel oder relativ — 30min, 12h, 7d, 3mo, 1y.
Veröffentlichung und Index sind nicht dasselbe
published_* filtert nach dem Datum des Materials selbst, acquired_* nach dem Datum, an dem die Seite in den Index kam. Der Unterschied zählt: Eine Seite kann umgeschrieben worden sein, ohne dass das Veröffentlichungsdatum angefasst wurde. Wenn Sie wissen wollen, „was in den letzten 24 Stunden im Netz erschienen ist", nehmen Sie acquired_after.
Antwort:
{
"query": "Nachrichten über neuronale Netze",
"count": 5,
"results": [
{
"title": "Überschrift des Artikels",
"url": "https://example.com/article",
"description": "Kurze Beschreibung",
"snippet": "Ein Auszug aus dem Seitentext…",
"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=hol die Preistabelle heraus"Parameter:
| Parameter | Typ | Standard | was er tut |
|---|---|---|---|
url | Zeichenkette | erforderlich | Adresse der Seite |
max_chars | Zahl | 50 000 | wie viele Zeichen zurückgegeben werden |
prompt | Zeichenkette | — | was genau herausgeholt werden soll, bis 2000 Zeichen |
live | true / false | false | direkt von der Seite holen statt aus dem Index |
Antwort:
{
"url": "https://example.com/article",
"title": "Überschrift",
"description": "Beschreibung",
"author": "Autor",
"content": "# Seitentext als Markdown…",
"published_at": 1787777084
}Wann live nötig ist
Aus dem Index kommt die Seite schneller, aber der Index enthält nicht alles. Ist die Seite frisch oder für Crawler gesperrt, setzen Sie live=true — dann wird sie direkt von der Website gelesen. Der Preis bleibt gleich.
Grenzen
| Tempo | 2 Anfragen pro Sekunde je Schlüssel |
| Länge des Auszugs | von 180 bis 10 000 Zeichen |
| Treffer pro Aufruf | bis zu 50 |
| Länge des Lese-Zusatzes | bis 2000 Zeichen |
Wird das Tempo überschritten, kommt 429 mit dem Header Retry-After — wiederholen Sie es nach einer Sekunde.
Fehler
| Code | was er bedeutet | was zu tun ist |
|---|---|---|
400 | query oder url fehlt, oder die Adresse hat kein http:// | Anfrage korrigieren |
401 | Schlüssel nicht angenommen | Authorization prüfen |
402 | Guthaben aufgebraucht | im Konto aufladen |
429 | zu häufig | nach einer Sekunde wiederholen |
502 | Suche hat nicht geantwortet | wiederholen; es wurde nichts berechnet |
503 | Suche vorübergehend nicht verfügbar | wir kümmern uns darum; es wurde nichts berechnet |
Häufige Fragen
Wird eine leere Trefferliste berechnet? Ja, wenn die Suche gelaufen ist und ehrlich „nichts gefunden" geantwortet hat — die Arbeit wurde getan. Kostenlos sind nur Fehler.
Kann man streamen? Nein, und es ist nicht nötig: Die Treffer kommen in einem Stück und im Bruchteil einer Sekunde.
Werden Tokens gezählt? Der Preis gilt pro Aufruf, Tokens haben keinen Einfluss darauf. In der Modellantwort werden sie trotzdem ausgewiesen, damit Client-Bibliotheken die Antwort nicht für leer halten.
Worin unterscheidet sich das von den search/…-Modellen? Jene suchen zuerst und antworten dann mit einem Sprachmodell — Sie zahlen für zwei Arbeiten. Hier bekommen Sie die rohen Treffer und entscheiden selbst, was Sie damit tun.