edutap.ai developers
데이터 연동

API 레퍼런스

강의 데이터 업로드 및 관리 REST API

강의 정보와 데이터(자막, 학습 자료 등)를 업로드하고 관리하는 REST API입니다.

공통 사항

Base URL

https://tap-file-upload-production.coxwave.link

인증

모든 API 요청에는 TAP-API-KEY 헤더가 필요합니다.

Request Headers

ParameterTypeRequiredDescription
TAP-API-KEYStringO발급받은 API 키

데이터 타입

TypeDescriptionFormat
information강의 정보 메타데이터JSON
script강의 자막 파일SRT, VTT
video자막 추출용 강의 영상 URLMP4, AVI, MOV, MKV, WMV, FLV, WEBM, M4V, 3GP, OGV
content학습 자료 문서PDF, HTML, PY, IPYNB, TXT

강의 정보

강의의 메타데이터(제목, 설명, 커리큘럼 등)를 등록하고 관리합니다.
강의 정보는 AI 튜터가 학습 컨텍스트를 이해하는 데 필요합니다.


강의 목록 조회

GET/api/v1/courses#
등록된 강의 목록을 페이지네이션으로 조회합니다.

Request

Query Parameters

ParameterTypeRequiredDescription
pageNumber-페이지 번호 (기본값: 1)
sizeNumber-페이지당 항목 수 (기본값: 10)

Request Example

curl -X GET "https://tap-file-upload-production.coxwave.link/api/v1/courses?page=1&size=10" \
  -H "TAP-API-KEY: {YOUR_API_KEY}"

Response

ParameterTypeRequiredDescription
paginationObjectO페이지네이션 정보. pagination 참조
coursesArray of objectsO강의 요약 정보 배열. courses item 참조
pagination
FieldTypeDescription
current_pageNumber현재 페이지
page_sizeNumber페이지당 항목 수
total_countNumber전체 항목 수
total_pagesNumber전체 페이지 수
has_nextBoolean다음 페이지 존재 여부
has_previousBoolean이전 페이지 존재 여부
courses item
FieldTypeDescription
course_idString강의 ID
course_titleString강의명
course_categoryString강의 카테고리
clip_countNumber클립 수
total_play_timeNumber총 재생 시간 (초)
upload_dateString업로드 일자 (YYYY.MM.DD)
script_countNumber강의자막 개수
content_countNumber강의자료 개수
has_sectionsBoolean섹션 존재 여부

Response Example

{
  "pagination": {
    "current_page": 1,
    "page_size": 10,
    "total_count": 60,
    "total_pages": 6,
    "has_next": true,
    "has_previous": false
  },
  "courses": [
    {
      "course_id": "1000",
      "course_title": "파이썬 기초 프로그래밍",
      "course_category": "Programming",
      "clip_count": 4,
      "total_play_time": 1800,
      "upload_date": "2025.01.15",
      "script_count": 3,
      "content_count": 8,
      "has_sections": true
    }
  ]
}

강의 정보 조회

GET/api/v1/courses/{course_id}/information#
특정 강의의 상세 정보를 조회합니다.

Request

Path Parameters

ParameterTypeRequiredDescription
course_idStringO강의 ID

Request Example

curl -X GET "https://tap-file-upload-production.coxwave.link/api/v1/courses/1000/information" \
  -H "TAP-API-KEY: {YOUR_API_KEY}"

Response

Response Fields

ParameterTypeRequiredDescription
course_informationObjectO강의 정보 객체. course_information 참조
course_information
ParameterTypeRequiredDescription
material_idStringO자료 ID
client_identityStringO고객사명
course_idStringO강의 ID
course_typeString-강의 유형
course_titleStringO강의 제목
course_descriptionString-강의 설명
course_categoriesArray of objects-카테고리 목록
total_play_timeNumberO총 재생 시간 (초)
total_clip_countNumberO총 클립 수
instructorsArray of objects-강사 목록
course_curriculumObjectO커리큘럼
created_atStringO생성일시
updated_atString-수정일시

