curl -X POST https://api.bizmori.com/api/v2/orders/ai-detection \
-H "Authorization: Bearer YOUR_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{"idempotencyKey": "0e6c4a9b-b1d8-457e-a9fc-4b7d0e3a6c59", "fileName": "photo.jpg"}'const response = await fetch('https://api.bizmori.com/api/v2/orders/ai-detection', {
method: 'POST',
headers: {
'Authorization': 'Bearer YOUR_API_TOKEN',
'Content-Type': 'application/json'
},
body: JSON.stringify({
idempotencyKey: '0e6c4a9b-b1d8-457e-a9fc-4b7d0e3a6c59',
fileName: 'photo.jpg'
})
});
const data = await response.json();import requests
response = requests.post(
'https://api.bizmori.com/api/v2/orders/ai-detection',
headers={'Authorization': 'Bearer YOUR_API_TOKEN'},
json={'idempotencyKey': '0e6c4a9b-b1d8-457e-a9fc-4b7d0e3a6c59', 'fileName': 'photo.jpg'}
)
data = response.json()<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.bizmori.com/api/v2/orders/ai-detection",
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' => '0e6c4a9b-b1d8-457e-a9fc-4b7d0e3a6c59',
'fileName' => 'photo.jpg',
'orderName' => 'my-detection-order',
'options' => [
'generateHeatmap' => false,
'generateOverlay' => false,
'generateThumbnail' => false
]
]),
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/ai-detection"
payload := strings.NewReader("{\n \"idempotencyKey\": \"0e6c4a9b-b1d8-457e-a9fc-4b7d0e3a6c59\",\n \"fileName\": \"photo.jpg\",\n \"orderName\": \"my-detection-order\",\n \"options\": {\n \"generateHeatmap\": false,\n \"generateOverlay\": false,\n \"generateThumbnail\": false\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/ai-detection")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"idempotencyKey\": \"0e6c4a9b-b1d8-457e-a9fc-4b7d0e3a6c59\",\n \"fileName\": \"photo.jpg\",\n \"orderName\": \"my-detection-order\",\n \"options\": {\n \"generateHeatmap\": false,\n \"generateOverlay\": false,\n \"generateThumbnail\": false\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.bizmori.com/api/v2/orders/ai-detection")
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\": \"0e6c4a9b-b1d8-457e-a9fc-4b7d0e3a6c59\",\n \"fileName\": \"photo.jpg\",\n \"orderName\": \"my-detection-order\",\n \"options\": {\n \"generateHeatmap\": false,\n \"generateOverlay\": false,\n \"generateThumbnail\": false\n }\n}"
response = http.request(request)
puts response.read_body{
"data": {
"orderId": "<string>",
"orderName": "<string>",
"status": "pending",
"file": {
"fileId": 123,
"fileName": "<string>",
"uploadUrl": "<string>",
"fileKey": "<string>"
}
}
}{
"code": "VALIDATION_FAILED"
}{
"code": "AUTH_NOT_AUTHENTICATED"
}{
"code": "USAGE_LIMIT_EXCEEDED"
}Create AI Detection order
Creates an AI Detection order and issues an upload URL for the image. Live keys receive an S3 presigned URL; test keys receive an absolute BIZ MORI test-upload URL.
Flow
- Call this endpoint to receive an upload URL
- Upload the image using the live S3 URL or test BIZ MORI URL
- Call
POST /api/v2/orders/ai-detection/confirmto start async detection - Use webhooks or poll the order detail endpoint for the result
Order Status
| Status | Description |
|---|---|
pending | Waiting for file upload |
inProgress | Detection is in progress |
complete | Detection complete, result available |
failed | Detection failed |
Supported Formats
jpg, jpeg, png, webp, bmp, tiff
curl -X POST https://api.bizmori.com/api/v2/orders/ai-detection \
-H "Authorization: Bearer YOUR_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{"idempotencyKey": "0e6c4a9b-b1d8-457e-a9fc-4b7d0e3a6c59", "fileName": "photo.jpg"}'const response = await fetch('https://api.bizmori.com/api/v2/orders/ai-detection', {
method: 'POST',
headers: {
'Authorization': 'Bearer YOUR_API_TOKEN',
'Content-Type': 'application/json'
},
body: JSON.stringify({
idempotencyKey: '0e6c4a9b-b1d8-457e-a9fc-4b7d0e3a6c59',
fileName: 'photo.jpg'
})
});
const data = await response.json();import requests
response = requests.post(
'https://api.bizmori.com/api/v2/orders/ai-detection',
headers={'Authorization': 'Bearer YOUR_API_TOKEN'},
json={'idempotencyKey': '0e6c4a9b-b1d8-457e-a9fc-4b7d0e3a6c59', 'fileName': 'photo.jpg'}
)
data = response.json()<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.bizmori.com/api/v2/orders/ai-detection",
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' => '0e6c4a9b-b1d8-457e-a9fc-4b7d0e3a6c59',
'fileName' => 'photo.jpg',
'orderName' => 'my-detection-order',
'options' => [
'generateHeatmap' => false,
'generateOverlay' => false,
'generateThumbnail' => false
]
]),
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/ai-detection"
payload := strings.NewReader("{\n \"idempotencyKey\": \"0e6c4a9b-b1d8-457e-a9fc-4b7d0e3a6c59\",\n \"fileName\": \"photo.jpg\",\n \"orderName\": \"my-detection-order\",\n \"options\": {\n \"generateHeatmap\": false,\n \"generateOverlay\": false,\n \"generateThumbnail\": false\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/ai-detection")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"idempotencyKey\": \"0e6c4a9b-b1d8-457e-a9fc-4b7d0e3a6c59\",\n \"fileName\": \"photo.jpg\",\n \"orderName\": \"my-detection-order\",\n \"options\": {\n \"generateHeatmap\": false,\n \"generateOverlay\": false,\n \"generateThumbnail\": false\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.bizmori.com/api/v2/orders/ai-detection")
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\": \"0e6c4a9b-b1d8-457e-a9fc-4b7d0e3a6c59\",\n \"fileName\": \"photo.jpg\",\n \"orderName\": \"my-detection-order\",\n \"options\": {\n \"generateHeatmap\": false,\n \"generateOverlay\": false,\n \"generateThumbnail\": false\n }\n}"
response = http.request(request)
puts response.read_body{
"data": {
"orderId": "<string>",
"orderName": "<string>",
"status": "pending",
"file": {
"fileId": 123,
"fileName": "<string>",
"uploadUrl": "<string>",
"fileKey": "<string>"
}
}
}{
"code": "VALIDATION_FAILED"
}{
"code": "AUTH_NOT_AUTHENTICATED"
}{
"code": "USAGE_LIMIT_EXCEEDED"
}How to upload the image
After receiving theuploadUrl from the response, upload your image using a PUT request. Live keys return a presigned storage URL. Test keys return a BIZ MORI test upload URL that consumes and discards the request body:
curl -X PUT "UPLOAD_URL" \
-H "Content-Type: image/jpeg" \
--data-binary @photo.jpg
Getting the detection result
Once you confirm the upload, the order status changes toinProgress. When detection completes, the result is available via:
- Webhook — Subscribe to
order.aiDetection.completedororder.aiDetection.failedevents - Polling — Call Get order details until
statusiscompleteorfailed
complete, the detection result is in result. The example below omits the common order fields; see Get order details for the full response.
{
"data": {
"type": "aiDetection",
"orderId": "...",
"status": "complete",
"result": {
"verdict": "likely_ai",
"probability": 0.97,
"options": {
"generateHeatmap": true,
"generateOverlay": false,
"generateThumbnail": true
},
"originalImageUrl": "https://...",
"heatmapUrl": "https://...",
"overlayUrl": null
}
}
}
_ai for probability 0.98 or _human for probability 0.02. Test orders do not create downloadable heatmap or overlay files.Verdict
result.verdict | Probability range | Meaning |
|---|---|---|
likely_ai | ≥ 0.75 | Likely AI-generated |
uncertain_ai | 0.5 – 0.75 | Possibly AI-generated |
uncertain_real | 0.25 – 0.5 | Possibly not AI-generated |
likely_real | < 0.25 | Likely not AI-generated |
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 to prevent duplicate requests
"0e6c4a9b-b1d8-457e-a9fc-4b7d0e3a6c59"
Image file name with extension. Supported: jpg, jpeg, png, webp, bmp, tiff
"photo.jpg"
Order name (optional, auto-generated if not provided)
64"my-detection-order"
Output options (optional). Generated files are included in the order detail response.
Response
Order created successfully
Hide child attributes
Hide child attributes
Order ID
Order name
Order status
pending Hide child attributes
Hide child attributes
File record 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. 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.