# เอกสารอ้างอิง endpoint การค้นหา: POST และ GET /search

> เอกสารอ้างอิง endpoint การค้นหา: ทุกพารามิเตอร์ของ POST และ GET /search ตั้งแต่ read และ max_chars ไปจนถึง topic, time_range และตัวกรองโดเมน จ่ายด้วยคริปโต

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

`/search` ทำการค้นหาเว็บแบบเรียลไทม์ จัดอันดับผลลัพธ์สูงสุด 20 รายการ และอ่านหน้าเว็บที่อยู่เบื้องหลังผลลัพธ์แรก ๆ หน้านี้แสดงรายการทุกพารามิเตอร์ ค่าเริ่มต้น ขีดจำกัด และผลต่อราคา

**คำตอบสั้น — endpoint การค้นหาของ LLMWebSearch รับพารามิเตอร์อะไรบ้าง?**

endpoint `/search` ของ **LLMWebSearch** ต้องการเพียง `q` พารามิเตอร์เสริมกำหนดจำนวนผลลัพธ์ที่ส่งคืน (`max_results`) จำนวนหน้าที่อ่าน (`read`) รูปแบบและความยาวของเนื้อหา ข่าวหรือเว็บ ช่วงเวลา ประเทศและภาษา และโดเมนที่ต้องการเก็บหรือตัดออก การอ่านสูงสุด 3 หน้าคิด 1 เครดิต เริ่มต้นที่ US$1.20/1K การค้นหา ณ เดือนตุลาคม 2026 ไม่ต้อง KYC จ่ายด้วยคริปโต

## /search at a glance

| คุณลักษณะ | ค่า |
| --- | --- |
| เมธอด | `POST` พร้อม body แบบ JSON หรือ `GET` พร้อมชื่อพารามิเตอร์เดียวกันใน query string |
| URL | `https://llmwebsearch.com/api/v1/search` |
| Required | `q`: 1 ถึง 400 ตัวอักษร; search operator ถูกส่งไปตามที่เขียนไว้ |
| ค่าเริ่มต้น | 5 ผลลัพธ์ อ่าน 3 หน้าแรก Markdown สูงสุด 6,000 ตัวอักษรต่อหน้า |
| การเรียกเก็บเงิน | หนึ่งเครดิตจ่ายสำหรับการค้นหาหนึ่งครั้ง: ผลลัพธ์แบบจัดอันดับสูงสุด 20 รายการ โดยอ่านหน้าเว็บของ 3 รายการแรกและส่งกลับเป็น Markdown การอ่าน 4 ถึง 10 หน้าใช้ 2 เครดิต การเรียกที่จบลงด้วยข้อผิดพลาดไม่มีค่าใช้จ่าย |
| ผลลัพธ์ | ผลลัพธ์มาจากการค้นหาเว็บแบบเรียลไทม์ที่รันในขณะที่คุณเรียก ตามลำดับที่เสิร์ชเอนจินจัดอันดับ ไม่มีอะไรเสิร์ฟจากดัชนีเก่า |
| ตัวกรอง | เลือกประเทศและภาษาของผลลัพธ์ ช่วงเวลา (วัน สัปดาห์ เดือน หรือปีที่ผ่านมา) ผลการค้นหาแบบเว็บหรือข่าว และโดเมนที่ต้องการรวมหรือยกเว้น |
| Page reader | `LLMWebSearch/1.0 (+https://llmwebsearch.com/bot/)` |

## ค้นหาเว็บและอ่านผลลัพธ์ชั้นนำ (POST)

`POST /api/v1/search`

ทำการค้นหาเว็บแบบเรียลไทม์และส่งคืนผลลัพธ์ที่จัดอันดับแล้ว หน้าเว็บของ `read` ผลลัพธ์แรกถูกดึงพร้อมกันและเนื้อหาหลักถูกส่งคืนใน `content` ตัวอย่างถามวิธีหมุน API key; ชื่อเรื่อง วันที่ และค่าต่าง ๆ เป็นเพียงตัวอย่าง

การยืนยันตัวตน: API key ใน header `Authorization: Bearer API_KEY`

**Request body**

