📖 MESD Filler Rəsmi API Sənədləri və Xidmət Nümunələri

🌟 Ümumi Giriş və Təhlükəsizlik Arxitekturası

MESD Metadata Filler sistemi dövlət sənədlərinin (PDF/DOCX) mətni və skanlarından 23 qeydiyyat sahəsinin avtomatlaşdırılmış çıxarışını təmin edir. Bütün xarici inteqrasiyalar (SESDA və digər qurumlar) vahid giriş nöqtəsindən xidmət alır.

🔑 Tələb olunan Başlıqlar (Headers):
• Sənəd xidmətləri üçün: X-API-Key: sesda-secret-key-2026 və ya Authorization: Bearer <SESDA_API_KEY>
• İnzibatçı / Audit xidmətləri üçün: X-Settings-Password: admin-mesd-2026

🔒 Məxfilik Zəmanəti: Sistem loglarına sənədlərin mətni, daxili məzmunu və fərdlərə aid şəxsi məlumatlar qətiyyən yazılmır.

POST /api/v1/extract 🔑 SESDA_API_KEY tələb olunur

SESDA Vahid Ön Qapı (Single Entry Gate): PDF və ya DOCX faylını qəbul edir, OCR və süni intellektlə emal edir, bütün 23 MESD qeydiyyat sahəsini nömrələnmiş (1..23) strukturda qaytarır.
ParametrNövHaradaTəsvir
filemultipart/form-dataBody *PDF və ya DOCX sənəd faylı (bir və ya bir neçə qoşma)
use_aibooleanFormSüni intellektlə (vLLM) dəqiqləşdirmə (standart: false)
X-API-KeystringHeader *SESDA üçün təyin edilmiş gizli açar
curl -X POST "http://127.0.0.1:8009/api/v1/extract" \
  -H "X-API-Key: sesda-secret-key-2026" \
  -F "file=@/yol/mektub_0412.pdf" \
  -F "use_ai=false"
import requests

url = "http://127.0.0.1:8009/api/v1/extract"
headers = {
    "X-API-Key": "sesda-secret-key-2026"
}
files = {
    "file": open("mektub_0412.pdf", "rb")
}
data = {
    "use_ai": "false"
}

response = requests.post(url, headers=headers, files=files, data=data)
result = response.json()

print(f"Status: {result.get('status')}, Sorğu №: {result.get('request_id')}")
# 23 Nömrələnmiş sahə:
for num, field in result.get("numbered_fields", {}).items():
    print(f"[{num}] {field['name']}: {field['value']} (dəqiqlik: {field['conf']})")
const formData = new FormData();
formData.append('file', fileInput.files[0]);
formData.append('use_ai', 'false');

const response = await fetch('http://127.0.0.1:8009/api/v1/extract', {
  method: 'POST',
  headers: {
    'X-API-Key': 'sesda-secret-key-2026'
  },
  body: formData
});

