คำตอบสั้น
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 ตรงกับตารางด้านบน
{
"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; ไม่มีการเรียกเก็บเงิน ดังนั้นคุณสามารถแก้ไขและส่งใหม่ได้ทันที
ทำไมฉันจึงได้ 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 และ Node.js แสดง pool ที่ไม่เกินขีดจำกัด
502 และ 504 ถูกส่งกลับเมื่อใด?
502 search_failed หมายถึงการค้นหาไม่สามารถเสร็จสมบูรณ์สำหรับคำขอนี้; 504 search_timeout หมายถึงไม่เสร็จสมบูรณ์ในเวลาที่กำหนด ทั้งคู่ฟรีและทั้งคู่ควรลองใหม่ รอนานขึ้นเล็กน้อยก่อนแต่ละครั้งใหม่ ดังที่โค้ดด้านล่างทำ และเลิกหลังห้าครั้งเพื่อไม่ให้งานที่ค้างวนซ้ำตลอดไป
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"])// 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 เครดิต
ฉันจะรายงานข้อผิดพลาดที่เกิดซ้ำได้ที่ไหน
เขียนถึง [email protected] พร้อม search_metadata.id ของการค้นหาที่สำเร็จ หรือเวลา, engine และพารามิเตอร์ของการค้นหาที่ล้มเหลว ตอบกลับอีเมลภายใน 12 ชั่วโมง ทุกวัน 7 วันต่อสัปดาห์ รวมถึงช่วยเรื่องการเชื่อมต่อ API