API 레퍼런스
공개 REST 경로, 요청, 오류 봉투입니다.개요
공개 REST는 이미지, 영상, 오디오 생성을 개인 키로 접수하고 작업을 조회·취소합니다. 생성 경로는 모두
/v1로 시작합니다. 서버 주소는 이 문서에 적지 않습니다. 코드에서는 환경변수로 받으세요.이 문서의 경로, 필드, 한도, 오류는 서버 계약과 공개 라우트를 하나씩 대조해 적었습니다. 여기에 없는 경로는 공개 API가 아닙니다.
인증
Authorization: Bearer <개인 키> 헤더를 보냅니다. 키는 로그인과 키에서 만들고, 쓰는 기능에 맞는 권한을 허용해야 합니다.| 경로 | 필요한 기능 권한 |
|---|---|
/v1/models/image, /v1/images… | 이미지 생성 |
/v1/models/video, /v1/videos…, /v1/models/audio, /v1/audio… | 영상 생성 |
POST /assets | 에셋 업로드 |
- 인증 헤더는 하나만 보냅니다.
Authorization과X-Api-Key를 함께 보내면 401입니다. - 키가 틀렸거나 만료·폐기됐거나 권한이 모자란 경우는 모두 같은 401입니다. 이유를 구분해 알려 주지 않습니다.
- 계정의 연령 확인이 끝나지 않았으면 403입니다.
- 모든
/v1응답에Cache-Control: no-store가 붙습니다. - 키별 지출 한도가 걸려 있으면 잔액이 있어도 한도를 넘는 접수는 거절됩니다. 오류와 지출을 보세요.
경로
/v1 아래 공개 경로는 이 표가 전부입니다. 본문이 있는 요청은 Content-Type: application/json입니다.| 메서드 | 경로 | 설명 | 성공 |
|---|---|---|---|
| GET | /v1/models/image | 이미지 모델, 옵션 값 목록, 기본값, 가격 | 200 |
| POST | /v1/images | 이미지 접수 | 202 |
| GET | /v1/images | 내 이미지 작업 목록 | 200 |
| GET | /v1/images/:id | 이미지 작업 조회 | 200 |
| POST | /v1/images/:id/cancel | 이미지 작업 취소 | 200 |
| GET | /v1/models/video | 영상 모델과 체리 견적표 | 200 |
| POST | /v1/videos | 영상 접수 | 202 (이미 접수된 키는 200) |
| GET | /v1/videos | 내 영상 작업 목록 | 200 |
| GET | /v1/videos/:id | 영상 작업 조회 | 200 |
| POST | /v1/videos/:id/cancel | 영상 작업 취소 | 200 |
| GET | /v1/models/audio | 오디오 모델과 곡당 체리 | 200 |
| POST | /v1/audio | 오디오 접수 | 202 |
| GET | /v1/audio/:id | 오디오 작업 조회 | 200 |
| POST | /v1/audio/:id/cancel | 오디오 작업 취소 | 200 |
| POST | /assets | 파일 업로드(멀티파트). 레시피의 업로드한 파일 쓰기 | 201 |
오디오 목록 경로는 없습니다. 접수 응답의 작업 id를 저장해 두세요.
웹훅을 관리하는 경로(
/webhooks/endpoints…)와 사용량 경로(/usage/developer/…)는 로그인한 사람의 화면이 쓰는 경로입니다. 개인 키로는 부를 수 없습니다. 웹훅을 보세요.모델 조회 경로는 웹 입력창이 읽는 것과 같은 모델 정의를 돌려줍니다. 옵션 값의 목록, 기본값, 가격이 한 응답에 있습니다. 생략한 옵션은 모델 정의의 기본값이 쓰이고, 모델이 지원하지 않는 값은 조용히 바뀌지 않고 400으로 거절됩니다.
접수 요청
세 요청 모두 모르는 필드를 보내면 무시하지 않고 400으로 거절합니다. 본문 크기는 이미지 64KiB, 영상과 오디오 16KiB까지입니다.
이미지
| 필드 | 필수 | 뜻 |
|---|---|---|
modelId | 예 | GET /v1/models/image의 모델 id |
prompt | 예 | 1~4,000자 |
negativePrompt | 아니요 | 1~4,000자. 지원하는 모델에서만 |
aspectRatio, resolution, quality, style | 아니요 | 모델이 지원하는 값. 생략하면 모델 기본값 |
candidateCount | 아니요 | 1~12. 기본 1. 모델의 maxCandidates를 넘으면 거절 |
background | 아니요 | auto 또는 transparent. 투명 배경을 지원하는 모델에서만 |
seed | 아니요 | 0~2,147,483,647. 시드를 지원하는 모델에서만 |
referenceAssets | 아니요 | { "assetId", "revision" } 배열. 최대 5개, 모델의 한도 안에서 |
maxCherry | 예 | 감수할 체리 상한. 1~10,000,000 정수 |
idempotencyKey | 예 | 8~128자 |
공개 경로에서는 성인 생성을 열지 않습니다.
영상
영상은 캔버스 문서의 한 revision이 요청의 기준입니다. 모델, 길이, 해상도는 문서가 정하고 서버가 서빙 중인 카탈로그로 검증합니다. 문서를 접수하려면 그 문서의 편집 권한이 있어야 합니다. 보기 전용이면 403, 멤버가 아니면 404입니다.
| 필드 | 필수 | 뜻 |
|---|---|---|
documentId | 예 | 캔버스 문서 id |
revision | 예 | 양의 정수. 문서의 revision |
candidateCount | 아니요 | 1~12. 기본 1. 후보마다 작업이 하나씩 생깁니다 |
tier | 아니요 | draft(더 싼 초안) 또는 final(본 생성). 기본 final |
draftJobId | 아니요 | 본 생성을 이어 갈 초안 작업 id |
maxCherry | 예 | 감수할 체리 상한. 후보 전체의 합계와 비교합니다 |
idempotencyKey | 예 | 8~128자 |
같은 입력으로 끝난 초안이 있는데
draftJobId 없이 final을 보내면 400입니다. 메시지가 초안 작업 id를 알려 줍니다.오디오
곡 수 외의 옵션은 공급이 공표하지 않아 받지 않습니다.
| 필드 | 필수 | 뜻 |
|---|---|---|
modelId | 예 | GET /v1/models/audio의 모델 id |
prompt | 예 | 1~2,000자 |
count | 아니요 | 곡 수. 1, 2, 4 중 하나. 생략하면 모델 기본값 |
maxCherry | 예 | 감수할 체리 상한. 곡 수만큼의 합계와 비교합니다 |
idempotencyKey | 예 | 8~128자 |
곡마다 작업이 하나씩 생겨
jobs에 담깁니다.금액 상한과 멱등
maxCherry는 이 요청이 감수하는 체리 상한입니다. 서버가 방금 계산한 견적이 이 값을 넘으면 아무것도 만들지 않고 400으로 거절합니다. 이때details.required_cherry가 견적입니다. 생략하면 거절됩니다. 기본값은 없습니다.idempotencyKey는 8자 이상 128자 이하이고,Idempotency-Key헤더로도 보낼 수 있습니다. 이미지·영상·오디오 접수와 이미지 취소에서 됩니다. 본문과 헤더를 둘 다 보내면 같은 값이어야 하고, 다르면 400입니다.- 같은 키에 같은 본문을 다시 보내면 기존 작업을 돌려줍니다. 같은 키에 다른 본문은 409이고
details.conflict_reason이idempotency_key_reused입니다. - 영상은 이미 끝나 환불된 요청의 키를 다시 쓰면 409입니다. 새 키로 접수하세요.
- 후보가 여럿인 영상은 첫 후보가 원래 키를 쓰고 다음 후보부터 서버가 키를 파생합니다. 같은 요청을 다시 보내면 같은 작업들이 돌아옵니다.
- 가격이 확정되지 않은 모델과 옵션 조합은 접수되지 않습니다. 영상은 422
PRICE_UNPUBLISHED와details.price_reason, 이미지는 400입니다.
작업 응답
접수와 조회가 돌려주는 모양은 종류마다 다릅니다.
| 호출 | 응답 본문 |
|---|---|
POST /v1/images | 작업 객체 그대로(id, status, …) |
GET /v1/images/:id | { job, outputs, poll_after_seconds? } |
POST /v1/images/:id/cancel | { job } |
GET /v1/images | { items, nextCursor } |
POST /v1/videos | { jobs } |
GET /v1/videos/:id, 취소 | { job } |
GET /v1/videos | { items, next_cursor } |
POST /v1/audio | { jobs } |
GET /v1/audio/:id | { job, result? } |
POST /v1/audio/:id/cancel | { job } |
상태는 아래와 같습니다. 끝난 상태는 이미지
done·failed, 영상과 오디오 succeeded·failed입니다.| 종류 | 상태 |
|---|---|
| 이미지 | queued, running, done, failed |
| 영상 | queued, submitting, submission_uncertain, processing, succeeded, failed |
| 오디오 | queued, running, succeeded, failed |
작업 객체의 주요 필드입니다. 이미지는 카멜케이스, 영상과 오디오는 스네이크케이스입니다.
| 종류 | 주요 필드 |
|---|---|
| 이미지 | id, status, request, priceSnapshot, chargedAmount, cancelRequested, createdAt, updatedAt. 끝나면 done에 result, failed에 error(code, message, retryable), doneAt |
| 영상 | id, document, status, failure, result, billing, reserved_cherry, tier, stalled, created_at, updated_at |
| 오디오 | id, model_id, document_id, node_id, status, failure, billing, created_at, updated_at |
- 이미지 조회는 완료 시 후보마다 읽기 링크(
outputs)를 함께 줍니다. 항목은asset,url,expiresAt,expiresInSeconds(900)입니다. - 오디오 조회는 완료 시
result에 읽기 링크를 줍니다. 항목은asset,kind,url,expiresAt,expiresInSeconds(900)입니다. - 영상 작업의
result는 결과 자산 참조이고url은 조회할 때마다 새로 서명됩니다. - 읽기 링크는 15분 동안 쓸 수 있습니다. 만료되면 다시 조회합니다.
- 삭제된 자산은 링크 없이 빠집니다.
failure와error의code는 닫힌 목록이고 환불 규칙은 오류와 지출에 있습니다.- 영상의
stalled가true면 실행 제한 시간(접수 후 45분)을 넘겼다는 뜻입니다.
기다리는 시간
진행 중인 작업을 다시 조회하기까지 기다릴 초입니다. 이보다 촘촘히 부르면 읽기 한도만 소모합니다.
| 종류 | 어디에 | 값 |
|---|---|---|
| 이미지 | 응답 최상위 poll_after_seconds | 5 |
| 오디오 | job.poll_after_seconds | 10 |
| 영상 | 응답에 없음 | 10초 간격을 권합니다 |
목록
- 최신순이고
cursor로 다음 쪽을 읽습니다. 이미지는nextCursor, 영상은next_cursor이며null이면 마지막입니다. limit은 1~100 정수이고 기본 50입니다. 범위 밖이면 400입니다.- 이미지 목록은
status(queued,running,done,failed)로 거를 수 있습니다. - 이미지 목록 항목은 요약입니다. 프롬프트는 앞 120자만 담깁니다. 전체는 단건 조회로 읽습니다.
- 내가 소유한 작업만 보입니다. 없는 작업과 남의 작업은 모두 404입니다.
모델 조회 응답
| 경로 | 응답 | 눈여겨볼 필드 |
|---|---|---|
GET /v1/models/image | { models, defaults } | 모델마다 id, label, options, capabilities(aspectRatios, resolutions, qualities, styles, maxCandidates, maxReferenceAssets, supportsNegativePrompt, supportsSeed), price(billing, cherry, lines) |
GET /v1/models/video | { models } | 모델마다 supported_resolutions, supported_aspect_ratios, supported_durations, cherry_quotes, priceable, price_unpublished_reason |
GET /v1/models/audio | { default_model_id, models } | 모델마다 id, label, options, cherry_per_track(환율을 못 얻으면 null) |
이미지는
price.cherry가 null인 모델을 접수할 수 없습니다(400). 영상은 priceable이 false인 모델도 목록에 보이지만 접수하면 422입니다.취소
| 종류 | 규칙 |
|---|---|
| 이미지 | 본문 { "idempotencyKey": "…" }가 필요합니다(Idempotency-Key 헤더로도 가능). 대기 중이면 바로 취소됩니다. 진행 중이면 취소 요청만 기록되고(cancelRequested) 작업이 멈출 때 정산됩니다. 이미 끝난 작업은 409 |
| 영상 | 본문 없음. 대기(queued) 중인 작업만 취소됩니다. 보류한 체리가 환불됩니다 |
| 오디오 | 본문 없음. 대기 중인 작업만 취소됩니다. 전액 환불됩니다 |
이미 시작됐거나 끝난 작업은 409이고
details.cancel_reason이 already_started입니다. 이미 취소된 작업을 다시 취소하면 같은 응답을 돌려줍니다.요청 한도
개인 키로 부르는 요청은 사용자별 시간당 한도를 셉니다. 조회(GET)는 읽기, 그 밖(접수·취소·업로드)은 쓰기입니다. 두 버킷은 서로를 먹지 않습니다.
| 기능 권한 | 읽기 | 쓰기 |
|---|---|---|
| 이미지 생성 | 3,000 | 300 |
| 영상 생성(영상·오디오 경로 포함) | 3,000 | 300 |
| 에셋 업로드 | 해당 없음 | 120 |
한도 응답 헤더와 429 구별법은 오류와 지출에 있습니다. 이 시간당 한도는 개인 키로 부르는 요청에만 적용됩니다.
접수에는 이 한도와 별개로 동시에 진행할 수 있는 작업 수와 시간당·하루 접수 수 제한이 있습니다. 값은 기본값이고 서버 설정으로 달라질 수 있습니다. 걸리면 429
RATE_LIMITED이고 details.limit_kind가 image_active, video_active, audio_active, image_daily, video_hourly 중 하나입니다.limit_kind | 뜻 |
|---|---|
image_active | 진행 중인 이미지 작업이 1개를 넘을 수 없습니다 |
video_active | 진행 중인 영상 작업은 24개까지입니다 |
audio_active | 진행 중인 오디오 작업은 8개까지입니다 |
image_daily | 하루에 접수할 수 있는 이미지 작업은 10개까지입니다(서버 시각 기준 하루). 실패한 작업은 세지 않습니다 |
video_hourly | 영상 작업은 시간당 60개까지 접수됩니다 |
오류
모든 오류는 같은 봉투입니다.
오류 봉투 — json{"error": {"code": "INVALID_INPUT","message": "...","requestId": "...","details": {}}}