const data = await response.json();
console.log('Nəticə:', data.numbered_fields);
{
  "status": "success",
  "request_id": "5bed9ea4d9e444ae91055cbf21467dd8",
  "id": "5bed9ea4d9e444ae91055cbf21467dd8",
  "file": "mektub_0412.pdf",
  "created": "2026-11-12T12:00:00",
  "numbered_fields": {
    "1": {"name": "Müraciətin tipi", "value": "Məktub", "conf": "yüksək", "required": true},
    "2": {"name": "Daxilolma yolu", "value": "Elektron", "conf": "yüksək", "required": true},
    "3": {"name": "Daxilolma tarixi", "value": "12.11.2026", "conf": "yüksək", "required": false},
    "4": {"name": "Sənədin nömrəsi", "value": "04-12/987", "conf": "yüksək", "required": true},
    "5": {"name": "Sənədin tarixi", "value": "11.11.2026", "conf": "yüksək", "required": true},
    "6": {"name": "Sənədi imzalayan", "value": "Əliyev Vüqar", "conf": "yüksək", "required": false},
    "7": {"name": "Sənədin icraçısı", "value": "Məmmədova Leyla", "conf": "orta", "required": false},
    "8": {"name": "Göndərənin nəzarəti", "value": "Xeyr", "conf": "yüksək", "required": false},
    "9": {"name": "Kimə ünvanlanıb", "value": "Azərbaycan Respublikası Energetika Nazirliyinə", "conf": "yüksək", "required": true},
    "10": {"name": "Yazışmanın növü", "value": "Xidməti məktub", "conf": "yüksək", "required": true},
    "11": {"name": "Yazışmanın mövzusu", "value": "Bərpa olunan enerji layihələri", "conf": "yüksək", "required": true},
    "12": {"name": "Məzmun", "value": "Günəş elektrik stansiyasının tikintisi barədə layihə sənədlərinin razılaşdırılması", "conf": "orta", "required": true},
    "13": {"name": "Yeni-Cavab", "value": "Yeni", "conf": "yüksək", "required": true},
    "14": {"name": "Qeyd", "value": "", "conf": "aşağı", "required": false},
    "15": {"name": "Yazışmanın vacibliyi", "value": "Sadə", "conf": "yüksək", "required": true},
    "16": {"name": "Qoşma yazışmalar", "value": "", "conf": "aşağı", "required": false},
    "17": {"name": "Nəzarət", "value": "Xeyr", "conf": "yüksək", "required": false},
    "18": {"name": "İcranın xarakteri", "value": "İcra üçün", "conf": "yüksək", "required": true},
    "19": {"name": "Biznes proses – Nəzarətçi", "value": "", "conf": "aşağı", "required": true},
    "20": {"name": "Biznes proses – Dərkənar sahibi", "value": "Nazir müavini", "conf": "orta", "required": true},
    "21": {"name": "Biznes proses – İcraya nəzarət üçün", "value": "", "conf": "aşağı", "required": false},
    "22": {"name": "Biznes proses – İcraçılar", "value": "Enerji səmərəliliyi şöbəsi", "conf": "orta", "required": false},
    "23": {"name": "Biznes proses – Məlumat üçün", "value": "", "conf": "aşağı", "required": false}
  },
  "extra_fields": {
    "Təşkilat": {"name": "Təşkilat", "value": "Azərenerji ASC", "conf": "yüksək", "note": "Reyestrdən təsdiqləndi"}
  }
}
/* HTTP 401 Unauthorized (Açarsız müraciət) */
{
  "status": "error",
  "error": "Açar tələb olunur: 'X-API-Key' və ya 'Authorization: Bearer ' başlığı daxil edin",
  "request_id": "7befbfa7b383498d9c9dcccd9f4ee875"
}

/* HTTP 403 Forbidden (Yanlış açar) */
{
  "status": "error",
  "error": "Yanlış və ya etibarsız API açarı",
  "request_id": "18d9060a137049c8b8de125c139721fb"
}

/* HTTP 400 Bad Request (Uyğunsuz fayl) */
{
  "status": "error",
  "error": "Yalnız PDF və DOCX faylları qəbul olunur",
  "request_id": "bfc02367335242108ed293454e1e78a2"
}

POST /api/auth/verify

İstifadəçinin daxil etdiyi API açarını təhlükəsiz şəkildə yoxlayır və veb sistemə giriş icazəsi verir.
curl -X POST "http://127.0.0.1:8009/api/auth/verify" \
  -H "Content-Type: application/json" \
  -d '{"api_key": "sesda-secret-key-2026"}'
import requests

r = requests.post("http://127.0.0.1:8009/api/auth/verify", json={"api_key": "sesda-secret-key-2026"})
print(r.status_code, r.json())
# 200 {'ok': True, 'status': 'authenticated', 'role': 'user', 'message': 'API açarı etibarlıdır'}
/* Uğurlu Giriş (200 OK) */
{
  "ok": true,
  "status": "authenticated",
  "role": "user",
  "message": "API açarı etibarlıdır"
}

