SOS(긴급 구조 지원 서비스) 서비스 API 개발자 가이드
서비스 개요
SOS 서비스는 고장 지원 서비스(bCall, Breakdown Call)입니다. 사고는 아니지만 차량 운행이 불가능하거나 운전자 지원이 필요한 경우, 차량의 고장 정보를 콜센터로 전송하고 상담을 연결하는 텔레매틱스 서비스입니다.
서비스 특징
- 차량 고장에 대한 원격 진단 지원
- 수동 요청 기반의 긴급 지원 제공
- 차량 상태 정보의 자동 전송
- 음성 상담 연결
- 적절한 서비스 조율 (견인, 정비 등)
법적 요구사항
- eCall과 달리 법적 설치 의무는 없음
- 개인정보 보호법 준수
- 차량 고장 정보 수집에 대한 동의 필수
- 서비스 계약 조건 및 규정 준수
주요 시나리오
시나리오 1: SOS 활성화 및 초기 데이터 전송
엔티티별 API 흐름:
📱 앱 (사용자):
- SOS 요청: 앱 내 SOS 버튼을 눌러 도움 요청
- 모니터링: SSE를 통해 SOS 진행 상태 수신
- 긴급 통화: 콜센터와 즉각적인 음성 통화 연결
🚗 차량 (TCU):
- 이벤트 수신: 앱 또는 차량의 SOS 버튼 신호 수신
- 데이터 전송: 서버로 SOS 통보 데이터 전송
🏢 콜센터:
- 이벤트 모니터링: 실시간 SOS 요청 모니터링
- 사건 생성: 새로운 SOS 발생 시 자동으로 레코드 생성
- 긴급 연락: 차량과 즉각적인 음성 통화 연결
시나리오 2: 음성 통화 종료 및 정보 업데이트
엔티티별 API 흐름:
🚗 차량 (TCU):
- 통화 모니터링: 콜센터와의 음성 통화 종료 감지
- 데이터 업데이트: 상태 정보(배터리, 통화 시간 등)를 서버로 전송
🏢 콜센터:
- 상담: 음성 통화 완료 및 상담 상세 내용 기록
- 상태 업데이트: SSE를 통해 업데이트 알림 수신
📱 앱 (사용자):
- 상태 모니터링: SSE를 통해 차량 상태 업데이트 수신
- 배터리 확인: 현재 배터리 잔량 확인
- 후속 조치: 다음 단계 안내 및 상담 요약 수신
시나리오 3: 상담 완료 및 결과 처리
엔티티별 API 흐름:
🏢 콜센터:
- 사건 종료: 조사 및 처리 완료 후 사건 종료
- 상태 업데이트: SOS 기록 상태를 "CLOSED"로 업데이트
📱 앱 (사용자):
- 결과 확인: 최종 처리 결과 확인
- 이력 조회: 완료된 SOS 이력 확인
시나리오 4: SOS 관리 및 시스템 운영
엔티티별 API 흐름:
🏢 콜센터:
- 시스템 헬스: SOS 시스템 헬스 모니터링
- 실적 조회: 상담원 처리 실적 감사
- 서비스 통계: 전반적인 서비스량 분석
📱 앱 (사용자):
- 상태 감사: SOS 서비스 가용성 확인
- 이력 감사: 과거 SOS 서비스 상호작용 검토
주요 기능
📱 앱 구현 기능
1. SOS 요청 및 모니터링
- 실시간 모니터링: SSE를 통해 SOS 진행 상태 수신
- 결과 확인: 최종 처리 결과 확인
- 이력 조회: 과거 SOS 서비스 이력 조회
- 시스템 헬스: 전반적인 SOS 시스템 상태 모니터링
🏢 콜센터 구현 기능
1. SOS 사건 관리
- 사건 모니터링: 실시간 SOS 요청 모니터링
- 상태 조회: 특정 사건 상태 조회
- 사건 종료: 처리 완료 후 사건 종료
- 이력 관리: 과거 SOS 이력 조회
2. 시스템 및 실적 분석
- 서비스 통계: 전반적인 SOS 서비스 통계 관리
- 상담원 실적: 상담원 처리 실적 분석
- 시스템 헬스: 전반적인 SOS 시스템 헬스 모니터링
- 시스템 테스트: 정기적인 시스템 기능 테스트
시퀀스 다이어그램
SOS (실시간 이벤트) 시스템 흐름

