مرجع Endpoints لـ API
مرجع لجميع endpoints الخاصة بـ FourA API مع معلمات request وتنسيقات response.
Base URL
https://eu.api.foura.ai/api
Authentication
يتطلب كل request مفتاح API الخاص بك في header الـ X-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"}'
أنشئ مفاتيح API وأدرها في Dashboard. تستخدم المفاتيح البادئة pk_live_.
Response Headers
يحمل كل response من /api/* رأس ارتباط (correlation header) واحدًا:
| Header | القيمة | الوصف |
|---|---|---|
X-Foura-Request-Id |
UUID | معرف فريد مخصص للـ request. يتم إرجاعه مع كل response، بما في ذلك 4xx و 5xx. قم بتسجيله (log) من جانبك. |
يربط المعرف نفسه بين معاينة حمولة (payload) الـ request والـ response في Activity Log الخاص بـ Dashboard (يُحتفظ بها لمدة 24 ساعة، وآخر 200 لكل مفتاح)، بحيث يمكنك البحث عن الـ 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
...
Endpoints
هل تستخدم هذه endpoints عبر MCP؟ يقوم خادم
@fouradata/mcpserver بتغليف الـ endpoints الثلاثة كأدوات MCP أصلية (foura_singleوfoura_proxyوfoura_browser) بنفس أشكال المدخلات بالإضافة إلى خيار تفعيلoffload_largeلمعالجة الـ responses الكبيرة بشكل متوافق مع الـ tokens.
توفر FourA ثلاثة endpoints للـ requests، كل منها مخصص لسيناريوهات مختلفة:
| Endpoint | الأفضل لـ |
|---|---|
POST /single/ |
طلبات HTTP السريعة، الصفحات الثابتة، و APIs |
POST /proxy/ |
المواقع المحمية مع تدوير تلقائي للـ proxy |
POST /browser/ |
الصفحات التي يتم صيرورتها عبر JavaScript، وتطبيقات SPA |
Target URL Restrictions
يتم رفض الأهداف (targets) التي تشير إلى نطاقات IP خاصة أو محلية (loopback) أو محجوزة (RFC 5735، RFC 6598، كتل IPv6 المحجوزة) مع رمز الخطأ 400 قبل أن يغادر الـ request نظام FourA. يتم توجيه أسماء المضيفين (hostnames) وعناوين IP العامة فقط.
{ "error": "Target <ip> resolves to a private/reserved IP" }
Single Request
POST /api/single/
يرسل HTTP request بخصائص شبكة واقعية تشبه المتصفح، دون تشغيل متصفح حقيقي. هذا هو الـ endpoint الأسرع.
Request Body
| المعلمة (Parameter) | النوع | مطلوب | الافتراضي | الوصف |
|---|---|---|---|---|
method |
string | نعم | - | طريقة HTTP: GET، POST، PUT، PATCH، DELETE، HEAD، OPTIONS |
url |
string | نعم | - | الـ Target URL. استخدم {ts} في أي مكان في الـ URL لإدراج الطابع الزمني الحالي لمنع التخزين المؤقت (cache-busting). |
headers |
[string, string][] | لا | - | الـ headers المخصصة كأزواج [الاسم، القيمة] |
unblocker |
boolean | لا | false | حقن headers متصفح واقعية (User-Agent، Sec-Ch-Ua، Sec-Fetch-*، Accept-Encoding) |
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 | مدة صلاحية (TTL) ذاكرة التخزين المؤقت لـ DNS بالثواني (الحد الأقصى: 240) |
followRedirects |
number | لا | disabled | الحد الأقصى لعمليات إعادة التوجيه التي يجب تتبعها (0-20). اتركه فارغًا للتعطيل. |
tryJsonData |
boolean | لا | false | تحليل جسم الـ response كـ JSON إذا كان ذلك ممكنًا |
returnBuffer |
boolean | لا | false | إرجاع الـ buffer الخام بدلاً من السلسلة النصية التي تم فك ترميزها |
data |
any | لا | - | جسم الـ request (سلسلة نصية أو كائن، يتم تسلسله تلقائيًا إلى JSON) |
proxy |
string | لا | - | عنوان Proxy URL (http أو socks4 أو socks5) أو معرف proxy ID تم إرجاعه بواسطة response سابق |
validate |
object | لا | - | قواعد التحقق من صحة الـ response (انظر أدناه) |
Validation Rules
يتيح لك كائن validate تحديد شروط النجاح والفشل. إذا تطابق شرط fail، فسيتم التعامل مع الـ request على أنه فاشل. وإذا تم تعيين شروط accept، فسيتم التعامل مع الـ responses المطابقة فقط على أنها ناجحة.
{
"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 التي تتسبب في الفشل |
Example
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
}
| الحقل | النوع | الوصف |
|---|---|---|
status |
number | رمز حالة HTTP من الهدف |
headers |
array | كائن واحد لكل قفزة إعادة توجيه (redirect hop). يحتوي كل منها على حقل result مع سطر الحالة بالإضافة إلى كل response header. تعود الـ headers متعددة القيم (Set-Cookie، Link، WWW-Authenticate) كمصفوفات من السلاسل النصية. |
data |
string/object | جسم الـ response (يكون JSON إذا كانت قيمة tryJsonData هي true) |
total_time |
number | إجمالي وقت الـ request بالثواني |
error |
string | رسالة الخطأ في حال فشل الـ request |
Proxy Request
POST /api/proxy/
يوجه الـ request الخاص بك عبر proxies دورية مع إعادة المحاولة التلقائية عند الفشل.
Request Body
| المعلمة (Parameter) | النوع | مطلوب | الافتراضي | الوصف |
|---|---|---|---|---|
request |
object | نعم | - | جسم request فردي (نفس حقول Single Request أعلاه) |
timeout_ms |
number | لا | 45000 | المهلة الإجمالية لجميع المحاولات بالملي ثانية (الحد الأقصى: 120000) |
maxTries |
number | لا | 5 | الحد الأقصى لمحاولات تدوير الـ proxy (الحد الأقصى: 90) |
ignoreProxies |
string[] | لا | - | معرفات Proxy IDs لاستبعادها من التدوير (استخدم المعرفات التي تم إرجاعها بواسطة responses سابقة) |
Example
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
}
| الحقل | النوع | الوصف |
|---|---|---|
proxy |
string | معرف مشفر للـ proxy المستخدم. أعد استخدامه في Single Request أو Browser Request عن طريق تمريره كحقل proxy، أو تخطاه في Proxy Request التالي عبر ignoreProxies. |
total |
number | المدة الزمنية الخارجية الإجمالية بالثواني (عدد عشري float). تشمل اختيار الـ proxy، وإعادة المحاولات، والمحاولة الناجحة. يمثل total_time الـ request الداخلي فقط؛ وتكون قيمة total دائمًا أكبر من أو تساوي total_time. |
error |
string | رسالة الخطأ في حال فشل الـ request |
يتم أيضًا تضمين جميع حقول استجابة Single Request.
Browser Request
POST /api/browser/
يفتح الـ URL الخاص بك في مثيل متصفح Chrome. يتم تحميل الصفحة، وتنفيذ JavaScript، وتحصل على HTML المصير بالكامل بالإضافة إلى الـ cookie jar.
Request Body
| المعلمة (Parameter) | النوع | مطلوب | الافتراضي | الوصف |
|---|---|---|---|---|
url |
string | نعم | - | الـ Target URL |
headers |
object | لا | - | الـ headers المخصصة كأزواج مفتاح-قيمة |
cookies |
array | لا | - | ملفات تعريف الارتباط (Cookies) المطلوب تعيينها: [{name, value, domain?}] |
userAgent |
string | لا | - | سلسلة User-Agent مخصصة |
proxy |
string | لا | - | عنوان Proxy URL أو معرف proxy ID تم إرجاعه بواسطة response سابق |
timeout_ms |
number | لا | 30000 | مهلة تحميل الصفحة بالملي ثانية (الحد الأقصى: 120000) |
checkStatus |
number | لا | - | حالة HTTP المتوقعة (يفشل الـ request إذا كانت مختلفة) |
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"
}'
الـ 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..."
}
| الحقل | النوع | الوصف |
|---|---|---|
status |
number | رمز حالة HTTP من الهدف |
headers |
object | الـ Response headers |
body |
string or object | محتوى الصفحة المصير بالكامل. سلسلة نصية HTML عندما يكون content-type هو HTML؛ وكائن عندما ترجع الصفحة JSON ويتم تحليله تلقائيًا. |
cookies |
array | كائنات ملفات تعريف الارتباط (cookie) الكاملة من الصفحة. يتضمن كل cookie الحقول name و value و domain و path و expires و httpOnly و secure و sameSite وخصائص الـ cookie الأخرى. |
userAgent |
string | الـ User-Agent الخاص بالمتصفح المستخدم |
error |
string | رسالة الخطأ في حال فشل الـ request |
HTTP Status Codes
| الرمز | المعنى |
|---|---|
| 200 | اكتمل الـ Request (تحقق من الـ status الداخلي لمعرفة استجابة الهدف) |
| 400 | جسم request غير صالح، أو معلمات غير صالحة، أو عنوان IP للهدف يقع ضمن نطاق خاص/محجوز |
| 401 | مفتاح API مفقود أو غير صالح |
| 429 | تم تجاوز حد المعدل (Rate limit) |
| 500 | خطأ داخلي في الخادم |
| 503 | الخدمة غير متاحة مؤقتًا أو وصلت إلى طاقتها الاستيعابية |
Next Steps
- Authentication: إدارة مفاتيح API الخاصة بك
- Error Handling: التعامل مع الأخطاء بسلاسة
- Rate Limits: فهم حدود الـ requests
- Quick Start: أول request لك في 30 ثانية