| # API Specification |
|
|
| REST API exposed by the VisionSeq backend. Interactive Swagger documentation is auto-generated at `/docs` on any running instance. |
|
|
| **Live instance:** [huggingface.co/spaces/Hardik-25/VisionSeq](https://huggingface.co/spaces/Hardik-25/VisionSeq) |
|
|
| --- |
|
|
| ## Base Path |
|
|
| All routes are prefixed with: |
|
|
| ``` |
| /api/v1 |
| ``` |
|
|
| ## Authentication |
|
|
| None. All endpoints are public and protected only by rate limiting (see [HARDENING.md](HARDENING.md)). If deploying beyond a portfolio/demo context, place this API behind an auth layer or API gateway. |
|
|
| --- |
|
|
| ## Endpoints |
|
|
| ### `GET /` |
|
|
| Root endpoint. Returns a welcome message and links to further documentation. |
|
|
| **Response `200 OK`** |
| ```json |
| { |
| "message": "Welcome to CAPTCHA OCR API", |
| "docs_url": "/docs", |
| "health_check": "/api/v1/health" |
| } |
| ``` |
|
|
| --- |
|
|
| ### `GET /api/v1/health` |
|
|
| Liveness/readiness probe. Reports model status, hardware capabilities, and service uptime — suitable for Kubernetes/cloud health checks. |
|
|
| **Response `200 OK`** |
| ```json |
| { |
| "status": "ok", |
| "version": "1.0.0", |
| "device": "cuda", |
| "cuda_available": true, |
| "cuda_device_name": "NVIDIA GeForce RTX 4090", |
| "model_ready": true, |
| "model_version": "1.0", |
| "uptime": "145.20s", |
| "requests_served": 12 |
| } |
| ``` |
|
|
| **Errors** |
|
|
| | Status | Cause | |
| |---|---| |
| | `503 Service Unavailable` | Model is not ready or failed to load | |
|
|
| --- |
|
|
| ### `GET /api/v1/model-info` |
|
|
| Returns metadata describing the loaded model. |
|
|
| **Response `200 OK`** |
| ```json |
| { |
| "version": "1.0.0", |
| "parameters": "11.2M", |
| "architecture": "ResNet-18", |
| "input_shape": [1, 1, 100, 200], |
| "output_shape": [1, 6, 31] |
| } |
| ``` |
|
|
| --- |
|
|
| ### `POST /api/v1/predict` |
|
|
| Predicts the character sequence for a single CAPTCHA image. |
|
|
| **Headers** |
| ``` |
| Content-Type: multipart/form-data |
| ``` |
|
|
| **Body** |
|
|
| | Field | Type | Constraints | |
| |---|---|---| |
| | `file` | binary | `image/png` or `image/jpeg`, max **5MB** | |
|
|
| **Response `200 OK`** |
| ```json |
| { |
| "request_id": "c092e7dc-0740-4c8d-9ed5-f9aeab5f3b39", |
| "prediction": "7DUP98", |
| "confidence": 87.47, |
| "char_confs": [84.63, 89.46, 77.37, 88.03, 94.42, 90.89], |
| "processing_ms": 172.59 |
| } |
| ``` |
|
|
| **Errors** |
|
|
| | Status | Cause | |
| |---|---| |
| | `400 Bad Request` | File is not a valid image | |
| | `413 Payload Too Large` | File exceeds the 5MB limit | |
| | `429 Too Many Requests` | Rate limit exceeded | |
|
|
| --- |
|
|
| ### `POST /api/v1/predict/batch` |
|
|
| Predicts character sequences for up to 5 CAPTCHA images in a single batched run. |
|
|
| **Headers** |
| ``` |
| Content-Type: multipart/form-data |
| ``` |
|
|
| **Body** |
|
|
| | Field | Type | Constraints | |
| |---|---|---| |
| | `files` | binary[] | up to **5** images, each ≤ **5MB** | |
|
|
| **Response `200 OK`** |
| ```json |
| { |
| "request_id": "c092e7dc-0740-4c8d-9ed5-f9aeab5f3b39", |
| "predictions": [ |
| { |
| "request_id": "c092e7dc-0740-4c8d-9ed5-f9aeab5f3b39", |
| "prediction": "7DUP98", |
| "confidence": 87.47, |
| "char_confs": [84.63, 89.46, 77.37, 88.03, 94.42, 90.89], |
| "processing_ms": 34.51 |
| } |
| ], |
| "total_processing_ms": 172.59 |
| } |
| ``` |
|
|
| **Errors** |
|
|
| | Status | Cause | |
| |---|---| |
| | `400 Bad Request` | Missing files, or an invalid image format present | |
| | `413 Payload Too Large` | More than 5 files, or a file exceeds the size limit | |
| | `429 Too Many Requests` | Rate limit exceeded | |
|
|
| --- |
|
|
| ## Response Field Reference |
|
|
| | Field | Type | Description | |
| |---|---|---| |
| | `request_id` | string (UUID) | Unique identifier for tracing this request through logs | |
| | `prediction` | string | Decoded 6-character sequence | |
| | `confidence` | float | Overall confidence (%), averaged across the 6 positions | |
| | `char_confs` | float[6] | Per-position confidence (%), in sequence order | |
| | `processing_ms` | float | Server-side processing time, from validated upload to decoded output | |
|
|
| ## Rate Limiting |
|
|
| Requests are limited per-IP via a token-bucket algorithm: **2 requests/second**, burst capacity of **5**. Exceeding this returns `429 Too Many Requests`. See [HARDENING.md](HARDENING.md#4-rate-limiting) for implementation details. |
|
|
| ## Related Documentation |
|
|
| - [Architecture](ARCHITECTURE.md) — how requests flow through the system |
| - [Hardening Notes](HARDENING.md) — validation, limits, and defensive measures behind these endpoints |
|
|