Справочник за API Endpoints
Справочник за всички FourA API endpoints с request параметри и response формати.
Базов URL
https://eu.api.foura.ai/api
Удостоверяване
Всяка заявка изисква вашия API ключ в X-API-Key header:
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"}'
Създавайте и управлявайте API ключове в Dashboard. Ключовете използват префикса pk_live_.
Хедъри на отговора
Всеки отговор от /api/* съдържа два корелационни хедъра:
| Хедър | Стойност | Описание |
|---|---|---|
X-FourA-Request-Id |
UUID | Уникален ID, присвоен на заявката. Връща се при всеки отговор, включително 4xx и 5xx. Записвайте го в лог от ваша страна. |
X-FourA-Credits |
цяло число | Кредити, изразходвани за тази заявка. Връщат се при успех и при грешка (работата е извършена и в двата случая). Вижте Резултати от заявките за това кои резултати се таксуват. |
Същият ID на заявката служи като ключ за прегледа на данните (payload) на заявката и отговора в Activity Log на Dashboard (пазят се 24 часа, последните 200 за ключ), така че можете да намерите точната заявка по-късно и да я изпълните отново от Activity директно в Playground. Включете го, когато се свързвате с поддръжката, и той ще локализира заявката за секунди.
$ 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
Използвате тези endpoints чрез MCP?
@fouradata/mcpсървърът обвива и четирите endpoints като нативни MCP инструменти (foura_auto,foura_single,foura_proxy,foura_browser) със същите входни формати плюс опцияoffload_largeза оптимизирана за токени обработка на големи отговори.
FourA предоставя четири request endpoints, всеки оптимизиран за различен сценарий:
| Endpoint | Най-подходящ за |
|---|---|
POST /auto/ |
Интелигентно извличане. Подавате URL, FourA избира най-евтиния работещ път (директен, ротиран proxy или браузър) и запомня кое работи за съответния хост. |
POST /single/ |
Бързи HTTP заявки (requests), статични страници, APIs |
POST /proxy/ |
Защитени сайтове с автоматична ротация на proxy, опционално ограничаване по държава, видима за целта |
POST /browser/ |
Страници, рендирани с JavaScript, SPAs |
GET /profiles |
Каталогът с браузърни профили за single и proxy. Публичен, без API ключ. |
За по-задълбочен преглед кога да изберете всеки от тях, вижте Избор на правилния Endpoint и ръководството за Smart Fetch.
Ограничения за целевия URL
Цели, които се резолвват до частни, loopback или запазени IP диапазони (RFC 5735, RFC 6598, IPv6 запазени блокове), се отхвърлят с 400, преди заявката (request) да напусне FourA. Препращат се само публични хостнеймове и IPs.
{ "error": "Target <ip> resolves to a private/reserved IP" }
Smart Fetch (Автоматично)
POST /api/auto/
Подавате URL адрес плюс опционални validate правила. FourA преминава през съобразена с разходите стълба (евтина директна проверка, ротирано proxy, пълен браузър) и спира на първото стъпало, което връща response, приет от вашите правила. При повтарящи се извиквания към същия хост, вместо това се възпроизвежда топла сесия, така че второто попадение е евтино.
Не настройвате повторни опити, размери на пулове или брой proxy сървъри. FourA ги научава за всеки хост.
Request Body
| Параметър | Тип | Задължителен | По подразбиране | Описание |
|---|---|---|---|---|
url |
string | Да | - | Целеви URL |
method |
string | Не | "GET" |
HTTP метод |
headers |
[string, string][] | Не | - | Потребителски headers като двойки [име, стойност] |
data |
any | Не | - | Request тяло за заявки, различни от GET |
validate |
object | Не | - | Критерии за успех, същата структура като validate на Single Request (вижте по-долу). Кажете на auto как изглежда реална страница, за да може да различи съдържание от challenge страница. |
returnSession |
boolean | Не | true |
Включете печелившата сесия (proxy, cookies, userAgent) в response, за да можете да я възпроизведете чрез /api/single/ или /api/browser/. |
forceProxy |
boolean | Не | true |
Винаги маршрутизирайте през ротиращо proxy. Задайте false, за да позволите по-евтиния директен път, когато целта го позволява (някои защити са по-строги към proxy трафика). |
timeout_ms |
integer | Не | 120000 |
Общ бюджет от време за цялото извикване, в милисекунди. Всички подопити се изпълняват в рамките на този бюджет. Минимум 5000, максимум 180000. |
ignoreProxies |
string[] | Не | - | Proxy ID-та, които да се избягват при всеки подопит. Използвайте ID-та, върнати от предишни /api/auto/ или /api/proxy/ responses. |
followRedirects |
integer | Не | 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 |
число | HTTP статус от целта. |
data |
string или object | Тяло на response. |
headers |
array или object | Целеви response headers. Single и proxy стъпките връщат array от header обекти за всеки хоп; browser стъпките връщат плосък обект. |
meta.rung |
string | Коя стъпка от стълбицата е доставила response. Едно от: probe (евтин директен request), proxy (ротиращ proxy), browser (пълно рендиране в браузър), cache (възпроизведена топла сесия) или fail (нито една стъпка не е дала приет response). |
meta.solved |
boolean | Дали bot challenge е решено по време на това извикване. |
meta.attempts |
число | Направени под-опити преди успех. |
meta.credits |
число | Общо изразходвани кредити за това извикване. Съвпада с X-FourA-Credits. |
session.proxy |
string | Кодирано ID на proxy, което е доставило response. Използвайте го отново при Single или Browser request. Налично, когато returnSession е true. |
session.cookies |
array | Cookies от печелившия опит. Налично, когато 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 ключ към всяко под-извикване. Всяко под-извикване се появява във вашия Журнал на активността; външното
/api/auto/извикване не добавя отделен ред за таксуване. - Подайте
validate.data.acceptс подниз, който се съдържа само в реалната страница. Без него auto не може да различи реално 200 от междинна страница с предизвикателство, върната със статус 200. timeout_msограничава цялото извикване. Едно първоначално (cold) заявяване към защитен сайт може да отнеме десетки секунди; преизползваните (warm) сесии обикновено приключват за под секунда.
Single заявка
POST /api/single/
Изпраща HTTP заявка с реалистични мрежови характеристики, подобни на браузър, без да стартира реален браузър. Това е най-бързият endpoint.
Тяло на заявката
| Параметър | Тип | Задължителен | По подразбиране | Описание |
|---|---|---|---|---|
method |
string | Да | - | HTTP метод: GET, POST, PUT, PATCH, DELETE, HEAD, OPTIONS |
url |
string | Да | - | Целеви URL. Използвайте {ts} навсякъде в URL адреса, за да вмъкнете текущото времево клеймо за избягване на кеширането. |
headers |
[string, string][] | Не | - | Потребителски headers като двойки [име, стойност] |
unblocker |
boolean | Не | true |
Изпращане на реалистични браузърски headers (User-Agent, Sec-Ch-Ua, Sec-Fetch-*, Accept-Encoding). Включено по подразбиране. Задайте false, за да изпратите обикновен клиентски подпис. |
timeout_ms |
number | Не | 15000 | Общо време за изчакване в ms (макс: 120000) |
connect_timeout_ms |
number | Не | 5000 | Време за изчакване на връзката в ms |
accept_timeout_ms |
number | Не | 5000 | Време за изчакване за приемане в ms (време за изчакване за приемане на връзката) |
server_response_timeout_ms |
number | Не | 15000 | Време за изчакване на сървърен response в ms (време за изчакване за първия байт) |
dns_cache_timeout_sec |
number | Не | 120 | DNS кеш TTL в секунди (макс: 240) |
followRedirects |
number | Не | disabled | Максимален брой пренасочвания за следване (0-20). Пропуснете, за да деактивирате. |
tryJsonData |
boolean | Не | false | Парсване на response body като JSON, ако е възможно |
returnBuffer |
boolean | Не | false | Връщане на суров буфер вместо декодиран string |
data |
any | Не | - | Request body (string или обект, автоматично сериализиран в JSON) |
proxy |
string | Не | - | Proxy ID от предишен response, за да се фиксира същият изход. Подайте непрозрачния string обратно буквално. Суров proxy адрес се отхвърля с 400 Invalid proxy format. |
browser |
string | Не | Chrome | Браузър за представяне: Chrome, Edge, Safari, Firefox или Tor. Вижте Браузърни профили. |
os |
string | Не | - | Операционна система за представяне: Windows, macOS, Android или iOS. Име на фамилия приема всяка от нейните версии. |
version |
string | Не | newest | Версия на браузъра за представяне, както е посочено в каталога. Най-новото съвпадение печели, когато няколко отговарят на условието. |
profile |
string | Не | - | Точен profile id от GET /api/profiles, вместо трите полета по-горе. |
validate |
object | Не | - | Правила за валидиране на response (вижте по-долу) |
Браузърни профили
По подразбиране даден request представя най-новия Google Chrome. Някои цели приемат един браузър и отхвърлят друг, така че browser, os и version стесняват каталога от измерени профили, а profile избира един по id.
{
"method": "GET",
"url": "https://example.com",
"browser": "Firefox",
"os": "Windows"
}
Правила:
- Изборът изисква
unblocker(включено по подразбиране). При изключен unblocker не се изпращат browser headers, така че request се отхвърля, вместо да се приложи частично. - Когато няколко профила съвпадат, най-новата версия печели.
- Комбинация, която каталогът не може да предостави, връща грешка с посочване на наличното. Този request никога не се изпраща като различен браузър.
- Същите четири полета са налични в обекта
requestнаPOST /proxy/.
GET /api/profiles връща пълния каталог и не изисква API ключ:
{
"profiles": [
{ "id": "...", "browser": "Chrome", "version": "...", "os": "...", "osFamily": "macOS" }
],
"default": "..."
}
osFamily е стойността за филтриране при изграждане на селектор; os пази името на версията за показване.
Правила за валидиране
Обектът validate ви позволява да дефинирате условия за успех и неуспех. Ако условие fail е изпълнено, заявката се третира като неуспешна. Ако са зададени условия accept, само съвпадащите отговори се третират като успешни.
{
"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 | Двойки ключ-стойност в header, които трябва да присъстват |
validate.headers.fail |
object | Двойки ключ-стойност в header, които предизвикват грешка |
validate.data.accept |
string[] | Низове, които трябва да присъстват в тялото на response |
validate.data.fail |
string[] | Низове в тялото на response, които предизвикват грешка |
Пример
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
}'
Отговор:
{
"status": 200,
"headers": [{"result": {"version": "HTTP/2", "code": 200, "reason": ""}, "content-type": "text/html", "server": "nginx", "set-cookie": ["session=abc", "tracker=xyz"]}],
"data": "<!doctype html>...",
"total_time": 0.342,
"proxy": "A1B2C3"
}
Когато целта стартира проверка за ботове по пътя към тялото, отговорът съдържа и обект defense, който указва доставчика и дали проверката е премината:
{
"status": 200,
"data": "<!doctype html>...",
"total_time": 3.61,
"defense": {
"vendor": "sgcaptcha",
"solved": true,
"present": ["sgcaptcha"],
"ms": 3412,
"cookie": "_I_=<clearance>"
}
}
| Поле | Тип | Описание |
|---|---|---|
status |
число | HTTP код на състоянието от целта |
headers |
масив | По един обект за всяка стъпка на пренасочване. Всеки има поле result със статусния ред плюс всеки response header. Многостойностните header-и (Set-Cookie, Link, WWW-Authenticate) се връщат като масиви от низове. |
data |
низ/обект | Тяло на response (JSON, ако tryJsonData е true) |
total_time |
число | Общо време за request в секунди |
proxy |
низ | Кодирано ID на proxy сървъра, през който е минал даденият request (само когато към request-а е подаден proxy). Използвайте го отново при последващо извикване, за да фиксирате същия изход. |
defense |
обект | Присъства само когато целта е изпълнила проверка за ботове върху този request. defense.solved показва дали проверката е премината. Вижте Защити срещу ботове за всяко поле и пълния списък с доставчици. |
error |
низ | Съобщение за грешка, ако даденият request е неуспешен |
Proxy Request
POST /api/proxy/
Насочва вашия request през ротиращи proxy сървъри с автоматичен повторен опит при неуспех. По желание ограничете избора до набор от видими за целта изходни държави.
Тяло на request
| Параметър | Тип | Задължителен | По подразбиране | Описание |
|---|---|---|---|---|
request |
обект | Да | - | Единично тяло на request (същите полета като Single Request по-горе) |
timeout_ms |
число | Не | 45000 | Общо време за изчакване за всички опити в ms (макс: 120000) |
maxTries |
число | Не | 5 | Максимален брой опити за ротация на proxy (макс: 90) |
ignoreProxies |
string[] | Не | - | ID-та на proxy сървъри, които да бъдат изключени от ротацията (използвайте ID-та, върнати от предишни response-и) |
exitCountries |
string[] | Не | - | Строг списък с разрешени двубуквени кодове на държави, видими за целта (напр. ["CZ", "GB"]). Стойностите се изчистват от празни места, преобразуват се в главни букви и се премахват дубликатите. Proxy сървърите с неизвестни изходи се изключват и даденият request никога не преминава към непоискана държава. |
Ограничаване по exitCountries
Изборът използва най-новите налични метаданни за видимите за целта държави, които обикновено се опресняват на около десет минути. Това не е търсене на геолокация в реално време по време на request. Не правете извод за обслужващата държава от адреса на хоста на proxy сървъра.
Ако в текущия пул няма съвпадение за заявените държави, даденият response връща 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 сървър. Използвайте го отново в заявка Single или Browser, като го подадете в полето proxy, или го пропуснете при следващата заявка към Proxy чрез ignoreProxies. |
exitCountry |
string | Двубуквен код на държавата на proxy сървъра, обслужващ заявката, видим за целта. Наличен само ако в заявката е зададен exitCountries. Винаги проверявайте дали това е един от заявените кодове, преди да се доверите на отговора. |
total |
number | Външна продължителност (wall-clock) в секунди (с плаваща запетая). Включва избора на proxy, повторните опити и успешния опит. total_time се отнася само за вътрешната заявка; total винаги е >= total_time. |
error |
string | Съобщение за грешка, ако заявката е неуспешна. При пропускане на обхват code е no_eligible_proxy, а details.exitCountries връща нормализирания обхват. |
Всички полета на отговора за заявка Single също са включени, сред тях и defense: опит с proxy, който е срещнал проверка за бот, го отчита по същия начин като Single.
Browser Request
POST /api/browser/
Отваря вашия URL адрес в инстанция на браузър Chrome. Страницата се зарежда, JavaScript се изпълнява и получавате напълно рендирания HTML плюс бисквитките (cookie jar).
Request Body
| Параметър | Тип | Задължителен | По подразбиране | Описание |
|---|---|---|---|---|
url |
string | Да | - | Целеви URL адрес |
headers |
object | Не | - | Персонализирани заглавки (headers) като двойки ключ-стойност |
cookies |
array | Не | - | Бисквитки (cookies) за задаване: [{name, value, domain?}] |
userAgent |
string | Не | - | Персонализиран низ за User-Agent |
unblocker |
boolean | Не | true |
Автоматично решаване на често срещани CAPTCHA предизвикателства за ботове (като Cloudflare clearance) по време на зареждане на страницата. Включено по подразбиране. Задайте false, за да се рендира това, което страницата връща, включително CAPTCHA страници, без опит за решаване. |
proxy |
string | Не | - | Proxy ID от предишен отговор за запазване на същия изходен възел. Подайте обратно непрозрачния низ точно както е. Подаването на суров адрес на proxy ще бъде отхвърлено с 400 Invalid proxy format. |
timeout_ms |
number | Не | 30000 | Време за изчакване при зареждане на страница в ms (макс: 120000) |
checkStatus |
number | Не | - | Очакван HTTP статус (заявката се проваля, ако е различен) |
checkText |
string | Не | - | Текст, който трябва да присъства в рендираната страница |
Example
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"
}'
Отговор:
{
"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 status code от целта |
headers |
object | Response headers |
body |
string or object | Напълно рендирано съдържание на страницата. String HTML, когато content-type е HTML; object, когато страницата е върнала JSON и е автоматично парсната. |
cookies |
array | Пълни cookie обекти от страницата. Всяко cookie включва name, value, domain, path, expires, httpOnly, secure, sameSite и други свойства на cookie. |
userAgent |
string | Използван браузър User-Agent |
defenseSolved |
boolean | true, ако е срещната защита от ботове и е успешно преодоляна при това извикване. Липсва в противен случай. Определя цената от 15 срещу 30 кредита. |
defenses |
object | present изброява всеки vendor, разпознат по време на зареждането на страницата, cleared изброява тези, чието преодоляване крайната страница притежава. Един vendor може да се появи в present и никога в cleared. Вижте Anti-Bot Defenses. |
proxy |
string | Кодиран ID на проксито, през което е минала заявката (само когато proxy е подаден в заявката). Използвайте го повторно при последващи извиквания, за да запазите същия изход. |
error |
string | Съобщение за грешка, ако заявката е неуспешна |
HTTP Status Codes
| Код | Значение |
|---|---|
| 200 | Заявката е завършена (проверете вътрешния status за response от целта) |
| 400 | Невалиден body на заявката, параметри или IP на целта в частен/резервиран диапазон |
| 401 | Липсващ или невалиден API key |
| 429 | Превишен rate limit |
| 500 | Вътрешна грешка на сървъра |
| 502 | Upstream unavailable. FourA достигна своя двигател, но отговорът беше неизползваем. Опитайте отново. |
| 503 | Услугата е временно деактивирана или е достигнала капацитет, или Backend service unavailable докато двигателят се рестартира |
| 504 | Upstream timeout. Двигателят не завърши в рамките на времевия бюджет за тази заявка. Увеличете timeout_ms или опитайте отново. |
Следващи стъпки
- Smart Fetch (Auto): Кога да оставите FourA да избере пътя вместо вас
- Choosing the Right Endpoint: Кога да изберете ръчно Single, Proxy или Browser
- Authentication: Управлявайте своите API keys
- Error Handling: Справяйте се с грешките елегантно
- Anti-Bot Defenses: Прочетете полето
defenseи възпроизведете преодоляване - Rate Limits: Разберете лимитите на заявките
- Quick Start: Вашата първа заявка за 30 секунди