curl -X POST https://api.bizmori.com/api/v3/orders/wtr-extract \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"idempotencyKey": "6c3b9f7e-2d41-4a8e-9b5f-0e1d2c3b4a59",
"file": {
"fileName": "suspect.png",
"originalFile": {
"fileName": "campaign.png"
}
}
}'const response = await fetch(`https://api.bizmori.com/api/v3/orders/wtr-extract`, {
method: 'POST',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json'
},
body: JSON.stringify({
"idempotencyKey": "6c3b9f7e-2d41-4a8e-9b5f-0e1d2c3b4a59",
"file": {
"fileName": "suspect.png",
"originalFile": {
"fileName": "campaign.png"
}
}
})
});
const { data } = await response.json();
import requests
response = requests.post(
f'https://api.bizmori.com/api/v3/orders/wtr-extract',
headers={'Authorization': 'Bearer YOUR_API_KEY'},
json={
"idempotencyKey": "6c3b9f7e-2d41-4a8e-9b5f-0e1d2c3b4a59",
"file": {
"fileName": "suspect.png",
"originalFile": {
"fileName": "campaign.png"
}
}
}
)
data = response.json()['data']
<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.bizmori.com/api/v3/orders/wtr-extract",
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' => '6c3b9f7e-2d41-4a8e-9b5f-0e1d2c3b4a59',
'file' => [
'fileName' => 'suspect.png',
'originalFile' => [
'fileName' => 'campaign.png'
]
]
]),
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-extract"
payload := strings.NewReader("{\n \"idempotencyKey\": \"6c3b9f7e-2d41-4a8e-9b5f-0e1d2c3b4a59\",\n \"file\": {\n \"fileName\": \"suspect.png\",\n \"originalFile\": {\n \"fileName\": \"campaign.png\"\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-extract")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"idempotencyKey\": \"6c3b9f7e-2d41-4a8e-9b5f-0e1d2c3b4a59\",\n \"file\": {\n \"fileName\": \"suspect.png\",\n \"originalFile\": {\n \"fileName\": \"campaign.png\"\n }\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.bizmori.com/api/v3/orders/wtr-extract")
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\": \"6c3b9f7e-2d41-4a8e-9b5f-0e1d2c3b4a59\",\n \"file\": {\n \"fileName\": \"suspect.png\",\n \"originalFile\": {\n \"fileName\": \"campaign.png\"\n }\n }\n}"
response = http.request(request)
puts response.read_body{
"data": {
"orderId": "<string>",
"status": "pending",
"processingDelayed": true,
"files": [
{
"fileId": "<string>",
"uploadUrl": "<string>"
}
],
"outputs": [
{
"fileId": "<string>",
"inputFileId": "<string>",
"outputIndex": 1,
"watermarkText": "<string>",
"status": "pending",
"mediaKind": "image"
}
],
"result": {
"detectionStatus": "detected",
"reportSupported": true,
"watermarkText": "<string>"
},
"reports": [
{
"locale": "ko-KR",
"status": "queued"
}
],
"expiresAt": "2023-11-07T05:31:56Z"
}
}{
"code": "VALIDATION_FAILED"
}{
"code": "AUTH_NOT_AUTHENTICATED"
}{
"code": "WATERMARK_V2_CONFLICT"
}{
"code": "RATE_LIMIT_EXCEEDED"
}{
"code": "SERVER_INTERNAL_ERROR"
}{
"code": "WATERMARK_V2_UNAVAILABLE"
}워터마크 추출 주문 생성
파일 1개에서 비가시성 워터마크를 검사하는 주문을 생성합니다.
- 요청마다 원본 파일과 검사할 파일을 함께 제출합니다
- 이미지 원본은
jpg,jpeg,png,webp,bmp,tif,tiff검사 파일을, PDF 원본은 PDF·PNG·JPEG 검사 파일을 받습니다 - BMP·TIFF의 처리 가능 범위는 워터마크 삽입과 같습니다. 처리할 수 없는 파일은 주문이
failed가 아니라complete로 끝나고detectionStatus가unsupported이며 크레딧은 환불됩니다 - 응답
files[]는 2개입니다.files[0]은 원본,files[1]은 검사 파일이며 각각uploadUrl로PUT업로드합니다 - 두 파일 업로드가 끝나면 처리가 자동으로 시작됩니다. 주문당 1크레딧을 사용하며
unsupported·error결과는 환불됩니다 - 결과는
GET /api/v3/orders/{orderId}의result에서 확인합니다
curl -X POST https://api.bizmori.com/api/v3/orders/wtr-extract \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"idempotencyKey": "6c3b9f7e-2d41-4a8e-9b5f-0e1d2c3b4a59",
"file": {
"fileName": "suspect.png",
"originalFile": {
"fileName": "campaign.png"
}
}
}'const response = await fetch(`https://api.bizmori.com/api/v3/orders/wtr-extract`, {
method: 'POST',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json'
},
body: JSON.stringify({
"idempotencyKey": "6c3b9f7e-2d41-4a8e-9b5f-0e1d2c3b4a59",
"file": {
"fileName": "suspect.png",
"originalFile": {
"fileName": "campaign.png"
}
}
})
});
const { data } = await response.json();
import requests
response = requests.post(
f'https://api.bizmori.com/api/v3/orders/wtr-extract',
headers={'Authorization': 'Bearer YOUR_API_KEY'},
json={
"idempotencyKey": "6c3b9f7e-2d41-4a8e-9b5f-0e1d2c3b4a59",
"file": {
"fileName": "suspect.png",
"originalFile": {
"fileName": "campaign.png"
}
}
}
)
data = response.json()['data']
<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.bizmori.com/api/v3/orders/wtr-extract",
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' => '6c3b9f7e-2d41-4a8e-9b5f-0e1d2c3b4a59',
'file' => [
'fileName' => 'suspect.png',
'originalFile' => [
'fileName' => 'campaign.png'
]
]
]),
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-extract"
payload := strings.NewReader("{\n \"idempotencyKey\": \"6c3b9f7e-2d41-4a8e-9b5f-0e1d2c3b4a59\",\n \"file\": {\n \"fileName\": \"suspect.png\",\n \"originalFile\": {\n \"fileName\": \"campaign.png\"\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-extract")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"idempotencyKey\": \"6c3b9f7e-2d41-4a8e-9b5f-0e1d2c3b4a59\",\n \"file\": {\n \"fileName\": \"suspect.png\",\n \"originalFile\": {\n \"fileName\": \"campaign.png\"\n }\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.bizmori.com/api/v3/orders/wtr-extract")
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\": \"6c3b9f7e-2d41-4a8e-9b5f-0e1d2c3b4a59\",\n \"file\": {\n \"fileName\": \"suspect.png\",\n \"originalFile\": {\n \"fileName\": \"campaign.png\"\n }\n }\n}"
response = http.request(request)
puts response.read_body{
"data": {
"orderId": "<string>",
"status": "pending",
"processingDelayed": true,
"files": [
{
"fileId": "<string>",
"uploadUrl": "<string>"
}
],
"outputs": [
{
"fileId": "<string>",
"inputFileId": "<string>",
"outputIndex": 1,
"watermarkText": "<string>",
"status": "pending",
"mediaKind": "image"
}
],
"result": {
"detectionStatus": "detected",
"reportSupported": true,
"watermarkText": "<string>"
},
"reports": [
{
"locale": "ko-KR",
"status": "queued"
}
],
"expiresAt": "2023-11-07T05:31:56Z"
}
}{
"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응답
원본 파일과 검사 파일의 업로드 URL과 함께 주문 생성
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를 반환합니다