# Grok Imagine Image Quality — /images/generations

Grok Imagine Image(고품질) 이미지 생성 API로, 표준보다 디테일이 더 풍부합니다. 비동기 작업이며, 제출하면 작업 ID가 바로 돌아오고(HTTP 202) 이후 결과를 조회하거나 웹훅으로 받습니다. 1K와 2K 두 등급만 있으며, 장당 과금되고 실패하면 과금되지 않습니다.

**엔드포인트:** `POST https://kovapi.com/v1/images/generations`

## 빠른 시작

세 단계면 됩니다: 작업 제출 → 결과 조회 → 이미지 링크 받기. YOUR_API_KEY를 내 키로 바꾸면 아래 명령을 그대로 실행할 수 있습니다.

**1단계 · 제출(작업 ID를 바로 돌려줍니다, HTTP 202)**

```
curl https://kovapi.com/v1/images/generations \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model": "grok-imagine-image-quality", "prompt": "새벽녘 눈 덮인 숲속의 붉은 여우, 사실적인 사진", "size": "16:9", "resolution": "2K"}'
```

응답(HTTP 202)

```
{
  "id": "img_7f3c9a1e2b4d6f8a0c1e3b5d",
  "object": "image.generation.job",
  "status": "queued",
  "created": 1791281400,
  "model": "grok-imagine-image-quality"
}
```

**2단계 · `status`가 `succeeded` 또는 `failed`가 될 때까지 2~3초마다 조회**

```
curl https://kovapi.com/v1/images/jobs/img_7f3c9a1e2b4d6f8a0c1e3b5d \
  -H "Authorization: Bearer YOUR_API_KEY"
```

성공했을 때의 응답

```
{
  "id": "img_7f3c9a1e2b4d6f8a0c1e3b5d",
  "object": "image.generation.job",
  "status": "succeeded",
  "created": 1791281400,
  "model": "grok-imagine-image-quality",
  "data": [
    {"url": "https://img.kovapi.com/i/2be8cd16d37f3a4b9c0e1f2a3b4c5d6e.png"}
  ],
  "usage": {"images": 1, "resolution": "2K", "model": "grok-imagine-image-quality"}
}
```

**3단계 · `data[0].url`이 이미지(PNG)입니다. 15일 동안 보관되므로 더 오래 쓰려면 내 저장소에 내려받아 두세요.**

**전체 예제(Python: 제출 → 대기 → 로컬에 저장)**

```
import time
import requests

BASE = "https://kovapi.com/v1"
HEADERS = {"Authorization": "Bearer YOUR_API_KEY"}

# 1. 제출
job = requests.post(f"{BASE}/images/generations", headers=HEADERS, json={
    "model": "grok-imagine-image-quality",
    "prompt": "새벽녘 눈 덮인 숲속의 붉은 여우, 사실적인 사진",
    "size": "16:9",
    "resolution": "2K",
}).json()
if "error" in job:
    raise SystemExit(job["error"]["message"])

# 2. 끝날 때까지 3초마다 조회
while job["status"] not in ("succeeded", "failed"):
    time.sleep(3)
    job = requests.get(f"{BASE}/images/jobs/{job['id']}", headers=HEADERS).json()

# 3. 이미지 내려받기
if job["status"] == "succeeded":
    url = job["data"][0]["url"]
    with open("grok-imagine-image-quality.png", "wb") as f:
        f.write(requests.get(url).content)
    print("saved", url)
else:
    print("failed:", job["error"]["code"], job["error"]["message"])
```

## 인증
```
Authorization: Bearer YOUR_API_KEY
Content-Type: application/json
```

## 요청 파라미터

`POST /v1/images/generations`의 요청 본문(JSON):

