واجهة REST البرمجية
شغّل عمليات الفحص من داخل شيفرتك الخاصة. الواجهة البرمجية متاحة في خطة Pro وما فوقها، وتستخدم مفتاح bearer للمصادقة، ويُدفع مقابلها بالأرصدة.
آخر تحديث: 6 سبتمبر 2026
المصادقة
أنشئ مفتاحًا من الإعدادات ← مفاتيح الواجهة البرمجية. يُعرض المفتاح بصيغته النصية مرة واحدة فقط ولا يمكن استعادته بعدها؛ ولا يُخزَّن منه بصيغة مقروءة سوى بادئته. أرسله كرمز bearer مع كل طلب.
curl https://api.namesight.app/v1/usage \
-H "Authorization: Bearer ns_live_..."يحمل كل مفتاح مجموعة من النطاقات. أي طلب يحتاج نطاقًا لا يملكه المفتاح يُرفض برمز 403، لذا فإن مفتاحًا تسلّمه لتكامل للقراءة فقط لا يستطيع بدء فحص مدفوع.
| النطاق | ما يتيحه |
|---|---|
| scans:write | POST /v1/scans — بدء فحص، وهو ما ينفق أرصدة |
| scans:read | GET /v1/scans، GET /v1/scans/{id}، GET /v1/usage |
| reference:read | نقاط النهاية المرجعية /v1/ref/* |
| reports:write | POST /v1/scans/{id}/shares — إنشاء رابط مشاركة عام |
| ideas:write | POST /v1/ideas — مولّد الأسماء |
| projects:read | GET /v1/projects — عرض المشاريع لتصنيف الفحص تحت أحدها |
| webhooks:manage | نقاط النهاية /v1/webhooks |
الأرصدة والحصة
يُدفع مقابل كل فحص بالأرصدة، سواء بدأته من هنا أو من تطبيق الويب. تكلفة الفحص هي مجموع الوحدات التي يشغّلها: 100 رصيد مع الوحدات الخمس الافتراضية، وأقل عند استبعاد إحداها. تمنحك خطتك رصيدًا شهريًا، والأرصدة غير المستهلكة تُرحَّل.
يُسجَّل الخصم قبل إدراج أي عمل في الطابور، لذا فإن الفحص الذي يتعذّر دفع ثمنه لا يُشغَّل ولا يترك أي سجل خلفه. وإذا أخفق الإدراج في الطابور بعد الخصم، تُعاد الأرصدة تلقائيًا.
- الرصيد غير كافٍ ← 429 مع مستند مشكلة يوضّح مقدار العجز
- خطة بلا وصول إلى الواجهة البرمجية ← 402 مع رابط للترقية
- إنفاق الأرصدة معطَّل لمساحة العمل ← 403
بدء فحص
يدرج POST /v1/scans فحصًا في الطابور ويردّ برمز 202 فورًا. الفحص غير متزامن: تحمل الاستجابة قيمة scanId لا النتيجة.
curl -X POST https://api.namesight.app/v1/scans \
-H "Authorization: Bearer ns_live_..." \
-H "Content-Type: application/json" \
-d '{
"name": "lumina labs",
"regions": ["TR", "EM", "US"],
"niceClasses": [9, 41],
"tlds": ["com", "io"],
"modules": ["trademark", "domain", "social"]
}'{ "scanId": "scn_...", "totalJobs": 12, "creditsSpent": 100, "balance": 1900 }| الحقل | مطلوب | المعنى |
|---|---|---|
| name | نعم | اسم العلامة المراد فحصه، من 2 إلى 64 حرفًا |
| regions | لا | مكاتب العلامات التجارية المراد البحث فيها. القيمة الافتراضية هي إعداد مساحة عملك |
| niceClasses | لا | فئات السلع والخدمات من 1 إلى 45. تحصر نتائج العلامات في التعارضات الحقيقية |
| tlds | لا | امتدادات النطاقات، دون النقطة في البداية |
| modules | لا | trademark، domain، social، dev، appstore |
| adapters | لا | الاقتصار على محوّلات مصادر بعينها حسب المعرّف |
| projectId | لا | إدراج الفحص ضمن مشروع قائم |
| options.similarSearch | لا | بحث تقريبي عن العلامات المتقاربة (لخطة Pro وما فوقها) |
قراءة النتيجة
استعلم دوريًا عن GET /v1/scans/{id} حتى تصبح قيمة status هي completed أو completed_partial. ينتهي الفحص المعتاد في أقل من دقيقة؛ استعلم مرة كل ثانية تقريبًا ووسّع الفاصل الزمني كلما طال الانتظار، كي لا يستنزف الفحص الطويل حدّ معدّل طلباتك.
curl https://api.namesight.app/v1/scans/scn_... \
-H "Authorization: Bearer ns_live_..."| status | المعنى |
|---|---|
| queued | مقبول، ولم يُتصل بأي مصدر بعد |
| running | بعض عمليات التحقق اكتملت؛ وتوضّح doneJobs / totalJobs مدى التقدّم |
| completed | اكتملت كل عمليات التحقق |
| completed_partial | انتهى الفحص، لكن تعذّر التحقق من مصدر واحد على الأقل |
| failed | تعذّر تشغيل الفحص |
كل مدخلة في checks هي إجابة مصدر واحد عن هدف واحد، ولها حكمها الخاص، ورابط sourceUrl الذي قُرئت منه، وطابع الوقت fetchedAt. أما كائن summary فيظهر بعد انتهاء الفحص ويحمل الدرجة، ونطاق المخاطرة، وحصيلة العلامات التجارية.
| verdict | المعنى |
|---|---|
| available | يقول المصدر إن الاسم متاح |
| taken | قيد الاستخدام — معرّف مسجَّل، أو نطاق يستجيب |
| conflict | علامة تجارية سارية تتداخل مع الفئات المطلوبة |
| risky | قيد الاستخدام على نحو قد يعيقك وقد لا يعيقك |
| unknown | تعذّر التحقق من المصدر |
| error | أخفق المصدر؛ ويبيّن errorCode كيف |
البيانات المرجعية
أربع نقاط نهاية مرجعية تصف ما يمكن أن يتضمنه طلب الفحص. وهي تحتاج نطاق reference:read ولا تكلّف شيئًا.
| نقطة النهاية | ما تعيده |
|---|---|
| GET /v1/ref/nice-classes | فئات تصنيف نيس الخمس والأربعون |
| GET /v1/ref/regions | مكاتب العلامات التجارية التي يمكن للفحص البحث فيها |
| GET /v1/ref/tlds | امتدادات النطاقات مصنَّفة حسب المستوى |
| GET /v1/ref/adapters | كل محوّلات المصادر، مع الوحدة التابع لها كل منها |
الأخطاء وحدود المعدّل
تُرسَل الأخطاء بوصفها مستندات مشكلة وفق معيار RFC 9457 بنوع المحتوى application/problem+json. يحدّد حقل type نوع الإخفاق، ويشرحه detail، ويحمل بعضها بيانات إضافية مثل upgradeUrl.
{
"type": "https://namesight.app/errors/quota-exceeded",
"title": "Quota exceeded",
"status": 429,
"detail": "Not enough credits (balance 0, need 100). Top up or switch off a module to continue."
}| الحالة | متى |
|---|---|
| 400 | لم يجتز جسم الطلب التحقق من الصحة |
| 401 | المفتاح مفقود أو غير معروف أو مُبطَل أو منتهي الصلاحية |
| 402 | الخطة لا تشمل الواجهة البرمجية العامة |
| 403 | المفتاح يفتقر إلى نطاق، أو إنفاق الأرصدة معطَّل |
| 404 | لا يوجد فحص بهذا المعرّف في مساحة العمل هذه |
| 403 (key-cap-exceeded) | بلغ هذا المفتاح سقفه الشهري من الرصيد؛ ارفعه من الإعدادات ← مفاتيح API |
| 409 | أُعيد استخدام Idempotency-Key نفسه مع محتوى مختلف |
| 429 | تجاوز حدّ المعدّل أو رصيد الأرصدة |
تُحسب حدود المعدّل لكل مفتاح على مدى دقيقة منزلقة، ويُبلَّغ عنها في كل استجابة، فيمكنك التراجع قبل أن يُرفض طلبك.
x-ratelimit-limit: 60
x-ratelimit-remaining: 58
x-ratelimit-reset: 41إجراءات على الفحص وما بعدها
بعد بدء الفحص وقراءته، يستطيع المفتاح إعادة تشغيله، وإعادة محاولة المصادر التي لم تُجب، وحذفه، ومشاركة تقريره، وعرض مشاريع مساحة العمل، وتوليد أفكار أسماء. كلٌّ منها يحتاج النطاق المبيَّن.
| الطريقة والمسار | النطاق | ما يفعله |
|---|---|---|
| POST /v1/scans/{id}/rescan | scans:write | يبدأ فحصًا جديدًا بالاسم والإعدادات نفسها. يُسعَّر كفحص جديد ويبقى الأصل. |
| POST /v1/scans/{id}/retry-unknowns | scans:write | يعيد إلى الطابور الفحوص التي انتهت بـ unknown أو بخطأ فقط، متجاوزًا الذاكرة المؤقتة. مجاني. |
| DELETE /v1/scans/{id} | scans:write | يحذف الفحص وفحوصه وروابط مشاركته. لا يُستردّ الرصيد. |
| POST /v1/scans/{id}/shares | reports:write | يعيد رابطًا عامًا للتقرير. كل من يحمله يقرأ التقرير؛ والخطة تحدّ مدة صلاحيته. |
| GET /v1/projects | projects:read | مشاريع مساحة العمل مع فئاتها ومكاتبها ونطاقاتها الافتراضية. |
| POST /v1/ideas | ideas:write | يشغّل مولّد الأسماء من وصف أو اسم بذرة أو موضوعات. مجاني. |
| GET /v1/usage/events | scans:read | كل نداء API أجرته مساحة العمل في الأيام الأخيرة، بما فيها الفاشلة. |
إعادة المحاولة بأمان: أرسل ترويسة Idempotency-Key (أي سلسلة فريدة) مع POST /v1/scans أو rescan. تكرار يحمل المفتاح نفسه خلال 24 ساعة يعيد الجواب الأول — وتقول الاستجابة Idempotent-Replayed: true — بدل بدء فحص ثانٍ وتحصيل رصيده. المفتاح نفسه مع محتوى مختلف يُرفض بـ 409.
curl -X POST https://api.namesight.app/v1/scans \
-H "Authorization: Bearer ns_live_..." \
-H "Idempotency-Key: 4f7c2c1e-order-1187" \
-H "Content-Type: application/json" \
-d '{"name":"Lumina Labs","modules":["trademark","domain"]}'الانتظار دون استطلاع متكرر: GET /v1/scans/{id}?wait=60000 يُبقي الطلب معلّقًا حتى ينتهي الفحص أو تنقضي المهلة (60 ثانية كحدّ أقصى)، ثم يجيب بالفحص كما هو. طلب واحد، خانة واحدة من حدّ المعدّل، ولا حلقة.
التصفّح: GET /v1/scans يعيد items و nextCursor. أعد nextCursor بوصفه cursor للصفحة التالية؛ null تعني الصفحة الأخيرة. status يرشّح بحالة أو أكثر مفصولة بفواصل.
الويب هوك
بدل الاستطلاع المتكرر، سجّل نقطة نهاية https واستقبل طلب POST موقّعًا عند انتهاء الفحص. تُدار نقاط النهاية من الإعدادات ← API أو عبر /v1/webhooks بنطاق webhooks:manage؛ يمكن لمساحة العمل الاحتفاظ بعشر. سرّ التوقيع يُعرض مرة واحدة عند الإنشاء وعند التدوير.
| الحدث | متى | ما يحمله data |
|---|---|---|
| scan.completed | بلغ الفحص completed أو completed_partial أو failed | scanId, status, kind, rawName, queryName, projectId, score, band, unknownCount, trademarkLiveConflicts, totalJobs, doneJobs, createdAt, completedAt, url |
كل تسليم يحمل أربع ترويسات: x-namesight-event و x-namesight-delivery (المعرّف نفسه في كل إعادة محاولة لإزالة التكرار) و x-namesight-timestamp (ثواني يونكس) و x-namesight-signature. التوقيع هو v1= يليه HMAC-SHA256 بالست عشري على "<timestamp>.<raw body>" بسرّك. تحقق منه على المحتوى الخام للطلب، وارفض الطوابع الزمنية الأقدم من خمس دقائق.
import { createHmac, timingSafeEqual } from "node:crypto";
// Express-style handler; keep the RAW body — a re-serialised JSON will not match.
app.post("/hooks/namesight", express.raw({ type: "*/*" }), (req, res) => {
const ts = req.header("x-namesight-timestamp");
const sig = req.header("x-namesight-signature"); // "v1=<hex>"
const body = req.body.toString("utf8");
const expected = "v1=" + createHmac("sha256", process.env.NAMESIGHT_WEBHOOK_SECRET)
.update(`${ts}.${body}`).digest("hex");
const fresh = Math.abs(Date.now() / 1000 - Number(ts)) < 300;
if (!fresh || expected.length !== sig.length || !timingSafeEqual(Buffer.from(expected), Buffer.from(sig))) {
return res.status(401).end();
}
const event = JSON.parse(body); // { id, event, createdAt, test, data }
res.status(202).end(); // ack first, work later
if (!event.test) handleScanCompleted(event.data); // data.scanId, data.status, data.score, data.url
});أجب بأي 2xx خلال عشر ثوانٍ ثم نفّذ العمل لاحقًا. أي شيء آخر يُعاد أربع مرات بعد 30 ثانية و 2 و 10 و 60 دقيقة. عشرة تسليمات متتالية تفشل في كل محاولاتها تعطّل نقطة النهاية؛ إعادة تفعيلها تصفّر العدّاد. زر الاختبار يرسل scan.completed اصطناعيًا موسومًا test: true.
OpenAPI
يُقدَّم الوصف الكامل المقروء آليًا على /v1/openapi.json. وهو لا يحتاج أي مصادقة، فيمكنك توليد عميل منه قبل أن تحصل على مفتاح.