# SERP API errors: รหัส สาเหตุ การแก้ไข และการ retry

> รหัส error ของ SerpCrypto SERP API: 400, 401, 402, 429, 502 และ 504 อะไรเป็นสาเหตุของแต่ละรหัส วิธีแก้หรือ retry และทำไม error จึงไม่ใช้เครดิตเลย

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

หกรหัส error กฎเดียว: error ไม่ pernah ใช้เครดิต หน้านี้อธิบายว่าอะไรกระตุ้นแต่ละรหัส ควร retry หรือไม่ และให้โค้ด retry พร้อม exponential backoff ใน Python และ Node.js

**คำตอบสั้น — error ของ SERP API รหัสใดควร retry และการค้นหาที่ล้มเหลวถูกเรียกเก็บเงินหรือไม่**

**SerpCrypto** ไม่ pernah เรียกเก็บเงินกับ error มีเพียงการค้นหาที่สำเร็จเท่านั้นที่ใช้ 1 เครดิต ให้ retry `429 concurrency_limit`, `502 search_failed` และ `504 search_timeout` ด้วย exponential backoff อย่า retry `400`, `401` หรือ `402`: แก้พารามิเตอร์ key หรือยอดคงเหลือก่อน เครดิตมีราคาเริ่มต้นที่ US$0.30/1K การค้นหา และไม่หมดอายุ ชำระด้วยคริปโต ไม่ต้อง KYC

## รหัส error แต่ละรหัสหมายถึงอะไร

ไม่มีแถวใดในตารางนี้ใช้เครดิต 1 เครดิต = 1 คำขอค้นหาที่สำเร็จ ซึ่งคืนผลลัพธ์หนึ่งหน้าบนเอนจินที่รองรับ คำขอที่ล้มเหลวจะไม่ถูกคิดเครดิต

| HTTP | `code` | สาเหตุ | สิ่งที่ต้องทำ | ลองใหม่หรือไม่ |
| --- | --- | --- | --- | --- |
| 400 | `invalid_parameter` | `q` หายไป หรือค่าอยู่นอกเหนือรายการที่อนุญาต | แก้ไขคำขอ; ข้อความระบุชื่อพารามิเตอร์ | ไม่ใช่ |
| 401 | `invalid_api_key` | ไม่มี key, key พิมพ์ผิด หรือ key ถูกเพิกถอน | ตรวจสอบ header หรือ `api_key`; สร้าง key ใหม่หากจำเป็น | ไม่ใช่ |
| 402 | `insufficient_credits` | บัญชีมี 0 เครดิต | ซื้อแพ็กจากยอดคงเหลือของคุณ | หลังจากซื้อ |
| 429 | `concurrency_limit` | มีการค้นหาพร้อมกันมากกว่าที่บัญชีของคุณอนุญาต | รอ, ลดการทำงานแบบขนาน หรือติดต่อฝ่ายสนับสนุนเพื่อขอขีดจำกัดที่สูงขึ้น | ใช่ พร้อม backoff |
| 502 | `search_failed` | engine หรือ collection ล้มเหลวสำหรับคำขอนี้ | ลองคำขอเดิมอีกครั้ง | ใช่ พร้อม backoff |
| 504 | `search_timeout` | ไม่มีการตอบกลับในเวลาที่กำหนด | ลองคำขอเดิมอีกครั้ง | ใช่ พร้อม backoff |

## การตอบกลับแบบ error มีหน้าตาอย่างไร?

ทุก error มี JSON body ขนาดเล็กเหมือนกัน พร้อม `code` ที่คงที่และ `message` ที่อ่านได้ด้วยมนุษย์ แยกเงื่อนไขตาม `code` ในโปรแกรมของคุณและบันทึก `message` สำหรับมนุษย์ สถานะ HTTP ตรงกับตารางด้านบน

*Body ของการตอบกลับ 402*