| 파라미터 | 타입 | 필수 | 설명 |
| --- | --- | --- | --- |
| model | string | 예 | 모델 ID: `grok-imagine-image-quality`. |
| prompt | string | 예 | 그릴 내용. 이미지-투-이미지에서는 무엇을 어떻게 바꿀지 적으세요. |
| size | string | 아니오 | 비율. 예: `16:9`(권장). `1536x1024`처럼 픽셀 크기로도 쓸 수 있습니다. 생략하면 1:1 정사각형이 나옵니다. |
| resolution | string | 아니오 | 등급: `1K`(기본값), `2K`. 4K는 없습니다. |
| image / images | string / array | 아니오 | 참조 이미지. 넣으면 이미지-투-이미지가 됩니다. 한 장은 `image`, 여러 장은 `images`(최대 8장)에 넣으며, 각각 공개 이미지 URL, data: URI, base64 중 하나로 보낼 수 있습니다. |
| n | integer | 아니오 | 이미지 장수. 넣지 않는 것을 권장합니다. 여러 장이 필요하면 작업 여러 개를 동시에 제출하세요. `n`을 넣으면 n장 분의 크레딧을 미리 예약하고, 실제로 전달된 장수만큼 과금합니다. |
| callback_url | string | 아니오 | 작업이 끝나면 결과를 보낼 주소. 아래 웹훅 부분을 보세요. |

그 밖의 OpenAI 파라미터(`quality`, `background`, `output_format`, `response_format` 등)는 가격에 영향을 주지 않으며 적용된다는 보장도 없습니다. 결과는 항상 PNG이며 `url`로 돌려줍니다.

## 가격

장당 과금이며 가격은 등급으로만 정해집니다. 비율이나 텍스트-투-이미지 / 이미지-투-이미지 여부와는 관계없습니다. 제출할 때 등급 가격만큼 예약되고, 작업이 실패하면 전액 환불됩니다. 1크레딧 = $0.005.

| 등급 | 장당 크레딧 | 장당 가격(USD) |
| --- | --- | --- |
| 1K | 2 | $0.01 |
| 2K | 2 | $0.01 |

## 비율, 해상도와 출력 크기

비율은 `size`에, 등급은 `resolution`에 넣습니다. 이미지는 표의 크기 그대로 전달됩니다. 긴 변은 등급으로 정해지고 다른 변은 비율에 따라 계산됩니다. 표에 없는 비율도 같은 규칙으로 쓸 수 있습니다.

| 비율 | 1K | 2K |
| --- | --- | --- |
| 1:1 | 1024x1024 | 2048x2048 |
| 3:4 | 768x1024 | 1536x2048 |
| 2:3 | 683x1024 | 1365x2048 |
| 9:16 | 576x1024 | 1152x2048 |
| 4:3 | 1024x768 | 2048x1536 |
| 3:2 | 1024x683 | 2048x1365 |
| 16:9 | 1024x576 | 2048x1152 |

- 모델은 가장 가까운 가로형, 세로형, 정사각형 구도로 그리고, 게이트웨이가 이를 가운데 기준으로 잘라 표의 크기로 맞춥니다. 그래서 비율이 3:2, 2:3, 1:1에서 멀수록 가장자리가 더 많이 잘립니다. 게이트웨이는 피사체가 잘리지 않고 가운데에 오도록 프롬프트 뒤에 비율을 설명하는 문장(영어)을 덧붙입니다. 꼭 남아야 하는 내용은 가장자리에서 떨어진 곳에 두세요.

- `size`에는 픽셀 크기(예: `1536x1024`)도 쓸 수 있으며, 이미지는 그 크기 그대로 전달됩니다(긴 변이 4096을 넘으면 비율을 유지한 채 줄입니다). 이때 등급은 `resolution`으로 정해지고, `resolution`이 없으면 긴 변으로 정해집니다: 1536 이하는 1K, 2048 이하는 2K, 그보다 크면 4K. `resolution`은 등급을 올릴 수만 있고 내릴 수는 없으며, 전달 크기도 바꾸지 않습니다. 그러니 작은 크기와 높은 등급을 함께 쓰지 마세요.

- 이 모델은 1K와 2K만 지원합니다. 4K를 요청하면(`resolution: "4K"` 또는 긴 변이 2048을 넘는 `size`) 바로 400 `unsupported_resolution`으로 거절되며 과금되지 않습니다. 2K를 원하면 `resolution: "2K"`를 보내세요.

## 이미지-투-이미지와 참조 이미지