| Field | Type | Required | คำอธิบาย |
| --- | --- | --- | --- |
| `q` | string | ใช่ | คำค้นหา 1 ถึง 400 ตัวอักษร เครื่องหมายคำพูดและ operator เช่น `site:` ถูกเก็บไว้ตามที่เขียน |
| `max_results` | integer | ไม่ | จำนวนผลลัพธ์ที่จัดอันดับ 1 ถึง 20 ค่าเริ่มต้น 5 |
| `read` | integer | ไม่ | จำนวนผลลัพธ์แรกที่อ่านและส่งคืนพร้อมเนื้อหา 0 ถึง 10 ค่าเริ่มต้น 3 ตั้งแต่ 4 ขึ้นไปการเรียกคิด 2 เครดิต |
| `format` | string | ไม่ | `markdown` (ค่าเริ่มต้น) หรือ `text` สำหรับเนื้อหาหน้าเว็บ |
| `max_chars` | integer | ไม่ | ขีดจำกัดความยาวเนื้อหาของแต่ละหน้า 500 ถึง 50,000 ตัวอักษร ค่าเริ่มต้น 6,000 |
| `topic` | string | ไม่ | `web` (ค่าเริ่มต้น) หรือ `news` |
| `time_range` | string | ไม่ | `day`, `week`, `month` หรือ `year` ไม่มีค่าเริ่มต้น: วันที่ใดก็ได้ |
| `country` | string | ไม่ | รหัสประเทศสองตัวอักษร (ISO 3166-1 alpha-2) สำหรับตำแหน่งที่ค้นหา ค่าเริ่มต้น `us` |
| `language` | string | ไม่ | ภาษาของผลลัพธ์ เช่น `en`, `de` หรือ `pt-BR` ค่าเริ่มต้น `en` |
| `include_domains` | string[] | ไม่ | สูงสุด 20 โดเมน; เก็บเฉพาะผลลัพธ์จากโดเมนเหล่านี้และ subdomain ของโดเมนเหล่านี้ |
| `exclude_domains` | string[] | ไม่ | สูงสุด 20 โดเมนที่ผลลัพธ์จะถูกตัดออก |

*ตัวอย่าง: five results, the top three read as Markdown*

```json
{
  "q": "how to rotate api keys without downtime",
  "max_results": 5,
  "read": 3,
  "max_chars": 6000
}
```

*ตัวอย่าง: news of the past week from two sites, nothing read*

```json
{
  "q": "open source license change",
  "topic": "news",
  "time_range": "week",
  "include_domains": [
    "news.example.com",
    "example.org"
  ],
  "read": 0
}
```

**Response** `200`

```json
{
  "query": "how to rotate api keys without downtime",
  "created_at": "2026-10-22T10:15:04Z",
  "credits_used": 1,
  "results": [
    {
      "position": 1,
      "title": "Rotating API keys",
      "url": "https://docs.example.com/security/key-rotation",
      "host": "docs.example.com",
      "snippet": "Create a second key, deploy it everywhere, then revoke the first one.",
      "published_at": "2026-09-30",
      "content_status": "ok",
      "content": "# Rotating API keys\n\n## Zero-downtime rotation\n\n1. Create a second key.\n2. Deploy it to every service.\n3. Revoke the old key.",
      "word_count": 948
    },
    {
      "position": 2,
      "title": "Key rotation checklist",
      "url": "https://blog.example.org/key-rotation-checklist",
      "host": "blog.example.org",
      "snippet": "Keep two keys active during the switch and alert on the old one.",
      "content_status": "blocked_by_robots"
    },
    {
      "position": 3,
      "title": "Secrets management basics",
      "url": "https://security.example.net/secrets-basics",
      "host": "security.example.net",
      "snippet": "Never commit keys to a repository.",
      "published_at": "2026-06-12",
      "content_status": "ok",
      "content": "# Secrets management basics\n\n**Never** commit keys to a repository...",
      "word_count": 1310
    },
    {
      "position": 4,
      "title": "API key best practices",
      "url": "https://dev.example.com/api-key-best-practices",
      "host": "dev.example.com",
      "snippet": "Scope each key to one service and one environment.",
      "content_status": "not_requested"
    }
  ]
}
```

