curl -X POST https://api.bizmori.com/api/v2/orders/wtr-embed \
-H "Authorization: Bearer YOUR_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"idempotencyKey": "5e9c7a3b-b4d2-4f18-83e6-8b1a2d5f7c93",
"files": [
{
"fileName": "image.jpg",
"watermarks": [{"text": "MORI_WATERMARK"}]
}
]
}'const response = await fetch('https://api.bizmori.com/api/v2/orders/wtr-embed', {
method: 'POST',
headers: {
'Authorization': 'Bearer YOUR_API_TOKEN',
'Content-Type': 'application/json'
},
body: JSON.stringify({
idempotencyKey: '5e9c7a3b-b4d2-4f18-83e6-8b1a2d5f7c93',
files: [
{
fileName: 'image.jpg',
watermarks: [{ text: 'MORI_WATERMARK' }]
}
]
})
});
const data = await response.json();import requests
response = requests.post(
'https://api.bizmori.com/api/v2/orders/wtr-embed',
headers={'Authorization': 'Bearer YOUR_API_TOKEN'},
json={
'idempotencyKey': '5e9c7a3b-b4d2-4f18-83e6-8b1a2d5f7c93',
'files': [
{
'fileName': 'image.jpg',
'watermarks': [{'text': 'MORI_WATERMARK'}]
}
]
}
)
data = response.json()<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.bizmori.com/api/v2/orders/wtr-embed",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'idempotencyKey' => '5e9c7a3b-b4d2-4f18-83e6-8b1a2d5f7c93',
'files' => [
[
'fileName' => 'image1.jpg',
'watermarks' => [
[
'text' => 'MORI_WATERMARK'
]
]
],
[
'fileName' => 'image2.png',
'watermarks' => [
[
'text' => 'MORI_WATERMARK'
]
]
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.bizmori.com/api/v2/orders/wtr-embed"
payload := strings.NewReader("{\n \"idempotencyKey\": \"5e9c7a3b-b4d2-4f18-83e6-8b1a2d5f7c93\",\n \"files\": [\n {\n \"fileName\": \"image1.jpg\",\n \"watermarks\": [\n {\n \"text\": \"MORI_WATERMARK\"\n }\n ]\n },\n {\n \"fileName\": \"image2.png\",\n \"watermarks\": [\n {\n \"text\": \"MORI_WATERMARK\"\n }\n ]\n }\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.bizmori.com/api/v2/orders/wtr-embed")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"idempotencyKey\": \"5e9c7a3b-b4d2-4f18-83e6-8b1a2d5f7c93\",\n \"files\": [\n {\n \"fileName\": \"image1.jpg\",\n \"watermarks\": [\n {\n \"text\": \"MORI_WATERMARK\"\n }\n ]\n },\n {\n \"fileName\": \"image2.png\",\n \"watermarks\": [\n {\n \"text\": \"MORI_WATERMARK\"\n }\n ]\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.bizmori.com/api/v2/orders/wtr-embed")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"idempotencyKey\": \"5e9c7a3b-b4d2-4f18-83e6-8b1a2d5f7c93\",\n \"files\": [\n {\n \"fileName\": \"image1.jpg\",\n \"watermarks\": [\n {\n \"text\": \"MORI_WATERMARK\"\n }\n ]\n },\n {\n \"fileName\": \"image2.png\",\n \"watermarks\": [\n {\n \"text\": \"MORI_WATERMARK\"\n }\n ]\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"data": {
"orderName": "wtr_embed_20260318120000.000",
"orderId": "424706541233094656",
"status": "pending",
"files": [
{
"fileId": 2469,
"fileName": "image.jpg",
"uploadUrl": "https://s3.ap-northeast-2.amazonaws.com/...?X-Amz-Algorithm=AWS4-HMAC-SHA256&...",
"fileKey": "wtr-embed/424706541233094656/images/1/image.jpg",
"fileFormat": "JPG",
"fileType": "IMG"
},
{
"fileId": 2470,
"fileName": "document.pdf",
"uploadUrl": "https://s3.ap-northeast-2.amazonaws.com/...?X-Amz-Algorithm=AWS4-HMAC-SHA256&...",
"fileKey": "wtr-embed/424706541233094656/documents/2/document.pdf",
"fileFormat": "PDF",
"fileType": "DOCUMENT"
}
]
}
}워터마크 삽입 주문 생성
지원 종료. 이 엔드포인트는 2026년 10월 9일 09:00 KST(00:00 UTC)에 지원이 종료되었습니다. POST /api/v3/orders/wtr-embed를 사용하세요.
이 엔드포인트의 모든 응답(인증 오류와 410 응답 포함)에는 Deprecation: true, Sunset: Fri, 09 Oct 2026 00:00:00 GMT, Link: </api/v3/orders/wtr-embed>; rel="successor-version" 헤더가 포함됩니다.
2026년 10월 9일 09:00 KST(00:00 UTC)부터:
- 인증·권한 검사는 지금처럼 먼저 수행하므로
401,403오류는 기존과 같습니다. - 인증을 통과한 v2 워터마크 삽입·검출 요청은 live 키와
sk_test_키 모두410 Gone과{ "code": "WATERMARK_V2_API_SUNSET" }을 받습니다.Link헤더가 v3 엔드포인트를 가리키니 v3로 새로 요청하세요. - 그때까지 처리를 시작하지 않은 v2 주문은 처리되지 않고 실패로 확정됩니다. 주문 상세(
errors.errorCode)와 실패 웹훅에WATERMARK_V2_API_SUNSET과 v3 안내 메시지가 담기며, 과금되지 않고 크레딧은 복원됩니다. - 종료 시각에 이미 처리 중인 주문은 결과 기록까지 마칩니다. 이후 새로 다시 실행하지는 않습니다.
워터마크 삽입 주문을 생성합니다.
- 이미지당 최대 10개의 워터마크 텍스트
- 주문당 최대 100개의 파일
- 지원 이미지 형식 (IMG): jpg, jpeg, png, webp, bmp, tiff
- 지원 문서 형식 (DOCUMENT): pdf
입력 모드 (업로드 / URL / 혼합)
입력 모드는 각 파일 객체의 originalFileUrl 존재 여부에 따라 결정됩니다:
- 업로드 모드 (
originalFileUrl없음): Presigned URL 발급 → 클라이언트가 S3에 업로드 → 처리 자동 시작 - URL 모드 (
originalFileUrl제공): 해당 URL에서 이미지를 다운로드하여 즉시 처리 - 혼합 모드: 일부 파일은 업로드 모드, 나머지는 URL 모드로 동시 처리
동작 방식
| 조건 | 주문 상태 | Confirm 필요 여부 |
|---|---|---|
모든 파일에 originalFileUrl 있음 | pending | 불필요 (서버 다운로드 후 자동 시작) |
originalFileUrl 없는 파일 존재 | pending | 불필요 (업로드 후 자동 시작) |
curl -X POST https://api.bizmori.com/api/v2/orders/wtr-embed \
-H "Authorization: Bearer YOUR_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"idempotencyKey": "5e9c7a3b-b4d2-4f18-83e6-8b1a2d5f7c93",
"files": [
{
"fileName": "image.jpg",
"watermarks": [{"text": "MORI_WATERMARK"}]
}
]
}'const response = await fetch('https://api.bizmori.com/api/v2/orders/wtr-embed', {
method: 'POST',
headers: {
'Authorization': 'Bearer YOUR_API_TOKEN',
'Content-Type': 'application/json'
},
body: JSON.stringify({
idempotencyKey: '5e9c7a3b-b4d2-4f18-83e6-8b1a2d5f7c93',
files: [
{
fileName: 'image.jpg',
watermarks: [{ text: 'MORI_WATERMARK' }]
}
]
})
});
const data = await response.json();import requests
response = requests.post(
'https://api.bizmori.com/api/v2/orders/wtr-embed',
headers={'Authorization': 'Bearer YOUR_API_TOKEN'},
json={
'idempotencyKey': '5e9c7a3b-b4d2-4f18-83e6-8b1a2d5f7c93',
'files': [
{
'fileName': 'image.jpg',
'watermarks': [{'text': 'MORI_WATERMARK'}]
}
]
}
)
data = response.json()<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.bizmori.com/api/v2/orders/wtr-embed",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'idempotencyKey' => '5e9c7a3b-b4d2-4f18-83e6-8b1a2d5f7c93',
'files' => [
[
'fileName' => 'image1.jpg',
'watermarks' => [
[
'text' => 'MORI_WATERMARK'
]
]
],
[
'fileName' => 'image2.png',
'watermarks' => [
[
'text' => 'MORI_WATERMARK'
]
]
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.bizmori.com/api/v2/orders/wtr-embed"
payload := strings.NewReader("{\n \"idempotencyKey\": \"5e9c7a3b-b4d2-4f18-83e6-8b1a2d5f7c93\",\n \"files\": [\n {\n \"fileName\": \"image1.jpg\",\n \"watermarks\": [\n {\n \"text\": \"MORI_WATERMARK\"\n }\n ]\n },\n {\n \"fileName\": \"image2.png\",\n \"watermarks\": [\n {\n \"text\": \"MORI_WATERMARK\"\n }\n ]\n }\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.bizmori.com/api/v2/orders/wtr-embed")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"idempotencyKey\": \"5e9c7a3b-b4d2-4f18-83e6-8b1a2d5f7c93\",\n \"files\": [\n {\n \"fileName\": \"image1.jpg\",\n \"watermarks\": [\n {\n \"text\": \"MORI_WATERMARK\"\n }\n ]\n },\n {\n \"fileName\": \"image2.png\",\n \"watermarks\": [\n {\n \"text\": \"MORI_WATERMARK\"\n }\n ]\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.bizmori.com/api/v2/orders/wtr-embed")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"idempotencyKey\": \"5e9c7a3b-b4d2-4f18-83e6-8b1a2d5f7c93\",\n \"files\": [\n {\n \"fileName\": \"image1.jpg\",\n \"watermarks\": [\n {\n \"text\": \"MORI_WATERMARK\"\n }\n ]\n },\n {\n \"fileName\": \"image2.png\",\n \"watermarks\": [\n {\n \"text\": \"MORI_WATERMARK\"\n }\n ]\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"data": {
"orderName": "wtr_embed_20260318120000.000",
"orderId": "424706541233094656",
"status": "pending",
"files": [
{
"fileId": 2469,
"fileName": "image.jpg",
"uploadUrl": "https://s3.ap-northeast-2.amazonaws.com/...?X-Amz-Algorithm=AWS4-HMAC-SHA256&...",
"fileKey": "wtr-embed/424706541233094656/images/1/image.jpg",
"fileFormat": "JPG",
"fileType": "IMG"
},
{
"fileId": 2470,
"fileName": "document.pdf",
"uploadUrl": "https://s3.ap-northeast-2.amazonaws.com/...?X-Amz-Algorithm=AWS4-HMAC-SHA256&...",
"fileKey": "wtr-embed/424706541233094656/documents/2/document.pdf",
"fileFormat": "PDF",
"fileType": "DOCUMENT"
}
]
}
}POST /api/v3/orders/wtr-embed를 사용하고, 마이그레이션 방법은 워터마크 삽입 빠른 시작을 참고하세요.v2 지원 종료 후 동작 (2026년 10월 9일 09:00 KST, 00:00 UTC부터):- 인증·권한 검사는 지금처럼 먼저 수행하므로
401,403오류는 기존과 같습니다. - 인증을 통과한 v2 워터마크 삽입·검출 요청은 live 키와
sk_test_키 모두410 Gone과{ "code": "WATERMARK_V2_API_SUNSET" }을 받습니다.Link헤더가 v3 엔드포인트를 가리키니 v3로 새로 요청하세요. - 그때까지 처리를 시작하지 않은 v2 주문은 처리되지 않고 실패로 확정됩니다. 주문 상세(
errors.errorCode)와 실패 웹훅에WATERMARK_V2_API_SUNSET과 v3 안내 메시지가 담기며, 과금되지 않고 크레딧은 복원됩니다. - 종료 시각에 이미 처리 중인 주문은 결과 기록까지 마칩니다. 이후 새로 다시 실행하지는 않습니다.
- 기존 v2 주문 조회와 이미 생성된 결과·보고서 다운로드는 기존 보존 기간 안에서 계속 이용할 수 있습니다. v2 보고서를 새로 생성하거나 재생성할 수는 없습니다.
Deprecation: true, Sunset: Fri, 09 Oct 2026 00:00:00 GMT, Link 헤더만 추가됩니다.지원 종료 후 응답
2026년 10월 9일 09:00 KST(00:00 UTC)부터 이 엔드포인트에 인증을 통과한 요청을 보내면 다음과 같이 응답합니다.HTTP/1.1 410 Gone
Content-Type: application/json; charset=utf-8
Deprecation: true
Sunset: Fri, 09 Oct 2026 00:00:00 GMT
Link: </api/v3/orders/wtr-embed>; rel="successor-version"
{ "code": "WATERMARK_V2_API_SUNSET" }
Link 헤더의 v3 엔드포인트로 새로 요청하세요.
sk_test_ 키를 사용하면 응답의 BIZ MORI 테스트 업로드 URL로 파일을 업로드합니다. 업로드가 끝나면 confirm 없이 처리가 시작되며 다운로드 가능한 결과 파일은 만들지 않습니다.주문 결과 다운로드
주문이complete 상태가 되면 주문 결과 다운로드 URL 발급을 호출하세요. 한 번의 호출로 결과 파일별 URL(files[])과 결과 전체 ZIP(archiveUrl)을 함께 받습니다.
curl -X GET https://api.bizmori.com/api/v3/orders/{orderId}/download \
-H "Authorization: Bearer YOUR_API_KEY"
expiresAt까지 내려받을 수 있으며, 그 뒤에는 400 ORDER_EXPIRED를 반환합니다. sk_test_ 주문의 URL은 실제 결과가 아니라 고정 샘플 파일을 가리킵니다.인증
외부 클라이언트 접근을 위한 Bearer API 키. 일반 키는 sk_ 접두사를 사용하고, 테스트 키는 sk_test_ 접두사로 모의 응답을 사용해 실제 처리나 크레딧 사용 없이 주문 흐름을 검증합니다.
본문
멱등성 키
1 - 100 elementsHide child attributes
Hide child attributes
파일 이름
"image.jpg"
원본 이미지 URL (선택)
- 제공 시: URL 모드 (presigned URL 미발급, 즉시 처리)
- 미제공 시: 업로드 모드 (presigned URL 발급)
"https://example.com/image.jpg"
응답
주문 생성 성공
Hide child attributes
Hide child attributes
주문 상태
pending: 입력 모드에 관계없이 항상 반환
pending Hide child attributes
Hide child attributes
업로드 URL이며 업로드 모드에서만 반환됩니다. live 키는 S3 presigned URL을 받고, 테스트 키는 절대 https://api.bizmori.com/api/v2/test-uploads/{signedToken} URL을 받습니다. 두 URL은 1시간 후 만료됩니다. signed token 자체가 테스트 업로드를 인가하므로 PUT에 Authorization 헤더가 필요 없습니다. 테스트 요청 본문은 스트림으로 소비되어 저장되지 않으며, 테스트 주문은 사용량 차감이나 실제 외부 처리 없이 모의 결과로 전이합니다.
요청에 전달된 공개 이미지 URL. URL 모드에서만 반환됩니다.
파일 식별자: live 키에서는 S3 object key이고 테스트 키에서는 격리된 logical key입니다.
파일 형식.
JPG, PNG, WEBP, BMP, TIFF, PDF 파일 유형 분류.
IMG, DOCUMENT