تخطَّ إلى المحتوى
→ ARGUSالمنتج

مرجع API

عقد REST للفحص البرمجي، منشور قبل تشغيل الخدمة كي تراجعه قبل أن تكتب شيفرة تعتمد عليه.

تُرجِع واجهة ARGUS البرمجية الحُكم نفسه الذي يعرضه الموقع: نتيجة فحص عقوبات مباشرة، وتفصيل التعرّض، والمؤشرات وراء الدرجة، ككائن JSON واحد لكل عنوان. وقد صُمّمت للحظة التي تسبق تحرّك الأموال — افحص عنوانًا وقت الدفع، وتصرّف بناءً على الاستجابة، واحتفظ بالكائن سجلًّا للتدقيق.

مواصفة — ليست فعّالة بعد

هذه الصفحة هي العقد المنشور، لا خدمة قيد التشغيل. فعنوان القاعدة لا يخدم الطلبات بعد ولا تُصدَر مفاتيح. وهي علنية الآن كي يراجع المُدمِجون البُنى قبل وجود نقاط النهاية — وإن كان شيء هنا لا يناسبك، فهذا بالضبط ما نريد سماعه. اطلب وصولًا مبكرًا وسنتواصل معك حين تتوفر المفاتيح.

عنوان القاعدة والمصادقة

تُقدَّم كل نقاط النهاية عبر HTTPS من عنوان قاعدة واحد، وتُحدَّد إصداراتها في المسار. ويجب أن يحمل كل طلب مفتاح API كرمز Bearer؛ ولا توجد نقاط نهاية بلا مصادقة.

عنوان القاعدة
https://api.argus.example
ترويسات الطلب
Authorization: Bearer <your key>
Accept: application/json

المفاتيح أسرار. أرسلها من خادم، لا من متصفح أبدًا — فالمفتاح الذي يصل إلى العميل يصبح علنيًا لحظة تحميل الصفحة.

افحص عنوانًا

GET/v1/screen/{address}

يفحص عنوانًا واحدًا ويُرجِع حُكمًا كاملًا. ومُعامل المسار address هو المُدخَل الوحيد: عنوان EVM (0x إضافة إلى 40 حرفًا ست عشريًا) أو عنوان TRON (T إضافة إلى 33 حرفًا بترميز base58). وتُستنتج الشبكة من الشكل — فعنوان EVM هو السلسلة النصية نفسها على كل سلاسل EVM، ولذلك يغطي فحصه مرة واحدة جميعها.

الطلب — curl
curl https://api.argus.example/v1/screen/TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t \
  -H "Authorization: Bearer $ARGUS_API_KEY"
الطلب — TypeScript
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;
}
الاستجابة — 200
{
  "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، فإن مصفوفتي التعرّض والمؤشرات تحملان أرقامًا نموذجية ولا يجوز أن تقودا القرارات.

الفحص الجماعي

POST/v1/screen/batch

يفحص حتى 100 عنوان في طلب واحد. ويمكن خلط الشبكات. وتعود النتائج بترتيب المُدخَلات، ويُرجَع المُدخَل الذي يفشل في التحقق ككائن خطأ في موضعه بدل إفشال الدفعة كلها — فخطأ إملائي واحد لا ينبغي أن يُبطل 99 حُكمًا بجواره.

الطلب — curl
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"
    ]
  }'
الاستجابة — 200
{
  "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."
  }
}
400invalid_address

العنوان يفشل في التحقق. يجب أن يطابق عنوان EVM الصيغة 0x إضافة إلى 40 حرفًا ست عشريًا. ويجب أن يكون عنوان TRON بترميز base58 وأن يجتاز مجموع base58check التحققي كاملًا — فحقل الإدخال في الموقع يتحقق من الشكل فقط، ولذلك قد يبدو خطأ إملائي في عنوان TRON معقولًا حتى مرحلة المجموع التحققي؛ وترفضه الواجهة البرمجية هنا بدل فحص العنوان الخطأ.

400invalid_request

الجسم ليس JSON صالحًا، أو الحقل addresses فارغ، أو الدفعة تتجاوز 100 مُدخَل.

401unauthorized

مفتاح API مفقود أو مُشوَّه أو مُلغى.

404not_found

لا وجود لهذا المسار أو الإصدار. ولا يُستخدم أبدًا لعنوان صالح بلا تاريخ — فالعنوان الذي لم يُجرِ أي معاملة نتيجته 200 عادية، لا خطأ.

429rate_limited

تجاوز الحد المقرر لكل مفتاح. وترويسة Retry-After تحدد متى تعيد المحاولة.

5xxupstream_unavailable

مصدر بيانات سلسلة متوقف أو انتهت مهلته. وفحص العقوبات يجري مقابل لقطة محلية، ولذلك يتدهور أخيرًا. وإعادة المحاولة مع تراجع تدريجي آمنة؛ فقراءات الفحص لا تتأثر بالتكرار.

حدود المعدّل والاحتساب

الوصول إلى الواجهة البرمجية جزء من خطة API في صفحة الأسعار: 0.04 دولار لكل استدعاء، وتسعير بالحجم من 50,000 استدعاء، وفحص جماعي بلا حدود. والحدود أدناه جزء من هذه المواصفة — منشورة للمراجعة كغيرها هنا، وتُؤكَّد عند الإطلاق.

المعدّل المستدام10 طلبات / ثانية لكل مفتاح
الدفقة50 طلبًا
حجم الدفعة100 عنوان لكل طلب
الاحتساباستدعاء واحد لكل عنوان مفحوص
السعر0.04 دولار لكل استدعاء · تسعير بالحجم من 50,000 استدعاء

تجاوز أي حد يُرجِع 429 rate_limited مع ترويسة Retry-After. وتُطبَّق الحدود لكل مفتاح، لا لكل عنوان IP.

Webhooks

فحص العنوان مرة واحدة يخبرك عن تلك اللحظة وحدها. أما القائمة فتتحرك بعدها: تنشر OFAC إدراجات جديدة، والعنوان الذي جاء نظيفًا الشهر الماضي قد يُدرَج اليوم. وتسدّ Webhooks تلك الفجوة — فحين يظهر عنوان سبق لمفتاحك أن فحصه في إصدار SDN أحدث، يرسل ARGUS حدث sanctions.designation إلى نقطة النهاية التي هيّأتها.

حمولة Webhook
{
  "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 والشراكات”. فالمُدمِجون الذين يراجعون المواصفة الآن يحصلون على المفاتيح أولًا، والتغييرات قبل الإطلاق لا تكلّف شيئًا.