curl -X GET https://api.bizmori.com/api/v3/orders/ORDER_ID \
-H "Authorization: Bearer YOUR_API_KEY"
const orderId = 'ORDER_ID';
const response = await fetch(`https://api.bizmori.com/api/v3/orders/${orderId}`, {
headers: { 'Authorization': 'Bearer YOUR_API_KEY' }
});
const { data } = await response.json();
import requests
order_id = 'ORDER_ID'
response = requests.get(
f'https://api.bizmori.com/api/v3/orders/{order_id}',
headers={'Authorization': 'Bearer YOUR_API_KEY'}
)
data = response.json()['data']
<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.bizmori.com/api/v3/orders/{orderId}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.bizmori.com/api/v3/orders/{orderId}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.bizmori.com/api/v3/orders/{orderId}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.bizmori.com/api/v3/orders/{orderId}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_bodyGet order details
Get the details of an order you own in one shape for every order type and watermark engine: Anti-AI, AI Detection, watermark embed, and watermark extract orders, whether you created them with v2 or v3. You can call this endpoint whatever the order status.
Common top-level fields: type, orderId, orderName, channel, status, createdAt, updatedAt, expiresAt, retentionDays, thumbnailImageUrl, processingDelayed, errors, inputFiles, and result. Every order returns the same set of keys; only result differs by order type.
typeisantiAi,aiDetection,watermarkEmbed, orwatermarkExtract. Watermark orders created with v3 use the same values, without an engine suffixstatusis one ofpending,inProgress,complete,failed, andexpired. v2 watermark extract orders stored asdetectedorundetectedreturncomplete, with the outcome inresult.detectionStatusprocessingDelayedis calculated only for watermark orders created with v3. It is alwaysfalsefor other orderserrorsis{ errorCode, errorMessage }for a failed order, otherwisenull
inputFiles[]: { fileId, fileName } for each input file, in request order. Use inputFiles.length for the file count.
role(originalorquery) appears only onwatermarkExtractorders. Thewatermarkedrole of v2 orders is returned asqueryuploadUrl(presignedPUTURL) appears only whilestatusispendingand the file is waiting for upload. Otherwise the key is omitted, not set tonull
result: the key is always present. It is an object only when status is complete, and null for pending, inProgress, failed, and expired.
antiAi:{ outputFiles: [{ fileId, fileName, inputFileId }] }watermarkEmbed:{ outputFiles: [{ fileId, fileName, inputFileId, watermarkText }] }. A v3 order that embeds several watermark texts in one input file returns one output file per textwatermarkExtract:{ detectionStatus, watermarkText, reportSupported, reports }.detectionStatusisdetected,undetected,inconclusive,unsupported, orerror.watermarkTextisnullunlessdetectionStatusisdetected. v2 orders returnreportSupported: falseandreports: []aiDetection:{ verdict, probability, options, originalImageUrl, heatmapUrl, overlayUrl }.verdictislikely_real,uncertain_real,uncertain_ai, orlikely_ai, and isnullwhenprobabilityisnull.optionsisnullwhen no options were stored
fileId: every fileId and inputFileId is a numeric string with no separator such as -. result.outputFiles[].fileId is unique within the order and matches files[].fileId from GET /api/v3/orders/{orderId}/download in value and order.
Expired orders: you can still get an expired order, but result is null and no URLs are issued.
Changes from the previous v3 response (breaking change, 2026-10-08)
- For watermark orders created with v3,
files[],outputs[], and the top-levelreports[]moved toinputFiles[],result.outputFiles[], andresult.reports[]. OutputfileIdvalues changed from{inputFileId}-{n}to numeric strings - The
detectionStatusvaluenot_detectedis nowundetected - For other orders, which used the v2 detail format, the top-level
fileCount,statusCode,watermarks,watermarkText,probability,options,originalImageUrl,heatmapUrl, andoverlayUrlfields moved toinputFilesandresult. The AI DetectionstatusCodeis nowresult.verdict - The response of the deprecated
GET /api/v2/orders/{orderId}is unchanged
Test keys (sk_test_): returns only test orders created with the same key. Live orders and other accounts’ orders return 404 ORDER_NOT_FOUND, as do test orders requested with a live key. Every test order, created with v2 or v3, uses this shape. An inProgress test order becomes complete or failed when you get it more than five seconds after the uploads finish. The uploadUrl of a pending test order is https://api.bizmori.com/api/v2/test-uploads/{signedToken}. result.reports of a test extract order is always empty, and reportSupported is true only for a v3 test extract order whose detectionStatus is detected. expiresAt is seven days after the order was created.
curl -X GET https://api.bizmori.com/api/v3/orders/ORDER_ID \
-H "Authorization: Bearer YOUR_API_KEY"
const orderId = 'ORDER_ID';
const response = await fetch(`https://api.bizmori.com/api/v3/orders/${orderId}`, {
headers: { 'Authorization': 'Bearer YOUR_API_KEY' }
});
const { data } = await response.json();
import requests
order_id = 'ORDER_ID'
response = requests.get(
f'https://api.bizmori.com/api/v3/orders/{order_id}',
headers={'Authorization': 'Bearer YOUR_API_KEY'}
)
data = response.json()['data']
<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.bizmori.com/api/v3/orders/{orderId}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.bizmori.com/api/v3/orders/{orderId}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.bizmori.com/api/v3/orders/{orderId}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.bizmori.com/api/v3/orders/{orderId}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_bodyresult changes with type.
files, outputs, the top-level reports, fileCount, or statusCode from this endpoint, see Changes from the previous response.Common fields
| Field | Type | Description |
|---|---|---|
type | string | antiAi, aiDetection, watermarkEmbed, or watermarkExtract |
orderId | string | Order ID |
orderName | string | null | Order name |
channel | string | api or web |
status | string | One of the five values in Status |
createdAt, updatedAt | string | ISO 8601 timestamps |
expiresAt | string | null | When the order files are deleted |
retentionDays | integer | null | File retention period in days (7 or 30) |
thumbnailImageUrl | string | null | Thumbnail image URL |
processingDelayed | boolean | true when a watermark order created with v3 is waiting for manual recovery. Always false for other orders |
errors | object | null | { errorCode, errorMessage } for a failed order, otherwise null |
inputFiles | array | Input files. See Input files |
result | object | null | Result for the order type. See Result by order type |
Status
status | Meaning | result |
|---|---|---|
pending | Waiting for file uploads. inputFiles[].uploadUrl is present | null |
inProgress | Processing | null |
complete | Finished | Object |
failed | Processing failed. Read the reason from errors | null |
expired | The retention period ended and the files were deleted. No URLs are issued | null |
detected or undetected return complete. Read the outcome from result.detectionStatus.
Input files
EachinputFiles[] item has fileId and fileName, in the order of your create request. Two more keys appear only when they apply. When they do not apply, the key is omitted rather than set to null.
roleappears only onwatermarkExtractorders.originalis the file the watermark was embedded in, andqueryis the file to check.uploadUrlappears only whilestatusispendingand the file is still waiting for upload. PUT the file to this URL. If an upload URL expires, call this endpoint again for a fresh one.
fileId in this response and in the download response is a numeric string such as "11". It never contains a separator such as -.
Result by order type
result is an object only when status is complete. The key is always present and is null in every other status.
- Anti-AI
- Watermark embed
- Watermark extract
- AI Detection
result.outputFiles[] has one output file for each input file.| Field | Type | Description |
|---|---|---|
fileId | string | Output file ID. Matches files[].fileId in the download response, in the same order |
fileName | string | null | Output file name |
inputFileId | string | inputFiles[].fileId of the source file |
result.outputFiles[] has one output file for each embedded watermark text. If a v3 order embeds several texts in one input file, those output files share the same inputFileId.| Field | Type | Description |
|---|---|---|
fileId | string | Output file ID. Matches files[].fileId in the download response, in the same order |
fileName | string | null | Output file name |
inputFileId | string | inputFiles[].fileId of the source file |
watermarkText | string | The text embedded in this output file |
| Field | Type | Description |
|---|---|---|
detectionStatus | string | Outcome. See the table below |
watermarkText | string | null | Embedded text of the detected watermark. null unless detectionStatus is detected. For v3 orders, it is returned only when your account embedded the watermark and exactly one issuance record matches |
reportSupported | boolean | Whether you can create a report from this result. false for v2 orders and for images captured from a PDF |
reports | array | { locale, status } for each report requested for this order. Always empty for v2 orders |
detectionStatus | Meaning |
|---|---|
detected | A watermark was found |
undetected | The file was fully checked and no watermark was found |
inconclusive | A candidate was found, but it did not meet the confidence threshold |
unsupported | The input cannot be processed. The credit is refunded |
error | Detection failed. This is not the same as no watermark |
| Field | Type | Description |
|---|---|---|
verdict | string | null | Verdict based on probability. See the table below. null when probability is null |
probability | number | null | Probability that the image is AI-generated, from 0 to 1 |
options | object | null | generateHeatmap, generateOverlay, and generateThumbnail as set when the order was created |
originalImageUrl | string | null | Original image URL, valid for 1 hour |
heatmapUrl | string | null | Heatmap image URL, valid for 1 hour. null unless the order used generateHeatmap |
overlayUrl | string | null | Heatmap overlay URL, valid for 1 hour. null unless the order used generateOverlay |
verdict | Probability range | Meaning |
|---|---|---|
likely_real | < 0.25 | Likely not AI-generated |
uncertain_real | 0.25 – 0.5 | Possibly not AI-generated |
uncertain_ai | 0.5 – 0.75 | Possibly AI-generated |
likely_ai | ≥ 0.75 | Likely AI-generated |
Examples
Completed orders of each type:{
"data": {
"type": "antiAi",
"orderId": "1001",
"orderName": "cat.png",
"channel": "api",
"status": "complete",
"createdAt": "2026-10-08T01:00:00.000Z",
"updatedAt": "2026-10-08T01:00:40.000Z",
"expiresAt": "2026-11-07T01:00:00.000Z",
"retentionDays": 30,
"thumbnailImageUrl": "https://cdn.bizmori.com/thumb/ex.webp",
"processingDelayed": false,
"errors": null,
"inputFiles": [
{ "fileId": "11", "fileName": "cat.png" },
{ "fileId": "12", "fileName": "dog.png" }
],
"result": {
"outputFiles": [
{ "fileId": "21", "fileName": "cat.png", "inputFileId": "11" },
{ "fileId": "22", "fileName": "dog.png", "inputFileId": "12" }
]
}
}
}
{
"data": {
"type": "aiDetection",
"orderId": "4001",
"orderName": "photo.jpg",
"channel": "api",
"status": "complete",
"createdAt": "2026-10-08T01:00:00.000Z",
"updatedAt": "2026-10-08T01:00:40.000Z",
"expiresAt": "2026-11-07T01:00:00.000Z",
"retentionDays": 30,
"thumbnailImageUrl": "https://cdn.bizmori.com/ai/photo.jpg",
"processingDelayed": false,
"errors": null,
"inputFiles": [
{ "fileId": "71", "fileName": "photo.jpg" }
],
"result": {
"verdict": "uncertain_real",
"probability": 0.31,
"options": {
"generateHeatmap": true,
"generateOverlay": true,
"generateThumbnail": true
},
"originalImageUrl": "https://cdn.bizmori.com/ai/photo.jpg",
"heatmapUrl": "https://cdn.bizmori.com/ai/heatmap.png",
"overlayUrl": "https://cdn.bizmori.com/ai/overlay.png"
}
}
}
{
"data": {
"type": "watermarkEmbed",
"orderId": "2001",
"orderName": "logo.png",
"channel": "api",
"status": "complete",
"createdAt": "2026-10-08T01:00:00.000Z",
"updatedAt": "2026-10-08T01:00:40.000Z",
"expiresAt": "2026-11-07T01:00:00.000Z",
"retentionDays": 30,
"thumbnailImageUrl": "https://cdn.bizmori.com/thumb/ex.webp",
"processingDelayed": false,
"errors": null,
"inputFiles": [
{ "fileId": "31", "fileName": "logo.png" }
],
"result": {
"outputFiles": [
{ "fileId": "201", "fileName": "logo.png", "inputFileId": "31", "watermarkText": "MORI" },
{ "fileId": "202", "fileName": "logo.png", "inputFileId": "31", "watermarkText": "MORI-2" }
]
}
}
}
{
"data": {
"type": "watermarkExtract",
"orderId": "3001",
"orderName": "suspect.png",
"channel": "api",
"status": "complete",
"createdAt": "2026-10-08T01:00:00.000Z",
"updatedAt": "2026-10-08T01:00:40.000Z",
"expiresAt": "2026-11-07T01:00:00.000Z",
"retentionDays": 30,
"thumbnailImageUrl": "https://cdn.bizmori.com/thumb/ex.webp",
"processingDelayed": false,
"errors": null,
"inputFiles": [
{ "fileId": "51", "fileName": "original.png", "role": "original" },
{ "fileId": "52", "fileName": "suspect.png", "role": "query" }
],
"result": {
"detectionStatus": "detected",
"watermarkText": "MORI",
"reportSupported": true,
"reports": [
{ "locale": "ko-KR", "status": "completed" }
]
}
}
}
result: null:
{
"data": {
"type": "watermarkExtract",
"orderId": "3201",
"orderName": "suspect.png",
"channel": "api",
"status": "pending",
"createdAt": "2026-10-08T01:00:00.000Z",
"updatedAt": "2026-10-08T01:00:40.000Z",
"expiresAt": "2026-11-07T01:00:00.000Z",
"retentionDays": 30,
"thumbnailImageUrl": null,
"processingDelayed": false,
"errors": null,
"inputFiles": [
{
"fileId": "81",
"fileName": "original.png",
"role": "original",
"uploadUrl": "https://bucket.s3.ap-northeast-2.amazonaws.com/inputs/81?X-Amz-..."
},
{
"fileId": "82",
"fileName": "suspect.png",
"role": "query",
"uploadUrl": "https://bucket.s3.ap-northeast-2.amazonaws.com/inputs/82?X-Amz-..."
}
],
"result": null
}
}
{
"data": {
"type": "watermarkEmbed",
"orderId": "2002",
"orderName": "logo.png",
"channel": "api",
"status": "failed",
"createdAt": "2026-10-08T01:00:00.000Z",
"updatedAt": "2026-10-08T01:00:40.000Z",
"expiresAt": "2026-11-07T01:00:00.000Z",
"retentionDays": 30,
"thumbnailImageUrl": "https://cdn.bizmori.com/thumb/ex.webp",
"processingDelayed": false,
"errors": {
"errorCode": "WATERMARK_FILE_CORRUPTED",
"errorMessage": "파일이 손상되어 처리할 수 없습니다."
},
"inputFiles": [
{ "fileId": "33", "fileName": "logo.png" }
],
"result": null
}
}
{
"data": {
"type": "antiAi",
"orderId": "1003",
"orderName": "cat.png",
"channel": "api",
"status": "expired",
"createdAt": "2026-10-08T01:00:00.000Z",
"updatedAt": "2026-10-08T01:00:40.000Z",
"expiresAt": "2026-10-01T00:00:00.000Z",
"retentionDays": 30,
"thumbnailImageUrl": "https://cdn.bizmori.com/thumb/ex.webp",
"processingDelayed": false,
"errors": null,
"inputFiles": [
{ "fileId": "14", "fileName": "cat.png" }
],
"result": null
}
}
- Pending: only files that are still waiting for upload have
uploadUrl. Watermark embed, Anti-AI, and AI Detection orders have norole. - Failed:
errorshas the reason, andresultisnull.errorMessageis a fixed Korean message for the error code. - Expired: you can still get the order after the retention period ends, but
resultisnulland no URLs are issued. Downloads return400 ORDER_EXPIRED.
Changes from the previous response
On October 8, 2026, this endpoint switched to the shape above. This is a breaking change.| Previous response | Now |
|---|---|
files[] (v3 watermark orders) | inputFiles[]. uploadUrl is omitted unless the order is pending |
outputs[] (v3 watermark orders) | result.outputFiles[]. outputIndex, status, and mediaKind are no longer returned |
Output fileId such as "601-1" | Numeric string such as "201" |
Top-level reports[] | result.reports[] |
detectionStatus: "not_detected" | "undetected" |
fileCount | inputFiles.length |
statusCode (AI Detection) | result.verdict |
statusCode and status: "detected" / "undetected" (v2 watermark extract) | status: "complete" and result.detectionStatus |
watermarks[] (v2 watermark embed) | result.outputFiles[].watermarkText |
Top-level watermarkText, probability, options, originalImageUrl, heatmapUrl, overlayUrl | Inside result |
GET /api/v2/orders/{orderId} still returns its previous response, unchanged.
Test keys
With ansk_test_ key, this endpoint returns only test orders created with the same key, in the shape above. See Test API keys for how test orders move through each status.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.
Path Parameters
Order ID
^[0-9]{1,20}$Response
Order details. The top-level fields are the same for every order type; only result depends on type
v3 order detail. The top-level fields are the same for every order type (PublicOrderV3DetailCommon); only result, and inputFiles[].role on extract orders, differ by type
- Anti-AI
- Watermark embed
- Watermark extract
- AI Detection
Hide child attributes
Hide child attributes
Order type. Watermark orders return watermarkEmbed or watermarkExtract whether they were created with v2 or v3
antiAi Order ID
"1001"
Order name. For watermark orders created with v3, the display file name, or the stored name if there is none
Order channel
api, web pending- Waiting for file uploadsinProgress- Processingcomplete- Finished. Only then isresultan objectfailed- Failed. Seeerrorsfor the reasonexpired- The retention period has ended. You can still get the order, butresultand all URLs arenull
v2 watermark extract orders stored as detected or undetected return complete, with the outcome in result.detectionStatus
pending, inProgress, complete, failed, expired Created at
Updated at
When the order files are deleted (UTC, ISO 8601). null only in data integrity exceptions
File retention period fixed at order creation, in days (7 or 30). null only in data integrity exceptions
30
Thumbnail image URL. The source depends on the order type: Anti-AI orders and v2 watermark orders return a fixed status image while incomplete or failed, AI Detection orders return the detail thumbnail or the original image, and v3 watermark orders return the detail thumbnail, which can be null before processing
true when a watermark order created with v3 has exhausted automatic retries and is waiting for manual recovery. The order stays inProgress. Always false for other orders
Failure details of a failed order; otherwise null. Watermark orders created with v3 return a public errorCode and a fixed errorMessage. Other orders return the stored error information as is, which may omit errorCode
Input files in request order. Use inputFiles.length for the file count. watermarkExtract orders use PublicExtractInputFile (with role); other orders use PublicInputFile
Input file of an order other than watermarkExtract, in request order. There is no role key. The uploadUrl key appears only while the order status is pending and the file is waiting for upload; otherwise the key is omitted, not set to null
- Option 1
- Option 2
Hide child attributes
Hide child attributes
Input file ID. A numeric string
^[0-9]+$"11"
Input file name, including the extension. null if unknown
"cat.png"
Presigned PUT URL for uploading the file. Present only while the order status is pending, the retention period has not ended, and the file is waiting for upload. Omitted for files already uploaded, files given by originalFileUrl, and orders that are not pending
Anti-AI order result. An object only when status is complete; otherwise null
Hide child attributes
Hide child attributes
Output files. One output file per input file
Hide child attributes
Hide child attributes
Output file ID. A numeric string, unique within the order
^[0-9]+$"21"
Output file name, including the extension. null if unknown
"cat.png"
inputFiles[].fileId of the input file this output was created from
^[0-9]+$"11"