# API Request Examples for `/submit` Endpoint This document provides working examples for the `/submit` endpoint that accepts multipart/form-data. ## Endpoint Details - **URL**: `POST /submit` - **Content-Type**: `multipart/form-data` - **Required fields**: `report_id`, `description` - **Optional fields**: `user_id`, `latitude`, `longitude`, `image` ## Example 1: Basic Request (No Image) ### cURL ```bash curl -X POST "http://localhost:8000/submit" \ -F "report_id=test-123" \ -F "description=Pothole on Main Street near the intersection with Oak Avenue. It's quite large and dangerous for vehicles." ``` ### Python (requests) ```python import requests url = "http://localhost:8000/submit" data = { "report_id": "test-123", "description": "Pothole on Main Street near the intersection with Oak Avenue. It's quite large and dangerous for vehicles." } response = requests.post(url, data=data) print(response.status_code) print(response.json()) ``` ## Example 2: Request with All Optional Fields (No Image) ### cURL ```bash curl -X POST "http://localhost:8000/submit" \ -F "report_id=test-456" \ -F "description=Overflowing garbage bin on Park Avenue causing bad smell" \ -F "user_id=user-789" \ -F "latitude=37.7749" \ -F "longitude=-122.4194" ``` ### Python (requests) ```python import requests url = "http://localhost:8000/submit" data = { "report_id": "test-456", "description": "Overflowing garbage bin on Park Avenue causing bad smell", "user_id": "user-789", "latitude": "37.7749", "longitude": "-122.4194" } response = requests.post(url, data=data) print(response.status_code) print(response.json()) ``` ## Example 3: Request with Image File ### cURL ```bash curl -X POST "http://localhost:8000/submit" \ -F "report_id=test-789" \ -F "description=Damaged streetlight on Elm Street not working at night" \ -F "user_id=user-123" \ -F "latitude=40.7128" \ -F "longitude=-74.0060" \ -F "image=@/path/to/your/image.jpg" ``` ### Python (requests) ```python import requests url = "http://localhost:8000/submit" # Prepare form data data = { "report_id": "test-789", "description": "Damaged streetlight on Elm Street not working at night", "user_id": "user-123", "latitude": "40.7128", "longitude": "-74.0060" } # Add image file files = { "image": ("image.jpg", open("/path/to/your/image.jpg", "rb"), "image/jpeg") } response = requests.post(url, data=data, files=files) print(response.status_code) print(response.json()) # Don't forget to close the file files["image"][1].close() ``` ### Python (with context manager) ```python import requests url = "http://localhost:8000/submit" data = { "report_id": "test-789", "description": "Damaged streetlight on Elm Street not working at night", "user_id": "user-123", "latitude": "40.7128", "longitude": "-74.0060" } # Using context manager for automatic file handling with open("/path/to/your/image.jpg", "rb") as img_file: files = { "image": ("image.jpg", img_file, "image/jpeg") } response = requests.post(url, data=data, files=files) print(response.status_code) print(response.json()) ``` ## Example 4: Request with Image Only (Minimal Fields) ### cURL ```bash curl -X POST "http://localhost:8000/submit" \ -F "report_id=test-999" \ -F "description=Broken traffic signal at downtown intersection" \ -F "image=@/path/to/your/image.png" ``` ### Python (requests) ```python import requests url = "http://localhost:8000/submit" data = { "report_id": "test-999", "description": "Broken traffic signal at downtown intersection" } with open("/path/to/your/image.png", "rb") as img_file: files = {"image": ("image.png", img_file, "image/png")} response = requests.post(url, data=data, files=files) print(response.status_code) print(response.json()) ``` ## Example 5: Using FastAPI Test Client (for testing) ```python from fastapi.testclient import TestClient from app.main import app client = TestClient(app) # Test without image response = client.post( "/submit", data={ "report_id": "test-001", "description": "Waterlogging in residential area after heavy rain" } ) print(response.status_code) print(response.json()) # Test with image with open("/path/to/your/image.jpg", "rb") as img_file: response = client.post( "/submit", data={ "report_id": "test-002", "description": "Pothole on highway", "latitude": "40.7128", "longitude": "-74.0060" }, files={"image": ("image.jpg", img_file, "image/jpeg")} ) print(response.status_code) print(response.json()) ``` ## Expected Response Format ### Success Response ```json { "report_id": "test-123", "accept": true, "status": "accepted", "category": "Road & Traffic", "confidence": 0.85, "urgency": "medium", "reason": "Report accepted successfully" } ``` ### Rejection Response ```json { "report_id": "test-123", "accept": false, "status": "rejected", "category": "Other", "confidence": 0.15, "reason": "Unable to determine issue category. Please provide more details." } ``` ## Error Responses ### 422 Validation Error Examples ```json { "detail": "Validation error: 'report_id' is required and cannot be empty" } ``` ```json { "detail": "Validation error: 'latitude' must be between -90 and 90, got 95.5" } ``` ```json { "detail": "Validation error: Image file too large. Maximum size is 10.0MB, got 15.5MB" } ``` ## Notes 1. **Content-Type**: Do NOT manually set `Content-Type: multipart/form-data` header. The HTTP client/library will automatically set it with the correct boundary. 2. **Image Formats**: Supported image formats include JPEG, JPG, PNG, GIF, and WebP. 3. **Image Size Limit**: Maximum image size is 10MB. 4. **Latitude/Longitude**: - Must be valid numbers (strings that can be converted to float) - Latitude: -90 to 90 - Longitude: -180 to 180 5. **Required Fields**: - `report_id`: Cannot be empty - `description`: Cannot be empty 6. **Base URL**: Replace `http://localhost:8000` with your actual API base URL (e.g., `https://your-api.render.com` for production).