- `image`(한 장) 또는 `images`(여러 장, 최대 8장이며 8장을 넘는 것은 쓰지 않음)를 보내면 이미지-투-이미지로 실행됩니다. 무엇을 어떻게 바꿀지는 프롬프트에 적으세요. `POST /v1/images/edits`도 같은 파라미터를 받습니다.

- 두 엔드포인트 모두 JSON 본문만 받고 multipart 파일 업로드는 받지 않습니다. 그래서 OpenAI SDK의 `images.edit()`은 그대로 쓸 수 없으니, 아래 예시처럼 링크나 base64를 보내세요.

- 참조 이미지는 각각 공개 이미지 URL(http 또는 https), data: URI, 순수 base64 중 하나로 보낼 수 있습니다. 한 장당 16MB 이하이며, JPEG, PNG, WebP 같은 일반적인 형식이면 됩니다.

- URL은 이미지 파일 자체를 내려받을 수 있어야 합니다. 웹 페이지, 로그인이 필요한 주소, 핫링크 방지가 걸린 주소는 안 됩니다. 읽을 수 없는 참조 이미지는 제출할 때 바로 400으로 거절되며, 몇 번째 이미지인지와 이유가 함께 표시됩니다. 작업은 만들어지지 않고 과금되지 않습니다.

- 출력 비율은 참조 이미지가 아니라 `size`로 정해집니다. 원본 비율을 유지하려면 `size`를 원본과 같은 비율로 지정하세요.

- 참조 이미지는 당사가 대신 호스팅하며 7일 동안 보관합니다.

**참조 이미지 2장으로 이미지-투-이미지**

```
curl https://kovapi.com/v1/images/generations \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model": "grok-imagine-image-quality", "prompt": "인물은 그대로 두고 배경을 따뜻한 줄조명이 걸린 밤 해변으로 바꾸기", "images": ["https://example.com/people.jpg", "https://example.com/beach.jpg"], "size": "3:4", "resolution": "2K"}'
```

## 작업 상태와 응답 필드

