curl -X POST https://api.bizmori.com/api/v2/orders/wtr-extract \
-H "Authorization: Bearer YOUR_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"idempotencyKey": "8b3f1d6e-e7a5-424b-b6c9-1e4d5a8c0f26",
"file": {
"fileName": "watermarked.jpg"
}
}'const response = await fetch('https://api.bizmori.com/api/v2/orders/wtr-extract', {
method: 'POST',
headers: {
'Authorization': 'Bearer YOUR_API_TOKEN',
'Content-Type': 'application/json'
},
body: JSON.stringify({
idempotencyKey: '8b3f1d6e-e7a5-424b-b6c9-1e4d5a8c0f26',
file: {
fileName: 'watermarked.jpg'
}
})
});
const data = await response.json();import requests
response = requests.post(
'https://api.bizmori.com/api/v2/orders/wtr-extract',
headers={'Authorization': 'Bearer YOUR_API_TOKEN'},
json={
'idempotencyKey': '8b3f1d6e-e7a5-424b-b6c9-1e4d5a8c0f26',
'file': {
'fileName': 'watermarked.jpg'
}
}
)
data = response.json()<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.bizmori.com/api/v2/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' => '8b3f1d6e-e7a5-424b-b6c9-1e4d5a8c0f26',
'file' => [
'fileName' => 'watermarked.jpg'
]
]),
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-extract"
payload := strings.NewReader("{\n \"idempotencyKey\": \"8b3f1d6e-e7a5-424b-b6c9-1e4d5a8c0f26\",\n \"file\": {\n \"fileName\": \"watermarked.jpg\"\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-extract")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"idempotencyKey\": \"8b3f1d6e-e7a5-424b-b6c9-1e4d5a8c0f26\",\n \"file\": {\n \"fileName\": \"watermarked.jpg\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.bizmori.com/api/v2/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\": \"8b3f1d6e-e7a5-424b-b6c9-1e4d5a8c0f26\",\n \"file\": {\n \"fileName\": \"watermarked.jpg\"\n }\n}"
response = http.request(request)
puts response.read_body{
"data": {
"orderName": "wtr_extract_2026-02-13",
"orderId": "123456789",
"file": {
"fileId": 1,
"fileName": "watermarked.jpg",
"uploadUrl": "https://s3.amazonaws.com/...",
"fileKey": "123/456/watermarked.jpg",
"fileFormat": "JPG",
"fileType": "IMG",
"role": "watermarked",
"sequence": 1
}
}
}Create watermark extract order
Support ended. This endpoint ended support at 09:00 KST on October 9, 2026 (00:00 UTC). Use POST /api/v3/orders/wtr-extract instead.
Every response from this endpoint, including authentication errors and the 410 response, includes the Deprecation: true, Sunset: Fri, 09 Oct 2026 00:00:00 GMT, and Link: </api/v3/orders/wtr-extract>; rel="successor-version" headers.
From 09:00 KST on October 9, 2026 (00:00 UTC):
- Authentication and permission checks still run first, so
401and403errors are returned as before. - Authenticated requests to the v2 watermark embed and extract endpoints return
410 Gonewith{ "code": "WATERMARK_V2_API_SUNSET" }, for both live andsk_test_keys. TheLinkheader points to the v3 endpoint. Create new orders with v3. - v2 orders that have not started processing by then fail without being processed. The order details (
errors.errorCode) and the failed webhook carryWATERMARK_V2_API_SUNSETwith a message pointing to v3. The order is not charged, and its credits are restored. - Orders already processing at that time finish and record their result. No new run starts for them afterwards.
Create a watermark extraction order.
- Only 1 file per order
- Supports image (jpg, jpeg, png, webp, bmp, tiff) or PDF files
- For images,
includeOriginal: trueallows uploading the original file alongside - PDF does not support
includeOriginal
curl -X POST https://api.bizmori.com/api/v2/orders/wtr-extract \
-H "Authorization: Bearer YOUR_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"idempotencyKey": "8b3f1d6e-e7a5-424b-b6c9-1e4d5a8c0f26",
"file": {
"fileName": "watermarked.jpg"
}
}'const response = await fetch('https://api.bizmori.com/api/v2/orders/wtr-extract', {
method: 'POST',
headers: {
'Authorization': 'Bearer YOUR_API_TOKEN',
'Content-Type': 'application/json'
},
body: JSON.stringify({
idempotencyKey: '8b3f1d6e-e7a5-424b-b6c9-1e4d5a8c0f26',
file: {
fileName: 'watermarked.jpg'
}
})
});
const data = await response.json();import requests
response = requests.post(
'https://api.bizmori.com/api/v2/orders/wtr-extract',
headers={'Authorization': 'Bearer YOUR_API_TOKEN'},
json={
'idempotencyKey': '8b3f1d6e-e7a5-424b-b6c9-1e4d5a8c0f26',
'file': {
'fileName': 'watermarked.jpg'
}
}
)
data = response.json()<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.bizmori.com/api/v2/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' => '8b3f1d6e-e7a5-424b-b6c9-1e4d5a8c0f26',
'file' => [
'fileName' => 'watermarked.jpg'
]
]),
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-extract"
payload := strings.NewReader("{\n \"idempotencyKey\": \"8b3f1d6e-e7a5-424b-b6c9-1e4d5a8c0f26\",\n \"file\": {\n \"fileName\": \"watermarked.jpg\"\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-extract")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"idempotencyKey\": \"8b3f1d6e-e7a5-424b-b6c9-1e4d5a8c0f26\",\n \"file\": {\n \"fileName\": \"watermarked.jpg\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.bizmori.com/api/v2/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\": \"8b3f1d6e-e7a5-424b-b6c9-1e4d5a8c0f26\",\n \"file\": {\n \"fileName\": \"watermarked.jpg\"\n }\n}"
response = http.request(request)
puts response.read_body{
"data": {
"orderName": "wtr_extract_2026-02-13",
"orderId": "123456789",
"file": {
"fileId": 1,
"fileName": "watermarked.jpg",
"uploadUrl": "https://s3.amazonaws.com/...",
"fileKey": "123/456/watermarked.jpg",
"fileFormat": "JPG",
"fileType": "IMG",
"role": "watermarked",
"sequence": 1
}
}
}POST /api/v3/orders/wtr-extract for new integrations, and see the watermark extract quickstart to migrate.After v2 support ends (from 09:00 KST on October 9, 2026, which is 00:00 UTC):- Authentication and permission checks still run first, so
401and403errors are returned as before. - Authenticated requests to the v2 watermark embed and extract endpoints return
410 Gonewith{ "code": "WATERMARK_V2_API_SUNSET" }, for both live andsk_test_keys. TheLinkheader points to the v3 endpoint. Create new orders with v3. - v2 orders that have not started processing by then fail without being processed. The order details (
errors.errorCode) and the failed webhook carryWATERMARK_V2_API_SUNSETwith a message pointing to v3. The order is not charged, and its credits are restored. - Orders already processing at that time finish and record their result. No new run starts for them afterwards.
- You can still get existing v2 orders and download results and reports that were already created, within the existing retention period. New v2 reports cannot be created or regenerated.
Deprecation: true, Sunset: Fri, 09 Oct 2026 00:00:00 GMT, and Link headers.Response after support ends
From 09:00 KST on October 9, 2026 (00:00 UTC), an authenticated request to this endpoint returns: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-extract>; rel="successor-version"
{ "code": "WATERMARK_V2_API_SUNSET" }
Link header.
sk_test_ key, upload to the returned BIZ MORI test upload URL. Watermark Extract starts after the upload finishes and uses _detected or _undetected in the file name to select the simulated result.Authorizations
Bearer API key for external client access. Live keys use the sk_ prefix; test keys use the sk_test_ prefix and support order-lifecycle testing with mock responses without processing or credit usage.
Body
Idempotency key
Hide child attributes
Hide child attributes
Watermarked file name (with extension)
"watermarked.jpg"
Include original file (image only)
- true: Upload URL for original file is also issued
- Not available for PDF files
Response
Order created successfully
Hide child attributes
Hide child attributes
Order name (auto-generated)
Order ID
Watermark extract order file info
Hide child attributes
Hide child attributes
File ID
File name
Upload URL. Live keys receive an S3 presigned URL; test keys receive an absolute https://api.bizmori.com/api/v2/test-uploads/{signedToken} URL. Both expire after one hour and can be renewed with POST /api/v2/orders/{orderId}/refresh-urls. PUT needs no Authorization header because the signed token authorizes the test upload. Test request bodies are streamed, not stored; test orders move to simulated results without usage consumption or actual external processing.
File identifier: an S3 object key for live keys or an isolated logical key for test keys.
File format
"JPG"
File type (image or PDF)
IMG, DOCUMENT File role (always "watermarked" for the main file)
watermarked File sequence number (always 1)
1
Original file info (only when includeOriginal is true)
Hide child attributes
Hide child attributes
File ID
File name
Upload URL. Live keys receive an S3 presigned URL; test keys receive an absolute https://api.bizmori.com/api/v2/test-uploads/{signedToken} URL. Both expire after one hour and can be renewed with POST /api/v2/orders/{orderId}/refresh-urls. PUT needs no Authorization header because the signed token authorizes the test upload. Test request bodies are streamed, not stored; test orders move to simulated results without usage consumption or actual external processing.
File identifier: an S3 object key for live keys or an isolated logical key for test keys.
File format
File type (image only)
IMG File role (always "original")
original File sequence number (always 1)
1