Spaces:
Running
Running
| # API Documentation | |
| ## Base Information | |
| **Base URL**: `http://localhost:8005` | |
| **API Version**: `1.0.0` | |
| **Protocol**: HTTP/HTTPS | |
| **Content Type**: `application/json` (default) | |
| --- | |
| ## 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) | |
| --- | |
| ## Authentication | |
| **Current Version**: No authentication required (intended for internal deployment) | |
| **Future Versions**: API key authentication planned | |
| ```bash | |
| # Planned header format | |
| Authorization: Bearer <api_key> | |
| ``` | |
| --- | |
| ## 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", | |
| "overall_score": 0.73, | |
| "confidence": 73, | |
| "signals": [ | |
| { | |
| "name": "Gradient Field PCA", | |
| "metric_type": "gradient", | |
| "score": 0.81, | |
| "status": "flagged", | |
| "explanation": "Detected irregular gradient patterns typical of diffusion models. Natural photos show consistent lighting gradients shaped by physics." | |
| }, | |
| { | |
| "name": "Frequency Analysis", | |
| "metric_type": "frequency", | |
| "score": 0.68, | |
| "status": "warning", | |
| "explanation": "Frequency patterns show some irregularities. Requires further review." | |
| }, | |
| { | |
| "name": "Noise Analysis", | |
| "metric_type": "noise", | |
| "score": 0.72, | |
| "status": "flagged", | |
| "explanation": "Noise pattern is unnaturally uniform. Real camera sensors produce characteristic noise patterns." | |
| }, | |
| { | |
| "name": "Texture Analysis", | |
| "metric_type": "texture", | |
| "score": 0.65, | |
| "status": "warning", | |
| "explanation": "Some texture regions appear overly uniform. Further analysis recommended." | |
| }, | |
| { | |
| "name": "Color Analysis", | |
| "metric_type": "color", | |
| "score": 0.54, | |
| "status": "warning", | |
| "explanation": "Some color histogram irregularities detected." | |
| } | |
| ], | |
| "metric_results": { | |
| "gradient": { | |
| "metric_type": "gradient", | |
| "score": 0.81, | |
| "confidence": 0.87, | |
| "details": { | |
| "eigenvalue_ratio": 0.72, | |
| "gradient_vectors_sampled": 10000, | |
| "threshold": 0.85 | |
| } | |
| }, | |
| "frequency": { | |
| "metric_type": "frequency", | |
| "score": 0.68, | |
| "confidence": 0.65, | |
| "details": { | |
| "hf_ratio": 0.38, | |
| "hf_anomaly": 0.45, | |
| "roughness": 0.032, | |
| "spectral_deviation": 0.21 | |
| } | |
| }, | |
| "noise": { | |
| "metric_type": "noise", | |
| "score": 0.72, | |
| "confidence": 0.78, | |
| "details": { | |
| "mean_noise": 1.12, | |
| "cv": 0.18, | |
| "patches_valid": 42, | |
| "patches_total": 100 | |
| } | |
| }, | |
| "texture": { | |
| "metric_type": "texture", | |
| "score": 0.65, | |
| "confidence": 0.71, | |
| "details": { | |
| "smooth_ratio": 0.45, | |
| "contrast_mean": 18.3, | |
| "entropy_mean": 4.2, | |
| "patches_used": 50 | |
| } | |
| }, | |
| "color": { | |
| "metric_type": "color", | |
| "score": 0.54, | |
| "confidence": 0.58, | |
| "details": { | |
| "saturation_stats": { | |
| "mean_saturation": 0.68, | |
| "high_sat_ratio": 0.23, | |
| "very_high_sat_ratio": 0.06 | |
| }, | |
| "histogram_stats": { | |
| "roughness_mean": 0.021, | |
| "channels_analyzed": 3 | |
| }, | |
| "hue_stats": { | |
| "top3_concentration": 0.58, | |
| "gap_ratio": 0.32 | |
| } | |
| } | |
| } | |
| }, | |
| "processing_time": 2.34, | |
| "image_size": [1920, 1080], | |
| "timestamp": "2024-12-19T14:32:15.123456" | |
| }, | |
| "timestamp": "2024-12-19T14:32:15.123456" | |
| } | |
| ``` | |
| **Status Values** | |
| - `LIKELY_AUTHENTIC`: Score < 0.65 (default threshold) | |
| - `REVIEW_REQUIRED`: 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", | |
| "overall_score": 0.73, | |
| "confidence": 73, | |
| "signals": [...], | |
| "metric_results": {...}, | |
| "processing_time": 2.1, | |
| "image_size": [1920, 1080], | |
| "timestamp": "2024-12-19T14:32:15.123456" | |
| }, | |
| { | |
| "filename": "image2.png", | |
| "status": "LIKELY_AUTHENTIC", | |
| "overall_score": 0.42, | |
| "confidence": 42, | |
| "signals": [...], | |
| "metric_results": {...}, | |
| "processing_time": 2.3, | |
| "image_size": [2048, 1536], | |
| "timestamp": "2024-12-19T14:32:17.234567" | |
| }, | |
| { | |
| "filename": "image3.webp", | |
| "status": "LIKELY_AUTHENTIC", | |
| "overall_score": 0.38, | |
| "confidence": 38, | |
| "signals": [...], | |
| "metric_results": {...}, | |
| "processing_time": 1.9, | |
| "image_size": [1024, 768], | |
| "timestamp": "2024-12-19T14:32:19.345678" | |
| } | |
| ], | |
| "summary": { | |
| "likely_authentic": 2, | |
| "review_required": 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** | |
| ``` | |
| BATCH STATISTICS | |
| Total Images,10 | |
| Successfully Processed,10 | |
| Failed,0 | |
| ... | |
| ANALYSIS RESULTS | |
| Filename,Status,Overall Score,Confidence,Processing Time | |
| image1.jpg,REVIEW_REQUIRED,0.73,73,2.1 | |
| image2.png,LIKELY_AUTHENTIC,0.42,42,2.3 | |
| ... | |
| IMAGE 1 DETAILED ANALYSIS | |
| Metric Name,Score,Status,Explanation | |
| Gradient Field PCA,0.81,flagged,Detected irregular gradient patterns... | |
| ... | |
| ``` | |
| --- | |
| ### PDF Export | |
| #### `GET /report/pdf/{batch_id}` or `POST /report/pdf/{batch_id}` | |
| Download detailed batch analysis as PDF report. | |
| **Request** | |
| ```bash | |
| curl -X GET http://localhost:8005/report/pdf/550e8400-e29b-41d4-a716-446655440000 \ | |
| -o report.pdf | |
| ``` | |
| **Response** | |
| - Content-Type: `application/pdf` | |
| - Professional formatted report with: | |
| - Executive summary | |
| - Per-image analysis sections | |
| - Visual metric breakdowns | |
| - Forensic details | |
| - Recommendations | |
| --- | |
| ## 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 | |
| ### 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 | |
| } | |
| ``` | |
| ### DetectionSignal | |
| ```typescript | |
| { | |
| name: string, | |
| metric_type: "gradient" | "frequency" | "noise" | "texture" | "color", | |
| score: number, // 0.0 - 1.0 | |
| status: "passed" | "warning" | "flagged", | |
| explanation: string | |
| } | |
| ``` | |
| ### AnalysisResult | |
| ```typescript | |
| { | |
| filename: string, | |
| status: "LIKELY_AUTHENTIC" | "REVIEW_REQUIRED", | |
| overall_score: number, // 0.0 - 1.0 | |
| confidence: number, // 0 - 100 | |
| signals: DetectionSignal[], | |
| metric_results: { | |
| [key: string]: MetricResult | |
| }, | |
| processing_time: number, // seconds | |
| image_size: [number, number], | |
| timestamp: string // ISO 8601 format | |
| } | |
| ``` | |
| ### BatchAnalysisResult | |
| ```typescript | |
| { | |
| total_images: number, | |
| processed: number, | |
| failed: number, | |
| results: AnalysisResult[], | |
| summary: { | |
| likely_authentic: number, | |
| review_required: number, | |
| success_rate: number, // percentage | |
| processed: number, | |
| failed: number, | |
| avg_score: number, | |
| avg_confidence: number, | |
| avg_proc_time: number | |
| }, | |
| total_processing_time: number, | |
| timestamp: string | |
| } | |
| ``` | |
| --- | |
| ## 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"Status: {result['data']['status']}") | |
| print(f"Score: {result['data']['overall_score']}") | |
| # Batch analysis | |
| files = [ | |
| ('files', open('img1.jpg', 'rb')), | |
| ('files', open('img2.png', 'rb')), | |
| ('files', open('img3.webp', 'rb')) | |
| ] | |
| response = requests.post( | |
| 'http://localhost:8005/analyze/batch', | |
| files=files | |
| ) | |
| batch_result = response.json() | |
| batch_id = batch_result['data']['batch_id'] | |
| # 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('Status:', response.data.data.status); | |
| console.log('Score:', response.data.data.overall_score); | |
| }) | |
| .catch(error => { | |
| console.error('Error:', error.response.data); | |
| }); | |
| // Batch analysis | |
| const batchForm = new FormData(); | |
| batchForm.append('files', fs.createReadStream('img1.jpg')); | |
| batchForm.append('files', fs.createReadStream('img2.png')); | |
| axios.post('http://localhost:8005/analyze/batch', batchForm, { | |
| headers: batchForm.getHeaders() | |
| }) | |
| .then(response => { | |
| const batchId = response.data.data.batch_id; | |
| console.log('Batch ID:', batchId); | |
| // Download PDF report | |
| return axios.get(`http://localhost:8005/report/pdf/${batchId}`, { | |
| responseType: 'arraybuffer' | |
| }); | |
| }) | |
| .then(pdfResponse => { | |
| fs.writeFileSync('report.pdf', pdfResponse.data); | |
| console.log('Report downloaded'); | |
| }); | |
| ``` | |
| ### cURL | |
| ```bash | |
| # Single image | |
| curl -X POST http://localhost:8005/analyze/image \ | |
| -F "file=@image.jpg" \ | |
| | jq '.data.status, .data.overall_score' | |
| # Batch processing | |
| curl -X POST http://localhost:8005/analyze/batch \ | |
| -F "files=@img1.jpg" \ | |
| -F "files=@img2.png" \ | |
| -F "files=@img3.webp" \ | |
| | jq '.data.batch_id' | |
| # Progress tracking | |
| curl -X GET http://localhost:8005/batch/{batch_id}/progress | |
| # Download reports | |
| curl -X GET http://localhost:8005/report/csv/{batch_id} -o report.csv | |
| curl -X GET http://localhost:8005/report/pdf/{batch_id} -o report.pdf | |
| ``` | |
| --- | |
| ## Changelog | |
| ### Version 1.0.0 (Current) | |
| - Initial API release | |
| - Single and batch image analysis | |
| - CSV, JSON, PDF export | |
| - Progress tracking | |
| - Multi-metric ensemble detection | |
| ### Planned Features | |
| - API key authentication | |
| - Webhook callbacks for async processing | |
| - Custom threshold configuration per request | |
| - Historical analysis lookup | |
| - Metrics-only API endpoints | |
| --- | |
| *API Documentation Version: 1.0* | |
| *Last Updated: December 2025* |