curl --request POST \
--url https://api.copyleaks.com/v1/ai-video-detector/my-video-scan-1/submit \
--header 'Authorization: Bearer YOUR_LOGIN_TOKEN' \
--header 'Content-Type: application/json' \
--data '{
"url": "https://example.com/my-video.mp4",
"filename": "my-video.mp4",
"model": "ai-video-1-pro",
"sandbox": true,
"webhooks": {
"url": "https://your-server.com/webhook/receive-results"
}
}'
import requests
url = 'https://api.copyleaks.com/v1/ai-video-detector/my-video-scan-1/submit'
headers = {
'Authorization': 'Bearer YOUR_LOGIN_TOKEN',
'Content-Type': 'application/json'
}
payload = {
'url': 'https://example.com/my-video.mp4',
'filename': 'my-video.mp4',
'model': 'ai-video-1-pro',
'sandbox': True,
'webhooks': {
'url': 'https://your-server.com/webhook/receive-results'
}
}
response = requests.post(url, json=payload, headers=headers)
print(f"Submission status: {response.status_code}") # 201 Created
const response = await fetch(
'https://api.copyleaks.com/v1/ai-video-detector/my-video-scan-1/submit',
{
method: 'POST',
headers: {
'Authorization': 'Bearer YOUR_LOGIN_TOKEN',
'Content-Type': 'application/json'
},
body: JSON.stringify({
url: 'https://example.com/my-video.mp4',
filename: 'my-video.mp4',
model: 'ai-video-1-pro',
sandbox: true,
webhooks: {
url: 'https://your-server.com/webhook/receive-results'
}
})
}
);
console.log('Submission status:', response.status); // 201 Created
POST https://api.copyleaks.com/v1/ai-video-detector/my-video-scan-1/submit
Content-Type: application/json
Authorization: Bearer YOUR_LOGIN_TOKEN
{
"url": "https://example.com/my-video.mp4",
"filename": "my-video.mp4",
"model": "ai-video-1-pro",
"sandbox": true,
"webhooks": {
"url": "https://your-server.com/webhook/receive-results"
}
}
{}
{
"error": "Invalid request parameters."
}
{
"error": "Authentication or authorization failed."
}
{
"error": "Insufficient credits."
}
{
"error": "Rate limit exceeded."
}
{
"error": "The server encountered an internal error."
}
AI Video Detector
AI Video Detection
Submit a video URL for AI-generated content detection. Results are delivered asynchronously via webhook.
POST
/
v1
/
ai-video-detector
/
{scanId}
/
submit
curl --request POST \
--url https://api.copyleaks.com/v1/ai-video-detector/my-video-scan-1/submit \
--header 'Authorization: Bearer YOUR_LOGIN_TOKEN' \
--header 'Content-Type: application/json' \
--data '{
"url": "https://example.com/my-video.mp4",
"filename": "my-video.mp4",
"model": "ai-video-1-pro",
"sandbox": true,
"webhooks": {
"url": "https://your-server.com/webhook/receive-results"
}
}'
import requests
url = 'https://api.copyleaks.com/v1/ai-video-detector/my-video-scan-1/submit'
headers = {
'Authorization': 'Bearer YOUR_LOGIN_TOKEN',
'Content-Type': 'application/json'
}
payload = {
'url': 'https://example.com/my-video.mp4',
'filename': 'my-video.mp4',
'model': 'ai-video-1-pro',
'sandbox': True,
'webhooks': {
'url': 'https://your-server.com/webhook/receive-results'
}
}
response = requests.post(url, json=payload, headers=headers)
print(f"Submission status: {response.status_code}") # 201 Created
const response = await fetch(
'https://api.copyleaks.com/v1/ai-video-detector/my-video-scan-1/submit',
{
method: 'POST',
headers: {
'Authorization': 'Bearer YOUR_LOGIN_TOKEN',
'Content-Type': 'application/json'
},
body: JSON.stringify({
url: 'https://example.com/my-video.mp4',
filename: 'my-video.mp4',
model: 'ai-video-1-pro',
sandbox: true,
webhooks: {
url: 'https://your-server.com/webhook/receive-results'
}
})
}
);
console.log('Submission status:', response.status); // 201 Created
POST https://api.copyleaks.com/v1/ai-video-detector/my-video-scan-1/submit
Content-Type: application/json
Authorization: Bearer YOUR_LOGIN_TOKEN
{
"url": "https://example.com/my-video.mp4",
"filename": "my-video.mp4",
"model": "ai-video-1-pro",
"sandbox": true,
"webhooks": {
"url": "https://your-server.com/webhook/receive-results"
}
}
{}
{
"error": "Invalid request parameters."
}
{
"error": "Authentication or authorization failed."
}
{
"error": "Insufficient credits."
}
{
"error": "Rate limit exceeded."
}
{
"error": "The server encountered an internal error."
}
Submit a video URL for AI-generated content detection. The endpoint is asynchronous - it returns
201 Created immediately, and the detection results are delivered to your webhook URL once processing is complete.
Authentication is required. See Login for how to obtain a bearer token.
Try it without writing code - open the Video Detection Playground to submit a sample video and inspect the webhook response in your browser.
AI Video Detection is a new endpoint and the official Copyleaks SDKs (Python, JavaScript, Java, C#, PHP, Ruby) don’t yet expose a wrapper method. The code samples below call the HTTP API directly. SDK support is planned - until then, use the raw HTTP pattern.
Path parameters
string
required
A unique scan id provided by you. We recommend using the same id in your database to represent the scan in the Copyleaks database - this helps debug incidents and avoid duplicate scans for the same file. See criteria for creating a Scan ID.
>= 3 characters <= 36 charactersMatch pattern: [a-z0-9] !@$^&-+%=_(){}<>';:/.",~`|Headers
Content-Type: application/json
Authorization: Bearer YOUR_LOGIN_TOKEN
Body parameters
string
required
Publicly accessible URL of the video file to analyze.Example:
"https://example.com/my-video.mp4"array
Optional custom headers to include when Copyleaks fetches the video from the provided
url. Each entry is a two-element array: ["Header-Name", "Header-Value"].Example: [["X-Custom-Auth", "my-token"]]string
Describes the HTTP method that is going to be executed on the specified
url. Supported values: GET, POST, PUT.string
required
The name of the video file including its extension.Requirements:
- Must include a supported video extension
<= 255 characters
.mp4, .avi, .mov, .mkv, .webm, .flv, .wmv, .mpg, .m4v, .3gp, .mxfExample: "my-video.mp4"string
required
The AI detection model to use for analysis.
- AI Video 1 Pro:
"ai-video-1-pro"
"ai-video-1-pro"object
required
Webhook configuration for receiving the async results.
Show properties
Show properties
string
required
The URL that Copyleaks will POST the detection results to when processing is complete.Example:
"https://your-server.com/webhook/receive-results"array
Optional custom headers to include in the webhook request. Each entry is a two-element array:
["Header-Name", "Header-Value"].Example: [["Authorization", "Bearer my-webhook-token"]]boolean
default:"false"
Use sandbox mode to test your integration with the Copyleaks API without consuming any credits. Submit videos for AI detection and receive mock results simulating the API. Intended for development purposes only.
string
An optional string payload that Copyleaks will include in the webhook response, allowing you to correlate the callback with your internal data.Example:
"order-id-12345"For testing, set
"sandbox": true. Sandbox mode is free and returns mock results.Video requirements
Returned as400 Bad Request at submit (synchronous):
- Missing or invalid
scanId,filename,url,model, orwebhooks - Unsupported file extension
- Filename longer than 255 characters
- Invalid
verbvalue
- Duration outside 2 seconds-1 hour →
video_too_short(67) /video_too_long(68) - File larger than 512 MiB →
file_too_large(6) - Resolution below 360×360 →
video_resolution_too_low(65) - Frame rate below 16 FPS →
fps_too_low(66) - Undecodable codec →
unsupported_video_codec(71) - Corrupt or truncated file →
video_truncated(70) - Generic decode failure →
video_load_failed(72)
Webhook payload
When processing completes, Copyleaks sends aPOST request to your webhook URL with the detection results. See AI Video Detection Response for the complete field reference.
curl --request POST \
--url https://api.copyleaks.com/v1/ai-video-detector/my-video-scan-1/submit \
--header 'Authorization: Bearer YOUR_LOGIN_TOKEN' \
--header 'Content-Type: application/json' \
--data '{
"url": "https://example.com/my-video.mp4",
"filename": "my-video.mp4",
"model": "ai-video-1-pro",
"sandbox": true,
"webhooks": {
"url": "https://your-server.com/webhook/receive-results"
}
}'
import requests
url = 'https://api.copyleaks.com/v1/ai-video-detector/my-video-scan-1/submit'
headers = {
'Authorization': 'Bearer YOUR_LOGIN_TOKEN',
'Content-Type': 'application/json'
}
payload = {
'url': 'https://example.com/my-video.mp4',
'filename': 'my-video.mp4',
'model': 'ai-video-1-pro',
'sandbox': True,
'webhooks': {
'url': 'https://your-server.com/webhook/receive-results'
}
}
response = requests.post(url, json=payload, headers=headers)
print(f"Submission status: {response.status_code}") # 201 Created
const response = await fetch(
'https://api.copyleaks.com/v1/ai-video-detector/my-video-scan-1/submit',
{
method: 'POST',
headers: {
'Authorization': 'Bearer YOUR_LOGIN_TOKEN',
'Content-Type': 'application/json'
},
body: JSON.stringify({
url: 'https://example.com/my-video.mp4',
filename: 'my-video.mp4',
model: 'ai-video-1-pro',
sandbox: true,
webhooks: {
url: 'https://your-server.com/webhook/receive-results'
}
})
}
);
console.log('Submission status:', response.status); // 201 Created
POST https://api.copyleaks.com/v1/ai-video-detector/my-video-scan-1/submit
Content-Type: application/json
Authorization: Bearer YOUR_LOGIN_TOKEN
{
"url": "https://example.com/my-video.mp4",
"filename": "my-video.mp4",
"model": "ai-video-1-pro",
"sandbox": true,
"webhooks": {
"url": "https://your-server.com/webhook/receive-results"
}
}
{}
{
"error": "Invalid request parameters."
}
{
"error": "Authentication or authorization failed."
}
{
"error": "Insufficient credits."
}
{
"error": "Rate limit exceeded."
}
{
"error": "The server encountered an internal error."
}
Example webhook delivery
{
"model": "ai-video-1-pro",
"audioResult": {
"starts": [13000, 45000, 47000],
"lengths": [14000, 1000, 8700],
"exclude": {
"starts": [0, 3250, 5400, 7600, 10500],
"lengths": [2950, 1500, 1200, 650, 1050]
}
},
"visualResult": {
"starts": [11566, 29433],
"lengths": [6134, 26267],
"exclude": {
"starts": [],
"lengths": []
}
},
"summary": {
"audioAIRatio": 0.4902,
"visualAIRatio": 0.5817,
"overallAIRatio": 0.7487
},
"isAiDetected": true,
"videoInfo": {
"metadata": {
"issuedTime": "2026-03-17T13:14:57+00:00",
"issuedBy": "OpenAI",
"appOrDeviceUsed": "Sora",
"contentSummary": "Created using generative AI"
},
"duration": 55.7
},
"scannedVideo": {
"scanId": "my-video-scan-1",
"actualCredits": 1,
"expectedCredits": 1,
"creationTime": "2026-05-05T12:37:50Z"
}
}