Response Example

{
  "course_information": {
    "material_id": "mat_123",
    "client_identity": "Coxwave",
    "course_id": "1000",
    "course_type": "internet",
    "course_title": "파이썬 기초 프로그래밍",
    "course_description": "파이썬 프로그래밍의 기초를 배우는 강의입니다.",
    "course_categories": [
      {
        "site": "coxwave",
        "course_category_id": "1",
        "course_category_parent_id": "",
        "depth": 0,
        "course_category_title": "Programming"
      }
    ],
    "total_play_time": 1800,
    "total_clip_count": 4,
    "instructors": [
      { "instructor": "콕웨", "instructor_number": "001" }
    ],
    "course_curriculum": {
      "sections": [
        {
          "section_id": "1000_1",
          "section_order": 1,
          "section_title": "Part 1. 파이썬 기초",
          "depth": 1,
          "total_play_time": 900,
          "total_clip_count": 2,
          "clips": [
            {
              "clip_id": "1000_1_1",
              "clip_order": 1,
              "clip_title": "변수 선언",
              "clip_play_time": 450
            }
          ]
        }
      ]
    },
    "created_at": "2025-01-15T10:00:00",
    "updated_at": null
  }
}

클립 상태 조회

GET/api/v1/courses/{course_id}/clips/{clip_id}/status#
특정 클립의 처리 상태를 조회합니다.

Request

Path Parameters

ParameterTypeRequiredDescription
course_idStringO강의 ID
clip_idStringO클립 ID

Request Example

curl -X GET "https://tap-file-upload-production.coxwave.link/api/v1/courses/1000/clips/1000_1_1_1/status" \
  -H "TAP-API-KEY: {YOUR_API_KEY}"

Response

Response Fields

ParameterTypeRequiredDescription
clip_idStringO클립 ID
statusStringO처리 상태 (PENDING, PROCESSING, READY)
status_descriptionStringO상태에 대한 설명 메시지

Response Example

{
  "clip_id": "1000_1_1_1",
  "status": "READY",
  "status_description": "클립을 사용할 수 있습니다"
}

강의 정보 등록

POST/api/v1/courses/information#
여러 강의의 정보를 한 번에 업로드합니다.

Request

Request Body

ParameterTypeRequiredDescription
coursesArray of objectsO강의 정보 배열. courses item 참조
courses item
ParameterTypeRequiredDescription
course_idStringO강의 고유 식별자
course_typeString-강의 유형 (예: internet)
course_titleStringO강의 제목
course_descriptionString-강의 설명
total_play_timeNumberO총 강의 시간 (초)
total_clip_countNumberO총 클립 개수
course_categoriesArray of objects-카테고리 정보 배열
instructorsArray of objects-강사 정보 배열
course_curriculumObjectO커리큘럼 (sections 또는 clips)

Category 객체

ParameterTypeRequiredDescription
siteStringO사이트명
course_category_idStringO카테고리 ID
course_category_parent_idString-부모 카테고리 ID
depthNumberO카테고리 깊이 (0부터 시작)
course_category_titleStringO카테고리명

Instructor 객체

ParameterTypeRequiredDescription
instructorStringO강사명
instructor_numberString-강사 번호

Section 객체

ParameterTypeRequiredDescription
section_idStringO섹션 고유 식별자
section_orderNumberO섹션 순서
section_titleStringO섹션 제목
section_descriptionString-섹션 설명
depthNumberO섹션 깊이 (1부터 시작)
total_play_timeNumberO총 재생 시간 (초)
total_clip_countNumberO총 클립 수
sectionsArray of objects-하위 섹션 (중첩 가능)
clipsArray of objects-클립 배열

Clip 객체

ParameterTypeRequiredDescription
clip_idStringO클립 고유 식별자
clip_orderNumberO클립 순서
clip_titleStringO클립 제목
clip_descriptionString-클립 설명
clip_play_timeNumberO재생 시간 (초)
clip_levelNumber-난이도 (1: 쉬움, 2: 보통, 3: 어려움)

