POST/api/external/ingest/sxe
SXE SOC analyzer 인시던트 수신 (staging).
POST /api/external/ingest/sxe — SXE SOC analyzer 인시던트 수신 (staging).
인증: Authorization: Bearer ${SXE_INGEST_SECRET}. (proxy.ts 쿠키 게이트 제외 — /api/external/)
미설정 시 비활성. 테넌트별 API key 는 후속 하드닝.
멱등: external_ref 기준 upsert. G4: 미완(running/stalled) 분석도 수신(silent drop 금지).
docs/integrations/08·09.
Responses
200 성공401 미인증(JWT 쿠키 필요)403 권한 없음404 없음
cURLcurl -X POST https://sit.in-bridge.com/api/external/ingest/sxe \
-H "Authorization: Bearer $TOKEN"
JavaScriptconst res = await fetch("https://sit.in-bridge.com/api/external/ingest/sxe", {
method: "POST",
headers: {
"Authorization": `Bearer ${token}`
}
});
const data = await res.json();
GET/api/external/sxe/ingest-status
status?analysisId=123
GET /api/external/sxe/ingest-status?analysisId=123
SXE 측 라이브 E2E가 analysis_id 단위로 index-pm 도착 여부를 확인하는 읽기 전용 훅.
인증은 SXE 인입 API와 동일한 Bearer secret을 사용한다.
@author jijuta ([email protected])
@since 2026-06-12
Responses
200 성공401 미인증(JWT 쿠키 필요)403 권한 없음404 없음
cURLcurl -X GET https://sit.in-bridge.com/api/external/sxe/ingest-status \
-H "Authorization: Bearer $TOKEN"
JavaScriptconst res = await fetch("https://sit.in-bridge.com/api/external/sxe/ingest-status", {
method: "GET",
headers: {
"Authorization": `Bearer ${token}`
}
});
const data = await res.json();
POST/api/external/sxe/pipeline-event
랭그래프 워커 노드 진행을 SSE 로 실시간 fan-out (관측성 #208).
POST /api/external/sxe/pipeline-event — 랭그래프 워커 노드 진행을 SSE 로 실시간 fan-out (관측성 #208).
목적(왜): 워커(Python)는 Redis 발행이 없어 노드 진행(classify→retrieve→propose→…)이 실시간으로
안 보였다("분석하는게 실시간 업데이트 안됨" — 사용자 지적). 워커의 record_trace 가 각 노드마다 이
엔드포인트로 이벤트를 쏘면, sit 이 프로젝트 채널(인시던트 상세뷰) + 수신자 /me 채널(라이브 모니터)로
`pipeline.node` 이벤트를 발행해 실시간 반영한다.
인증: Authorization: Bearer ${SXE_INGEST_SECRET} (다른 external/* 와 동일). best-effort — 워커는
실패해도 처리를 계속한다(관측용). 프로젝트 미존재 시 200(구독기/워커 재시도 방지).
Request body
incidentKeystringrequired
projectIdstring<uuid>required
Responses
200 성공400 입력 검증 실패(zod)401 미인증(JWT 쿠키 필요)403 권한 없음404 없음
cURLcurl -X POST https://sit.in-bridge.com/api/external/sxe/pipeline-event \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"incidentKey":"string","projectId":"00000000-0000-0000-0000-000000000000","node":"string","seq":0,"status":"string","summary":"string"}'
JavaScriptconst res = await fetch("https://sit.in-bridge.com/api/external/sxe/pipeline-event", {
method: "POST",
headers: {
"Authorization": `Bearer ${token}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"incidentKey": "string",
"projectId": "00000000-0000-0000-0000-000000000000",
"node": "string",
"seq": 0,
"status": "string",
"summary": "string"
})
});
const data = await res.json();
POST/api/external/sxe/progress
SXE 분석 라이프사이클 진행 신호(시작/완료) 수신.
POST /api/external/sxe/progress — SXE 분석 라이프사이클 진행 신호(시작/완료) 수신.
ingest(/api/external/ingest/sxe)가 "티켓 발행"(영속 알림)을 담당한다면, 이 엔드포인트는
그 전후의 일시적 진행 토스트를 담당한다:
- stage="started" → "🔍 분석 시작" 토스트
- stage="completed" → "✅ 분석 완료 · verdict/severity" 토스트 (benign 이라 티켓이
안 나오는 분석도 완료 사실은 알린다 — 사용자 요청)
DB 알림 행을 만들지 않는다(분석마다 inbox 도배 방지). publishUserEvent 로 해당 프로젝트
멤버 중 notify_incidents=true 인 사용자에게 type:"analysis.progress" 이벤트만 fan-out
→ 사이드바가 토스트로 표시.
인증: Authorization: Bearer ${SXE_INGEST_SECRET} (ingest 와 동일). proxy.ts 쿠키 게이트 제외.
Request body
projectIdstring<uuid>required
stageenumrequired
startedcompleted
Responses
200 성공400 입력 검증 실패(zod)401 미인증(JWT 쿠키 필요)403 권한 없음404 없음
cURLcurl -X POST https://sit.in-bridge.com/api/external/sxe/progress \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"projectId":"00000000-0000-0000-0000-000000000000","stage":"started","uid":"string","verdict":"string","severity":"string","analysisId":"string"}'
JavaScriptconst res = await fetch("https://sit.in-bridge.com/api/external/sxe/progress", {
method: "POST",
headers: {
"Authorization": `Bearer ${token}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"projectId": "00000000-0000-0000-0000-000000000000",
"stage": "started",
"uid": "string",
"verdict": "string",
"severity": "string",
"analysisId": "string"
})
});
const data = await res.json();
POST/api/external/sxe/resolve-project
SXE 분석 source/vendor 를 수신 프로젝트로 해석.
POST /api/external/sxe/resolve-project — SXE 분석 source/vendor 를 수신 프로젝트로 해석.
구독기(`scripts/sxe-ws-subscribe.mjs`)가 SXE source/vendor/tenantRef 를 보내면
`incident_subscriptions` 기준으로 projectId 를 반환한다(#155). SXE 소스는 수정하지 않고,
index-pm 이 PULL 구독 중에 자기 DB 구독 모델을 조회한다.
인증: Authorization: Bearer ${SXE_INGEST_SECRET}
@author jijuta ([email protected])
@since 2026-06-12
@updated 2026-06-12 — #155 external resolve API 신설
Request body
fallbackProjectIdstring<uuid>
Responses
200 성공400 입력 검증 실패(zod)401 미인증(JWT 쿠키 필요)403 권한 없음404 없음
cURLcurl -X POST https://sit.in-bridge.com/api/external/sxe/resolve-project \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"source":"string","vendor":"string","tenantRef":"string","fallbackProjectId":"00000000-0000-0000-0000-000000000000"}'
JavaScriptconst res = await fetch("https://sit.in-bridge.com/api/external/sxe/resolve-project", {
method: "POST",
headers: {
"Authorization": `Bearer ${token}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"source": "string",
"vendor": "string",
"tenantRef": "string",
"fallbackProjectId": "00000000-0000-0000-0000-000000000000"
})
});
const data = await res.json();