مرجع الـAPI
يوفّر Patchwire مواصفة OpenAPI 3 كاملة. المرجع التفاعلي على:
https://api.patchwire.app/docs
تلك الصفحة يعرضها Redoc ضد نقطة /openapi.json الحيّة، فهي مطابقة دائماً للـAPI المنشور.
المواصفة الخام على:
https://api.patchwire.app/openapi.json
تستطيع تمريرها إلى مولِّد العميل المفضّل لديك — openapi-generator-cli أو oapi-codegen لـGo أو progenitor لـRust… إلخ.
المصادقة
كل النقاط ما عدا /v1/auth/register و/v1/auth/login و/healthz تتطلّب رمز bearer:
Authorization: Bearer <jwt>الـJWT يُصدر من POST /v1/auth/register ومن POST /v1/orgs/{slug}/auth/login. وهو:
- صالح 24 ساعة افتراضياً.
- يحمل slug المنظمة ودور المستخدم في الحمولة.
- مرتبط بمنظمة واحدة — استدعاء نقطة منظمة أخرى برمزك يعيد 403 مع
"token is for a different organization".
أنماط شائعة
نطاق الموارد
كل نقطة لكل منظمة شكلها /v1/orgs/{org_slug}/<resource>:
/v1/orgs/{org_slug}/projects
/v1/orgs/{org_slug}/projects/{project_slug}
/v1/orgs/{org_slug}/projects/{project_slug}/scans
/v1/orgs/{org_slug}/projects/{project_slug}/scans/{scan_id}
/v1/orgs/{org_slug}/projects/{project_slug}/scans/{scan_id}/findings
/v1/orgs/{org_slug}/findings
/v1/orgs/{org_slug}/usersslug المنظمة في الرابط يجب أن يطابق الـslug في JWT.
الأخطاء
كل استجابات الخطأ تتشارك شكلاً واحداً:
{
"error": "bad_request",
"message": "slug must be 2–40 chars (got 1)"
}حقل error معرّف ثابت قابل للقراءة الآلية؛ حقل message قد تتغيّر صياغته. استعمل error في مسارات الكود.
قابلية التكرار
نقاط POST ليست مفهرسة-بمعرّف-تكرار. إعادة POST /projects بنفس الـslug تعيد 409. إعادة POST /run-scan تنشئ صف فحص جديد.
أمثلة سريعة
التسجيل
curl -X POST https://api.patchwire.app/v1/auth/register \
-H 'content-type: application/json' \
-d '{
"org_name": "Acme Inc.",
"org_slug": "acme",
"email": "you@acme.example",
"password": "use-a-real-password-here"
}'الاستجابة:
{
"token": "eyJ0eXAiOiJKV1Qi…",
"expires_at": "2026-04-26T09:34:20Z",
"user": { "id": "…", "email": "…", "role": "admin", "status": "active", … }
}إنشاء مشروع برمز خاص
curl -X POST https://api.patchwire.app/v1/orgs/acme/projects \
-H "authorization: Bearer $TOKEN" \
-H 'content-type: application/json' \
-d '{
"slug": "web",
"name": "Acme web app",
"repo_url": "https://github.com/acme/web.git",
"default_branch": "main",
"access_token": "github_pat_…",
"access_token_user": "x-access-token"
}'الاستجابة لا تحتوي أبداً على access_token ولا access_token_enc — فقط has_access_token: true.
إطلاق فحص يدوياً
curl -X POST https://api.patchwire.app/v1/orgs/acme/projects/web/run-scan \
-H "authorization: Bearer $TOKEN" \
-H 'content-type: application/json' \
-d '{"clone_url":"https://github.com/acme/web.git","branch":"main"}'الاستجابة 202 Accepted مع صف الفحص الجديد. اسأل GET …/scans/{id} للحالة؛ webhooks لنفس المشروع ستكتب أيضاً في جدول scans.
حدود المعدل
لا توجد حدود معدّل على الـAPI اليوم. نقاط الـwebhooks تقبل ما يرسله الـSCM — عنق الزجاجة عند Patchwire هو إنتاجية الماسحات، لا معدل الطلبات. حدّ مستقبلي سيُضاف قبل الاستخدام التجاري.