Section은 clips 또는 sections 중 하나만 가질 수 있습니다.

Request Example

curl -X POST "https://tap-file-upload-production.coxwave.link/api/v1/courses/information" \
  -H "Content-Type: application/json" \
  -H "TAP-API-KEY: {YOUR_API_KEY}" \
  -d '{
    "courses": [
      {
        "course_id": "1000",
        "course_type": "internet",
        "course_title": "파이썬 기초",
        "course_description": "파이썬 프로그래밍 기초 강의",
        "total_play_time": 1800,
        "total_clip_count": 4,
        "instructors": [{ "instructor": "콕웨", "instructor_number": "001" }],
        "course_categories": [
          {
            "site": "coxwave",
            "course_category_id": "1",
            "course_category_parent_id": "",
            "depth": 0,
            "course_category_title": "프로그래밍"
          }
        ],
        "course_curriculum": {
          "sections": [
            {
              "section_id": "1000_1",
              "section_order": 1,
              "section_title": "Part 1. 파이썬 기초",
              "section_description": "파이썬의 기본 문법과 자료형을 배웁니다",
              "depth": 1,
              "total_play_time": 900,
              "total_clip_count": 2,
              "clips": [
                {
                  "clip_id": "1000_1_1",
                  "clip_order": 1,
                  "clip_title": "변수 선언",
                  "clip_description": "파이썬의 변수 선언 방법",
                  "clip_play_time": 450
                },
                {
                  "clip_id": "1000_1_2",
                  "clip_order": 2,
                  "clip_title": "자료형 소개",
                  "clip_description": "기본 자료형(int, str, list, dict)",
                  "clip_play_time": 450
                }
              ]
            },
            {
              "section_id": "1000_2",
              "section_order": 2,
              "section_title": "Part 2. 제어문",
              "section_description": "조건문과 반복문을 배웁니다",
              "depth": 1,
              "total_play_time": 900,
              "total_clip_count": 2,
              "clips": [
                {
                  "clip_id": "1000_2_1",
                  "clip_order": 1,
                  "clip_title": "조건문",
                  "clip_description": "if, elif, else 사용법",
                  "clip_play_time": 450
                },
                {
                  "clip_id": "1000_2_2",
                  "clip_order": 2,
                  "clip_title": "반복문",
                  "clip_description": "for, while 사용법",
                  "clip_play_time": 450
                }
              ]
            }
          ]
        }
      }
    ]
  }'

Response

Response Fields

ParameterTypeRequiredDescription
success_coursesArray of stringsO업로드 성공한 강의 ID 목록
failed_coursesArray of stringsO업로드 실패한 강의 ID 목록

Response Example

{
  "success_courses": ["1000"],
  "failed_courses": []
}

강의 정보 삭제

DELETE/api/v1/courses/{course_id}/information#
특정 강의의 정보를 삭제합니다.

주의: 강의 정보가 삭제되면 해당 강의와 연관된 모든 데이터 및 기능이 지원되지 않습니다.

Request

Path Parameters

ParameterTypeRequiredDescription
course_idStringO삭제할 강의 ID

Request Example

curl -X DELETE "https://tap-file-upload-production.coxwave.link/api/v1/courses/1000/information" \
  -H "TAP-API-KEY: {YOUR_API_KEY}"

Response

Response Fields

ParameterTypeRequiredDescription
messageStringO서버 메시지

Response Example

{
  "message": "Course information deleted successfully"
}

강의 데이터

강의에 자막, 학습 자료, 비디오 등을 업로드하고 관리합니다.
업로드된 데이터는 AI 튜터의 답변 품질을 높이는 데 사용됩니다.

강의 자막

강의 영상에서 추출된 자막 데이터입니다. 자막은 AI 튜터의 핵심 학습 데이터입니다.

자막이 있는 경우

CategoryFormat
ScriptSRT, VTT

자막이 없는 경우

