<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: AgentSearch</title>
    <description>The latest articles on DEV Community by AgentSearch (@agentsearchhq).</description>
    <link>https://dev.to/agentsearchhq</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4158658%2Ff872bfa1-6a6a-486e-8009-8e7b6794c641.png</url>
      <title>DEV Community: AgentSearch</title>
      <link>https://dev.to/agentsearchhq</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/agentsearchhq"/>
    <language>en</language>
    <item>
      <title>Turn Any URL into Clean Markdown for RAG (API Guide)</title>
      <dc:creator>AgentSearch</dc:creator>
      <pubDate>Fri, 02 Oct 2026 23:58:53 +0000</pubDate>
      <link>https://dev.to/agentsearchhq/turn-any-url-into-clean-markdown-for-rag-api-guide-40hp</link>
      <guid>https://dev.to/agentsearchhq/turn-any-url-into-clean-markdown-for-rag-api-guide-40hp</guid>
      <description>&lt;p&gt;Raw HTML makes poor context for an LLM. A typical page is mostly navigation, scripts, cookie banners and footer links. Putting all of that into an embedding model or a prompt wastes tokens and lowers retrieval quality. What you want is the &lt;strong&gt;content&lt;/strong&gt;: headings, paragraphs, lists and links, as markdown, plus enough metadata to cite the source and to tell when it goes stale.&lt;/p&gt;

&lt;p&gt;This guide uses &lt;a href="https://agentsearchhq.com/extract?utm_source=devto&amp;amp;utm_medium=social&amp;amp;utm_campaign=url-to-markdown-for-rag" rel="noopener noreferrer"&gt;AgentSearch Web Extract&lt;/a&gt; (&lt;code&gt;agentsearch-web-extract-v1&lt;/code&gt;) to turn a URL into RAG-ready markdown. It covers the request, the response, chunking and error handling. Each call costs $0.005, paid in USDC over x402 or MPP on the Pocket Agentic Portal, with no account and no API key.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why markdown is the right format for RAG
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;It keeps the structure.&lt;/strong&gt; Headings (&lt;code&gt;#&lt;/code&gt;, &lt;code&gt;##&lt;/code&gt;) tell you where sections begin, which gives you natural chunk boundaries and section titles to store as metadata.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It's token-efficient.&lt;/strong&gt; Markdown carries the meaning of the HTML without the tags.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Links survive.&lt;/strong&gt; &lt;code&gt;[text](url)&lt;/code&gt; keeps the citation trail, so an agent can follow a link or quote its source.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Models read it well.&lt;/strong&gt; LLMs see a lot of markdown and handle it reliably in prompts.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The request
&lt;/h2&gt;

&lt;p&gt;The endpoint is &lt;code&gt;POST /v1/extract&lt;/code&gt;, which takes a JSON body. Only &lt;code&gt;url&lt;/code&gt; is required.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://agent.pocket.network/v1/agentsearch-web-extract-v1/v1/extract &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s1"&gt;'content-type: application/json'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"url":"https://example.com"}'&lt;/span&gt;
&lt;span class="c"&gt;# → 402 Payment Required with the terms. An x402 or MPP client signs and retries.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These are the options from the &lt;a href="https://agentsearchhq.com/specs/extract-openapi.json?utm_source=devto&amp;amp;utm_medium=social&amp;amp;utm_campaign=url-to-markdown-for-rag" rel="noopener noreferrer"&gt;extract OpenAPI spec&lt;/a&gt;:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Default&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;url&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;string&lt;/td&gt;
&lt;td&gt;(required)&lt;/td&gt;
&lt;td&gt;An absolute http(s) URL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;formats&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;["markdown"]&lt;/code&gt;, &lt;code&gt;["text"]&lt;/code&gt; or both&lt;/td&gt;
&lt;td&gt;&lt;code&gt;["markdown"]&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Which renderings to return&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;max_chars&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;integer, 1–100000&lt;/td&gt;
&lt;td&gt;50000&lt;/td&gt;
&lt;td&gt;Caps the returned characters. &lt;code&gt;meta.truncated&lt;/code&gt; tells you whether the cap was hit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;include_links&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;boolean&lt;/td&gt;
&lt;td&gt;true&lt;/td&gt;
&lt;td&gt;Up to 100 absolute links from the page&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;timeout_ms&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;integer&lt;/td&gt;
&lt;td&gt;4000&lt;/td&gt;
&lt;td&gt;Fetch deadline. Values above 4000 are capped (a hard 4 s deadline)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  The response
&lt;/h2&gt;

&lt;p&gt;This is a real response captured on the portal service page (2026-09-25 UTC):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"portal"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"provenance"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"third-party-supplier"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"serviceId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"agentsearch-web-extract-v1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"schemaCheck"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"unchecked"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"data"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"request_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"05f5a4ebe2684c79867aa9bf3515c33d"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://example.com/"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Example Domain"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"markdown"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"# Example Domain&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="s2"&gt;This domain is for use in documentation examples without needing permission. Avoid use in operations.&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"links"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"href"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://iana.org/domains/example"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Learn more"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"meta"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"status_code"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"content_type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"text/html"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"fetched_at"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-09-25T15:53:07.843243+00:00"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"chars"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;167&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"truncated"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"error"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The fields that matter for RAG:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;url&lt;/code&gt; is the &lt;strong&gt;final&lt;/strong&gt; URL after redirects. Use it as your canonical document ID.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;title&lt;/code&gt; is a ready-made citation label.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;meta.fetched_at&lt;/code&gt; lets you re-extract stale documents on a schedule.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;meta.truncated&lt;/code&gt; tells you whether you hit &lt;code&gt;max_chars&lt;/code&gt;. If you did, raise the cap and fetch again.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;error&lt;/code&gt; is &lt;code&gt;null&lt;/code&gt; on success.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step 1: Fetch markdown from code (TypeScript + x402)
&lt;/h2&gt;

&lt;p&gt;Standard x402 v2 clients work with the portal unchanged. Here's &lt;code&gt;@x402/fetch&lt;/code&gt; with &lt;code&gt;@x402/evm&lt;/code&gt;, paying on Base:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;wrapFetchWithPaymentFromConfig&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@x402/fetch&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;ExactEvmScheme&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@x402/evm&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;privateKeyToAccount&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;viem/accounts&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;EXTRACT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://agent.pocket.network/v1/agentsearch-web-extract-v1/v1/extract&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Use a dedicated wallet that holds only what you're willing to spend.&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;account&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;privateKeyToAccount&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;AGENT_WALLET_KEY&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="s2"&gt;`0x&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;pay&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;wrapFetchWithPaymentFromConfig&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;schemes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt; &lt;span class="na"&gt;network&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;eip155:8453&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;client&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ExactEvmScheme&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;account&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;}],&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;extract&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;maxChars&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;50000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;pay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;EXTRACT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;content-type&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;application/json&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;formats&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;markdown&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="na"&gt;max_chars&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;maxChars&lt;/span&gt; &lt;span class="p"&gt;}),&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Portal errors aren't wrapped in the envelope: { error: { code, message, retryable } }&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="k"&gt;catch&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;({}));&lt;/span&gt;
    &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`portal &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;code&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;unknown&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;envelope&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;envelope&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;portal&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;provenance&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;third-party-supplier&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Unexpected response shape; refusing to use it.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;doc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;envelope&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;doc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// The target site failed, but the HTTP status was still 200.&lt;/span&gt;
    &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="nb"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;assign&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;doc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;code&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;retryable&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;doc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;retryable&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;doc&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;markdown&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;links&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;href&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt; &lt;span class="p"&gt;}[];&lt;/span&gt;
    &lt;span class="nl"&gt;meta&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;fetched_at&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;chars&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;truncated&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;boolean&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If delivery fails, the portal settles nothing, so you aren't charged for it. Payment details are in Pocket's &lt;a href="https://agent.pocket.network/agent-integration" rel="noopener noreferrer"&gt;integration guide&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Prefer no code? Use MCP
&lt;/h3&gt;

&lt;p&gt;In Claude Desktop, Cursor or Claude Code, add &lt;code&gt;npx -y @pocket-network/agentic-portal-mcp&lt;/code&gt; and ask the agent to &lt;code&gt;call_service&lt;/code&gt; on &lt;code&gt;agentsearch-web-extract-v1&lt;/code&gt;. The full setup, including spending limits, is in &lt;a href="https://agentsearchhq.com/blog/mcp-web-search-for-ai-agents?utm_source=devto&amp;amp;utm_medium=social&amp;amp;utm_campaign=url-to-markdown-for-rag" rel="noopener noreferrer"&gt;How to give your AI agent web search with MCP&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: Chunk by heading
&lt;/h2&gt;

&lt;p&gt;Split on markdown headings first, then on size. Every chunk keeps the path of headings above it, which improves both retrieval and citations.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;chunk_markdown&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;doc&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;max_chars&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1500&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;overlap&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;150&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;doc is the `data` object returned by agentsearch-web-extract-v1.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="n"&gt;chunks&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;buf&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[],&lt;/span&gt; &lt;span class="p"&gt;[],&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;flush&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
        &lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;buf&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;max_chars&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;overlap&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="n"&gt;chunks&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;max_chars&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;source_url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;doc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;title&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;doc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;title&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;section&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt; &amp;gt; &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;fetched_at&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;doc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;meta&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;fetched_at&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
            &lt;span class="p"&gt;})&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;doc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;markdown&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;splitlines&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
        &lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;match&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;^(#{1,6})\s+(.*)&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="nf"&gt;flush&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="n"&gt;buf&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;clear&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="n"&gt;level&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;group&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
            &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;[:]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;[:&lt;/span&gt;&lt;span class="n"&gt;level&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;group&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;()]&lt;/span&gt;
        &lt;span class="n"&gt;buf&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;flush&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;chunks&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Embed &lt;code&gt;chunk["text"]&lt;/code&gt; and store the rest as metadata. When your agent answers, cite &lt;code&gt;title&lt;/code&gt; and &lt;code&gt;source_url&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Handle failures properly
&lt;/h2&gt;

&lt;p&gt;Extract separates &lt;strong&gt;target-site failures&lt;/strong&gt; from &lt;strong&gt;request problems&lt;/strong&gt;:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Where&lt;/th&gt;
&lt;th&gt;HTTP&lt;/th&gt;
&lt;th&gt;Codes&lt;/th&gt;
&lt;th&gt;What to do&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;data.error&lt;/code&gt; (target site)&lt;/td&gt;
&lt;td&gt;200&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;TARGET_HTTP_ERROR&lt;/code&gt;, &lt;code&gt;TARGET_TIMEOUT&lt;/code&gt;, &lt;code&gt;TARGET_DNS_ERROR&lt;/code&gt;, &lt;code&gt;TARGET_CONNECT_ERROR&lt;/code&gt;, &lt;code&gt;TARGET_FETCH_FAILED&lt;/code&gt;, &lt;code&gt;TARGET_TOO_MANY_REDIRECTS&lt;/code&gt;, &lt;code&gt;UNSUPPORTED_CONTENT&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Retry only when &lt;code&gt;retryable&lt;/code&gt; is true (timeouts, connection failures, target 5xx/429)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Request&lt;/td&gt;
&lt;td&gt;400&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;INVALID_REQUEST&lt;/code&gt;, &lt;code&gt;SSRF_BLOCKED&lt;/code&gt; (private, loopback or metadata addresses)&lt;/td&gt;
&lt;td&gt;Fix the input. Don't retry&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Request&lt;/td&gt;
&lt;td&gt;413 / 429&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;REQUEST_TOO_LARGE&lt;/code&gt;, &lt;code&gt;CAPACITY_LIMIT&lt;/code&gt;, &lt;code&gt;APPLICATION_RATE_LIMITED&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Back off and retry&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;code&gt;UNSUPPORTED_CONTENT&lt;/code&gt; means the URL points to something other than HTML or text, such as a PDF or an image. Send those to a document parser instead.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4: Treat extracted content as untrusted
&lt;/h2&gt;

&lt;p&gt;Any page can contain text written to manipulate your agent. Before content reaches a model:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Put extracted markdown in a &lt;strong&gt;data position&lt;/strong&gt;, such as a tool result or a quoted block, never in a system prompt.&lt;/li&gt;
&lt;li&gt;Ignore instructions that appear in page content.&lt;/li&gt;
&lt;li&gt;Check &lt;code&gt;portal.schemaCheck&lt;/code&gt;. Only &lt;code&gt;passed&lt;/code&gt; means a schema check ran.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  When the page needs JavaScript
&lt;/h2&gt;

&lt;p&gt;Extract fetches the HTML the server sends, which is fast and works for docs, blogs, news and most marketing pages. Single-page apps and dashboards often render their content only after JavaScript runs. For those, AgentSearch has &lt;a href="https://agentsearchhq.com/render?utm_source=devto&amp;amp;utm_medium=social&amp;amp;utm_campaign=url-to-markdown-for-rag" rel="noopener noreferrer"&gt;&lt;strong&gt;Web Render&lt;/strong&gt;&lt;/a&gt; (&lt;code&gt;agentsearch-web-render-v1&lt;/code&gt;), live on Pocket MainNet. It loads the page in headless Chromium and returns the rendered markdown, text, HTML, links and an optional screenshot. It honors robots.txt and doesn't bypass bot walls. Render isn't on the Agentic Portal yet. Its request and response contract is in &lt;a href="https://agentsearchhq.com/agents.md?utm_source=devto&amp;amp;utm_medium=social&amp;amp;utm_campaign=url-to-markdown-for-rag" rel="noopener noreferrer"&gt;agents.md&lt;/a&gt; and the &lt;a href="https://agentsearchhq.com/specs/render-openapi.json?utm_source=devto&amp;amp;utm_medium=social&amp;amp;utm_campaign=url-to-markdown-for-rag" rel="noopener noreferrer"&gt;render spec&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Search, then extract
&lt;/h2&gt;

&lt;p&gt;A common pattern is to search with &lt;a href="https://agentsearchhq.com/search?utm_source=devto&amp;amp;utm_medium=social&amp;amp;utm_campaign=url-to-markdown-for-rag" rel="noopener noreferrer"&gt;AgentSearch Web Search&lt;/a&gt; (up to 5 results per call), pick the most relevant results, then extract them in full. See the &lt;a href="https://agentsearchhq.com/specs/search-openapi.json?utm_source=devto&amp;amp;utm_medium=social&amp;amp;utm_campaign=url-to-markdown-for-rag" rel="noopener noreferrer"&gt;search spec&lt;/a&gt;, and compare per-call costs across vendors in &lt;a href="https://agentsearchhq.com/blog/cheapest-web-search-api-for-ai-agents-2026?utm_source=devto&amp;amp;utm_medium=social&amp;amp;utm_campaign=url-to-markdown-for-rag" rel="noopener noreferrer"&gt;Cheapest web search API for AI agents in 2026&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;How long can an extracted page be?&lt;/strong&gt;&lt;br&gt;
Up to 100,000 characters per call through &lt;code&gt;max_chars&lt;/code&gt;. The default is 50,000.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does it follow redirects?&lt;/strong&gt;&lt;br&gt;
Yes. &lt;code&gt;url&lt;/code&gt; in the response is the final URL, and &lt;code&gt;requested_url&lt;/code&gt; appears on errors.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can it extract PDFs?&lt;/strong&gt;&lt;br&gt;
No. Non-HTML content returns &lt;code&gt;UNSUPPORTED_CONTENT&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Who serves the requests?&lt;/strong&gt;&lt;br&gt;
Decentralized Pocket Network suppliers. Machine-readable details are at &lt;a href="https://agentsearchhq.com/llms.txt?utm_source=devto&amp;amp;utm_medium=social&amp;amp;utm_campaign=url-to-markdown-for-rag" rel="noopener noreferrer"&gt;agentsearchhq.com/llms.txt&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  More from the blog
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://agentsearchhq.com/blog/mcp-web-search-for-ai-agents?utm_source=devto&amp;amp;utm_medium=social&amp;amp;utm_campaign=url-to-markdown-for-rag" rel="noopener noreferrer"&gt;Add Web Search to Your AI Agent with MCP (2026 Guide)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://agentsearchhq.com/blog/cheapest-web-search-api-for-ai-agents-2026?utm_source=devto&amp;amp;utm_medium=social&amp;amp;utm_campaign=url-to-markdown-for-rag" rel="noopener noreferrer"&gt;Cheapest Web Search API for AI Agents in 2026&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Service pages: &lt;a href="https://agentsearchhq.com/search?utm_source=devto&amp;amp;utm_medium=social&amp;amp;utm_campaign=url-to-markdown-for-rag" rel="noopener noreferrer"&gt;Web Search API&lt;/a&gt; · &lt;a href="https://agentsearchhq.com/extract?utm_source=devto&amp;amp;utm_medium=social&amp;amp;utm_campaign=url-to-markdown-for-rag" rel="noopener noreferrer"&gt;Web Extract API&lt;/a&gt; · &lt;a href="https://agentsearchhq.com/render?utm_source=devto&amp;amp;utm_medium=social&amp;amp;utm_campaign=url-to-markdown-for-rag" rel="noopener noreferrer"&gt;Web Render API&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Originally published at &lt;a href="https://agentsearchhq.com/blog/url-to-markdown-for-rag?utm_source=devto&amp;amp;utm_medium=social&amp;amp;utm_campaign=url-to-markdown-for-rag" rel="noopener noreferrer"&gt;agentsearchhq.com&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>rag</category>
      <category>tutorial</category>
      <category>api</category>
    </item>
    <item>
      <title>Cheapest Web Search API for AI Agents in 2026</title>
      <dc:creator>AgentSearch</dc:creator>
      <pubDate>Fri, 02 Oct 2026 23:49:38 +0000</pubDate>
      <link>https://dev.to/agentsearchhq/cheapest-web-search-api-for-ai-agents-in-2026-1g80</link>
      <guid>https://dev.to/agentsearchhq/cheapest-web-search-api-for-ai-agents-in-2026-1g80</guid>
      <description>&lt;p&gt;Most "cheapest search API" posts compare monthly plans, but agents are billed per call. This post compares the &lt;strong&gt;published per-call prices&lt;/strong&gt; of web search and extraction APIs that developers use with AI agents.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How we did this.&lt;/strong&gt; We checked every price on &lt;strong&gt;October 2, 2026&lt;/strong&gt; on the vendor's own public pricing page, linked in each row. We only list a per-call price where the vendor states one. Plan-only and token-based pricing gets its own section, with the arithmetic shown. We don't compare result quality, latency or uptime. Prices change often, so check the source before you decide.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Disclosure: AgentSearch publishes this blog.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The short answer
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Lowest stated price per search request:&lt;/strong&gt; Exa Search (&lt;code&gt;instant&lt;/code&gt;), at $4 per 1,000 requests ($0.004).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;$0.005 per request:&lt;/strong&gt; AgentSearch Web Search.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lowest stated price per page extracted:&lt;/strong&gt; Exa Contents, at $1 per 1,000 pages ($0.001).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The only option here with no account, no API key and no prepaid credits:&lt;/strong&gt; AgentSearch, which you pay per call in USDC over x402 or MPP.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;AgentSearch is not the cheapest on sticker price for every operation, and we're not going to claim it is. Where it does well is the cost of &lt;em&gt;getting started&lt;/em&gt; and of &lt;em&gt;paying as you go&lt;/em&gt;: nothing to sign up for, no plan, no card, no balance to top up. An agent with a wallet can pay $0.005 for one call and stop there.&lt;/p&gt;

&lt;h2&gt;
  
  
  Search APIs: stated per-call prices
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Provider&lt;/th&gt;
&lt;th&gt;Operation&lt;/th&gt;
&lt;th&gt;Stated price&lt;/th&gt;
&lt;th&gt;Per call&lt;/th&gt;
&lt;th&gt;Account / key required&lt;/th&gt;
&lt;th&gt;Source (checked 2026-10-02)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Exa&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;/search&lt;/code&gt; &lt;code&gt;instant&lt;/code&gt; (up to 10 results)&lt;/td&gt;
&lt;td&gt;$4 / 1k requests&lt;/td&gt;
&lt;td&gt;$0.004&lt;/td&gt;
&lt;td&gt;Yes (API key; $10 free credits monthly)&lt;/td&gt;
&lt;td&gt;&lt;a href="https://exa.ai/pricing" rel="noopener noreferrer"&gt;exa.ai/pricing&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Exa&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;/search&lt;/code&gt; &lt;code&gt;fast&lt;/code&gt; / &lt;code&gt;auto&lt;/code&gt; (up to 10 results)&lt;/td&gt;
&lt;td&gt;$7 / 1k requests&lt;/td&gt;
&lt;td&gt;$0.007&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;&lt;a href="https://exa.ai/pricing" rel="noopener noreferrer"&gt;exa.ai/pricing&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AgentSearch&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Web Search (&lt;code&gt;agentsearch-web-search-v1&lt;/code&gt;, up to 5 results)&lt;/td&gt;
&lt;td&gt;$0.005 / call&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$0.005&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;No account, no API key&lt;/strong&gt; (USDC via x402 or MPP)&lt;/td&gt;
&lt;td&gt;&lt;a href="https://agent.pocket.network/services/agentsearch-web-search-v1" rel="noopener noreferrer"&gt;Agentic Portal: search&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Watch for what a call includes
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Exa's base price covers &lt;strong&gt;up to 10 results&lt;/strong&gt; per request. Results above 10 and AI page summaries are billed extra; see its pricing page.&lt;/li&gt;
&lt;li&gt;AgentSearch Web Search returns &lt;strong&gt;up to 5 results&lt;/strong&gt; per call (&lt;code&gt;max_results&lt;/code&gt; 1–5), each with title, URL, snippet, score, domain and date. The fields are in the &lt;a href="https://agentsearchhq.com/specs/search-openapi.json?utm_source=devto&amp;amp;utm_medium=social&amp;amp;utm_campaign=cheapest-web-search-api-for-ai-agents-2026" rel="noopener noreferrer"&gt;search spec&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Extraction APIs: stated per-page prices
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Provider&lt;/th&gt;
&lt;th&gt;Operation&lt;/th&gt;
&lt;th&gt;Stated price&lt;/th&gt;
&lt;th&gt;Per page&lt;/th&gt;
&lt;th&gt;Source (checked 2026-10-02)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Exa&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;/contents&lt;/code&gt; (per content type)&lt;/td&gt;
&lt;td&gt;$1 / 1k pages&lt;/td&gt;
&lt;td&gt;$0.001&lt;/td&gt;
&lt;td&gt;&lt;a href="https://exa.ai/pricing" rel="noopener noreferrer"&gt;exa.ai/pricing&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AgentSearch&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Web Extract (&lt;code&gt;agentsearch-web-extract-v1&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;$0.005 / call&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$0.005&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://agent.pocket.network/services/agentsearch-web-extract-v1" rel="noopener noreferrer"&gt;Agentic Portal: extract&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;On per-page price alone, AgentSearch Extract costs more than Exa Contents. What you get for $0.005 is one URL turned into markdown or text, with the title, links and fetch metadata, and no account or prepaid balance. If you extract millions of pages a month, a bulk plan will cost you less.&lt;/p&gt;

&lt;h2&gt;
  
  
  Plan-based and token-based pricing (no stated per-call price)
&lt;/h2&gt;

&lt;p&gt;These vendors don't publish a single per-call price, so they're left out of the tables above. The effective prices below are &lt;strong&gt;our arithmetic&lt;/strong&gt; from their published plans, and they assume you use the whole monthly quota.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;SerpAPI&lt;/strong&gt; (&lt;a href="https://serpapi.com/pricing" rel="noopener noreferrer"&gt;serpapi.com/pricing&lt;/a&gt;): monthly plans. Starter is $25 a month for 1,000 searches (≈$0.025 per search if you use all of them). The free plan includes 250 searches a month.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Firecrawl&lt;/strong&gt; (&lt;a href="https://www.firecrawl.dev/pricing" rel="noopener noreferrer"&gt;firecrawl.dev/pricing&lt;/a&gt;): credits. Hobby is $19 a month for 5,000 credits billed monthly, which the page equates to 2,500 searches (≈$0.0076 per search) or 5,000 scraped pages (≈$0.0038 per page).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Jina Reader&lt;/strong&gt; (&lt;a href="https://jina.ai/reader/" rel="noopener noreferrer"&gt;jina.ai/reader&lt;/a&gt;): billed by tokens, not requests. Search (&lt;code&gt;s.jina.ai&lt;/code&gt;) costs "a fixed number of tokens, starting from 10,000 tokens" per request. The page doesn't state a per-request dollar price, so we can't compare it directly.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The real cost for an agent: a worked example
&lt;/h2&gt;

&lt;p&gt;Take a research agent that runs one search and reads the top 2 pages on each task, 1,000 times a month. Using the stated prices above:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Approach&lt;/th&gt;
&lt;th&gt;Calls per task&lt;/th&gt;
&lt;th&gt;Cost per 1,000 tasks&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;AgentSearch search + 2 extracts&lt;/td&gt;
&lt;td&gt;3 calls&lt;/td&gt;
&lt;td&gt;$15.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Exa &lt;code&gt;instant&lt;/code&gt; search + 2 Contents pages&lt;/td&gt;
&lt;td&gt;1 search + 2 pages&lt;/td&gt;
&lt;td&gt;$4.00 + $2.00 = $6.00&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Exa also gives $10 of free credits a month, which can bring a small workload down to $0. &lt;strong&gt;At small scale, free tiers can matter more than the per-call price&lt;/strong&gt;; at any scale, AgentSearch needs no signup, plan or prepaid balance.&lt;/p&gt;

&lt;h2&gt;
  
  
  So what's the cheapest web search API for AI agents?
&lt;/h2&gt;

&lt;p&gt;It depends on what you're optimizing for:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Lowest sticker price per search at volume:&lt;/strong&gt; Exa &lt;code&gt;instant&lt;/code&gt; ($0.004) on the pages we checked.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lowest per-page extraction price:&lt;/strong&gt; Exa Contents ($0.001).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lowest cost to start, with no commitment:&lt;/strong&gt; AgentSearch. There's no account, API key, subscription or minimum. You pay $0.005 per search or extract call in USDC, over &lt;a href="https://agent.pocket.network/agent-integration" rel="noopener noreferrer"&gt;x402 on Base or MPP on Tempo&lt;/a&gt;. For an autonomous agent that holds its own wallet, that means there's no human signup step.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Try AgentSearch
&lt;/h2&gt;

&lt;p&gt;In an MCP client, add &lt;code&gt;npx -y @pocket-network/agentic-portal-mcp&lt;/code&gt; and set a spending cap. The &lt;a href="https://agentsearchhq.com/blog/mcp-web-search-for-ai-agents?utm_source=devto&amp;amp;utm_medium=social&amp;amp;utm_campaign=cheapest-web-search-api-for-ai-agents-2026" rel="noopener noreferrer"&gt;MCP setup guide&lt;/a&gt; walks through it. From code, any standard x402 v2 client works:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;wrapFetchWithPaymentFromConfig&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@x402/fetch&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;ExactEvmScheme&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@x402/evm&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;privateKeyToAccount&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;viem/accounts&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;account&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;privateKeyToAccount&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;AGENT_WALLET_KEY&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="s2"&gt;`0x&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;pay&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;wrapFetchWithPaymentFromConfig&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;schemes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt; &lt;span class="na"&gt;network&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;eip155:8453&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;client&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ExactEvmScheme&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;account&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;}],&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;pay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://agent.pocket.network/v1/agentsearch-web-search-v1/v1/search&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;content-type&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;application/json&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;query&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;x402 v2 PAYMENT-SIGNATURE header&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;max_results&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="p"&gt;}),&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;portal&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;portal&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;serviceId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;results&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;any&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If delivery fails, the portal settles nothing, so you aren't charged for it.&lt;/p&gt;

&lt;p&gt;The full walkthrough is in &lt;a href="https://agentsearchhq.com/blog/mcp-web-search-for-ai-agents?utm_source=devto&amp;amp;utm_medium=social&amp;amp;utm_campaign=cheapest-web-search-api-for-ai-agents-2026" rel="noopener noreferrer"&gt;How to give your AI agent web search with MCP&lt;/a&gt;. Extraction is covered in &lt;a href="https://agentsearchhq.com/blog/url-to-markdown-for-rag?utm_source=devto&amp;amp;utm_medium=social&amp;amp;utm_campaign=cheapest-web-search-api-for-ai-agents-2026" rel="noopener noreferrer"&gt;Turn any URL into clean markdown for RAG&lt;/a&gt;. Service details: &lt;a href="https://agentsearchhq.com/search?utm_source=devto&amp;amp;utm_medium=social&amp;amp;utm_campaign=cheapest-web-search-api-for-ai-agents-2026" rel="noopener noreferrer"&gt;search&lt;/a&gt;, &lt;a href="https://agentsearchhq.com/extract?utm_source=devto&amp;amp;utm_medium=social&amp;amp;utm_campaign=cheapest-web-search-api-for-ai-agents-2026" rel="noopener noreferrer"&gt;extract&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources (all checked 2026-10-02)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;AgentSearch Web Search: &lt;a href="https://agent.pocket.network/services/agentsearch-web-search-v1" rel="noopener noreferrer"&gt;https://agent.pocket.network/services/agentsearch-web-search-v1&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;AgentSearch Web Extract: &lt;a href="https://agent.pocket.network/services/agentsearch-web-extract-v1" rel="noopener noreferrer"&gt;https://agent.pocket.network/services/agentsearch-web-extract-v1&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Exa: &lt;a href="https://exa.ai/pricing" rel="noopener noreferrer"&gt;https://exa.ai/pricing&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;SerpAPI: &lt;a href="https://serpapi.com/pricing" rel="noopener noreferrer"&gt;https://serpapi.com/pricing&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Firecrawl: &lt;a href="https://www.firecrawl.dev/pricing" rel="noopener noreferrer"&gt;https://www.firecrawl.dev/pricing&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Jina Reader: &lt;a href="https://jina.ai/reader/" rel="noopener noreferrer"&gt;https://jina.ai/reader/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Spotted a price that has changed? Tell us and we'll update the table and the "checked" date.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  More from the blog
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://agentsearchhq.com/blog/mcp-web-search-for-ai-agents?utm_source=devto&amp;amp;utm_medium=social&amp;amp;utm_campaign=cheapest-web-search-api-for-ai-agents-2026" rel="noopener noreferrer"&gt;Add Web Search to Your AI Agent with MCP (2026 Guide)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://agentsearchhq.com/blog/url-to-markdown-for-rag?utm_source=devto&amp;amp;utm_medium=social&amp;amp;utm_campaign=cheapest-web-search-api-for-ai-agents-2026" rel="noopener noreferrer"&gt;Turn Any URL into Clean Markdown for RAG (API Guide)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Service pages: &lt;a href="https://agentsearchhq.com/search?utm_source=devto&amp;amp;utm_medium=social&amp;amp;utm_campaign=cheapest-web-search-api-for-ai-agents-2026" rel="noopener noreferrer"&gt;Web Search API&lt;/a&gt; · &lt;a href="https://agentsearchhq.com/extract?utm_source=devto&amp;amp;utm_medium=social&amp;amp;utm_campaign=cheapest-web-search-api-for-ai-agents-2026" rel="noopener noreferrer"&gt;Web Extract API&lt;/a&gt; · &lt;a href="https://agentsearchhq.com/render?utm_source=devto&amp;amp;utm_medium=social&amp;amp;utm_campaign=cheapest-web-search-api-for-ai-agents-2026" rel="noopener noreferrer"&gt;Web Render API&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Originally published at &lt;a href="https://agentsearchhq.com/blog/cheapest-web-search-api-for-ai-agents-2026?utm_source=devto&amp;amp;utm_medium=social&amp;amp;utm_campaign=cheapest-web-search-api-for-ai-agents-2026" rel="noopener noreferrer"&gt;agentsearchhq.com&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>api</category>
      <category>webdev</category>
      <category>llm</category>
    </item>
    <item>
      <title>Add Web Search to Your AI Agent with MCP (2026 Guide)</title>
      <dc:creator>AgentSearch</dc:creator>
      <pubDate>Fri, 02 Oct 2026 23:47:44 +0000</pubDate>
      <link>https://dev.to/agentsearchhq/add-web-search-to-your-ai-agent-with-mcp-2026-guide-37n2</link>
      <guid>https://dev.to/agentsearchhq/add-web-search-to-your-ai-agent-with-mcp-2026-guide-37n2</guid>
      <description>&lt;p&gt;Language models stop learning on their training cutoff date. An agent that has to answer "what changed in this library last week?" or "what does this vendor charge today?" needs a tool that can search the live web and read the pages it finds. The &lt;strong&gt;Model Context Protocol (MCP)&lt;/strong&gt; is the standard way to give it one.&lt;/p&gt;

&lt;p&gt;This guide connects an MCP client (Claude Desktop, Cursor, Claude Code, or anything else that speaks MCP) to &lt;a href="https://agentsearchhq.com/?utm_source=devto&amp;amp;utm_medium=social&amp;amp;utm_campaign=mcp-web-search-for-ai-agents" rel="noopener noreferrer"&gt;AgentSearch&lt;/a&gt; web search and URL extraction. It takes about five minutes. There's no account to create and no API key to manage: each call is paid in USDC through the Pocket Network Agentic Portal.&lt;/p&gt;

&lt;h2&gt;
  
  
  What you'll set up
&lt;/h2&gt;

&lt;p&gt;AgentSearch runs two services on &lt;a href="https://agentsearchhq.com/llms.txt?utm_source=devto&amp;amp;utm_medium=social&amp;amp;utm_campaign=mcp-web-search-for-ai-agents" rel="noopener noreferrer"&gt;Pocket Network&lt;/a&gt; that matter for this guide:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Service&lt;/th&gt;
&lt;th&gt;Service ID&lt;/th&gt;
&lt;th&gt;What it returns&lt;/th&gt;
&lt;th&gt;Price per call&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Web Search&lt;/td&gt;
&lt;td&gt;&lt;code&gt;agentsearch-web-search-v1&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Structured JSON for up to 5 results: title, URL, snippet, score, domain and date for each one&lt;/td&gt;
&lt;td&gt;$0.005&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Web Extract&lt;/td&gt;
&lt;td&gt;&lt;code&gt;agentsearch-web-extract-v1&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Clean markdown or text of one URL, plus its title, links and fetch metadata&lt;/td&gt;
&lt;td&gt;$0.005&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Both prices come from the service pages on the Pocket Agentic Portal (&lt;a href="https://agent.pocket.network/services/agentsearch-web-search-v1" rel="noopener noreferrer"&gt;search&lt;/a&gt;, &lt;a href="https://agent.pocket.network/services/agentsearch-web-extract-v1" rel="noopener noreferrer"&gt;extract&lt;/a&gt;). You pay in USDC over &lt;strong&gt;x402&lt;/strong&gt; on Base, or over &lt;strong&gt;MPP&lt;/strong&gt; on Tempo.&lt;/p&gt;

&lt;p&gt;You'll install one MCP server, &lt;code&gt;@pocket-network/agentic-portal-mcp&lt;/code&gt;, Pocket's local MCP server for the Agentic Portal. It's listed in the official MCP Registry as &lt;code&gt;network.pocket/agentic-portal-mcp&lt;/code&gt;. Pocket's full instructions are at &lt;a href="https://agent.pocket.network/agent-integration" rel="noopener noreferrer"&gt;agent.pocket.network/agent-integration&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why a local server holds the wallet
&lt;/h3&gt;

&lt;p&gt;MCP clients can't pay for tools on their own yet. So the portal's MCP server runs on your machine, keeps the paying wallet's key there, and signs an x402 payment only when a call fits inside the spending limits you set. The portal never holds your key.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Node.js 20 or newer, so &lt;code&gt;npx&lt;/code&gt; is available.&lt;/li&gt;
&lt;li&gt;An MCP client: Claude Desktop, Cursor, Claude Code or similar.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A dedicated wallet&lt;/strong&gt; holding a small amount of USDC on Base. Pocket's docs are blunt about this: the key sits in a plain-text config file, so use a wallet made for this purpose that holds only what you're willing to spend.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step 1: Add the MCP server to your client
&lt;/h2&gt;

&lt;p&gt;Open your client's MCP config file:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Claude Desktop: &lt;code&gt;claude_desktop_config.json&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Cursor: &lt;code&gt;.cursor/mcp.json&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Claude Code: &lt;code&gt;.mcp.json&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then add the server, which runs &lt;code&gt;npx -y @pocket-network/agentic-portal-mcp&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"pocket-network"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"-y"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"@pocket-network/agentic-portal-mcp"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"env"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"POCKET_PRIVATE_KEY"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0x…"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"POCKET_MAX_TOTAL_ATOMIC"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1000000"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Put settings in the &lt;code&gt;env&lt;/code&gt; block. Desktop clients start MCP servers without your shell's environment, so a variable you &lt;code&gt;export&lt;/code&gt; in a terminal won't reach the server.&lt;/p&gt;

&lt;h3&gt;
  
  
  Set spending limits before you do anything else
&lt;/h3&gt;

&lt;p&gt;The server checks every limit before it signs, and signs nothing unless all of them allow the payment. USDC has 6 decimals, so amounts are in atomic units and &lt;code&gt;1000000&lt;/code&gt; = $1.00.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Variable&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;POCKET_MAX_TOTAL_ATOMIC&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The most the server will sign for in total while it runs. &lt;strong&gt;Required to pay.&lt;/strong&gt; &lt;code&gt;1000000&lt;/code&gt; ($1.00) covers 200 AgentSearch calls at $0.005 each.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;POCKET_MAX_PER_CALL_ATOMIC&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The most it will pay for any one call. Set it to &lt;code&gt;5000&lt;/code&gt; ($0.005) so the agent can only buy calls priced at $0.005 or less.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;POCKET_NETWORK&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The only network it signs on. The default is Base, &lt;code&gt;eip155:8453&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;POCKET_QUOTE_ONLY&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Set to &lt;code&gt;true&lt;/code&gt; and the server returns the seller's terms but never pays. Good for a dry run.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Pocket also warns that you shouldn't count on the client asking before it pays: in their testing, one client's model asked first and another paid without asking. These limits are what protect you either way.&lt;/p&gt;

&lt;p&gt;A cautious first config:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"pocket-network"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"-y"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"@pocket-network/agentic-portal-mcp"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"env"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"POCKET_PRIVATE_KEY"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0x…"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"POCKET_MAX_TOTAL_ATOMIC"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"250000"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"POCKET_MAX_PER_CALL_ATOMIC"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"5000"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"POCKET_QUOTE_ONLY"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"true"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Restart the client after you save. Remove &lt;code&gt;POCKET_QUOTE_ONLY&lt;/code&gt; when you're ready to make real calls.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: Find AgentSearch through the free tools
&lt;/h2&gt;

&lt;p&gt;The server exposes three tools:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;th&gt;Cost&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;search_services&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Searches the portal catalogue by keyword and category&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;describe_service&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Shows one service's price, operations, schemas and a real captured example&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;call_service&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Calls a service and pays its price&lt;/td&gt;
&lt;td&gt;The service's price&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;If you leave out the private key, only the free tools work, which is a safe way to look around. Try a prompt like this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Use search_services to find "agentsearch". Then describe_service for agentsearch-web-search-v1 and tell me its price and request schema.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You should see &lt;code&gt;$0.005&lt;/code&gt; and a &lt;code&gt;POST /v1/search&lt;/code&gt; operation that takes a &lt;code&gt;query&lt;/code&gt; and an optional &lt;code&gt;max_results&lt;/code&gt; (up to 5).&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Run a paid search
&lt;/h2&gt;

&lt;p&gt;Now ask for something that needs fresh information:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Use call_service on agentsearch-web-search-v1 to search for "x402 payment protocol v2 headers", then summarize the top results with their URLs.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Under the hood, the agent sends the same request you could send yourself:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://agent.pocket.network/v1/agentsearch-web-search-v1/v1/search &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s1"&gt;'content-type: application/json'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"query":"x402 payment protocol v2 headers","max_results":5}'&lt;/span&gt;
&lt;span class="c"&gt;# The first response is 402 Payment Required with the terms.&lt;/span&gt;
&lt;span class="c"&gt;# The MCP server signs them and retries the same request with the payment attached.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The result comes back in the portal's &lt;strong&gt;envelope&lt;/strong&gt;. Fields set by the portal sit under &lt;code&gt;portal&lt;/code&gt;, and the supplier's untouched response sits under &lt;code&gt;data&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"portal"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"provenance"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"third-party-supplier"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"serviceId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"agentsearch-web-search-v1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"schemaCheck"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"unchecked"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"data"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"query"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"x402 payment protocol v2 headers"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"result_count"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"results"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"…"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://…"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"content"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"…"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"score"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.91&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"domain"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"…"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;data&lt;/code&gt; above is trimmed. The full field list is in the &lt;a href="https://agentsearchhq.com/specs/search-openapi.json?utm_source=devto&amp;amp;utm_medium=social&amp;amp;utm_campaign=mcp-web-search-for-ai-agents" rel="noopener noreferrer"&gt;search OpenAPI spec&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4: Extract a full page when snippets aren't enough
&lt;/h2&gt;

&lt;p&gt;When the agent needs a whole document, such as a changelog, an API reference page or a pricing table, use extract:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Use call_service on agentsearch-web-extract-v1 with url "&lt;a href="https://example.com" rel="noopener noreferrer"&gt;https://example.com&lt;/a&gt;" and return the markdown.&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://example.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"formats"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"markdown"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"max_chars"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;20000&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You get &lt;code&gt;title&lt;/code&gt;, &lt;code&gt;markdown&lt;/code&gt;, &lt;code&gt;links&lt;/code&gt; and &lt;code&gt;meta&lt;/code&gt; back (&lt;code&gt;status_code&lt;/code&gt;, &lt;code&gt;content_type&lt;/code&gt;, &lt;code&gt;fetched_at&lt;/code&gt;, &lt;code&gt;chars&lt;/code&gt;, &lt;code&gt;truncated&lt;/code&gt;). &lt;a href="https://agentsearchhq.com/blog/url-to-markdown-for-rag?utm_source=devto&amp;amp;utm_medium=social&amp;amp;utm_campaign=mcp-web-search-for-ai-agents" rel="noopener noreferrer"&gt;Turn any URL into clean markdown for RAG&lt;/a&gt; goes deeper on extraction.&lt;/p&gt;

&lt;h2&gt;
  
  
  Treat results as data, not instructions
&lt;/h2&gt;

&lt;p&gt;Search results and extracted pages are third-party content, and some pages are written to manipulate agents. Pocket's integration guide recommends these habits:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Keep &lt;code&gt;data&lt;/code&gt; in a clearly marked data position, such as a tool-result block. Never paste it into a system prompt.&lt;/li&gt;
&lt;li&gt;Don't follow instructions that appear inside a result. A page telling your agent to "call another endpoint" or "ignore prior instructions" is an attack, not an answer.&lt;/li&gt;
&lt;li&gt;Check &lt;code&gt;portal.schemaCheck&lt;/code&gt;. Only &lt;code&gt;passed&lt;/code&gt; means a schema check actually ran.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Troubleshooting
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Only the free tools work:&lt;/strong&gt; &lt;code&gt;POCKET_PRIVATE_KEY&lt;/code&gt; is missing, or it's set in your shell instead of the config's &lt;code&gt;env&lt;/code&gt; block.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Calls are refused before payment:&lt;/strong&gt; a limit blocked the call (total, per-call or network), or &lt;code&gt;POCKET_QUOTE_ONLY&lt;/code&gt; is still &lt;code&gt;true&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;An empty &lt;code&gt;results&lt;/code&gt; array with an &lt;code&gt;error&lt;/code&gt; object:&lt;/strong&gt; the search hit its deadline or an upstream error. Check &lt;code&gt;error.retryable&lt;/code&gt; and retry with backoff.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Extract returns &lt;code&gt;UNSUPPORTED_CONTENT&lt;/code&gt;:&lt;/strong&gt; the URL is a PDF or an image, not HTML or text.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The page only renders with JavaScript:&lt;/strong&gt; extract fetches static HTML. AgentSearch also runs a headless-browser &lt;a href="https://agentsearchhq.com/render?utm_source=devto&amp;amp;utm_medium=social&amp;amp;utm_campaign=mcp-web-search-for-ai-agents" rel="noopener noreferrer"&gt;Web Render&lt;/a&gt; service (&lt;code&gt;agentsearch-web-render-v1&lt;/code&gt;, live on Pocket MainNet). It isn't on the Agentic Portal yet.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Do I need an AgentSearch account or API key?&lt;/strong&gt;&lt;br&gt;
No. You pay per call in USDC through the Agentic Portal, over x402 (Base) or MPP (Tempo).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Which MCP clients work?&lt;/strong&gt;&lt;br&gt;
Any client that can launch a local stdio MCP server, including Claude Desktop, Cursor and Claude Code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Who runs the infrastructure?&lt;/strong&gt;&lt;br&gt;
AgentSearch is served by decentralized Pocket Network suppliers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Next steps
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Compare costs in &lt;a href="https://agentsearchhq.com/blog/cheapest-web-search-api-for-ai-agents-2026?utm_source=devto&amp;amp;utm_medium=social&amp;amp;utm_campaign=mcp-web-search-for-ai-agents" rel="noopener noreferrer"&gt;Cheapest web search API for AI agents in 2026&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Read the machine-readable docs at &lt;a href="https://agentsearchhq.com/llms.txt?utm_source=devto&amp;amp;utm_medium=social&amp;amp;utm_campaign=mcp-web-search-for-ai-agents" rel="noopener noreferrer"&gt;agentsearchhq.com/llms.txt&lt;/a&gt; and &lt;a href="https://agentsearchhq.com/agents.md?utm_source=devto&amp;amp;utm_medium=social&amp;amp;utm_campaign=mcp-web-search-for-ai-agents" rel="noopener noreferrer"&gt;agentsearchhq.com/agents.md&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;See the service pages for &lt;a href="https://agentsearchhq.com/search?utm_source=devto&amp;amp;utm_medium=social&amp;amp;utm_campaign=mcp-web-search-for-ai-agents" rel="noopener noreferrer"&gt;search&lt;/a&gt;, &lt;a href="https://agentsearchhq.com/extract?utm_source=devto&amp;amp;utm_medium=social&amp;amp;utm_campaign=mcp-web-search-for-ai-agents" rel="noopener noreferrer"&gt;extract&lt;/a&gt; and &lt;a href="https://agentsearchhq.com/render?utm_source=devto&amp;amp;utm_medium=social&amp;amp;utm_campaign=mcp-web-search-for-ai-agents" rel="noopener noreferrer"&gt;render&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Browse the OpenAPI specs for &lt;a href="https://agentsearchhq.com/specs/search-openapi.json?utm_source=devto&amp;amp;utm_medium=social&amp;amp;utm_campaign=mcp-web-search-for-ai-agents" rel="noopener noreferrer"&gt;search&lt;/a&gt; and &lt;a href="https://agentsearchhq.com/specs/extract-openapi.json?utm_source=devto&amp;amp;utm_medium=social&amp;amp;utm_campaign=mcp-web-search-for-ai-agents" rel="noopener noreferrer"&gt;extract&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  More from the blog
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://agentsearchhq.com/blog/cheapest-web-search-api-for-ai-agents-2026?utm_source=devto&amp;amp;utm_medium=social&amp;amp;utm_campaign=mcp-web-search-for-ai-agents" rel="noopener noreferrer"&gt;Cheapest Web Search API for AI Agents in 2026&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://agentsearchhq.com/blog/url-to-markdown-for-rag?utm_source=devto&amp;amp;utm_medium=social&amp;amp;utm_campaign=mcp-web-search-for-ai-agents" rel="noopener noreferrer"&gt;Turn Any URL into Clean Markdown for RAG (API Guide)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Service pages: &lt;a href="https://agentsearchhq.com/search?utm_source=devto&amp;amp;utm_medium=social&amp;amp;utm_campaign=mcp-web-search-for-ai-agents" rel="noopener noreferrer"&gt;Web Search API&lt;/a&gt; · &lt;a href="https://agentsearchhq.com/extract?utm_source=devto&amp;amp;utm_medium=social&amp;amp;utm_campaign=mcp-web-search-for-ai-agents" rel="noopener noreferrer"&gt;Web Extract API&lt;/a&gt; · &lt;a href="https://agentsearchhq.com/render?utm_source=devto&amp;amp;utm_medium=social&amp;amp;utm_campaign=mcp-web-search-for-ai-agents" rel="noopener noreferrer"&gt;Web Render API&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Originally published at &lt;a href="https://agentsearchhq.com/blog/mcp-web-search-for-ai-agents?utm_source=devto&amp;amp;utm_medium=social&amp;amp;utm_campaign=mcp-web-search-for-ai-agents" rel="noopener noreferrer"&gt;agentsearchhq.com&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>mcp</category>
      <category>tutorial</category>
      <category>llm</category>
    </item>
  </channel>
</rss>
