واجهة API الآلية للمورّد
الواجهة الآلية لسوق المورّدين: أنشئ مفتاح sk-sup-… في لوحة التحكم، واستدعِ كل نقطة نهاية بـ Authorization: Bearer، وأضِف الاتصالات على دفعات، واقرأ الاتصالات والعروض وتغييرات الأسعار والأرباح والإحصاءات.
للوحة تحكم المورّد واجهة آلية: يمكن للمورّد إضافة الحسابات بالجملة وقراءة اتصالاته وعروضه وأسعاره وسجل تغييرات الأسعار وأرباحه وإحصاءاته من سكربت، باستخدام مفتاح API مقصور على نطاق المورّد بدلًا من جلسة متصفح.
هذا إضافي. خزانة المتصفح دون تغيير، والمسارات الآلية تجمع نفس الحِمولات التي تجمعها صفحات الخزانة، لذا لا يمكن للواجهتين الإبلاغ عن أرقام مختلفة.
احصل على مفتاح
تُنشأ مفاتيح الماكينة وتُلغى في لوحة المورد. ويُعرض الرمز الكامل مرة واحدة عند الإنشاء، ولا يُعاد إرجاعه بعد ذلك أبدًا.
- افتح لوحة المورّد وابحث عن قسم Machine API keys.
- أعطِ المفتاح تسمية (اختياري) ثم اضغط إنشاء.
- انسخ الرمز فورًا. يبدأ بـ
sk-sup-. - خزّنه في مدير أسرار أو متغير بيئة. لا تضمّنه في أي commit ولا ترسله في رسالة دعم.
نقاط نهاية إدارة الحساب
تستخدم هذه المسارات جلسة الخزانة أو رمز التتبع. وهي لا تقبل عن قصد مفتاحًا آليًا، حتى لا يستطيع مفتاح آلي مسرَّب إصدار مفاتيح أخرى أو إبطالها.
| المعلمة | النوع | الوصف |
|---|---|---|
GET /api/marketplace/suppliers/me/api-keys | list | حقول القائمة: id، label، prefix، active، lastUsedAt، createdAt. ولا يُعاد الرمز أو تجزئته أبدًا. |
POST /api/marketplace/suppliers/me/api-keys | mint | الجسم { "label"?: string }. يُعيد { "key": "sk-sup-…", "apiKey": { … } } — وهي المرة الوحيدة التي يظهر فيها الرمز. |
DELETE /api/marketplace/suppliers/me/api-keys/{id} | revoke | إبطال مفتاح واحد. يعيد 404 عندما لا يكون المعرّف تابعاً للمتصل. |
المصادقة
تتطلب كل مسار آلي مفتاح المورّد كرمز حامل:
Authorization: Bearer sk-sup-<64 hex>curl https://getvibeapi.com/api/marketplace/suppliers/api/v1/connections \
-H "Authorization: Bearer $SUPPLIER_API_KEY"يُسند الطلب المفتاح إلى مورد واحد فقط، وتُصفَّى كل استعلامات بواسطة هذا المعرّف. نطاق الإبطال محدَّد بمعرّف المفتاح ومالكه معًا، فلا يستطيع مورد إبطال مفتاح مورد آخر. لا تسجّل المفتاح أو ترسله أبدًا.
401 واحدة ثابتة، فلا يستطيع المستدعي التمييز بين الحالات. أرسل المفتاح عبر HTTPS فقط.نقاط النهاية للقراءة
جميعها GET، ومصادَقة بمفتاح API ومقيَّدة بالمورِّد الموثَّق. تُعاد مبالغ الميكرو-دولار كسلاسل نصية، بينما أعداد الرموز أرقام.
الاتصالات
الحسابات المتصلة بالمورّد، مع ما كسبه كل منها (القابل للدفع فقط).
{
"connections": [
{
"id": "…",
"connectionType": "subscription-api-key",
"subscriptionProductLabel": "…",
"verifiedEndpoint": "https://…",
"status": "ACTIVE",
"enabled": true,
"verificationState": "verified",
"verifiedBy": "…",
"label": "nightly-1",
"account": "…",
"verifiedModels": ["…"],
"servingModels": ["…"],
"lastVerifiedAt": "2026-09-18T09:00:00.000Z",
"proxy": "…",
"proxySource": "pool",
"proxyCountry": "de",
"proxyExpiresAt": "2026-10-18T09:00:00.000Z",
"proxyExpiryDays": 30,
"proxyLost": false,
"probedVia": "…",
"lastError": null,
"needsReauth": false,
"accountLimits": null,
"accountLimitsSource": null,
"accountLimitsCheckedAt": null,
"earnings": { "earnedMicros": "1250000", "requestCount": 42 },
"createdAt": "2026-09-01T09:00:00.000Z"
}
]
}العروض
عروض المورّد بالأسعار الحالية والنسبة المئوية الحية من البطاقة الرسمية.
{
"offers": [
{
"id": "…",
"baseModel": "claude-opus-5",
"claimedModel": "claude-opus-5",
"providerLabel": "…",
"status": "ACTIVE",
"statusReason": null,
"inputMicrosPer1M": "1000000",
"outputMicrosPer1M": "2000000",
"cacheReadMicrosPer1M": null,
"blendedPctOfOfficial": "0.42",
"officialPrice": null,
"pctOfOfficial": 42,
"trafficTier": "…",
"cooldownUntil": null,
"cooldownReason": null,
"firstVerifiedAt": "2026-09-01T09:00:00.000Z",
"activatedAt": "2026-09-01T09:00:00.000Z",
"lastManualPriceChangeAt": null,
"maxConcurrentRequests": 8,
"servingEnabled": true
}
]
}سجل تغيّر الأسعار
سجل تغييرات السعر لأحد عروض المورّد نفسه: التغييرات المخطَّطة والمطبَّقة والملغاة. أما العرض الذي يخص مورّدًا آخر فيُجاب عنه بـ 404.
{
"offerId": "…",
"schedules": [
{
"id": "…",
"offerId": "…",
"priceInUsd": "1.000000",
"priceOutUsd": "2.000000",
"effectiveFrom": "2026-10-01T00:00:00.000Z",
"createdAt": "2026-09-18T09:00:00.000Z",
"cancelledAt": null,
"appliedAt": null
}
]
}الإحصاءات
الشكل نفسه الذي تعرضه صفحة إحصاءات لوحة التحكم: totals، وسلسلة daily لمدة 14 يومًا، وتفصيل byOffer لكل عرض.
{
"totals": {
"requests": 12000,
"successes": 11880,
"errors": 90,
"timeouts": 30,
"successRatePct": 99,
"promptTokens": 9000000,
"completionTokens": 4000000,
"cacheTokens": 2500000,
"sourceCostMicros": 12345678,
"avgLatencyMs": 812.4,
"p50LatencyMs": 640,
"p95LatencyMs": 2100
},
"daily": [
{ "date": "2026-09-05", "requests": 800, "successes": 795, "errors": 4, "promptTokens": 600000, "completionTokens": 250000, "sourceCostMicros": 900000 }
],
"byOffer": [
{ "offerId": "…", "baseModel": "claude-opus-5", "requests": 12000, "successRatePct": 99, "promptTokens": 9000000, "completionTokens": 4000000, "tokens": 13000000, "sourceCostMicros": 12345678, "hitRate": 0.28, "effTotal": 3.14, "rank": 1 }
]
}الأرباح
حتى 500 من محاولات المسار المؤهّلة للتسوية الأخيرة، الأحدث أولًا.
{
"events": [
{
"id": "…",
"baseModel": "claude-opus-5",
"result": "SUCCESS",
"promptTokens": "1200",
"completionTokens": "800",
"paidMicros": "420000",
"settlementEligible": true,
"finishedAt": "2026-09-18T09:00:00.000Z",
"settlementStatus": "pending_or_settled"
}
]
}إنشاء الاتصالات
أنشئ حسابًا واحدًا أو حزمة كاملة من بيانات اعتماد تملكها بالفعل — دون رحلة OAuth عبر المتصفح. الجسم إمّا عنصر واحد، أو { "items": [ … ] } مغلّف، أو مصفوفة مجرّدة. وتُوحَّد الثلاثة إلى النتيجة نفسها لكل عنصر. ومسار /api/marketplace/suppliers/api/v1/connections/batch الأقدم هو اسم بديل للمعالج نفسه.
أشكال بيانات الاعتماد
يسمّي كل عنصر المجموعة بـprovider (اسم المجموعة المقروء، مثل codex أو claude-code) ويحمل شكلًا واحدًا بالضبط من أشكال بيانات الاعتماد:
| المعلمة | النوع | الوصف |
|---|---|---|
codexAuthJson | codex-bundle | ملف Codex CLI ~/.codex/auth.json ملصقًا كما هو: auth_mode وtokens.{id_token,access_token,refresh_token,account_id} و_meta.{plan_type,email}. |
accessToken + refreshToken | claude-tokens | رمز وصول Claude Code (sk-ant-oat01-…) ورمز التحديث الخاص به. |
refreshToken | antigravity-refresh | رمز تحديث Antigravity. |
apiKey | api-key | مفتاح API جاهز بالاشتراك. |
bindToken + oauthCode | oauth-code | نتيجة OAuth من تدفق المتصفح، عندما استخدمته بدلًا من حزمة ملصقة. |
يحمل كل عنصر وكيل خروج فعّال، ولا وجود لاتصال بلا وكيل. مرّر proxy الخاص بك، أو proxyCountry لتفضيل أحد وكلائنا؛ وإن لم تمرّر أيًّا منهما، يعيّن الخادم وكيلًا من عنده ويتحقق منه قبل أي طلب إلى المزوّد. وإذا تعذّر التحقق من أي وكيل في المجموعة، يُرفض العنصر بـproxy_unavailable. ويُعاد externalId كما هو دون تغيير لأغراض الربط.
curl https://getvibeapi.com/api/marketplace/suppliers/api/v1/connections \
-H "Authorization: Bearer $SUPPLIER_API_KEY" \
-H "Content-Type: application/json" \
--data @pack.jsonpack.json — وكيل خاص واحد ووكيل واحد من مجموعة الدول:
[
{
"externalId": "codex-1",
"provider": "codex",
"connectionLabel": "nightly-codex-1",
"codexAuthJson": "{\"auth_mode\":\"chatgpt\",\"tokens\":{\"id_token\":\"…\",\"access_token\":\"…\",\"refresh_token\":\"…\",\"account_id\":\"…\"},\"_meta\":{\"plan_type\":\"plus\",\"email\":\"…\"}}",
"proxy": { "scheme": "http", "host": "proxy.example.com", "port": 8899, "username": "u", "password": "p" },
"offers": [{ "baseModel": "deepseek-v4.1-flash", "inputMicrosPer1M": 1000000, "outputMicrosPer1M": 2000000 }]
},
{
"externalId": "claude-1",
"provider": "claude-code",
"connectionLabel": "nightly-claude-1",
"accessToken": "sk-ant-oat01-…",
"refreshToken": "sk-ant-ort01-…",
"proxyCountry": "de",
"offers": [{ "baseModel": "claude-opus-5", "inputMicrosPer1M": 1000000, "outputMicrosPer1M": 2000000 }]
}
]duplicate لكل عنصر ولا تكتب شيئًا جديدًا. أعد محاولة عنصر الحزمة الفاشل عنصرًا عنصرًا.النجاح الجزئي هو العقد
يُتحقق من كل عنصر مقابل المزوّد ويُكتب على حدة. لا يُفشل صفّ واحد سيئ الدفعة بأكملها، ولا يُبلَّغ عن عنصر ok: true إلا بعد تثبيت صفّ اتصاله.
{
"supplierId": "…",
"accepted": 1,
"rejected": 1,
"results": [
{
"index": 0,
"externalId": "row-1",
"ok": true,
"connectionId": "…",
"connectionType": "subscription-api-key",
"verificationState": "verified",
"verifiedModels": ["…"],
"subscriptionProduct": "codebuddy-cn",
"verifiedEndpoint": "https://…",
"latencyMs": 210
},
{
"index": 1,
"externalId": "row-2",
"ok": false,
"code": "bind_session_invalid",
"error": "the authorization session expired or did not match"
}
]
}أكواد الرفض لكل عنصر
| المعلمة | النوع | الوصف |
|---|---|---|
invalid_credential | code | رفض المزوّد شكل الاعتماد أو قيمته. |
connection_type_unavailable | code | نوع الاتصال هذا غير متاح بعد. |
subscription_product_unavailable | code | منتج الاشتراك المُسمّى غير متاح. |
provider_unavailable | code | المزوّد المحدَّد غير متاح. |
bind_session_invalid | code | انتهت جلسة OAuth أو لم تتطابق. |
proxy_required | code | لم يكن للوسيط المُحلَّل عنوان URL صالح للاستخدام. (أما العنصر الذي لا يسمّي أي وسيط فيُسنَد إليه وسيط بدلًا من ذلك.) |
proxy_unavailable | code | تعذّر إثبات وجود أي وكيل مجموعة (pool proxy) للبلد المطلوب، أو لأي بلد عند عدم تحديد بلد. |
proxy_race_lost | code | هذا الوسيط استُخدم للتو من اتصال آخر. |
probe_failed | code | رفض المزوّد الاعتماد أثناء الفحص المباشر. |
model_not_served | code | لم يؤكد الحساب نموذجًا مطلوبًا؛ والنماذج المرفوضة موجودة في مصفوفة "models" الخاصة بالعنصر. |
duplicate | code | بصمة الاعتماد نفسها متصلة بالفعل. |
encryption_unavailable | code | تشفير بيانات الاعتماد غير مُهيّأ في المشروع. |
internal_error | code | خطأ غير متوقع في الخادم. أعد محاولة العنصر الواحد لاحقًا. |
التحقق المسبق من الوسيط
أثبت صلاحية الوسيط قبل تسليم أي بيانات اعتماد: مرّر proxy خاصًا بك أو proxyCountry، فيفتح الخادم النفق نفسه الذي سيستخدمه للاتصال ويصل عبره إلى مضيف محايد. هذه مجرد خطوة تحقق مسبق — إذ ينفّذ نداء الإنشاء الفحص ذاته ويرفض قبل أن يتبادل أي رمز أو يتحسّس المزوّد، فلا تُكلّفك وساطة معطوبة أي بيانات اعتماد.
curl https://getvibeapi.com/api/marketplace/suppliers/proxy-check \
-H "Content-Type: application/json" \
-d '{ "proxy": { "scheme": "http", "host": "proxy.example.com", "port": 8899, "username": "u", "password": "p" } }'{ "ok": true, "outcome": "ok", "latencyMs": 42 }422 مع outcome: "proxy_failed"؛ وأما بلد ليس لديه وسيط مجاني في البركة فيجيب بـ 409 مع proxy_unavailable.OAuth عبر المتصفح (لوحة الحساب)
تدفق OAuth ثنائي الخطوات الخاص بلوحة التحكم، لاستخدامه عندما تربط حسابًا في المتصفح بدلًا من امتلاك حزمة:
الجسم { "connectionType": "claude-code" | "codex-oauth" }. يُعيد authorizeUrl لفتحه وbindToken الموقّع الذي يربط الرمز بجلسة PKCE. ولا يُحفظ أي شيء.
يرسل المنحة المكتملة — bindToken مع oauthCode ونفس حقول offers / proxy كعنصر إنشاء. ويُثبت الوسيط قبل تبادل الرمز. ويستخدم هذان المساران جلسة اللوحة؛ ولا يمكن لمفتاح آلي استدعاؤهما (استخدم POST /connections مع bindToken + oauthCode بدلًا من ذلك).
حدود المعدل
| المعلمة | النوع | الوصف |
|---|---|---|
Create connections | limit | 25 عنصرًا كحد أقصى لكل نداء. 20 نداءً في الساعة لكل مورِّد، إضافةً إلى حد 120/ساعة لكل عنوان IP. كل عنصر هو فحص صادر لدى المزوِّد. |
Proxy pre-flight | limit | 30 استدعاءً في الساعة لكل عنوان IP. كل استدعاء يفتح نفقًا واحدًا إلى مضيف محايد. |
Read endpoints | limit | 600 طلب في الساعة لكل عنوان IP على الواجهة المشتركة للجهاز، ما لم يحدد مسار ما سقفه الخاص. |
Cabinet key management | limit | 120 في الساعة لكل عنوان IP لسرد المفاتيح، و20 في الساعة لإصدارها، و60 في الساعة لإلغائها. |
429 قيمة Retry-After بالثواني. تراجع وانتظر تلك المدة ثم أعد المحاولة؛ فإعادة إرسال الاعتماد نفسه مرفوضة بوصفه duplicate بسبب بصمة الاعتماد الفريدة.استجابات الخطأ
| المعلمة | النوع | الوصف |
|---|---|---|
401 | status | مفتاح API مفقود أو غير معروف أو ملغى. رسالة واحدة ثابتة، حتى لا يستطيع المُستدعي التمييز بين الحالات. |
404 | status | المسار غير موجود في هذا المشروع (السوق غير مُفعَّل هنا)، أو أن العرض المُشار إليه يخصّ مورّدًا آخر. |
429 | status | حد المعدل. يُعاد Retry-After من محدِّد المعدل المشترك. |
400 | status | JSON غير صالح أو دفعة تتجاوز الحد. يحدد الجسم المُدخل غير الصالح. |
الوصف القابل للقراءة آليًا لكل نقطة نهاية جزء من مستند OpenAPI على /api/openapi. وجّه مولّد عميل OpenAPI إليه لبناء عميل مُنمَّط.