edutap.ai developers
Data Integration

API Reference

Course data upload and management REST API

REST API for uploading and managing course information and data (subtitles, learning materials, etc.).

Common

Base URL

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

Authentication

All API requests require the TAP-API-KEY header.

Request Headers

ParameterTypeRequiredDescription
TAP-API-KEYStringOYour issued API key

Data Types

TypeDescriptionFormat
informationCourse metadataJSON
scriptLecture subtitle fileSRT, VTT
videoVideo URL for subtitle extractionMP4, AVI, MOV, MKV, WMV, FLV, WEBM, M4V, 3GP, OGV
contentLearning material documentsPDF, HTML, PY, IPYNB, TXT

Course Information

Register and manage course metadata (title, description, curriculum, etc.).
Course information is required for the AI tutor to understand the learning context.


List Courses

GET/api/v1/courses#
Retrieve registered courses with pagination.

Request

Query Parameters

ParameterTypeRequiredDescription
pageNumber-Page number (default: 1)
sizeNumber-Items per page (default: 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
paginationObjectOPagination info. See pagination
coursesArray of objectsOCourse summary array. See courses item
pagination
FieldTypeDescription
current_pageNumberCurrent page
page_sizeNumberItems per page
total_countNumberTotal items
total_pagesNumberTotal pages
has_nextBooleanHas next page
has_previousBooleanHas previous page
courses item
FieldTypeDescription
course_idStringCourse ID
course_titleStringCourse title
course_categoryStringCourse category
clip_countNumberNumber of clips
total_play_timeNumberTotal play time (seconds)
upload_dateStringUpload date (YYYY.MM.DD)
script_countNumberNumber of subtitles
content_countNumberNumber of materials
has_sectionsBooleanHas sections

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": "Python Basics Programming",
      "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 Course Information

GET/api/v1/courses/{course_id}/information#
Retrieve detailed information for a specific course.

Request

Path Parameters

ParameterTypeRequiredDescription
course_idStringOCourse 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_informationObjectOCourse info object. See course_information
course_information
ParameterTypeRequiredDescription
material_idStringOMaterial ID
client_identityStringOClient name
course_idStringOCourse ID
course_typeString-Course type
course_titleStringOCourse title
course_descriptionString-Course description
course_categoriesArray of objects-Category list
total_play_timeNumberOTotal play time (seconds)
total_clip_countNumberOTotal clip count
instructorsArray of objects-Instructor list
course_curriculumObjectOCurriculum
created_atStringOCreated date
updated_atString-Updated date

Response Example

{
  "course_information": {
    "material_id": "mat_123",
    "client_identity": "Coxwave",
    "course_id": "1000",
    "course_type": "internet",
    "course_title": "Python Basics Programming",
    "course_description": "A course to learn the basics of Python programming.",
    "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": "Cox", "instructor_number": "001" }
    ],
    "course_curriculum": {
      "sections": [
        {
          "section_id": "1000_1",
          "section_order": 1,
          "section_title": "Part 1. Python Basics",
          "depth": 1,
          "total_play_time": 900,
          "total_clip_count": 2,
          "clips": [
            {
              "clip_id": "1000_1_1",
              "clip_order": 1,
              "clip_title": "Variable Declaration",
              "clip_play_time": 450
            }
          ]
        }
      ]
    },
    "created_at": "2025-01-15T10:00:00",
    "updated_at": null
  }
}

Get Clip Status

GET/api/v1/courses/{course_id}/clips/{clip_id}/status#
Check the processing status of a specific clip.

Request

Path Parameters

ParameterTypeRequiredDescription
course_idStringOCourse ID
clip_idStringOClip 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_idStringOClip ID
statusStringOProcessing status (PENDING, PROCESSING, READY)
status_descriptionStringOStatus description message

Response Example

{
  "clip_id": "1000_1_1_1",
  "status": "READY",
  "status_description": "Clip is ready to use"
}

Register Course Information

POST/api/v1/courses/information#
Upload information for multiple courses at once.

Request

Request Body

ParameterTypeRequiredDescription
coursesArray of objectsOCourse info array. See courses item
courses item
ParameterTypeRequiredDescription
course_idStringOCourse unique identifier
course_typeString-Course type (e.g., internet)
course_titleStringOCourse title
course_descriptionString-Course description
total_play_timeNumberOTotal course time (seconds)
total_clip_countNumberOTotal clip count
course_categoriesArray of objects-Category info array
instructorsArray of objects-Instructor info array
course_curriculumObjectOCurriculum (sections or clips)

