无需 KYC — 无需身份证件、自拍或文件。用加密货币支付:BTC, USDT, USDC, ETH, SOL, LTC
语言: 简体中文
获取 API 密钥

文档 · API 参考

错误与页面状态:哪里失败了,以及是否该重试

存在两类问题。HTTP 错误表示整个调用失败,不产生任何费用。页面状态表示搜索成功但某个页面无法读取;它出现在正常的 200 响应里。Agent 应分别以不同方式处理两者。

最后更新:

快速回答

LLMWebSearch API 会返回哪些错误,会收费吗?

LLMWebSearch 有六个 HTTP 错误:400 invalid_parameter、401 invalid_api_key、402 insufficient_credits、429 rate_limited、502 search_failed 和 504 search_timeout。均不收费。无法读取的页面会在 200 响应内显示 content_status。成功完成一次搜索消耗 1 积分,低至 US$1.20/千次搜索(截至 2026 年 10 月)。无需 KYC;加密货币支付。

有哪些 HTTP 错误?

响应体始终为 {"error": {"code": "…", "message": "…"}}。任何错误都不消耗积分。

HTTPcode原因是否重试?
400invalid_parameter缺少必需参数或值超出范围否:修正请求
401invalid_api_key密钥缺失、错误或已撤销否:检查密钥
402insufficient_credits余额不足以支付本次调用否:购买积分包
429rate_limited每分钟调用次数超过账户允许上限是,稍等片刻后重试
502search_failed搜索无法完成是,用退避策略重试
504search_timeout30 秒内没有搜索结果是,用退避策略重试

页面状态与错误有何不同?

页面状态描述的是单个结果,而不是整个调用。搜索已执行,结果也在,credits_used 照常设置。只是那一页的内容缺失,content_status 会说明原因:blocked_by_robots、blocked_by_site_policy、target_refused、fetch_failed、fetch_timeout 或 unsupported_content。

不要把这些当作失败而重试整个搜索。请使用其他结果、缺失页面的摘要,或换一个来源。响应格式页面用表格解释了每种状态。

为什么你们从不绕过拒绝进行重试?

因为拒绝就是网站的答复,我们尊重它。我们的读取器遵守 robots.txt:它会以 LLMWebSearch 表明身份,遵守网站为它或为所有机器人写下的规则,并排除任何它无权读取的页面内容。在 robots.txt 中设置 Content-Signal: ai-input=no 的网站,其页面内容不会出现在你的结果中。当网站以 403、429 或验证页拒绝我们的读取器时,我们会将其报告为 target_refused,并在 target_status 中给出网站的状态。

当网站拒绝我们的读取器时,结果会不带内容返回,并附上该网站的状态:我们绝不破解 CAPTCHA、不登录账户,也不绕过封锁或付费墙。我们也不会用另一个身份或伪装的浏览器重试。你的 agent 不应在这样的页面上循环:结果不会改变,而且网站已经说了不。

我的代码应该在什么时候重试?

仅在 429、502 和 504 时重试。等待,然后重试,每次将等待时间加倍,并加入一些随机性,以免并行 worker 同步重试。三到五次尝试就足够;之后报告失败。

绝不要重试 400、401 或 402:除非你改变某些东西,否则相同的请求会得到相同的答复。对于页面,fetch_failed 和 fetch_timeout 可能稍后通过新的搜索或 /extract 调用成功。target_refused、blocked_by_robots 和 blocked_by_site_policy 是最终结果。

Python:对 429、502 和 504 使用指数退避重试
import os
import random
import time

import requests

API = "https://llmwebsearch.com/api/v1/search"
HEADERS = {"Authorization": "Bearer " + os.environ["LLMWEBSEARCH_API_KEY"]}
RETRY_ON = {429, 502, 504}


def search(body, attempts=5):
    delay = 1.0
    for attempt in range(1, attempts + 1):
        resp = requests.post(API, headers=HEADERS, json=body, timeout=60)
        if resp.status_code == 200:
            return resp.json()
        err = resp.json().get("error", {})
        if resp.status_code not in RETRY_ON or attempt == attempts:
            raise RuntimeError(f"{resp.status_code} {err.get('code')}: {err.get('message')}")
        time.sleep(delay + random.uniform(0, delay / 2))
        delay = min(delay * 2, 30)


data = search({"q": "how to rotate api keys without downtime"})
unread = [r["url"] for r in data["results"] if r["content_status"] not in ("ok", "not_requested")]
print("credits:", data["credits_used"], "| pages not read:", unread)

遇到 402 insufficient_credits 该怎么办?

停止并充值。该调用未执行,也没有花费。为避免在长时间任务中途停止,请先用 GET https://llmwebsearch.com/api/v1/credits 检查余额(免费),并与你计划的搜索次数进行比较。请记住,read 大于 3 的搜索需要 2 个积分。

积分来自用你的加密货币余额购买的积分包。查询积分永不过期:这个月没用完的,明年还在。

如何保持在速率限制之下?

在你自己的代码中限制同时运行的调用数量。每个账户都有每分钟调用上限,显示在控制面板中;联系支持即可提高。一个小的并行 worker 池(对大多数 agent 来说四到八个)可以保持稳定节奏而不产生突发。Python 和 Node.js 页面都展示了这样的池。

当你确实收到 429 时,在下一次尝试前暂停,而不是立即发出。立即重试只会增加更多被拒绝的调用。

错误:常见问题

所有页面都被拒绝的搜索仍然消耗一个积分吗?

是的,如果搜索本身成功:你仍然会获得排序后的结果和摘要。搜索的价格不取决于有多少页面能被读取。

401 是由密钥被撤销引起的吗?

可能是。密钥被撤销、拼写错误、缺少 Bearer 前缀,或 header 从未到达我们这里,都会导致 401 invalid_api_key。为每个 agent、应用或团队成员各建一个 API 密钥,并可在控制面板中吊销其中任意一个,而不影响其他密钥。

为什么页面返回 fetch_timeout?

页面是并行读取的,耗时超过 15 秒的页面会在没有内容的情况下返回,以免拖慢整个答复。慢速网站有时会在后续尝试中响应。

我能查看失败的调用吗?

可以。仪表板历史记录会列出你 30 天内的调用,包括失败的调用,以及它们的状态和积分。失败的调用显示 0 积分。

低至 US$1.20/千次搜索 · 无需 KYC

获取 API 密钥