Trả lời nhanh
API LLMWebSearch có thể trả về những lỗi nào, và chúng có bị tính phí không?
LLMWebSearch có sáu lỗi HTTP: 400 invalid_parameter, 401 invalid_api_key, 402 insufficient_credits, 429 rate_limited, 502 search_failed và 504 search_timeout. Không lỗi nào bị tính phí. Những trang không đọc được sẽ hiển thị một content_status bên trong một 200. Một truy vấn thành công tốn 1 credit, từ 1,20 US$/1K lượt tìm kiếm tính đến tháng 10 năm 2026. Không cần KYC; thanh toán bằng crypto.
Có những lỗi HTTP nào?
Body luôn là {"error": {"code": "…", "message": "…"}}. Không lỗi nào tốn credit.
| HTTP | code | Nguyên nhân | Thử lại? |
|---|---|---|---|
| 400 | invalid_parameter | Thiếu tham số bắt buộc hoặc giá trị nằm ngoài phạm vi | Không: sửa request |
| 401 | invalid_api_key | Khóa bị thiếu, sai hoặc đã bị thu hồi | Không: kiểm tra khóa |
| 402 | insufficient_credits | Số dư không đủ trả cho lệnh gọi này | Không: mua một pack |
| 429 | rate_limited | Số lệnh gọi mỗi phút vượt mức tài khoản cho phép | Có, sau khi tạm dừng |
| 502 | search_failed | Truy vấn không thể hoàn thành | Có, với backoff |
| 504 | search_timeout | Không có kết quả tìm kiếm trong vòng 30 giây | Có, với backoff |
Trạng thái trang khác gì với lỗi?
Trạng thái trang mô tả một kết quả, không phải cả lần gọi. Tìm kiếm vẫn chạy, kết quả vẫn có, và credits_used vẫn được đặt như thường. Chỉ nội dung của riêng trang đó bị thiếu, và content_status cho biết lý do: blocked_by_robots, blocked_by_site_policy, target_refused, fetch_failed, fetch_timeout hoặc unsupported_content.
Đừng coi đây là thất bại để thử lại toàn bộ tìm kiếm. Hãy dùng các kết quả khác, snippet của trang bị thiếu, hoặc một nguồn khác. Trang định dạng phản hồi giải thích từng trạng thái trong một bảng.
Tại sao không bao giờ thử lại quanh một lần từ chối?
Vì từ chối là câu trả lời của trang web, và chúng tôi tôn trọng điều đó. Trình đọc của chúng tôi tôn trọng robots.txt: nó tự giới thiệu là LLMWebSearch, tuân theo các quy tắc mà một trang viết cho nó hoặc cho tất cả robot, và bỏ qua nội dung của bất kỳ trang nào nó không được phép đọc. Một trang đặt Content-Signal: ai-input=no trong robots.txt sẽ giữ nội dung các trang của mình khỏi nội dung trong kết quả của bạn. Khi một trang từ chối reader của chúng tôi bằng 403, 429 hoặc trang challenge, chúng tôi báo đó là target_refused kèm trạng thái của trang trong target_status.
Khi một trang từ chối trình đọc của chúng tôi, kết quả trả về không có nội dung kèm trạng thái của trang: chúng tôi không bao giờ giải CAPTCHA, đăng nhập vào tài khoản hay lách qua một chặn chặn hoặc paywall. Chúng tôi cũng không thử lại bằng danh tính khác hay trình duyệt ngụy trang. Agent của bạn không nên lặp trên một trang như vậy: kết quả sẽ không thay đổi, và trang đã nói không.
Khi nào code của tôi nên thử lại?
Chỉ với 429, 502 và 504. Chờ, rồi thử lại, gấp đôi thời gian chờ mỗi lần và thêm một chút ngẫu nhiên để các worker song song không thử lại cùng lúc. Ba đến năm lần là đủ; sau đó, báo lỗi.
Không bao giờ thử lại 400, 401 hay 402: cùng một truy vấn cho cùng một câu trả lời cho đến khi bạn thay đổi điều gì đó. Với các trang, fetch_failed và fetch_timeout có thể hoạt động sau đó, qua một tìm kiếm mới hoặc một lần gọi /extract. target_refused, blocked_by_robots và blocked_by_site_policy là cuối cùng.
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)
Tôi nên làm gì khi gặp 402 insufficient_credits?
Dừng lại và nạp thêm. Lần gọi không chạy và không tốn gì. Để tránh dừng giữa một tác vụ dài, hãy kiểm tra số dư trước bằng GET https://llmwebsearch.com/api/v1/credits, miễn phí, và so với số lượng tìm kiếm bạn dự định. Nhớ rằng một tìm kiếm với read trên 3 cần 2 credit.
Credit đến từ các pack mua bằng số dư crypto của bạn. Credit tìm kiếm không có ngày hết hạn: phần bạn không dùng trong tháng này vẫn còn đó vào năm sau.
Làm sao để ở dưới rate limit?
Giới hạn số lần gọi chạy cùng lúc trong code của bạn. Mỗi tài khoản có một giới hạn lượt gọi mỗi phút, hiển thị trong dashboard; hãy hỏi support và giới hạn đó có thể được nâng lên. Một pool nhỏ các worker song song, bốn đến tám cho hầu hết agent, giữ nhịp ổn định mà không bị bùng nổ. Trang Python và Node.js đều có ví dụ về pool như vậy.
Khi bạn gặp 429, hãy tạm dừng trước lần thử tiếp theo thay vì gửi ngay. Thử lại ngay lập tức chỉ thêm nhiều lần gọi bị từ chối.
Lỗi: câu hỏi thường gặp
Một tìm kiếm với mọi trang bị từ chối có vẫn tốn một credit không?
Có, nếu bản thân tìm kiếm đã chạy: bạn vẫn nhận được các kết quả đã xếp hạng và snippet. Giá của một tìm kiếm không phụ thuộc vào việc đọc được bao nhiêu trang trong đó.
Lỗi 401 có phải do khóa API bị thu hồi không?
Có thể. Khóa bị thu hồi, gõ sai, thiếu tiền tố Bearer hoặc header không đến được chúng tôi đều cho ra 401 invalid_api_key. Tạo một khóa API cho mỗi agent, ứng dụng hoặc đồng đội và thu hồi bất kỳ khóa nào trong dashboard mà không ảnh hưởng đến các khóa khác.
Tại sao một trang trả về fetch_timeout?
Các trang được đọc song song, và trang nào mất hơn 15 giây sẽ được trả về không có nội dung để không giữ chậm cả câu trả lời. Các trang chậm đôi khi phản hồi ở lần thử sau.
Tôi có xem được các lần gọi thất bại không?
Có. Lịch sử trong dashboard liệt kê các lần gọi của bạn trong 30 ngày, kể cả lần thất bại, cùng trạng thái và credit. Các lần gọi thất bại hiển thị 0 credit.