/* Xəta (403 Forbidden) */
{
  "ok": false,
  "error": "Yanlış və ya etibarsız API açarı"
}

GET /api/v1/status

Xidmətin cari sağlamlığını, vLLM AI modelinin vəziyyətini, aktiv paralel işçiləri və bugünkü sorğu statistikalarını qaytarır.
curl -X GET "http://127.0.0.1:8009/api/v1/status"
{
  "workers": 4,
  "running": 0,
  "done": 12,
  "ai": "vllm",
  "vision": "",
  "vllm_url": "http://host.docker.internal:18005/v1",
  "ai_ready": true,
  "today_stats": {
    "date": "2026-11-12",
    "success": 10,
    "failed": 2,
    "total": 12,
    "avg_duration_sec": 2.45,
    "recent": [
      {
        "timestamp": "2026-11-12T06:06:34",
        "request_id": "9d58f68450b6459896be29542dbd6ccf",
        "status": "uğurlu",
        "status_code": 200,
        "duration_sec": 3.27,
        "file_name": "sened.pdf",
        "client_ip": "92.39.81.81",
        "origin_type": "SESDA / Xarici Şəbəkə",
        "error_reason": null
      }
    ]
  }
}

GET /api/audit/logs 🔒 Admin Şifrəsi Tələb Olunur

İnzibatçı üçün bütün tarixi audit loglarını və sorğuların hansı müştəri IP-lərindən gəldiyini qaytarır.
ParametrNövHaradaTəsvir
X-Settings-PasswordstringHeader *Admin şifrəsi (SETTINGS_PASSWORD)
datestringQueryTarix üzrə filtr (məs. 2026-11-12)
statusstringQueryStatus üzrə filtr (uğurlu, uğursuz, 401, 403)
ipstringQueryMüştəri IP üzrə filtr (məs. 92.39.81.81)
limitintegerQueryMaksimum log sayı (standart: 500)
curl -X GET "http://127.0.0.1:8009/api/audit/logs?status=uğurlu&limit=50" \
  -H "X-Settings-Password: admin-mesd-2026"
{
  "total": 120,
  "filtered": 1,
  "dates": ["2026-11-12", "2026-11-11"],
  "logs": [
    {
      "timestamp": "2026-11-12T06:06:34",
      "date": "2026-11-12",
      "request_id": "9d58f68450b6459896be29542dbd6ccf",
      "status": "uğurlu",
      "status_code": 200,
      "duration_sec": 3.27,
      "file_name": "mektub.pdf",
      "client_ip": "92.39.81.81",
      "origin_type": "SESDA / Xarici Şəbəkə",
      "user_agent": "python-requests/2.31.0",
      "error_reason": null
    }
  ]
}

GET /api/audit/origins 🔒 Admin Şifrəsi Tələb Olunur

Sorğuların hansı IP ünvanlarından və mənbələrdən (Haradan gəlib) daxil olduğunun xülasəsi.
curl -X GET "http://127.0.0.1:8009/api/audit/origins" \
  -H "X-Settings-Password: admin-mesd-2026"

GET /api/history

Sistemdə saxlanılmış sənədlərin xülasə siyahısını qaytarır.
curl -X GET "http://127.0.0.1:8009/api/history"

PUT /api/history/{doc_id}

İstifadəçi sənəd sahələrini dəyişdikdə bu metod çağırılır və proqram avtomatik olaraq gələcək sənədlər üçün öyrənir.
curl -X PUT "http://127.0.0.1:8009/api/history/5bed9ea4d9e444ae91055cbf21467dd8" \
  -H "Content-Type: application/json" \
  -d '{
    "fields": {
      "Yazışmanın növü": {"value": "Sərəncam"},
      "Yazışmanın mövzusu": {"value": "Kadr məsələləri"}
    }
  }'