مرجع API
عقد REST للفحص البرمجي، منشور قبل تشغيل الخدمة كي تراجعه قبل أن تكتب شيفرة تعتمد عليه.
تُرجِع واجهة ARGUS البرمجية الحُكم نفسه الذي يعرضه الموقع: نتيجة فحص عقوبات مباشرة، وتفصيل التعرّض، والمؤشرات وراء الدرجة، ككائن JSON واحد لكل عنوان. وقد صُمّمت للحظة التي تسبق تحرّك الأموال — افحص عنوانًا وقت الدفع، وتصرّف بناءً على الاستجابة، واحتفظ بالكائن سجلًّا للتدقيق.
هذه الصفحة هي العقد المنشور، لا خدمة قيد التشغيل. فعنوان القاعدة لا يخدم الطلبات بعد ولا تُصدَر مفاتيح. وهي علنية الآن كي يراجع المُدمِجون البُنى قبل وجود نقاط النهاية — وإن كان شيء هنا لا يناسبك، فهذا بالضبط ما نريد سماعه. اطلب وصولًا مبكرًا وسنتواصل معك حين تتوفر المفاتيح.
عنوان القاعدة والمصادقة
تُقدَّم كل نقاط النهاية عبر HTTPS من عنوان قاعدة واحد، وتُحدَّد إصداراتها في المسار. ويجب أن يحمل كل طلب مفتاح API كرمز Bearer؛ ولا توجد نقاط نهاية بلا مصادقة.
https://api.argus.exampleAuthorization: Bearer <your key>
Accept: application/jsonالمفاتيح أسرار. أرسلها من خادم، لا من متصفح أبدًا — فالمفتاح الذي يصل إلى العميل يصبح علنيًا لحظة تحميل الصفحة.
افحص عنوانًا
يفحص عنوانًا واحدًا ويُرجِع حُكمًا كاملًا. ومُعامل المسار address هو المُدخَل الوحيد: عنوان EVM (0x إضافة إلى 40 حرفًا ست عشريًا) أو عنوان TRON (T إضافة إلى 33 حرفًا بترميز base58). وتُستنتج الشبكة من الشكل — فعنوان EVM هو السلسلة النصية نفسها على كل سلاسل EVM، ولذلك يغطي فحصه مرة واحدة جميعها.
curl https://api.argus.example/v1/screen/TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t \
-H "Authorization: Bearer $ARGUS_API_KEY"const address = "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t";
const res = await fetch(`https://api.argus.example/v1/screen/${address}`, {
headers: { Authorization: `Bearer ${process.env.ARGUS_API_KEY}` },
});
if (!res.ok) throw new Error(`Screening failed: ${res.status}`);
const verdict: ScreenResult = await res.json();
if (verdict.sanctions.hit !== null) {
// Designated. Decisive on its own — decline before funds move.
}type Band = "clear" | "caution" | "high" | "severe";
interface SanctionsHit {
name: string; // the designated person or entity
uid: number | null; // OFAC's SDN entry id
type: string; // "Individual" | "Entity"
asset: string; // ticker OFAC recorded the address under
programs: string[]; // e.g. ["DPRK3", "CYBER2"]
}
interface ScreenResult {
address: string;
network: "evm" | "tron";
score: number | null; // 0–100; null when no score is justified
band: Band | null; // clear <30 · caution <55 · high <75 · severe
sanctions: {
hit: SanctionsHit | null; // null = screened and not found,
// never "not screened"
publishDate: string; // OFAC's own date, MM/DD/YYYY
addressCount: number; // addresses in the screened snapshot
sourceUrl: string;
};
exposure: {
label: string; // source category, e.g. "Mixer"
share: number; // percentage of inbound value
band: Band | "unknown";
}[];
signals: {
title: string;
detail: string;
band: Band | "unknown";
}[];
// true while exposure and signals carry sample figures pending the
// graph indexer; the sanctions block is live regardless
exposureIsIllustrative: boolean;
}{
"address": "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t",
"network": "tron",
"score": null,
"band": null,
"sanctions": {
"hit": null,
"publishDate": "08/20/2026",
"addressCount": 961,
"sourceUrl": "https://ofac.treasury.gov/sanctions-list-service"
},
"exposure": [
{ "label": "Major exchange", "share": 61.4, "band": "clear" },
{ "label": "Unattributed", "share": 12.6, "band": "unknown" }
],
"signals": [
{
"title": "Majority of inbound value from a regulated venue",
"detail": "61.4% · withdrawal pattern consistent with retail",
"band": "clear"
}
],
"exposureIsIllustrative": true
}لماذا قد تكون score فارغة (null). الدرجة المركّبة تحتاج إلى طبقات التعرّض والسلوك والإسناد، وهذه ليست فعّالة بعد. واختلاق رقم رغم ذلك سيُنتج الشيء الوحيد الذي يجب ألا تفعله أداة فحص أبدًا: أن تناقض نفسها — فوجود "hit": null في كتلة العقوبات بجوار "score": 94 مُختلَقة يُقرأ كمولّد أرقام عشوائية، ويكلّف من الثقة أكثر مما يكلّفه حقل فارغ أبدًا. لذلك لا تظهر الدرجة إلا حين تبرّرها طبقة فعّالة: فالإدراج المباشر لدى OFAC يُرجِع 100 و"severe"، والطرف المقابل المُدرَج المكتشف على بُعد قفزة واحدة يُرجِع درجة مرتفعة مع النتيجة في signals. وفيما عدا ذلك تكون score وband كلتاهما null، وينبغي أن يعامل تكاملك ذلك على أنه “بلا درجة”، لا على أنه “مخاطر منخفضة”.
وتنطبق الصراحة نفسها على sanctions.hit: null — فهي تعني أن العنوان فُحِص مقابل اللقطة ولم يُعثر عليه، ويخبرك publishDate المجاور بأي لقطة يتعلق الأمر. وأي إدراج تم بعد ذلك التاريخ لن يظهر. وما دامت exposureIsIllustrative تساوي true، فإن مصفوفتي التعرّض والمؤشرات تحملان أرقامًا نموذجية ولا يجوز أن تقودا القرارات.
الفحص الجماعي
يفحص حتى 100 عنوان في طلب واحد. ويمكن خلط الشبكات. وتعود النتائج بترتيب المُدخَلات، ويُرجَع المُدخَل الذي يفشل في التحقق ككائن خطأ في موضعه بدل إفشال الدفعة كلها — فخطأ إملائي واحد لا ينبغي أن يُبطل 99 حُكمًا بجواره.
curl -X POST https://api.argus.example/v1/screen/batch \
-H "Authorization: Bearer $ARGUS_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"addresses": [
"TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t",
"0xdAC17F958D2ee523a2206206994597C13D831ec7"
]
}'{
"results": [
{ "address": "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t", "…": "…" },
{
"error": {
"code": "invalid_address",
"message": "TRON address failed base58check."
}
}
]
}يُحتسب كل عنوان في الدفعة استدعاءً واحدًا. والدفعات التي تتجاوز 100 مُدخَل تُرفض مع 400 invalid_request بدل بترها بصمت.
الأخطاء
الأخطاء بصيغة JSON مع رمز ثابت مقروء آليًا؛ أما الرسالة فللبشر وقد تتغير.
{
"error": {
"code": "invalid_address",
"message": "TRON address failed base58check — likely a typo."
}
}العنوان يفشل في التحقق. يجب أن يطابق عنوان EVM الصيغة 0x إضافة إلى 40 حرفًا ست عشريًا. ويجب أن يكون عنوان TRON بترميز base58 وأن يجتاز مجموع base58check التحققي كاملًا — فحقل الإدخال في الموقع يتحقق من الشكل فقط، ولذلك قد يبدو خطأ إملائي في عنوان TRON معقولًا حتى مرحلة المجموع التحققي؛ وترفضه الواجهة البرمجية هنا بدل فحص العنوان الخطأ.
الجسم ليس JSON صالحًا، أو الحقل addresses فارغ، أو الدفعة تتجاوز 100 مُدخَل.
مفتاح API مفقود أو مُشوَّه أو مُلغى.
لا وجود لهذا المسار أو الإصدار. ولا يُستخدم أبدًا لعنوان صالح بلا تاريخ — فالعنوان الذي لم يُجرِ أي معاملة نتيجته 200 عادية، لا خطأ.
تجاوز الحد المقرر لكل مفتاح. وترويسة Retry-After تحدد متى تعيد المحاولة.
مصدر بيانات سلسلة متوقف أو انتهت مهلته. وفحص العقوبات يجري مقابل لقطة محلية، ولذلك يتدهور أخيرًا. وإعادة المحاولة مع تراجع تدريجي آمنة؛ فقراءات الفحص لا تتأثر بالتكرار.
حدود المعدّل والاحتساب
الوصول إلى الواجهة البرمجية جزء من خطة API في صفحة الأسعار: 0.04 دولار لكل استدعاء، وتسعير بالحجم من 50,000 استدعاء، وفحص جماعي بلا حدود. والحدود أدناه جزء من هذه المواصفة — منشورة للمراجعة كغيرها هنا، وتُؤكَّد عند الإطلاق.
تجاوز أي حد يُرجِع 429 rate_limited مع ترويسة Retry-After. وتُطبَّق الحدود لكل مفتاح، لا لكل عنوان IP.
Webhooks
فحص العنوان مرة واحدة يخبرك عن تلك اللحظة وحدها. أما القائمة فتتحرك بعدها: تنشر OFAC إدراجات جديدة، والعنوان الذي جاء نظيفًا الشهر الماضي قد يُدرَج اليوم. وتسدّ Webhooks تلك الفجوة — فحين يظهر عنوان سبق لمفتاحك أن فحصه في إصدار SDN أحدث، يرسل ARGUS حدث sanctions.designation إلى نقطة النهاية التي هيّأتها.
{
"id": "evt_9f2c81d4",
"type": "sanctions.designation",
"createdAt": "2026-09-02T14:11:08Z",
"data": {
"address": "T111111111111111111111111111111111",
"network": "tron",
"firstScreenedAt": "2026-08-23T09:30:00Z",
"hit": {
"name": "EXAMPLE DESIGNATED ENTITY",
"uid": 99999,
"type": "Entity",
"asset": "TRX",
"programs": ["CYBER2"]
},
"listPublishDate": "09/01/2026"
}
}تُوقَّع عمليات التسليم بترويسة توقيع HMAC-SHA256 كي تتحقق من أن الحمولة صادرة عنا، وتُعاد محاولتها مع تراجع تدريجي لمدة 24 ساعة حتى تُرجِع نقطة نهايتك استجابة 2xx. والعنوان والكيان أعلاه عنصران مؤقتان — فالعنوان لا يمكن أن يجتاز base58check والكيان غير موجود.
وصول مبكر
لا تُصدَر المفاتيح بعد. وإن أردت البناء على هذه الواجهة — أو كنت ترى فيها مشكلة بالفعل — فقل ذلك عبر صفحة التواصل تحت بند “API والشراكات”. فالمُدمِجون الذين يراجعون المواصفة الآن يحصلون على المفاتيح أولًا، والتغييرات قبل الإطلاق لا تكلّف شيئًا.