HANKIRO

개발자 문서

한 키로 시작하기

미디어와 LLM을 같은 인증 방식으로 호출합니다. 실제 연결 상태는 모델 화면에서 확인하세요.
LLM API

LLM 모델 ID 전체 4개 중 현재 4개를 호출할 수 있습니다.

API 키

Bearer 한 키로 미디어와 LLM을 호출합니다.

미디어 실행

미디어 실행 ID 전체 20개 중 현재 17개에 실행 화면이 제공됩니다.

사용량

API 대시보드와 LLM 대시보드.

API 기본 주소

현재 접속한 HANKIRO 주소 뒤에 /api/v1을 붙입니다. 아래 예제의 $SITE_URL에는 사용 중인 HANKIRO 주소를 넣으세요.

인증

키 페이지에서 발급한 Bearer 키를 붙입니다. 실제 키 값을 문서에 적지 마세요.

Authorization: Bearer mh_live_...

허용 IP 제한

키를 발급할 때 호출 서버의 정확한 IPv4 또는 IPv6 주소를 최대 16개 등록할 수 있습니다. 비워두면 모든 IP에서 호출할 수 있으며, CIDR 대역 표기는 지원하지 않습니다. 발급 후에는 목록을 바꿀 수 없으므로 변경이 필요하면 새 키를 발급한 뒤 기존 키를 폐기하세요.

허용 목록과 호출 주소가 다르면 403 IP_NOT_ALLOWED, 신뢰할 수 있는 호출자 IP를 확인할 수 없으면 503 CLIENT_IP_UNAVAILABLE을 반환합니다.

리버스 프록시를 사용하는 경우

HANKIRO 앞에 별도 리버스 프록시나 CDN을 두면 실제 호출자 대신 프록시의 외부 송신 IP가 확인될 수 있습니다. 원본 IP 전달을 신뢰할 수 없는 구성에서는 네트워크 경로와 실제로 식별되는 IP를 먼저 확인한 뒤 제한을 설정하세요.

분당 API 요청 한도

키에 설정한 분당 한도는 그 키로 인증된 모든 Bearer 요청에 적용됩니다. 실행 요청뿐 아니라 입력 오류, 같은 멱등 키의 재요청, 충돌 응답, 작업 상태 조회도 각각 한 번의 요청으로 계산합니다. 로그인 세션으로 보낸 요청은 API 키 한도에 포함되지 않습니다.

한도를 넘으면 429 RATE_LIMITEDRetry-After 헤더가 반환됩니다. 헤더가 안내하는 시간 이후에 호출 빈도를 낮춰 다시 요청하세요. 키의 한도를 0으로 설정하면 분당 제한 없이 요청 수만 기록합니다.

API 키 보안 활동

키 페이지에서 최근 30일 동안의 키 발급·폐기, IP 차단, 호출자 IP 확인 실패, 요청 한도 초과를 확인할 수 있습니다. 같은 키에서 같은 종류로 발생한 활동은 분 단위로 묶어 횟수와 함께 표시하며, 호출자 IP는 전체 주소 대신 일부만 마스킹해 보여줍니다.

선불 예약과 자동 정산

실행 직전에는 표시된 예상 금액이 사용 가능 잔액에서 예약됩니다. 결과가 확정되면 실제 사용액으로 정산되고, 공급사가 호출 전에 명시적으로 거절한 요청은 예약이 해제됩니다. 클라이언트가 작업 조회를 멈춰도 접수 번호가 있는 작업과 저장된 결과는 백그라운드에서 계속 확인합니다.

네트워크 단절처럼 공급사 접수 여부를 확정할 수 없는 경우에는 중복 실행이나 잘못된 환불을 막기 위해 예약을 즉시 해제하지 않습니다. UPSTREAM_INDETERMINATE가 오면 새 요청을 만들지 말고, 기존 task_uuid를 조회하거나 같은 본문과 같은 Idempotency-Key로 상태를 확인하세요.

미디어 실행

영상 생성은 수분이 걸릴 수 있으므로 queued 또는 processing 동안 지수 백오프로 작업을 조회하세요. 완료된 영상은 output.video.url의 private signed URL로 반환됩니다. 주소는 1시간 뒤 만료되므로 URL 자체를 장기 저장하지 말고 task_uuid를 다시 조회해 새 주소를 받으세요.

