01 콘텐츠 목록
1.1 설명
GET/contents
external_id 를 주면 목록이 아니라 그 식별자의 콘텐츠 한 건을 돌려줍니다. 이때 응답에는 items 가 없고 content 만 있습니다. 제작 시스템이 「내가 보낸 그것이 들어갔는지」를 확인하는 자리입니다.
한 줄에는 그 콘텐츠의 첨부(assets)와 채널별 예약(publications)이 같이 실립니다. 예약만 시각 순으로 훑고 싶으면 GET /publishes 가 그 일을 합니다.
1.2 파라미터
| 이름 | 구분 | 설명 |
|---|---|---|
workspace | 필수 | 워크스페이스 코드 |
external_id | 선택 | 주면 목록 대신 그 외부 식별자의 콘텐츠 한 건만 돌려줍니다 |
limit | 선택 | 가져올 줄 수. 기본 100 이고 1~200 으로 조정됩니다(벗어난 값은 가장 가까운 값이 됩니다) |
1.3 요청
curl "https://moacast.com/api/moacast/v1/contents?workspace=a1b2c3d4&external_id=value" \
-H 'Authorization: Bearer <ACCESS_TOKEN>'1.4 성공 응답
{
"result": "SUCCESS",
"result_code": 0,
"data": {
"workspace": "a1b2c3d4",
"items": [
{
"id": 12,
"external_id": "job-2026-0927-01",
"content_type": "video",
"title": "9월 넷째 주 요약",
"body": "이번 주에 있었던 일",
"hashtags": [
"주간요약"
],
"language": "ko",
"platform_metadata": {
"youtube": {
"title": "9월 4주차 주간 요약"
}
},
"metadata": {
"production": {
"duration_seconds": 62,
"width": 1080,
"height": 1920,
"fps": 30
}
},
"produced_at": "2026-09-27 05:00:00",
"created_at": "2026-09-27 14:10:02",
"updated_at": "2026-09-27 14:10:02",
"assets": [
{
"asset_type": "MASTER_VIDEO",
"mime": "video/mp4",
"size_bytes": 18234112,
"url": "https://…/moacast/3/12/1790000000-ab12cd.mp4?X-Amz-Signature=…",
"url_expires_in": 300
}
],
"publications": [
{
"id": 34,
"channel": "youtube",
"external_id": "UC...",
"status": "SCHEDULED",
"publish_at": "2026-09-28T01:00:00+00:00",
"visibility": "public",
"platform_options": []
}
]
}
]
}
}1.5 필드
| 필드 | 타입 | 설명 |
|---|---|---|
workspace | string | 워크스페이스 코드. external_id 로 한 건을 받을 때는 실리지 않습니다 |
items | array | 콘텐츠 목록. 최근 등록한 것부터. 한 줄의 모양은 아래와 같습니다 |
content | object | external_id 를 준 경우에만. 모양은 items 의 한 줄과 같습니다 |
콘텐츠 한 줄
| 필드 | 타입 | 설명 |
|---|---|---|
id | int | 콘텐츠 ID. 예약을 걸 때 content_id 로 씁니다 |
external_id | string | 외부 제작 시스템의 멱등 식별자. 없으면 null |
content_type | string | video · text · article · image · carousel |
title | string | 공통 제목 |
body | string | 공통 본문 또는 설명 |
hashtags | array | 공통 해시태그. 문자열 배열입니다 |
language | string | 언어 코드. 등록 때 주지 않으면 ko 입니다 |
platform_metadata | object | 플랫폼별 제목·본문 덮어쓰기. 열쇠는 채널 키, 값은 title · body 를 담은 객체입니다. 넣은 적이 없으면 언제나 빈 객체 {} 로 나옵니다. 배열 [] 이 나오는 경우는 없습니다 |
metadata | object | 제작 시스템 확장 메타데이터. 영상 규격을 보냈으면 production 아래에 duration_seconds·width·height·fps 가 들어 있습니다 |
produced_at | string | 제작 완료 UTC 시각(YYYY-MM-DD HH:MM:SS). 없으면 null |
created_at | string | 등록 시각. UTC 기준 YYYY-MM-DD HH:MM:SS |
updated_at | string | 수정 시각. UTC 기준 YYYY-MM-DD HH:MM:SS |
assets | array | 첨부 목록. 한 줄의 모양은 아래와 같습니다 |
publications | array | 채널별 예약 목록. 한 줄의 모양은 아래와 같습니다 |
assets 의 한 줄
| 필드 | 타입 | 설명 |
|---|---|---|
asset_type | string | MASTER_VIDEO(영상 원본) · THUMBNAIL(썸네일) · CAROUSEL_ITEM(여러 장 중 한 장) |
sort_order | int | 같은 asset_type 이 여럿일 때의 순서입니다. 0부터이고, 이 차례로 올라갑니다. 한 장뿐인 유형은 언제나 0 입니다 |
mime | string | 업로드 때 서버가 판정한 MIME 유형 |
size_bytes | int | 파일 크기(바이트) |
url | string | 그 파일을 받을 수 있는 주소입니다. 수명이 짧습니다 — 저장하거나 캐시하지 말고, 필요할 때 이 API 를 다시 불러 새로 받으세요. 주소를 만들 수 없으면 null 입니다 |
url_expires_in | int | url 이 유효한 시간(초). 지금은 300 입니다. url 이 null 이면 이 값도 null 입니다 |
publications 의 한 줄
| 필드 | 타입 | 설명 |
|---|---|---|
id | int | 예약 ID |
channel | string | 채널 키. youtube · instagram · facebook · threads · tiktok · x · linkedin |
external_id | string | 예약한 계정의 식별자입니다. 같은 플랫폼에 계정이 여럿일 때 어느 계정의 예약인지 이 값으로 가릅니다 |
status | string | SCHEDULED · PUBLISHED · FAILED · CANCELLED |
publish_at | string | 예약 시각. UTC 기준 ISO-8601 입니다 |
visibility | string | public · unlisted · private |
platform_options | object | 플랫폼별 발행 옵션. 없으면 빈 객체 |
1.6 실패
| 코드 | HTTP | 언제 |
|---|---|---|
9912 | 400 | workspace 를 주지 않았습니다 |
1001 | 401 | 헤더가 없거나 토큰이 올바르지 않습니다 |
2000 | 404 | 그 워크스페이스가 없거나, 이 토큰으로 다룰 수 없습니다. external_id 로 찾지 못한 경우도 같습니다 |
5000 | 503 | 콘텐츠 저장소가 준비되지 않았습니다 |
