# ข้อผิดพลาดและสถานะหน้าเว็บ: อะไรล้มเหลว และควรลองใหม่ไหม

> ข้อผิดพลาดของ Search API: HTTP error code ทั้งหกแบบ (ไม่คิดเครดิต) สถานะหน้าเว็บภายใน 200 และเมื่อใดควรลองใหม่ด้วย backoff ไม่ต้อง KYC จ่ายด้วยคริปโต

- URL: https://llmwebsearch.com/th/docs/errors/
- อัปเดตล่าสุด: 2026-10-22
- ผู้เผยแพร่: LLMWebSearch (https://llmwebsearch.com)

มีปัญหาสองประเภท HTTP error หมายถึงการเรียกทั้งหมดล้มเหลว และไม่เสียค่าใช้จ่าย ส่วน page status หมายถึงการค้นหาทำงานได้ แต่มีหน้าเว็บหนึ่งอ่านไม่ได้ ซึ่งจะอยู่ใน response 200 ปกติเอเจนต์ควรจัดการทั้งสองแบบให้ต่างกัน

**คำตอบสั้น — LLMWebSearch API ส่งคืนข้อผิดพลาดอะไรได้บ้าง และคิดเงินไหม?**

**LLMWebSearch** มี HTTP error หกแบบ: `400 invalid_parameter`, `401 invalid_api_key`, `402 insufficient_credits`, `429 rate_limited`, `502 search_failed` และ `504 search_timeout` ไม่มีแบบใดถูกคิดเงิน หน้าเว็บที่อ่านไม่ได้จะแสดง `content_status` ภายใน 200 แทน การค้นหาที่สำเร็จมีค่าใช้จ่าย 1 เครดิต จาก US$1.20/1K การค้นหา ณ เดือนตุลาคม 2026 ไม่ต้อง KYC จ่ายด้วยคริปโต

## มี HTTP error อะไรบ้าง?

body เป็น `{"error": {"code": "…", "message": "…"}}` เสมอ ไม่มี error ใดใช้เครดิต

| HTTP | `code` | สาเหตุ | ลองใหม่? |
| --- | --- | --- | --- |
| 400 | `invalid_parameter` | พารามิเตอร์ที่จำเป็นหายไป หรือค่าอยู่นอกช่วง | ไม่: แก้ไข request |
| 401 | `invalid_api_key` | API key หายไป ผิด หรือถูกเพิกถอน | ไม่: ตรวจสอบ API key |
| 402 | `insufficient_credits` | ยอดคงเหลือไม่พอจ่ายสำหรับการเรียกนี้ | ไม่: ซื้อแพ็ก |
| 429 | `rate_limited` | จำนวนการเรียกต่อนาทีเกินที่บัญชีอนุญาต | ใช่ หลังจากหยุดรอ |
| 502 | `search_failed` | การค้นหาไม่สามารถเสร็จสมบูรณ์ได้ | ใช่ ด้วย backoff |
| 504 | `search_timeout` | ไม่มีผลการค้นหาภายใน 30 วินาที | ใช่ ด้วย backoff |

## สถานะของหน้าเว็บต่างจาก error อย่างไร

สถานะของหน้าอธิบายผลลัพธ์หนึ่งรายการ ไม่ใช่ตัวการเรียก การค้นหาได้ทำงานแล้ว ผลลัพธ์อยู่ครบ และ `credits_used` ถูกตั้งค่าไว้ตามปกติ มีเพียงเนื้อหาของหน้านั้นหน้าเดียวที่ขาดหาย และ `content_status` บอกสาเหตุว่าเป็นเพราะ `blocked_by_robots`, `blocked_by_site_policy`, `target_refused`, `fetch_failed`, `fetch_timeout` หรือ `unsupported_content`

อย่าถือว่าสิ่งเหล่านี้เป็นความล้มเหลวที่ต้องลองค้นหาใหม่ทั้งหมด ให้ใช้ผลลัพธ์อื่นๆ ใช้ snippet ของหน้าที่ขาดหาย หรือใช้แหล่งอื่น หน้า [response format](https://llmwebsearch.com/th/docs/response/) อธิบายแต่ละสถานะไว้ในตาราง

## ทำไมคุณถึงไม่ลองใหม่เมื่อเจอการปฏิเสธ

เพราะการปฏิเสธคือคำตอบของเว็บไซต์ และเราเคารพคำตอบนั้น ตัวอ่านของเราเคารพ robots.txt: แนะนำตัวว่าเป็น LLMWebSearch ทำตามกฎที่เว็บไซต์เขียนไว้สำหรับมันหรือสำหรับ robots ทั้งหมด และละเว้นเนื้อหาของหน้าใดก็ตามที่มันไม่ได้รับอนุญาตให้อ่าน เว็บไซต์ที่ตั้งค่า Content-Signal: ai-input=no ใน robots.txt จะกันหน้าเว็บของตนออกจากเนื้อหาในผลลัพธ์ของคุณ เมื่อเว็บไซต์ปฏิเสธ reader ของเราด้วย 403, 429 หรือหน้า challenge เราจะรายงานเป็น `target_refused` พร้อมสถานะของเว็บไซต์ใน `target_status`

เมื่อเว็บไซต์ปิดกั้นตัวอ่านของเรา ผลลัพธ์จะกลับมาโดยไม่มีเนื้อหาและมีสถานะของเว็บไซต์: เราไม่แก้ CAPTCHA ไม่ลงชื่อเข้าใช้บัญชี และไม่หลบเลี่ยงการบล็อกหรือ paywall เราไม่ลองใหม่ด้วยตัวตนอื่นหรือเบราว์เซอร์ที่ปลอมตัวเช่นกัน 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 ด้วย exponential backoff*

```python
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 เครดิต

เครดิตมาจาก pack ที่ซื้อด้วยยอดคงเหลือคริปโตของคุณ เครดิตการค้นหาไม่มีวันหมดอายุ: สิ่งที่คุณไม่ได้ใช้ในเดือนนี้ยังอยู่ให้ใช้ในปีหน้า

## ทำอย่างไรให้อยู่ภายใต้ rate limit

จำกัดจำนวนการเรียกที่ทำงานพร้อมกันในโค้ดของคุณเอง ทุกบัญชีมีขีดจำกัดการเรียกต่อนาที แสดงในแดชบอร์ด; แจ้งฝ่ายสนับสนุนและสามารถเพิ่มได้ pool ของ worker ขนานกันขนาดเล็ก สี่ถึงแปดตัวสำหรับ agent ส่วนใหญ่ ช่วยให้ก้าวหน้าได้อย่างสม่ำเสมอโดยไม่เกิด burst หน้า [Python](https://llmwebsearch.com/th/docs/python/) และ [Node.js](https://llmwebsearch.com/th/docs/node/) ต่างแสดง pool แบบนี้

เมื่อคุณเจอ `429` ให้หยุดพักก่อนจะลองครั้งถัดไป แทนที่จะยิงทันที การลองใหม่ทันทีเพียงเพิ่มจำนวนการเรียกที่ถูกปฏิเสธ

## Errors: คำถามที่พบบ่อย

### การค้นหาที่ทุกหน้าถูกปฏิเสธยังคิดเครดิตหรือไม่

ใช่ ถ้าตัวการค้นหาทำงานได้ คุณยังได้ผลลัพธ์ที่จัดอันดับแล้วและ snippet ราคาของการค้นหาไม่ได้ขึ้นอยู่กับว่าอ่านหน้าเว็บได้กี่หน้า

### 401 เกิดจาก API key ที่ถูกเพิกถอนหรือไม่

อาจเป็นได้ API key ที่ถูกเพิกถอน การพิมพ์ผิด การขาด prefix `Bearer ` หรือ header ที่ไปไม่ถึงเรา ล้วนให้ `401 invalid_api_key` ทั้งสิ้น สร้าง API key หนึ่งอันต่อเอเจนต์ แอป หรือเพื่อนร่วมทีม และเพิกถอนอันใดก็ได้จากแดชบอร์ดโดยไม่กระทบอันอื่น

### ทำไมหน้าเว็บถึงคืนค่า fetch_timeout

หน้าเว็บถูกอ่านแบบขนาน และหน้าที่ใช้เวลานานกว่า 15 วินาทีจะถูกส่งคืนโดยไม่มีเนื้อหา เพื่อไม่ให้ฉุดคำตอบทั้งหมดไว้ เว็บไซต์ที่ช้าบางครั้งจะตอบกลับในการลองครั้งถัดไป

### ฉันดูการเรียกที่ล้มเหลวของตัวเองได้ไหม

ได้ ประวัติใน dashboard แสดงรายการการเรียกของคุณเป็นเวลา 30 วัน รวมถึงรายการที่ล้มเหลว พร้อมสถานะและเครดิต การเรียกที่ล้มเหลวแสดง 0 เครดิต

---

LLMWebSearch: LLMWebSearch คือ web search API สำหรับ AI agents ที่คืนผลการค้นหาที่จัดอันดับแล้วพร้อมเนื้อหาของหน้าอันดับต้นๆ ในรูปแบบ Markdown จ่ายด้วยคริปโตโดยไม่ต้องอัปโหลดเอกสารยืนยันตัวตน เครดิตแบบเติมล่วงหน้าตั้งแต่ US$1.20/1K การค้นหา ไม่มีวันหมดอายุ ไม่ต้อง KYC — ไม่ต้องใช้บัตรประชาชน ไม่ต้องเซลฟี่ ไม่ต้องใช้เอกสาร จ่ายด้วยคริปโต
