DocumentationAPI Reference📓 Tutorials🧑‍🍳 Cookbook🤝 Integrations💜 Discord


Search engine using SerperDev API.

Folder path/websearch/
Most common position in a pipelineBefore LinkContentFetcher or Converters
Mandatory input variables“query”: A string with your query
Output variables“documents”: A list of documents

”links”: A list of strings of resulting links


When you give SerperDevWebSearch a query, it returns a list of the URLs most relevant to your search. It uses page snippets (pieces of text displayed under the page title in search results) to find the answers, not the whole pages.

To search the content of the web pages, use the LinkContentFetcher component.

SerperDevWebSearch requires a SerperDev key to work. It uses a SERPERDEV_API_KEY environment variable by default. Otherwise, you can pass an api_key at initialization – see code examples below.


Alternative search

To use Search API as an alternative, see its respective documentation page.


On its own

This is an example of how SerperDevWebSearch looks up answers to our query on the web and converts the results into a list of documents with content snippets of the results, as well as URLs as strings.

from haystack.components.websearch import SerperDevWebSearch

web_search = SerperDevWebSearch(api_key=Secret.from_token("<your-api-key>"))
query = "What is the capital of Germany?"

response =

In a pipeline

Here’s an example of a RAG pipeline where we use a SerperDevWebSearch to look up the answer to the query. The resulting documents are then passed to LinkContentFetcher to get the full text from the URLs. Finally, PromptBuilder and OpenAIGenerator work together to form the final answer.

from haystack import Pipeline
from import PromptBuilder
from haystack.components.fetchers import LinkContentFetcher
from haystack.components.converters import HTMLToDocument
from haystack.components.generators import OpenAIGenerator
from haystack.components.websearch import SerperDevWebSearch

web_search = SerperDevWebSearch(api_key=Secret.from_token("<your-api-key>"), top_k=2)
link_content = LinkContentFetcher()
html_converter = HTMLToDocument()

template = """Given the information below: \n
            {% for document in documents %}
                {{ document.content }}
            {% endfor %}
            Answer question: {{ query }}. \n Answer:"""

prompt_builder = PromptBuilder(template=template)
llm = OpenAIGenerator(api_key=Secret.from_token("<your-api-key>"),

pipe = Pipeline()
pipe.add_component("search", web_search)
pipe.add_component("fetcher", link_content)
pipe.add_component("converter", html_converter)
pipe.add_component("prompt_builder", prompt_builder)
pipe.add_component("llm", llm)

pipe.connect("search.links", "fetcher.urls")
pipe.connect("fetcher.streams", "converter.sources")
pipe.connect("converter.documents", "prompt_builder.documents")
pipe.connect("prompt_builder.prompt", "llm.prompt")

query = "What is the most famous landmark in Berlin?"{"search":{"query":query}, "prompt_builder":{"query": query}})

Related Links

See the parameters details in our API reference: