API 参考

一个接口,一件事:POST api.serpdive.com/v1/search 接收一个问题,返回可直接用于回答的网页内容——已提取、已清洗,并按 LLM 的用量裁剪。本页就是 API 的全部:这里没有的,你也不需要。
给 AI 智能体:/zh/docs.md·/llms.txt·/openapi.json整份参考文档,一次请求即可取回。

01快速上手

控制台获取一个 API 密钥(免费额度:每月 1,000 点,无需绑卡),安装对应语言的官方 SDK,然后开始搜索:

Python
# pip install serpdive
from serpdive import SerpDive

client = SerpDive()  # reads SERPDIVE_API_KEY
response = client.search("what happened between Trump and FIFA", answer=True)

print(response.answer)
for result in response.results:
    print(result.url, result.date, result.content)
TypeScript
// npm install serpdive
import { SerpDive } from "serpdive";

const client = new SerpDive(); // reads SERPDIVE_API_KEY
const response = await client.search("what happened between Trump and FIFA", {
  answer: true,
});

console.log(response.answer);
for (const result of response.results) {
  console.log(result.url, result.date, result.content);
}

想直接用 HTTPS?整个集成就是一次 POST,任何语言都可以:

cURL
curl -X POST https://api.serpdive.com/v1/search \
  -H "Authorization: Bearer $SERPDIVE_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "query": "what happened between Trump and FIFA",
        "model": "mako" }'

调试台会用你自己的密钥生成这些代码片段,并在旁边展示真实的响应结果。

02官方 SDK

两个官方客户端,刻意做得很薄:它们严格遵循 /v1/search 的契约,只增加类型和重试,别无其他。

语言安装源码
Python 3.9+pip install serpdiveserpdive/serpdive-python
TypeScript / JavaScriptnpm install serpdiveserpdive/serpdive-js

两者都会从环境变量 SERPDIVE_API_KEY 读取密钥(也可以显式传入),返回带类型的响应,抛出带类型的错误(携带错误表中的稳定错误码),并对瞬时故障(502/503自动重试——这始终是安全的,因为失败的搜索从不计费。

Python 客户端提供同步(SerpDive)与异步(AsyncSerpDive)两种形式。TypeScript 客户端零依赖,只要有 fetch 就能运行:Node 18+、Bun、Deno 以及各类边缘运行时。

03MCP 服务器

SERPdive 同时提供托管的 MCP 服务器,地址为 https://mcp.serpdive.com:只有一个工具 serpdive_search,让 Claude Code、Claude Desktop、Cursor 以及任何其他 MCP 客户端获得与 API 完全相同的、已提取且可直接回答的网页结果。无需安装,无需自行运行任何东西。

Claude Code
claude mcp add --transport http serpdive https://mcp.serpdive.com \
  --header "Authorization: Bearer sd_live_YOUR_KEY"
JSON config
{
  "mcpServers": {
    "serpdive": {
      "url": "https://mcp.serpdive.com/?key=sd_live_YOUR_KEY"
    }
  }
}

认证用的就是你平时的 API 密钥:既可以放在 Authorization: Bearer 请求头里,也可以对只接受 URL 的客户端,作为服务器地址上的 ?key= 参数传入。通过 MCP 发起的搜索与 API 调用完全同价,消耗相同额度,受相同的速率限制约束。

04认证

每个请求都在 Authorization 请求头中携带密钥:Bearer sd_live_…。密钥在 API 密钥页面创建、查看和吊销;吊销立即生效。创建时可以为密钥设置过期日期(过期后不再通过认证,返回与已吊销密钥相同的 401),也可以为它单独设置每月额度上限——当你要把密钥部署到自己无法完全掌控的地方时,这是一道护栏。缺失、过期或未知的密钥会得到 401,错误码为 missing_api_keyinvalid_api_key:搜索根本不会执行,也不会产生任何费用。

05LangChain

官方包:`langchain-serpdive`。一个工具类,同步异步皆可,基于 Python SDK 构建。

Python
# pip install langchain-serpdive
from langchain_serpdive import SerpdiveSearch

tool = SerpdiveSearch()  # reads SERPDIVE_API_KEY
tool.invoke({"query": "latest developments in solid state batteries"})

# or hand [SerpdiveSearch()] to any LangChain / LangGraph agent as its tools list

06LlamaIndex

官方包:`llama-index-tools-serpdive`。结果以 Document 形式返回(正文为提取出的网页内容,元数据为 url/title/date),可直接用于智能体或 RAG 流水线。

Python
# pip install llama-index-tools-serpdive
from llama_index_tools_serpdive import SerpdiveToolSpec

spec = SerpdiveToolSpec()  # reads SERPDIVE_API_KEY
documents = spec.serpdive_search("latest developments in solid state batteries")

# in an agent: tools=SerpdiveToolSpec().to_tool_list()

07Vercel AI SDK

TypeScript SDK 可以直接接入 AI SDK 的工具:由模型决定何时搜索,返回的内容已经是适合 LLM 的体量。

TypeScript
// npm install ai serpdive zod
import { generateText, tool, stepCountIs } from "ai";
import { z } from "zod";
import { SerpDive } from "serpdive";

const serpdive = new SerpDive(); // reads SERPDIVE_API_KEY

const { text } = await generateText({
  model: "anthropic/claude-sonnet-5",
  prompt: "What changed in the EU AI Act this month?",
  stopWhen: stepCountIs(5),
  tools: {
    serpdive_search: tool({
      description:
        "Search the live web for current information. Returns extracted, " +
        "answer-ready page content (url, title, date, text), not links.",
      inputSchema: z.object({
        query: z.string().describe("The search, in any language"),
      }),
      execute: async ({ query }) => serpdive.search(query),
    }),
  },
});

08OpenAI 函数调用

不需要额外的包:声明函数,在模型调用时执行搜索,再把 JSON 结果回传即可。

Python
# pip install openai serpdive
import json
from openai import OpenAI
from serpdive import SerpDive

client, serpdive = OpenAI(), SerpDive()

tools = [{
    "type": "function",
    "name": "serpdive_search",
    "description": "Search the live web for current information. Returns "
                   "extracted, answer-ready page content, not links.",
    "parameters": {
        "type": "object",
        "properties": {"query": {"type": "string"}},
        "required": ["query"],
    },
}]

response = client.responses.create(
    model="gpt-5", input="What changed in the EU AI Act this month?", tools=tools
)
for item in response.output:
    if item.type == "function_call":
        result = serpdive.search(json.loads(item.arguments)["query"])
        # send result.raw back as the function_call_output, then re-run

09Anthropic 工具调用

在 Claude API 上是同样的思路——或者干脆跳过这些管道:Claude 客户端可以直接使用我们托管的 MCP 服务器

Python
# pip install anthropic serpdive
import anthropic
from serpdive import SerpDive

client, serpdive = anthropic.Anthropic(), SerpDive()

tools = [{
    "name": "serpdive_search",
    "description": "Search the live web for current information. Returns "
                   "extracted, answer-ready page content, not links.",
    "input_schema": {
        "type": "object",
        "properties": {"query": {"type": "string"}},
        "required": ["query"],
    },
}]

message = client.messages.create(
    model="claude-sonnet-5",
    max_tokens=1024,
    tools=tools,
    messages=[{"role": "user", "content": "What changed in the EU AI Act this month?"}],
)
for block in message.content:
    if block.type == "tool_use":
        result = serpdive.search(block.input["query"])
        # send result.raw back as a tool_result block, then re-run

10请求

POST /v1/search,请求体为 JSON。四个参数,其余的我们替你决定:

参数类型说明
querystring,必填你想问的问题,怎么问就怎么写。最长 300 个字符;超出部分会被截断,而不是报错。
model"krill" | "mako" | "moby"检索深度。krill(免费,合理使用下不限量)返回最短的可用句子集合(约 700 tokens,来源更少),以低优先级处理,且不含 answer 字段;mako(默认)返回每个来源中承载事实的句子;moby 返回每个页面完整的可读正文。无法识别的取值会回退到 mako
answerboolean按需生成的直接回答。设为 true 会附带一段基于来源写成的答案:Mako 上简明扼要,Moby 上更详尽并带 [n] 引用标注。价格已包含在内,绝不额外扣额度;预计会多花几百毫秒。Krill 从不生成答案——在它上面这个字段会被忽略。
max_resultsinteger,1–10对返回结果数量的硬上限,保留排名最靠前的那些。它会裁剪响应体——以及你下游的 token 账单——但不会让搜索更快:引擎始终完整读取一遍。不传时,引擎会返回它认为相关的全部结果。

本地化是自动的。 由查询语句的语言决定我们去哪里搜索:德语查询搜德语网页,日语查询搜日语网页,与调用方是谁、身在何处无关。没有国家参数可设。

请把客户端超时设得宽裕些。 Mako 几秒内返回;Moby 要通读整页,遇到内容繁重的来源会明显更久。我们建议客户端超时设为 80 秒——我们自己的调试台就是这么设的。

11响应

搜索成功时返回 200,结构永远如下,不会有别的:

200 OK
{
  "query": "what happened between Trump and FIFA",
  "model": "mako",
  "response_time_ms": 2641,
  "results": [
    {
      "url": "https://www.reuters.com/sports/soccer/…",
      "title": "Trump, FIFA's Infantino unveil …",
      "date": "2026-07-11",
      "content": "The announcement came during a joint press conference … [the fact-carrying sentences of the page]"
    },
    {
      "url": "https://www.bbc.com/sport/football/…",
      "title": "What the deal means for the 2026 World Cup",
      "content": "…"
    }
  ]
}
字段类型说明
querystring原样回显你的查询。
modelstring实际作答的模型:krillmakomoby
response_time_msnumber我们实际耗费的时间,单位毫秒。
answerstring | null写成文字的答案。仅当你传了 answer: true 时出现;若无法从来源中构建出答案,则为 null
extra_infoobject结构化的直接答案块,仅当查询本身带有这类答案时出现:天气、汇率、词条释义、实时比分等。其 type 字段说明属于哪一类。
resultsarray提取出的来源,最相关的在前。每一项包含 urltitlecontent(提取结果:Mako 上是句子,Moby 上是完整可读页面),已知发布日期时还有 date——始终是 ISO 格式 YYYY-MM-DD,未知时该字段直接不存在。

结果只包含真实的页面提取内容:读取失败的来源直接不出现,不会用摘要凑数,也没有占位符。URL 中的追踪参数(utm_*、点击 ID 等)会被清除,所以你引用的链接是干净的。

请求带上答案时是这样的:

Request with answer
{ "query": "who won the 2026 Champions League final",
  "model": "moby",
  "answer": true }

12错误

每次失败都会返回一个含两个字段的 JSON:error 是稳定的、可供程序识别的错误码,message 是一句给人看的说明,告诉你该怎么办:

401 Unauthorized
{
  "error": "invalid_api_key",
  "message": "This API key is invalid or was revoked. Manage your keys at https://serpdive.com/dashboard/keys"
}
状态码错误码含义
400invalid_json请求体不是合法的 JSON。
400missing_query请求体里没有 query
401missing_api_key / invalid_api_keyAuthorization 请求头中没有可用的密钥。
429rate_limit_exceeded超过每秒 5 次或每分钟 200 次。请遵守 retry-after 响应头并放慢速度。
429monthly_quota_exceeded本月额度已用尽(若使用按量付费,则是达到了你在账单页设置的消费上限);额度会在你的月度周期续期时恢复(以注册日或账单日为准)。被拦下的调用不计费。
429key_limit_exceeded这个密钥达到了它创建时设定的每月额度上限;月度周期续期后恢复。其他密钥不受影响。被拦下的调用不计费。
429too_many_concurrent_requests该账户同时在途的搜索过多:Krill 为 1 个,Mako 与 Moby 为 5 个。这限制的是同时进行的工作量,而不是请求到达的频率——等其中一个返回后再重试即可。不计费。
502search_failed搜索未能完成。可以安全地重试。
503server_busy瞬时满载。503 会带上 retry-after 响应头:请遵守它,然后重试。

失败的搜索从不计费。 任何非 200 的响应都消耗 0 额度,无论原因为何。

13Krill、Mako 与 Moby

模型费用你会得到什么
krill免费免费档,合理使用下不限量:最短的可用集合(约 700 tokens,来源更少),不含写成文字的答案,同一时间只能跑一个搜索,以低优先级处理。当 token 预算比深度更重要时,用它。
mako1 点额度为智能体准备的精简默认档:只保留每个来源中承载事实的句子(总计约 1k tokens),几秒内作答。若请求答案,会是一段简明的文字。
moby1.5 点额度深度通读:每个来源完整的可读正文(最多约 15k tokens),适合下游模型需要完整来龙去脉的场景。若请求答案,会更详尽并带 [n] 引用标注。

经验法则:先用 Mako。当任务是综合归纳时再上 Moby——简报、对比,以及任何漏掉一段就会改变结论的场景。Krill 适合有量但没有预算的情况:它能回答大多数问题,只是来源更少,也不写成文字的答案。

14额度与限制

一次 Krill 搜索是免费的,且完全不占用你的额度——正是这一点让它得以“不限量”。一次 Mako 搜索消耗 1 点额度,一次 Moby 搜索消耗 1.5 点。answer 始终包含在内,失败不收费。每个账户每月获得 1,000 点额度;额度按你的注册日(付费方案则按账单日)每月续期,且不累积到下月。实时用量见用量页面,方案与价格见账单页面。

当月额度用尽后,后续请求会返回 429 monthly_quota_exceeded,直到额度重置为止;被拦下的调用从不计费。在按量付费下默认没有月度上限——用量会被计量,并在每个账单周期结束时开票;你可以在账单页面设置一个可选的每月消费上限,超出后请求同样会返回 429,行为与额度用尽一致。若某个密钥创建时带有自己的月度上限,用满后会返回 429 key_limit_exceeded——你其余的密钥照常工作。速率限制为每秒 5 次、每分钟 200 次,所有方案一致;超出后请求返回 429 rate_limit_exceeded 并带 retry-after 响应头,且不计费。此外,同一账户同时在途的搜索最多 Mako 与 Moby 各 5 个、Krill 1 个——这限制的是同时进行的工作量而非请求频率,超出会返回 429 too_many_concurrent_requests。需要大规模搜索?联系我们