POST $SITE_URL/api/v1/run/google/veo3.1/text-to-video
Authorization: Bearer mh_live_...
Idempotency-Key: unique-request-key
{ "input": { "prompt": "..." } }

GET $SITE_URL/api/v1/run/tasks/{task_uuid}

LLM

GET $SITE_URL/api/v1/llm/models
Authorization: Bearer mh_live_...

POST $SITE_URL/api/v1/llm/v1/chat/completions
Authorization: Bearer mh_live_...
Idempotency-Key: unique-request-key
{ "model": "gemini-3.1-flash-lite", "messages": [{"role":"user","content":"안녕"}] }
채팅에서 API 문서 열기

Error contract

오류 처리

실패 응답은 항상 같은 error 봉투를 사용하며, 오류별 복구 정보가 최상위 필드로 추가될 수 있습니다. 분기에는 번역될 수 있는 message가 아니라 안정적인 error.code를 사용하세요.

{
  "error": {
    "code": "MODEL_NOT_CONNECTED",
    "message": "이 모델은 카탈로그에 있지만 현재 호출 연결 대상이 아닙니다."
  }
}
선불 잔액이 부족한 경우

402 INSUFFICIENT_FUNDS에는 currency, available_krw, required_krw, shortfall_krw가 함께 반환됩니다. 잔액 정보가 담긴 응답은 Cache-Control: private, no-store로 전달됩니다.

{
  "error": {
    "code": "INSUFFICIENT_FUNDS",
    "message": "사용 가능한 선불 원화 잔액이 부족합니다."
  },
  "currency": "KRW",
  "available_krw": 1200,
  "required_krw": 1800,
  "shortfall_krw": 600
}
처리 중인 멱등 요청

REQUEST_IN_PROGRESS가 오면 Retry-After 헤더만큼 기다린 뒤, 원래 본문과 같은 Idempotency-Key로 다시 요청하세요. 새 키를 만들면 같은 작업이 중복 실행될 수 있습니다.

