API endpointリファレンス
すべてのFourA API endpointのリファレンスです。requestパラメータおよびresponse形式を含みます。
Base URL
https://eu.api.foura.ai/api
認証
すべてのrequestには、X-API-Key headerにAPI keyを含める必要があります:
curl -X POST https://eu.api.foura.ai/api/single/ \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"method": "GET", "url": "https://example.com"}'
DashboardでAPIキーを作成および管理します。キーにはプレフィックスpk_live_が使用されます。
Response Headers
/api/*からのレスポンスには、2つの関連付け用headerが含まれます:
| Header | Value | Description |
|---|---|---|
X-FourA-Request-Id |
UUID | requestに割り当てられた一意のID。FourAが完全に読み取れないbodyを除き、4xxおよび5xxを含むすべてのresponseで返されます(400 Invalid JSON in request bodyおよび413はIDが割り当てられる前に拒否されます)。クライアント側でログに記録してください。 |
X-FourA-Credits |
integer | このrequestで消費されたクレジット。成功か失敗かを問わず、エンジンに到達したすべてのresponseで返されます(いずれの場合も処理が実行されたため)。エンジン実行前にFourAが拒否した呼び出し(キーの欠落または無効、プランやプラットフォームの制限、拒否されたターゲットまたはproxy ID)には含まれません。課金対象となる結果についてはRequest Outcomesを参照してください。 |
同じrequest IDはDashboardのActivity Log(24時間保持、キーごとに最新200件)におけるrequestおよびresponseのペイロードプレビューのキーとなるため、後から正確なrequestを検索し、Activityから直接Playgroundへリプレイできます。サポートに問い合わせる際にこれを含めると、該当するrequestを即座に特定できます。
$ curl -i -X POST https://eu.api.foura.ai/api/single/ \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"method": "GET", "url": "https://example.com"}'
HTTP/2 200
content-type: application/json
x-foura-request-id: 8f3e2a14-7b6c-4d1a-9e2f-5a3b8c1d4e7f
x-foura-credits: 2
...
完全なリストと使用上のヒントについては、Response Headersを参照してください。
Endpoints
MCP経由でこれらのエンドポイントを使用する場合:
@fouradata/mcpサーバーは、4つのエンドポイントすべてをネイティブMCPツール(foura_auto、foura_single、foura_proxy、foura_browser)としてラップしています。同じ入力形状に加え、トークン効率の良い大容量レスポンス処理のためのoffload_largeオプトインも提供します。
FourAは、それぞれ異なるシナリオ向けに最適化された4つのリクエストエンドポイントを提供します。
| Endpoint | Best for |
|---|---|
POST /auto/ |
スマートフェッチ。URLを渡すと、FourAが機能する最も低コストなパス(ダイレクト、ローテーションプロキシ、ブラウザ)を選択し、ホストごとに動作したパスを記憶します。 |
POST /single/ |
高速なHTTPリクエスト、静的ページ、API |
POST /proxy/ |
自動プロキシローテーションを備えた保護対象サイト、オプションのターゲット可視国スコープ |
POST /browser/ |
JavaScriptレンダリングページ、SPA |
GET /profiles |
singleおよびproxy用のブラウザプロファイルカタログ。公開、APIキー不要。 |
各エンドポイントの選択基準に関する詳細なガイドについては、Choosing the Right EndpointおよびSmart Fetch guideを参照してください。
Target URL Restrictions
プライベート、ループバック、または予約済みIP範囲(RFC 5735、RFC 6598、IPv6予約済みブロック)に解決されるターゲットは、リクエストがFourAから送信される前に400エラーで拒絶されます。パブリックホスト名およびIPのみが転送されます。
{ "error": "Refusing to fetch <target>: target resolves to a private or reserved IP range. The FourA scraping API only forwards requests to public internet hosts." }
Smart Fetch (Auto)
POST /api/auto/
URLと任意のvalidateルールを渡します。FourAはコストを考慮したラダー(低コストな直接プローブ、ローテーションproxy、フルブラウザ)を順に実行し、ルールに合致するレスポンスが返された最初の段階で停止します。同一ホストへの再リクエスト時はウォームセッションが再利用されるため、2回目以降のアクセスは低コストになります。
リトライ回数、プールサイズ、proxy数を手動調整する必要はありません。FourAがホストごとに学習します。
Request Body
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
url |
string | Yes | - | ターゲットURL |
method |
string | No | "GET" |
HTTPメソッド |
headers |
[string, string][] | No | - | [name, value] ペア形式のカスタムheader |
data |
any | No | - | GET以外のrequest用request body |
validate |
object | No | - | 成功判定基準。Single Requestのvalidateと同じ形式です(下記参照)。正常なページ構造をautoに指定し、正規コンテンツとチャレンジページを識別できるようにします。 |
returnSession |
boolean | No | true |
成功したセッション情報(proxy, cookies, userAgent)をresponseに含め、/api/single/または/api/browser/で再利用可能にします。 |
forceProxy |
boolean | No | true |
常にローテーションproxy経由でルーティングします。ターゲットが許可する場合に、より低コストな直接通信を許可するにはfalseを設定します(一部の防御機構はproxyトラフィックに対してより厳密です)。 |
timeout_ms |
integer | No | 120000 |
コール全体の合計許容時間(ミリ秒単位)。すべてのサブ試行はこの時間制限内で実行されます。最小 5000、最大 180000。 |
ignoreProxies |
string[] | No | - | すべてのサブ試行で除外するproxy ID。以前の/api/auto/または/api/proxy/のresponseで返されたIDを使用します。 |
followRedirects |
integer | No | 5 |
低コストなラダー段階で追跡する最大リダイレクト数。無効化する場合は0。最大 20。 |
Response
{
"status": 200,
"data": "<!doctype html>...",
"headers": [{"content-type": "text/html"}],
"meta": {
"rung": "cache",
"solved": false,
"attempts": 1,
"credits": 2
},
"session": {
"proxy": "A1B2C3",
"cookies": [{"name": "session", "value": "abc", "domain": "example.com"}],
"userAgent": "Mozilla/5.0..."
}
}
| フィールド | 型 | 説明 |
|---|---|---|
status |
number | ターゲットからの HTTP ステータス。 |
data |
string | テキスト形式の response body。どのラダー層が処理した場合でもテキストとして返されます。JSON ページは JSON テキストとして返されるため、自身でパースしてください。 |
headers |
array or object | ターゲットの response header。Single および proxy 層はホップごとの header オブジェクトの配列を返し、browser 層はフラットなオブジェクトを返します。 |
meta.rung |
string | レスポンスを返送したラダー層。次のいずれか: probe(低コストな直接リクエスト)、proxy(ローテーション proxy)、browser(完全なブラウザレンダリング)、cache(ウォームセッションの再利用)、warmup(サイトのエントリページを先に取得し、その cookie で詳細 URL を開いた)、または fail(いずれの層でも有効なレスポンスが生成されなかった)。 |
meta.solved |
boolean | ページに追加のステップ(チャレンジページ)が必要であり、この呼び出し中に完了したかどうか。 |
meta.attempts |
number | 成功までに実行されたサブ試行回数。 |
meta.credits |
number | この呼び出しで消費された合計クレジット。X-FourA-Credits と一致します。 |
session.proxy |
string | レスポンスを返送した proxy のエンコード済み ID。Single または Browser リクエストで再利用可能です。returnSession が true の場合に存在します。 |
session.cookies |
array | 成功した試行の cookie。returnSession が true の場合に存在します。 |
session.userAgent |
string | 成功した試行で使用された User-Agent。returnSession が true の場合に存在します。 |
error |
string | 呼び出しが失敗した場合のエラーメッセージ。 |
例
curl -X POST https://eu.api.foura.ai/api/auto/ \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"url": "https://example.com/product/42",
"validate": {"data": {"accept": ["Add to cart"]}}
}'
注意事項
- Autoはコーディネーターとして機能します。内部でSingle、Proxy、またはBrowserを呼び出し、各サブコールにAPI keyを転送します。Autoの呼び出しはActivity LogおよびOverview上で1件のrequestとして記録され、サブコールのクレジット合計が適用されます。サブコールはその試行(attempts)として配下にリストされ、個別のrequestとしてはカウントされません。
- 実際のページにのみ含まれる部分文字列を指定して
validate.data.acceptを渡してください。これがない場合、Autoは実際の200応答と、ステータス200で返されるチャレンジ中間ページを区別できません。 timeout_msは呼び出し全体の上限時間を設定します。保護されたサイトへの初回コールドアクセスには数十秒かかる場合がありますが、再利用されたウォームセッションは通常1秒未満で完了します。
Single Request
POST /api/single/
実際のブラウザを起動することなく、ブラウザに酷似した通信特性を持つHTTP requestを送信します。最も高速なendpointです。
Request Body
| パラメータ | 型 | 必須 | デフォルト | 説明 |
|---|---|---|---|---|
method |
string | はい | - | HTTPメソッド: GET, POST, PUT, PATCH, DELETE, HEAD, OPTIONS |
url |
string | はい | - | ターゲットURL。URL内の任意の場所に {ts} を使用すると、キャッシュ無効化用の現在タイムスタンプが挿入されます。 |
headers |
[string, string][] | いいえ | - | [name, value] ペア形式のカスタムヘッダー |
unblocker |
boolean | いいえ | true |
リアルなブラウザヘッダー (User-Agent, Sec-Ch-Ua, Sec-Fetch-*, Accept-Encoding) を送信します。デフォルトで有効です。プレーンなクライアント署名を送信する場合は false に設定します。 |
timeout_ms |
number | いいえ | 15000 | 全体のタイムアウト (ミリ秒単位、最大: 120000) |
connect_timeout_ms |
number | いいえ | 5000 | 接続タイムアウト (ミリ秒単位) |
accept_timeout_ms |
number | いいえ | 5000 | 接続受付タイムアウト (接続受付を待機する時間、ミリ秒単位) |
server_response_timeout_ms |
number | いいえ | 15000 | サーバー応答タイムアウト (最初のバイトを待機する時間、ミリ秒単位) |
dns_cache_timeout_sec |
number | いいえ | 120 | DNSキャッシュTTL (秒単位、最大: 240) |
followRedirects |
number | いいえ | disabled | 追跡する最大リダイレクト数 (0-20)。無効にする場合は省略します。 |
tryJsonData |
boolean | いいえ | false | 可能な場合、レスポンスボディをJSONとしてパースします |
returnBuffer |
boolean | いいえ | false | デコードされた文字列の代わりにRAWバッファを返します |
data |
any | いいえ | - | リクエストボディ (文字列またはオブジェクト、JSONに自動シリアライズ) |
proxy |
string | いいえ | - | 同一の出口に固定するための、過去のレスポンスに含まれるプロキシID。不透明な文字列をそのまま返行します。生のプロキシアドレスは 400 Invalid proxy format で拒否されます。一部のIDは固定できません: 出口の固定 を参照してください。 |
browser |
string | いいえ | Chrome | 提示するブラウザ: Chrome, Edge, Safari, Firefox, または Tor。ブラウザプロファイル を参照してください。 |
os |
string | いいえ | - | 提示するオペレーティングシステム: Windows, macOS, Android, または iOS。ファミリー名はそのすべてのバージョンを受け入れます。 |
version |
string | いいえ | newest | カタログに記載されている、提示するブラウザバージョン。複数適合する場合は最新の一致が優先されます。 |
profile |
string | いいえ | - | 上記3つのフィールドの代わりに使用する、GET /api/profiles からの正確なプロファイルID。 |
validate |
object | いいえ | - | レスポンス検証ルール (下記参照) |
Browser profiles
デフォルトでは、リクエストは最新のGoogle Chromeを提示します。一部のターゲットは特定のブラウザを受け入れ、別のブラウザを拒否するため、browser、os、version を使用して測定済みプロファイルのカタログを絞り込み、profile でIDによって直接選択します。
{
"method": "GET",
"url": "https://example.com",
"browser": "Firefox",
"os": "Windows"
}
ルール:
- 選択には
unblockerが必要です(デフォルトで有効)。unblockerが無効の場合、ブラウザヘッダーが送信されないため、中途半端に適用されるのではなくリクエストが拒否されます。 - 複数のプロファイルが一致する場合、最新のバージョンが優先されます。
- カタログに存在しない組み合わせの場合は、利用可能な項目を示すエラーが返されます。リクエストが別のブラウザとして送信されることはありません。
POST /proxy/のrequestオブジェクト内でも同じ4つのフィールドを使用できます。
GET /api/profilesはカタログ全体を返し、APIキーは不要です:
{
"profiles": [
{ "id": "...", "browser": "Chrome", "version": "...", "os": "...", "osFamily": "macOS" }
],
"default": "..."
}
osFamily はピッカーの構築時にフィルタリングに使用する値です。os は表示用のリリース名を保持します。
バリデーションルール
validate オブジェクトを使用すると、成功と失敗の条件を定義できます。fail 条件に一致した場合、request は失敗として扱われます。accept 条件が設定されている場合、一致した response のみが成功として扱われます。
{
"validate": {
"status": { "accept": [200, 201], "fail": [403, 503] },
"headers": { "accept": {"content-type": "application/json"} },
"data": { "accept": ["product"], "fail": ["captcha", "blocked"] }
}
}
| フィールド | 型 | 説明 |
|---|---|---|
validate.status.accept |
number[] | 許可する HTTP ステータスコード |
validate.status.fail |
number[] | 拒絶する HTTP ステータスコード |
validate.headers.accept |
object | 必須となるヘッダーのキーと値のペア |
validate.headers.fail |
object | 失敗と判定されるヘッダーのキーと値のペア |
validate.data.accept |
string[] | response body に含まれる必要がある文字列 |
validate.data.fail |
string[] | 失敗と判定される response body 内の文字列 |
例
curl -X POST https://eu.api.foura.ai/api/single/ \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"method": "GET",
"url": "https://example.com/products",
"timeout_ms": 10000
}'
Response:
{
"status": 200,
"headers": [{"result": {"version": "HTTP/2", "code": 200, "reason": ""}, "content-type": "text/html", "server": "...", "set-cookie": ["session=abc", "tracker=xyz"]}],
"data": "<!doctype html>...",
"total_time": 0.342,
"proxy": "A1B2C3"
}
ターゲットがbodyの取得前にbotチェックを実行した場合、responseにはベンダー名およびチェックをクリアできたかどうかを示すdefenseオブジェクトも含まれます:
{
"status": 200,
"data": "<!doctype html>...",
"total_time": 3.61,
"defense": {
"vendor": "sgcaptcha",
"solved": true,
"present": ["sgcaptcha"],
"ms": 3412,
"cookie": "_I_=<clearance>"
}
}
| フィールド | 型 | 説明 |
|---|---|---|
status |
number | ターゲットからの HTTP ステータスコード |
headers |
array | リダイレクトホップごとのオブジェクト。各オブジェクトにはステータスラインとすべてのレスポンス header を含む result フィールドがあります。複数値の header (Set-Cookie, Link, WWW-Authenticate) は文字列の配列として返されます。 |
data |
string/object | レスポンス body (tryJsonData が true の場合は JSON) |
total_time |
number | 合計リクエスト時間 (秒) |
proxy |
string | リクエストが経由した proxy のエンコード済み ID (リクエストで proxy が指定された場合のみ)。後続の呼び出しで再利用して同じイグジットを固定します。 |
defense |
object | ターゲットがこのリクエストで bot チェックを実行した場合、またはサイト独自の cookie を使用したリトライで body が生成された場合に存在します。defense.solved はチェックがクリアされたかを示し、defense.retry はリトライでコンテンツを取得できたかを示します。すべてのフィールドおよびシステムの完全なリストについては Site checks を参照してください。 |
error |
string | リクエストが失敗した場合のエラーメッセージ |
Proxy Request
POST /api/proxy/
ローテーションする proxy を経由してリクエストをルーティングし、失敗時には自動でリトライします。オプションで、ターゲットから認識されるイグジット国のセットに対象を絞り込むことができます。
Request Body
| パラメータ | 型 | 必須 | デフォルト | 説明 |
|---|---|---|---|---|
request |
object | はい | - | 単一のリクエスト body (上記の Single Request と同じフィールド) |
timeout_ms |
number | いいえ | 45000 | すべての試行に対する全体のタイムアウト (ミリ秒、最大: 120000) |
maxTries |
number | いいえ | 5 | 最大 proxy ローテーション試行回数 (最大: 90) |
ignoreProxies |
string[] | いいえ | - | ローテーションから除外する proxy ID (以前のレスポンスで返された ID を使用) |
exitCountries |
string[] | いいえ | - | ターゲットから認識される 2 文字の国コードの厳密な許可リスト (例: ["CZ", "GB"])。値はトリム、大文字化、および重複排除されます。イグジットが不明な proxy は除外され、リクエストが要求されていない国にフォールバックすることはありません。 |
exitClass |
string | いいえ | - | standard または premium。premium は、保護されたターゲットで標準プールが失敗した場合に、リクエストをプレミアムイグジットにエスカレーションすることを許可します。プレミアムイグジットを含むプランが必要です。 |
exitCountries のスコープ設定
選択には、利用可能な最新のターゲット可視国メタデータが使用され、通常は約 10 分以内に更新されます。リクエスト時のリアルタイムの位置情報ルックアップではありません。proxy ホストアドレスから配信国を推測しないでください。
現在のプールに要求された国と一致するものがない場合、レスポンスはエラーエンベロープとともに HTTP 200 を返します:
{
"error": "No eligible proxy found for exit countries: CZ, GB",
"code": "no_eligible_proxy",
"details": { "exitCountries": ["CZ", "GB"] },
"total": 0.084
}
要求されたスコープを維持し、後で再試行してください。ワークフローの国要件が明示的に変更された場合にのみ、スコープを変更または拡張してください。
例
curl -X POST https://eu.api.foura.ai/api/proxy/ \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"maxTries": 3,
"exitCountries": ["CZ", "GB"],
"request": {
"method": "GET",
"url": "https://example.com/prices"
}
}'
Response:
{
"status": 200,
"headers": [{"result": {"code": 200}, "content-type": "text/html", "set-cookie": ["a=1", "b=2"]}],
"data": "<!doctype html>...",
"total_time": 1.204,
"proxy": "A1B2C3",
"exitCountry": "CZ",
"total": 2.341
}
| フィールド | 型 | 説明 |
|---|---|---|
proxy |
string | 使用された proxy のエンコード済み識別子。proxy フィールドとして渡すことで Single または Browser リクエストで再利用するか、ignoreProxies 経由で次の Proxy リクエストでスキップします。 |
exitCountry |
string | リクエストを処理した proxy のターゲットから見える2文字の国コード。リクエストで exitCountries を設定した場合にのみ存在します。レスポンスを信頼する前に、要求したコードのいずれかであることを必ず検証してください。 |
exitClass |
string | このリクエストを処理した exit のクラス。リクエストで指定された場合、成功したレスポンスに含まれます。premium は premium exit が body を返したことを意味し、standard は standard pool が返したことを意味します。失敗した呼び出しは何も返さないため exitClass は含まれません。試行結果については attemptReport を確認してください。 |
total |
number | 外部の実時間(秒単位、float)。proxy 選択、リトライ、成功した試行を含みます。total_time は内部リクエストのみです。total は常に total_time 以上になります。 |
profile |
string | ローテーションによって選択されたブラウザプロファイル。要求したものと異なっていた場合にのみ存在します。存在しない場合は、リクエストが記述どおりに送信されたことを意味します。動作したブラウザを維持するには、後続の呼び出しで id を profile として返してください。 |
error |
string | リクエストが失敗した場合のエラーメッセージ。scope miss の場合、code は no_eligible_proxy となり、details.exitCountries に正規化された scope がエコーされます。 |
attemptReport |
object | 失敗したすべての Proxy 呼び出しに存在します。試行で発生した事象をカウントするため、ブロックされたプール、停止したプール、一致しなかった validate ルールがすべて同じエラーとして扱われることはありません。下記を参照してください。 |
すべての Single Request レスポンスフィールドも含まれ、defense もその1つです。bot 検知に遭遇した proxy の試行は、Single と同じ方法で報告されます。
Proxy 呼び出しが失敗した理由
試行がどのような結果になっても Download maxTry limit reached の表示は同じであるため、失敗したすべての Proxy レスポンスにはエラーの横に attemptReport が含まれます。
{
"error": "Download maxTry limit reached",
"attemptReport": {
"total": 25,
"noResponse": 0,
"defense": 0,
"contentRejected": 25,
"statusRejected": 0,
"other": 0,
"vendors": [],
"profilesTried": ["default"],
"summary": "25 attempt(s): 25 returned HTTP 200 with no defense present and were rejected only by your validate.data - the page was fetched, your content rule did not match it"
},
"total": 34.812
}
| フィールド | 型 | 説明 |
|---|---|---|
total |
integer | 試行回数 |
noResponse |
integer | 出口ノードが応答せず、サイトに到達しなかった回数 |
defense |
integer | サイトは応答したが、その応答で Bot 検知が認識された回数 |
contentRejected |
integer | HTTP 200 かつ Bot 検知なし、設定した validate.data のみにより拒否された回数 |
statusRejected |
integer | サイトは応答し Bot 検知はなかったが、設定した validate.status により拒否された回数 |
other |
integer | 応答があり、上記のいずれにも該当しない回数 |
vendors |
string[] | タスク内で認識された Bot 検知ベンダー |
profilesTried |
string[] | タスクが送信したブラウザプロファイル(初回使用順)。default はリクエストが変更されずに送信されたことを意味します。 |
summary |
string | 各カウントから生成された1文(ログ記録用として安全) |
error 文字列は変更されないため、この文字列でマッチングを行うクライアントはそのまま動作します。各カウントへの対処方法: Proxy Request の試行回数が上限に達した理由。
exitClass
ターゲットによっては、何度試行しても標準プールの出口ノードを拒否する場合があります。exitClass: premium を指定すると、Proxy は標準プール内でのみローテーションするのではなく、該当リクエストを標準プールに加えてプレミアム出口ノードへエスカレーションできるようになります。
{
"exitClass": "premium",
"request": { "method": "GET", "url": "https://example.com/report" }
}
送信前に知っておくべき3つの点があります。
これは許可であり、強制的な指示ではありません。 標準プールが引き続き応答を競合し、通常は標準プールが勝利します。プレミアムイグジットが加わるのは、プールがリクエストに短いバジェットを費やした場合、またはターゲットが明示的にリクエストを拒否した場合のみです。プレミアムイグジットを試行する前に標準プールが応答したリクエストは通常の成功となり、プレミアムトラフィックは消費されません。プレミアムイグジットが試行されると、以下に説明するように、そのトラフィックがカウントされます。
レスポンスには実際に処理を行ったものが示されます。 クラスを指定すると、レスポンスに exitClass が返されます:
{
"status": 200,
"exitClass": "premium",
"proxy": "Y2QXVK",
"data": "..."
}
premium はプレミアムイグジットがボディを返したことを示します。standard はスタンダードプールが返したことを意味し、プレミアムイグジットを取得できなかった場合や、プランに含まれるプレミアムトラフィック(および追加購入分)が請求期間内で消費された場合にもこの結果になります。どちらもエラーではなく、月次の合計ではなくリクエストごとにプレミアムトラフィックを照合できます。同じ値が X-FourA-Exit-Class レスポンスヘッダーでも返されます(Response Headers を参照)。
プレミアムトラフィックはネットワーク上で測定されます。 プレミアムの試行では、ページが返されたかどうかに関係なく、圧縮および暗号化された状態でネットワーク上を通過した送受信バイト数がカウントされます。別のイグジットが応答した時点でまだ実行中だった試行は即座に停止され、カウントされません。プレミアムトラフィックはプレミアム利用枠にカウントされ、総帯域幅の内数としても計上されます(同じバイト数が2箇所で報告され、合算はされません)。プレミアムイグジットがページを配信した場合、そのトラフィックがリクエスト全体のトラフィックとなるため、スタンダードトラフィックとして重複カウントされることはありません。Usage & Limits ページには、総トラフィック、そのうちのプレミアム比率、測定基準となるプレミアム利用枠が表示されます。
フィールドの省略は standard を送信することと同じではありません。省略した場合は決定が未指定のままになりますが、standard を送信するとこのリクエストがプレミアムにエスカレーションしてはならないことを明示的に指定します。特定のジョブをプレミアムトラフィックから完全に除外するにはこの方法を使用します。
利用枠の使い切りはエラーではありません。 利用枠を使い切った後に premium を指定したリクエストも動作し続けます。スタンダードプールから配信され、レスポンスには standard が示されます。利用枠の使い切りによってジョブが停止することはありません。
exitClass: premium にはプレミアムイグジットを含むプランが必要です。それを含まないプランでは、リクエストがプレミアムイグジットを消費することは一切ありません。X-FourA-Limit: plan_limit_premium を伴う 403 で拒否されるか(Rate Limits を参照)、レスポンスに exitClass: standard が含まれた状態でスタンダードプールから配信されます。両方のケースを処理してください。
Browser Profile Rotation
Proxy はイグジットをローテーションします。サイトがイグジット元ではなく FourA が提示したブラウザを拒否した場合、Proxy はカタログ内の別のブラウザファミリーにも切り替えます。これにより試行回数が増えることはありません。ローテーションはリトライ時に送信する内容を変更するのみで、リトライが実行されるかどうかに影響しません。
また、Proxy はサイトが最後に受け入れたファミリーを一定期間記憶するため、同じサイトへの以降の呼び出しではデフォルトではなくそのファミリーから開始できます。ローテーションが選択したファミリーと同様に、レスポンスの profile にその名前が指定されます。
内部の request で明示的に指定された profile、browser、os、または version は上書きされません。クリアランスはそれを取得したシグネチャに紐付けられているため、独自の User-Agent または Cookie ヘッダーを持つリクエストも同様に上書きされません。
Browser Request
POST /api/browser/
Chromeブラウザインスタンスで指定したURLを開きます。ページが読み込まれ、JavaScriptが実行され、完全にレンダリングされたHTMLとCookie jarを取得できます。
Request Body
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
url |
string | Yes | - | 対象URL |
headers |
object | No | - | キーと値のペアによるカスタムヘッダー |
cookies |
array | No | - | 設定するCookie: [{name, value, domain?}] |
userAgent |
string | No | - | カスタムUser-Agent文字列 |
unblocker |
boolean | No | true |
ページ読み込み前に要求されるチェック(チャレンジページなど)を完了します。デフォルトで有効です。falseに設定すると、チャレンジページを含め、ページから返された内容をそのままレンダリングします。 |
proxy |
string | No | - | 同一の出口を固定するための、以前のレスポンスに含まれるプロキシID。不透明な文字列をそのまま返してください。生のプロキシアドレスは400 Invalid proxy formatで拒否されます。 |
exitCountry |
string | No | - | リクエストの出口となる国の2文字国コード(ISO 3166-1 alpha-2)。ブラウザの時計を一致するタイムゾーンに設定します。Matching the browser clock to the exitを参照してください。 |
timeout_ms |
number | No | 30000 | ページ読み込みタイムアウト(ミリ秒、最大: 120000) |
checkStatus |
number | No | - | 期待されるHTTPステータス(異なる場合はリクエストが失敗) |
checkText |
string | No | - | レンダリングされたページ内に存在する必要があるテキスト |
Matching the browser clock to the exit
Webページはブラウザのタイムゾーンを読み取り、認識したIPアドレスの国と比較できます。この不一致はBot検知における最も低コストなシグナルの1つですが、解消するための追加コストはかかりません。
トラフィックの出口となる国をexitCountryに設定すると、ブラウザはその国に該当するタイムゾーンを返します:
{
"url": "https://example.com",
"proxy": "A1B2C3",
"exitCountry": "BR"
}
ルール:
- 値は出口国です。つまりプロキシがホストされている場所ではなく、ターゲットから見える国を意味します。この2つは無視できない頻度で一致しません。
- 省略した場合、FourAは判明している出口国を使用します。不明な場合は推測せずブラウザの時計を変更しません。
- FourAが認識しない国コードは、フィールドを省略した場合と同様に扱われます。エラーにはなりません。
- 時計のみが国に連動します。
Accept-Languageおよびサイトが配信するコンテンツは変更されないため、ページで言語が勝手に切り替わることはありません。
userAgent パラメータ
userAgentを送信すると、ページ、Web Worker、ターゲットのすべてにその文字列がそのまま提示されます。FourAはそこから一致するClient Hints(sec-ch-ua、sec-ch-ua-platform、navigator.platform、および検出機能が明示的に要求する高エントロピー値)も導出するため、リクエストのヘッダーとJavaScriptで異なるブラウザが提示されることはありません。
レスポンス内のuserAgentは、実際に提示された値です。これはクリアランスを再利用する際に重要となります。cf_clearance cookieは、それを取得した出口およびUser-Agentにバインドされるため、使用したと想定される文字列ではなく、レスポンスで報告された文字列を送信してください。サイトチェックを参照してください。
非Chromium文字列(FirefoxのUser-Agentなど)を送信した場合、Chromiumブランドリストは付与されず、そのまま提示されます。
例
curl -X POST https://eu.api.foura.ai/api/browser/ \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"url": "https://example.com/spa-app",
"timeout_ms": 15000,
"checkText": "product-list"
}'
Response:
{
"status": 200,
"headers": {"content-type": "text/html"},
"body": "<!doctype html>...",
"cookies": [{"name": "session", "value": "abc123", "domain": "example.com", "path": "/", "expires": 1735689600, "httpOnly": true, "secure": true, "sameSite": "Lax"}],
"userAgent": "Mozilla/5.0...",
"defenseSolved": true,
"defenses": {"present": ["cloudflare"], "cleared": ["cloudflare"]},
"proxy": "A1B2C3"
}
| フィールド | 型 | 説明 |
|---|---|---|
status |
number | ターゲットからの HTTP ステータスコード |
headers |
object | レスポンス headers |
body |
string or object | 完全にレンダリングされたページコンテンツ。content-type が HTML の場合は HTML 文字列、ページが JSON を返して自動パースされた場合は object。 |
cookies |
array | ページからの完全な cookie オブジェクト。各 cookie には name、value、domain、path、expires、httpOnly、secure、sameSite、およびその他の cookie プロパティが含まれます。 |
userAgent |
string | 使用されたブラウザの User-Agent |
defenseSolved |
boolean | この呼び出しで bot 防御に遭遇し、正常にクリアされた場合は true。それ以外の場合は存在しません。呼び出しの消費クレジットが 5 か 10 かを決定します。 |
defenses |
object | present はページの読み込み中に認識されたすべてのベンダーを一覧表示し、cleared は最終ページでクリアランスを保持しているベンダーを一覧表示します。ベンダーは present に現れても cleared に現れない場合があります。サイトチェックを参照してください。 |
proxy |
string | request が経由した proxy のエンコードされた ID(request で proxy が指定された場合のみ)。後続の呼び出しでこれを再利用して同じイグジットを維持します。 |
error |
string | request が失敗した場合のエラーメッセージ |
イグジットの固定
Single または Browser request の proxy 値は、前の呼び出しで使用されたイグジットを固定します。proxy アドレスではなく、受け取ったままの不透明な ID をそのまま渡してください。
次の 3 つの値は拒否され、すべて 400 が返されます:
| エラー | 意味 |
|---|---|
Invalid proxy format |
値が FourA によって発行された ID ではありません。生の proxy アドレスはここに該当します。 |
Proxy not found |
ID はデコードされましたが、有効なイグジットに解決されなくなりました。新しい呼び出しから新しい ID を取得してください。 |
Managed exit: this proxy id cannot be pinned to a request |
イグジットは存在しますが、指定された request に対して FourA が維持するものではありません。プランに使用可能なプレミアムトラフィックが残っていない場合、プレミアムイグジットの ID はここに該当します。返されたセッションを再利用するか、POST /api/proxy/ 経由で呼び出しを実行して自動選択されたイグジットを使用してください。 |
固定されたプレミアムイグジットはプレミアムトラフィックとして計測されます。レスポンスには X-FourA-Exit-Class: premium が含まれるため request ごとに確認でき、サイトが目的のページを返したかどうかに関係なく、イグジットが転送したトラフィックは 使用量と制限 ページのプレミアムトラフィックおよび合計帯域幅にカウントされます。固定にはプラン内のプレミアムイグジットと残りの許容量が必要です。そうでない場合、ID は上記のマネージドイグジットの 400 エラーで拒否されます。
HTTP ステータスコード
| コード | 意味 |
|---|---|
| 200 | リクエスト完了 (ターゲットのレスポンスについては内部の status を確認) |
| 400 | 無効なリクエストボディ、パラメータ、プライベート/予約範囲のターゲットIP、または固定できないプロキシID |
| 401 | APIキーがないか無効 |
| 403 | エンドポイントまたはパラメータがプランに含まれていません。X-FourA-Limit に記載: plan_limit_feature または plan_limit_premium。 |
| 404 | Not Found: そのパスにエンドポイントが存在しません。 |
| 413 | JSONリクエストボディが 100 KB を超えています。応答は JSON ではなく、X-FourA-Request-Id も含まれません。 |
| 429 | プランの上限 (X-FourA-Limit が設定されている場合) またはプラットフォーム共有の1分あたりの許容量 (ヘッダーなしの場合) |
| 500 | 内部サーバーエラー |
| 502 | Upstream unavailable。FourA はエンジンに到達しましたが、応答が使用不可でした。再試行してください。 |
| 503 | サービスが一時的に無効化されているか容量上限に達している、またはエンジンの再起動中に Backend service unavailable が発生 |
| 504 | Upstream timeout。エンジンがこのリクエストの制限時間内に完了しませんでした。timeout_ms を増やすか再試行してください。 |
次のステップ
- Smart Fetch (Auto): FourA にパスの選択を任せる場合
- 適切なエンドポイントの選択: Single、Proxy、または Browser を手動で選択する場合
- 認証: APIキーの管理
- エラーハンドリング: エラーを適切に処理する
- サイトチェック:
defenseフィールドの読み取りとクリアランスの再実行 - プロキシリクエストの試行回数が上限に達した理由:
attemptReportを読み取って対処する - レート制限: リクエスト制限の理解
- クイックスタート: 30秒で最初のリクエストを実行