자막 원본 파일이 없을 경우, 다음 포맷의 미디어 파일 다운로드 링크(URL)를 제공하시면 콕스웨이브에서 자막 추출을 진행합니다.

CategoryFormat
VideoMP4, AVI, MOV, MKV, WMV, FLV, WEBM, M4V, 3GP, OGV

강의 자료

강의 수강생에게 제공되는 학습 자료입니다. AI 튜터 연동 필수 항목은 아니지만, 답변 품질 향상을 위해 추가를 권장합니다.

CategoryFormat
ContentPDF, HTML, PY, IPYNB, TXT

강의 데이터 조회

GET/api/v1/courses/{course_id}/materials#
특정 강의에 업로드된 데이터(자막, 학습 자료 등)를 조회합니다.

Request

Path Parameters

ParameterTypeRequiredDescription
course_idStringO강의 ID

Query Parameters

ParameterTypeRequiredDescription
clip_idString-특정 클립의 데이터만 필터링

Request Example

curl -X GET "https://tap-file-upload-production.coxwave.link/api/v1/courses/1000/materials" \
  -H "TAP-API-KEY: {YOUR_API_KEY}"

Response

Response Fields

ParameterTypeRequiredDescription
course_idStringO강의 ID
course_titleStringO강의명
materialsArray of objectsO업로드된 자료 목록. materials item 참조
materials item
FieldTypeDescription
client_identityString고객사명
material_idString자료 고유 ID
section_idString섹션 ID
clip_idString클립 ID
typeString데이터 타입
file_nameString파일명
sizeNumber파일 크기 (bytes)
urlString파일 URL
statusString처리 상태
summaryString콘텐츠 요약
descriptionString콘텐츠 설명
is_generated_from_videoBoolean비디오 URL에서 생성된 자료 여부

Response Example

{
  "course_id": "1000",
  "course_title": "파이썬 기초 프로그래밍",
  "materials": [
    {
      "client_identity": "Coxwave",
      "material_id": "mat_123",
      "section_id": null,
      "clip_id": "1000_1",
      "type": "script",
      "file_name": "lecture1.srt",
      "size": 12345,
      "url": null,
      "status": "EMBEDDED",
      "summary": "파이썬 변수 선언에 대한 강의 내용",
      "description": "파이썬 기초 문법 중 변수 선언 방법을 설명합니다.",
      "is_generated_from_video": false
    }
  ]
}

강의 데이터 등록

POST/api/v1/courses/{course_id}/materials#
강의에 자막, 비디오, 학습 자료를 업로드합니다.

Request

Path Parameters

ParameterTypeRequiredDescription
course_idStringO강의 ID

Request Body (multipart/form-data)

ParameterTypeRequiredDescription
metadataArray of objectsO파일 메타데이터 JSON 배열. metadata item 참조
filesArray of files-업로드할 파일들 (video 타입 제외)
metadata item
ParameterTypeRequiredDescription
clip_idString-클립 ID (clip_id 또는 section_id 중 하나 필수)
section_idString-섹션 ID (섹션 레벨 자료 업로드 시 사용)
typeStringO데이터 타입 (script, video, content)
file_nameStringO파일명 또는 비디오 URL

업로드 대상 지정: clip_id 또는 section_id 중 하나를 지정해야 합니다. 둘 다 지정하지 않으면 강의(course) 레벨에 업로드됩니다.

비디오 타입: type: "video"인 경우 파일을 직접 업로드하지 않고 file_name에 비디오 다운로드 URL을 지정합니다. 서버가 해당 URL에서 비디오를 다운로드하여 자막을 자동 추출합니다.

Request Example

curl -X POST "https://tap-file-upload-production.coxwave.link/api/v1/courses/1000/materials" \
  -H "TAP-API-KEY: {YOUR_API_KEY}" \
  -F 'metadata=[
    {"clip_id": "1000_1", "type": "script", "file_name": "script.vtt"},
    {"clip_id": "1000_1", "type": "content", "file_name": "slides.pdf"},
    {"clip_id": "1000_2", "type": "video", "file_name": "https://example.com/video.mp4"}
  ]' \
  -F 'files=@script.vtt' \
  -F 'files=@slides.pdf'

