検索
検索エンジンをクエリし、構造化結果を取得する SERP API
はじめに
AnyCrawl の Search API は、複数の検索エンジンの結果にプログラムからアクセスできます。大規模言語モデル(LLM)向けに設計され、AI の処理・分析に適したクリーンな構造化データを返します。
API はすぐに同期的に結果を返します。ポーリングや Webhook は不要です。複数の検索エンジンと複数ページの結果取得に対応し、幅広いデータ収集が可能です。
主な機能
- マルチエンジン:現状 Google に対応。他エンジンも予定
- LLM 向け:AI 処理に適した構造化 JSON
- 多言語:言語・地域を指定して検索可能
- 複数ページ:1 リクエストで複数ページの結果を取得
- 高パフォーマンス:ネイティブな高同時実行と非同期処理
- 即時応答:同期 API — ポーリングなしで結果を取得
- 包括的な結果:検索結果と検索サジェストの両方を返す
API エンドポイント
POST https://api.anycrawl.dev/v1/search使用例
基本検索(既定は Google)
curl -X POST "https://api.anycrawl.dev/v1/search" \
-H "Authorization: Bearer <your-api-key>" \
-H "Content-Type": "application/json" \
-d '{
"query": "OpenAI ChatGPT"
}'複数ページ検索
curl -X POST "https://api.anycrawl.dev/v1/search" \
-H "Authorization: Bearer <your-api-key>" \
-H "Content-Type": "application/json" \
-d '{
"query": "machine learning tutorials",
"pages": 3,
"limit": 10
}'言語・地域を指定した検索
curl -X POST "https://api.anycrawl.dev/v1/search" \
-H "Authorization: Bearer <your-api-key>" \
-H "Content-Type": "application/json" \
-d '{
"query": "AnyCrawl",
"lang": "zh",
"pages": 2
}'ページネーション付き検索
curl -X POST "https://api.anycrawl.dev/v1/search" \
-H "Authorization: Bearer <your-api-key>" \
-H "Content-Type": "application/json" \
-d '{
"query": "web scraping tools",
"offset": 20,
"limit": 10
}'セーフサーチを指定した検索
curl -X POST "https://api.anycrawl.dev/v1/search" \
-H "Authorization: Bearer <your-api-key>" \
-H "Content-Type": "application/json" \
-d '{
"query": "educational content",
"safe_search": 0
}'リクエストパラメータ
| パラメータ | 型 | 必須 | 既定値 | 説明 |
|---|---|---|---|---|
query | string | はい | - | 実行する検索クエリ文字列 |
template_id | string | いいえ | - | この検索で使うテンプレート ID |
variables | object | いいえ | - | テンプレート変数(template_id 指定時のみ使用) |
engine | enum | いいえ | google | 使用する検索エンジン。現在対応: google |
limit | number | いいえ | 10 | 1 ページあたりの最大件数 |
offset | number | いいえ | 0 | スキップする件数(ページネーション用) |
pages | number | いいえ | 1 | 取得する検索結果ページ数(最小: 1、最大: 20) |
lang | string | いいえ | en | 検索結果の言語ロケール(例: 'en'、'zh'、'es'、'fr') |
country | string | いいえ | - | 検索結果の国・地域ロケール(例: 'US'、'GB'、'CN') |
timeRange | enum | いいえ | - | 期間フィルター: day、week、month、year |
sources | enum | いいえ | - | 検索ソース: web、images、news(SearXNG) |
safe_search | number | null | いいえ | null | Google のセーフサーチ: 0(オフ)、1(中)、2(高)、または null(既定)。Google のみ有効。 |
任意: 結果 URL 用の scrape_options
指定すると、各検索結果 URL を同じオプションでスクレイプします(/v1/scrape と同じフィールド、トップレベルの url を除く)。注: ブラウザ専用オプションは、ブラウザ以外のスクレイプでは無視されます。
| フィールド | 型 | 既定値 | 備考 |
| ------------------- | ------------------------ | -------------- | ------------------------------------------------------------------------------------------------------------------------------------------- | --------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------------- |
| engine | enum | - | 結果 URL のスクレイプエンジン: auto、cheerio、playwright、puppeteer |
| formats | array of enum | ["markdown"] | 出力形式: markdown、html、text、screenshot、screenshot@fullPage、rawHtml、json、summary、links |
| timeout | number | 60000 | 1 リクエストあたりのタイムアウト(ミリ秒) |
| wait_for | number | - | 抽出前の待機(ミリ秒)。ブラウザエンジンのみ。wait_for_selector より優先度が低い |
| wait_until | enum | - | ブラウザのナビゲーション待機条件: load、domcontentloaded、networkidle、commit |
| wait_for_selector | string, object, or array | - | 1 つまたは複数のセレクタを待つ(ブラウジングエンジンのみ)。CSS 文字列、オブジェクト { selector: string, state?: "attached" | "visible" | "hidden" | "detached", timeout?: number }、または文字列とオブジェクトの配列。各エントリは順に待機。wait_for より優先。 |
| include_tags | array of string | - | 一致する CSS セレクタの要素のみ含める |
| exclude_tags | array of string | - | 一致する CSS セレクタの要素を除外する |
| only_main_content | boolean | true | 本文のみ抽出(ヘッダー・フッター・ナビなどを除去)。include_tags が優先される |
| proxy | string (URI) | - | 任意のプロキシ URL |
| json_options | object | - | 構造化 JSON 抽出用オプション(schema、user_prompt、schema_name、schema_description) |
| extract_source | enum | markdown | JSON 抽出元: markdown(既定)または html |
| ocr_options | boolean | false | Markdown 画像のみ OCR 補強を有効にする。Markdown 生成に影響し、html/rawHtml には影響しない。 |
| max_age | number | - | キャッシュ最大経過時間(ミリ秒)。0 で読み取りスキップ。省略時はサーバー既定 |
| store_in_cache | boolean | true | 結果ごとのスクレイプでページキャッシュに書き込むか |
対応検索エンジン
google(既定)
- 用途: 網羅的な結果が得られる一般的な Web 検索
- 利点: 最も網羅的な結果。多言語・多地域に対応
- 機能: 検索結果とサジェストの両方を返す。セーフサーチ(オフ/中/高)に対応
- 向いている用途: 一般的な Web 検索、調査、コンテンツ探索
- セーフサーチ:
safe_searchで 0(オフ)、1(中)、2(高)、または null(既定)を指定可能
レスポンス形式
成功レスポンス(HTTP 200)
検索成功
{
"success": true,
"data": [
{
"title": "AlsoAsked: People Also Ask keyword research tool",
"url": "https://alsoasked.com/",
"description": "Find the questions people also ask. Enter a question, brand or search query. e.g. 'keyword research'.",
"source": "Google Search Result"
},
{
"title": "OpenAI ChatGPT Features and Benefits",
"url": "https://openai.com/chatgpt",
"description": "ChatGPT is an AI assistant that can help with writing, research, and problem-solving.",
"source": "Google Search Result"
},
{
"title": "Keyword tool",
"source": "Google Suggestions"
}
]
}検索結果の種類
API は次の 2 種類を返します。
- 検索結果: タイトル、URL、説明、ソースが揃った通常の結果
- 検索サジェスト: 検索エンジンからの関連クエリ候補
エラーレスポンス
400 - バリデーションエラー
{
"success": false,
"error": "Validation error",
"details": {
"issues": [
{
"field": "engine",
"message": "Invalid enum value. Expected 'google', received 'invalid'",
"code": "invalid_enum_value"
}
],
"messages": ["Invalid enum value. Expected 'google', received 'invalid'"]
}
}401 - 認証エラー
{
"success": false,
"error": "Invalid API key"
}402 - 支払いが必要
{
"success": false,
"error": "Insufficient credits. Please upgrade your plan or purchase more credits."
}ベストプラクティス
検索エンジンの選び方
- 一般的な Web 検索 →
googleを使う(現時点で唯一対応) - 多言語検索 → 適切な
langを指定する - 幅広い調査 →
pagesを増やしてより多くの結果を取得する
パフォーマンス
- バッチ: 複数回呼ぶ代わりに
pagesで 1 リクエストにまとめる - 言語指定: 地域に合わせた言語でローカライズ結果を得やすくする
- クエリ: 具体的なキーワード・フレーズで品質を上げる
エラー処理
try {
const response = await fetch("/v1/search", {
method: "POST",
headers: {
Authorization: "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
query: "artificial intelligence",
pages: 2,
}),
});
const result = await response.json();
if (result.success) {
// 成功時の処理
console.log("Found results:", result.data.length);
// 検索結果とサジェストを分ける
const searchResults = result.data.filter((item) => item.url);
const suggestions = result.data.filter((item) => !item.url);
console.log("Search Results:", searchResults.length);
console.log("Suggestions:", suggestions.length);
} else {
// 検索失敗
console.error("Search failed:", result.error);
}
} catch (error) {
// ネットワークエラー
console.error("Request failed:", error);
}高同時実行の使い方
API はネイティブに高同時実行に対応しています。レート制限を気にせず、複数の検索リクエストを同時に送れます。
// 同時検索の例
const queries = ["machine learning", "artificial intelligence", "data science"];
const searchPromises = queries.map((query) =>
fetch("/v1/search", {
method: "POST",
headers: {
Authorization: "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({ query, engine: "google", pages: 2 }),
}).then((res) => res.json())
);
// すべて同時実行され、すぐに返る
const results = await Promise.all(searchPromises);
console.log(`Completed ${results.length} searches simultaneously`);レート制限とクレジット
- 消費クレジットは、リクエストしたページ数に基づきます
- クレジット消費 = ページ数(例:
pages: 3なら 3 クレジット) - 同時リクエストに対するレート制限はありません — API は高同時実行をネイティブにサポートします
- クレジット使用量はレスポンスヘッダーなどで確認してください
よくある質問
Q: 言語設定はいつ変えるべきですか?
A:
- 英語(
en): グローバルな結果や国際的なコンテンツ向け - 中国語(
zh): 中国語コンテンツや中国向けの結果向け - 地域バリアント(例:
en-GB、fr-CA): 国・地域に合わせたローカライズ結果向け
Q: 想定より結果が少ないのはなぜですか?
A: 次のような理由が考えられます。
- クエリが細かすぎる、またはマイナーな語だけを使っている
- クエリの言語と
langが合っていない - トピックや地域によって検索エンジンの制約がある
- ネットワークの問題
Q: 地域を絞った検索はどうすればよいですか?
A: 現在、API は lang に基づいて適切な地域を自動選択します。次を推奨します。
- 対象地域に合う言語コードを使う(例: 英国向けは
en-GB) - 必要ならクエリに地域固有の語を含める
Q: 検索結果とサジェストの違いは?
A:
- 検索結果: タイトル、URL、説明、ソースが揃ったエントリ
- 検索サジェスト: URL のない関連クエリ候補。クエリ拡張に有用
Q: 同時検索にレート制限はありますか?
A: ありません。API はネイティブに高同時実行をサポートしており、複数リクエストを同時に送ってもレート制限の心配はなく、すぐにデータが返ります。
言語・地域の対応
Search API は lang で複数の言語・地域に対応します。対応ロケールは次のとおりです。
主要言語
all- すべての言語
英語 🌐
en- グローバル英語en-AU- 英語(オーストラリア)🇦🇺en-CA- 英語(カナダ)🇨🇦en-GB- 英語(イギリス)🇬🇧en-IE- 英語(アイルランド)🇮🇪en-IN- 英語(インド)🇮🇳en-NZ- 英語(ニュージーランド)🇳🇿en-PH- 英語(フィリピン)🇵🇭en-PK- 英語(パキスタン)🇵🇰en-SG- 英語(シンガポール)🇸🇬en-US- 英語(アメリカ)🇺🇸en-ZA- 英語(南アフリカ)🇿🇦
中国語 🌐
zh- グローバル中国語zh-CN- 中国語(中国)🇨🇳zh-HK- 中国語(香港)🇭🇰zh-TW- 中国語(台湾)🇹🇼
スペイン語 🌐
es- グローバルスペイン語es-AR- スペイン語(アルゼンチン)🇦🇷es-CL- スペイン語(チリ)🇨🇱es-CO- スペイン語(コロンビア)🇨🇴es-ES- スペイン語(スペイン)🇪🇸es-MX- スペイン語(メキシコ)🇲🇽es-PE- スペイン語(ペルー)🇵🇪
フランス語 🌐
fr- グローバルフランス語fr-BE- フランス語(ベルギー)🇧🇪fr-CA- フランス語(カナダ)🇨🇦fr-CH- フランス語(スイス)🇨🇭fr-FR- フランス語(フランス)🇫🇷
ドイツ語 🌐
de- グローバルドイツ語de-AT- ドイツ語(オーストリア)🇦🇹de-BE- ドイツ語(ベルギー)🇧🇪de-CH- ドイツ語(スイス)🇨🇭de-DE- ドイツ語(ドイツ)🇩🇪
ポルトガル語 🌐
pt- グローバルポルトガル語pt-BR- ポルトガル語(ブラジル)🇧🇷pt-PT- ポルトガル語(ポルトガル)🇵🇹
イタリア語 🌐
it- グローバルイタリア語it-CH- イタリア語(スイス)🇨🇭it-IT- イタリア語(イタリア)🇮🇹
日本語 🌐
ja- グローバル日本語ja-JP- 日本語(日本)🇯🇵
韓国語 🌐
ko- グローバル韓国語ko-KR- 韓国語(韓国)🇰🇷
ロシア語 🌐
ru- グローバルロシア語ru-RU- ロシア語(ロシア)🇷🇺
ヨーロッパの言語
オランダ語 🌐
nl- グローバルオランダ語nl-BE- オランダ語(ベルギー)🇧🇪nl-NL- オランダ語(オランダ)🇳🇱
ポーランド語 🌐
pl- グローバルポーランド語pl-PL- ポーランド語(ポーランド)🇵🇱
チェコ語 🌐
cs- グローバルチェコ語cs-CZ- チェコ語(チェコ)🇨🇿
ハンガリー語 🌐
hu- グローバルハンガリー語hu-HU- ハンガリー語(ハンガリー)🇭🇺
ルーマニア語 🌐
ro- グローバルルーマニア語ro-RO- ルーマニア語(ルーマニア)🇷🇴
ギリシャ語 🌐
el- グローバルギリシャ語el-GR- ギリシャ語(ギリシャ)🇬🇷
ブルガリア語 🌐
bg- グローバルブルガリア語bg-BG- ブルガリア語(ブルガリア)🇧🇬
クロアチア語 🌐
hr- グローバルクロアチア語
スロバキア語 🌐
sk- グローバルスロバキア語
スロベニア語 🌐
sl- グローバルスロベニア語
エストニア語 🌐
et- グローバルエストニア語et-EE- エストニア語(エストニア)🇪🇪
ラトビア語 🌐
lv- グローバルラトビア語
リトアニア語 🌐
lt- グローバルリトアニア語
フィンランド語 🌐
fi- グローバルフィンランド語fi-FI- フィンランド語(フィンランド)🇫🇮
スウェーデン語 🌐
sv- グローバルスウェーデン語sv-SE- スウェーデン語(スウェーデン)🇸🇪
ノルウェー語 🌐
nb- ノルウェー語ブークモールnb-NO- ノルウェー語ブークモール(ノルウェー)🇳🇴
デンマーク語 🌐
da- グローバルデンマーク語da-DK- デンマーク語(デンマーク)🇩🇰
アイスランド語 🌐
is- グローバルアイスランド語
その他の言語
アラビア語 🌐
ar- グローバルアラビア語ar-SA- アラビア語(サウジアラビア)🇸🇦
ヘブライ語 🇮🇱
he- ヘブライ語
トルコ語 🌐
tr- グローバルトルコ語tr-TR- トルコ語(トルコ)🇹🇷
ペルシア語 🌐
fa- ペルシア語
ヒンディー語 🌐
hi- ヒンディー語
ウルドゥー語 🌐
ur- ウルドゥー語
タイ語 🌐
th- グローバルタイ語th-TH- タイ語(タイ)🇹🇭
ベトナム語 🌐
vi- グローバルベトナム語vi-VN- ベトナム語(ベトナム)🇻🇳
インドネシア語 🌐
id- グローバルインドネシア語id-ID- インドネシア語(インドネシア)🇮🇩
インドの言語
kn- カンナダ語 🌐ml- マラヤーラム語 🌐mr- マラーティー語 🌐ta- タミル語 🌐te- テルグ語 🌐
その他のヨーロッパの言語
af- アフリカーンス語 🌐be- ベラルーシ語 🌐ca- カタルーニャ語 🌐cy- ウェールズ語 🌐eu- バスク語 🌐ga- アイルランド語 🌐gd- スコットランド・ゲール語 🌐gl- ガリシア語 🌐sq- アルバニア語 🌐uk- ウクライナ語 🌐
利用上の注意
- グローバルコード(例:
en、zh、es)は国の制限なしで広めの結果になりやすい - 国・地域付きコード(例:
en-US、zh-CN、es-MX)は特定地域向けのローカライズ結果になりやすい - API は指定ロケールに応じて適切な Google ドメインと言語設定を自動選択します
- 最良の結果のため、クエリの言語と
langを揃えてください