curl -X GET https://api.bizmori.com/api/v3/orders/ORDER_ID/download \
-H "Authorization: Bearer YOUR_API_KEY"const orderId = 'ORDER_ID';
const response = await fetch(`https://api.bizmori.com/api/v3/orders/${orderId}/download`, {
headers: { 'Authorization': 'Bearer YOUR_API_KEY' }
});
const { data } = await response.json();
import requests
order_id = 'ORDER_ID'
response = requests.get(
f'https://api.bizmori.com/api/v3/orders/{order_id}/download',
headers={'Authorization': 'Bearer YOUR_API_KEY'}
)
data = response.json()['data']
<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.bizmori.com/api/v3/orders/{orderId}/download",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.bizmori.com/api/v3/orders/{orderId}/download"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.bizmori.com/api/v3/orders/{orderId}/download")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.bizmori.com/api/v3/orders/{orderId}/download")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"data": {
"archiveUrl": "https://bucket.s3.ap-northeast-2.amazonaws.com/zip/1001/archive.zip?X-Amz-...",
"files": [
{
"fileId": "21",
"downloadUrl": "https://bucket.s3.ap-northeast-2.amazonaws.com/out/cat.png?X-Amz-..."
},
{
"fileId": "22",
"downloadUrl": "https://bucket.s3.ap-northeast-2.amazonaws.com/out/dog.png?X-Amz-..."
}
],
"expiresInSeconds": 3600
}
}주문 결과 다운로드 URL 발급
완료된 Anti-AI·워터마크 삽입 주문의 결과 파일별 다운로드 URL과 결과 전체를 받는 URL을 한 번에 발급합니다. 워터마크 주문을 v2·v3 어느 쪽으로 만들었든 응답 형식은 같습니다.
files[]: 결과 파일별{ fileId, downloadUrl }.GET /api/v3/orders/{orderId}의result.outputFiles[]와 같은 파일을 같은 순서로 담고fileId도 같습니다archiveUrl: 이 URL 하나로 결과 전체를 받습니다. 항상 문자열입니다- Anti-AI 주문, v2로 만든 워터마크 삽입 주문: 결과 ZIP
- v3로 만든 워터마크 삽입 주문: 결과 파일이 2개 이상이면 ZIP, 1개면 그 결과 파일 URL(
files[0].downloadUrl과 같은 파일)
expiresInSeconds: URL 유효 시간. 기본 3600초(1시간)이며, 보관 기한(expiresAt)까지 남은 시간이 더 짧으면 그 시간으로 줄입니다. 새 URL이 필요하면 다시 호출하세요
오류 검사 순서 (처음 걸린 오류를 반환)
- 주문이 없거나 다른 계정의 주문 →
404 ORDER_NOT_FOUND - 워터마크 검출·AI Detection 주문 →
400 ORDER_TYPE_CANT_DOWNLOAD. 보관 기한이 지났어도 이 오류입니다 - 보관 기한 만료 →
400 ORDER_EXPIRED. 보관 기한을 확인할 수 없으면409 FILE_RETENTION_UNKNOWN status가complete가 아님(pending·inProgress·failed) →400 ORDER_NOT_COMPLETED
이전 v3 응답과의 차이(breaking change, 2026-10-08): 응답이 { downloadUrl, expiresInSeconds: 300 }에서 { archiveUrl, files, expiresInSeconds }로 바뀌었고, Anti-AI 주문과 v2로 만든 워터마크 삽입 주문도 지원합니다. URL 유효 시간은 300초에서 최대 3600초로 늘었습니다. 미완료 주문은 VALIDATION_FAILED 대신 ORDER_NOT_COMPLETED를, 검출 주문은 ORDER_TYPE_CANT_DOWNLOAD를 반환합니다. 결과 파일 하나를 받는 GET /api/v3/orders/{orderId}/files/{fileId}/download는 삭제되었습니다. files[]를 사용하세요.
테스트 키(sk_test_): 같은 키로 만든 완료된 Anti-AI·워터마크 삽입 테스트 주문(v2·v3)에서 동작합니다. URL은 처리 결과가 아니라 https://api.bizmori.com/api/v2/test-samples/{signedToken}에서 제공하는 샘플 파일을 가리킵니다. 결과 파일이 없는 Anti-AI 테스트 주문은 files: []와 샘플 ZIP archiveUrl을 반환합니다. 결과가 1개인 v3 삽입 테스트 주문은 그 샘플 파일을, 그 외 테스트 주문은 샘플 ZIP을 archiveUrl로 반환합니다. expiresInSeconds, 오류 코드, 검사 순서는 운영 주문과 같습니다.
curl -X GET https://api.bizmori.com/api/v3/orders/ORDER_ID/download \
-H "Authorization: Bearer YOUR_API_KEY"const orderId = 'ORDER_ID';
const response = await fetch(`https://api.bizmori.com/api/v3/orders/${orderId}/download`, {
headers: { 'Authorization': 'Bearer YOUR_API_KEY' }
});
const { data } = await response.json();
import requests
order_id = 'ORDER_ID'
response = requests.get(
f'https://api.bizmori.com/api/v3/orders/{order_id}/download',
headers={'Authorization': 'Bearer YOUR_API_KEY'}
)
data = response.json()['data']
<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.bizmori.com/api/v3/orders/{orderId}/download",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.bizmori.com/api/v3/orders/{orderId}/download"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.bizmori.com/api/v3/orders/{orderId}/download")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.bizmori.com/api/v3/orders/{orderId}/download")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"data": {
"archiveUrl": "https://bucket.s3.ap-northeast-2.amazonaws.com/zip/1001/archive.zip?X-Amz-...",
"files": [
{
"fileId": "21",
"downloadUrl": "https://bucket.s3.ap-northeast-2.amazonaws.com/out/cat.png?X-Amz-..."
},
{
"fileId": "22",
"downloadUrl": "https://bucket.s3.ap-northeast-2.amazonaws.com/out/dog.png?X-Amz-..."
}
],
"expiresInSeconds": 3600
}
}GET /api/v3/orders/{orderId}/files/{fileId}/download는 삭제되었습니다. 이전 응답과의 차이를 확인하세요.응답 필드
| 필드 | 타입 | 설명 |
|---|---|---|
archiveUrl | string | 결과 전체를 받는 URL. 항상 있음 |
files[] | array | 결과 파일별 { fileId, downloadUrl } |
expiresInSeconds | integer | URL 유효 시간(초). 최대 3600 |
files[]는 주문 상세 조회의 result.outputFiles[]와 같은 파일을 같은 순서로 담고 fileId도 같습니다. fileId로 각 URL을 결과 파일과 그 inputFileId에 연결하세요.
archiveUrl이 가리키는 파일
| 주문 | archiveUrl |
|---|---|
| Anti-AI | 모든 결과 파일의 ZIP |
| v2로 만든 워터마크 삽입 | 모든 결과 파일의 ZIP |
| v3로 만든 워터마크 삽입, 결과 파일 2개 이상 | 모든 결과 파일의 ZIP |
| v3로 만든 워터마크 삽입, 결과 파일 1개 | 그 결과 파일(files[0].downloadUrl과 같은 파일) |
archiveUrl은 결과 파일 하나이거나 전체 ZIP이므로, 다운로드 버튼 하나에 그대로 연결할 수 있습니다.
URL 유효 시간
URL은 3600초(1시간) 동안 유효합니다. 주문의 보관 기한(expiresAt)이 그보다 먼저 끝나면 남은 시간으로 줄이고, expiresInSeconds에 줄인 값을 넣습니다. URL을 저장해 두지 말고 내려받을 때마다 이 엔드포인트를 다시 호출하세요.
예시
{
"data": {
"archiveUrl": "https://bucket.s3.ap-northeast-2.amazonaws.com/zip/1001/archive.zip?X-Amz-...",
"files": [
{
"fileId": "21",
"downloadUrl": "https://bucket.s3.ap-northeast-2.amazonaws.com/out/cat.png?X-Amz-..."
},
{
"fileId": "22",
"downloadUrl": "https://bucket.s3.ap-northeast-2.amazonaws.com/out/dog.png?X-Amz-..."
}
],
"expiresInSeconds": 3600
}
}
{
"data": {
"archiveUrl": "https://bucket.s3.ap-northeast-2.amazonaws.com/out/logo.png?X-Amz-...",
"files": [
{
"fileId": "201",
"downloadUrl": "https://bucket.s3.ap-northeast-2.amazonaws.com/out/logo.png?X-Amz-..."
}
],
"expiresInSeconds": 3600
}
}
{
"data": {
"archiveUrl": "https://bucket.s3.ap-northeast-2.amazonaws.com/archive/2001.zip?X-Amz-...",
"files": [
{
"fileId": "201",
"downloadUrl": "https://bucket.s3.ap-northeast-2.amazonaws.com/out/logo-1.png?X-Amz-..."
},
{
"fileId": "202",
"downloadUrl": "https://bucket.s3.ap-northeast-2.amazonaws.com/out/logo-2.png?X-Amz-..."
}
],
"expiresInSeconds": 3600
}
}
결과 파일 모두 내려받기
import { writeFile } from 'node:fs/promises';
const headers = { Authorization: 'Bearer YOUR_API_KEY' };
const base = `https://api.bizmori.com/api/v3/orders/${orderId}`;
const { data: order } = await (await fetch(base, { headers })).json();
const { data: download } = await (await fetch(`${base}/download`, { headers })).json();
// files[]와 result.outputFiles[]는 fileId 값과 순서가 같습니다.
const names = new Map(order.result.outputFiles.map((file) => [file.fileId, file.fileName]));
for (const { fileId, downloadUrl } of download.files) {
const res = await fetch(downloadUrl);
await writeFile(`${fileId}-${names.get(fileId)}`, Buffer.from(await res.arrayBuffer()));
}
import requests
headers = {'Authorization': 'Bearer YOUR_API_KEY'}
base = f'https://api.bizmori.com/api/v3/orders/{order_id}'
order = requests.get(base, headers=headers).json()['data']
download = requests.get(f'{base}/download', headers=headers).json()['data']
# files[]와 result.outputFiles[]는 fileId 값과 순서가 같습니다.
names = {f['fileId']: f['fileName'] for f in order['result']['outputFiles']}
for item in download['files']:
res = requests.get(item['downloadUrl'])
with open(f"{item['fileId']}-{names[item['fileId']]}", 'wb') as out:
out.write(res.content)
오류
아래 순서로 오류를 검사하고 처음 해당하는 오류를 반환합니다.| 순서 | 조건 | HTTP | code |
|---|---|---|---|
| 1 | 주문이 없거나 다른 계정의 주문 | 404 | ORDER_NOT_FOUND |
| 2 | 워터마크 검출·AI Detection 주문(보관 기한이 지났어도 동일) | 400 | ORDER_TYPE_CANT_DOWNLOAD |
| 3 | 보관 기한 만료 | 400 | ORDER_EXPIRED |
| 3 | 보관 기한을 확인할 수 없음 | 409 | FILE_RETENTION_UNKNOWN |
| 4 | status가 pending, inProgress, failed | 400 | ORDER_NOT_COMPLETED |
orderId 형식이 잘못되면 400 VALIDATION_FAILED를 반환합니다.
이전 응답과의 차이
2026년 10월 8일부터 이 엔드포인트는 위 형식으로 응답합니다. 하위 호환되지 않는 변경입니다.| 이전 동작 | 현재 |
|---|---|
응답 { downloadUrl, expiresInSeconds } | { archiveUrl, files, expiresInSeconds }. downloadUrl 대신 archiveUrl |
| v3 워터마크 삽입 주문만 지원 | Anti-AI 주문, v2·v3로 만든 워터마크 삽입 주문 지원 |
| URL 300초 유효 | 최대 3600초. 보관 기한까지로 제한 |
미완료 주문: 400 VALIDATION_FAILED | 400 ORDER_NOT_COMPLETED |
| 워터마크 검출·AI Detection 주문: 지원 안 함 | 계속 지원하지 않으며 전용 오류 400 ORDER_TYPE_CANT_DOWNLOAD 반환 |
결과 파일 하나를 받는 GET /api/v3/orders/{orderId}/files/{fileId}/download | 삭제됨. 이 엔드포인트의 files[] 사용 |
GET /api/v2/orders/{orderId}/download는 기존 응답을 그대로 반환합니다.
테스트 키
sk_test_ 키로 호출하면 같은 키로 만든 완료된 Anti-AI·워터마크 삽입 테스트 주문에서 동작합니다. URL은 처리 결과가 아니라 고정 샘플 파일을 가리킵니다. 테스트 API 키를 참고하세요.인증
외부 클라이언트 접근을 위한 Bearer API 키. 일반 키는 sk_ 접두사를 사용하고, 테스트 키는 sk_test_ 접두사로 모의 응답을 사용해 실제 처리나 크레딧 사용 없이 주문 흐름을 검증합니다.
경로 매개변수
주문 ID
^[0-9]{1,20}$응답
결과 파일별 URL과 결과 전체 URL
Hide child attributes
Hide child attributes
결과 전체를 한 번에 받는 URL. Anti-AI 주문과 v2 워터마크 삽입 주문은 결과 ZIP입니다. v3 워터마크 삽입 주문은 결과 파일이 2개 이상이면 ZIP, 1개면 그 결과 파일 URL(files[0].downloadUrl과 같은 파일)입니다
URL 유효 시간(초). 기본 3600초이며 expiresAt까지 남은 시간이 더 짧으면 그 시간으로 줄입니다
x <= 36003600