curl --request POST \
--url https://api.copyleaks.com/v1/image-plagiarism-detector/my-scan-1/check \
--header 'Authorization: Bearer YOUR_LOGIN_TOKEN' \
--form 'image=@/path/to/my-photo.jpg' \
--form 'filename=my-photo.jpg' \
--form 'sandbox=false'
from copyleaks.copyleaks import Copyleaks
from copyleaks.models.ImagePlagiarism.Requests.CopyleaksImagePlagiarismRequestModel import CopyleaksImagePlagiarismRequestModel
auth_token = Copyleaks.login("[email protected]", "YOUR_API_KEY")
with open('my-photo.jpg', 'rb') as image_file:
request = CopyleaksImagePlagiarismRequestModel(image=image_file, file_name='my-photo.jpg', sandbox=False)
response = Copyleaks.ImagePlagiarismClient.check(auth_token, 'my-scan-1', request)
score = response.matches.score
print(f"Total matches: {score.total_matches}")
print(f"Full matches: {score.full_matches}")
print(f"Partial matches: {score.partial_matches}")
const imageFile = document.getElementById('fileInput').files[0];
const formData = new FormData();
formData.append('image', imageFile);
formData.append('filename', imageFile.name);
formData.append('sandbox', 'false');
const response = await fetch(
'https://api.copyleaks.com/v1/image-plagiarism-detector/my-scan-1/check',
{
method: 'POST',
headers: { 'Authorization': 'Bearer YOUR_LOGIN_TOKEN' },
body: formData,
}
);
const result = await response.json();
console.log('Total matches:', result.matches.score.totalMatches);
console.log('Matches:', result.matches.internet);
{
"developerPayload": "my-custom-data",
"scannedImage": {
"scanId": "my-scan-1",
"expectedCredits": 1,
"actualCredits": 1,
"creationTime": "2026-05-24T10:00:00Z",
"width": 1920,
"height": 1080,
"filename": "my-photo.jpg"
},
"matches": {
"internet": [
{
"url": "https://example.com/images/photo.jpg",
"matchType": 0,
"webPages": [
{ "url": "https://example.com/blog/my-post" },
{ "url": "https://example.org/news/article" }
]
},
{
"url": "https://example.com/thumbs/photo-thumb.jpg",
"matchType": 1,
"webPages": [
{ "url": "https://example.org/gallery" }
]
},
{
"url": "https://example.org/gallery/photo-sm.jpg",
"matchType": 1
}
],
"score": {
"totalMatches": 3,
"fullMatches": 1,
"partialMatches": 2
}
}
}
Image Plagiarism Detector
Image Plagiarism Detection
Search the web for unauthorized copies of an image.
POST
/
v1
/
image-plagiarism-detector
/
{scanId}
/
check
curl --request POST \
--url https://api.copyleaks.com/v1/image-plagiarism-detector/my-scan-1/check \
--header 'Authorization: Bearer YOUR_LOGIN_TOKEN' \
--form 'image=@/path/to/my-photo.jpg' \
--form 'filename=my-photo.jpg' \
--form 'sandbox=false'
from copyleaks.copyleaks import Copyleaks
from copyleaks.models.ImagePlagiarism.Requests.CopyleaksImagePlagiarismRequestModel import CopyleaksImagePlagiarismRequestModel
auth_token = Copyleaks.login("[email protected]", "YOUR_API_KEY")
with open('my-photo.jpg', 'rb') as image_file:
request = CopyleaksImagePlagiarismRequestModel(image=image_file, file_name='my-photo.jpg', sandbox=False)
response = Copyleaks.ImagePlagiarismClient.check(auth_token, 'my-scan-1', request)
score = response.matches.score
print(f"Total matches: {score.total_matches}")
print(f"Full matches: {score.full_matches}")
print(f"Partial matches: {score.partial_matches}")
const imageFile = document.getElementById('fileInput').files[0];
const formData = new FormData();
formData.append('image', imageFile);
formData.append('filename', imageFile.name);
formData.append('sandbox', 'false');
const response = await fetch(
'https://api.copyleaks.com/v1/image-plagiarism-detector/my-scan-1/check',
{
method: 'POST',
headers: { 'Authorization': 'Bearer YOUR_LOGIN_TOKEN' },
body: formData,
}
);
const result = await response.json();
console.log('Total matches:', result.matches.score.totalMatches);
console.log('Matches:', result.matches.internet);
{
"developerPayload": "my-custom-data",
"scannedImage": {
"scanId": "my-scan-1",
"expectedCredits": 1,
"actualCredits": 1,
"creationTime": "2026-05-24T10:00:00Z",
"width": 1920,
"height": 1080,
"filename": "my-photo.jpg"
},
"matches": {
"internet": [
{
"url": "https://example.com/images/photo.jpg",
"matchType": 0,
"webPages": [
{ "url": "https://example.com/blog/my-post" },
{ "url": "https://example.org/news/article" }
]
},
{
"url": "https://example.com/thumbs/photo-thumb.jpg",
"matchType": 1,
"webPages": [
{ "url": "https://example.org/gallery" }
]
},
{
"url": "https://example.org/gallery/photo-sm.jpg",
"matchType": 1
}
],
"score": {
"totalMatches": 3,
"fullMatches": 1,
"partialMatches": 2
}
}
}
curl --request POST \
--url https://api.copyleaks.com/v1/image-plagiarism-detector/my-scan-1/check \
--header 'Authorization: Bearer YOUR_LOGIN_TOKEN' \
--form 'image=@/path/to/my-photo.jpg' \
--form 'filename=my-photo.jpg' \
--form 'sandbox=false'
from copyleaks.copyleaks import Copyleaks
from copyleaks.models.ImagePlagiarism.Requests.CopyleaksImagePlagiarismRequestModel import CopyleaksImagePlagiarismRequestModel
auth_token = Copyleaks.login("[email protected]", "YOUR_API_KEY")
with open('my-photo.jpg', 'rb') as image_file:
request = CopyleaksImagePlagiarismRequestModel(image=image_file, file_name='my-photo.jpg', sandbox=False)
response = Copyleaks.ImagePlagiarismClient.check(auth_token, 'my-scan-1', request)
score = response.matches.score
print(f"Total matches: {score.total_matches}")
print(f"Full matches: {score.full_matches}")
print(f"Partial matches: {score.partial_matches}")
const imageFile = document.getElementById('fileInput').files[0];
const formData = new FormData();
formData.append('image', imageFile);
formData.append('filename', imageFile.name);
formData.append('sandbox', 'false');
const response = await fetch(
'https://api.copyleaks.com/v1/image-plagiarism-detector/my-scan-1/check',
{
method: 'POST',
headers: { 'Authorization': 'Bearer YOUR_LOGIN_TOKEN' },
body: formData,
}
);
const result = await response.json();
console.log('Total matches:', result.matches.score.totalMatches);
console.log('Matches:', result.matches.internet);
{
"developerPayload": "my-custom-data",
"scannedImage": {
"scanId": "my-scan-1",
"expectedCredits": 1,
"actualCredits": 1,
"creationTime": "2026-05-24T10:00:00Z",
"width": 1920,
"height": 1080,
"filename": "my-photo.jpg"
},
"matches": {
"internet": [
{
"url": "https://example.com/images/photo.jpg",
"matchType": 0,
"webPages": [
{ "url": "https://example.com/blog/my-post" },
{ "url": "https://example.org/news/article" }
]
},
{
"url": "https://example.com/thumbs/photo-thumb.jpg",
"matchType": 1,
"webPages": [
{ "url": "https://example.org/gallery" }
]
},
{
"url": "https://example.org/gallery/photo-sm.jpg",
"matchType": 1
}
],
"score": {
"totalMatches": 3,
"fullMatches": 1,
"partialMatches": 2
}
}
}
Request
Path Parameters
string
required
A unique scan ID provided by you. We recommend you use the same ID in your database to represent the scan. Using the same ID for the same file helps avoid duplicate scans caused by network issues. Learn more about the criteria for creating a Scan ID.
>= 3 characters <= 36 charactersSupported Content Type
Submit images using multipart/form-data. Headers:Content-Type: multipart/form-data
Authorization: Bearer YOUR_LOGIN_TOKEN
Body Parameters
file
required
Binary image file to check for plagiarism.Requirements:
- File size: Less than 20MB
- Max resolution: 75 megapixels (width × height ≤ 75,000,000)
- Formats: JPG, JPEG, PNG, GIF, BMP, WebP, ICO
string
required
The name of the image file including its extension.Requirements:
- Allowed extensions:
.jpg,.jpeg,.png,.gif,.bmp,.webp,.ico <= 255 characters
"my-photo.jpg"boolean
default:"false"
Use sandbox mode to test your integration without consuming credits. Returns mock results.
string
An optional custom string you can attach to the request. It is echoed back unchanged in the response under
developerPayload. Useful for correlating results with your own records.
