API-Endpunkt-Referenz
Eine Referenz für alle FourA-API-Endpunkte mit Request-Parametern und Response-Formaten.
Basis-URL
https://eu.api.foura.ai/api
Authentifizierung
Jeder Request erfordert deinen API-Key im 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"}'
Erstelle und verwalte API-Keys im Dashboard. Keys nutzen das Präfix pk_live_.
Response-Header
Jede Response von /api/* enthält einen Korrelations-Header:
| Header | Wert | Beschreibung |
|---|---|---|
X-Foura-Request-Id |
UUID | Eindeutige ID, die dem Request zugewiesen wird. Wird bei jeder Response zurückgegeben, einschließlich 4xx und 5xx. Logge sie auf deiner Seite. |
Dieselbe ID dient als Schlüssel für die Vorschau der Request- und Response-Payload im Activity Log des Dashboards (24 Stunden aufbewahrt, die letzten 200 pro Key). So kannst du den genauen Request später nachschlagen und direkt aus der Activity im Playground erneut abspielen. Gib sie an, wenn du den Support kontaktierst, um den Request sekundenschnell zu finden.
$ 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
...
Endpunkte
Nutzt du diese Endpunkte über MCP? Der
@fouradata/mcp-Server kapselt alle drei Endpunkte als native MCP-Tools (foura_single,foura_proxy,foura_browser) mit denselben Eingabeformaten sowie einemoffload_large-Opt-In für tokenfreundliche Verarbeitung großer Responses.
FourA bietet drei Request-Endpunkte, die jeweils für unterschiedliche Szenarien optimiert sind:
| Endpunkt | Bestens geeignet für |
|---|---|
POST /single/ |
Schnelle HTTP-Requests, statische Seiten, APIs |
POST /proxy/ |
Geschützte Websites mit automatischer Proxy-Rotation |
POST /browser/ |
JavaScript-gerenderte Seiten, SPAs |
Ziel-URL-Einschränkungen
Ziele, die auf private, Loopback- oder reservierte IP-Bereiche (RFC 5735, RFC 6598, reservierte IPv6-Blöcke) verweisen, werden mit einem 400-Fehler abgelehnt, bevor der Request FourA verlässt. Nur öffentliche Hostnamen und IPs werden weitergeleitet.
{ "error": "Target <ip> resolves to a private/reserved IP" }
Single-Request
POST /api/single/
Sendet einen HTTP-Request mit realistischen, browserähnlichen Übertragungseigenschaften, ohne einen echten Browser zu starten. Dies ist der schnellste Endpunkt.
Request-Body
| Parameter | Typ | Erforderlich | Standard | Beschreibung |
|---|---|---|---|---|
method |
string | Ja | - | HTTP-Methode: GET, POST, PUT, PATCH, DELETE, HEAD, OPTIONS |
url |
string | Ja | - | Ziel-URL. Verwende {ts} an beliebiger Stelle in der URL, um den aktuellen Zeitstempel für Cache-Busting einzufügen. |
headers |
[string, string][] | Nein | - | Benutzerdefinierte Header als [Name, Wert]-Paare |
unblocker |
boolean | Nein | false | Realistische Browser-Header injizieren (User-Agent, Sec-Ch-Ua, Sec-Fetch-*, Accept-Encoding) |
timeout_ms |
number | Nein | 15000 | Gesamtes Timeout in ms (max. 120000) |
connect_timeout_ms |
number | Nein | 5000 | Verbindungs-Timeout in ms |
accept_timeout_ms |
number | Nein | 5000 | Accept-Timeout in ms (Wartezeit auf Verbindungsannahme) |
server_response_timeout_ms |
number | Nein | 15000 | Server-Response-Timeout in ms (Wartezeit auf das erste Byte) |
dns_cache_timeout_sec |
number | Nein | 120 | DNS-Cache-TTL in Sekunden (max. 240) |
followRedirects |
number | Nein | deaktiviert | Maximale Anzahl zu folgender Weiterleitungen (0-20). Weglassen zum Deaktivieren. |
tryJsonData |
boolean | Nein | false | Response-Body wenn möglich als JSON parsen |
returnBuffer |
boolean | Nein | false | Rohen Buffer statt decodierten String zurückgeben |
data |
any | Nein | - | Request-Body (String oder Objekt, automatisch als JSON serialisiert) |
proxy |
string | Nein | - | Proxy-URL (http, socks4 oder socks5) oder eine von einer vorherigen Response zurückgegebene Proxy-ID |
validate |
object | Nein | - | Validierungsregeln für die Response (siehe unten) |
Validierungsregeln
Mit dem validate-Objekt kannst du Bedingungen für Erfolg und Fehlschlag definieren. Wenn eine fail-Bedingung zutrifft, wird der Request als fehlgeschlagen gewertet. Wenn accept-Bedingungen definiert sind, werden nur übereinstimmende Responses als erfolgreich gewertet.
{
"validate": {
"status": { "accept": [200, 201], "fail": [403, 503] },
"headers": { "accept": {"content-type": "application/json"} },
"data": { "accept": ["product"], "fail": ["captcha", "blocked"] }
}
}
| Feld | Typ | Beschreibung |
|---|---|---|
validate.status.accept |
number[] | Zu akzeptierende HTTP-Statuscodes |
validate.status.fail |
number[] | Abzulehnende HTTP-Statuscodes |
validate.headers.accept |
object | Header-Key-Value-Paare, die vorhanden sein müssen |
validate.headers.fail |
object | Header-Key-Value-Paare, die einen Fehlschlag auslösen |
validate.data.accept |
string[] | Strings, die im Response-Body enthalten sein müssen |
validate.data.fail |
string[] | Strings im Response-Body, die einen Fehlschlag auslösen |
Beispiel
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",
"unblocker": true,
"timeout_ms": 10000
}'
Response:
{
"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
}
| Feld | Typ | Beschreibung |
|---|---|---|
status |
number | HTTP-Statuscode des Ziels |
headers |
array | Ein Objekt pro Redirect-Hop. Jedes enthält ein result-Feld mit der Statuszeile sowie allen Response-Headern. Header mit mehreren Werten (Set-Cookie, Link, WWW-Authenticate) werden als String-Arrays zurückgegeben. |
data |
string/object | Response-Body (JSON, wenn tryJsonData true ist) |
total_time |
number | Gesamte Request-Dauer in Sekunden |
error |
string | Fehlermeldung, falls der Request fehlgeschlagen ist |
Proxy-Request
POST /api/proxy/
Leitet deinen Request über rotierende Proxys mit automatischer Wiederholung bei Fehlschlag weiter.
Request-Body
| Parameter | Typ | Erforderlich | Standard | Beschreibung |
|---|---|---|---|---|
request |
object | Ja | - | Ein einzelner Request-Body (gleiche Felder wie beim Single-Request oben) |
timeout_ms |
number | Nein | 45000 | Gesamtes Timeout für alle Versuche in ms (max. 120000) |
maxTries |
number | Nein | 5 | Maximale Anzahl an Proxy-Rotationsversuchen (max. 90) |
ignoreProxies |
string[] | Nein | - | Aus der Rotation auszuschließende Proxy-IDs (verwende von vorherigen Responses zurückgegebene IDs) |
Beispiel
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,
"request": {
"method": "GET",
"url": "https://example.com/prices",
"unblocker": true
}
}'
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",
"total": 2.341
}
| Feld | Typ | Beschreibung |
|---|---|---|
proxy |
string | Codierter Identifikator des verwendeten Proxys. Verwende ihn bei einem Single- oder Browser-Request wieder, indem du ihn im Feld proxy übergibst, oder überspringe ihn beim nächsten Proxy-Request via ignoreProxies. |
total |
number | Äußere Gesamtdauer in Sekunden (Float). Umfasst Proxy-Auswahl, Wiederholungsversuche und den erfolgreichen Versuch. total_time betrifft nur den inneren Request; total ist immer >= total_time. |
error |
string | Fehlermeldung, falls der Request fehlgeschlagen ist |
Alle Response-Felder des Single-Requests sind ebenfalls enthalten.
Browser-Request
POST /api/browser/
Öffnet deine URL in einer Chrome-Browser-Instanz. Die Seite lädt, JavaScript wird ausgeführt und du erhältst das vollständig gerenderte HTML sowie die Cookies (Cookie-Jar).
Request-Body
| Parameter | Typ | Erforderlich | Standard | Beschreibung |
|---|---|---|---|---|
url |
string | Ja | - | Ziel-URL |
headers |
object | Nein | - | Benutzerdefinierte Header als Key-Value-Paare |
cookies |
array | Nein | - | Zu setzende Cookies: [{name, value, domain?}] |
userAgent |
string | Nein | - | Benutzerdefinierter User-Agent-String |
proxy |
string | Nein | - | Proxy-URL oder eine von einer vorherigen Response zurückgegebene Proxy-ID |
timeout_ms |
number | Nein | 30000 | Timeout für das Laden der Seite in ms (max. 120000) |
checkStatus |
number | Nein | - | Erwarteter HTTP-Status (Request schlägt bei Abweichung fehl) |
checkText |
string | Nein | - | Text, der auf der gerenderten Seite erscheinen muss |
Beispiel
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..."
}
| Feld | Typ | Beschreibung |
|---|---|---|
status |
number | HTTP-Statuscode des Ziels |
headers |
object | Response-Header |
body |
string or object | Vollständig gerenderter Seiteninhalt. HTML-String, wenn der Content-Type HTML ist; Objekt, wenn die Seite JSON zurückgegeben hat und automatisch geparst wurde. |
cookies |
array | Vollständige Cookie-Objekte der Seite. Jedes Cookie enthält name, value, domain, path, expires, httpOnly, secure, sameSite und weitere Cookie-Eigenschaften. |
userAgent |
string | Verwendeter Browser-User-Agent |
error |
string | Fehlermeldung, falls der Request fehlgeschlagen ist |
HTTP-Statuscodes
| Code | Bedeutung |
|---|---|
| 200 | Request abgeschlossen (prüfe den inneren status für die Ziel-Response) |
| 400 | Ungültiger Request-Body, ungültige Parameter oder Ziel-IP in einem privaten/reservierten Bereich |
| 401 | Fehlender oder ungültiger API-Key |
| 429 | Rate-Limit überschritten |
| 500 | Interner Serverfehler |
| 503 | Dienst vorübergehend deaktiviert oder ausgelastet |
Nächste Schritte
- Authentifizierung: Verwalte deine API-Keys
- Fehlerbehandlung: Behandle Fehler elegant
- Rate-Limits: Verstehe Request-Limits
- Schnellstart: Dein erster Request in 30 Sekunden