curl -X POST https://api.bizmori.com/api/v3/orders/wtr-embed \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"idempotencyKey": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"files": [
{
"fileName": "campaign.png",
"watermarks": [
{
"text": "MORI-2026-001"
}
]
},
{
"fileName": "contract.pdf",
"originalFileUrl": "https://example.com/contract.pdf",
"watermarks": [
{
"text": "PARTNER-A"
},
{
"text": "PARTNER-B"
}
]
}
]
}'const response = await fetch(`https://api.bizmori.com/api/v3/orders/wtr-embed`, {
method: 'POST',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json'
},
body: JSON.stringify({
"idempotencyKey": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"files": [
{
"fileName": "campaign.png",
"watermarks": [
{
"text": "MORI-2026-001"
}
]
},
{
"fileName": "contract.pdf",
"originalFileUrl": "https://example.com/contract.pdf",
"watermarks": [
{
"text": "PARTNER-A"
},
{
"text": "PARTNER-B"
}
]
}
]
})
});
const { data } = await response.json();
// 각 파일을 presigned URL로 PUT 업로드합니다 (files[]는 요청 순서)
// await fetch(data.files[0].uploadUrl, { method: 'PUT', body: file });
import requests
response = requests.post(
f'https://api.bizmori.com/api/v3/orders/wtr-embed',
headers={'Authorization': 'Bearer YOUR_API_KEY'},
json={
"idempotencyKey": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"files": [
{
"fileName": "campaign.png",
"watermarks": [
{
"text": "MORI-2026-001"
}
]
},
{
"fileName": "contract.pdf",
"originalFileUrl": "https://example.com/contract.pdf",
"watermarks": [
{
"text": "PARTNER-A"
},
{
"text": "PARTNER-B"
}
]
}
]
}
)
data = response.json()['data']
# 각 파일을 presigned URL로 PUT 업로드합니다 (files[]는 요청 순서)
# requests.put(data['files'][0]['uploadUrl'], data=open('campaign.png', 'rb'))
<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.bizmori.com/api/v3/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' => 'f47ac10b-58cc-4372-a567-0e02b2c3d479',
'files' => [
[
'fileName' => 'campaign.png',
'watermarks' => [
[
'text' => 'MORI-2026-001'
]
]
],
[
'fileName' => 'contract.pdf',
'originalFileUrl' => 'https://example.com/contract.pdf',
'watermarks' => [
[
'text' => 'PARTNER-A'
],
[
'text' => 'PARTNER-B'
]
]
]
]
]),
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/v3/orders/wtr-embed"
payload := strings.NewReader("{\n \"idempotencyKey\": \"f47ac10b-58cc-4372-a567-0e02b2c3d479\",\n \"files\": [\n {\n \"fileName\": \"campaign.png\",\n \"watermarks\": [\n {\n \"text\": \"MORI-2026-001\"\n }\n ]\n },\n {\n \"fileName\": \"contract.pdf\",\n \"originalFileUrl\": \"https://example.com/contract.pdf\",\n \"watermarks\": [\n {\n \"text\": \"PARTNER-A\"\n },\n {\n \"text\": \"PARTNER-B\"\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/v3/orders/wtr-embed")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"idempotencyKey\": \"f47ac10b-58cc-4372-a567-0e02b2c3d479\",\n \"files\": [\n {\n \"fileName\": \"campaign.png\",\n \"watermarks\": [\n {\n \"text\": \"MORI-2026-001\"\n }\n ]\n },\n {\n \"fileName\": \"contract.pdf\",\n \"originalFileUrl\": \"https://example.com/contract.pdf\",\n \"watermarks\": [\n {\n \"text\": \"PARTNER-A\"\n },\n {\n \"text\": \"PARTNER-B\"\n }\n ]\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.bizmori.com/api/v3/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\": \"f47ac10b-58cc-4372-a567-0e02b2c3d479\",\n \"files\": [\n {\n \"fileName\": \"campaign.png\",\n \"watermarks\": [\n {\n \"text\": \"MORI-2026-001\"\n }\n ]\n },\n {\n \"fileName\": \"contract.pdf\",\n \"originalFileUrl\": \"https://example.com/contract.pdf\",\n \"watermarks\": [\n {\n \"text\": \"PARTNER-A\"\n },\n {\n \"text\": \"PARTNER-B\"\n }\n ]\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"data": {
"orderId": "1234567890",
"status": "pending",
"processingDelayed": false,
"expiresAt": "2026-10-08T03:00:00.000Z",
"files": [
{
"fileId": "501",
"uploadUrl": "https://s3.ap-northeast-2.amazonaws.com/..."
},
{
"fileId": "502",
"uploadUrl": null
}
],
"outputs": [
{
"fileId": "501-1",
"inputFileId": "501",
"outputIndex": 0,
"watermarkText": "MORI-2026-001",
"status": "pending",
"mediaKind": "image"
},
{
"fileId": "502-1",
"inputFileId": "502",
"outputIndex": 0,
"watermarkText": "PARTNER-A",
"status": "pending",
"mediaKind": "pdf"
},
{
"fileId": "502-2",
"inputFileId": "502",
"outputIndex": 1,
"watermarkText": "PARTNER-B",
"status": "pending",
"mediaKind": "pdf"
}
],
"result": null,
"reports": []
}
}{
"code": "VALIDATION_FAILED"
}{
"code": "AUTH_NOT_AUTHENTICATED"
}{
"code": "WATERMARK_V2_CONFLICT"
}{
"code": "RATE_LIMIT_EXCEEDED"
}{
"code": "SERVER_INTERNAL_ERROR"
}{
"code": "WATERMARK_V2_UNAVAILABLE"
}워터마크 삽입 주문 생성
이미지와 PDF에 비가시성 워터마크를 삽입하는 주문을 생성합니다.
- 주문당 파일 최대 100개, 파일당 문구 1
10개, 문구당 11,000자 - 문구마다
outputs[]에 별도 결과 파일이 생기며 1크레딧을 사용합니다 - 지원 확장자:
jpg,jpeg,png,webp,bmp,tif,tiff,pdf. BMP는 무압축 24비트 RGB 또는 1·8비트 흑백, TIFF는 단일 페이지 8비트 RGB 또는 1·8비트 흑백(알파 없음)만 처리할 수 있습니다 - 이 범위를 벗어난 BMP·TIFF(다중 페이지, 16비트, 팔레트, 알파, CMYK 등)는 주문이 공개
errorCode와 함께failed가 되고 크레딧은 복구됩니다 originalFileUrl이 없는 파일은files[].uploadUrl(900초 유효)로PUT업로드합니다- 모든 파일 업로드가 끝나면 처리가 자동으로 시작됩니다. confirm 호출은 없습니다
- 12시간 안에 업로드되지 않은 주문은
failed가 됩니다 GET /api/v3/orders/{orderId}로status가complete가 될 때까지 조회한 뒤 다운로드 API를 호출하세요
curl -X POST https://api.bizmori.com/api/v3/orders/wtr-embed \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"idempotencyKey": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"files": [
{
"fileName": "campaign.png",
"watermarks": [
{
"text": "MORI-2026-001"
}
]
},
{
"fileName": "contract.pdf",
"originalFileUrl": "https://example.com/contract.pdf",
"watermarks": [
{
"text": "PARTNER-A"
},
{
"text": "PARTNER-B"
}
]
}
]
}'const response = await fetch(`https://api.bizmori.com/api/v3/orders/wtr-embed`, {
method: 'POST',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json'
},
body: JSON.stringify({
"idempotencyKey": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"files": [
{
"fileName": "campaign.png",
"watermarks": [
{
"text": "MORI-2026-001"
}
]
},
{
"fileName": "contract.pdf",
"originalFileUrl": "https://example.com/contract.pdf",
"watermarks": [
{
"text": "PARTNER-A"
},
{
"text": "PARTNER-B"
}
]
}
]
})
});
const { data } = await response.json();
// 각 파일을 presigned URL로 PUT 업로드합니다 (files[]는 요청 순서)
// await fetch(data.files[0].uploadUrl, { method: 'PUT', body: file });
import requests
response = requests.post(
f'https://api.bizmori.com/api/v3/orders/wtr-embed',
headers={'Authorization': 'Bearer YOUR_API_KEY'},
json={
"idempotencyKey": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"files": [
{
"fileName": "campaign.png",
"watermarks": [
{
"text": "MORI-2026-001"
}
]
},
{
"fileName": "contract.pdf",
"originalFileUrl": "https://example.com/contract.pdf",
"watermarks": [
{
"text": "PARTNER-A"
},
{
"text": "PARTNER-B"
}
]
}
]
}
)
data = response.json()['data']
# 각 파일을 presigned URL로 PUT 업로드합니다 (files[]는 요청 순서)
# requests.put(data['files'][0]['uploadUrl'], data=open('campaign.png', 'rb'))
<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.bizmori.com/api/v3/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' => 'f47ac10b-58cc-4372-a567-0e02b2c3d479',
'files' => [
[
'fileName' => 'campaign.png',
'watermarks' => [
[
'text' => 'MORI-2026-001'
]
]
],
[
'fileName' => 'contract.pdf',
'originalFileUrl' => 'https://example.com/contract.pdf',
'watermarks' => [
[
'text' => 'PARTNER-A'
],
[
'text' => 'PARTNER-B'
]
]
]
]
]),
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/v3/orders/wtr-embed"
payload := strings.NewReader("{\n \"idempotencyKey\": \"f47ac10b-58cc-4372-a567-0e02b2c3d479\",\n \"files\": [\n {\n \"fileName\": \"campaign.png\",\n \"watermarks\": [\n {\n \"text\": \"MORI-2026-001\"\n }\n ]\n },\n {\n \"fileName\": \"contract.pdf\",\n \"originalFileUrl\": \"https://example.com/contract.pdf\",\n \"watermarks\": [\n {\n \"text\": \"PARTNER-A\"\n },\n {\n \"text\": \"PARTNER-B\"\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/v3/orders/wtr-embed")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"idempotencyKey\": \"f47ac10b-58cc-4372-a567-0e02b2c3d479\",\n \"files\": [\n {\n \"fileName\": \"campaign.png\",\n \"watermarks\": [\n {\n \"text\": \"MORI-2026-001\"\n }\n ]\n },\n {\n \"fileName\": \"contract.pdf\",\n \"originalFileUrl\": \"https://example.com/contract.pdf\",\n \"watermarks\": [\n {\n \"text\": \"PARTNER-A\"\n },\n {\n \"text\": \"PARTNER-B\"\n }\n ]\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.bizmori.com/api/v3/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\": \"f47ac10b-58cc-4372-a567-0e02b2c3d479\",\n \"files\": [\n {\n \"fileName\": \"campaign.png\",\n \"watermarks\": [\n {\n \"text\": \"MORI-2026-001\"\n }\n ]\n },\n {\n \"fileName\": \"contract.pdf\",\n \"originalFileUrl\": \"https://example.com/contract.pdf\",\n \"watermarks\": [\n {\n \"text\": \"PARTNER-A\"\n },\n {\n \"text\": \"PARTNER-B\"\n }\n ]\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"data": {
"orderId": "1234567890",
"status": "pending",
"processingDelayed": false,
"expiresAt": "2026-10-08T03:00:00.000Z",
"files": [
{
"fileId": "501",
"uploadUrl": "https://s3.ap-northeast-2.amazonaws.com/..."
},
{
"fileId": "502",
"uploadUrl": null
}
],
"outputs": [
{
"fileId": "501-1",
"inputFileId": "501",
"outputIndex": 0,
"watermarkText": "MORI-2026-001",
"status": "pending",
"mediaKind": "image"
},
{
"fileId": "502-1",
"inputFileId": "502",
"outputIndex": 0,
"watermarkText": "PARTNER-A",
"status": "pending",
"mediaKind": "pdf"
},
{
"fileId": "502-2",
"inputFileId": "502",
"outputIndex": 1,
"watermarkText": "PARTNER-B",
"status": "pending",
"mediaKind": "pdf"
}
],
"result": null,
"reports": []
}
}{
"code": "VALIDATION_FAILED"
}{
"code": "AUTH_NOT_AUTHENTICATED"
}{
"code": "WATERMARK_V2_CONFLICT"
}{
"code": "RATE_LIMIT_EXCEEDED"
}{
"code": "SERVER_INTERNAL_ERROR"
}{
"code": "WATERMARK_V2_UNAVAILABLE"
}인증
외부 클라이언트 접근을 위한 Bearer API 키. 일반 키는 sk_ 접두사를 사용하고, 테스트 키는 sk_test_ 접두사로 모의 응답을 사용해 실제 처리나 크레딧 사용 없이 주문 흐름을 검증합니다.
본문
멱등성 키. 새 주문마다 새 UUIDv4를 쓰고, 같은 요청을 재시도할 때만 재사용합니다. 같은 키는 기존 주문을 반환하며, 같은 키로 다른 요청 본문을 보내면 409 WATERMARK_V2_CONFLICT를 반환합니다.
255한 주문에 이미지와 PDF를 섞을 수 있습니다.
1 - 100 elementsHide child attributes
Hide child attributes
확장자를 포함한 파일명. 지원 형식: jpg, jpeg, png, webp, bmp, tif, tiff, pdf
255원본 파일의 공개 HTTPS URL(선택). 지정하면 BIZ MORI가 파일을 내려받으며(최대 32 MiB, redirect 미지원) 해당 파일의 uploadUrl은 발급하지 않습니다.
응답
주문 생성, 또는 같은 idempotencyKey의 기존 주문 반환
v3 API로 생성한 비가시성 워터마크 주문
Hide child attributes
Hide child attributes
주문 ID
주문 처리 상태
pending- 파일 업로드 대기inProgress- 처리 중complete- 처리 완료. 추출 주문은result에서 결과를 확인합니다failed- 처리 실패, 또는 12시간 안에 업로드되지 않음expired- 보관 기한이 지나 파일이 삭제됨
pending, inProgress, complete, failed, expired 자동 재시도를 모두 소진해 수동 복구를 기다리면 true. 주문은 inProgress로 유지됩니다
요청 순서의 입력 파일. 추출 주문은 원본, 검사 파일 순서입니다
삽입 결과. 워터마크 문구마다 1개이며 추출 주문은 빈 배열입니다
Hide child attributes
Hide child attributes
{inputFileId}-{순번} 형식의 결과 파일 ID(outputs[].fileId)
이 결과를 만든 입력 파일 ID
입력 파일 watermarks 안에서 해당 문구의 위치
x >= 0삽입한 워터마크 문구
이 결과 파일의 처리 상태
pending, queued, processing, completed, failed, retry_required image, pdf 추출 결과 요약. 삽입 주문과 결과가 나오기 전에는 null이며 아래 필드만 포함합니다
Hide child attributes
Hide child attributes
detected- 워터마크를 찾음not_detected- 끝까지 검사했으나 워터마크 없음inconclusive- 후보는 있으나 확신 기준 미달로 판단 불가unsupported- 처리할 수 없는 입력 (크레딧 환불)error- 검출 처리 실패, 워터마크 없음과 다름 (크레딧 환불)
detected, not_detected, inconclusive, unsupported, error 이 결과로 보고서를 만들 수 있는지 여부. PDF에서 캡처한 이미지는 false
검출된 워터마크의 삽입 문구. detectionStatus가 detected이고, 호출 계정이 직접 삽입했으며 발급 기록이 정확히 1건일 때만 반환합니다.
다른 계정이 삽입한 워터마크 등 그 외에는 null입니다.
주문 파일이 삭제되는 시각. 이후 다운로드와 보고서는 ORDER_EXPIRED를 반환합니다