# API Documentation ## Base Information **Base URL**: `http://localhost:8005` **API Version**: `2.0.0` **Protocol**: HTTP/HTTPS **Content Type**: `application/json` (default) **Architecture**: Two-tier evidence-first decision system --- ## Table of Contents 1. [Authentication](#authentication) 2. [Health Check](#health-check) 3. [Single Image Analysis](#single-image-analysis) 4. [Batch Image Analysis](#batch-image-analysis) 5. [Batch Progress Tracking](#batch-progress-tracking) 6. [Report Export](#report-export) 7. [Error Handling](#error-handling) 8. [Rate Limits](#rate-limits) 9. [Data Models](#data-models) 10. [Evidence-First Decision Policy](#evidence-first-decision-policy) 11. [Usage Examples](#usage-examples) --- ## Authentication **Current Version**: No authentication required (intended for internal deployment) **Future Versions**: API key authentication planned ```bash # Planned header format Authorization: Bearer ``` --- ## Health Check ### `GET /health` Check if the API server is operational. **Request** ```bash curl -X GET http://localhost:8005/health ``` **Response** (`200 OK`) ```json { "status": "ok", "version": "1.0.0" } ``` --- ## Single Image Analysis ### `POST /analyze/image` Analyze a single image for AI-generation indicators. **Request** ```bash curl -X POST http://localhost:8005/analyze/image \ -F "file=@/path/to/image.jpg" ``` **Parameters** | Name | Type | Required | Description | |------|------|----------|-------------| | `file` | File | Yes | Image file (JPG/PNG/WEBP, max 10MB) | **Response** (`200 OK`) ```json { "success": true, "message": "Image analysis completed", "data": { "filename": "example.jpg", "status": "REVIEW_REQUIRED", "final_decision": "SUSPICIOUS_AI_LIKELY", "decision_explanation": "Strong AI evidence detected in metadata analysis", "overall_score": 0.73, "confidence": 73, "evidence": [ { "source": "exif", "finding": "AI software fingerprint detected in EXIF data", "direction": "ai_generated", "strength": "strong", "confidence": 0.92, "analyzer": "exif_analyzer", "timestamp": "2024-12-19T14:32:15.123456" } ], "signals": [ { "name": "Gradient Field PCA", "metric_type": "gradient", "score": 0.81, "status": "flagged", "explanation": "Detected irregular gradient patterns..." } ], "metric_results": { "gradient": { "metric_type": "gradient", "score": 0.81, "confidence": 0.87, "details": { "eigenvalue_ratio": 0.72, "gradient_vectors_sampled": 10000 } } }, "processing_time": 2.34, "image_size": [1920, 1080], "timestamp": "2024-12-19T14:32:15.123456" }, "timestamp": "2024-12-19T14:32:15.123456" } ``` **Final Decision Values** - `CONFIRMED_AI_GENERATED`: Conclusive evidence of AI generation - `SUSPICIOUS_AI_LIKELY`: Strong evidence or high statistical metrics - `AUTHENTIC_BUT_REVIEW`: Conflicting or weak evidence - `MOSTLY_AUTHENTIC`: Strong authentic evidence **Status Values (Tier-1 only)** - `LIKELY_AUTHENTIC`: Statistical score < 0.65 - `REVIEW_REQUIRED`: Statistical score >= 0.65 **Signal Status Values** - `passed`: Score < 0.40 - `warning`: Score >= 0.40 and < 0.70 - `flagged`: Score >= 0.70 --- ## Batch Image Analysis ### `POST /analyze/batch` Analyze multiple images in a single request with parallel processing. **Request** ```bash curl -X POST http://localhost:8005/analyze/batch \ -F "files=@image1.jpg" \ -F "files=@image2.png" \ -F "files=@image3.webp" ``` **Parameters** | Name | Type | Required | Description | |------|------|----------|-------------| | `files` | File[] | Yes | Multiple image files (max 50 per batch) | **Response** (`200 OK`) ```json { "success": true, "message": "Batch analysis completed", "data": { "batch_id": "550e8400-e29b-41d4-a716-446655440000", "result": { "total_images": 3, "processed": 3, "failed": 0, "results": [ { "filename": "image1.jpg", "status": "REVIEW_REQUIRED", "final_decision": "SUSPICIOUS_AI_LIKELY", "decision_explanation": "Strong evidence detected...", "overall_score": 0.73, "confidence": 73, "evidence": [], "signals": [], "processing_time": 2.1, "image_size": [1920, 1080], "timestamp": "2024-12-19T14:32:15.123456" } ], "summary": { "CONFIRMED_AI_GENERATED": 0, "SUSPICIOUS_AI_LIKELY": 1, "AUTHENTIC_BUT_REVIEW": 1, "MOSTLY_AUTHENTIC": 1, "success_rate": 100, "processed": 3, "failed": 0, "avg_score": 0.510, "avg_confidence": 51, "avg_proc_time": 2.10 }, "total_processing_time": 6.3, "timestamp": "2024-12-19T14:32:19.345678" } }, "timestamp": "2024-12-19T14:32:19.345678" } ``` **Batch Constraints** - Maximum images per batch: **50** - Maximum file size per image: **10 MB** - Timeout per image: **30 seconds** - Total batch timeout: **15 minutes** --- ## Batch Progress Tracking ### `GET /batch/{batch_id}/progress` Track the progress of a batch analysis job. **Request** ```bash curl -X GET http://localhost:8005/batch/550e8400-e29b-41d4-a716-446655440000/progress ``` **Response - Processing** (`200 OK`) ```json { "status": "processing", "progress": { "current": 7, "total": 10, "filename": "image_007.jpg" } } ``` **Response - Completed** (`200 OK`) ```json { "status": "completed", "progress": { "current": 10, "total": 10, "filename": "image_010.jpg" }, "result": { "total_images": 10, "processed": 10, "failed": 0, "results": [], "summary": {}, "total_processing_time": 21.4, "timestamp": "2024-12-19T14:35:22.123456" } } ``` **Response - Failed** (`200 OK`) ```json { "status": "failed", "error": "Processing timeout exceeded" } ``` **Status Values** - `processing`: Batch is currently being analyzed - `completed`: All images processed successfully - `failed`: Batch processing encountered fatal error - `interrupted`: Processing was manually stopped --- ## Report Export ### CSV Export #### `GET /report/csv/{batch_id}` or `POST /report/csv/{batch_id}` Download detailed batch analysis as CSV file. **Request** ```bash curl -X GET http://localhost:8005/report/csv/550e8400-e29b-41d4-a716-446655440000 \ -o report.csv ``` **Response** - Content-Type: `text/csv` - File download with comprehensive analysis data - Includes: per-image results, metric breakdowns, forensic details **CSV Structure** ```text BATCH DECISION STATISTICS Total Images,10 Processed,10 Failed,0 CONFIRMED_AI_GENERATED,2 SUSPICIOUS_AI_LIKELY,3 AUTHENTIC_BUT_REVIEW,3 MOSTLY_AUTHENTIC,2 ANALYSIS RESULTS Filename,Final Decision,Decision Confidence (%),Overall Score,Decision Explanation,Processing Time (s) image1.jpg,SUSPICIOUS_AI_LIKELY,73,0.73,Strong evidence detected...,2.1 IMAGE 1 DETAILED ANALYSIS FINAL DECISION Decision,SUSPICIOUS_AI_LIKELY Confidence,73% Explanation,Strong evidence detected... EVIDENCE SUMMARY Source,Direction,Strength,Confidence,Finding exif,ai_generated,strong,0.92,AI software fingerprint detected ``` --- ## Error Handling ### Error Response Format All errors return a standardized JSON structure: ```json { "success": false, "message": "Error description", "error": "Detailed error message", "timestamp": "2024-12-19T14:32:15.123456" } ``` ### HTTP Status Codes | Code | Meaning | Description | |------|---------|-------------| | `200` | OK | Request successful | | `400` | Bad Request | Invalid input (file format, size, etc.) | | `404` | Not Found | Batch ID not found | | `413` | Payload Too Large | File size exceeds 10MB | | `422` | Unprocessable Entity | Validation error | | `499` | Client Closed Request | Processing interrupted | | `500` | Internal Server Error | Server-side processing error | ### Common Error Scenarios **File Too Large** ```json { "success": false, "message": "Validation error", "error": "File size 12582912 bytes exceeds maximum 10485760 bytes", "timestamp": "2024-12-19T14:32:15.123456" } ``` **Unsupported Format** ```json { "success": false, "message": "Validation error", "error": "File extension .gif not allowed. Allowed: .jpg, .jpeg, .png, .webp", "timestamp": "2024-12-19T14:32:15.123456" } ``` **Batch Not Found** ```json { "success": false, "message": "Batch not found", "error": null, "timestamp": "2024-12-19T14:32:15.123456" } ``` **Processing Timeout** ```json { "success": false, "message": "Processing timeout", "error": "Image analysis exceeded 30 second timeout", "timestamp": "2024-12-19T14:32:45.123456" } ``` --- ## Rate Limits **Current Version**: No rate limiting implemented **Recommended Production Limits**: - Single image analysis: **60 requests/minute per IP** - Batch analysis: **10 requests/minute per IP** - Report downloads: **30 requests/minute per IP** --- ## Data Models ### APIResponse ```typescript { success: boolean, message: string, data: object | null, error: string | null, timestamp: string } ``` ### AnalysisResult ```typescript { filename: string, status: "LIKELY_AUTHENTIC" | "REVIEW_REQUIRED", final_decision: "CONFIRMED_AI_GENERATED" | "SUSPICIOUS_AI_LIKELY" | "AUTHENTIC_BUT_REVIEW" | "MOSTLY_AUTHENTIC" | null, decision_explanation: string | null, overall_score: number, // 0.0 - 1.0 confidence: number, // 0 - 100 signals: DetectionSignal[], evidence: EvidenceResult[], metric_results: { [key: string]: MetricResult }, processing_time: number, // seconds image_size: [number, number], timestamp: string } ``` ### EvidenceResult ```typescript { source: "exif" | "watermark", finding: string, direction: "ai_generated" | "authentic" | "indeterminate", strength: "weak" | "moderate" | "strong" | "conclusive", confidence: number | null, // 0.0 - 1.0 details: object, analyzer: string, timestamp: string } ``` ### DetectionSignal ```typescript { name: string, metric_type: "gradient" | "frequency" | "noise" | "texture" | "color", score: number, // 0.0 - 1.0 status: "passed" | "warning" | "flagged", explanation: string } ``` ### MetricResult ```typescript { metric_type: "gradient" | "frequency" | "noise" | "texture" | "color", score: number, // 0.0 - 1.0 confidence: number, // 0.0 - 1.0 details: object // Metric-specific forensic data } ``` ### BatchAnalysisResult ```typescript { total_images: number, processed: number, failed: number, results: AnalysisResult[], summary: { CONFIRMED_AI_GENERATED: number, SUSPICIOUS_AI_LIKELY: number, AUTHENTIC_BUT_REVIEW: number, MOSTLY_AUTHENTIC: number, success_rate: number, processed: number, failed: number, avg_score: number, avg_confidence: number, avg_proc_time: number }, total_processing_time: number, timestamp: string } ``` --- ## Evidence-First Decision Policy ### Decision Hierarchy - Conclusive Evidence → CONFIRMED_AI_GENERATED - Strong AI Evidence → SUSPICIOUS_AI_LIKELY - Strong Authentic Evidence → MOSTLY_AUTHENTIC - Conflicting/Weak Evidence → AUTHENTIC_BUT_REVIEW - No Evidence → Fallback to statistical metrics ### Evidence Strength Definitions - CONCLUSIVE: Cryptographic proof, signed metadata - STRONG: Clear AI fingerprints, consistent patterns - MODERATE: Suggestive indicators, plausible patterns - WEAK: Heuristic hints, non-binding observations --- ## Usage Examples ### Python ```python import requests # Single image analysis with open('image.jpg', 'rb') as f: response = requests.post( 'http://localhost:8005/analyze/image', files={'file': f} ) result = response.json() print(f"Final Decision: {result['data']['final_decision']}") # Batch analysis files = [ ('files', open('img1.jpg', 'rb')), ('files', open('img2.png', 'rb')) ] response = requests.post( 'http://localhost:8005/analyze/batch', files=files ) batch_result = response.json() batch_id = batch_result['data']['batch_id'] # Check progress progress = requests.get(f'http://localhost:8005/batch/{batch_id}/progress').json() # Download CSV report csv_response = requests.get(f'http://localhost:8005/report/csv/{batch_id}') with open('report.csv', 'wb') as f: f.write(csv_response.content) ``` ### JavaScript (Node.js) ```javascript const FormData = require('form-data'); const fs = require('fs'); const axios = require('axios'); // Single image analysis const form = new FormData(); form.append('file', fs.createReadStream('image.jpg')); axios.post('http://localhost:8005/analyze/image', form, { headers: form.getHeaders() }) .then(response => { console.log('Final Decision:', response.data.data.final_decision); console.log('Evidence found:', response.data.data.evidence.length); }); // Batch progress tracking async function trackProgress(batchId) { const response = await axios.get(`http://localhost:8005/batch/${batchId}/progress`); console.log(`Progress: ${response.data.progress.current}/${response.data.progress.total}`); if (response.data.status === 'processing') { setTimeout(() => trackProgress(batchId), 1000); } else if (response.data.status === 'completed') { console.log('Batch completed!'); } } ``` ### cURL ```bash # Single image curl -X POST http://localhost:8005/analyze/image \ -F "file=@image.jpg" \ | jq '.data.final_decision, .data.evidence[].finding' # Batch analysis curl -X POST http://localhost:8005/analyze/batch \ -F "files=@img1.jpg" \ -F "files=@img2.png" \ | jq '.data.batch_id' # Progress tracking curl -X GET http://localhost:8005/batch/{batch_id}/progress \ | jq '.status, .progress' # CSV report curl -X GET http://localhost:8005/report/csv/{batch_id} -o report.csv ``` --- ## Changelog ### Version 1.0.0 (Current) - Two-tier evidence-first architecture - Four-class final decisions - EXIF and watermark evidence analysis - Decision policy engine - Enhanced reporting with evidence ### Planned Features - C2PA provenance analyzer - API key authentication - Webhook callbacks - Custom threshold configuration - Real-time streaming API --- *API Documentation Version: 1.0* *Last Updated: December 2025* *Author: Satyaki Mitra*