AUTH_REQUIREDHTTP 401수정 후 재요청
의미
인증 정보가 없거나 유효하지 않습니다.
고객 조치
Bearer API 키 또는 로그인 세션을 확인하세요.
재시도
인증 정보를 고친 뒤 다시 요청하세요.
FORBIDDENHTTP 403재시도 안 함
의미
이 리소스에 접근할 권한이 없습니다.
고객 조치
리소스 소유자와 API 키 권한을 확인하세요.
재시도
권한이 바뀌기 전에는 반복 요청하지 마세요.
MODEL_FORBIDDENHTTP 403재시도 안 함
의미
이 API 키로 해당 모델을 호출할 수 없습니다.
고객 조치
키의 허용 모델을 확인하거나 허용된 모델을 선택하세요.
재시도
같은 키와 모델로 반복 요청하지 마세요.
IP_NOT_ALLOWEDHTTP 403재시도 안 함
의미
이 API 키에 허용되지 않은 IP 주소에서 요청했습니다.
고객 조치
키에 등록한 서버의 고정 출구 IP를 확인하거나 새 키를 발급하세요.
재시도
허용 IP나 호출 위치가 바뀌기 전에는 반복 요청하지 마세요.
CLIENT_IP_UNAVAILABLEHTTP 503백오프
의미
요청의 클라이언트 IP를 안전하게 확인할 수 없습니다.
고객 조치
요청 경로를 확인하고 잠시 뒤 다시 시도하세요.
재시도
백오프 후 제한적으로 재시도하고 반복되면 지원팀에 알려주세요.
MODEL_NOT_FOUNDHTTP 404수정 후 재요청
의미
요청한 정확한 모델 ID를 찾을 수 없습니다.
고객 조치
모델 목록에서 정확한 model_id를 복사해 사용하세요.
재시도
모델 ID를 고친 뒤 새 요청을 보내세요.
TASK_NOT_FOUNDHTTP 404재시도 안 함
의미
요청한 작업을 찾을 수 없습니다.
고객 조치
실행 응답에서 받은 task_uuid와 계정을 확인하세요.
재시도
같은 잘못된 작업 번호로 반복 요청하지 마세요.
NOT_FOUNDHTTP 404수정 후 재요청
의미
요청한 리소스를 찾을 수 없습니다.
고객 조치
리소스 식별자와 요청 주소를 확인하세요.
재시도
식별자를 고친 뒤 다시 요청하세요.
INVALID_JSONHTTP 400수정 후 재요청
의미
요청 본문이 올바른 JSON이 아닙니다.
고객 조치
Content-Type과 JSON 문법을 확인하세요.
재시도
JSON을 고친 뒤 다시 요청하세요.
INVALID_INPUTHTTP 400수정 후 재요청
의미
요청 입력값이 올바르지 않습니다.
고객 조치
필수 필드, 타입, 허용 범위를 확인하세요.
재시도
입력을 고친 뒤 다시 요청하세요.
IDEMPOTENCY_KEY_REQUIREDHTTP 400수정 후 재요청
의미
Idempotency-Key 헤더가 필요합니다.
고객 조치
한 실행을 대표하는 고유 키를 8~200자 ASCII로 보내세요.
재시도
키를 추가한 뒤 요청하세요.
INVALID_IDEMPOTENCY_KEYHTTP 400수정 후 재요청
의미
Idempotency-Key 형식이 올바르지 않습니다.
고객 조치
공백 없는 ASCII 8~200자로 키를 만드세요.
재시도
키 형식을 고친 뒤 요청하세요.
IDEMPOTENCY_KEY_REUSEDHTTP 409수정 후 재요청
의미
같은 Idempotency-Key가 다른 요청 본문에 사용되었습니다.
고객 조치
원래 본문에는 같은 키를, 다른 작업에는 새 키를 사용하세요.
재시도
키와 본문의 대응을 바로잡은 뒤 요청하세요.
REQUEST_IN_PROGRESSHTTP 409같은 멱등 키
의미
같은 멱등 요청이 아직 처리 중입니다.
고객 조치
Retry-After만큼 기다린 뒤 같은 본문과 같은 Idempotency-Key로 확인하세요.
재시도
Retry-After 이후 반드시 같은 Idempotency-Key로 재요청하세요.
INSUFFICIENT_FUNDSHTTP 402재시도 안 함
의미
사용 가능한 선불 원화 잔액이 부족합니다.
고객 조치
지갑 잔액을 확보하거나 예상 금액이 낮은 모델을 선택하세요.
재시도
잔액이 바뀌기 전에는 같은 요청을 반복하지 마세요.
RESERVATION_FAILEDHTTP 503백오프
의미
사용 금액 예약을 시작하지 못했습니다.
고객 조치
요청 본문과 Idempotency-Key를 보존하세요.
재시도
잠시 기다린 뒤 같은 키로 제한적으로 재시도하세요.
DISPATCH_NOT_STARTEDHTTP 503백오프
의미
예약된 요청이 공급사 호출 전에 안전하게 종료되었습니다.
고객 조치
기존 키는 종료 결과를 재생하므로 새 Idempotency-Key로 요청하세요.
재시도
잠시 기다린 뒤 같은 본문을 새 Idempotency-Key로 제한적으로 재시도하세요.
MODEL_NOT_CONNECTEDHTTP 503재시도 안 함
의미
이 모델은 카탈로그에 있지만 현재 호출 연결 대상이 아닙니다.
고객 조치
모델 화면에서 호출 가능 상태인 정확한 모델 ID를 선택하세요.
재시도
연결 상태가 바뀌기 전에는 반복 재시도해도 해결되지 않습니다.
PROVIDER_NOT_CONFIGUREDHTTP 503백오프
의미
이 모델의 공급사 연결을 현재 이용할 수 없습니다.
고객 조치
호출 가능한 다른 모델을 선택하거나 연결 상태 변경을 기다리세요.
재시도
긴 간격으로 상태를 확인하고 무한 재시도하지 마세요.
UPSTREAM_FAILEDHTTP 502백오프
의미
공급사 요청 처리에 실패했습니다.
고객 조치
작업 상태와 입력값을 확인하세요.
재시도
지수 백오프로 제한적으로 재시도하세요.
UPSTREAM_REJECTEDHTTP 422수정 후 재요청
의미
공급사가 요청을 거절했습니다.
고객 조치
모델별 입력 제한과 정책을 확인하세요.
재시도
입력을 고치기 전에는 반복 요청하지 마세요.
UPSTREAM_TIMEOUTHTTP 504같은 멱등 키
의미
공급사 응답 시간이 초과되었습니다.
고객 조치
기존 작업 또는 멱등 요청 상태를 먼저 확인하세요.
재시도
같은 Idempotency-Key로 상태를 확인하세요.
UPSTREAM_INDETERMINATEHTTP 502상태 조회
의미
공급사 접수 여부를 확정할 수 없습니다.
고객 조치
새 요청을 만들지 말고 기존 작업과 멱등 요청 상태를 확인하세요.
재시도
기존 task_uuid를 조회하거나 같은 Idempotency-Key로 확인하세요.
ARTIFACT_STORAGE_FAILEDHTTP 502같은 멱등 키
의미
생성 결과 파일을 안전하게 저장하지 못했습니다.
고객 조치
기존 요청 상태를 확인하고 새 키로 중복 실행하지 마세요.
재시도
같은 Idempotency-Key로 최종 상태를 확인하세요.
KEY_COUNTER_FAILEDHTTP 503백오프
의미
API 키 사용 기록을 갱신하지 못했습니다.
고객 조치
요청 본문과 Idempotency-Key를 보존하세요.
재시도
잠시 기다린 뒤 같은 키로 제한적으로 재시도하세요.
TASK_STATE_MISSINGHTTP 500상태 조회
의미
작업 상태를 확인할 수 없습니다.
고객 조치
task_uuid와 발생 시각을 보존해 지원팀에 전달하세요.
재시도
짧은 간격의 무한 재시도 대신 제한적으로 상태를 확인하세요.
REPLAY_STATE_INVALIDHTTP 500재시도 안 함
의미
저장된 멱등 요청 결과를 읽을 수 없습니다.
고객 조치
Idempotency-Key와 발생 시각을 보존해 지원팀에 전달하세요.
재시도
새 키로 같은 작업을 다시 실행하지 마세요.
TASK_FAILEDHTTP 200재시도 안 함
의미
비동기 작업이 실패 상태로 종료되었습니다.
고객 조치
error.code를 확인하고 필요한 경우 입력이나 모델을 바꾸세요.
재시도
원인을 고치기 전에는 새 작업을 반복 생성하지 마세요.
INVALID_USAGE_RANGEHTTP 400수정 후 재요청
의미
사용량 조회 기간이 올바르지 않습니다.
고객 조치
허용 기간과 시작일·종료일 순서를 확인하세요.
재시도
기간을 고친 뒤 다시 요청하세요.
INVALID_USAGE_CURSORHTTP 400수정 후 재요청
의미
사용량 페이지 커서가 올바르지 않습니다.
고객 조치
직전 응답의 next_cursor를 수정 없이 사용하세요.
재시도
유효한 커서로 다시 요청하세요.
INVALID_USAGE_FILTERHTTP 400수정 후 재요청
의미
사용량 필터가 올바르지 않습니다.
고객 조치
문서에 표시된 필터 값과 형식을 사용하세요.
재시도
필터를 고친 뒤 다시 요청하세요.
EXPORT_TOO_LARGEHTTP 422수정 후 재요청
의미
한 번에 내보낼 사용량 데이터가 너무 큽니다.
고객 조치
조회 기간을 나눠 여러 파일로 내보내세요.
재시도
더 짧은 기간으로 다시 요청하세요.
SERVICE_UNAVAILABLEHTTP 503백오프
의미
요청한 기능을 일시적으로 이용할 수 없습니다.
고객 조치
요청과 멱등 키를 보존하고 잠시 기다리세요.
재시도
지수 백오프로 제한적으로 재시도하세요.
CONFLICTHTTP 409수정 후 재요청
의미
현재 리소스 상태와 요청이 충돌합니다.
고객 조치
최신 상태를 확인한 뒤 요청을 다시 구성하세요.
재시도
상태를 반영한 요청으로 다시 시도하세요.
PAYLOAD_TOO_LARGEHTTP 413수정 후 재요청
의미
요청 본문이 허용 크기를 넘었습니다.
고객 조치
입력 또는 파일 크기를 줄이세요.
재시도
크기를 줄인 뒤 다시 요청하세요.
RATE_LIMITEDHTTP 429백오프
의미
허용된 요청 속도를 넘었습니다.
고객 조치
Retry-After를 확인하고 호출 빈도를 낮추세요.
재시도
Retry-After 이후 백오프를 적용해 재시도하세요.
INTERNAL_ERRORHTTP 500백오프
의미
요청을 처리하는 중 내부 오류가 발생했습니다.
고객 조치
요청 식별 정보와 발생 시각을 보존해 지원팀에 전달하세요.
재시도
잠시 뒤 제한적으로 재시도하고 반복되면 중단하세요.