```json
{
  "error": {
    "code": "insufficient_credits",
    "message": "Your account has no search credits left."
  }
}
```

## ทำไมฉันจึงได้ 400 invalid_parameter?

ค่าที่จำเป็นหายไป หรือค่าหนึ่งอยู่นอกเหนือรายการที่ API ยอมรับ สาเหตุที่พบบ่อยคือ `q` ว่าง, ชื่อ engine ที่พิมพ์ผิด เช่น `google-news` แทน `google_news`, `page` มากกว่า 10, หรือ `device` ที่ไม่ใช่ `desktop` หรือ `mobile`

`message` ระบุชื่อพารามิเตอร์ที่ผิดพลาด เปรียบเทียบคำขอของคุณกับ [API reference](https://serpcrypto.com/th/docs/search/); ไม่มีการเรียกเก็บเงิน ดังนั้นคุณสามารถแก้ไขและส่งใหม่ได้ทันที

## ทำไมฉันจึงได้ 401 invalid_api_key?

key ไม่ถึง API หรือไม่ถูกต้อง ตรวจสอบว่า header เป็น `Authorization: Bearer YOUR_KEY` ตรง ๆ โดยมีช่องว่างหลัง `Bearer` ตรวจสอบด้วยว่า environment variable ของคุณถูกตั้งค่าใน shell หรือ service ที่รันโค้ด ไม่ใช่แค่ใน terminal ของคุณ key ที่ถูกเพิกถอนจะล้มเหลวต่อไป: สร้าง key ใหม่ใน dashboard

## ฉันควรทำอย่างไรกับ 402 insufficient_credits?

ซื้อแพ็กเครดิตจากยอดคงเหลือของคุณ แล้วส่งใหม่ หากยอดคงเหลือต่ำเกินไป เติมด้วยคริปโตก่อน; ยอดเติมขั้นต่ำคือ US$25 อ่าน `credits_remaining` จาก `GET https://serpcrypto.com/api/v1/credits` ก่อนทำงานขนาดใหญ่เพื่อหลีกเลี่ยงการหยุดกลางทาง: การเรียกนั้นฟรี

## ฉันจะจัดการ 429 concurrency_limit อย่างไร?

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

## 502 และ 504 ถูกส่งกลับเมื่อใด?

`502 search_failed` หมายถึงการค้นหาไม่สามารถเสร็จสมบูรณ์สำหรับคำขอนี้; `504 search_timeout` หมายถึงไม่เสร็จสมบูรณ์ในเวลาที่กำหนด ทั้งคู่ฟรีและทั้งคู่ควรลองใหม่ รอนานขึ้นเล็กน้อยก่อนแต่ละครั้งใหม่ ดังที่โค้ดด้านล่างทำ และเลิกหลังห้าครั้งเพื่อไม่ให้งานที่ค้างวนซ้ำตลอดไป

*Python: ลองใหม่ 429, 502 และ 504 ด้วย exponential backoff*

```python
import os
import random
import time

import requests

API_URL = "https://serpcrypto.com/api/v1/search"
RETRYABLE = {429, 502, 504}


def search(params, max_attempts=5):
    headers = {"Authorization": "Bearer " + os.environ["SERPCRYPTO_API_KEY"]}
    for attempt in range(1, max_attempts + 1):
        r = requests.get(API_URL, params=params, headers=headers, timeout=90)
        if r.status_code == 200:
            return r.json()
        error = r.json().get("error", {})
        if r.status_code not in RETRYABLE or attempt == max_attempts:
            raise RuntimeError(f"{r.status_code} {error.get('code')}: {error.get('message')}")
        # exponential backoff with jitter: about 1 s, 2 s, 4 s, 8 s
        time.sleep(2 ** (attempt - 1) + random.random())
    raise RuntimeError("unreachable")


print(search({"q": "solar panel installers", "gl": "au", "hl": "en"})["search_metadata"])
```

*Node.js: ตรรกะเดียวกันด้วย fetch*

```javascript
// retry.mjs — Node.js 18+
const API_URL = "https://serpcrypto.com/api/v1/search";
const RETRYABLE = new Set([429, 502, 504]);
const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));

export async function search(params, maxAttempts = 5) {
  const url = `${API_URL}?${new URLSearchParams(params)}`;
  const headers = { Authorization: `Bearer ${process.env.SERPCRYPTO_API_KEY}` };
  for (let attempt = 1; attempt <= maxAttempts; attempt++) {
    const res = await fetch(url, { headers });
    if (res.ok) return res.json();
    const body = await res.json().catch(() => ({}));
    const code = body.error?.code ?? "unknown";
    if (!RETRYABLE.has(res.status) || attempt === maxAttempts) {
      throw new Error(`${res.status} ${code}: ${body.error?.message ?? ""}`);
    }
    // exponential backoff with jitter: about 1 s, 2 s, 4 s, 8 s
    await sleep(1000 * 2 ** (attempt - 1) + Math.random() * 1000);
  }
  throw new Error("unreachable");
}

console.log((await search({ q: "solar panel installers", gl: "au", hl: "en" })).search_metadata);
```

## HTTP timeout ของฉันควรสั้นหรือยาว?

ยาวพอให้การค้นหาเสร็จสมบูรณ์: การค้นหารันแบบ live ดังนั้นตั้ง client timeout เป็น 60 ถึง 90 วินาที แทนที่จะเป็นไม่กี่วินาที client ที่เลิกเร็วเกินไปจะส่งคำขอที่สองขณะที่คำขอแรกยังรันอยู่ ซึ่งเปลืองช่อง concurrency และหากทั้งคู่สำเร็จก็เสียสองเครดิต

## คำถามเกี่ยวกับ error

### ถ้าโปรแกรมของฉันพังก่อนที่จะอ่านคำตอบ จะยังถูกคิดเงินสำหรับการค้นหาหรือไม่

ใช่ ถ้า API ค้นหาเสร็จสิ้นและส่งคืน 200: เครดิตจะถูกใช้เมื่อการค้นหาสำเร็จ ไม่ใช่ตอนที่คุณอ่านคำตอบ นั่นเป็นอีกเหตุผลหนึ่งที่ควรตั้ง timeout ฝั่ง client ให้ยาวนาน

### การลองใหม่มีค่าใช้จ่ายเพิ่มหรือไม่

เฉพาะครั้งที่สำเร็จเท่านั้นที่ใช้เครดิต ความพยายามที่ล้มเหลวด้วย 429, 502 หรือ 504 ไม่มีค่าใช้จ่าย ดังนั้นคำขอที่สำเร็จในครั้งที่สามจะใช้เครดิตทั้งหมด 1 เครดิต

### ฉันจะรายงานข้อผิดพลาดที่เกิดซ้ำได้ที่ไหน

เขียนถึง support@serpcrypto.com พร้อม `search_metadata.id` ของการค้นหาที่สำเร็จ หรือเวลา, engine และพารามิเตอร์ของการค้นหาที่ล้มเหลว ตอบกลับอีเมลภายใน 12 ชั่วโมง ทุกวัน 7 วันต่อสัปดาห์ รวมถึงช่วยเรื่องการเชื่อมต่อ API

---

SerpCrypto: SerpCrypto คือ SERP API สำหรับนักพัฒนาและ AI agent ที่ส่งคืนผลการค้นหา Google และ Bing เป็น JSON จ่ายด้วยคริปโตโดยไม่ต้องอัปโหลดบัตรประชาชน เครดิตการค้นหาแบบเติมเงินจาก US$0.30/1K การค้นหา ไม่มีวันหมดอายุ ไม่ต้อง KYC — ไม่ต้องใช้บัตรประชาชน ไม่ต้องเซลฟี่ ไม่ต้องใช้เอกสาร จ่ายด้วยคริปโต
