curl --request POST \
--url https://api.aurigin.ai/v1/predict \
--header 'Content-Type: multipart/form-data' \
--header 'x-api-key: <api-key>' \
--form file='@example-file' \
--form device=api \
--form model=apollo-4-5-2026-03-26 \
--form threshold=0.5import requests
url = "https://api.aurigin.ai/v1/predict"
files = { "file": ("example-file", open("example-file", "rb")) }
payload = {
"device": "api",
"model": "apollo-4-5-2026-03-26",
"threshold": "0.5"
}
headers = {"x-api-key": "<api-key>"}
response = requests.post(url, data=payload, files=files, headers=headers)
print(response.text)const form = new FormData();
form.append('file', '(binary audio file)');
form.append('device', 'api');
form.append('model', 'apollo-4-5-2026-03-26');
form.append('threshold', '0.5');
const options = {method: 'POST', headers: {'x-api-key': '<api-key>'}};
options.body = form;
fetch('https://api.aurigin.ai/v1/predict', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.aurigin.ai/v1/predict",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n(binary audio file)\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"device\"\r\n\r\napi\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"model\"\r\n\r\napollo-4-5-2026-03-26\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"threshold\"\r\n\r\n0.5\r\n-----011000010111000001101001--",
CURLOPT_HTTPHEADER => [
"Content-Type: multipart/form-data",
"x-api-key: <api-key>"
],
]);
$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.aurigin.ai/v1/predict"
payload := strings.NewReader("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n(binary audio file)\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"device\"\r\n\r\napi\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"model\"\r\n\r\napollo-4-5-2026-03-26\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"threshold\"\r\n\r\n0.5\r\n-----011000010111000001101001--")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-api-key", "<api-key>")
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.aurigin.ai/v1/predict")
.header("x-api-key", "<api-key>")
.body("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n(binary audio file)\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"device\"\r\n\r\napi\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"model\"\r\n\r\napollo-4-5-2026-03-26\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"threshold\"\r\n\r\n0.5\r\n-----011000010111000001101001--")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.aurigin.ai/v1/predict")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-api-key"] = '<api-key>'
request.body = "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n(binary audio file)\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"device\"\r\n\r\napi\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"model\"\r\n\r\napollo-4-5-2026-03-26\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"threshold\"\r\n\r\n0.5\r\n-----011000010111000001101001--"
response = http.request(request)
puts response.read_bodyAI-voice detection
Detect whether audio clips are human (bonafide) or AI-generated (spoofed) and get segment-level confidence scores.
Designed for quick checks
- Supported formats: WAV, MP3, AAC, FLAC, OGG, M4A, MP4, MOV, AVI, MKV
Two ways to send audio
multipart/form-dataupload with afileapplication/jsonpayload with apresigned_url
The API automatically analyzes the audio in ~5-second segments and returns both a global verdict and detailed per-segment results.
curl --request POST \
--url https://api.aurigin.ai/v1/predict \
--header 'Content-Type: multipart/form-data' \
--header 'x-api-key: <api-key>' \
--form file='@example-file' \
--form device=api \
--form model=apollo-4-5-2026-03-26 \
--form threshold=0.5import requests
url = "https://api.aurigin.ai/v1/predict"
files = { "file": ("example-file", open("example-file", "rb")) }
payload = {
"device": "api",
"model": "apollo-4-5-2026-03-26",
"threshold": "0.5"
}
headers = {"x-api-key": "<api-key>"}
response = requests.post(url, data=payload, files=files, headers=headers)
print(response.text)const form = new FormData();
form.append('file', '(binary audio file)');
form.append('device', 'api');
form.append('model', 'apollo-4-5-2026-03-26');
form.append('threshold', '0.5');
const options = {method: 'POST', headers: {'x-api-key': '<api-key>'}};
options.body = form;
fetch('https://api.aurigin.ai/v1/predict', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.aurigin.ai/v1/predict",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n(binary audio file)\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"device\"\r\n\r\napi\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"model\"\r\n\r\napollo-4-5-2026-03-26\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"threshold\"\r\n\r\n0.5\r\n-----011000010111000001101001--",
CURLOPT_HTTPHEADER => [
"Content-Type: multipart/form-data",
"x-api-key: <api-key>"
],
]);
$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.aurigin.ai/v1/predict"
payload := strings.NewReader("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n(binary audio file)\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"device\"\r\n\r\napi\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"model\"\r\n\r\napollo-4-5-2026-03-26\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"threshold\"\r\n\r\n0.5\r\n-----011000010111000001101001--")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-api-key", "<api-key>")
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.aurigin.ai/v1/predict")
.header("x-api-key", "<api-key>")
.body("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n(binary audio file)\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"device\"\r\n\r\napi\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"model\"\r\n\r\napollo-4-5-2026-03-26\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"threshold\"\r\n\r\n0.5\r\n-----011000010111000001101001--")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.aurigin.ai/v1/predict")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-api-key"] = '<api-key>'
request.body = "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n(binary audio file)\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"device\"\r\n\r\napi\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"model\"\r\n\r\napollo-4-5-2026-03-26\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"threshold\"\r\n\r\n0.5\r\n-----011000010111000001101001--"
response = http.request(request)
puts response.read_bodyAuthorizations
Body
Provide either a direct file upload or a presigned URL. Include device to tag the caller and optionally choose a model.
Optional device type making the request
macos, windows, web_app, api Optional model version to run. Defaults to the latest available model (apollo-4-5-2026-03-26). apollo-4-2026-01-16 remains available for backwards compatibility.
apollo-4-5-2026-03-26, apollo-4-2026-01-16 Optional custom prediction identifier
Maximum silence percentage allowed per segment before it is skipped (0.0-100.0). Segments where silence exceeds this threshold are excluded from model inference. Lower values are stricter (skip more segments); higher values are more permissive. Set to 100 to analyze virtually all segments regardless of silence.
0 <= x <= 100Decision threshold for classifying audio as bonafide or spoofed (0.0-1.0). Lower values bias toward higher spoof detection; higher values reduce false positives. Confidence scores are derived from how far the raw score is from this threshold.
0 <= x <= 1Response
Global verdict plus per-segment predictions and confidence scores.
Unique identifier for this prediction
Show child attributes
Show child attributes
Array of segment-level predictions. Each segment represents a 5-second window of the audio.
Show child attributes
Show child attributes
Model version used for prediction
Time taken to process the audio in seconds
Duration of the audio file in seconds
Array of warning messages, if any