TI Lookup

Sentivex CTI API

GET/api/ti/daily-analysis

일일 위협분석 조회 (최근 N일)

하루 단위 분석 스냅샷(ioclog.ti_daily_analysis). analysis_date DESC 로 최근 N일 반환. 오늘은 갱신 가능, 과거는 불변. ti:read.

Query parameters

daysinteger

반환할 최대 일수(1~365)

Responses

200 OK — { rows: [{analysis_date, collected, env_matched, indicators, updated_at}] }401 인증 실패
cURL
curl -X GET https://scti.in-bridge.com/api/ti/daily-analysis?days=0 \
  -H "Authorization: Bearer $TOKEN"
JavaScript
const res = await fetch("https://scti.in-bridge.com/api/ti/daily-analysis", {
  method: "GET",
  headers: {
    "Authorization": `Bearer ${token}`
  }
});
const data = await res.json();
POST/api/ti/daily-analysis

오늘 분석 upsert (ti:write)

본문 { collected, env_matched, indicators } 를 오늘(CURRENT_DATE) 행에만 upsert한다. 서버가 analysis_date=CURRENT_DATE 로 고정 → 과거 날짜는 쓸 수 없다(과거 불변).

Request body

collectedinteger

그날 신규 수집 IOC 수(ti_ioc.first_seen 기준 실측).

env_matchedinteger

env>0 인 지표 수.

indicatorsobject[]

지표별 상관 매치 요약.

valuestring
typestring
labelstring
tiinteger
osinteger
ocsfinteger
osainteger
envinteger

Responses

200 OK — { success, row }401 ti:write 필요
cURL
curl -X POST https://scti.in-bridge.com/api/ti/daily-analysis \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"collected":0,"env_matched":0,"indicators":[{"value":"string","type":"string","label":"string","ti":0,"os":0,"ocsf":0,"osa":0,"env":0}]}'
JavaScript
const res = await fetch("https://scti.in-bridge.com/api/ti/daily-analysis", {
  method: "POST",
  headers: {
    "Authorization": `Bearer ${token}`,
    "Content-Type": "application/json"
  },
  body: JSON.stringify({
    "collected": 0,
    "env_matched": 0,
    "indicators": [
      {
        "value": "string",
        "type": "string",
        "label": "string",
        "ti": 0,
        "os": 0,
        "ocsf": 0,
        "osa": 0,
        "env": 0
      }
    ]
  })
});
const data = await res.json();
POST/api/ti/lookup

통합 IOC 조회

1~100개의 indicator 를 자동 분류 후 로컬 DB/캐시에서 조회. 미탐 indicator 는 외부 enrichment 큐로 적재.

Request body

indicatorsstring[]required

Responses

200 OK401 인증 실패429 레이트리밋 초과
successboolean
resultsLookupResult[]
indicatorstring
detected_typeenum
md5sha1sha256ipv4ipv6domainurlcvemitreaptunknown
normalized_valuestring
verdictenum
benignmaliciousinfosuspicious_rareunknownunsupported
sourcesLookupSource[]
dbstring

소스 DB/테이블

matchedboolean
confidencestring
detailsobject

소스별 상세(예: cve_epss → {epss, percentile, score_date}, cve_exploit → {exploit_sources, total_refs})

statsobject
performanceobject
cURL
curl -X POST https://scti.in-bridge.com/api/ti/lookup \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"indicators":["string"]}'
JavaScript
const res = await fetch("https://scti.in-bridge.com/api/ti/lookup", {
  method: "POST",
  headers: {
    "Authorization": `Bearer ${token}`,
    "Content-Type": "application/json"
  },
  body: JSON.stringify({
    "indicators": [
      "string"
    ]
  })
});
const data = await res.json();
Response 200
{
  "success": true,
  "results": [
    {
      "indicator": "string",
      "detected_type": "md5",
      "normalized_value": "string",
      "verdict": "benign",
      "sources": [
        {
          "db": "string",
          "matched": true,
          "confidence": "string",
          "details": null
        }
      ]
    }
  ],
  "stats": null,
  "performance": null
}
POST/api/ti/stats

Top-N 집계

MITRE technique/tactic 빈도 + APT 출신국가(etda_apt_groups) 분포 Top-N.

Request body

dimensionenumrequired
mitre_techniquemitre_tacticapt
limitinteger

Responses

200 OK401 인증 실패
cURL
curl -X POST https://scti.in-bridge.com/api/ti/stats \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"dimension":"mitre_technique","limit":0}'
JavaScript
const res = await fetch("https://scti.in-bridge.com/api/ti/stats", {
  method: "POST",
  headers: {
    "Authorization": `Bearer ${token}`,
    "Content-Type": "application/json"
  },
  body: JSON.stringify({
    "dimension": "mitre_technique",
    "limit": 0
  })
});
const data = await res.json();
GET/api/ti/watchlist

워치리스트 목록/패싯 (관심 IOC)

관심 IOC 큐레이트(ioclog.watchlist). 그리드 호환 + ?facet=ioc_type|enabled|created_by. ti:read.

