DataOps 쪽이 구현할 API 3개
목록 · 매니페스트 · 파일 엔드포인트의 요청과 응답, 인증, 오류 형식, 받아 주는 필드 별칭
플랫폼에 기준 URL 하나를 등록하면, 플랫폼은 그 아래의 세 경로를 부릅니다. 예시의 https://data.example.com/api 가 기준 URL 입니다.
| # | 메서드 · 경로 | 용도 |
|---|---|---|
| 1 | GET {base}/datasets | 데이터셋 목록 + 갱신 시각 |
| 2 | GET {base}/datasets/{id}/manifest | 파일 목록 + SHA-256. 변경 판단의 유일한 근거 |
| 3 | GET {base}/datasets/{id}/files/{file_id} | 파일 본문(바이너리) |
경로 모양은 이대로여야 합니다. 대신 응답의 필드 이름은 여러분 규칙을 따라도 됩니다. 플랫폼은 뜻이 같은 여러 이름을 받아 줍니다(아래 필드 별칭).
공통 규약
| 항목 | 요구 |
|---|---|
| 인증 | Authorization: Bearer <token> 헤더 하나. 토큰 없이 여는 서버라면 토큰 칸을 비워 등록하면 됩니다 |
| 전송 | HTTPS 권장. 플랫폼은 http:// · https:// 만 받고, 링크로컬 주소(169.254.x.x)는 거절합니다 |
| 응답 형식 | 1 · 2번은 application/json(UTF-8) 객체, 3번은 바이너리 |
| 시각 | ISO 8601, 타임존 포함(예: 2026-07-21T09:30:00Z). 타임존이 없으면 UTC 로 읽습니다 |
| 오류 | HTTP 상태 코드 + JSON 본문. 인증 실패 401, 없는 자원 404. 본문 앞부분(200자)이 사용자 화면에 그대로 나갑니다 |
| 호출 빈도 | 사람이 버튼을 누를 때만 부릅니다(예약 동기화 없음) |
| 시간 제한 | 요청 한 번이 30초 안에 응답을 시작해야 합니다. 큰 파일도 읽기 단위로 재므로 전송이 길어지는 것은 괜찮습니다 |
1. 데이터셋 목록
curl -H "Authorization: Bearer $TOKEN" \
"https://data.example.com/api/datasets?page=1&page_size=50&updated_after=2026-07-01T00:00:00Z"
{
"items": [
{
"id": "ds-inspect-2026w29",
"name": "라인 검사 이미지 2026-W29",
"modality": "image",
"file_count": 412,
"size_bytes": 1073741824,
"updated_at": "2026-07-21T09:30:00Z"
}
],
"page": 1,
"total": 3
}
| 필드 | 필수 | 설명 |
|---|---|---|
id | 필수 | 변하지 않는 고유 ID. 이름이 바뀌어도 유지돼야 합니다. 플랫폼이 다시 동기화할 대상을 찾는 키입니다 |
name | 권장 | 화면에 보일 이름. 없으면 id 를 씁니다 |
modality | 권장 | image · pointcloud · timeseries · tabular. 새 데이터셋의 기본 모달리티가 됩니다 |
file_count · size_bytes | 권장 | 선택 화면 표시용 |
updated_at | 권장 | 파일이 추가 · 변경 · 삭제될 때마다 바뀌어야 합니다. 화면의 "원격 갱신 시각" 과 증분 조회에 씁니다 |
- 플랫폼은
page(1부터)와page_size를 보냅니다. 지원하지 않으면 무시하고 전부 돌려줘도 됩니다.total을 주면 화면이 "더 불러오기" 를 판단합니다. updated_after를 주면 그 시각 이후 바뀐 것만 돌려주세요(권장).- 연결 확인은
page=1&page_size=1로 한 번 부릅니다.
2. 매니페스트
curl -H "Authorization: Bearer $TOKEN" \
"https://data.example.com/api/datasets/ds-inspect-2026w29/manifest"
{
"dataset_id": "ds-inspect-2026w29",
"annotation_format": "coco",
"classes": [{ "id": 0, "name": "defect_a" }, { "id": 1, "name": "defect_b" }],
"files": [
{
"file_id": "f-0001",
"filename": "20260721_line3_0001.png",
"kind": "image",
"size_bytes": 2493833,
"sha256": "9f8a1c…",
"meta": { "line": "line-3", "measured_at": "2026-07-21T09:30:12+09:00" }
}
]
}
| 필드 | 필수 | 설명 |
|---|---|---|
files[].file_id | 필수 | 다운로드 경로에 쓰는 변하지 않는 파일 키. 같은 파일의 내용이 바뀌어도 유지하세요(그래야 "변경" 으로 판정돼 같은 행이 교체됩니다) |
files[].filename | 필수 | 확장자를 포함한 파일 이름. 플랫폼은 확장자로 파일 종류를 판정합니다 |
files[].sha256 | 사실상 필수 | 본문의 SHA-256 (16진, 대소문자 무관). 없으면 그 파일은 매번 다시 받습니다 |
files[].size_bytes | 권장 | 진행률 표시용 |
files[].kind | 참고 | 기록만 합니다. 실제 종류는 확장자로 정합니다 |
files[].meta | 선택 | 파일별 메타. 플랫폼 파일의 meta.source 에 그대로 보관합니다 |
annotation_format · classes | 선택 | 기록만 하고 해석하지 않습니다. 라벨은 받은 어노테이션 파일을 플랫폼 검증기가 직접 읽습니다 |
3. 파일 본문
curl -H "Authorization: Bearer $TOKEN" -o 0001.png \
"https://data.example.com/api/datasets/ds-inspect-2026w29/files/f-0001"
- 파일 본문을 그대로 스트리밍합니다.
Content-Type은 무엇이든 됩니다. - 리다이렉트를 따라가므로, 본문 대신 presigned URL 로 302 를 돌려줘도 됩니다.
- 이어받기(
Range)는 아직 쓰지 않습니다. 실패한 파일은 다음 동기화에서 통째로 다시 받습니다. - 파일 하나는 2 GiB 까지입니다(서버 설정으로 바꿀 수 있음).
오류 응답
// 401
{ "error": "invalid_token", "message": "토큰이 만료되었습니다." }
// 404
{ "error": "dataset_not_found", "message": "ds-xxxx 를 찾을 수 없습니다." }
// 429 (Retry-After 헤더를 함께 주면 좋습니다)
{ "error": "rate_limited", "message": "잠시 후 다시 시도해 주십시오." }
플랫폼은 이 본문을 해석하지 않고 앞부분을 사용자에게 보여 줍니다. 원인이 드러나는 한 문장을 담아 주세요.
필드 별칭
응답 필드 이름은 아래 중 무엇을 써도 됩니다. 앞에 있는 것부터 찾고, 비어 있지 않은 첫 값을 씁니다.
| 뜻 | 받는 이름 |
|---|---|
| 목록 배열 | items · datasets · results · data |
| 총 개수 | total · count · total_count |
| 데이터셋 id | id · dataset_id · datasetId |
| 이름 | name · title |
| 모달리티 | modality · type |
| 파일 수 | file_count · fileCount · files |
| 크기 | size_bytes · sizeBytes · size |
| 갱신 시각 | updated_at · updatedAt · modified_at · last_modified (매니페스트는 updated_at · updatedAt) |
| 파일 배열 | files · items · entries |
| 파일 id | file_id · fileId · id |
| 파일 이름 | filename · name · path |
| 체크섬 | sha256 · checksum_sha256 · checksum · hash |
| 파일 종류 | kind · type |
| 클래스 표 | classes · categories · labels |
| 어노테이션 형식 | annotation_format · annotationFormat · label_format |
이 표에 없는 이름이 꼭 필요하면 플랫폼 팀에 알려 주세요. 한 줄 추가로 받을 수 있습니다.
지원하는 파일 형식
| 종류 | 형식 |
|---|---|
| 이미지 | PNG · JPG · BMP · TIFF · WebP |
| 시계열 · 표 | CSV · TSV · Parquet (첫 행 헤더 필수) |
| 포인트클라우드 | PLY. 포인트별 정수 라벨 속성이 있으면 자동으로 찾아 클래스를 셉니다 |
| 어노테이션 | COCO JSON · LabelMe JSON · VOC XML |
CSV · Parquet 는 확장자로 시계열과 표를 가를 수 없으므로, 목록의 modality 를 tabular 로 알려 주거나 데이터셋을 만들 때 모달리티를 직접 고르게 해 주세요.
연동 확인 체크리스트 (제공 측)
| # | 확인 | 통과하지 못하면 |
|---|---|---|
| 1 | 토큰으로 목록이 200 인가 | 인증 방식부터 다시 맞춘다 |
| 2 | updated_after 가 동작하는가 | 증분 조회 없이 전체 조회로 쓴다 |
| 3 | 매니페스트의 sha256 이 실제 파일과 같은가 | 파일이 경고와 함께 탈락한다 |
| 4 | 받은 파일이 손상 없이 열리는가 | 전송 계층을 확인한다 |
| 5 | 같은 데이터셋을 두 번 동기화하면 두 번째는 받은 파일 0 인가 | 증분 동기화가 성립하지 않는다(file_id 가 바뀌는지 확인) |