クイック回答
LLMWebSearch APIはどのエラーを返しますか? また課金されますか?
LLMWebSearchには6つのHTTPエラーがあります: 400 invalid_parameter、401 invalid_api_key、402 insufficient_credits、429 rate_limited、502 search_failed、504 search_timeoutです。いずれも課金されません。読み取れないページは、代わりに200の中にcontent_statusとして現れます。正常な検索は1クレジットで、2026年10月時点の$1.20/1K検索によります。KYC不要、暗号資産で支払い。
どのHTTPエラーがありますか?
本文は常に{"error": {"code": "…", "message": "…"}}です。どのエラーもクレジットを消費しません。
| HTTP | code | 原因 | リトライ? |
|---|---|---|---|
| 400 | invalid_parameter | 必須パラメータの欠落、または値が範囲外 | いいえ: リクエストを修正 |
| 401 | invalid_api_key | キーの欠落、誤り、または失効 | いいえ: キーを確認 |
| 402 | insufficient_credits | 残高がこの呼び出しの支払いに足りない | いいえ: パックを購入 |
| 429 | rate_limited | アカウントの上限を超える毎分呼び出し数 | はい、一定時間後に |
| 502 | search_failed | 検索を完了できなかった | はい、バックオフで |
| 504 | search_timeout | 30秒以内に検索結果なし | はい、バックオフで |
ページステータスはエラーとどう違うのですか?
ページステータスは1件の結果を表すものであり、呼び出し全体を表すものではありません。検索は実行され、結果も存在し、credits_usedも通常どおり設定されています。欠けているのはその1ページの内容だけで、理由は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を解いたり、アカウントにサインインしたり、ブロックやペイウォールを回避したりすることは一切ありません。別のアイデンティティや偽装したブラウザでリトライすることもありません。エージェントはそのようなページでループすべきではありません。結果は変わらず、サイトは「いいえ」と言っているからです。
コードはいつリトライすべきですか?
429、502、504 の場合のみです。待ってから再試行し、待ち時間を毎回2倍にし、並列ワーカーが同時にリトライしないよう少しランダム性を加えてください。3〜5回の試行で十分です。それ以降は失敗として報告してください。
400、401、402 は決してリトライしないでください。何かを変更するまで、同じリクエストは同じ回答を返します。ページについては、fetch_failed と fetch_timeout は後で、新しい検索や /extract 呼び出しによって成功する可能性があります。target_refused、blocked_by_robots、blocked_by_site_policy は最終的なものです。
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クレジットが必要なことを覚えておいてください。
クレジットは暗号資産の残高で購入したパックから得られます。検索クレジットに有効期限はありません。今月使わなかった分は来年も残ります。
レート制限を超えないようにするにはどうすればよいですか?
自分のコードで同時に実行する呼び出し数を制限してください。すべてのアカウントには1分あたりの呼び出し上限があり、ダッシュボードに表示されます。サポートに依頼すれば引き上げられます。並列ワーカーの小さなプール(ほとんどのエージェントでは4〜8個)にすれば、バーストせず安定したペースを保てます。Python と Node.js のページには、それぞれそのようなプールの例が示されています。
429 が発生した場合は、すぐに次の試行を発射するのではなく、次の試行の前に一時停止してください。即座にリトライすると、拒否される呼び出しが増えるだけです。
エラー: よくある質問
全ページが拒否された検索でもクレジットはかかりますか?
はい、検索自体が成功していれば、ランク付けされた結果とスニペットは得られます。検索の価格は、そのページを何件読めたかには依存しません。
401 はキーの失効が原因ですか?
その可能性があります。キーの失効、タイプミス、Bearer プレフィックスの欠落、当社に届かなかったヘッダーは、いずれも 401 invalid_api_key を返します。エージェント、アプリ、チームメンバーごとに1つのAPIキーを作成し、ダッシュボードから他のキーに触れずにどれでも失効させられます。
なぜページが fetch_timeout を返したのですか?
ページは並列で読み取られ、15秒を超えるページは全体の回答を遅らせないよう、内容なしで返されます。遅いサイトは後の試行で応答することがあります。
失敗した呼び出しを確認できますか?
はい。ダッシュボードの履歴には、失敗したものを含め、呼び出しがステータスとクレジットとともに30日間表示されます。失敗した呼び出しは0クレジットと表示されます。