Query parameters

facetstring
pageinteger
limitinteger
searchstring
typestring

ioc_type 필터(ipv4/domain/sha256/cve/apt 등)

enabledboolean
sortBystring
sortDirenum
ascdesc

Responses

200 OK401 인증 실패
cURL
curl -X GET https://scti.in-bridge.com/api/ti/watchlist?facet=string&page=0&limit=0 \
  -H "Authorization: Bearer $TOKEN"
JavaScript
const res = await fetch("https://scti.in-bridge.com/api/ti/watchlist", {
  method: "GET",
  headers: {
    "Authorization": `Bearer ${token}`
  }
});
const data = await res.json();
POST/api/ti/watchlist

관심 IOC 등록 (ti:write)

indicator 는 classifyIoc 로 타입판별·정규화·멱등 upsert.

Request body

indicatorsstring | object[]required

문자열(인디케이터) 또는 객체. classifyIoc 로 타입판별·정규화 후 멱등 upsert.

Responses

200 OK400 indicators 1~1000개 필요401 ti:write 필요
cURL
curl -X POST https://scti.in-bridge.com/api/ti/watchlist \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"indicators":["string"]}'
JavaScript
const res = await fetch("https://scti.in-bridge.com/api/ti/watchlist", {
  method: "POST",
  headers: {
    "Authorization": `Bearer ${token}`,
    "Content-Type": "application/json"
  },
  body: JSON.stringify({
    "indicators": [
      "string"
    ]
  })
});
const data = await res.json();
DELETE/api/ti/watchlist

관심 IOC 삭제 (ti:write)

Request body

indicatorsstring[]required

Responses

200 OK401 ti:write 필요
cURL
curl -X DELETE https://scti.in-bridge.com/api/ti/watchlist \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"indicators":["string"]}'
JavaScript
const res = await fetch("https://scti.in-bridge.com/api/ti/watchlist", {
  method: "DELETE",
  headers: {
    "Authorization": `Bearer ${token}`,
    "Content-Type": "application/json"
  },
  body: JSON.stringify({
    "indicators": [
      "string"
    ]
  })
});
const data = await res.json();
GET/api/ti/graph

상관그래프 (seed 1-hop)

seed(IOC/CVE/MITRE/APT) 중심 + 실 lookup 매치 소스 1-hop 노드/엣지. 가짜 엣지 없음. confidence 등 내부신호 비노출(점수 미표시).

Query parameters

seedstringrequired

Responses

200 OK — {seed,detected_type,verdict,nodes[],edges[],meta}400 seed 누락 또는 타입 분류 불가401 인증 실패
cURL
curl -X GET https://scti.in-bridge.com/api/ti/graph?seed=string \
  -H "Authorization: Bearer $TOKEN"
JavaScript
const res = await fetch("https://scti.in-bridge.com/api/ti/graph", {
  method: "GET",
  headers: {
    "Authorization": `Bearer ${token}`
  }
});
const data = await res.json();
GET/api/ti/news

보안/TI/AI 뉴스 피드 (Sentivex /news 5종)

ioclog.ti_news(RSS/Atom 수집) 를 카테고리별로 서빙. category=security|ti|ai|llm|secai (없으면 all). ai/llm/secai 는 원천 피드 추가 전까지 빈 배열.

Query parameters

categoryenum
securitytiaillmsecai
limitinteger
offsetinteger
langenum
koen

Responses

200 OK — {category,total,items[{title,link,source,lang,published,summary,category}]}400 지원하지 않는 category401 인증 실패
cURL
curl -X GET https://scti.in-bridge.com/api/ti/news?category=security&limit=0&offset=0 \
  -H "Authorization: Bearer $TOKEN"
JavaScript
const res = await fetch("https://scti.in-bridge.com/api/ti/news", {
  method: "GET",
  headers: {
    "Authorization": `Bearer ${token}`
  }
});
const data = await res.json();
GET/api/ti/ransomware

최근 랜섬웨어 피해자 (다크웹 유출사이트 파생)

ransomware.live(무료 다크웹 랜섬웨어 트래커)를 대신 소비해 적재한 ioclog.ransomware_victims. Tor 미접촉=안전. 점수 비노출.

Query parameters

limitinteger
offsetinteger
groupstring
countrystring
daysinteger

Responses

200 OK — {total, items[{victim,group,country,activity,domain,attackDate,discovered,claimUrl,screenshot}], groups[{group,count}]}401 인증 실패
cURL
curl -X GET https://scti.in-bridge.com/api/ti/ransomware?limit=0&offset=0&group=string \
  -H "Authorization: Bearer $TOKEN"
JavaScript
const res = await fetch("https://scti.in-bridge.com/api/ti/ransomware", {
  method: "GET",
  headers: {
    "Authorization": `Bearer ${token}`
  }
});
const data = await res.json();
GET/api/ioc-investigation

IOC 조사 API 설명

IOC investigation API의 지원 타입, 인증 방식, POST request 예시를 반환하는 public-read 문서/헬스 엔드포인트.

Responses