*curl*

```bash
curl -s "https://llmwebsearch.com/api/v1/search" \
  -H "Authorization: Bearer $LLMWEBSEARCH_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"q": "how to rotate api keys without downtime", "max_results": 5, "read": 3}'
```

*Python*

```python
import os
import requests

resp = requests.post(
    "https://llmwebsearch.com/api/v1/search",
    headers={"Authorization": "Bearer " + os.environ["LLMWEBSEARCH_API_KEY"]},
    json={"q": "how to rotate api keys without downtime", "max_results": 5, "read": 3},
    timeout=60,
)
resp.raise_for_status()
for r in resp.json()["results"]:
    print(r["position"], r["content_status"], r["url"])
```

*Node.js*

```javascript
const res = await fetch('https://llmwebsearch.com/api/v1/search', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.LLMWEBSEARCH_API_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({ q: 'how to rotate api keys without downtime', max_results: 5, read: 3 }),
});
const { results } = await res.json();
for (const r of results) console.log(r.position, r.content_status, r.url);
```

## ค้นหาเว็บ (GET)

`GET /api/v1/search`

การค้นหาเดียวกันโดยส่งพารามิเตอร์ใน query string แบบ URL-encoded ลิสต์เช่น `include_domains` เขียนเป็นค่าเดียวคั่นด้วยจุลภาค เหมาะสำหรับการทดสอบเร็ว ๆ หรือสำหรับเครื่องมือที่ส่งคำขอ GET เท่านั้น ตัวอย่างขอเฉพาะผลลัพธ์ (`read=0`)

การยืนยันตัวตน: API key ใน header `Authorization: Bearer API_KEY`

**พารามิเตอร์**

| ชื่อ | In | Type | Required | คำอธิบาย |
| --- | --- | --- | --- | --- |
| `q` | query | string | ใช่ | คำค้นหา แบบ URL-encoded ยาว 1 ถึง 400 ตัวอักษร |
| `max_results` | query | integer | ไม่ | 1 ถึง 20 ค่าเริ่มต้น 5 |
| `read` | query | integer | ไม่ | 0 ถึง 10 ค่าเริ่มต้น 3; ตั้งแต่ 4 ขึ้นไปคิด 2 เครดิต |
| `format` | query | string | ไม่ | `markdown` (ค่าเริ่มต้น) หรือ `text` |
| `max_chars` | query | integer | ไม่ | 500 ถึง 50,000 ต่อหน้า ค่าเริ่มต้น 6,000 |
| `topic` | query | string | ไม่ | `web` (ค่าเริ่มต้น) หรือ `news` |
| `time_range` | query | string | ไม่ | `day`, `week`, `month` หรือ `year` |
| `country` | query | string | ไม่ | รหัส ISO 3166-1 alpha-2 ค่าเริ่มต้น `us` |
| `language` | query | string | ไม่ | รหัสภาษา ค่าเริ่มต้น `en` |
| `include_domains` | query | string | ไม่ | รายการคั่นด้วยจุลภาค สูงสุด 20 โดเมน |
| `exclude_domains` | query | string | ไม่ | รายการคั่นด้วยจุลภาค สูงสุด 20 โดเมน |
| `api_key` | query | string | ไม่ | API key ของคุณ สำหรับกรณีที่ไม่ได้ส่ง header `Authorization` |

**Response** `200`

```json
{
  "query": "postgres connection pooling",
  "created_at": "2026-10-22T10:21:47Z",
  "credits_used": 1,
  "results": [
    {
      "position": 1,
      "title": "Connection pooling explained",
      "url": "https://docs.example.com/db/pooling",
      "host": "docs.example.com",
      "snippet": "A pool keeps a few database connections open and lends them to requests.",
      "content_status": "not_requested"
    },
    {
      "position": 2,
      "title": "Sizing a connection pool",
      "url": "https://blog.example.org/pool-size",
      "host": "blog.example.org",
      "snippet": "Start small: the right size depends on cores and disk, not on traffic.",
      "published_at": "2026-03-04",
      "content_status": "not_requested"
    }
  ]
}
```