`GET /v1/images/jobs/{id}`는 아래 상태를 돌려줍니다. 각 필드의 설명은 [비동기 작업](https://docs.kovapi.com/ko/guide/async-jobs#fields)에 있습니다. 2~3초마다 조회하거나 웹훅을 쓰세요.

| 상태 | 의미 |
| --- | --- |
| queued | 대기 중. `queue_position`(앞에 있는 작업 수)과 `eta_seconds`(예상 대기 시간)가 함께 옵니다. |
| processing | 생성 중. |
| succeeded | 완료. 결과는 `data[0].url`, 과금 내역은 `usage`에 있습니다. |
| failed | 실패. 사유는 `error`에 있고, 예약된 크레딧은 전액 환불됩니다. |

한 계정은 최대 50개 작업을 동시에 생성하며, 그보다 많은 작업은 제출 순서대로 대기합니다. 15분이 지나도 시작되지 않은 작업은 자동으로 실패 처리되고 전액 환불됩니다. 작업 기록은 3일, 이미지 링크는 15일 동안 보관됩니다.

## 생성 시간

제출부터 결과까지 보통 5~20초 걸립니다. 2K와 이미지-투-이미지는 조금 더 느립니다.

최근 7일간 실제 호출 기준: 중앙값 14 초, 90%가 18 초 안에 완료.

## 오류와 환불

제출 단계의 오류는 HTTP 4xx / 5xx로 바로 돌아오며, 작업은 만들어지지 않고 과금되지 않습니다. 작업이 접수된 뒤의 실패는 작업 조회 결과로 알려 주며, 예약된 크레딧은 전액 환불됩니다. 전체 코드는 [오류 코드](https://docs.kovapi.com/ko/guide/errors)에 있습니다.

### 제출할 때 돌아오는 오류

| HTTP | code | 원인 | 조치 |
| --- | --- | --- | --- |
| 400 | missing_prompt | `/v1/images/generations` 요청에 `prompt`가 없습니다. | `prompt`를 추가하세요. |
| 400 | invalid_request | 참조 이미지를 읽을 수 없거나(링크가 열리지 않음, 이미지가 아님, 16MB 초과 등. `message`에 몇 번째인지와 이유가 적혀 있습니다), `/v1/images/edits`에 참조 이미지가 없거나, 요청 본문이 JSON 객체가 아니거나, `n`이 정수가 아닙니다. | `message`에 적힌 대로 고친 뒤 다시 제출하세요. |
| 400 | unsupported_resolution | 이 모델은 선택한 해상도 등급을 제공하지 않습니다(예: Grok 이미지 생성에는 4K가 없습니다). | 다른 등급을 고르세요. 모델별로 지원하는 등급은 각 모델 문서에 있습니다. |
| 400 | model_not_found | 모델 ID의 철자가 틀렸거나, `model`이 없거나, 이 엔드포인트에서 쓸 수 없는 모델입니다(예: 이미지 엔드포인트에 채팅 모델을 지정한 경우). | `GET /v1/models` 또는 [API 레퍼런스](https://docs.kovapi.com/ko/api)에 있는 모델 ID를 쓰세요. |
| 401 | invalid_api_key | 키가 없거나, 삭제되었거나, 비활성화되었습니다. 계정이 비활성화된 경우에도 나옵니다. | 콘솔의 「API Keys」 페이지에서 이 키를 확인하세요. |
| 402 | insufficient_quota | 이 요청의 크레딧을 예약하기에 잔액이 부족합니다. 게이트웨이는 요청에 들 수 있는 최대 비용을 먼저 예약하므로, 동시 호출이 몰릴 때도 이 오류가 날 수 있습니다. | 동시 호출이 몰린 경우라면 몇 초 기다린 뒤 다시 시도하고, 그렇지 않으면 충전하세요. |
| 429 | rate_limit_exceeded | 이 키에 설정한 분당 요청 수를 넘었습니다(최근 60초 기준). `Retry-After` 헤더는 붙지 않습니다. | 몇 초 기다린 뒤 다시 시도하거나, 콘솔에서 이 키의 한도를 올리세요. |
| 503 | model_maintenance | 모델이 점검 중이라 요청을 받지 않습니다. 점검 중에는 다른 모델이 대신 답변하지도 않습니다. | 점검이 끝나면 다시 시도하세요. 진행 상황은 [서비스 상태](https://kovapi.com/ko/status)에서 볼 수 있습니다. |
| 503 | service_unavailable | 참조 소재 저장 실패처럼 당사 측에서 일시적인 오류가 났습니다. `/v1/responses`는 잠시 요청을 처리할 수 없을 때도 `Retry-After`와 함께 503을 돌려줍니다. | 잠시 후 다시 시도하세요. |

### 작업 실패(`status`가 `failed`)

| code | 언제 나오나요 | 조치 |
| --- | --- | --- |
| moderation_blocked | 이미지: 모델 제공사의 안전 시스템이 프롬프트나 참조 이미지를 거부했습니다(코드가 `content_policy_violation`일 수도 있습니다). | 프롬프트를 고쳐 쓰거나 참조 이미지를 바꾸세요. 그대로 다시 제출하면 대개 다시 거부됩니다. |
| upstream_error | 그 밖의 실패: 자동 재시도 후에도 실패했거나, 15분 동안 기다려도 시작되지 않았거나, 업스트림이 이유 없이 거부한 경우 등입니다. 구체적인 내용은 `message`에 있습니다. | 다시 제출하면 대개 성공합니다. |

## 조회 대신 웹훅으로 받기

제출할 때 `callback_url`을 넣으면 작업이 끝나는 즉시(성공이든 실패든) 게이트웨이가 조회 엔드포인트와 똑같은 결과를 그 URL로 보냅니다. 서명이 포함되며, 전송에 실패하면 자동으로 재시도합니다. 콘솔의 「설정 → 웹훅」에서 계정 전체에 쓸 주소를 지정할 수도 있습니다. [웹훅 문서 →](https://docs.kovapi.com/ko/webhooks)

```
curl https://kovapi.com/v1/images/generations \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model": "grok-imagine-image-quality", "prompt": "새벽녘 눈 덮인 숲속의 붉은 여우, 사실적인 사진", "size": "1:1", "callback_url": "https://your-domain.com/webhook"}'
```
