CamScanner Image Detect AIGC
Overview
CamScanner provides an AIGC-detection engine that determines whether an image was produced by an AI generator. The workflow is a 2-step pipeline: upload the image, then validate it with validate_mode: 2. Unlike conversion skills, this skill does not produce a file — the validate step returns a JSON result whose key fields (ai_check_result, confidence, result_text) should be reported back to the user directly.
When to Use
- User asks whether an image was generated by AI (Stable Diffusion, Midjourney, DALL·E, etc.)
- User wants to distinguish a real photo from AI-generated artwork
- User asks "is this AI art / AI-generated?" or similar authenticity questions
- User shares an image and explicitly asks whether it came from a generative model
Presenting the Result
- Always read
ai_check_result,confidence, andresult_textfrom the response and report them in plain language. - Map
ai_check_resultto a verdict:1= not AI-generated,2= suspected AI-generated,3= AI-generated. - Include the
confidencevalue (a float in[0, 1]) so the user understands how certain the verdict is. - Match the user's language.
result_textis returned in Chinese by the API. If the user asked in English (or any other language), translate/rephrase it into that language. If the user asked in Chinese, you can useresult_textas-is. - Do not overstate the verdict: "suspected AI-generated" is not the same as "AI-generated".
Privacy & Data
Important: Privacy & Data Flow Notice
- Third-party service: This skill sends your files to CamScanner's official servers (
ai-tools.camscanner.com) for processing.- Data retention: CamScanner servers process your files in real-time. Files are not permanently stored on the server.
- Result: Only a JSON detection result is returned — no file is downloaded.
API Reference
Base URL: https://ai-tools.camscanner.com
Supported Validations
| source_type | validate_mode | Detection | Engine |
|---|---|---|---|
| image | 2 | AIGC (AI-generated) | aigcdetection |
Step 1: Upload Image
BASE="https://ai-tools.camscanner.com"
IN_FILE_ID=$(curl -sS -X POST "$BASE/v1/tools/upload_file/execute" \
-H "Content-Type: application/octet-stream" \
--data-binary "@/path/to/image.jpg" | jq -r '.tool_result.data.file_id')
Response:
{
"code": 200,
"tool": "upload_file",
"tool_result": {
"success": true,
"data": {
"file_id": "file_1741857600_ab12cd34ef56.jpg",
"size": 24576
}
}
}
Step 2: Validate Image (Detect AIGC)
curl -sS -X POST "$BASE/v1/tools/validate_image/execute" \
-H "Content-Type: application/json" \
-d "{\"file_id\":\"$IN_FILE_ID\",\"validate_mode\":2}"
Response (suspected AI-generated example):
{
"code": 200,
"tool": "validate_image",
"tool_result": {
"success": true,
"data": {
"ai_check_result": 2,
"confidence": 0.346435546875,
"engine": "aigcdetection",
"file_id": "file_xxx.jpg",
"result_text": "检测结果为疑似 AI 生成图片",
"review_state": "auto_checked",
"validate_mode": 2
},
"metadata": {
"ai_check_result": 2,
"confidence": 0.346435546875,
"engine": "aigcdetection",
"result_text": "检测结果为疑似 AI 生成图片",
"review_state": "auto_checked",
"validate_mode": 2
}
}
}
Interpreting the Result
| Field | Type | Meaning |
|---|---|---|
ai_check_result | integer | 1 = not AI-generated, 2 = suspected AI-generated, 3 = AI-generated |
confidence | float | Model confidence score in [0, 1] |
result_text | string | Human-readable conclusion (Chinese by default — translate for other languages) |
review_state | string | Review status (e.g. auto_checked) — informational, not user-facing |
validate_mode | integer | Echo of the requested mode (always 2 for AIGC detection) |
Verdict Mapping
ai_check_result | Verdict | Suggested phrasing (EN) |
|---|---|---|
| 1 | Not AI-generated | "Looks like a real image" |
| 2 | Suspected AI-generated | "Suspected to be AI-generated" |
| 3 | AI-generated | "Detected as AI-generated" |
Quick Reference: Complete Pipeline
Detect whether an image is AI-generated (two-step, reads JSON result):
BASE="https://ai-tools.camscanner.com"
INPUT_IMAGE="/path/to/image.jpg"
# Upload
IN_FILE_ID=$(curl -sS -X POST "$BASE/v1/tools/upload_file/execute" \
-H "Content-Type: application/octet-stream" \
--data-binary "@$INPUT_IMAGE" | jq -r '.tool_result.data.file_id')
# Validate and extract key fields
RESULT=$(curl -sS -X POST "$BASE/v1/tools/validate_image/execute" \
-H "Content-Type: application/json" \
-d "{\"file_id\":\"$IN_FILE_ID\",\"validate_mode\":2}")
AI_CHECK=$(echo "$RESULT" | jq -r '.tool_result.data.ai_check_result')
CONFIDENCE=$(echo "$RESULT" | jq -r '.tool_result.data.confidence')
RESULT_TEXT=$(echo "$RESULT" | jq -r '.tool_result.data.result_text')
echo "ai_check_result: $AI_CHECK"
echo "confidence: $CONFIDENCE"
echo "result_text: $RESULT_TEXT"
Common Mistakes
| Mistake | Fix |
|---|---|
| Wrong Content-Type on upload | Upload uses application/octet-stream, not multipart/form-data |
| Using GET instead of POST | Both endpoints use POST |
Passing validate_mode as a string | validate_mode is an integer — use 2, not "2" |
Including output_mode in the request | validate_image does not use output_mode; it always returns JSON |
Treating ai_check_result as boolean | It is a 3-state integer (1/2/3); map explicitly to a verdict |
| Reporting "suspected" as "AI-generated" | ai_check_result == 2 means suspected, not confirmed — phrase accordingly |
Reporting result_text verbatim in EN | result_text is Chinese; translate to match the user's language |
Error Handling
Check each step before proceeding:
# After upload
if [ -z "$IN_FILE_ID" ] || [ "$IN_FILE_ID" = "null" ]; then
echo "Upload failed"; exit 1
fi
# After validate
if [ "$AI_CHECK" = "null" ] || [ -z "$AI_CHECK" ]; then
echo "Validation failed"; exit 1
fi