> ## Documentation Index
> Fetch the complete documentation index at: https://docs.contentcare.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# 주문 상세 조회

> 호출 계정이 소유한 주문의 상세를 **주문 종류·워터마크 엔진과 관계없이 한 가지 형식**으로 조회합니다. Anti-AI, AI Detection, 워터마크 삽입·검출 주문을 v2·v3 어느 쪽으로 만들었든 조회할 수 있습니다. 주문 상태와 관계없이 항상 호출할 수 있습니다.

**공통 최상위 필드**: `type`, `orderId`, `orderName`, `channel`, `status`, `createdAt`, `updatedAt`, `expiresAt`, `retentionDays`, `thumbnailImageUrl`, `processingDelayed`, `errors`, `inputFiles`, `result`. 모든 주문에서 이 키 집합이 같고, 주문 종류별 차이는 `result` 안에만 있습니다.
- `type`은 `antiAi`, `aiDetection`, `watermarkEmbed`, `watermarkExtract` 중 하나입니다. v3로 만든 워터마크 주문도 엔진 버전 접미사 없이 같은 값을 씁니다
- `status`는 `pending`, `inProgress`, `complete`, `failed`, `expired` 5개 값만 씁니다. v2 워터마크 검출 주문의 저장 status `detected`/`undetected`는 `complete`로 반환하고 판정 값은 `result.detectionStatus`에 담습니다
- `processingDelayed`는 v3로 만든 워터마크 주문만 계산합니다. 그 외 주문은 항상 `false`입니다
- `errors`는 실패한 주문의 `{ errorCode, errorMessage }`이며 그 외에는 `null`입니다

**`inputFiles[]`**: 입력 파일마다 `{ fileId, fileName }`을 요청 순서대로 반환합니다. 파일 수는 `inputFiles.length`로 확인하세요.
- `role`(`original`/`query`)은 `watermarkExtract` 주문에만 나옵니다. v2 주문의 `watermarked` 역할은 `query`로 반환합니다
- `uploadUrl`(presigned `PUT` URL)은 `status`가 `pending`이고 해당 파일이 업로드 대기 중일 때만 나옵니다. 그 외에는 키 자체가 없습니다(`null`로 채우지 않음)

**`result`**: 키는 항상 있습니다. `status`가 `complete`일 때만 객체이고, `pending`·`inProgress`·`failed`·`expired`에서는 `null`입니다.
- `antiAi`: `{ outputFiles: [{ fileId, fileName, inputFileId }] }`
- `watermarkEmbed`: `{ outputFiles: [{ fileId, fileName, inputFileId, watermarkText }] }`. v3 주문에서 입력 파일 하나에 워터마크 문구를 여러 개 넣으면 문구마다 결과 파일이 하나씩 나옵니다
- `watermarkExtract`: `{ detectionStatus, watermarkText, reportSupported, reports }`. `detectionStatus`는 `detected`, `undetected`, `inconclusive`, `unsupported`, `error` 중 하나입니다. `detectionStatus`가 `detected`가 아니면 `watermarkText`는 `null`입니다. v2 주문은 `reportSupported: false`, `reports: []`입니다
- `aiDetection`: `{ verdict, probability, options, originalImageUrl, heatmapUrl, overlayUrl }`. `verdict`는 `likely_real`, `uncertain_real`, `uncertain_ai`, `likely_ai` 중 하나이며 `probability`가 `null`이면 `verdict`도 `null`입니다. 저장된 옵션이 없으면 `options`는 `null`입니다

**`fileId`**: 모든 `fileId`와 `inputFileId`는 숫자로만 된 문자열입니다(`-` 같은 구분자 없음). `result.outputFiles[].fileId`는 주문 안에서 유일하며 [`GET /api/v3/orders/{orderId}/download`](/ko/api-reference/orders/download-order-v3)의 `files[].fileId`와 값·순서가 같습니다.

**만료 주문**: `expired` 주문도 조회할 수 있지만 `result`는 `null`이고 URL을 발급하지 않습니다.

**이전 v3 응답과의 차이(breaking change, 2026-10-08)**
- v3로 만든 워터마크 주문의 `files[]`, `outputs[]`, 최상위 `reports[]`가 `inputFiles[]`, `result.outputFiles[]`, `result.reports[]`로 옮겨졌습니다. 결과 `fileId`가 `{inputFileId}-{n}` 형식에서 숫자 문자열로 바뀌었습니다
- `detectionStatus` 값 `not_detected`가 `undetected`로 바뀌었습니다
- v2 상세와 같은 형식을 쓰던 그 외 주문의 최상위 `fileCount`, `statusCode`, `watermarks`, `watermarkText`, `probability`, `options`, `originalImageUrl`, `heatmapUrl`, `overlayUrl` 필드가 `inputFiles`와 `result`로 옮겨졌습니다. AI Detection의 `statusCode`는 `result.verdict`로 바뀌었습니다
- deprecated된 [`GET /api/v2/orders/{orderId}`](/ko/api-reference/orders/get-order)의 응답은 바뀌지 않습니다

**테스트 키(`sk_test_`)**: 같은 키로 만든 테스트 주문만 조회합니다. live 주문과 다른 계정의 주문은 `404 ORDER_NOT_FOUND`이며, live 키로 테스트 주문을 조회해도 마찬가지입니다. v2·v3로 만든 모든 테스트 주문을 이 형식으로 반환합니다. `inProgress` 테스트 주문은 업로드가 끝나고 5초가 지난 뒤 조회하면 `complete` 또는 `failed`가 됩니다. pending 테스트 주문의 `uploadUrl`은 `https://api.bizmori.com/api/v2/test-uploads/{signedToken}`입니다. 검출 테스트 주문의 `result.reports`는 항상 빈 배열이며, `reportSupported`는 v3로 만든 검출 테스트 주문의 `detectionStatus`가 `detected`일 때만 `true`입니다. `expiresAt`은 주문 생성 7일 뒤입니다.


주문 상태를 확인하고 결과를 읽을 때 이 엔드포인트를 사용합니다. Anti-AI, AI Detection, 워터마크 삽입, 워터마크 검출 등 모든 주문 종류를 v2·v3 어느 쪽으로 만들었든 조회할 수 있습니다. 최상위 필드는 모든 주문이 같고, `type`에 따라 `result`만 달라집니다.