Response

Response Fields

ParameterTypeRequiredDescription
course_idStringO강의 ID
upload_resultsArray of objectsO업로드 결과 배열. upload_results item 참조
upload_results item
FieldTypeDescription
client_identityString클라이언트 식별자
material_idString자료 고유 ID
section_idString섹션 ID (섹션 레벨 자료인 경우)
clip_idString클립 ID (클립 레벨 자료인 경우)
file_nameString파일명
sizeNumber파일 크기 (bytes)
statusString처리 상태
file_log_idString파일 로그 ID
is_generated_from_videoBoolean비디오 URL에서 생성된 자료 여부

Response Example

{
  "course_id": "1000",
  "upload_results": [
    {
      "client_identity": "Coxwave",
      "material_id": "40d2f656-0ea8-41e0-8ea5-fd90da314178",
      "clip_id": "1000_1",
      "file_name": "script.vtt",
      "size": 173,
      "status": "UPLOADING",
      "file_log_id": "6836cf0f767332a07065455a"
    }
  ]
}

강의 데이터 삭제

DELETE/api/v1/courses/{course_id}/materials/{material_id}#
특정 자료를 삭제합니다.

Request

Path Parameters

ParameterTypeRequiredDescription
course_idStringO강의 ID
material_idStringO삭제할 자료 ID

Request Example

curl -X DELETE "https://tap-file-upload-production.coxwave.link/api/v1/courses/1000/materials/mat_123" \
  -H "TAP-API-KEY: {YOUR_API_KEY}"

Response

Response Fields

ParameterTypeRequiredDescription
messageStringO서버 메시지

Response Example

{
  "message": "Material deleted successfully"
}

데이터 처리 상태

업로드된 강의 데이터는 전처리 과정을 거치며, 조회 API의 status 필드로 진행 상황을 확인할 수 있습니다.

StatusDescription
UPLOADING파일 업로드 진행 중
UPLOADED업로드 완료
UPLOAD_FAILED업로드 실패
SUMMARIZING내용 요약 진행 중
SUMMARIZED요약 완료
SUMMARIZE_FAILED요약 실패
EMBEDDING벡터 임베딩 진행 중
EMBEDDED임베딩 완료
EMBED_FAILED임베딩 실패
QUIZ_GENERATING퀴즈 생성 진행 중
QUIZ_GENERATED퀴즈 생성 완료
QUIZ_GENERATE_FAILED퀴즈 생성 실패
PING_MESSAGE_GENERATING추천질문 생성 진행 중
PING_MESSAGE_GENERATED추천질문 생성 완료 (전체 기능 사용 가능)
PING_MESSAGE_GENERATE_FAILED추천질문 생성 실패

에러

에러 응답 형식

모든 에러는 다음 형식으로 반환됩니다:

{
  "error_code": "COURSE_NOT_FOUND",
  "message": "존재하지 않는 강의입니다.",
  "status_code": 404
}

에러 코드

HTTPError CodeDescriptionSolution
400INVALID_COURSE_DATA유효하지 않은 강의 데이터요청 데이터 형식 확인
400EMPTY_CONTENT비어있는 콘텐츠필수 필드 확인
401-인증 실패API 키 확인
404COURSE_NOT_FOUND존재하지 않는 강의course_id 확인
404SECTION_NOT_FOUND존재하지 않는 섹션section_id 확인
404CLIP_NOT_FOUND존재하지 않는 클립clip_id 확인
404MATERIAL_NOT_FOUND존재하지 않는 자료material_id 확인
409DUPLICATE_KEY중복된 키이미 존재하는 리소스
500DATABASE_ERROR데이터베이스 에러담당자 문의
500SERVER_ERROR서버 내부 에러담당자 문의

다음 단계