KYC不要 — 身分証、自撮り、書類は不要です。暗号資産で支払い: BTC, USDT, USDC, ETH, SOL, LTC
言語: 日本語
APIキーを取得

ドキュメント · エラー · API v1

SERP APIのエラー: コード、原因、修正、リトライ

6つのエラーコード、1つのルール: エラーはクレジットを消費しません。このページでは各コードの発生条件、リトライすべきかどうか、そしてPythonとNode.jsでの指数バックオフを用いたリトライコードを説明します。

最終更新:

簡潔な回答

どのSERP APIエラーをリトライすべきで、失敗した検索は課金されますか?

SerpCryptoはエラーに対して一切課金しません。成功した検索のみが1クレジットを消費します。429 concurrency_limit、502 search_failed、504 search_timeoutは指数バックオフでリトライしてください。400、401、402はリトライしないでください。まずパラメータ、キー、残高を修正してください。クレジットは$0.30/1K検索からで、有効期限はありません。支払いは暗号資産で、KYC不要です。

各エラーコードの意味は何ですか?

この表のどの行もクレジットを消費しません。1クレジット = 1回の成功した検索リクエストで、対応するすべてのエンジンで結果の1ページを返します。失敗したリクエストは課金されません。

HTTPcode原因対処方法リトライ?
400invalid_parameterq が欠落しているか、許可リストにない値ですリクエストを修正してください。メッセージにパラメータ名が記載されていますいいえ
401invalid_api_keyキーがない、キーの入力ミス、または失効したキーですヘッダーまたは api_key を確認してください。必要なら新しいキーを作成してくださいいいえ
402insufficient_creditsアカウントのクレジットが0です残高からパックを購入してください購入後
429concurrency_limitアカウントで許可されている同時検索数を超えています待機するか並列度を下げるか、サポートに上限の引き上げを依頼してくださいはい、バックオフ付きで
502search_failedこのリクエストでエンジンまたはコレクションが失敗しました同じリクエストをリトライしてくださいはい、バックオフ付きで
504search_timeout時間内に応答がありませんでした同じリクエストをリトライしてくださいはい、バックオフ付きで

エラー応答は什么样的?

どのエラーも、安定した code と人間が読める message を含む同じ小さな JSON ボディを持ちます。プログラムでは code で分岐し、人向けに message をログに記録してください。HTTP ステータスは上の表と一致します。

402 応答のボディ
{
  "error": {
    "code": "insufficient_credits",
    "message": "Your account has no search credits left."
  }
}

なぜ 400 invalid_parameter が返るのですか?

必須の値が欠落しているか、API が受け付けるリストにない値があります。よくある原因は、空の q、google_news の代わりに google-news のようなエンジン名のタイプミス、10 を超える page、desktop または mobile 以外の device です。

message が問題のあるパラメータ名を示します。リクエストを API reference と照合してください。課金されないので、すぐに修正して再送できます。

なぜ 401 invalid_api_key が返るのですか?

キーが API に届いていないか、有効ではありません。ヘッダーが正確に Authorization: Bearer YOUR_KEY であること、Bearer の後にスペースがあることを確認してください。また、環境変数がターミナルだけでなく、コードを実行する shell やサービスで設定されていることも確認してください。失効したキーは失敗し続けます。ダッシュボードで新しいキーを作成してください。

402 insufficient_credits にはどう対応すべきですか?

残高からクレジットパックを購入してから再送してください。残高が低すぎる場合は、先に暗号資産でチャージしてください。最低チャージ額は $25 です。大きなジョブの前に GET https://serpcrypto.com/api/v1/credits から credits_remaining を読み取って、途中で止まらないようにしてください。その呼び出しは無料です。

429 concurrency_limit はどう処理すればよいですか?

停止せずに速度を落としてください。この上限は1日の検索数ではなく、同時に実行中の検索数をカウントします。各アカウントは同時に一定数の検索を実行できます。上限はダッシュボードに表示され、リクエストに応じて引き上げられます。credits endpoint から concurrency_limit を読み取り、ワーカープールのサイズをそれに合わせてください。Python と Node.js のページには、上限を超えないプールの例が示されています。

502 と 504 はいつ返されますか?

502 search_failed はこのリクエストの検索を完了できなかったことを意味し、504 search_timeout は時間内に完了しなかったことを意味します。どちらも無料で、どちらもリトライする価値があります。以下のコードのように、新しい試行の前に少しずつ長く待機し、5回試行したら諦めてください。そうしないと、詰まったジョブが永遠にループします。

Python: 指数バックオフで 429、502、504 をリトライ
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 で同じロジック
// 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 タイムアウトは短くすべきですか、長くすべきですか?

検索が完了するのに十分な長さにしてください。検索はライブで実行されるため、クライアントのタイムアウトは数秒ではなく 60〜90 秒に設定してください。早すぎるタイムアウトのクライアントは、最初のリクエストがまだ実行中なのに2つ目のリクエストを送信するため、並列処理スロットを無駄にし、両方が成功するとクレジットを2つ消費します。

エラーの質問

プログラムが応答を読む前にクラッシュした場合、検索は課金されますか?

はい、APIが検索を完了して200を返した場合は課金されます。クレジットは検索が成功した時点で消費され、あなたが応答を読む時点ではありません。これはクライアントのタイムアウトを長めに設定すべきもう一つの理由です。

リトライには追加料金がかかりますか?

成功した試行だけがクレジットを消費します。429、502、504 で失敗した試行は無料なので、3回目で成功したリクエストの合計コストは1クレジットです。

繰り返し発生するエラーはどこに報告すればいいですか?

[email protected] まで、成功した検索の search_metadata.id、または失敗した検索の時刻・エンジン・パラメータを添えてご連絡ください。メール返信は年中無休(7日間)12時間以内に対応し、API連携のサポートも含みます。

$0.30/1K検索から · KYC不要

APIキーを取得