English: For the English version of this document, see here.
Sürüm: 0.2.0 · İnteraktif doküman:
GET /docs(Swagger UI), Nginx arkasında/api/docsTaban URL (üretim):http://<sunucu>/api· Doğrudan (dev):http://localhost:8001
Tüm uçlar JSON döner. Zamanlar ISO-8601 UTC'dir. ID'ler UUID dizgisidir.
- Kimlik Doğrulama
- Roller & Yetki Matrisi
- Uzlaşımlar
- Sağlık
- Auth Uçları
- Plugin & Toplama
- Arama
- Kaynaklar
- Öğeler & Varlıklar
- Graf
- Uyarılar
- Raporlar
- İstatistik
- Hatalar
- Hız Sınırları
- Değişiklikler
İstek başına bir kimlik bilgisi gönderilir:
# Operatör / kullanıcı API anahtarı
curl -H "X-API-Key: <anahtar>" http://<sunucu>/api/plugins
# Kısa ömürlü JWT (1 saat, HS256)
curl -H "Authorization: Bearer <jeton>" http://<sunucu>/api/pluginsJeton üretimi (operatör anahtarı gerekir):
curl -X POST http://<sunucu>/api/auth/token \
-H 'Content-Type: application/json' \
-d '{"api_key":"<OSIRIS_API_KEY>","role":"analyst"}'
# → {"access_token":"...","token_type":"bearer","expires_in":3600}Kullanıcı anahtarları (yalnızca admin) — ham değer bir kez döner, saklanmaz:
curl -X POST http://<sunucu>/api/auth/keys \
-H "X-API-Key: <OSIRIS_API_KEY>" -H 'Content-Type: application/json' \
-d '{"username":"ali","role":"analyst","name":"laptop"}'
# → {"id":"...","api_key":"osiris_...","role":"analyst"}OSIRIS_API_KEY tanımsızsa API açık çalışır (güvenilir-ağ modu, uyarı loglanır).
Roller yükselir: viewer → analyst → admin. Bilinmeyen rol reddedilir.
| Uç | viewer | analyst | admin |
|---|---|---|---|
GET /health |
açık | açık | açık |
POST /auth/token |
gövdede operatör anahtarı | — | — |
GET/POST /auth/keys, DELETE /auth/keys/{id} |
✗ | ✗ | ✓ |
GET /plugins, GET /stats |
✓ | ✓ | ✓ |
POST /search, /search/entity, GET /items/*, /entities/top |
✓ | ✓ | ✓ |
GET /sources, /saved-queries, /graph |
✓ | ✓ | ✓ |
POST /collect, /collect/batch |
✗ (403) | ✓ | ✓ |
POST /sources, DELETE /sources/*, /sources/*/collect |
✗ | ✓ | ✓ |
POST /saved-queries, DELETE, /alerts/test |
✗ | ✓ | ✓ |
POST /graph/relation, /reports/markdown |
✗ | ✓ | ✓ |
- Sayfalama (liste uçları):
?limit=(varsayılan 100, en fazla 200) +?offset=(≥0)./items/recenten fazla 50. - Filtreler:
GET /sources?enabled=true&plugin_id=rss&q=ad;GET /saved-queries?alert_enabled=true;GET /entities/top?entity_type=email&limit=20. - Yoldaki ID'ler UUID olmalı — değilse
404döner (500asla). - İstek sınırları: config nesneleri ≤ 50 anahtar ve serileşmiş ≤ 20 KB; sorgular ≤ 500 karakter; gövdelerde alan
max_lengthsınırları. - Kısmi başarı:
/collect/batchher zaman200+ iş başına{ok, items, error}ve{ok, total}özeti döner.
curl http://<sunucu>/api/health
# {"status":"ok","service":"osiris-api"}| Yöntem & Yol | Rol | Açıklama |
|---|---|---|
POST /auth/token |
gövdede operatör anahtarı | JWT üret (role: viewer/analyst/admin) |
POST /auth/keys |
admin | Kullanıcı anahtarı üret ({username, role, name?}) |
GET /auth/keys |
admin | Anahtarları listele (yalnızca özet/önek, ham değer asla) |
DELETE /auth/keys/{id} |
admin | İptal et (satır kalır — denetim izi) |
# Envanter + dinamik config şemaları (kaynak formlarını buradan besleyin)
curl -H "X-API-Key: <a>" http://<sunucu>/api/plugins
# [{"id":"rss","name":"RSS/Atom Feed","network_type":"rss",
# "description":"...","config_schema":{"feed_url":{...}},"schedule_default":"*/15 * * * *"}]
# Tek iş
curl -X POST http://<sunucu>/api/collect -H "X-API-Key: <a>" \
-H 'Content-Type: application/json' \
-d '{"plugin_id":"rss","config":{"feed_url":"https://example.com/rss"}}'
# → {"items":3,"metadata":{...}} (başarısızlıkta plugin mesajıyla 502)
# Toplu (≤10 iş, sıralı, iş başına sonuç)
curl -X POST http://<sunucu>/api/collect/batch -H "X-API-Key: <a>" \
-H 'Content-Type: application/json' \
-d '{"jobs":[{"plugin_id":"rss","config":{...}},{"plugin_id":"dns-whois","config":{"domain":"example.com"}}]}'
# → {"jobs":[{"plugin_id":"rss","ok":true,"items":3,"error":null},...],"ok":1,"total":2}curl -X POST http://<sunucu>/api/search -H "X-API-Key: <a>" \
-H 'Content-Type: application/json' -d '{"query":"saldırı","limit":20}'
# → [{"id":"...","title":"...","url":"...","cleaned_content":"...","collected_at":"..."}]
curl -X POST http://<sunucu>/api/search/entity -H "X-API-Key: <a>" \
-H 'Content-Type: application/json' -d '{"entity_type":"email","value":"a@b.co","limit":20}'Varlık türleri: person, org, location, ip, domain, email, phone, crypto_address, hash, username, cve, custom.
# Liste (filtre + sayfalama)
curl -H "X-API-Key: <a>" "http://<sunucu>/api/sources?enabled=true&limit=50"
# Oluştur — plugin'e özel ayarlar config'e (/plugins şemalarına bakın)
curl -X POST http://<sunucu>/api/sources -H "X-API-Key: <a>" \
-H 'Content-Type: application/json' \
-d '{"name":"Örnek RSS","plugin_id":"rss","network_type":"rss",
"url":"https://example.com/rss","schedule":"*/15 * * * *",
"config":{"feed_url":"https://example.com/rss","max_items":50}}'
# → {"id":"..."}
# Tek seferlik çalıştır (source_id işlenir → sources/source_metrics'e sağlık düşer)
curl -X POST http://<sunucu>/api/sources/<id>/collect -H "X-API-Key: <a>"
# Sil
curl -X DELETE http://<sunucu>/api/sources/<id> -H "X-API-Key: <a>"Kaynak satırları sağlık taşır: last_crawled_at, last_success_at, failure_count, avg_response_ms.
curl -H "X-API-Key: <a>" "http://<sunucu>/api/items/recent?limit=20&offset=0"
curl -H "X-API-Key: <a>" http://<sunucu>/api/items/<id> # + gömülü entities[]
curl -H "X-API-Key: <a>" "http://<sunucu>/api/entities/top?entity_type=domain&limit=20"
# → [{"type":"domain","value":"example.com","mentions":12,"last_seen":"..."}]curl -H "X-API-Key: <a>" http://<sunucu>/api/graph
# {"nodes":[{"id":"..."}],"edges":[{"source":"...","target":"...","relation_type":"..."}]}
curl -X POST http://<sunucu>/api/graph/relation -H "X-API-Key: <a>" \
-H 'Content-Type: application/json' \
-d '{"source":"example.com","target":"1.2.3.4","relation_type":"resolves"}'
# graph_edges'e yazılır (yeniden başlatmada korunur)curl -X POST http://<sunucu>/api/saved-queries -H "X-API-Key: <a>" \
-H 'Content-Type: application/json' \
-d '{"name":"Kritik","query_text":"saldırı","query_type":"fts","alert_enabled":true}'
# query_type ∈ fts|semantic|regex|entity|graph
# Metni kurallara karşı kuru-sıkı dene (kayıt oluşmaz)
curl -X POST http://<sunucu>/api/alerts/test -H "X-API-Key: <a>" \
-H 'Content-Type: application/json' -d '{"text":"büyük saldırı oldu"}'
# → [{"query_id":"...","query_name":"Kritik","item_id":null,"matched":"saldırı"}]curl -X POST http://<sunucu>/api/reports/markdown -H "X-API-Key: <a>" \
-H 'Content-Type: application/json' \
-d '{"title":"R","scope":"S","summary":"O",
"findings":[{"title":"B","description":"D"}],"sources":["k"]}'
# → {"markdown":"# R\n..."}curl -H "X-API-Key: <a>" http://<sunucu>/api/stats
# {"sources":4,"sources_enabled":4,"items":128,"entities":342,"edges":57,
# "saved_queries":3,"alerts":2,"latest_item_at":"..."}| Kod | Anlam |
|---|---|
| 400 | Hatalı değer (query_type, entity_type, rol, ağ) |
| 401 | Eksik/geçersiz kimlik |
| 403 | Kimlik geçerli, rol yetersiz |
| 404 | Bilinmeyen plugin/kaynak/öğe/anahtar veya bozuk UUID |
| 413 | Config nesnesi çok büyük |
| 422 | Şema ihlali (ayrıntı detail dizisinde) |
| 500 | Sunucu/DB hatası (iç detay sızmaz) |
| 502 | Plugin çalıştı ama başarısız oldu (detail plugin mesajını taşır) |
Nginx'te zorunlu: /api/* üzerinde 10 istek/sn (taşma 20). Anahtar başına kota henüz yok — büyük toplu işlerde /collect/batch (≤10) kullanın ve istemcide tempo koyun.
- 0.2.0 — listelerde sayfalama + filtreler;
GET /items/{id}(+varlıklar),GET /entities/top,POST /collect/batch; UUID-güvenli id yolları; OpenAPI etiket/özetleri;qfiltresinde LIKE-joker kaçışı. - 0.1.x — sources CRUD + çalıştırma tetikleme, saved-queries CRUD,
/alerts/test,/reports/markdown,/stats,/items/recent, JWT + RBAC,/auth/keys.