Category Object

ParameterTypeRequiredDescription
siteStringOSite name
course_category_idStringOCategory ID
course_category_parent_idString-Parent category ID
depthNumberOCategory depth (starts from 0)
course_category_titleStringOCategory name

Instructor Object

ParameterTypeRequiredDescription
instructorStringOInstructor name
instructor_numberString-Instructor number

Section Object

ParameterTypeRequiredDescription
section_idStringOSection unique identifier
section_orderNumberOSection order
section_titleStringOSection title
section_descriptionString-Section description
depthNumberOSection depth (starts from 1)
total_play_timeNumberOTotal play time (seconds)
total_clip_countNumberOTotal clip count
sectionsArray of objects-Sub-sections (nestable)
clipsArray of objects-Clip array

Clip Object

ParameterTypeRequiredDescription
clip_idStringOClip unique identifier
clip_orderNumberOClip order
clip_titleStringOClip title
clip_descriptionString-Clip description
clip_play_timeNumberOPlay time (seconds)
clip_levelNumber-Difficulty (1: Easy, 2: Normal, 3: Hard)

A Section can only have either clips or sections, not both.

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": "Python Basics",
        "course_description": "Basic Python programming course",
        "total_play_time": 1800,
        "total_clip_count": 4,
        "instructors": [{ "instructor": "Cox", "instructor_number": "001" }],
        "course_categories": [
          {
            "site": "coxwave",
            "course_category_id": "1",
            "course_category_parent_id": "",
            "depth": 0,
            "course_category_title": "Programming"
          }
        ],
        "course_curriculum": {
          "sections": [
            {
              "section_id": "1000_1",
              "section_order": 1,
              "section_title": "Part 1. Python Basics",
              "section_description": "Learn basic Python syntax and data types",
              "depth": 1,
              "total_play_time": 900,
              "total_clip_count": 2,
              "clips": [
                {
                  "clip_id": "1000_1_1",
                  "clip_order": 1,
                  "clip_title": "Variable Declaration",
                  "clip_description": "How to declare variables in Python",
                  "clip_play_time": 450
                },
                {
                  "clip_id": "1000_1_2",
                  "clip_order": 2,
                  "clip_title": "Data Types Introduction",
                  "clip_description": "Basic data types (int, str, list, dict)",
                  "clip_play_time": 450
                }
              ]
            },
            {
              "section_id": "1000_2",
              "section_order": 2,
              "section_title": "Part 2. Control Statements",
              "section_description": "Learn conditionals and loops",
              "depth": 1,
              "total_play_time": 900,
              "total_clip_count": 2,
              "clips": [
                {
                  "clip_id": "1000_2_1",
                  "clip_order": 1,
                  "clip_title": "Conditionals",
                  "clip_description": "Using if, elif, else",
                  "clip_play_time": 450
                },
                {
                  "clip_id": "1000_2_2",
                  "clip_order": 2,
                  "clip_title": "Loops",
                  "clip_description": "Using for, while",
                  "clip_play_time": 450
                }
              ]
            }
          ]
        }
      }
    ]
  }'

Response

Response Fields

ParameterTypeRequiredDescription
success_coursesArray of stringsOSuccessfully uploaded course IDs
failed_coursesArray of stringsOFailed course IDs

Response Example

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

Delete Course Information

DELETE/api/v1/courses/{course_id}/information#
Delete information for a specific course.

Warning: When course information is deleted, all data and features associated with that course will no longer be supported.

Request

Path Parameters

ParameterTypeRequiredDescription
course_idStringOCourse ID to delete

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
messageStringOServer message

Response Example

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

Course Data

Upload and manage subtitles, learning materials, videos for courses.
Uploaded data is used to improve AI tutor answer quality.

Course Subtitles

Subtitle data extracted from lecture videos. Subtitles are the core learning data for the AI tutor.

If subtitles are available

CategoryFormat
ScriptSRT, VTT

If subtitles are not available

If the original subtitle file is not available, provide the media file download link (URL) in the following formats, and Coxwave will extract subtitles for you.

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

Course Materials

Learning materials provided to course students. Not required for AI tutor integration, but recommended for improved answer quality.

CategoryFormat
ContentPDF, HTML, PY, IPYNB, TXT

Get Course Data

GET/api/v1/courses/{course_id}/materials#
Retrieve data (subtitles, learning materials, etc.) uploaded to a specific course.

