hasari-api / services /backend /openapi.json
erdoganpeker's picture
v0.3.0 — multimodal vehicle damage MVP
e327f0d
{
"openapi": "3.1.0",
"info": {
"title": "Arac Hasar Tespit API",
"description": "Arac hasar tespiti, parca segmentasyonu, siddet ve maliyet tahmini. Web (Next.js), Mobile (Expo/React Native) ve Desktop (Tauri) icin ortak REST + WebSocket API.",
"contact": {
"name": "arac-hasar-v2",
"email": "weblineet@gmail.com"
},
"version": "0.3.0"
},
"paths": {
"/auth/register": {
"post": {
"tags": [
"auth"
],
"summary": "Yeni kullanici kaydi",
"operationId": "register_auth_register_post",
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/UserRegisterRequest"
}
}
},
"required": true
},
"responses": {
"201": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/TokenPair"
}
}
}
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
}
}
}
}
},
"/auth/login": {
"post": {
"tags": [
"auth"
],
"summary": "Email + parola ile giris",
"operationId": "login_auth_login_post",
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/UserLoginRequest"
}
}
},
"required": true
},
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/TokenPair"
}
}
}
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
}
}
}
}
},
"/auth/me": {
"get": {
"tags": [
"auth"
],
"summary": "Oturum acmis kullanici bilgileri",
"operationId": "me_auth_me_get",
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/UserPublic"
}
}
}
}
},
"security": [
{
"JWT": []
},
{
"APIKeyHeader": []
}
]
}
},
"/auth/refresh": {
"post": {
"tags": [
"auth"
],
"summary": "Refresh token ile yeni access + refresh cifti al",
"operationId": "refresh_auth_refresh_post",
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/RefreshTokenRequest"
}
}
},
"required": true
},
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/TokenPair"
}
}
}
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
}
}
}
}
},
"/health": {
"get": {
"tags": [
"health"
],
"summary": "Saglik kontrolu",
"operationId": "health_health_get",
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HealthResponse"
}
}
}
}
}
}
},
"/api/v1/version": {
"get": {
"tags": [
"health"
],
"summary": "Versiyon bilgisi",
"operationId": "version_info_api_v1_version_get",
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/VersionResponse"
}
}
}
}
}
}
},
"/api/v1/models": {
"get": {
"tags": [
"inspect"
],
"summary": "Kullanilabilir modeller (custom + pretrained)",
"description": "Frontend model-selector dropdown'i icin kaynak listesi.\n\nAuth gerektirir (API key veya bearer). Custom + pre-trained registry'den\nderlenmis tum kaynaklar donulur. `is_custom=True` olan tek bir kayit hep\nbulunur — fallback varsayilandir.",
"operationId": "list_models_api_v1_models_get",
"responses": {
"200": {
"description": "Model listesi",
"content": {
"application/json": {
"schema": {},
"example": {
"models": [
{
"id": "custom",
"name": "Kendi Modellerim",
"description": "CarDD finetune pipeline (damage+parts+severity).",
"source": "custom",
"classes_count": 0,
"license": "proprietary",
"is_custom": true,
"available": true,
"loaded": true,
"kind": "custom",
"entries": []
},
{
"id": "pretrained_roboflow_cardd",
"name": "Pre-trained: Roboflow CarDD Pipeline",
"description": "Roboflow Universe public modelleri.",
"source": "roboflow",
"classes_count": 15,
"license": "CC-BY-4.0",
"is_custom": false,
"available": true,
"loaded": false,
"kind": "pretrained",
"entries": [
{
"id": "roboflow_cardd_scratch_dent",
"name": "Roboflow Car Scratch & Dent",
"license": "CC-BY-4.0",
"classes": [
"scratch",
"dent"
],
"source": "roboflow"
}
]
}
],
"default": "custom"
}
}
}
}
},
"security": [
{
"JWT": []
},
{
"APIKeyHeader": []
}
]
}
},
"/api/v1/inspect": {
"post": {
"tags": [
"inspect"
],
"summary": "Coklu goruntu hasar tespiti",
"description": "Cok goruntulu hasar tespiti.\n\n- **mode=sync**: Max 5 goruntu, sonuc hemen doner.\n- **mode=async**: Max 20 goruntu, kuyruga alinir; status WS veya GET ile takip edilir.\n- **model**: hangi pipeline kullanilacak. Frontend toggle (Pre-trained / Kendi Modellerim).\n Gecersiz id -> 400 'Bilinmeyen model'.",
"operationId": "create_inspection_api_v1_inspect_post",
"security": [
{
"JWT": []
},
{
"APIKeyHeader": []
}
],
"parameters": [
{
"name": "mode",
"in": "query",
"required": false,
"schema": {
"enum": [
"sync",
"async"
],
"type": "string",
"description": "Calisma modu",
"default": "async",
"title": "Mode"
},
"description": "Calisma modu"
},
{
"name": "model",
"in": "query",
"required": false,
"schema": {
"type": "string",
"description": "Model kaynak id'si — 'custom' (default, kendi eğitilmiş modellerimiz) veya pre-trained: 'pretrained_ultralytics_yolo11m', 'pretrained_roboflow_cardd', 'pretrained_hybrid'. Tum liste: GET /api/v1/models",
"default": "custom",
"title": "Model"
},
"description": "Model kaynak id'si — 'custom' (default, kendi eğitilmiş modellerimiz) veya pre-trained: 'pretrained_ultralytics_yolo11m', 'pretrained_roboflow_cardd', 'pretrained_hybrid'. Tum liste: GET /api/v1/models"
}
],
"requestBody": {
"required": true,
"content": {
"multipart/form-data": {
"schema": {
"$ref": "#/components/schemas/Body_create_inspection_api_v1_inspect_post"
}
}
}
},
"responses": {
"200": {
"description": "Sync tamamlandi",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/SyncInspectionResponse"
}
}
}
},
"202": {
"description": "Async kuyruga alindi",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/InspectionCreateResponse"
}
}
}
},
"400": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ApiError"
}
}
},
"description": "Bad Request"
},
"401": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ApiError"
}
}
},
"description": "Unauthorized"
},
"403": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ApiError"
}
}
},
"description": "Forbidden"
},
"429": {
"description": "Rate limit asildi",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ApiError"
}
}
}
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
}
}
}
},
"get": {
"tags": [
"inspect"
],
"summary": "Inceleme listesi (sayfalanmis)",
"operationId": "list_inspections_api_v1_inspect_get",
"security": [
{
"JWT": []
},
{
"APIKeyHeader": []
}
],
"parameters": [
{
"name": "page",
"in": "query",
"required": false,
"schema": {
"type": "integer",
"minimum": 1,
"default": 1,
"title": "Page"
}
},
{
"name": "page_size",
"in": "query",
"required": false,
"schema": {
"type": "integer",
"maximum": 200,
"minimum": 1,
"default": 20,
"title": "Page Size"
}
}
],
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/InspectionListResponse"
}
}
}
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
}
}
}
}
},
"/api/v1/inspect/sync": {
"post": {
"tags": [
"inspect"
],
"summary": "Hizli senkron inceleme (tek veya az sayida goruntu)",
"description": "Senkron inceleme — latency hassas.\n\nFrontend uyumu icin hem `file` (tekil — mobile eski path) hem `files` (cogul —\nweb/desktop) field adlarini kabul eder. En az 1 dosya gerekli, max\n`max_images_sync`.",
"operationId": "sync_single_api_v1_inspect_sync_post",
"security": [
{
"JWT": []
},
{
"APIKeyHeader": []
}
],
"parameters": [
{
"name": "model",
"in": "query",
"required": false,
"schema": {
"type": "string",
"description": "Model kaynak id'si (GET /api/v1/models)",
"default": "custom",
"title": "Model"
},
"description": "Model kaynak id'si (GET /api/v1/models)"
}
],
"requestBody": {
"content": {
"multipart/form-data": {
"schema": {
"$ref": "#/components/schemas/Body_sync_single_api_v1_inspect_sync_post"
}
}
}
},
"responses": {
"200": {
"description": "Sync tamamlandi",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/SyncInspectionResponse"
}
}
}
},
"400": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ApiError"
}
}
},
"description": "Bad Request"
},
"401": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ApiError"
}
}
},
"description": "Unauthorized"
},
"413": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ApiError"
}
}
},
"description": "Request Entity Too Large"
},
"415": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ApiError"
}
}
},
"description": "Unsupported Media Type"
},
"503": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ApiError"
}
}
},
"description": "Service Unavailable"
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
}
}
}
}
},
"/api/v1/inspect/{inspection_id}": {
"get": {
"tags": [
"inspect"
],
"summary": "Inceleme durumu + sonucu",
"operationId": "get_inspection_api_v1_inspect__inspection_id__get",
"security": [
{
"JWT": []
},
{
"APIKeyHeader": []
}
],
"parameters": [
{
"name": "inspection_id",
"in": "path",
"required": true,
"schema": {
"type": "string",
"title": "Inspection Id"
}
}
],
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/InspectionStatusResponse"
}
}
}
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
}
}
}
},
"delete": {
"tags": [
"inspect"
],
"summary": "Inceleme sil",
"operationId": "delete_inspection_endpoint_api_v1_inspect__inspection_id__delete",
"security": [
{
"JWT": []
},
{
"APIKeyHeader": []
}
],
"parameters": [
{
"name": "inspection_id",
"in": "path",
"required": true,
"schema": {
"type": "string",
"title": "Inspection Id"
}
}
],
"responses": {
"204": {
"description": "Successful Response"
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
}
}
}
}
},
"/api/v1/inspect/{inspection_id}/visualization/{viz_type}": {
"get": {
"tags": [
"inspect"
],
"summary": "Annotated/parts/damages PNG (presigned URL'e redirect)",
"operationId": "get_visualization_api_v1_inspect__inspection_id__visualization__viz_type__get",
"security": [
{
"JWT": []
},
{
"APIKeyHeader": []
}
],
"parameters": [
{
"name": "inspection_id",
"in": "path",
"required": true,
"schema": {
"type": "string",
"title": "Inspection Id"
}
},
{
"name": "viz_type",
"in": "path",
"required": true,
"schema": {
"enum": [
"annotated",
"parts",
"damages"
],
"type": "string",
"title": "Viz Type"
}
}
],
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {}
}
}
},
"302": {
"description": "S3 presigned URL'e yonlendir"
},
"404": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ApiError"
}
}
},
"description": "Not Found"
},
"403": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ApiError"
}
}
},
"description": "Forbidden"
},
"409": {
"description": "Inspection henuz tamamlanmamis",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ApiError"
}
}
}
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
}
}
}
}
}
},
"components": {
"schemas": {
"ApiError": {
"properties": {
"detail": {
"type": "string",
"title": "Detail"
},
"code": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Code"
}
},
"additionalProperties": false,
"type": "object",
"required": [
"detail"
],
"title": "ApiError"
},
"Body_create_inspection_api_v1_inspect_post": {
"properties": {
"files": {
"items": {
"type": "string",
"contentMediaType": "application/octet-stream"
},
"type": "array",
"title": "Files",
"description": "1+ goruntu (jpg/png)"
}
},
"type": "object",
"required": [
"files"
],
"title": "Body_create_inspection_api_v1_inspect_post"
},
"Body_sync_single_api_v1_inspect_sync_post": {
"properties": {
"file": {
"anyOf": [
{
"type": "string",
"contentMediaType": "application/octet-stream"
},
{
"type": "null"
}
],
"title": "File",
"description": "Tek goruntu (eski alan adi)"
},
"files": {
"anyOf": [
{
"items": {
"type": "string",
"contentMediaType": "application/octet-stream"
},
"type": "array"
},
{
"type": "null"
}
],
"title": "Files",
"description": "1+ goruntu (web)"
}
},
"type": "object",
"title": "Body_sync_single_api_v1_inspect_sync_post"
},
"CostEstimate": {
"properties": {
"min_tl": {
"type": "number",
"minimum": 0.0,
"title": "Min Tl"
},
"max_tl": {
"type": "number",
"minimum": 0.0,
"title": "Max Tl"
},
"midpoint_tl": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"title": "Midpoint Tl"
},
"confidence": {
"type": "string",
"enum": [
"high",
"medium",
"low"
],
"title": "Confidence"
},
"source": {
"type": "string",
"title": "Source"
}
},
"additionalProperties": false,
"type": "object",
"required": [
"min_tl",
"max_tl",
"confidence",
"source"
],
"title": "CostEstimate"
},
"Damage": {
"properties": {
"id": {
"type": "integer",
"title": "Id"
},
"type": {
"type": "string",
"enum": [
"dent",
"scratch",
"crack",
"glass_shatter",
"lamp_broken",
"tire_flat"
],
"title": "Type"
},
"type_tr": {
"type": "string",
"title": "Type Tr"
},
"confidence": {
"type": "number",
"maximum": 1.0,
"minimum": 0.0,
"title": "Confidence"
},
"severity": {
"$ref": "#/components/schemas/SeverityResult"
},
"bbox": {
"prefixItems": [
{
"type": "number"
},
{
"type": "number"
},
{
"type": "number"
},
{
"type": "number"
}
],
"type": "array",
"maxItems": 4,
"minItems": 4,
"title": "Bbox"
},
"polygon_normalized": {
"items": {
"items": {
"type": "number"
},
"type": "array"
},
"type": "array",
"title": "Polygon Normalized",
"default": []
},
"area_ratio": {
"type": "number",
"maximum": 1.0,
"minimum": 0.0,
"title": "Area Ratio"
},
"cost": {
"$ref": "#/components/schemas/CostEstimate"
},
"is_multi_part": {
"type": "boolean",
"title": "Is Multi Part",
"default": false
},
"is_low_confidence_match": {
"type": "boolean",
"title": "Is Low Confidence Match",
"default": false
},
"affected_parts": {
"anyOf": [
{
"items": {
"type": "string"
},
"type": "array"
},
{
"type": "null"
}
],
"title": "Affected Parts"
}
},
"additionalProperties": true,
"type": "object",
"required": [
"id",
"type",
"type_tr",
"confidence",
"severity",
"bbox",
"area_ratio",
"cost"
],
"title": "Damage",
"description": "Tek bir hasar kaydi — packages/types/src/damage.ts::Damage ile ayni."
},
"HTTPValidationError": {
"properties": {
"detail": {
"items": {
"$ref": "#/components/schemas/ValidationError"
},
"type": "array",
"title": "Detail"
}
},
"type": "object",
"title": "HTTPValidationError"
},
"HealthResponse": {
"properties": {
"status": {
"type": "string",
"enum": [
"ok",
"degraded",
"down"
],
"title": "Status"
},
"ml_loaded": {
"type": "boolean",
"title": "Ml Loaded"
},
"timestamp": {
"type": "string",
"title": "Timestamp"
},
"version": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Version"
}
},
"additionalProperties": false,
"type": "object",
"required": [
"status",
"ml_loaded",
"timestamp"
],
"title": "HealthResponse"
},
"Inspection": {
"properties": {
"inspection_id": {
"type": "string",
"title": "Inspection Id"
},
"timestamp": {
"type": "string",
"title": "Timestamp"
},
"image": {
"$ref": "#/components/schemas/InspectionImage"
},
"parts": {
"items": {
"$ref": "#/components/schemas/Part"
},
"type": "array",
"title": "Parts",
"default": []
},
"summary": {
"$ref": "#/components/schemas/InspectionSummary"
},
"multi_part_damages": {
"anyOf": [
{
"items": {
"$ref": "#/components/schemas/Damage"
},
"type": "array"
},
{
"type": "null"
}
],
"title": "Multi Part Damages"
},
"unassigned_damages": {
"anyOf": [
{
"items": {
"$ref": "#/components/schemas/Damage"
},
"type": "array"
},
{
"type": "null"
}
],
"title": "Unassigned Damages"
},
"visualization_urls": {
"anyOf": [
{
"$ref": "#/components/schemas/VisualizationUrls"
},
{
"type": "null"
}
]
}
},
"additionalProperties": true,
"type": "object",
"required": [
"inspection_id",
"timestamp",
"image",
"summary"
],
"title": "Inspection",
"description": "Bir incelemenin ana sonuc DTO'su."
},
"InspectionCreateResponse": {
"properties": {
"inspection_id": {
"type": "string",
"title": "Inspection Id"
},
"status": {
"type": "string",
"enum": [
"queued",
"processing",
"completed",
"failed"
],
"title": "Status"
},
"status_url": {
"type": "string",
"title": "Status Url"
},
"created_at": {
"type": "string",
"title": "Created At"
},
"estimated_completion_seconds": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"title": "Estimated Completion Seconds",
"default": 30
}
},
"additionalProperties": false,
"type": "object",
"required": [
"inspection_id",
"status",
"status_url",
"created_at"
],
"title": "InspectionCreateResponse"
},
"InspectionImage": {
"properties": {
"width": {
"type": "integer",
"minimum": 0.0,
"title": "Width"
},
"height": {
"type": "integer",
"minimum": 0.0,
"title": "Height"
},
"url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Url"
},
"hash": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Hash"
}
},
"additionalProperties": false,
"type": "object",
"required": [
"width",
"height"
],
"title": "InspectionImage"
},
"InspectionListItem": {
"properties": {
"inspection_id": {
"type": "string",
"title": "Inspection Id"
},
"created_at": {
"type": "string",
"title": "Created At"
},
"status": {
"type": "string",
"enum": [
"queued",
"processing",
"completed",
"failed"
],
"title": "Status"
},
"damage_count": {
"type": "integer",
"minimum": 0.0,
"title": "Damage Count"
},
"total_cost_midpoint_tl": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"title": "Total Cost Midpoint Tl"
},
"thumbnail_url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Thumbnail Url"
}
},
"additionalProperties": false,
"type": "object",
"required": [
"inspection_id",
"created_at",
"status",
"damage_count"
],
"title": "InspectionListItem"
},
"InspectionListResponse": {
"properties": {
"items": {
"items": {
"$ref": "#/components/schemas/InspectionListItem"
},
"type": "array",
"title": "Items"
},
"total": {
"type": "integer",
"minimum": 0.0,
"title": "Total"
},
"page": {
"type": "integer",
"minimum": 1.0,
"title": "Page"
},
"page_size": {
"type": "integer",
"maximum": 200.0,
"minimum": 1.0,
"title": "Page Size"
}
},
"additionalProperties": false,
"type": "object",
"required": [
"items",
"total",
"page",
"page_size"
],
"title": "InspectionListResponse"
},
"InspectionStatusResponse": {
"properties": {
"inspection_id": {
"type": "string",
"title": "Inspection Id"
},
"status": {
"type": "string",
"enum": [
"queued",
"processing",
"completed",
"failed"
],
"title": "Status"
},
"result": {
"anyOf": [
{
"$ref": "#/components/schemas/Inspection"
},
{
"type": "null"
}
]
},
"error": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Error"
},
"created_at": {
"type": "string",
"title": "Created At"
},
"completed_at": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Completed At"
}
},
"additionalProperties": false,
"type": "object",
"required": [
"inspection_id",
"status",
"created_at"
],
"title": "InspectionStatusResponse"
},
"InspectionSummary": {
"properties": {
"total_parts_inspected": {
"type": "integer",
"minimum": 0.0,
"title": "Total Parts Inspected"
},
"damaged_parts_count": {
"type": "integer",
"minimum": 0.0,
"title": "Damaged Parts Count"
},
"clean_parts_count": {
"type": "integer",
"minimum": 0.0,
"title": "Clean Parts Count"
},
"total_damage_count": {
"type": "integer",
"minimum": 0.0,
"title": "Total Damage Count"
},
"unknown_part_damages_count": {
"type": "integer",
"minimum": 0.0,
"title": "Unknown Part Damages Count"
},
"multi_part_damages_count": {
"type": "integer",
"minimum": 0.0,
"title": "Multi Part Damages Count"
},
"most_severe_level": {
"anyOf": [
{
"type": "string",
"enum": [
"hafif",
"orta",
"agir"
]
},
{
"type": "null"
}
],
"title": "Most Severe Level"
},
"most_severe_level_tr": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Most Severe Level Tr"
},
"total_damage_area_ratio": {
"type": "number",
"minimum": 0.0,
"title": "Total Damage Area Ratio"
},
"total_cost_range_tl": {
"prefixItems": [
{
"type": "number"
},
{
"type": "number"
}
],
"type": "array",
"maxItems": 2,
"minItems": 2,
"title": "Total Cost Range Tl",
"default": [
0.0,
0.0
]
},
"total_cost_midpoint_tl": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"title": "Total Cost Midpoint Tl"
},
"cost_confidence": {
"type": "string",
"enum": [
"high",
"medium",
"low"
],
"title": "Cost Confidence",
"default": "low"
},
"repair_recommendation": {
"type": "string",
"enum": [
"kucuk_tamir",
"tamir_boya",
"parca_degisimi",
"agir_hasar_pert_degerlendirme",
"hasar_yok"
],
"title": "Repair Recommendation",
"default": "hasar_yok"
},
"repair_recommendation_tr": {
"type": "string",
"title": "Repair Recommendation Tr",
"default": "Hasar tespit edilmedi"
},
"estimated_repair_days": {
"type": "integer",
"minimum": 0.0,
"title": "Estimated Repair Days",
"default": 0
}
},
"additionalProperties": false,
"type": "object",
"required": [
"total_parts_inspected",
"damaged_parts_count",
"clean_parts_count",
"total_damage_count",
"unknown_part_damages_count",
"multi_part_damages_count",
"total_damage_area_ratio"
],
"title": "InspectionSummary"
},
"Part": {
"properties": {
"name": {
"type": "string",
"title": "Name"
},
"name_tr": {
"type": "string",
"title": "Name Tr"
},
"confidence": {
"type": "number",
"maximum": 1.0,
"minimum": 0.0,
"title": "Confidence"
},
"status": {
"type": "string",
"enum": [
"clean",
"minor_damage",
"moderate_damage",
"severe_damage"
],
"title": "Status"
},
"damage_count": {
"type": "integer",
"minimum": 0.0,
"title": "Damage Count"
},
"polygon_normalized": {
"items": {
"items": {
"type": "number"
},
"type": "array"
},
"type": "array",
"title": "Polygon Normalized",
"default": []
},
"bbox": {
"prefixItems": [
{
"type": "number"
},
{
"type": "number"
},
{
"type": "number"
},
{
"type": "number"
}
],
"type": "array",
"maxItems": 4,
"minItems": 4,
"title": "Bbox"
},
"damages": {
"items": {
"$ref": "#/components/schemas/Damage"
},
"type": "array",
"title": "Damages",
"default": []
},
"part_cost_min_tl": {
"type": "number",
"minimum": 0.0,
"title": "Part Cost Min Tl",
"default": 0.0
},
"part_cost_max_tl": {
"type": "number",
"minimum": 0.0,
"title": "Part Cost Max Tl",
"default": 0.0
},
"cost_note": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Cost Note"
}
},
"additionalProperties": true,
"type": "object",
"required": [
"name",
"name_tr",
"confidence",
"status",
"damage_count",
"bbox"
],
"title": "Part",
"description": "Parca-merkezli kayit — packages/types/src/part.ts::Part ile ayni."
},
"RefreshTokenRequest": {
"properties": {
"refresh_token": {
"type": "string",
"minLength": 10,
"title": "Refresh Token"
}
},
"additionalProperties": false,
"type": "object",
"required": [
"refresh_token"
],
"title": "RefreshTokenRequest"
},
"SeverityResult": {
"properties": {
"level": {
"type": "string",
"enum": [
"hafif",
"orta",
"agir"
],
"title": "Level"
},
"level_tr": {
"type": "string",
"title": "Level Tr"
},
"confidence": {
"type": "number",
"maximum": 1.0,
"minimum": 0.0,
"title": "Confidence"
},
"method": {
"type": "string",
"enum": [
"rule",
"rule_based",
"cnn",
"ensemble",
"ensemble_resolved"
],
"title": "Method"
}
},
"additionalProperties": false,
"type": "object",
"required": [
"level",
"level_tr",
"confidence",
"method"
],
"title": "SeverityResult"
},
"SyncInspectionResponse": {
"properties": {
"inspection_id": {
"type": "string",
"title": "Inspection Id"
},
"result": {
"$ref": "#/components/schemas/Inspection"
},
"processed_at": {
"type": "string",
"title": "Processed At"
}
},
"additionalProperties": false,
"type": "object",
"required": [
"inspection_id",
"result",
"processed_at"
],
"title": "SyncInspectionResponse"
},
"TokenPair": {
"properties": {
"access_token": {
"type": "string",
"title": "Access Token"
},
"refresh_token": {
"type": "string",
"title": "Refresh Token"
},
"token_type": {
"type": "string",
"const": "bearer",
"title": "Token Type",
"default": "bearer"
},
"expires_in": {
"type": "integer",
"title": "Expires In"
}
},
"additionalProperties": false,
"type": "object",
"required": [
"access_token",
"refresh_token",
"expires_in"
],
"title": "TokenPair"
},
"UserLoginRequest": {
"properties": {
"email": {
"type": "string",
"format": "email",
"title": "Email"
},
"password": {
"type": "string",
"maxLength": 128,
"minLength": 1,
"title": "Password"
}
},
"additionalProperties": false,
"type": "object",
"required": [
"email",
"password"
],
"title": "UserLoginRequest"
},
"UserPublic": {
"properties": {
"id": {
"type": "string",
"title": "Id"
},
"email": {
"type": "string",
"format": "email",
"title": "Email"
},
"full_name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Full Name"
},
"role": {
"type": "string",
"enum": [
"user",
"admin"
],
"title": "Role",
"default": "user"
},
"is_active": {
"type": "boolean",
"title": "Is Active",
"default": true
},
"created_at": {
"type": "string",
"title": "Created At"
}
},
"additionalProperties": false,
"type": "object",
"required": [
"id",
"email",
"created_at"
],
"title": "UserPublic",
"description": "Kullaniciya geri donen / /auth/me icin guvenli (PII'siz hash icermez) user kaydi."
},
"UserRegisterRequest": {
"properties": {
"email": {
"type": "string",
"format": "email",
"title": "Email"
},
"password": {
"type": "string",
"maxLength": 128,
"minLength": 8,
"title": "Password"
},
"full_name": {
"anyOf": [
{
"type": "string",
"maxLength": 120
},
{
"type": "null"
}
],
"title": "Full Name"
}
},
"additionalProperties": false,
"type": "object",
"required": [
"email",
"password"
],
"title": "UserRegisterRequest"
},
"ValidationError": {
"properties": {
"loc": {
"items": {
"anyOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
},
"type": "array",
"title": "Location"
},
"msg": {
"type": "string",
"title": "Message"
},
"type": {
"type": "string",
"title": "Error Type"
},
"input": {
"title": "Input"
},
"ctx": {
"type": "object",
"title": "Context"
}
},
"type": "object",
"required": [
"loc",
"msg",
"type"
],
"title": "ValidationError"
},
"VersionResponse": {
"properties": {
"version": {
"type": "string",
"title": "Version"
},
"git_sha": {
"type": "string",
"title": "Git Sha"
},
"build_time": {
"type": "string",
"title": "Build Time"
},
"environment": {
"type": "string",
"title": "Environment"
}
},
"additionalProperties": false,
"type": "object",
"required": [
"version",
"git_sha",
"build_time",
"environment"
],
"title": "VersionResponse"
},
"VisualizationUrls": {
"properties": {
"annotated": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Annotated"
},
"parts": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Parts"
},
"damages": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Damages"
}
},
"additionalProperties": false,
"type": "object",
"title": "VisualizationUrls"
}
},
"securitySchemes": {
"JWT": {
"type": "http",
"scheme": "bearer"
},
"APIKeyHeader": {
"type": "apiKey",
"in": "header",
"name": "X-API-Key"
}
}
},
"tags": [
{
"name": "health",
"description": "Saglik ve versiyon"
},
{
"name": "auth",
"description": "Kimlik dogrulama / kullanici"
},
{
"name": "inspect",
"description": "Hasar inceleme islemleri"
},
{
"name": "stream",
"description": "Realtime WebSocket"
}
]
}