200 OK
object
cURL
curl -X GET https://scti.in-bridge.com/api/ioc-investigation
JavaScript
const res = await fetch("https://scti.in-bridge.com/api/ioc-investigation", {
  method: "GET"
});
const data = await res.json();
Response 200
{}
POST/api/ioc-investigation

IOC 조사

IOC 심층 조사(외부 소스 연계).

Request body

indicatorstring

Responses

200 OK401 인증 실패
cURL
curl -X POST https://scti.in-bridge.com/api/ioc-investigation \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"indicator":"string"}'
JavaScript
const res = await fetch("https://scti.in-bridge.com/api/ioc-investigation", {
  method: "POST",
  headers: {
    "Authorization": `Bearer ${token}`,
    "Content-Type": "application/json"
  },
  body: JSON.stringify({
    "indicator": "string"
  })
});
const data = await res.json();
GET/api/ti/correlate

상관관계 job 상태 조회

id로 저장된 상관관계 job/step timeline을 조회한다. value만 전달하면 최근 job을 반환하거나 새 job을 큐에 등록한다. 즉석 mock 결과를 만들지 않는다. 인증 필요(Bearer 또는 로그인 세션) + OIDC 스코프 ti:read.

Query parameters

idstring<uuid>

상관관계 job id

valuestring

조회 대상 IOC/CVE/hash/incident id

Responses

200 Correlation job with steps400 id or value required404 job not found
idstring<uuid>
valuestring
typestring
statusenum
queuedrunningdonefailed
verdictenum
pendingmatchedno_matchunknown
resultobject
errorstring
stepsCorrelationStep[]
orderinteger
keystring
statusenum
queuedrunningdonefailed
messagestring
evidenceobject
createdAtstring<date-time>
cURL
curl -X GET https://scti.in-bridge.com/api/ti/correlate?id=00000000-0000-0000-0000-000000000000&value=string
JavaScript
const res = await fetch("https://scti.in-bridge.com/api/ti/correlate", {
  method: "GET"
});
const data = await res.json();
Response 200
{
  "id": "00000000-0000-0000-0000-000000000000",
  "value": "string",
  "type": "string",
  "status": "queued",
  "verdict": "pending",
  "result": null,
  "error": "string",
  "steps": [
    {
      "order": 0,
      "key": "string",
      "status": "queued",
      "message": "string",
      "evidence": null,
      "createdAt": "2026-07-08T00:00:00Z"
    }
  ]
}
POST/api/ti/correlate

상관관계 job 등록

value를 ioclog.ti_correlation_job 큐에 등록한다. ti-correlation-worker가 OpenSearch incidents/alerts와 PostgreSQL TI 테이블을 실제 조회하고 step을 저장한다. 인증 필요(Bearer 또는 로그인 세션) + OIDC 스코프 ti:read.

Request body

valuestringrequired

Responses

202 Queued or existing recent job400 value required
idstring<uuid>
valuestring
typestring
statusenum
queuedrunningdonefailed
verdictenum
pendingmatchedno_matchunknown
resultobject
errorstring
stepsCorrelationStep[]
orderinteger
keystring
statusenum
queuedrunningdonefailed
messagestring
evidenceobject
createdAtstring<date-time>
cURL
curl -X POST https://scti.in-bridge.com/api/ti/correlate \
  -H "Content-Type: application/json" \
  -d '{"value":"string"}'
JavaScript
const res = await fetch("https://scti.in-bridge.com/api/ti/correlate", {
  method: "POST",
  headers: {
    "Content-Type": "application/json"
  },
  body: JSON.stringify({
    "value": "string"
  })
});
const data = await res.json();
Response 202
{
  "id": "00000000-0000-0000-0000-000000000000",
  "value": "string",
  "type": "string",
  "status": "queued",
  "verdict": "pending",
  "result": null,
  "error": "string",
  "steps": [
    {
      "order": 0,
      "key": "string",
      "status": "queued",
      "message": "string",
      "evidence": null,
      "createdAt": "2026-07-08T00:00:00Z"
    }
  ]
}
GET/api/ti/sightings

IOC별 역추적 관측 이력 (Sightings, #83)

correlate(W3)가 우리 환경(OCSF finding·SA detector·activity)에서 잡은 hit 을 영속한 관측 이력. IOC를 언제·어디서(호스트) 봤나 — 소스·호스트별 집계 + 시계열 타임라인. 점수/등급 비노출. ti:read.

Query parameters

valuestringrequired

조회할 indicator(IP/도메인/해시/CVE 등)

limitinteger

타임라인 최대 행(1..500)

Responses

200 summary[](source·host·ip·observations·first_seen·last_seen) + timeline[](finding_uid·axis·observed_at·evidence)400 value 누락401 인증 실패
cURL
curl -X GET https://scti.in-bridge.com/api/ti/sightings?value=string&limit=0 \
  -H "Authorization: Bearer $TOKEN"
JavaScript
const res = await fetch("https://scti.in-bridge.com/api/ti/sightings", {
  method: "GET",
  headers: {
    "Authorization": `Bearer ${token}`
  }
});
const data = await res.json();