에러
Video API 엔드포인트의 모든 에러는 동일한 JSON shape를 사용합니다:
{
"error": {
"code": "...",
"message": "..."
}
}HTTP status는 문제의 종류를 나타내며, error.code는 코드에서 분기할 수 있는 안정적인 문자열입니다. 항상 error.message를 파싱하지 말고 error.code를 기준으로 매칭하세요.
에러 코드
references_conflict와 too_many_references는 request body validation errors입니다. 정확한 제한은 비디오 생성을 참조하세요. cancel_not_supported와 cancel_failed는 비디오 취소에 설명되어 있습니다. not_found는 알 수 없는 job과 다른 API key가 소유한 job 모두에 반환되며, 두 경우는 의도적으로 구분할 수 없습니다.
real_person 전처리 오류
제공된 이미지 문제로 real_person: true 이미지 전처리가 실패하면 API는 HTTP 400과 error.code: "invalid_request"를 반환합니다. error.message 끝에는 다음의 안정적인 이유 코드 중 하나와 실패한 참조 위치(예: input_references[0])가 포함됩니다:
{
"error": {
"code": "invalid_request",
"message": "real_person image processing failed — input_references[0]: ... (not_image)"
}
}애플리케이션 분기에서는 계속 error.code를 사용하세요. 이유 코드와 참조 위치는 입력 수정이나 진단에 사용합니다.
402 Insufficient credits
insufficient_credits는 job 생성 시(POST /v1/videos)에만 반환됩니다. 사전 승인이 활성화된 경우, ofox는 job을 수락하기 전에 요청한 resolution과 duration을 기준으로 비용을 추정합니다. 이 예상 비용이 잔액을 초과하면 요청은 즉시 거부됩니다. job 레코드는 생성되지 않으며 아무것도 청구되지 않습니다.
{ "error": { "code": "insufficient_credits", "message": "..." } }insufficient_credits는 Video API가 반환하는 유일한 402 code입니다. 이 단일 code를 처리하고, 잔액을 충전한 뒤 재시도하세요.
429 Rate limiting
rate_limited는 GET /v1/videos/{id}의 per-key polling limit과 upstream rate limits를 모두 포괄합니다. Polling limit에 도달하면 응답에 Retry-After header가 포함됩니다:
HTTP/1.1 429 Too Many Requests
Retry-After: 1
Content-Type: application/json
{ "error": { "code": "rate_limited", "message": "..." } }Retry-After header를 지키고 재시도 전에 back off하세요. 자주 폴링하고 있다면 webhook 알림으로 전환해 ofox가 terminal state를 push하도록 하세요. 이렇게 하면 polling limit을 완전히 피할 수 있습니다. Job 생성(POST)과 취소(DELETE)는 polling limit의 영향을 받지 않습니다.