Request

Path Parameters

ParameterTypeRequiredDescription
course_idStringOCourse ID

Query Parameters

ParameterTypeRequiredDescription
clip_idString-Filter by specific clip

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_idStringOCourse ID
course_titleStringOCourse title
materialsArray of objectsOUploaded materials list. See materials item
materials item
FieldTypeDescription
client_identityStringClient name
material_idStringMaterial unique ID
section_idStringSection ID
clip_idStringClip ID
typeStringData type
file_nameStringFile name
sizeNumberFile size (bytes)
urlStringFile URL
statusStringProcessing status
summaryStringContent summary
descriptionStringContent description
is_generated_from_videoBooleanWhether generated from video URL

Response Example

{
  "course_id": "1000",
  "course_title": "Python Basics Programming",
  "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": "Lecture content about Python variable declaration",
      "description": "Explains how to declare variables in Python basics.",
      "is_generated_from_video": false
    }
  ]
}

Upload Course Data

POST/api/v1/courses/{course_id}/materials#
Upload subtitles, videos, learning materials to a course.

Request

Path Parameters

ParameterTypeRequiredDescription
course_idStringOCourse ID

Request Body (multipart/form-data)

ParameterTypeRequiredDescription
metadataArray of objectsOFile metadata JSON array. See metadata item
filesArray of files-Files to upload (except video type)
metadata item
ParameterTypeRequiredDescription
clip_idString-Clip ID (either clip_id or section_id required)
section_idString-Section ID (for section-level material upload)
typeStringOData type (script, video, content)
file_nameStringOFile name or video URL

Upload target specification: Either clip_id or section_id must be specified. If neither is specified, uploads to course level.

Video type: When type: "video", don't upload the file directly - specify the video download URL in file_name. The server will download the video from that URL and automatically extract subtitles.

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_idStringOCourse ID
upload_resultsArray of objectsOUpload result array. See upload_results item
upload_results item
FieldTypeDescription
client_identityStringClient identifier
material_idStringMaterial unique ID
section_idStringSection ID (for section-level materials)
clip_idStringClip ID (for clip-level materials)
file_nameStringFile name
sizeNumberFile size (bytes)
statusStringProcessing status
file_log_idStringFile log ID
is_generated_from_videoBooleanWhether generated from video 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 Course Data

DELETE/api/v1/courses/{course_id}/materials/{material_id}#
Delete a specific material.

Request

Path Parameters

ParameterTypeRequiredDescription
course_idStringOCourse ID
material_idStringOMaterial ID to delete

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
messageStringOServer message

Response Example

{
  "message": "Material deleted successfully"
}

Data Processing Status

Uploaded course data goes through preprocessing, and you can check progress via the status field in the query API.

StatusDescription
UPLOADINGFile upload in progress
UPLOADEDUpload complete
UPLOAD_FAILEDUpload failed
SUMMARIZINGContent summarization in progress
SUMMARIZEDSummarization complete
SUMMARIZE_FAILEDSummarization failed
EMBEDDINGVector embedding in progress
EMBEDDEDEmbedding complete
EMBED_FAILEDEmbedding failed
QUIZ_GENERATINGQuiz generation in progress
QUIZ_GENERATEDQuiz generation complete
QUIZ_GENERATE_FAILEDQuiz generation failed
PING_MESSAGE_GENERATINGSuggested question generation in progress
PING_MESSAGE_GENERATEDSuggested question generation complete (all features available)
PING_MESSAGE_GENERATE_FAILEDSuggested question generation failed

Errors

Error Response Format

All errors are returned in the following format:

{
  "error_code": "COURSE_NOT_FOUND",
  "message": "Course does not exist.",
  "status_code": 404
}

Error Codes

HTTPError CodeDescriptionSolution
400INVALID_COURSE_DATAInvalid course dataCheck request data format
400EMPTY_CONTENTEmpty contentCheck required fields
401-Authentication failedCheck API key
404COURSE_NOT_FOUNDCourse not foundCheck course_id
404SECTION_NOT_FOUNDSection not foundCheck section_id
404CLIP_NOT_FOUNDClip not foundCheck clip_id
404MATERIAL_NOT_FOUNDMaterial not foundCheck material_id
409DUPLICATE_KEYDuplicate keyResource already exists
500DATABASE_ERRORDatabase errorContact support
500SERVER_ERRORInternal server errorContact support

Next Steps