{"id":49821017,"url":"https://github.com/bobhyun/ts-api","last_synced_at":"2026-05-13T11:01:29.704Z","repository":{"id":164264971,"uuid":"122433913","full_name":"bobhyun/TS-API","owner":"bobhyun","description":"TS-API Programmer's Guide","archived":false,"fork":false,"pushed_at":"2026-04-28T04:32:47.000Z","size":1632,"stargazers_count":0,"open_issues_count":0,"forks_count":2,"subscribers_count":1,"default_branch":"master","last_synced_at":"2026-04-28T06:28:26.367Z","etag":null,"topics":["cms","ivr","nvr","ts-api","ts-cms","ts-ivr","ts-nvr","tsapi","tscms","tsivr","tsnvr"],"latest_commit_sha":null,"homepage":"","language":"Swift","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/bobhyun.png","metadata":{"files":{"readme":"README.ko.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2018-02-22T05:15:05.000Z","updated_at":"2026-04-28T04:32:51.000Z","dependencies_parsed_at":"2024-06-18T09:43:07.837Z","dependency_job_id":null,"html_url":"https://github.com/bobhyun/TS-API","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/bobhyun/TS-API","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bobhyun%2FTS-API","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bobhyun%2FTS-API/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bobhyun%2FTS-API/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bobhyun%2FTS-API/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/bobhyun","download_url":"https://codeload.github.com/bobhyun/TS-API/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bobhyun%2FTS-API/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32979305,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-13T06:31:55.726Z","status":"ssl_error","status_checked_at":"2026-05-13T06:31:51.336Z","response_time":115,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cms","ivr","nvr","ts-api","ts-cms","ts-ivr","ts-nvr","tsapi","tscms","tsivr","tsnvr"],"created_at":"2026-05-13T11:01:28.779Z","updated_at":"2026-05-13T11:01:29.692Z","avatar_url":"https://github.com/bobhyun.png","language":"Swift","funding_links":[],"categories":[],"sub_categories":[],"readme":"# TS-API Reference\n\n[English](README.md) | **한국어**\n\n**TS-API**는 TS Solution Corp.의 영상 보안 제품군 — **TS-CMS**, **TS-NVR**, **TS-IVR** — 에 내장된 웹 API입니다.\n\n\u003e TS-API v1 웹서버는 TS-IVR, TS-NVR, TS-CMS v3.0.0 이후버전부터 적용되었습니다.\n\u003e RESTful API(`/api/v1`)는 JWT 및 API Key 인증을 지원하며, 경로 기반으로 설계되었습니다.\n\n## 목차\n\n1. [API 버전](#1-api-버전)\n2. [빠른 시작](#2-빠른-시작)\n3. [문서](#3-문서)\n4. [엔드포인트 요약](#4-엔드포인트-요약)\n5. [응답 형식](#5-응답-형식)\n6. [HTTP 상태 코드](#6-http-상태-코드)\n7. [라이선스 종속 기능](#7-라이선스-종속-기능)\n8. [WebSocket API](#8-websocket-api)\n\n---\n\n## 1. API 버전\n\n| 버전 | 스타일 | 기본 URL | 문서 |\n|---------|-------|----------|------|\n| [v1](v1/tsapi-v1.ko.md) | RESTful 경로 | `/api/v1`, `/wsapi/v1` | [API 가이드](v1/tsapi-v1.ko.md) · [예제](v1/examples/) |\n| [legacy](legacy/ko/TS-API.ko.md) | Query String | `/api` | [API 가이드](legacy/ko/TS-API.ko.md) · [예제](legacy/ko/examples/) |\n\n---\n\n## 2. 빠른 시작\n\n### 2.1. 로그인 (JWT)\n```bash\n# JWT 로그인 - accessToken 반환\n# 참고: auth = base64(\"admin:1234\"). 실제 NVR 계정 정보를 사용하세요.\ncurl -X POST \"http://localhost/api/v1/auth/login\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"auth\":\"YWRtaW46MTIzNA==\"}'\n# Response: {\"accessToken\":\"eyJ...\",\"refreshToken\":\"...\",\"expiresIn\":3600,\"tokenType\":\"Bearer\"}\n```\n\n### 2.2. 채널 조회\n```bash\ncurl \"http://localhost/api/v1/channel\" \\\n  -H \"Authorization: Bearer {accessToken}\"\n```\n\n### 2.3. PTZ 제어\n```bash\ncurl \"http://localhost/api/v1/channel/1/ptz?home\" \\\n  -H \"Authorization: Bearer {accessToken}\"\n```\n\n### 2.4. 대안: API Key (외부 연동용)\n```bash\n# API Key 생성 (관리자 전용 - JWT 인증 필요)\ncurl -X POST \"http://localhost/api/v1/auth/apikey\" \\\n  -H \"Authorization: Bearer {accessToken}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"name\":\"Monitoring System\"}'\n\n# API Key 사용 (모든 v1 엔드포인트 접근 가능, 로그인 불필요)\ncurl \"http://localhost/api/v1/channel\" \\\n  -H \"X-API-Key: tsapi_key_...\"\n```\n\n---\n\n## 3. 문서\n\n- [v1 API Guide](v1/tsapi-v1.ko.md) - RESTful 경로 기반 API\n- [v1 Examples](v1/examples/) - v1 API 예제 코드 (9개 언어)\n- [Legacy API Guide](legacy/ko/TS-API.ko.md) - 레거시 쿼리스트링 기반 API\n- [마이그레이션 가이드](v1/MIGRATION.ko.md) - 레거시에서 v1으로 전환\n\n---\n\n## 4. 엔드포인트 요약\n\n### 4.1. v1 REST API 엔드포인트\n\n#### 4.1.1. 인증\n| 엔드포인트 | 메서드 | 설명 |\n|----------|--------|-------------|\n| `/api/v1/auth/login` | POST | JWT 로그인 (username, password) |\n| `/api/v1/auth/refresh` | POST | Access Token 갱신 (refreshToken) |\n| `/api/v1/auth/logout` | POST | 로그아웃 (refreshToken 무효화) |\n| `/api/v1/auth/apikey` | POST | API Key 생성 (관리자 전용) |\n| `/api/v1/auth/apikey` | GET | API Key 목록 조회 |\n| `/api/v1/auth/apikey/{id}` | DELETE | API Key 삭제 |\n| `/api/v1/auth` | GET | 레거시 (차단됨: POST /api/v1/auth/login 사용) |\n\n#### 4.1.2. 서버 정보\n| 엔드포인트 | 메서드 | 설명 |\n|----------|--------|-------------|\n| `/api/v1/info` | GET | 서버 정보 (apiVersion, siteName, timezone, product, license) |\n\n#### 4.1.3. 시스템\n| 엔드포인트 | 메서드 | 설명 |\n|----------|--------|-------------|\n| `/api/v1/system/info` | GET | 시스템 정보 (OS, CPU, Storage, Network) |\n| `/api/v1/system/health` | GET | 시스템 상태 (CPU%, Memory, Disk 사용량) |\n| `/api/v1/system/hddsmart` | GET | HDD S.M.A.R.T 정보 |\n| `/api/v1/system/restart` | POST | 서버 재시작 |\n| `/api/v1/system/reboot` | POST | 시스템 재부팅 |\n\n#### 4.1.4. 채널\n| 엔드포인트 | 메서드 | 설명 |\n|----------|--------|-------------|\n| `/api/v1/channel` | GET | 채널(카메라) 목록 |\n| `/api/v1/channel` | POST | 채널 추가 |\n| `/api/v1/channel/{id}` | DELETE | 채널 삭제 |\n| `/api/v1/channel/status` | GET | 채널 연결/녹화 상태 |\n| `/api/v1/channel/info` | GET | 채널 상세 정보 |\n| `/api/v1/channel/{id}/ptz` | GET | PTZ 제어 (home, move, zoom, focus) |\n| `/api/v1/channel/{id}/preset` | GET/POST/PUT/DELETE | 프리셋 관리 |\n| `/api/v1/channel/{id}/relay` | GET/PUT | 릴레이 출력 제어 |\n| `/api/v1/channel/{id}/reboot` | POST | 카메라 원격 재부팅 |\n\n#### 4.1.5. 녹화\n| 엔드포인트 | 메서드 | 설명 |\n|----------|--------|-------------|\n| `/api/v1/recording/days` | GET | 녹화 날짜 조회 (캘린더용) |\n| `/api/v1/recording/minutes` | GET | 녹화 구간 조회 (타임라인용) |\n\n#### 4.1.6. 이벤트\n| 엔드포인트 | 메서드 | 설명 |\n|----------|--------|-------------|\n| `/api/v1/event/type` | GET | 이벤트 유형 목록 |\n| `/api/v1/event/log` | GET | 이벤트 로그 검색 |\n| `/api/v1/event/trigger` | PUT | 이벤트 수동 트리거 |\n\n#### 4.1.7. LPR (차량 번호 인식)\n| 엔드포인트 | 메서드 | 설명 |\n|----------|--------|-------------|\n| `/api/v1/lpr/source` | GET | LPR 소스(인식 지점) 목록 |\n| `/api/v1/lpr/log` | GET | 차량 번호 인식 기록 검색 |\n| `/api/v1/lpr/similar` | GET | 유사 번호판 검색 |\n\n#### 4.1.8. 객체 감지\n| 엔드포인트 | 메서드 | 설명 |\n|----------|--------|-------------|\n| `/api/v1/object/type` | GET | 감지 가능 객체 유형 |\n| `/api/v1/object/attr` | GET | 객체 속성 목록 |\n| `/api/v1/object/log` | GET | 감지된 객체 검색 |\n\n#### 4.1.9. 얼굴 검색\n| 엔드포인트 | 메서드 | 설명 |\n|----------|--------|-------------|\n| `/api/v1/face/search` | POST | 이미지 기반 얼굴 검색 |\n| `/api/v1/face/search` | GET | 기간별 얼굴 목록 조회 |\n\n#### 4.1.10. VOD (주문형 비디오)\n| 엔드포인트 | 메서드 | 설명 |\n|----------|--------|-------------|\n| `/api/v1/vod` | GET | 실시간/녹화 스트림 URL 조회 |\n\n#### 4.1.11. 기타\n| 엔드포인트 | 메서드 | 설명 |\n|----------|--------|-------------|\n| `/api/v1/emergency` | GET | 비상 호출 장치 목록 |\n| `/api/v1/push` | POST | 외부 이벤트 수신 |\n| `/api/v1/parking/lot` | GET | 주차장 목록/상태 |\n| `/api/v1/parking/spot` | GET | 주차면 목록/상태 |\n\n### 4.2. v1 WebSocket 엔드포인트\n\n| 엔드포인트 | 설명 |\n|----------|-------------|\n| `/wsapi/v1/events` | 실시간 이벤트 구독 (LPR, 채널상태, 객체감지 등) |\n| `/wsapi/v1/export` | 녹화 데이터 내보내기 (백업) |\n\n---\n\n## 5. 응답 형식\n\n응답 형식은 엔드포인트별로 다릅니다:\n\n### 5.1. 배열 응답 (채널, 상태, 이벤트 유형 등)\n```json\n[\n  {\"chid\": 1, \"title\": \"Front Door\"},\n  {\"chid\": 2, \"title\": \"Parking Lot\"}\n]\n```\n\n### 5.2. 페이지네이션 응답 (이벤트 로그, LPR 로그, 객체 검색)\n```json\n{\n  \"totalCount\": 100,\n  \"at\": 0,\n  \"data\": [ ... ]\n}\n```\n\n### 5.3. 오류 응답\n```json\n{\n  \"code\": -1,\n  \"message\": \"Error description\"\n}\n```\n\n---\n\n## 6. HTTP 상태 코드\n\n| 코드 | 설명 |\n|------|-------------|\n| 200 | 성공 |\n| 400 | 잘못된 요청 |\n| 401 | 인증 필요 |\n| 403 | 접근 거부 |\n| 404 | 찾을 수 없음 |\n| 500 | 내부 서버 오류 |\n\n---\n\n## 7. 라이선스 종속 기능\n\n일부 API 기능은 해당 라이선스가 필요합니다. 라이선스가 활성화되지 않은 경우 404를 반환합니다.\n\n| 기능 | 관련 엔드포인트 |\n|------|----------------|\n| LPR (차량 번호 인식) | `/api/v1/lpr/*` |\n| 주차 유도 | `/api/v1/parking/lot`, `/wsapi/v1/events?topics=parkingCount` |\n| 주차면 감지 | `/api/v1/parking/spot`, `/wsapi/v1/events?topics=parkingSpot` |\n| 객체 감지 | `/api/v1/object/*` |\n| 얼굴 검색 | `/api/v1/face/search` |\n| 비상 호출 | `/api/v1/emergency` |\n| Push 수신 | `/api/v1/push` |\n| 이벤트 백업 | `/wsapi/v1/export` |\n| 체온 측정 | `/wsapi/v1/events?topics=bodyTemperature` |\n| 차량 추적 | `/wsapi/v1/events?topics=vehicleTracking` |\n\n---\n\n## 8. WebSocket API\n\n실시간 이벤트 구독 및 데이터 내보내기를 위한 WebSocket API입니다.\n\n| 엔드포인트 | 설명 |\n|----------|-------------|\n| `ws://{host}:{port}/wsapi/v1/events` | 실시간 이벤트 구독 |\n| `ws://{host}:{port}/wsapi/v1/export` | 데이터 내보내기 |\n\n### 8.1. WebSocket 인증\n\n```javascript\n// JWT (query param)\nconst ws = new WebSocket('ws://server:port/wsapi/v1/events?topics=LPR\u0026token={accessToken}');\n\n// API Key (query param)\nconst ws = new WebSocket('ws://server:port/wsapi/v1/events?topics=LPR\u0026apikey=tsapi_key_...');\n```\n\n### 이벤트 구독 예시\n\n```javascript\nconst ws = new WebSocket('ws://server/wsapi/v1/events?topics=LPR,channelStatus\u0026apikey=tsapi_key_...');\n\nws.onmessage = (e) =\u003e {\n  const data = JSON.parse(e.data);\n  console.log('Event:', data);\n};\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbobhyun%2Fts-api","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbobhyun%2Fts-api","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbobhyun%2Fts-api/lists"}