> [!WARNING]
>
> 2026년 10월 8일에 응답 형식이 바뀌었습니다. 이 엔드포인트에서 `files`, `outputs`, 최상위 `reports`, `fileCount`, `statusCode`를 읽고 있다면 [이전 응답과의 차이](#이전-응답과의-차이)를 확인하세요.

## 공통 필드

| 필드 | 타입 | 설명 |
| - | - | - |
| `type` | string | `antiAi`, `aiDetection`, `watermarkEmbed`, `watermarkExtract` 중 하나 |
| `orderId` | string | 주문 ID |
| `orderName` | string \| null | 주문 이름 |
| `channel` | string | `api` 또는 `web` |
| `status` | string | [상태](#상태)의 5가지 값 중 하나 |
| `createdAt`, `updatedAt` | string | ISO 8601 일시 |
| `expiresAt` | string \| null | 주문 파일이 삭제되는 시각 |
| `retentionDays` | integer \| null | 파일 보관 기간(일, 7 또는 30) |
| `thumbnailImageUrl` | string \| null | 썸네일 이미지 URL |
| `processingDelayed` | boolean | v3로 만든 워터마크 주문이 수동 복구를 기다리면 `true`. 그 외 주문은 항상 `false` |
| `errors` | object \| null | 실패한 주문의 `{ errorCode, errorMessage }`. 그 외에는 `null` |
| `inputFiles` | array | 입력 파일. [입력 파일](#입력-파일) 참고 |
| `result` | object \| null | 주문 종류별 결과. [주문 종류별 결과](#주문-종류별-결과) 참고 |

## 상태

| `status` | 의미 | `result` |
| - | - | - |
| `pending` | 파일 업로드 대기. `inputFiles[].uploadUrl`이 있음 | `null` |
| `inProgress` | 처리 중 | `null` |
| `complete` | 완료 | 객체 |
| `failed` | 처리 실패. 사유는 `errors`에 있음 | `null` |
| `expired` | 보관 기한이 지나 파일이 삭제됨. URL을 발급하지 않음 | `null` |

v2로 만든 워터마크 검출 주문 중 저장 status가 `detected` 또는 `undetected`인 주문은 `complete`로 반환합니다. 판정 결과는 `result.detectionStatus`에서 읽으세요.

## 입력 파일

`inputFiles[]`의 각 항목에는 `fileId`와 `fileName`이 있으며 주문 생성 요청의 순서를 따릅니다. 아래 두 키는 해당할 때만 나옵니다. 해당하지 않으면 `null`이 아니라 키 자체가 없습니다.

* `role`은 `watermarkExtract` 주문에만 나옵니다. `original`은 워터마크를 넣은 원본 파일, `query`는 검사할 파일입니다.
* `uploadUrl`은 `status`가 `pending`이고 해당 파일이 아직 업로드 대기 중일 때만 나옵니다. 이 URL로 파일을 PUT하세요. 업로드 URL이 만료되면 이 엔드포인트를 다시 호출해 새 URL을 받으세요.

이 응답과 [다운로드 응답](https://docs.contentcare.ai/ko/api-reference/orders/download-order-v3.md)의 모든 `fileId`는 `"11"`처럼 숫자로만 된 문자열입니다. `-` 같은 구분자는 들어가지 않습니다.

## 주문 종류별 결과

`result`는 `status`가 `complete`일 때만 객체입니다. 키는 항상 있으며 그 외 상태에서는 `null`입니다.

**Anti-AI**

`result.outputFiles[]`에는 입력 파일마다 결과 파일이 하나씩 있습니다.

| 필드 | 타입 | 설명 |
| - | - | - |
| `fileId` | string | 결과 파일 ID. [다운로드 응답](https://docs.contentcare.ai/ko/api-reference/orders/download-order-v3.md)의 `files[].fileId`와 값·순서가 같음 |
| `fileName` | string \| null | 결과 파일명 |
| `inputFileId` | string | 원본 입력 파일의 `inputFiles[].fileId` |

**워터마크 삽입**

`result.outputFiles[]`에는 삽입한 워터마크 문구마다 결과 파일이 하나씩 있습니다. v3 주문에서 입력 파일 하나에 문구를 여러 개 넣으면 그 결과 파일들은 같은 `inputFileId`를 가집니다.

| 필드 | 타입 | 설명 |
| - | - | - |
| `fileId` | string | 결과 파일 ID. [다운로드 응답](https://docs.contentcare.ai/ko/api-reference/orders/download-order-v3.md)의 `files[].fileId`와 값·순서가 같음 |
| `fileName` | string \| null | 결과 파일명 |
| `inputFileId` | string | 원본 입력 파일의 `inputFiles[].fileId` |
| `watermarkText` | string | 이 결과 파일에 삽입한 문구 |

**워터마크 검출**

| 필드 | 타입 | 설명 |
| - | - | - |
| `detectionStatus` | string | 판정 결과. 아래 표 참고 |
| `watermarkText` | string \| null | 검출된 워터마크의 삽입 문구. `detectionStatus`가 `detected`가 아니면 `null`. v3 주문은 호출 계정이 직접 삽입했고 발급 기록이 정확히 1건일 때만 반환 |
| `reportSupported` | boolean | 이 결과로 [보고서를 생성](https://docs.contentcare.ai/ko/api-reference/reports/create-report.md)할 수 있는지 여부. v2 주문과 PDF에서 캡처한 이미지는 `false` |
| `reports` | array | 이 주문에 요청한 보고서별 `{ locale, status }`. v2 주문은 항상 빈 배열 |

| `detectionStatus` | 의미 |
| - | - |
| `detected` | 워터마크를 찾음 |
| `undetected` | 끝까지 검사했으나 워터마크가 없음 |
| `inconclusive` | 후보는 있으나 확신 기준에 못 미침 |
| `unsupported` | 처리할 수 없는 입력. 크레딧 환불 |
| `error` | 검출 처리 실패. 워터마크 없음과 다름 |

**AI Detection**

| 필드 | 타입 | 설명 |
| - | - | - |
| `verdict` | string \| null | `probability` 기준 판정. 아래 표 참고. `probability`가 `null`이면 `null` |
| `probability` | number \| null | 이미지가 AI로 생성되었을 확률(0\~1) |
| `options` | object \| null | 주문 생성 시 설정한 `generateHeatmap`, `generateOverlay`, `generateThumbnail` |
| `originalImageUrl` | string \| null | 원본 이미지 URL(1시간 유효) |
| `heatmapUrl` | string \| null | 히트맵 이미지 URL(1시간 유효). `generateHeatmap`을 쓰지 않은 주문은 `null` |
| `overlayUrl` | string \| null | 히트맵 오버레이 URL(1시간 유효). `generateOverlay`를 쓰지 않은 주문은 `null` |

| `verdict` | 확률 구간 | 의미 |
| - | - | - |
| `likely_real` | \< 0.25 | AI 생성이 아닐 가능성이 높음 |
| `uncertain_real` | 0.25 – 0.5 | AI 생성이 아닐 가능성이 있음 |
| `uncertain_ai` | 0.5 – 0.75 | AI 생성일 가능성이 있음 |
| `likely_ai` | ≥ 0.75 | AI 생성일 가능성이 높음 |

## 예시

주문 종류별 완료 주문:

```json Anti-AI theme={null}
{
  "data": {
    "type": "antiAi",
    "orderId": "1001",
    "orderName": "cat.png",
    "channel": "api",
    "status": "complete",
    "createdAt": "2026-10-08T01:00:00.000Z",
    "updatedAt": "2026-10-08T01:00:40.000Z",
    "expiresAt": "2026-11-07T01:00:00.000Z",
    "retentionDays": 30,
    "thumbnailImageUrl": "https://cdn.bizmori.com/thumb/ex.webp",
    "processingDelayed": false,
    "errors": null,
    "inputFiles": [
      { "fileId": "11", "fileName": "cat.png" },
      { "fileId": "12", "fileName": "dog.png" }
    ],
    "result": {
      "outputFiles": [
        { "fileId": "21", "fileName": "cat.png", "inputFileId": "11" },
        { "fileId": "22", "fileName": "dog.png", "inputFileId": "12" }
      ]
    }
  }
}
```

```json AI Detection theme={null}
{
  "data": {
    "type": "aiDetection",
    "orderId": "4001",
    "orderName": "photo.jpg",
    "channel": "api",
    "status": "complete",
    "createdAt": "2026-10-08T01:00:00.000Z",
    "updatedAt": "2026-10-08T01:00:40.000Z",
    "expiresAt": "2026-11-07T01:00:00.000Z",
    "retentionDays": 30,
    "thumbnailImageUrl": "https://cdn.bizmori.com/ai/photo.jpg",
    "processingDelayed": false,
    "errors": null,
    "inputFiles": [
      { "fileId": "71", "fileName": "photo.jpg" }
    ],
    "result": {
      "verdict": "uncertain_real",
      "probability": 0.31,
      "options": {
        "generateHeatmap": true,
        "generateOverlay": true,
        "generateThumbnail": true
      },
      "originalImageUrl": "https://cdn.bizmori.com/ai/photo.jpg",
      "heatmapUrl": "https://cdn.bizmori.com/ai/heatmap.png",
      "overlayUrl": "https://cdn.bizmori.com/ai/overlay.png"
    }
  }
}
```

```json 워터마크 삽입 theme={null}
{
  "data": {
    "type": "watermarkEmbed",
    "orderId": "2001",
    "orderName": "logo.png",
    "channel": "api",
    "status": "complete",
    "createdAt": "2026-10-08T01:00:00.000Z",
    "updatedAt": "2026-10-08T01:00:40.000Z",
    "expiresAt": "2026-11-07T01:00:00.000Z",
    "retentionDays": 30,
    "thumbnailImageUrl": "https://cdn.bizmori.com/thumb/ex.webp",
    "processingDelayed": false,
    "errors": null,
    "inputFiles": [
      { "fileId": "31", "fileName": "logo.png" }
    ],
    "result": {
      "outputFiles": [
        { "fileId": "201", "fileName": "logo.png", "inputFileId": "31", "watermarkText": "MORI" },
        { "fileId": "202", "fileName": "logo.png", "inputFileId": "31", "watermarkText": "MORI-2" }
      ]
    }
  }
}
```

```json 워터마크 검출 theme={null}
{
  "data": {
    "type": "watermarkExtract",
    "orderId": "3001",
    "orderName": "suspect.png",
    "channel": "api",
    "status": "complete",
    "createdAt": "2026-10-08T01:00:00.000Z",
    "updatedAt": "2026-10-08T01:00:40.000Z",
    "expiresAt": "2026-11-07T01:00:00.000Z",
    "retentionDays": 30,
    "thumbnailImageUrl": "https://cdn.bizmori.com/thumb/ex.webp",
    "processingDelayed": false,
    "errors": null,
    "inputFiles": [
      { "fileId": "51", "fileName": "original.png", "role": "original" },
      { "fileId": "52", "fileName": "suspect.png", "role": "query" }
    ],
    "result": {
      "detectionStatus": "detected",
      "watermarkText": "MORI",
      "reportSupported": true,
      "reports": [
        { "locale": "ko-KR", "status": "completed" }
      ]
    }
  }
}
```

완료되지 않은 주문은 `result: null`을 반환합니다.

```json Pending theme={null}
{
  "data": {
    "type": "watermarkExtract",
    "orderId": "3201",
    "orderName": "suspect.png",
    "channel": "api",
    "status": "pending",
    "createdAt": "2026-10-08T01:00:00.000Z",
    "updatedAt": "2026-10-08T01:00:40.000Z",
    "expiresAt": "2026-11-07T01:00:00.000Z",
    "retentionDays": 30,
    "thumbnailImageUrl": null,
    "processingDelayed": false,
    "errors": null,
    "inputFiles": [
      {
        "fileId": "81",
        "fileName": "original.png",
        "role": "original",
        "uploadUrl": "https://bucket.s3.ap-northeast-2.amazonaws.com/inputs/81?X-Amz-..."
      },
      {
        "fileId": "82",
        "fileName": "suspect.png",
        "role": "query",
        "uploadUrl": "https://bucket.s3.ap-northeast-2.amazonaws.com/inputs/82?X-Amz-..."
      }
    ],
    "result": null
  }
}
```

```json Failed theme={null}
{
  "data": {
    "type": "watermarkEmbed",
    "orderId": "2002",
    "orderName": "logo.png",
    "channel": "api",
    "status": "failed",
    "createdAt": "2026-10-08T01:00:00.000Z",
    "updatedAt": "2026-10-08T01:00:40.000Z",
    "expiresAt": "2026-11-07T01:00:00.000Z",
    "retentionDays": 30,
    "thumbnailImageUrl": "https://cdn.bizmori.com/thumb/ex.webp",
    "processingDelayed": false,
    "errors": {
      "errorCode": "WATERMARK_FILE_CORRUPTED",
      "errorMessage": "파일이 손상되어 처리할 수 없습니다."
    },
    "inputFiles": [
      { "fileId": "33", "fileName": "logo.png" }
    ],
    "result": null
  }
}
```

```json Expired theme={null}
{
  "data": {
    "type": "antiAi",
    "orderId": "1003",
    "orderName": "cat.png",
    "channel": "api",
    "status": "expired",
    "createdAt": "2026-10-08T01:00:00.000Z",
    "updatedAt": "2026-10-08T01:00:40.000Z",
    "expiresAt": "2026-10-01T00:00:00.000Z",
    "retentionDays": 30,
    "thumbnailImageUrl": "https://cdn.bizmori.com/thumb/ex.webp",
    "processingDelayed": false,
    "errors": null,
    "inputFiles": [
      { "fileId": "14", "fileName": "cat.png" }
    ],
    "result": null
  }
}
```

* **Pending**: 아직 업로드 대기 중인 파일에만 `uploadUrl`이 있습니다. 워터마크 삽입, Anti-AI, AI Detection 주문에는 `role`이 없습니다.
* **Failed**: `errors`에 사유가 있고 `result`는 `null`입니다. `errorMessage`는 오류 코드별 고정 한국어 안내 문구입니다.
* **Expired**: 보관 기한이 지난 주문도 조회할 수 있지만 `result`는 `null`이고 URL을 발급하지 않습니다. [다운로드](https://docs.contentcare.ai/ko/api-reference/orders/download-order-v3.md)는 `400 ORDER_EXPIRED`를 반환합니다.

## 이전 응답과의 차이

2026년 10월 8일부터 이 엔드포인트는 위 형식으로 응답합니다. 하위 호환되지 않는 변경입니다.

| 이전 응답 | 현재 |
| - | - |
| `files[]` (v3 워터마크 주문) | `inputFiles[]`. `uploadUrl`은 `pending` 주문에만 있음 |
| `outputs[]` (v3 워터마크 주문) | `result.outputFiles[]`. `outputIndex`, `status`, `mediaKind`는 더 이상 반환하지 않음 |
| `"601-1"` 형식의 결과 `fileId` | `"201"` 같은 숫자 문자열 |
| 최상위 `reports[]` | `result.reports[]` |
| `detectionStatus: "not_detected"` | `"undetected"` |
| `fileCount` | `inputFiles.length` |
| `statusCode` (AI Detection) | `result.verdict` |
| `statusCode`와 `status: "detected"` / `"undetected"` (v2 워터마크 검출) | `status: "complete"`와 `result.detectionStatus` |
| `watermarks[]` (v2 워터마크 삽입) | `result.outputFiles[].watermarkText` |
| 최상위 `watermarkText`, `probability`, `options`, `originalImageUrl`, `heatmapUrl`, `overlayUrl` | `result` 안으로 이동 |

deprecated된 [`GET /api/v2/orders/{orderId}`](https://docs.contentcare.ai/ko/api-reference/orders/get-order)는 기존 응답을 그대로 반환합니다.

## 테스트 키

`sk_test_` 키로 호출하면 같은 키로 만든 테스트 주문만 위 형식으로 반환합니다. 테스트 주문의 상태 변화는 [테스트 API 키](https://docs.contentcare.ai/ko/test-api-keys.md)를 참고하세요.


## OpenAPI

````yaml ko/api-reference/openapi.yaml GET /api/v3/orders/{orderId}
openapi: 3.0.0
info:
  title: BIZ MORI API
  version: 2.0.0
  description: >
    BIZ MORI API는 디지털 콘텐츠 보호를 위한 네 가지 핵심 서비스를 제공합니다:

    - **Anti-AI**: 이미지를 AI 학습으로부터 보호

    - **Watermark Embed**: 이미지에 보이지 않는 디지털 워터마크 삽입

    - **Watermark Extract**: 이미지에서 워터마크 추출 및 검증

    - **AI Detection**: 이미지가 AI로 생성되었는지 감지

    - **테스트 API 키**: `sk_test_` 접두사의 키는 동일한 Bearer 인증을 사용하며, 실제 처리 서비스나 크레딧 사용
    없이 주문 흐름을 검증할 수 있습니다. 테스트 업로드는 파일 내용을 폐기하고 결과 파일을 만들지 않습니다
  contact:
    name: BIZ MORI 지원
    email: support@contentcare.ai
  license:
    name: Proprietary
    url: https://docs.contentcare.ai/legal/terms
servers:
  - url: https://api.bizmori.com
    description: 프로덕션
security: []
tags:
  - name: Anti-AI
    description: AI 학습 방지 이미지 보호 주문
  - name: Watermark Embed
    description: 워터마크 삽입 주문
  - name: Watermark Extract
    description: 워터마크 추출 주문
  - name: AI Detection
    description: AI 생성 이미지 감지 주문
  - name: Orders
    description: 주문 조회 및 관리
  - name: Webhooks
    description: 웹훅 설정 및 이벤트
  - name: Reports
    description: 워터마크 추출·AI Detection 주문의 PDF 분석 보고서
paths:
  /api/v3/orders/{orderId}:
    get:
      tags:
        - Orders
      summary: 주문 상세 조회
      description: >
        호출 계정이 소유한 주문의 상세를 **주문 종류·워터마크 엔진과 관계없이 한 가지 형식**으로 조회합니다. Anti-AI, AI
        Detection, 워터마크 삽입·검출 주문을 v2·v3 어느 쪽으로 만들었든 조회할 수 있습니다. 주문 상태와 관계없이 항상
        호출할 수 있습니다.


        **공통 최상위 필드**: `type`, `orderId`, `orderName`, `channel`, `status`,
        `createdAt`, `updatedAt`, `expiresAt`, `retentionDays`,
        `thumbnailImageUrl`, `processingDelayed`, `errors`, `inputFiles`,
        `result`. 모든 주문에서 이 키 집합이 같고, 주문 종류별 차이는 `result` 안에만 있습니다.

        - `type`은 `antiAi`, `aiDetection`, `watermarkEmbed`, `watermarkExtract`
        중 하나입니다. v3로 만든 워터마크 주문도 엔진 버전 접미사 없이 같은 값을 씁니다

        - `status`는 `pending`, `inProgress`, `complete`, `failed`, `expired` 5개
        값만 씁니다. v2 워터마크 검출 주문의 저장 status `detected`/`undetected`는 `complete`로
        반환하고 판정 값은 `result.detectionStatus`에 담습니다

        - `processingDelayed`는 v3로 만든 워터마크 주문만 계산합니다. 그 외 주문은 항상 `false`입니다

        - `errors`는 실패한 주문의 `{ errorCode, errorMessage }`이며 그 외에는 `null`입니다


        **`inputFiles[]`**: 입력 파일마다 `{ fileId, fileName }`을 요청 순서대로 반환합니다. 파일 수는
        `inputFiles.length`로 확인하세요.

        - `role`(`original`/`query`)은 `watermarkExtract` 주문에만 나옵니다. v2 주문의
        `watermarked` 역할은 `query`로 반환합니다

        - `uploadUrl`(presigned `PUT` URL)은 `status`가 `pending`이고 해당 파일이 업로드 대기
        중일 때만 나옵니다. 그 외에는 키 자체가 없습니다(`null`로 채우지 않음)


        **`result`**: 키는 항상 있습니다. `status`가 `complete`일 때만 객체이고,
        `pending`·`inProgress`·`failed`·`expired`에서는 `null`입니다.

        - `antiAi`: `{ outputFiles: [{ fileId, fileName, inputFileId }] }`

        - `watermarkEmbed`: `{ outputFiles: [{ fileId, fileName, inputFileId,
        watermarkText }] }`. v3 주문에서 입력 파일 하나에 워터마크 문구를 여러 개 넣으면 문구마다 결과 파일이 하나씩
        나옵니다

        - `watermarkExtract`: `{ detectionStatus, watermarkText,
        reportSupported, reports }`. `detectionStatus`는 `detected`,
        `undetected`, `inconclusive`, `unsupported`, `error` 중 하나입니다.
        `detectionStatus`가 `detected`가 아니면 `watermarkText`는 `null`입니다. v2 주문은
        `reportSupported: false`, `reports: []`입니다

        - `aiDetection`: `{ verdict, probability, options, originalImageUrl,
        heatmapUrl, overlayUrl }`. `verdict`는 `likely_real`, `uncertain_real`,
        `uncertain_ai`, `likely_ai` 중 하나이며 `probability`가 `null`이면 `verdict`도
        `null`입니다. 저장된 옵션이 없으면 `options`는 `null`입니다


        **`fileId`**: 모든 `fileId`와 `inputFileId`는 숫자로만 된 문자열입니다(`-` 같은 구분자 없음).
        `result.outputFiles[].fileId`는 주문 안에서 유일하며 [`GET
        /api/v3/orders/{orderId}/download`](/ko/api-reference/orders/download-order-v3)의
        `files[].fileId`와 값·순서가 같습니다.


        **만료 주문**: `expired` 주문도 조회할 수 있지만 `result`는 `null`이고 URL을 발급하지 않습니다.


        **이전 v3 응답과의 차이(breaking change, 2026-10-08)**

        - v3로 만든 워터마크 주문의 `files[]`, `outputs[]`, 최상위 `reports[]`가
        `inputFiles[]`, `result.outputFiles[]`, `result.reports[]`로 옮겨졌습니다. 결과
        `fileId`가 `{inputFileId}-{n}` 형식에서 숫자 문자열로 바뀌었습니다

        - `detectionStatus` 값 `not_detected`가 `undetected`로 바뀌었습니다

        - v2 상세와 같은 형식을 쓰던 그 외 주문의 최상위 `fileCount`, `statusCode`, `watermarks`,
        `watermarkText`, `probability`, `options`, `originalImageUrl`,
        `heatmapUrl`, `overlayUrl` 필드가 `inputFiles`와 `result`로 옮겨졌습니다. AI
        Detection의 `statusCode`는 `result.verdict`로 바뀌었습니다

        - deprecated된 [`GET
        /api/v2/orders/{orderId}`](/ko/api-reference/orders/get-order)의 응답은 바뀌지
        않습니다


        **테스트 키(`sk_test_`)**: 같은 키로 만든 테스트 주문만 조회합니다. live 주문과 다른 계정의 주문은 `404
        ORDER_NOT_FOUND`이며, live 키로 테스트 주문을 조회해도 마찬가지입니다. v2·v3로 만든 모든 테스트 주문을 이
        형식으로 반환합니다. `inProgress` 테스트 주문은 업로드가 끝나고 5초가 지난 뒤 조회하면 `complete` 또는
        `failed`가 됩니다. pending 테스트 주문의 `uploadUrl`은
        `https://api.bizmori.com/api/v2/test-uploads/{signedToken}`입니다. 검출 테스트
        주문의 `result.reports`는 항상 빈 배열이며, `reportSupported`는 v3로 만든 검출 테스트 주문의
        `detectionStatus`가 `detected`일 때만 `true`입니다. `expiresAt`은 주문 생성 7일 뒤입니다.
      operationId: getOrderV3
      parameters:
        - in: path
          name: orderId
          required: true
          schema:
            type: string
            pattern: ^[0-9]{1,20}$
          description: 주문 ID
      responses:
        '200':
          description: 주문 상세. 최상위 필드는 모든 주문 종류가 같고 `type`에 따라 `result` 형식만 다릅니다
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PublicOrderV3DetailResponse'
              examples:
                antiAiComplete:
                  summary: Anti-AI · complete (입력 2개)
                  value:
                    data:
                      type: antiAi
                      orderId: '1001'
                      orderName: cat.png
                      channel: api
                      status: complete
                      createdAt: '2026-10-08T01:00:00.000Z'
                      updatedAt: '2026-10-08T01:00:40.000Z'
                      expiresAt: '2026-11-07T01:00:00.000Z'
                      retentionDays: 30
                      thumbnailImageUrl: https://cdn.bizmori.com/thumb/ex.webp
                      processingDelayed: false
                      errors: null
                      inputFiles:
                        - fileId: '11'
                          fileName: cat.png
                        - fileId: '12'
                          fileName: dog.png
                      result:
                        outputFiles:
                          - fileId: '21'
                            fileName: cat.png
                            inputFileId: '11'
                          - fileId: '22'
                            fileName: dog.png
                            inputFileId: '12'
                watermarkEmbedV3:
                  summary: 워터마크 삽입(v3) · complete (입력 1개에 워터마크 2개, 결과 2개)
                  value:
                    data:
                      type: watermarkEmbed
                      orderId: '2001'
                      orderName: logo.png
                      channel: api
                      status: complete
                      createdAt: '2026-10-08T01:00:00.000Z'
                      updatedAt: '2026-10-08T01:00:40.000Z'
                      expiresAt: '2026-11-07T01:00:00.000Z'
                      retentionDays: 30
                      thumbnailImageUrl: https://cdn.bizmori.com/thumb/ex.webp
                      processingDelayed: false
                      errors: null
                      inputFiles:
                        - fileId: '31'
                          fileName: logo.png
                      result:
                        outputFiles:
                          - fileId: '201'
                            fileName: logo.png
                            inputFileId: '31'
                            watermarkText: MORI
                          - fileId: '202'
                            fileName: logo.png
                            inputFileId: '31'
                            watermarkText: MORI-2
                watermarkEmbedV2:
                  summary: 워터마크 삽입(v2) · complete (입력 2개)
                  value:
                    data:
                      type: watermarkEmbed
                      orderId: '2101'
                      orderName: a.png
                      channel: api
                      status: complete
                      createdAt: '2026-10-08T01:00:00.000Z'
                      updatedAt: '2026-10-08T01:00:40.000Z'
                      expiresAt: '2026-11-07T01:00:00.000Z'
                      retentionDays: 30
                      thumbnailImageUrl: https://cdn.bizmori.com/thumb/ex.webp
                      processingDelayed: false
                      errors: null
                      inputFiles:
                        - fileId: '31'
                          fileName: a.png
                        - fileId: '32'
                          fileName: b.png
                      result:
                        outputFiles:
                          - fileId: '41'
                            fileName: a.png
                            inputFileId: '31'
                            watermarkText: MORI-A
                          - fileId: '42'
                            fileName: b.png
                            inputFileId: '32'
                            watermarkText: MORI-B
                watermarkExtractV3Detected:
                  summary: 워터마크 검출(v3) · complete (검출됨)
                  value:
                    data:
                      type: watermarkExtract
                      orderId: '3001'
                      orderName: suspect.png
                      channel: api
                      status: complete
                      createdAt: '2026-10-08T01:00:00.000Z'
                      updatedAt: '2026-10-08T01:00:40.000Z'
                      expiresAt: '2026-11-07T01:00:00.000Z'
                      retentionDays: 30
                      thumbnailImageUrl: https://cdn.bizmori.com/thumb/ex.webp
                      processingDelayed: false
                      errors: null
                      inputFiles:
                        - fileId: '51'
                          fileName: original.png
                          role: original
                        - fileId: '52'
                          fileName: suspect.png
                          role: query
                      result:
                        detectionStatus: detected
                        watermarkText: MORI
                        reportSupported: true
                        reports:
                          - locale: ko-KR
                            status: completed
                watermarkExtractV2Undetected:
                  summary: >-
                    워터마크 검출(v2) · complete (미검출, 저장 status `undetected`도
                    `complete`로 반환)
                  value:
                    data:
                      type: watermarkExtract
                      orderId: '3101'
                      orderName: suspect.png
                      channel: api
                      status: complete
                      createdAt: '2026-10-08T01:00:00.000Z'
                      updatedAt: '2026-10-08T01:00:40.000Z'
                      expiresAt: '2026-11-07T01:00:00.000Z'
                      retentionDays: 30
                      thumbnailImageUrl: https://cdn.bizmori.com/thumb/ex.webp
                      processingDelayed: false
                      errors: null
                      inputFiles:
                        - fileId: '61'
                          fileName: original.png
                          role: original
                        - fileId: '62'
                          fileName: suspect.png
                          role: query
                      result:
                        detectionStatus: undetected
                        watermarkText: null
                        reportSupported: false
                        reports: []
                aiDetectionComplete:
                  summary: AI Detection · complete
                  value:
                    data:
                      type: aiDetection
                      orderId: '4001'
                      orderName: photo.jpg
                      channel: api
                      status: complete
                      createdAt: '2026-10-08T01:00:00.000Z'
                      updatedAt: '2026-10-08T01:00:40.000Z'
                      expiresAt: '2026-11-07T01:00:00.000Z'
                      retentionDays: 30
                      thumbnailImageUrl: https://cdn.bizmori.com/ai/photo.jpg
                      processingDelayed: false
                      errors: null
                      inputFiles:
                        - fileId: '71'
                          fileName: photo.jpg
                      result:
                        verdict: uncertain_real
                        probability: 0.31
                        options:
                          generateHeatmap: true
                          generateOverlay: true
                          generateThumbnail: true
                        originalImageUrl: https://cdn.bizmori.com/ai/photo.jpg
                        heatmapUrl: https://cdn.bizmori.com/ai/heatmap.png
                        overlayUrl: https://cdn.bizmori.com/ai/overlay.png
                watermarkExtractPending:
                  summary: 워터마크 검출(v3) · pending (업로드 대기 파일에만 `uploadUrl`)
                  value:
                    data:
                      type: watermarkExtract
                      orderId: '3201'
                      orderName: suspect.png
                      channel: api
                      status: pending
                      createdAt: '2026-10-08T01:00:00.000Z'
                      updatedAt: '2026-10-08T01:00:40.000Z'
                      expiresAt: '2026-11-07T01:00:00.000Z'
                      retentionDays: 30
                      thumbnailImageUrl: null
                      processingDelayed: false
                      errors: null
                      inputFiles:
                        - fileId: '81'
                          fileName: original.png
                          role: original
                          uploadUrl: >-
                            https://bucket.s3.ap-northeast-2.amazonaws.com/inputs/81?X-Amz-...
                        - fileId: '82'
                          fileName: suspect.png
                          role: query
                          uploadUrl: >-
                            https://bucket.s3.ap-northeast-2.amazonaws.com/inputs/82?X-Amz-...
                      result: null
                watermarkEmbedPending:
                  summary: 워터마크 삽입 · pending (`role` 없음, `uploadUrl`만)
                  value:
                    data:
                      type: watermarkEmbed
                      orderId: '2003'
                      orderName: logo.png
                      channel: api
                      status: pending
                      createdAt: '2026-10-08T01:00:00.000Z'
                      updatedAt: '2026-10-08T01:00:40.000Z'
                      expiresAt: '2026-11-07T01:00:00.000Z'
                      retentionDays: 30
                      thumbnailImageUrl: null
                      processingDelayed: false
                      errors: null
                      inputFiles:
                        - fileId: '34'
                          fileName: logo.png
                          uploadUrl: >-
                            https://bucket.s3.ap-northeast-2.amazonaws.com/inputs/34?X-Amz-...
                        - fileId: '35'
                          fileName: banner.png
                          uploadUrl: >-
                            https://bucket.s3.ap-northeast-2.amazonaws.com/inputs/35?X-Amz-...
                      result: null
                antiAiInProgress:
                  summary: Anti-AI · inProgress
                  value:
                    data:
                      type: antiAi
                      orderId: '1002'
                      orderName: cat.png
                      channel: api
                      status: inProgress
                      createdAt: '2026-10-08T01:00:00.000Z'
                      updatedAt: '2026-10-08T01:00:40.000Z'
                      expiresAt: '2026-11-07T01:00:00.000Z'
                      retentionDays: 30
                      thumbnailImageUrl: https://cdn.bizmori.com/thumb/ex.webp
                      processingDelayed: false
                      errors: null
                      inputFiles:
                        - fileId: '13'
                          fileName: cat.png
                      result: null
                watermarkEmbedFailed:
                  summary: 워터마크 삽입(v3) · failed (`errors`에 사유, `result`는 `null`)
                  value:
                    data:
                      type: watermarkEmbed
                      orderId: '2002'
                      orderName: logo.png
                      channel: api
                      status: failed
                      createdAt: '2026-10-08T01:00:00.000Z'
                      updatedAt: '2026-10-08T01:00:40.000Z'
                      expiresAt: '2026-11-07T01:00:00.000Z'
                      retentionDays: 30
                      thumbnailImageUrl: https://cdn.bizmori.com/thumb/ex.webp
                      processingDelayed: false
                      errors:
                        errorCode: WATERMARK_FILE_CORRUPTED
                        errorMessage: 파일이 손상되어 처리할 수 없습니다.
                      inputFiles:
                        - fileId: '33'
                          fileName: logo.png
                      result: null
                antiAiExpired:
                  summary: Anti-AI · expired (모든 주문 종류 공통, `result`는 `null`)
                  value:
                    data:
                      type: antiAi
                      orderId: '1003'
                      orderName: cat.png
                      channel: api
                      status: expired
                      createdAt: '2026-10-08T01:00:00.000Z'
                      updatedAt: '2026-10-08T01:00:40.000Z'
                      expiresAt: '2026-10-01T00:00:00.000Z'
                      retentionDays: 30
                      thumbnailImageUrl: https://cdn.bizmori.com/thumb/ex.webp
                      processingDelayed: false
                      errors: null
                      inputFiles:
                        - fileId: '14'
                          fileName: cat.png
                      result: null
        '400':
          description: 요청 형식 오류(`orderId` 형식 등)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                code: VALIDATION_FAILED
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          description: 주문이 없거나 다른 계정의 주문
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                code: ORDER_NOT_FOUND
        '500':
          $ref: '#/components/responses/InternalError'
      security:
        - BearerAuth: []
      x-codeSamples:
        - lang: curl
          label: cURL
          source: |
            curl -X GET https://api.bizmori.com/api/v3/orders/ORDER_ID \
              -H "Authorization: Bearer YOUR_API_KEY"
        - lang: javascript
          label: JavaScript
          source: >
            const orderId = 'ORDER_ID';

            const response = await
            fetch(`https://api.bizmori.com/api/v3/orders/${orderId}`, {
              headers: { 'Authorization': 'Bearer YOUR_API_KEY' }
            });

            const { data } = await response.json();
        - lang: python
          label: Python
          source: |
            import requests

            order_id = 'ORDER_ID'
            response = requests.get(
                f'https://api.bizmori.com/api/v3/orders/{order_id}',
                headers={'Authorization': 'Bearer YOUR_API_KEY'}
            )
            data = response.json()['data']
components:
  schemas:
    PublicOrderV3DetailResponse:
      type: object
      required:
        - data
      additionalProperties: false
      properties:
        data:
          $ref: '#/components/schemas/PublicOrderV3Detail'
    ErrorResponse:
      type: object
      properties:
        code:
          type: string
          description: 에러 코드
    PublicOrderV3Detail:
      description: >-
        v3 주문 상세. 최상위 필드는 모든 주문 종류가 같고(`PublicOrderV3DetailCommon`), `type`에 따라
        `result`와 검출 주문의 `inputFiles[].role`만 다릅니다
      oneOf:
        - $ref: '#/components/schemas/PublicAntiAiOrderV3Detail'
        - $ref: '#/components/schemas/PublicWatermarkEmbedOrderV3Detail'
        - $ref: '#/components/schemas/PublicWatermarkExtractOrderV3Detail'
        - $ref: '#/components/schemas/PublicAiDetectionOrderV3Detail'
      discriminator:
        propertyName: type
        mapping:
          antiAi: '#/components/schemas/PublicAntiAiOrderV3Detail'
          watermarkEmbed: '#/components/schemas/PublicWatermarkEmbedOrderV3Detail'
          watermarkExtract: '#/components/schemas/PublicWatermarkExtractOrderV3Detail'
          aiDetection: '#/components/schemas/PublicAiDetectionOrderV3Detail'
    PublicAntiAiOrderV3Detail:
      title: Anti-AI
      description: Anti-AI 주문 상세
      allOf:
        - $ref: '#/components/schemas/PublicOrderV3DetailCommon'
        - type: object
          properties:
            type:
              type: string
              enum:
                - antiAi
            inputFiles:
              type: array
              items:
                $ref: '#/components/schemas/PublicInputFile'
            result:
              $ref: '#/components/schemas/PublicAntiAiResult'
    PublicWatermarkEmbedOrderV3Detail:
      title: 워터마크 삽입
      description: 워터마크 삽입 주문 상세(v2·v3)
      allOf:
        - $ref: '#/components/schemas/PublicOrderV3DetailCommon'
        - type: object
          properties:
            type:
              type: string
              enum:
                - watermarkEmbed
            inputFiles:
              type: array
              items:
                $ref: '#/components/schemas/PublicInputFile'
            result:
              $ref: '#/components/schemas/PublicWatermarkEmbedResult'
    PublicWatermarkExtractOrderV3Detail:
      title: 워터마크 검출
      description: 워터마크 검출 주문 상세(v2·v3). 이 주문 종류만 `inputFiles[].role`이 있습니다
      allOf:
        - $ref: '#/components/schemas/PublicOrderV3DetailCommon'
        - type: object
          properties:
            type:
              type: string
              enum:
                - watermarkExtract
            inputFiles:
              type: array
              items:
                $ref: '#/components/schemas/PublicExtractInputFile'
            result:
              $ref: '#/components/schemas/PublicWatermarkExtractResult'
    PublicAiDetectionOrderV3Detail:
      title: AI Detection
      description: AI Detection 주문 상세
      allOf:
        - $ref: '#/components/schemas/PublicOrderV3DetailCommon'
        - type: object
          properties:
            type:
              type: string
              enum:
                - aiDetection
            inputFiles:
              type: array
              items:
                $ref: '#/components/schemas/PublicInputFile'
            result:
              $ref: '#/components/schemas/PublicAiDetectionResult'
    PublicOrderV3DetailCommon:
      type: object
      description: >-
        v3 주문 상세의 공통 필드. 모든 주문 종류·워터마크 엔진에서 최상위 키 집합이 같으며 종류별 차이는 `result` 안에만
        있습니다. 이전 응답의 최상위 `fileCount`, `statusCode`, `files`, `outputs`,
        `reports`, `watermarks` 필드는 반환하지 않습니다
      required:
        - type
        - orderId
        - orderName
        - channel
        - status
        - createdAt
        - updatedAt
        - expiresAt
        - retentionDays
        - thumbnailImageUrl
        - processingDelayed
        - errors
        - inputFiles
        - result
      additionalProperties: false
      properties:
        type:
          type: string
          enum:
            - antiAi
            - watermarkEmbed
            - watermarkExtract
            - aiDetection
          description: >-
            주문 종류. 워터마크 주문은 v2·v3 어느 쪽으로 만들었든
            `watermarkEmbed`/`watermarkExtract`로 반환합니다
        orderId:
          type: string
          description: 주문 ID
          example: '1001'
        orderName:
          type: string
          nullable: true
          description: 주문 이름. v3로 만든 워터마크 주문은 표시 파일명을, 없으면 저장된 이름을 반환합니다
        channel:
          type: string
          enum:
            - api
            - web
          description: 주문 채널
        status:
          type: string
          enum:
            - pending
            - inProgress
            - complete
            - failed
            - expired
          description: >-
            * `pending` - 업로드 대기

            * `inProgress` - 처리 중

            * `complete` - 완료. 이때만 `result`가 객체입니다

            * `failed` - 실패. 사유는 `errors`에 있습니다

            * `expired` - 파일 보관 기한 경과. 조회는 가능하지만 `result`와 모든 URL은 `null`입니다


            저장 status가 `detected`/`undetected`인 v2 워터마크 검출 주문은 `complete`로 반환하고
            판정 값은 `result.detectionStatus`에 담습니다
        createdAt:
          type: string
          format: date-time
          description: 생성 일시
        updatedAt:
          type: string
          format: date-time
          description: 수정 일시
        expiresAt:
          type: string
          format: date-time
          nullable: true
          description: 파일 보관 기한(UTC, ISO 8601). 무결성 예외에서만 `null`입니다
        retentionDays:
          type: integer
          nullable: true
          description: 주문 생성 시 고정된 파일 보관 기간(일, 7 또는 30). 무결성 예외에서만 `null`입니다
          example: 30
        thumbnailImageUrl:
          type: string
          format: uri
          nullable: true
          description: >-
            썸네일 이미지 URL. 출처는 주문 종류별 규칙을 따릅니다. Anti-AI 주문과 v2 워터마크 주문은 미완료·실패
            상태에서 고정 상태 이미지를, AI Detection 주문은 상세 썸네일 또는 원본 이미지를, v3 워터마크 주문은 상세
            썸네일을 반환하며 처리 전에는 `null`일 수 있습니다
        processingDelayed:
          type: boolean
          description: >-
            v3로 만든 워터마크 주문이 자동 재시도를 모두 소진해 수동 복구를 기다리면 `true`입니다. 주문은
            `inProgress`를 유지합니다. 그 외 주문은 항상 `false`입니다
        errors:
          type: object
          nullable: true
          description: >-
            실패한 주문의 오류 정보이며 그 외에는 `null`입니다. v3로 만든 워터마크 주문은 공개 `errorCode`와 고정
            안내 문구 `errorMessage`를 반환합니다. 그 외 주문은 저장된 오류 정보를 그대로 반환하며
            `errorCode`가 없을 수 있습니다
          properties:
            errorCode:
              type: string
              description: >-
                오류 코드. 예: `WATERMARK_FILE_CORRUPTED`, `ORDER_TIMEOUT`,
                `PROCESSING_ERROR`
              example: WATERMARK_FILE_CORRUPTED
            errorMessage:
              type: string
              description: 오류 코드별 고정 안내 문구(한국어). 처리기 원문 출력은 포함하지 않습니다
        inputFiles:
          type: array
          description: >-
            입력 파일 목록(요청 순서). 파일 수는 `inputFiles.length`입니다. `watermarkExtract`
            주문은 `PublicExtractInputFile`(`role` 포함), 그 외 주문은
            `PublicInputFile`입니다
          items:
            anyOf:
              - $ref: '#/components/schemas/PublicInputFile'
              - $ref: '#/components/schemas/PublicExtractInputFile'
        result:
          type: object
          nullable: true
          description: 주문 종류별 결과. 키는 항상 있으며 `status`가 `complete`일 때만 객체이고 그 외에는 `null`입니다
    PublicInputFile:
      type: object
      description: >-
        `watermarkExtract` 외 주문의 입력 파일(요청 순서). `role` 키는 없습니다. `uploadUrl` 키는 주문
        `status`가 `pending`이고 해당 파일이 업로드 대기 중일 때만 나오며, 그 외에는 키 자체가 없습니다(`null`로
        채우지 않음)
      required:
        - fileId
        - fileName
      additionalProperties: false
      properties:
        fileId:
          type: string
          pattern: ^[0-9]+$
          description: 입력 파일 ID. 숫자로만 된 문자열입니다
          example: '11'
        fileName:
          type: string
          nullable: true
          description: 입력 파일명(확장자 포함). 알 수 없으면 `null`입니다
          example: cat.png
        uploadUrl:
          type: string
          format: uri
          description: >-
            파일 업로드용 presigned `PUT` URL. 주문 `status`가 `pending`이고 보관 기한 전이며 해당
            파일이 업로드 대기 중일 때만 나옵니다. 업로드가 끝난 파일, `originalFileUrl`로 지정한 파일,
            `pending`이 아닌 주문에서는 키가 없습니다
    PublicAntiAiResult:
      type: object
      nullable: true
      description: Anti-AI 주문 결과. `status`가 `complete`일 때만 객체이고 그 외에는 `null`입니다
      required:
        - outputFiles
      additionalProperties: false
      properties:
        outputFiles:
          type: array
          description: 결과 파일 목록. 입력 파일마다 결과 1개입니다
          items:
            $ref: '#/components/schemas/PublicOutputFile'
    PublicWatermarkEmbedResult:
      type: object
      nullable: true
      description: >-
        워터마크 삽입 주문 결과. `status`가 `complete`일 때만 객체이고 그 외에는 `null`입니다. 이전 v3 응답의
        `outputs[]`와 v2 상세의 `watermarks[]`를 대체합니다
      required:
        - outputFiles
      additionalProperties: false
      properties:
        outputFiles:
          type: array
          description: 결과 파일 목록. 입력 파일 순서, 같은 입력 안에서는 결과 순서로 정렬합니다
          items:
            $ref: '#/components/schemas/PublicWatermarkEmbedOutputFile'
    PublicExtractInputFile:
      type: object
      description: >-
        `watermarkExtract` 주문의 입력 파일. 원본과 검사 대상을 구분하는 `role`이 더해집니다. `uploadUrl`
        규칙은 `PublicInputFile`과 같습니다
      required:
        - fileId
        - fileName
        - role
      additionalProperties: false
      properties:
        fileId:
          type: string
          pattern: ^[0-9]+$
          description: 입력 파일 ID. 숫자로만 된 문자열입니다
          example: '51'
        fileName:
          type: string
          nullable: true
          description: 입력 파일명(확장자 포함). 알 수 없으면 `null`입니다
          example: suspect.png
        role:
          type: string
          enum:
            - original
            - query
          description: >-
            * `original` - 워터마크를 넣은 원본 파일

            * `query` - 워터마크가 있는지 검사할 파일. v2 주문의 `watermarked` 역할도 `query`로
            반환합니다
        uploadUrl:
          type: string
          format: uri
          description: >-
            파일 업로드용 presigned `PUT` URL. `status`가 `pending`이고 해당 파일이 업로드 대기 중일
            때만 나옵니다
    PublicWatermarkExtractResult:
      type: object
      nullable: true
      description: >-
        워터마크 검출 주문 결과. `status`가 `complete`일 때만 객체이고 그 외에는 `null`입니다. 워터마크 ID,
        엔진 사유 코드 같은 내부 값은 포함하지 않습니다
      required:
        - detectionStatus
        - watermarkText
        - reportSupported
        - reports
      additionalProperties: false
      properties:
        detectionStatus:
          type: string
          nullable: true
          enum:
            - detected
            - undetected
            - inconclusive
            - unsupported
            - error
            - null
          description: >-
            판정 값. 검출 기록이 없는 v2 주문(데이터 이상)만 `null`입니다.

            * `detected` - 워터마크를 찾음

            * `undetected` - 끝까지 검사했으나 워터마크 없음. v3 엔진의 `not_detected`와 저장
            status가 `undetected`인 v2 주문을 포함합니다

            * `inconclusive` - 후보는 있으나 확신 기준에 못 미쳐 판단할 수 없음

            * `unsupported` - 처리할 수 없는 입력(크레딧 환불)

            * `error` - 검출 처리 실패. 워터마크 없음과 다릅니다. 검출 처리에 실패한 v2 주문을 포함합니다
        watermarkText:
          type: string
          nullable: true
          description: >-
            검출된 워터마크의 삽입 문구. `detectionStatus`가 `detected`가 아니면 `null`입니다. v3
            주문은 호출 계정이 직접 삽입했고 발급 기록이 정확히 1건일 때만 반환하며, 그 외에는 `null`입니다
        reportSupported:
          type: boolean
          description: 이 검출 결과로 분석 보고서를 만들 수 있는지 여부. v2 주문과 PDF에서 캡처한 이미지는 `false`입니다
        reports:
          type: array
          description: 이 주문의 locale별 보고서 상태. v2 주문은 항상 빈 배열입니다
          items:
            type: object
            required:
              - locale
              - status
            additionalProperties: false
            properties:
              locale:
                type: string
                enum:
                  - ko-KR
                  - en-US
                  - ja-JP
              status:
                type: string
                enum:
                  - queued
                  - processing
                  - completed
                  - failed
    PublicAiDetectionResult:
      type: object
      nullable: true
      description: >-
        AI Detection 주문 결과. `status`가 `complete`일 때만 객체이고 그 외에는 `null`입니다. 이전
        응답의 `statusCode`는 `verdict`로 대체되었습니다
      required:
        - verdict
        - probability
        - options
        - originalImageUrl
        - heatmapUrl
        - overlayUrl
      additionalProperties: false
      properties:
        verdict:
          type: string
          nullable: true
          enum:
            - likely_real
            - uncertain_real
            - uncertain_ai
            - likely_ai
            - null
          description: |-
            `probability` 기준 판정. `probability`가 `null`이면 `null`입니다.
            * `likely_real` - AI 생성 아님(높은 확률), probability < 0.25
            * `uncertain_real` - AI 생성 아님(낮은 확률), 0.25 <= probability < 0.5
            * `uncertain_ai` - AI 생성(낮은 확률), 0.5 <= probability < 0.75
            * `likely_ai` - AI 생성(높은 확률), probability >= 0.75
        probability:
          type: number
          format: float
          nullable: true
          minimum: 0
          maximum: 1
          description: AI 생성 확률(0~1). 값이 없으면 `null`입니다
          example: 0.31
        options:
          type: object
          nullable: true
          description: 주문 생성 시 설정한 옵션. 저장된 옵션이 없으면 `null`입니다
          properties:
            generateHeatmap:
              type: boolean
            generateOverlay:
              type: boolean
            generateThumbnail:
              type: boolean
        originalImageUrl:
          type: string
          format: uri
          nullable: true
          description: >-
            원본 입력 이미지 URL(presigned, 1시간 유효). 리사이즈 이미지가 모두 준비된 주문은 긴 변 1600px 이내
            WebP입니다
        heatmapUrl:
          type: string
          format: uri
          nullable: true
          description: >-
            히트맵 이미지 URL(presigned, 1시간 유효). `generateHeatmap` 옵션을 쓴 주문만 반환하고 그
            외에는 `null`입니다
        overlayUrl:
          type: string
          format: uri
          nullable: true
          description: >-
            원본 위 히트맵 오버레이 이미지 URL(presigned, 1시간 유효). `generateOverlay` 옵션을 쓴
            주문만 반환하고 그 외에는 `null`입니다
    PublicOutputFile:
      type: object
      description: Anti-AI 주문의 결과 파일 1개. `fileId`는 다운로드 응답 `files[].fileId`와 값·순서가 같습니다
      required:
        - fileId
        - fileName
        - inputFileId
      additionalProperties: false
      properties:
        fileId:
          type: string
          pattern: ^[0-9]+$
          description: 결과 파일 ID. 숫자로만 된 문자열이며 주문 안에서 유일합니다
          example: '21'
        fileName:
          type: string
          nullable: true
          description: 결과 파일명(확장자 포함). 알 수 없으면 `null`입니다
          example: cat.png
        inputFileId:
          type: string
          pattern: ^[0-9]+$
          description: 이 결과를 만든 입력 파일의 `inputFiles[].fileId`
          example: '11'
    PublicWatermarkEmbedOutputFile:
      type: object
      description: >-
        워터마크 삽입 주문의 결과 파일 1개. `PublicOutputFile`에 삽입 문구 `watermarkText`가 더해집니다.
        v3 주문에서 입력 파일 하나에 문구를 여러 개 넣으면 같은 `inputFileId`를 가진 결과 파일이 여러 개 나옵니다
      required:
        - fileId
        - fileName
        - inputFileId
        - watermarkText
      additionalProperties: false
      properties:
        fileId:
          type: string
          pattern: ^[0-9]+$
          description: 결과 파일 ID. 숫자로만 된 문자열이며 주문 안에서 유일합니다
          example: '201'
        fileName:
          type: string
          nullable: true
          description: 결과 파일명(확장자 포함). 알 수 없으면 `null`입니다
          example: logo.png
        inputFileId:
          type: string
          pattern: ^[0-9]+$
          description: 이 결과를 만든 입력 파일의 `inputFiles[].fileId`
          example: '31'
        watermarkText:
          type: string
          description: 이 결과 파일에 삽입한 워터마크 문구
          example: MORI
  responses:
    Unauthorized:
      description: 인증 실패
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          example:
            code: AUTH_NOT_AUTHENTICATED
    InternalError:
      description: 내부 서버 오류
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          example:
            code: SERVER_INTERNAL_ERROR
  securitySchemes:
    BearerAuth:
      type: http
      scheme: bearer
      description: >-
        외부 클라이언트 접근을 위한 Bearer API 키. 일반 키는 `sk_` 접두사를 사용하고, 테스트 키는 `sk_test_`
        접두사로 모의 응답을 사용해 실제 처리나 크레딧 사용 없이 주문 흐름을 검증합니다.

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.