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();
// PUT each file to its presigned URL (files[] follows the request order)
// 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']
# PUT each file to its presigned URL (files[] follows the request order)
# 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"
}Create watermark embed order
Create an order that embeds invisible watermarks into images and PDFs.
- Up to 100 files per order, 1–10 watermark texts per file, 1–1,000 characters per text
- Each watermark text produces its own output file in
outputs[]and uses 1 credit - Supported extensions:
jpg,jpeg,png,webp,bmp,tif,tiff,pdf. BMP must be uncompressed 24-bit RGB or 1- or 8-bit grayscale. TIFF must be single-page 8-bit RGB or 1- or 8-bit grayscale, without alpha - A BMP or TIFF file outside that range (multi-page, 16-bit, palette, alpha, CMYK, and so on) fails the order with a public
errorCode, and the credits are restored - For each file without
originalFileUrl, upload the file withPUTtofiles[].uploadUrl(valid for 900 seconds) - Processing starts automatically when every file is uploaded. There is no confirm step
- Orders whose files are not uploaded within 12 hours become
failed - Poll
GET /api/v3/orders/{orderId}untilstatusiscomplete, then call the download endpoint
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();
// PUT each file to its presigned URL (files[] follows the request order)
// 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']
# PUT each file to its presigned URL (files[] follows the request order)
# 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"
}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.
255Images and PDFs can be mixed in one order.
1 - 100 elementsHide child attributes
Hide child attributes
File name with extension. Supported: jpg, jpeg, png, webp, bmp, tif, tiff, pdf.
255Public HTTPS URL of the original file (optional). When set, BIZ MORI downloads the file (up to 32 MiB, redirects not followed) and no uploadUrl is issued for it.
Response
Order created, or the existing order for the same idempotencyKey
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