*curl*

```bash
curl -sG "https://llmwebsearch.com/api/v1/search" \
  -H "Authorization: Bearer $LLMWEBSEARCH_API_KEY" \
  --data-urlencode "q=postgres connection pooling" \
  -d max_results=10 -d read=0
```

*Python*

```python
import os
import requests

resp = requests.get(
    "https://llmwebsearch.com/api/v1/search",
    headers={"Authorization": "Bearer " + os.environ["LLMWEBSEARCH_API_KEY"]},
    params={"q": "postgres connection pooling", "max_results": 10, "read": 0},
    timeout=60,
)
print([r["url"] for r in resp.json()["results"]])
```

*Node.js*

```javascript
const params = new URLSearchParams({ q: 'postgres connection pooling', max_results: '10', read: '0' });
const res = await fetch(`https://llmwebsearch.com/api/v1/search?${params}`, {
  headers: { Authorization: `Bearer ${process.env.LLMWEBSEARCH_API_KEY}` },
});
console.log((await res.json()).results.map((r) => r.url));
```

## จะได้ผลลัพธ์โดยไม่ต้องมีเนื้อหาหน้าเว็บได้อย่างไร?

ตั้ง `read` เป็น `0` ผลลัพธ์ทุกอันจะกลับมาพร้อมชื่อเรื่อง URL host snippet และวันที่ และ `content_status: "not_requested"` ขนาด response เล็กลงมาก ซึ่งช่วยได้เมื่อ agent ต้องการแค่เลือกว่าลิงก์ไหนสำคัญ

ราคายังคงอยู่ที่ 1 เครดิต เท่ากับการอ่านสูงสุด 3 หน้า รูปแบบที่พบบ่อยคือค้นหาด้วย `read=0` เพื่อคัดลิงก์ไว้ก่อน แล้วจึงเรียก [extract](https://llmwebsearch.com/th/docs/extract/) กับ URL สองหรือสามอันที่โมเดลเลือก

## เมื่อไหร่การค้นหาคิด 2 เครดิต?

เมื่อ `read` อยู่ระหว่าง 4 ถึง 10 การอ่านหน้าเว็บมากขึ้นต้องใช้แรงฝั่งเรามากขึ้น ราคาจึงเพิ่มเป็นสองเท่าครั้งเดียว และคงอยู่ที่ 2 เครดิตจนถึงสูงสุด 10 หน้า

`credits_used` ในทุก response แสดงว่าการเรียกครั้งนั้นคิดเท่าไร หน้าที่อ่านไม่ได้ ไม่ว่าจะเพราะกฎ robots.txt หรือการปฏิเสธ ไม่ทำให้ราคานี้ลดลงหรือเพิ่มขึ้น ถ้าปกติคุณต้องการหน้าเต็มแค่ไม่กี่หน้า ให้ตั้ง `read` ไว้ที่ 3 แล้วเรียก `/extract` สำหรับหน้าที่ต้องการเพิ่มเป็นครั้งคราว

## จะค้นหาข่าวล่าสุดได้อย่างไร?

ส่ง `topic: "news"` และ `time_range` ผลลัพธ์จะมาจากบทความข่าว และ `time_range` จะเก็บเฉพาะบทความจาก `day`, `week`, `month` หรือ `year` ที่ผ่านมา `published_at` จะถูกเติมเมื่อบทความหรือผลการค้นหาระบุวันที่

ตัวกรองความใหม่แบบเดียวกันใช้ได้กับ `topic: "web"` เหมาะกับคำถามอย่างการเปิดตัวหรือการเปลี่ยนแปลงราคาล่าสุด ซึ่งหน้าเว็บเก่าอาจทำให้โมเดลเข้าใจผิด

*ข่าวจากสัปดาห์ที่ผ่านมา อ่าน 3 บทความแรก*

```bash
curl -s "https://llmwebsearch.com/api/v1/search" \
  -H "Authorization: Bearer $LLMWEBSEARCH_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"q": "database release security fix", "topic": "news", "time_range": "week", "read": 3}'
