공개 API 필드 이름과 호환성
신규 연동은 아래 공개 필드 이름을 사용합니다. 내부 모델/테이블 이름을 추측하거나 ID, id를 순서대로 대입하지 마세요. 스토어프론트 API와 서버용 API는 같은 리소스에 같은 ID 이름을 사용합니다. 인증, 응답의 전체 구조, 공개되는 정보는 API 용도에 따라 다릅니다.
ID는 대상별로 하나의 이름을 사용합니다
섹션 제목: “ID는 대상별로 하나의 이름을 사용합니다”| 공개 필드 | 의미 | 사용 예 |
|---|---|---|
content_id | 판매 콘텐츠 자체. VOD 강의, 라이브, 오프라인, 디지털 콘텐츠 | 콘텐츠 상세, 내 수강 콘텐츠 상세 |
option_id | 콘텐츠의 구매 옵션/일정/플랜 | 장바구니, content_items |
curriculum_id | 콘텐츠 안의 실제 회차/레슨 | 재생할 영상 선택, 학습 진행률 |
chapter_id | 회차를 묶은 챕터 | chapters[].chapter_id |
product_id | 실물 상품 자체 | 상품 상세 |
variant_id | 상품의 구매 옵션 조합 | 장바구니, product_items |
board_id | 게시판 | 게시판 상세, 게시글 필터 |
post_id | 게시글 | 게시글 상세, 댓글 작성 |
comment_id | 댓글 | 댓글 식별 |
order_id | 주문 전체 | 주문 조회, 결제 초기화 |
line_item_id | 구매 후 액션 대상 주문 항목의 불투명 문자열 | 열기, 구매확정, 환불. 분해하지 않고 그대로 전달 |
lookup_id | 수강 권한/학습 기록 | 진행률/일시정지. 콘텐츠 ID가 아님 |
user_id, site_id, page_id | 사용자, 사이트, 페이지 | 각 리소스 식별 |
category_id, tag_id, popup_id | 카테고리, 태그, 팝업 | 필터/리소스 식별 |
input_option_id | 상품 구매자 입력 항목 | buyer_inputs의 key |
예: content_id=6401인 강의의 구매 옵션이 option_id=55102, 첫 영상이 curriculum_id=91201일 수 있습니다. 세 값은 서로 바꿔 쓰지 않습니다. 게시글을 뜻할 때는 **항상 post_id**이며 판매 콘텐츠의 content_id와 관계없습니다.
경로의 {content_id}는 같은 응답 필드 content_id를 넣으라는 뜻입니다. 예전 문서의 {contentId}처럼 placeholder 표기가 달라도 실제 URL은 /contents/6401로 같습니다.
주요 응답 위치
섹션 제목: “주요 응답 위치”| 조회 | 읽을 위치 |
|---|---|
GET /contents | contents.data[] → content_id, content_type |
GET /contents/{content_id} | content, content.options[], curriculums[], chapters[].items[] |
GET /me/contents/{type}/{status} | contents.data[] → content_id. 빈 결과도 동일 |
GET /me/content-counts/{type} | content_counts[type][status] |
GET /me/content-items/{content_id} | content, curriculums[], chapters[].items[], watchable, hold_blocked |
GET /products | products.data[] → product_id |
GET /products/{product_id} | product.product_id, product.variants[].variant_id |
GET /cart, GET /guest-cart | items[] → 상품은 variant_id, 콘텐츠는 option_id |
GET /me/orders | orders.data[] → order_id |
GET /me/orders/{order_id} | order |
GET /posts | posts.data[] → post_id |
GET /posts/{post_id} | post |
콘텐츠 유형 필터는 GET /contents?content_type=vod처럼 사용합니다. 내 콘텐츠 목록 경로의 {type}은 all, live, offline, vod, digital_content, membership; {status}는 all, pending, processing, completed입니다. 상품 상태, 수강 상태, 주문 상태는 서로 다른 열거형이므로 재사용하지 마세요.
VOD 회차에서 media_url은 저장된 재생 소스, reference_url은 별도 관련 링크입니다. media_url이 비어 있으면 다른 필드에서 URL을 추측하거나 만들어내지 않습니다. 권한/만료/일시정지 상태도 함께 확인하세요.
요청 이름
섹션 제목: “요청 이름”{ "content_items": [{ "option_id": 55102 }], "product_items": [{ "product_id": 12001, "variant_id": 88421 }], "quantities": { "88421": 1 }}위는 주문 요청의 항목 부분만 나타낸 예입니다. 배송지/금액 등 전체 요청은 장바구니와 결제 시작을 참고하세요. 콘텐츠는 수량 구매가 아닙니다.
댓글 작성에는 { "post_id": 1184, "content": "댓글 본문" }을 보냅니다. content는 본문 텍스트이며 content_id와 다른 개념입니다.
서버용 콘텐츠 API의 chapters[].items[].curriculum_id도 동일한 회차 ID입니다. 기존 회차 수정 시 전달하고, 새 회차 생성 시 생략합니다.
기존 연동과의 호환성
섹션 제목: “기존 연동과의 호환성”이번 변경은 기존 필드를 삭제하지 않는 추가 방식입니다. 신규 예제/OpenAPI는 공개 필드만 안내하며, 기존 연동은 아래 호환 필드를 계속 사용할 수 있습니다. 같은 요청에서 공개 이름과 이전 이름을 함께 보내면 공개 이름이 우선합니다.
| 이전 이름/위치 | 신규 연동에서 사용할 이름/위치 |
|---|---|
콘텐츠의 class_id, ID | content_id |
classes.data, class.default | contents.data, content |
구매 옵션의 ID, all_options | option_id, content.options |
회차의 ID, 서버 API 회차의 item_id | curriculum_id |
구매 상세의 class[], parent_class | curriculums[], content |
chapters[].curriculums_details[] | chapters[].items[] |
VOD 회차 data, vod_link | media_url, reference_url |
watch_able, typeStatusCounts | watchable, content_counts |
댓글 요청의 content_id | post_id |
board_contents, board_content | posts, post |
상품 옵션의 id, 상품의 ID/id | variant_id, product_id |
주문 생성의 old_data[].ID | content_items[].option_id |
주문 생성의 new_data[].id / variant.id | product_items[].variant_id |
미리보기 요청의 options_ids | option_ids |
콘텐츠 목록 query type | content_type |
구매 상세 query activeTab | active_tab |
serve.url 등 서버가 돌려주는 이동 URL, 결제사의 form fields, 페이지 편집기 설정은 불투명 값입니다. 내부에 이전 이름이 있더라도 클라이언트에서 바꾸거나 재조립하지 않고 그대로 사용합니다. 다형성 경로의 {item_id}는 각 endpoint가 정한 타입에 따라 option_id 또는 variant_id를 넣는 자리이며 새로운 콘텐츠 ID 종류가 아닙니다.
이 계약은 API 서버 변경과 함께 배포해야 합니다. 서버 배포 전에는 문서의 신규 필드가 아직 응답에 없을 수 있습니다.