Recherche web (Keenable)
Chercher sur internet et lire des pages directement depuis votre code, avec la même clé que pour les modèles. Deux façons de l'appeler : comme un modèle ordinaire via /v1/chat/completions, ou par des endpoints dédiés qui renvoient du JSON brut.
Combien ça coûte
0,005 $ par requête, soit 5 $ pour 1000 requêtes.
La facturation se fait à l'appel : un appel vaut une requête, quel que soit le nombre de résultats renvoyés. Trouver 50 sources coûte autant que d'en trouver une seule.
Les requêtes en échec ne sont pas facturées : ni une panne de la recherche, ni des paramètres incorrects.
| quoi | compte pour |
|---|---|
| recherche renvoyant 1 résultat | 1 requête |
| recherche renvoyant 50 résultats | 1 requête |
| lecture d'une page | 1 requête |
| erreur de toute nature | 0 |
Voie 1 — comme un modèle
Fonctionne dans Cursor, Claude Code, OpenCode et n'importe quel client OpenAI sans la moindre modification : il suffit de choisir le modèle.
Modèles :
| modèle | ce qu'il fait |
|---|---|
keenable/search | cherche sur le web et renvoie une liste de sources avec des extraits |
keenable/read | lit une page et renvoie son texte en markdown |
Recherche
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": "cours du bitcoin aujourd hui"}]
}'Vous recevez un message d'assistant ordinaire avec la liste des sources : titre, date de publication, adresse complète et un extrait pour chacune.
Lire une page
Le premier mot du message est l'adresse. Vous pouvez ensuite préciser ce qui vous intéresse exactement sur cette page.
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://fr.wikipedia.org/wiki/Tokyo nombre d habitants"}]
}'Sans précision, vous obtenez la page entière en markdown. Avec, seulement ce que vous avez demandé : c'est plus rapide et nettement moins cher en tokens de votre côté lorsque le résultat alimente un modèle.
À quoi sert la précision
Un article de Wikipédia, ce sont des dizaines de milliers de caractères. S'il ne vous faut qu'un chiffre, la précision vous fait gagner du temps et les tokens de l'étape suivante.
Python
from openai import OpenAI
client = OpenAI(
api_key="votre-clé",
base_url="https://nordrouter.com/v1",
)
found = client.chat.completions.create(
model="keenable/search",
messages=[{"role": "user", "content": "actualité de l IA cette semaine"}],
)
print(found.choices[0].message.content)Voie 2 — endpoints dédiés
Si vous avez besoin de résultats avec champs, dates et filtres plutôt que de texte suivi, prenez le JSON.
POST /v1/search
curl https://nordrouter.com/v1/search \
-H "Authorization: Bearer $NORDROUTER_KEY" \
-H "Content-Type: application/json" \
-d '{
"query": "actualité des réseaux de neurones",
"max_results": 5,
"published_after": "7d"
}'Paramètres :
| paramètre | type | par défaut | ce qu'il fait |
|---|---|---|---|
query | chaîne | obligatoire | ce qu'il faut chercher |
site | chaîne | — | chercher uniquement sur ce domaine, par exemple lemonde.fr |
max_results | nombre | 10 | combien de résultats, de 1 à 50 |
snippet_max_chars | nombre | — | longueur de l'extrait, de 180 à 10 000 caractères |
published_after | chaîne | — | contenu publié après ce moment |
published_before | chaîne | — | publié avant |
acquired_after | chaîne | — | entré dans l'index après |
acquired_before | chaîne | — | entré dans l'index avant |
query_time | chaîne | — | chercher dans l'index tel qu'il était à ce moment |
Les dates sont acceptées sous trois formes : 2026-08-01, un horodatage ISO 8601 complet, ou en relatif : 30min, 12h, 7d, 3mo, 1y.
Publication et index, ce n'est pas la même chose
published_* filtre sur la date du contenu lui-même, acquired_* sur la date d'entrée de la page dans l'index. La différence compte : une page peut être réécrite sans que sa date de publication bouge. Si vous cherchez « ce qui est apparu sur le web en 24 heures », prenez acquired_after.
Réponse :
{
"query": "actualité des réseaux de neurones",
"count": 5,
"results": [
{
"title": "Titre de l article",
"url": "https://example.com/article",
"description": "Brève description",
"snippet": "Un extrait du texte de la page…",
"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=extrais le tableau des prix"Paramètres :
| paramètre | type | par défaut | ce qu'il fait |
|---|---|---|---|
url | chaîne | obligatoire | adresse de la page |
max_chars | nombre | 50 000 | combien de caractères renvoyer |
prompt | chaîne | — | ce qu'il faut extraire précisément, jusqu'à 2000 caractères |
live | true / false | false | lire directement sur le site plutôt que dans l'index |
Réponse :
{
"url": "https://example.com/article",
"title": "Titre",
"description": "Description",
"author": "Auteur",
"content": "# Texte de la page en markdown…",
"published_at": 1787777084
}Quand live est nécessaire
Depuis l'index la page arrive plus vite, mais l'index ne contient pas tout. Si la page est récente ou fermée aux robots, mettez live=true : elle sera alors lue directement sur le site. Le prix est le même.
Limites
| cadence | 2 requêtes par seconde et par clé |
| longueur de l'extrait | de 180 à 10 000 caractères |
| résultats par appel | jusqu'à 50 |
| longueur de la précision de lecture | jusqu'à 2000 caractères |
Dépasser la cadence renvoie 429 avec l'en-tête Retry-After : réessayez au bout d'une seconde.
Erreurs
| code | ce que ça veut dire | quoi faire |
|---|---|---|
400 | query ou url manquant, ou adresse sans http:// | corrigez la requête |
401 | clé refusée | vérifiez Authorization |
402 | solde épuisé | rechargez depuis votre espace |
429 | trop fréquent | réessayez au bout d'une seconde |
502 | la recherche n'a pas répondu | réessayez ; rien n'a été facturé |
503 | recherche temporairement indisponible | nous nous en occupons ; rien n'a été facturé |
Questions fréquentes
Un résultat vide est-il facturé ? Oui, si la recherche s'est exécutée et a honnêtement répondu « rien trouvé » : le travail a été fait. Seules les erreurs sont gratuites.
Peut-on streamer ? Non, et ce n'est pas utile : les résultats arrivent d'un bloc en une fraction de seconde.
Les tokens sont-ils comptés ? Le prix est à l'appel, les tokens n'y changent rien. Ils figurent tout de même dans la réponse du modèle pour que les bibliothèques clientes ne la prennent pas pour vide.
Quelle différence avec les modèles search/… ? Ceux-là cherchent d'abord, puis répondent avec un modèle de langage : vous payez deux travaux. Ici vous recevez les résultats bruts et décidez vous-même quoi en faire.