Realtime Web Search toevoegen aan een OpenAI- of Claude-agent in 4 stappen

Wil je dat je agent antwoorden onderbouwt met actuele informatie? Je hebt precies twee dingen nodig: een zoek-API die LLM-klare snippets teruggeeft, en een tooldefinitie die het model kan aanroepen. Deze gids doet beide in 4 stappen.
TL;DR
- •Stap 1: haal een API key (gratis) en probeer het endpoint met curl.
- •Stap 2: haal het OpenAI/Claude tool schema rechtstreeks uit de API — geen JSON met de hand schrijven.
- •Stap 3: registreer de tool bij je agent (OpenAI Assistants, Anthropic Messages, LangChain of n8n).
- •Stap 4: implementeer de tool-handler die /api/search/web aanroept en resultaten teruggeeft aan het model.
Waarom dit kort is
De meeste \"voeg web search toe aan je LLM\"-tutorials zijn lang omdat het eigenlijk tutorials zijn over een zoek-API-SDK of een zwaar agent-framework. Deze niet. De hele klus is: kies een endpoint, registreer het als tool, schrijf een handler van 5 regels.
1Haal een API key (gratis) en roep het endpoint aan
Meld je aan op apipick.com/dashboard/api-keys. Nieuwe accounts krijgen 100 gratis credits — geen creditcard nodig. Maak een key en probeer het endpoint:
curl -X POST https://www.apipick.com/api/search/web \
-H "x-api-key: pk_yourkey" \
-H "Content-Type: application/json" \
-d '{"query": "what is retrieval augmented generation"}'Je krijgt een kleine, geranked lijst met titels, URL's en snippets terug. Bevestigen dat dit werkt in curl bespaart je later debug-tijd.
2Haal het tool schema op (schrijf het niet met de hand)
API Pick stelt kant-en-klare tool schemas beschikbaar op GET /api/search/web/tool-schema. De respons bevat zowel een OpenAI-achtige function-definitie als een Claude tool use-definitie.
curl https://www.apipick.com/api/search/web/tool-schemaCache het resultaat — het verandert niet tussen calls. function schemas met de hand schrijven is de meest voorkomende bron van bugs in agent-code (verkeerd type, verkeerde required velden, ontbrekende description).
3Registreer de tool bij je agent
OpenAI Assistants
from openai import OpenAI
import requests
client = OpenAI()
schema = requests.get("https://www.apipick.com/api/search/web/tool-schema").json()
assistant = client.beta.assistants.create(
name="Research Agent",
model="gpt-4o",
instructions="Use web_search whenever the user asks about current events or anything that changes after your training cutoff.",
tools=[{"type": "function", "function": schema["openai"]}],
)Anthropic Claude
import anthropic
import requests
schema = requests.get("https://www.apipick.com/api/search/web/tool-schema").json()
client = anthropic.Anthropic()
response = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=1024,
tools=[schema["claude"]],
messages=[{"role": "user", "content": "Summarise this week's RAG research."}],
)LangChain
from langchain.tools import tool
import requests
@tool
def web_search(query: str) -> dict:
"""Real-time web search. Use for any question that needs current information."""
return requests.post(
"https://www.apipick.com/api/search/web",
headers={"x-api-key": "pk_yourkey"},
json={"query": query},
).json()n8n
Voeg een HTTP Request-node toe: method POST, URL https://www.apipick.com/api/search/web, header x-api-key: pk_yourkey, JSON-body {"query": "{{ $json.query }}"}. Koppel hem aan je agent- of LLM Chain-node. Geen SDK nodig.
4Handel de tool-call af
Voor OpenAI Assistants: wanneer de run pauzeert met status requires_action, voer de zoekopdracht uit en stuur de output in:
import json, time, requests
from openai import OpenAI
client = OpenAI()
KEY = "pk_yourkey"
def run_with_tool(thread_id: str, assistant_id: str):
run = client.beta.threads.runs.create(thread_id=thread_id, assistant_id=assistant_id)
while True:
run = client.beta.threads.runs.retrieve(thread_id=thread_id, run_id=run.id)
if run.status == "requires_action":
outputs = []
for call in run.required_action.submit_tool_outputs.tool_calls:
if call.function.name == "web_search":
args = json.loads(call.function.arguments)
result = requests.post(
"https://www.apipick.com/api/search/web",
headers={"x-api-key": KEY},
json=args,
).json()
outputs.append({"tool_call_id": call.id, "output": json.dumps(result)})
client.beta.threads.runs.submit_tool_outputs(
thread_id=thread_id, run_id=run.id, tool_outputs=outputs,
)
elif run.status in ("completed", "failed", "cancelled", "expired"):
return run
time.sleep(0.5)De loop van de Anthropic Messages API is vergelijkbaar — wanneer de respons een tool_use-blok bevat, roep de API aan en stuur het resultaat vervolgens terug als een tool_result-contentblok in de volgende beurt.
De loop aanscherpen
- Stel de toolbeschrijving op vanuit het perspectief van het model: \"Use this when the user asks about current events, breaking news, or anything that may have changed after your training cutoff.\" Zeg niet \"dit is een web search-API\".
- Cache resultaten in je handler wanneer dezelfde query twee keer voorkomt in een sessie. Web search-resultaten zijn ~minuten stabiel; je hoeft niet twee keer 15 credits te betalen in hetzelfde gesprek.
- Voeg een
start_date-filter toe wanneer versheid telt. \"Het nieuws van deze week\" zonder datumfilter geeft vaak koppen van vorig jaar terug.
Waar je daarna heen gaat
Zodra je agent kan zoeken, is de natuurlijke volgende stap het lezen van de gelinkte pagina's. Voeg de URL Content Extraction API toe als tweede tool — dezelfde auth, dezelfde JSON-vorm, tot 25 URL's per call. De combinatie \"search + extract\" is de kleinste nuttige research-agent.
Veelgestelde vragen
Kan ik dit gebruiken met de OpenAI Responses API in plaats van Assistants?
Ja. Hetzelfde tool schema werkt in client.responses.create() — geef het door via tools=[{...}] precies zoals getoond in de OpenAI-docs. De vorm van de handler is identiek: parse tool_calls, voer POST /api/search/web uit, geef de JSON terug.
Moet ik resultaten formatteren voordat ik ze teruggeef aan het model?
Nee. POST /api/search/web geeft een geranked title + URL + LLM-vriendelijke snippet terug. Geef de ruwe JSON terug als tool-resultaat. Het model citeert de snippets en linkt de URL's.
Hoeveel kost elke agent-beurt?
Elke web search-call is 15 credits (~$0,015 bij $5/5.000 credits). Een typische agent-beurt die de tool één keer gebruikt blijft ruim onder een Amerikaanse cent aan zoekkosten — de LLM-tokens domineren.
Wat als het model de tool nooit aanroept?
Maak de toolbeschrijving specifiek. "Use this for any question that requires current or post-training information" werkt veel beter dan "web search". Modellen routeren naar tools waarvan ze het doel begrijpen.
Kan ik resultaten beperken tot een land of datumbereik?
Ja. Geef country_code (ISO 3166-1 alpha-2) en/of start_date / end_date (YYYY-MM-DD) mee. Voeg ze toe als parameters in je tool schema als je wilt dat het model ze kiest; of hard-code ze in de handler als je agent een vaste locale of versheidseis heeft.
API's gebruikt in dit artikel
Sarah Choy is de CEO van API Pick. Ze schrijft over het bouwen van productieklare API's voor AI-agents en LLM-workflows.