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"
}Create watermark extract order
Create an order that checks one file for an invisible watermark.
- Submit the original file together with the file to inspect on every request
- Image originals accept
jpg,jpeg,png,webp,bmp,tif, ortifffiles to inspect. PDF originals accept PDF, PNG, or JPEG files to inspect - BMP and TIFF files follow the same limits as watermark embed. A file that cannot be processed finishes as
completewithdetectionStatusunsupported, notfailed, and the credit is refunded - The response
files[]contains two entries:files[0]is the original andfiles[1]is the file to inspect. Upload each withPUTto itsuploadUrl - Processing starts automatically when both files are uploaded. Each order uses 1 credit, and
unsupportedorerrorresults are refunded - Read the outcome from
resultinGET /api/v3/orders/{orderId}
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"
}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. Use a new UUIDv4 for each new order and reuse it only when retrying the same request. The same key returns the existing order; the same key with a different request body returns 409 WATERMARK_V2_CONFLICT.
255The file to inspect
Response
Order created with upload URLs for the original file and the file to inspect
Invisible watermark order created with the v3 API
Hide child attributes
Hide child attributes
Order ID
Order processing status
pending- Waiting for file uploadsinProgress- Processingcomplete- Processing finished. For extract orders, read the outcome fromresultfailed- Processing failed, or files were not uploaded within 12 hoursexpired- The retention period has ended and files were deleted
pending, inProgress, complete, failed, expired true when automatic retries are exhausted and the order is waiting for manual recovery. The order stays inProgress
Uploaded input files, in request order. Extract orders return the original first and the file to inspect second
Hide child attributes
Hide child attributes
Input file ID
Presigned PUT URL for uploading the file, valid for 900 seconds. Issued only while the order status is pending, the retention period has not ended, and the file is waiting for upload.
It is null for files given by originalFileUrl, files already uploaded, orders that became failed after the 12-hour upload window, and expired orders.
Embed outputs. One entry per watermark text. Empty for extract orders
Hide child attributes
Hide child attributes
Output file ID in {inputFileId}-{ordinal} format, from outputs[].fileId
ID of the input file this output was created from
Position of the watermark text within the input file's watermarks
x >= 0The embedded watermark text
Processing status of this output
pending, queued, processing, completed, failed, retry_required image, pdf Extract result summary. null for embed orders and until the result is ready. Contains only the fields below
Hide child attributes
Hide child attributes
detected- A watermark was foundnot_detected- The file was fully checked and no watermark was foundinconclusive- A candidate was found but did not meet the confidence thresholdunsupported- The input cannot be processed (credit refunded)error- Detection failed. This is not the same as no watermark (credit refunded)
detected, not_detected, inconclusive, unsupported, error Whether a report can be created from this result. false for images captured from a PDF
Embedded text of the detected watermark. Returned only when detectionStatus is detected, your account embedded the watermark, and exactly one issuance record matches.
Otherwise null, for example when another account embedded the watermark.
When the order files are deleted. Downloads and reports return ORDER_EXPIRED afterwards