API 엔드포인트
헤더, 응답 코드 및 에러 형식은 공통 API 사양을 참조하십시오.
SOS 통계 조회
bash
curl -X GET "https://api.ecarus.run/api/v1/safety/sos/stats" \
-H "Authorization: Bearer sk_4f9c7b8e2d1a6c0f3e7a9b5d8c1e4f2a7c6d9e0b3f5a8c1d4e7f9b2c6a1e3d"SOS 시스템 테스트
bash
curl -X POST "https://api.ecarus.run/api/v1/safety/sos/system/test" \
-H "Authorization: Bearer sk_4f9c7b8e2d1a6c0f3e7a9b5d8c1e4f2a7c6d9e0b3f5a8c1d4e7f9b2c6a1e3d" \
-H "Content-Type: application/json" \
-d '{
"testType": "FULL_SYSTEM",
"testVehicle": { "vin": "KMHSH81C7LU123456" },
"testScenarios": ["VOICE_CONNECT", "DATA_TRANSFER"]
}'SOS 사건 종료
bash
curl -X POST "https://api.ecarus.run/api/v1/safety/vehicles/KMHSH81C7LU123456/sos/close" \
-H "Authorization: Bearer sk_4f9c7b8e2d1a6c0f3e7a9b5d8c1e4f2a7c6d9e0b3f5a8c1d4e7f9b2c6a1e3d" \
-H "Content-Type: application/json" \
-d '{
"cid": "SOS_20260307_001",
"result": "Police Dispatched",
"completionTime": "2026-03-07T19:00:00Z",
"agentId": "AGENT_001",
"notes": "경찰이 출동했습니다. 고객은 안전합니다.",
"emergencyServices": {
"police": {
"dispatched": true,
"reportNumber": "20260307-001234",
"officerName": "김순경",
"arrivalTime": "2026-03-07T18:50:00Z"
}
},
"customerStatus": {
"safe": true,
"injuries": false,
"medicalAttention": false
},
"followUpRequired": false
}'SOS 사건 상태 조회
bash
curl -X GET "https://api.ecarus.run/api/v1/safety/vehicles/KMHSH81C7LU123456/sos/status?cid=SOS_20260307_001" \
-H "Authorization: Bearer sk_4f9c7b8e2d1a6c0f3e7a9b5d8c1e4f2a7c6d9e0b3f5a8c1d4e7f9b2c6a1e3d"SOS 사건 이력 조회
bash
curl -X GET "https://api.ecarus.run/api/v1/safety/vehicles/KMHSH81C7LU123456/sos/history" \
-H "Authorization: Bearer sk_4f9c7b8e2d1a6c0f3e7a9b5d8c1e4f2a7c6d9e0b3f5a8c1d4e7f9b2c6a1e3d"상담원 SOS 처리 실적 조회
bash
curl -X GET "https://api.ecarus.run/api/v1/safety/sos/agents/AGENT_001/performance" \
-H "Authorization: Bearer sk_4f9c7b8e2d1a6c0f3e7a9b5d8c1e4f2a7c6d9e0b3f5a8c1d4e7f9b2c6a1e3d"상담원 할당 SOS 사건 조회
bash
curl -X GET "https://api.ecarus.run/api/v1/safety/sos/agents/AGENT_001/incidents" \
-H "Authorization: Bearer sk_4f9c7b8e2d1a6c0f3e7a9b5d8c1e4f2a7c6d9e0b3f5a8c1d4e7f9b2c6a1e3d"SOS 시스템 헬스 상태 조회
bash
curl -X GET "https://api.ecarus.run/api/v1/safety/sos/system/health" \
-H "Authorization: Bearer sk_4f9c7b8e2d1a6c0f3e7a9b5d8c1e4f2a7c6d9e0b3f5a8c1d4e7f9b2c6a1e3d"SOS 실시간 이벤트 수신 (SSE)
참고: 브라우저를 통해 접속하거나 전용 SSE 클라이언트 사용을 권장합니다.
bash
curl -N -H "Authorization: Bearer sk_4f9c7b8e2d1a6c0f3e7a9b5d8c1e4f2a7c6d9e0b3f5a8c1d4e7f9b2c6a1e3d" \
"https://api.ecarus.run/api/v1/safety/sos/events"데이터 모델
SOS 사건 요청 (Incident Request)
json
{
"cid": "SOS_20260307_001",
"vin": "KMHSH81C7LU123456",
"emergencyType": "MEDICAL",
"urgency": "HIGH",
"location": {
"latitude": 37.5665,
"longitude": 126.9780,
"address": "서울시 강남구 테헤란로",
"accuracy": 5.2
},
"description": "운전자 흉통 발생, 운전 불가 상태",
"contactNumber": "+82-10-1234-5678",
"passengerCount": 2,
"vehicleCondition": "PARKED",
"requestType": "MANUAL",
"customerConsent": {
"granted": true,
"timestamp": "2026-03-07T18:30:00Z",
"locationSharing": true,
"voiceRecording": true,
"emergencyServices": true
}
}SOS 사건 응답 (Incident Response)
json
{
"cid": "SOS_20260307_001",
"vin": "KMHSH81C7LU123456",
"status": "INITIATED",
"timestamp": "2026-03-07T18:30:00Z",
"emergencyType": "MEDICAL",
"urgency": "HIGH",
"location": {
"latitude": 37.5665,
"longitude": 126.9780,
"address": "서울시 강남구 테헤란로"
},
"contactCenter": {
"phone": "1588-1234",
"available": true,
"estimatedWaitTime": "30 seconds",
"agentId": "AGENT_001"
},
"voiceCall": {
"status": "CONNECTING",
"phoneNumber": "+8212345678",
"sessionId": "CALL-20260307-001"
},
"estimatedResponseTime": "2 minutes"
}SOS 종료 요청 (Closure Request)
json
{
"cid": "SOS_20260307_001",
"vin": "KMHSH81C7LU123456",
"result": "POLICE_DISPATCHED",
"completionTime": "2026-03-07T19:00:00Z",
"agentId": "AGENT_001",
"notes": "경찰이 출동했습니다. 고객은 안전합니다.",
"emergencyServices": {
"police": {
"dispatched": true,
"reportNumber": "20260307-001234",
"officerName": "김경찰",
"arrivalTime": "2026-03-07T18:50:00Z"
}
},
"customerStatus": {
"safe": true,
"injuries": false,
"medicalAttention": false
},
"followUpRequired": false
}SOS 종료 응답 (Closure Response)
json
{
"cid": "SOS_20260307_001",
"status": "CLOSED",
"timestamp": "2026-03-07T19:05:00Z",
"summary": {
"emergencyType": "MEDICAL",
"duration": "35 minutes",
"servicesDispatched": ["POLICE"],
"customerSafe": true,
"agent": "김상담"
}
}SOS 상태 응답 (Status Response)
json
{
"cid": "SOS_20260307_001",
"vin": "KMHSH81C7LU123456",
"status": "CONNECTED",
"timestamp": "2026-03-07T18:30:00Z",
"emergencyType": "MEDICAL",
"urgency": "HIGH",
"location": {
"latitude": 37.5665,
"longitude": 126.9780,
"address": "서울시 강남구 테헤란로",
"accuracy": 5.2,
"lastUpdate": "2026-03-07T18:30:00Z"
},
"description": "운전자 흉통 발생, 운전 불가 상태",
"contactNumber": "+82-10-1234-5678",
"vehicleStatus": {
"drivable": false,
"engineStatus": "OFF",
"batteryVoltage": 12.6,
"fuelLevel": 45.2,
"dtcCodes": [],
"transmissionStatus": "PARK"
},
"voiceCall": {
"sessionId": "CALL-20260307-001",
"status": "CONNECTED",
"startTime": "2026-03-07T18:31:00Z",
"duration": 180,
"agent": {
"agentId": "AGENT_001",
"name": "김상담",
"extension": "801"
},
"recording": {
"enabled": true,
"url": "https://api.daddyhouse.net/recordings/CALL-001",
"duration": 180
}
},
"dispatchInfo": {
"dispatched": true,
"serviceType": "POLICE",
"provider": "강남경찰서",
"estimatedArrival": "2026-03-07T18:45:00Z",
"status": "DISPATCHED",
"contactNumber": "112",
"unitNumber": "PATROL-001"
},
"timeline": [
{
"status": "INITIATED",
"timestamp": "2026-03-07T18:30:00Z",
"description": "긴급 통화 시작됨"
},
{
"status": "CONNECTED",
"timestamp": "2026-03-07T18:31:00Z",
"description": "긴급 상담원과 연결됨"
}
]
}SOS 이력 응답 (History Response)
json
{
"vin": "KMHSH81C7LU123456",
"incidents": [
{
"cid": "SOS_20260307_001",
"timestamp": "2026-03-07T18:30:00Z",
"emergencyType": "MEDICAL",
"status": "CLOSED",
"urgency": "HIGH",
"duration": 2100,
"location": {
"latitude": 37.5665,
"longitude": 126.9780,
"address": "서울시 강남구 테헤란로"
},
"servicesDispatched": ["POLICE"],
"customerSafe": true,
"agentId": "AGENT_001",
"completionTime": "2026-03-07T19:05:00Z",
"notes": "경찰이 출동했습니다. 고객은 안전합니다."
}
],
"total": 1,
"summary": {
"totalIncidents": 1,
"emergencyTypes": {
"MEDICAL": 1
},
"averageResponseTime": "2 minutes",
"customerSatisfaction": 5.0,
"lastIncidentDate": "2026-03-07T19:05:00Z"
}
}SOS 통계 응답 (Statistics Response)
json
{
"period": "30d",
"summary": {
"totalIncidents": 125,
"activeIncidents": 2,
"resolvedToday": 8,
"averageResponseTime": "1.5 minutes",
"resolutionRate": 98.4,
"customerSatisfaction": 4.8
},
"emergencyTypes": {
"MEDICAL": { "count": 45, "percentage": 36.0 },
"BREAKDOWN": { "count": 35, "percentage": 28.0 },
"ACCIDENT": { "count": 25, "percentage": 20.0 },
"SECURITY": { "count": 15, "percentage": 12.0 },
"OTHER": { "count": 5, "percentage": 4.0 }
},
"servicesDispatched": {
"POLICE": { "count": 40, "percentage": 32.0 },
"AMBULANCE": { "count": 35, "percentage": 28.0 },
"FIRE": { "count": 15, "percentage": 12.0 },
"TOWING": { "count": 35, "percentage": 28.0 }
},
"timeStats": {
"peakHours": ["18:00-22:00", "06:00-09:00"],
"peakDays": ["FRIDAY", "SATURDAY"],
"averageCallDuration": "12 minutes",
"longestCallDuration": "45 minutes"
},
"agentStats": {
"totalAgents": 15,
"activeAgents": 8,
"averageCallsPerAgent": 8.3,
"topAgent": {
"agentId": "AGENT_001",
"name": "김상담",
"handledIncidents": 15
}
},
"generatedAt": "2026-03-07T20:00:00Z"
}상담원 SOS 실적 응답 (Agent SOS Performance Response)
json
{
"agentId": "AGENT_001",
"agentName": "김상담",
"period": "30d",
"performance": {
"totalHandled": 45,
"averageHandlingTime": "12 minutes",
"resolutionRate": 97.8,
"customerSatisfaction": 4.9,
"responseRate": 99.5,
"firstCallResolution": 90.2
},
"emergencyBreakdown": {
"MEDICAL": { "count": 20, "avgTime": "15 min", "satisfaction": 4.9 },
"BREAKDOWN": { "count": 15, "avgTime": "10 min", "satisfaction": 4.8 },
"ACCIDENT": { "count": 10, "avgTime": "20 min", "satisfaction": 5.0 }
},
"timeAnalysis": {
"totalWorkHours": 180,
"averageCallsPerHour": 2.5,
"peakHours": ["18:00-22:00", "06:00-09:00"],
"averageCallDuration": "12 minutes"
},
"qualityMetrics": {
"complianceRate": 99.5,
"documentationAccuracy": 98.2,
"escalationRate": 2.2,
"customerComplaints": 0
},
"rankings": {
"teamRank": 1,
"teamSize": 15,
"percentile": 95
},
"lastActivity": "2026-03-07T19:05:00Z",
"generatedAt": "2026-03-07T20:00:00Z"
}상담원 할당 사건 응답 (Agent Active Incidents Response)
json
{
"agentId": "AGENT_001",
"activeIncidents": [
{
"cid": "SOS_20260307_002",
"vin": "KMHSH81C7LU123457",
"emergencyType": "BREAKDOWN",
"urgency": "MEDIUM",
"status": "CONNECTED",
"timestamp": "2026-03-07T19:30:00Z",
"location": {
"latitude": 37.4021,
"longitude": 127.1023,
"address": "서울시 송파구 올림픽로"
},
"customerName": "홍길동",
"contactNumber": "+82-10-1234-5678",
"callDuration": 600,
"voiceCall": {
"sessionId": "CALL-20260307-002",
"status": "CONNECTED",
"startTime": "2026-03-07T19:31:00Z"
}
}
],
"total": 1,
"summary": {
"highUrgency": 0,
"mediumUrgency": 1,
"lowUrgency": 0,
"averageHandlingTime": "10 minutes"
}
}SOS 시스템 헬스 상태 응답 (SOS System Health Status Response)
json
{
"status": "HEALTHY",
"timestamp": "2026-03-07T20:00:00Z",
"systems": {
"api": {
"status": "OPERATIONAL",
"responseTime": "120ms",
"uptime": "99.99%"
},
"database": {
"status": "OPERATIONAL",
"responseTime": "45ms",
"connections": 25
},
"voiceSystem": {
"status": "OPERATIONAL",
"activeCalls": 8,
"queueLength": 2,
"averageWaitTime": "30 seconds"
},
"dispatchSystem": {
"status": "OPERATIONAL",
"activeDispatches": 3,
"averageResponseTime": "2 minutes"
},
"notificationSystem": {
"status": "OPERATIONAL",
"deliveryRate": "99.8%",
"pendingNotifications": 0
}
},
"metrics": {
"totalIncidentsToday": 12,
"activeIncidents": 2,
"availableAgents": 7,
"systemLoad": "35%"
},
"alerts": [
{
"level": "INFO",
"message": "저녁 시간대 높은 통화량 예상됨",
"timestamp": "2026-03-07T17:00:00Z"
}
]
}SOS 테스트 요청 (Test Request)
json
{
"testType": "FULL_SYSTEM",
"testVehicle": {
"vin": "KMHSH81C7LU123456",
"model": "BMW 320i",
"year": 2022
},
"testScenarios": ["VOICE_CONNECT", "DATA_TRANSFER", "DISPATCH_SIMULATION"],
"testParameters": {
"timeout": 300,
"retryAttempts": 3,
"detailedLogging": true
}
}SOS 테스트 응답 (Test Response)
json
{
"testId": "TEST-20260307-001",
"testType": "FULL_SYSTEM",
"status": "COMPLETED",
"timestamp": "2026-03-07T20:00:00Z",
"duration": 180,
"results": {
"voiceConnect": {
"status": "PASSED",
"responseTime": "2.1 seconds",
"audioQuality": "EXCELLENT"
},
"dataTransfer": {
"status": "PASSED",
"responseTime": "150ms",
"dataIntegrity": "VERIFIED"
},
"dispatchSimulation": {
"status": "PASSED",
"responseTime": "1.8 seconds",
"notificationDelivered": true
}
},
"overall": {
"status": "PASSED",
"score": 98.5,
"recommendations": [
"시스템이 최적으로 작동 중입니다.",
"감지된 문제 없음"
]
}
}SOS 실시간 이벤트 (SSE)
json
{
"eventId": "EVT_001",
"type": "SOS_INITIATED",
"timestamp": "2026-03-07T18:30:00Z",
"priority": "HIGH",
"data": {
"cid": "SOS_20260307_001",
"vin": "KMHSH81C7LU123456",
"emergencyType": "MEDICAL",
"urgency": "HIGH",
"status": "INITIATED",
"location": {
"latitude": 37.5665,
"longitude": 126.9780,
"address": "서울시 강남구 테헤란로",
"accuracy": 5.2
},
"customerInfo": {
"name": "홍길동",
"phone": "+82-10-1234-5678",
"passengerCount": 2
},
"vehicleInfo": {
"make": "BMW",
"model": "320i",
"year": 2022,
"condition": "PARKED"
},
"description": "운전자 흉통 발생, 운전 불가 상태",
"agentId": "AGENT_001"
}
}보안 및 프라이버시
헤더, 응답 코드 및 에러 형식은 공통 API 사양을 참조하십시오.
인증 및 권한 부여
- 사용자 인증 토큰 필요 (JWT/OAuth2)
- 차량 접근 권한 확인
- 고장 지원 서비스 이용 권한 확인
데이터 보안
- 모든 API 통신은 HTTPS/TLS 암호화
- 차량 고장 정보 전송을 위한 추가 보안 조치 적용
- 통화 녹취 파일의 안전한 저장 및 관리
프라이버시 보호
- 차량 상태 정보 수집에 대한 명시적 동의
- 위치 정보 수집 목적 명시
- 통화 녹음에 대한 동의
- 서비스 이력 보존 기간 정책 준수
접근 제어
- VIN 기반 차량 접근 권한 확인
- 상담원 접근 권한 관리
- 서비스 업체 접근을 위한 별도 인증 절차 적용
예외 처리
네트워크 관련
- 연결 실패: 오프라인 모드 지원, 마지막 상태 캐싱
- 응답 지연: 로딩 인디케이터, 타임아웃 처리
- 서버 다운: 에러 메시지 표시, 재시도 제안
차량 상태 관련
- 차량 오프라인: 마지막 상태 정보 표시, 오프라인 상태 알림
- 데이터 오류: DTC 코드 파싱 오류 처리
- 센서 오류: 센서 상태 오류 표시, 수동 입력 안내
상담 관련
- 통화 연결 실패: 대체 통화 수단 시도
- 상담원 부족: 대기 안내 가이드 제공, 예약 상담 제안
- 통화 품질 저하: 음성 품질 저하 시 안내 메시지 발송
테스트 설정
Base URL: https://api.ecarus.run/api/v1/safety
인증 토큰: sk_4f9c7b8e2d1a6c0f3e7a9b5d8c1e4f2a7c6d9e0b3f5a8c1d4e7f9b2c6a1e3d
샘플 VIN: KMHSH81C7LU123456
대화형 API 테스트를 위해 Swagger UI를 사용하십시오.
배포 고려사항
- 앱 스토어 등록 시 긴급 알림 권한 및 위치 정보 수집 정책 명시
- 국가별 법규 규정 준수 여부 확인
- 구조 기관 및 외부 서비스 업체와의 시스템 통합 준비