```

## จะจำกัดผลลัพธ์ให้เฉพาะบางเว็บไซต์ได้อย่างไร?

ระบุไว้ใน `include_domains` สูงสุด 20 รายการ จะเก็บเฉพาะผลลัพธ์ที่ host เป็นหนึ่งในโดเมนเหล่านั้นหรือ subdomain ของโดเมนเหล่านั้น: `example.com` ก็จับคู่ `docs.example.com` ด้วย ใช้ `exclude_domains` ในทางกลับกัน เช่น เพื่อตัดเว็บไซต์ของคุณเองออกจากผลลัพธ์

ใน POST body ทั้งสองฟิลด์เป็น JSON array ในคำขอ GET ให้เขียนเป็นค่าคั่นด้วยจุลภาคชุดเดียว คำค้นหาเองก็ใส่ operator `site:` ได้ โดยจะถูกส่งไปยังการค้นหาตามที่เขียนไว้

## country และ language เปลี่ยนอะไร?

`country` กำหนดว่าค้นหาในประเทศไหน ด้วยรหัสสองตัวอักษร เช่น `us`, `de` หรือ `br` อันดับผลลัพธ์แตกต่างกันตามประเทศ โดยเฉพาะบริการท้องถิ่น ราคา และกฎระเบียบ `language` กำหนดภาษาของผลลัพธ์ เช่น `en`, `fr` หรือ `pt-BR`

ทั้งคู่มีค่าเริ่มต้นเป็น United States และอังกฤษ ตั้งทั้งคู่พร้อมกันเมื่อ agent ทำงานให้ผู้ใช้ในตลาดเดียว: ผู้ใช้ชาวเยอรมันที่ถามเรื่องกฎภาษีต้องการ `country: "de"` และ `language: "de"`

## ได้ข้อความจากหน้าเว็บกลับมาเท่าไร?

สูงสุด `max_chars` ตัวอักษรต่อหน้า ค่าเริ่มต้น 6,000 และกำหนดได้ตั้งแต่ 500 ถึง 50,000 เพดานนี้ช่วยปกป้อง context window ของโมเดล: สามหน้าที่ 6,000 ตัวอักษรเทียบได้ประมาณ 4,500 tokens ของภาษาอังกฤษ

`word_count` นับข้อความที่ดึงมาทั้งหมดก่อนตัด所以你จึงรู้ได้ว่าเมื่อไหร่หน้าเว็บถูกตัด เมื่อคำตอบต้องใช้เอกสารยาวชิ้นเดียว ให้ค้นหาด้วยเพดานต่ำก่อน แล้วดึงเฉพาะหน้านั้นผ่าน `/extract` ด้วยเพดานที่สูงขึ้น หน้าที่โหลดช้าจะไม่ถูกWaitingอย่างไร้ขีดจำกัด: หลัง 15 วินาทีจะกลับมาเป็น `fetch_timeout` โดยไม่มีเนื้อหา

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

### ควรใช้ POST หรือ GET?

ใช้ POST ในโค้ด เพราะ JSON array และคำค้นหายาวเขียนใน body ได้ง่ายกว่า GET เหมาะกับการทดสอบเร็ว ๆ ใน terminal หรือเครื่องมือที่ส่งได้แค่ query string ทั้งคู่คืน response เดียวกันและราคาเท่ากัน

### ขอผลลัพธ์มากกว่า 20 รายการได้ไหม?

ไม่ได้ 20 คือจำนวนสูงสุดต่อการเรียก agent แทบไม่ต้องใช้มากกว่านี้: การค้นหาครั้งที่สองด้วยคำค้นหาที่เขียนใหม่มักให้แหล่งข้อมูลที่ดีกว่าการได้รายการยาว ๆ

### หน้าเว็บถูกอ่านทีละหน้าหรือเปล่า?

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

### search engine ตัวไหนสร้างผลลัพธ์?

ผลลัพธ์มาจากการค้นหาเว็บแบบเรียลไทม์ที่รันในขณะที่คุณเรียก ตามลำดับที่เสิร์ชเอนจินจัดอันดับ ไม่มีอะไรเสิร์ฟจากดัชนีเก่า เราไม่เปิดเผยว่า upstream provider รายใดรันการค้นหา

---

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