{"openapi":"3.1.0","info":{"title":"ORBITAL GRID","description":"**ORBITAL GRID** — analyst-assisted satellite intelligence. The API searches and selects scenes with a verifiable AOI, computes descriptive indices and time series, standardizes attributed official layers, and delivers optical/SAR evidence with QA, coverage, lineage and explicit limitations. Experimental engines remain gated and are never promoted to validated scientific claims merely because a source is searchable.\n\nAuth: send header `X-API-Key`. Request a key via the 'Request an API Key' form at `/docs-site` (or talking to ORBIT on the home page); the team reviews the request and issues it.","contact":{"name":"GROWX","url":"https://growxagency.info/","email":"growxagencymkt@gmail.com"},"version":"2.3.0"},"paths":{"/auth/register":{"post":{"tags":["accounts"],"summary":"Register","operationId":"register_auth_register_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Register Auth Register Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/login":{"post":{"tags":["accounts"],"summary":"Login","operationId":"login_auth_login_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Login Auth Login Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/logout":{"post":{"tags":["accounts"],"summary":"Logout","operationId":"logout_auth_logout_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Logout Auth Logout Post"}}}}}}},"/auth/me":{"get":{"tags":["accounts"],"summary":"Me","operationId":"me_auth_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Me Auth Me Get"}}}}}}},"/me/ask":{"post":{"tags":["accounts"],"summary":"Ask","description":"Resuelve la consulta del usuario logueado y la guarda en su historial.\n\n- Con lat+lon -> agente (``agent_ask``): elige producto/satélites sobre el\n  punto y responde grounded.\n- Sin coordenadas -> ``resolve_intent``: interpreta la consulta y rutea.\n\nEl contrato de la respuesta (AgentAnswer / IntentResponse) NO se modifica: se\ndevuelve tal cual. La persistencia del historial es best-effort — si falla,\nla respuesta al usuario NO se rompe.","operationId":"ask_me_ask_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AskRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"title":"Response Ask Me Ask Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/me/history":{"get":{"tags":["accounts"],"summary":"History","operationId":"history_me_history_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":20,"title":"Limit"}},{"name":"full","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Full"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response History Me History Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/me/password":{"post":{"tags":["accounts"],"summary":"Change Password","description":"Cambia la contraseña del usuario logueado. Verifica la actual, re-hashea,\nrevoca TODAS las otras sesiones (deja la actual) y limpia\n``must_change_password``. Accesible aun con must_change_password=1.","operationId":"change_password_me_password_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PasswordChangeRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Change Password Me Password Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/me/account/events":{"get":{"tags":["accounts"],"summary":"Account Events","description":"Historial de eventos REALES de la cuenta del usuario logueado (panel Mi\nCuenta). Lee ``audit_log`` filtrado por ``target='user:{id}'`` — cambios de\ncontraseña, altas y ediciones de la propia cuenta. Data 100% real: si la\ncuenta todavía no registró eventos, devuelve ``items=[]`` (empty state\nhonesto, nunca datos de ejemplo). Accesible con sesión aun con\n``must_change_password=1`` (usa ``require_user``, no ``require_perm``).","operationId":"account_events_me_account_events_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Account Events Me Account Events Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/request-verify":{"post":{"tags":["accounts"],"summary":"Request Verify","description":"Envía (con sesión) el correo de verificación de email.","operationId":"request_verify_auth_request_verify_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Request Verify Auth Request Verify Post"}}}}}}},"/auth/verify":{"post":{"tags":["accounts"],"summary":"Verify Email","description":"Confirma el email a partir del token del enlace.","operationId":"verify_email_auth_verify_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Verify Email Auth Verify Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/forgot":{"post":{"tags":["accounts"],"summary":"Forgot Password","description":"Inicia el reset de contraseña. SIEMPRE responde 200 genérico\n(anti-enumeración); envía el correo solo si el usuario existe y hay SMTP.","operationId":"forgot_password_auth_forgot_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForgotRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Forgot Password Auth Forgot Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/reset":{"post":{"tags":["accounts"],"summary":"Reset Password","description":"Cambia la contraseña con el token de reset, revoca TODAS las sesiones del\nusuario y marca el token como usado.","operationId":"reset_password_auth_reset_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResetRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Reset Password Auth Reset Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/users":{"get":{"tags":["accounts"],"summary":"Admin List Users","operationId":"admin_list_users_admin_users_get","parameters":[{"name":"query","in":"query","required":false,"schema":{"type":"string","default":"","title":"Query"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Admin List Users Admin Users Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["accounts"],"summary":"Admin Create User","operationId":"admin_create_user_admin_users_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminUserCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Admin Create User Admin Users Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/users/{user_id}":{"patch":{"tags":["accounts"],"summary":"Admin Patch User","operationId":"admin_patch_user_admin_users__user_id__patch","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminUserPatch"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Admin Patch User Admin Users  User Id  Patch"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["accounts"],"summary":"Admin Delete User","operationId":"admin_delete_user_admin_users__user_id__delete","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Admin Delete User Admin Users  User Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/roles":{"get":{"tags":["accounts"],"summary":"Admin List Roles","operationId":"admin_list_roles_admin_roles_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Admin List Roles Admin Roles Get"}}}}}},"post":{"tags":["accounts"],"summary":"Admin Create Role","operationId":"admin_create_role_admin_roles_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RoleCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Admin Create Role Admin Roles Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/roles/{name}":{"patch":{"tags":["accounts"],"summary":"Admin Patch Role","operationId":"admin_patch_role_admin_roles__name__patch","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RolePatch"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Admin Patch Role Admin Roles  Name  Patch"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["accounts"],"summary":"Admin Delete Role","operationId":"admin_delete_role_admin_roles__name__delete","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Admin Delete Role Admin Roles  Name  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/users/{user_id}/api-keys":{"post":{"tags":["accounts"],"summary":"Admin Create Api Key","operationId":"admin_create_api_key_admin_users__user_id__api_keys_post","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Admin Create Api Key Admin Users  User Id  Api Keys Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["accounts"],"summary":"Admin List Api Keys","operationId":"admin_list_api_keys_admin_users__user_id__api_keys_get","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Admin List Api Keys Admin Users  User Id  Api Keys Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/api-keys/{key_id}":{"delete":{"tags":["accounts"],"summary":"Admin Revoke Api Key","operationId":"admin_revoke_api_key_admin_api_keys__key_id__delete","parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"integer","title":"Key Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Admin Revoke Api Key Admin Api Keys  Key Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/audit":{"get":{"tags":["accounts"],"summary":"Admin Audit","operationId":"admin_audit_admin_audit_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Admin Audit Admin Audit Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/leads":{"get":{"tags":["accounts"],"summary":"Admin List Leads","description":"Posibles clientes capturados por ORBIT (chat/pop-up) y los formularios\n\"Solicitar API Key\". Datos personales: solo llegan hasta acá — jamás se\nexponen por otra superficie ni se reflejan en el endpoint público.","operationId":"admin_list_leads_admin_leads_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":200,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Admin List Leads Admin Leads Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/leads/{lead_id}":{"patch":{"tags":["accounts"],"summary":"Admin Patch Lead","operationId":"admin_patch_lead_admin_leads__lead_id__patch","parameters":[{"name":"lead_id","in":"path","required":true,"schema":{"type":"integer","title":"Lead Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LeadStatusPatch"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Admin Patch Lead Admin Leads  Lead Id  Patch"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["accounts"],"summary":"Admin Delete Lead","description":"Supresión real del dato personal (el detalle de auditoría NO incluye\nemail/teléfono: solo el id borrado).","operationId":"admin_delete_lead_admin_leads__lead_id__delete","parameters":[{"name":"lead_id","in":"path","required":true,"schema":{"type":"integer","title":"Lead Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Admin Delete Lead Admin Leads  Lead Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/me/processes/standard":{"get":{"tags":["processes"],"summary":"Standard Processes","description":"OG-3 — Menú de procesos/productos standard \"de manual\".\n\nPor proceso: qué entrega, insumos requeridos, límites conocidos (se\nmuestran, no se esconden) y evidencia de validación con su estado honesto.","operationId":"standard_processes_me_processes_standard_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Standard Processes Me Processes Standard Get"}}}}}}},"/me/processes/progress":{"get":{"tags":["processes"],"summary":"Implementation Progress","description":"OG-4 — Panel de avance de implementación (uso interno, solo admin).","operationId":"implementation_progress_me_processes_progress_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Implementation Progress Me Processes Progress Get"}}}}}}},"/cuenta/api/accounts":{"get":{"tags":["account-panel"],"summary":"List Accounts","description":"Cuentas visibles para el usuario logueado (RBAC server-side).\n\n- ``users.manage`` -> todas las cuentas registradas, con búsqueda por\n  nombre/email, paginación y ``total`` real para el \"1–15 de N\".\n- resto (incluye rol ``pendiente``) -> únicamente su propia cuenta. El\n  filtro de búsqueda se aplica igual (puede dar 0 resultados honestos).","operationId":"list_accounts_cuenta_api_accounts_get","parameters":[{"name":"query","in":"query","required":false,"schema":{"type":"string","default":"","title":"Query"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":15,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response List Accounts Cuenta Api Accounts Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/cuenta/api/accounts/{account_id}/history":{"get":{"tags":["account-panel"],"summary":"Account History","description":"Historial de auditoría de UNA cuenta, con el mismo RBAC que\n``/cuenta/api/accounts``:\n\n- rol con ``users.manage`` (admin/superadmin): historial de cualquier cuenta.\n- resto: únicamente su propia cuenta (403 si pide otra).\n\nData 100% real de ``audit_log`` (``target = 'user:{account_id}'``): cambios de\ncontraseña, altas y ediciones. Si la cuenta no registró eventos, ``items=[]``\n(empty state honesto, nunca datos de ejemplo). Orden: más reciente primero.","operationId":"account_history_cuenta_api_accounts__account_id__history_get","parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string","title":"Account Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Account History Cuenta Api Accounts  Account Id  History Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/knowledge/stats":{"get":{"tags":["knowledge-admin"],"summary":"Get Stats","operationId":"get_stats_admin_knowledge_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Get Stats Admin Knowledge Stats Get"}}}}}}},"/admin/knowledge/documents":{"get":{"tags":["knowledge-admin"],"summary":"List Docs","operationId":"list_docs_admin_knowledge_documents_get","parameters":[{"name":"query","in":"query","required":false,"schema":{"type":"string","default":"","title":"Query"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response List Docs Admin Knowledge Documents Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/knowledge/documents/{doc_id}":{"get":{"tags":["knowledge-admin"],"summary":"Get Doc","operationId":"get_doc_admin_knowledge_documents__doc_id__get","parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"integer","title":"Doc Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Get Doc Admin Knowledge Documents  Doc Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["knowledge-admin"],"summary":"Delete Doc","operationId":"delete_doc_admin_knowledge_documents__doc_id__delete","parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"integer","title":"Doc Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Delete Doc Admin Knowledge Documents  Doc Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/knowledge/documents/text":{"post":{"tags":["knowledge-admin"],"summary":"Ingest Text Ep","operationId":"ingest_text_ep_admin_knowledge_documents_text_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IngestTextRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Ingest Text Ep Admin Knowledge Documents Text Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/knowledge/documents/upload":{"post":{"tags":["knowledge-admin"],"summary":"Ingest File Ep","operationId":"ingest_file_ep_admin_knowledge_documents_upload_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_ingest_file_ep_admin_knowledge_documents_upload_post"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Ingest File Ep Admin Knowledge Documents Upload Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/knowledge/search":{"post":{"tags":["knowledge-admin"],"summary":"Search Ep","operationId":"search_ep_admin_knowledge_search_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Search Ep Admin Knowledge Search Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/analytics":{"get":{"tags":["analytics"],"summary":"Analytics Catalog","description":"What the analytics layer can do today — honest coverage included.","operationId":"analytics_catalog_v1_analytics_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Analytics Catalog V1 Analytics Get"}}}}},"security":[{"APIKeyHeader":[]}]}},"/v1/analytics/timeseries":{"post":{"tags":["analytics"],"summary":"Analytics Timeseries","description":"Serie temporal REAL de un índice sobre tu zona (una medición por escena).\n\nItera las escenas Sentinel-2 del período (búsqueda STAC existente) y corre\nel motor zonal por escena. Puntos con <35% de píxeles útiles se descartan y\nse listan aparte (\"descartadas por nubes\"). Incluye tendencia en español\n(sube/baja/estable + delta %). Cache por (zona, índice, período).","operationId":"analytics_timeseries_v1_analytics_timeseries_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__analytics__router__TimeseriesRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Analytics Timeseries V1 Analytics Timeseries Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]}]}},"/v1/analytics/compare":{"post":{"tags":["analytics"],"summary":"Analytics Compare","description":"Compara el índice de tu zona en dos fechas (antes/después) con delta\nhonesto en español y las dos escenas identificadas (tiles/assets) para\nverlas lado a lado. ``date_a``/``date_b`` ISO o 'auto' (más fresca vs ~30\ndías antes).","operationId":"analytics_compare_v1_analytics_compare_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__analytics__router__CompareRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Analytics Compare V1 Analytics Compare Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]}]}},"/v1/analytics/fire-history":{"get":{"tags":["analytics"],"summary":"Analytics Fire History","description":"Historia de fuego de la zona: archivo FIRMS (SP) por tramos + NRT +\ncicatriz NBR real. Conteo por mes, foco más intenso y estado de cicatriz.\nSi el archivo no responde con la credencial, degrada honesto a los 10 días\nNRT + NBR y lo declara en ``mode``.","operationId":"analytics_fire_history_v1_analytics_fire_history_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"bbox","in":"query","required":true,"schema":{"type":"string","description":"oeste,sur,este,norte (WGS84).","title":"Bbox"},"description":"oeste,sur,este,norte (WGS84)."},{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":366,"minimum":10,"description":"Ventana hacia atrás en días (10-366).","default":365,"title":"Days"},"description":"Ventana hacia atrás en días (10-366)."},{"name":"include_scar","in":"query","required":false,"schema":{"type":"boolean","description":"Computar cicatriz NBR actual.","default":true,"title":"Include Scar"},"description":"Computar cicatriz NBR actual."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Analytics Fire History V1 Analytics Fire History Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/analytics/zonal-stats":{"post":{"tags":["analytics"],"summary":"Analytics Zonal Stats","description":"Zonal statistics of a spectral index computed from REAL satellite pixels.\n\nThe routing engine picks the freshest processable open scene (Sentinel-2\nL2A COGs today), reads only the AOI window of the needed bands, masks\nclouds with SCL, computes the index and returns mean/std/min/max/p10/p50/\np90 + valid-pixel share, translated to plain language (ES/EN). When no\nreal pixel can be served, the answer is an honest `unavailable` + cause.\n\nRate limited per API key (this endpoint is expensive: several live COG\nreads); a burst beyond the budget returns 429 with ``Retry-After``. Auth\n(and the global per-key limit) already ran in the router dependency, so the\nX-API-Key here is a validated key.","operationId":"analytics_zonal_stats_v1_analytics_zonal_stats_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ZonalStatsRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Analytics Zonal Stats V1 Analytics Zonal Stats Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]}]}},"/v1/analytics/zonal-stats/multi":{"post":{"tags":["analytics"],"summary":"Analytics Zonal Stats Multi","description":"Several spectral indices from ONE real scene, in a single call.\n\nInstead of calling ``/v1/analytics/zonal-stats`` once per index (each one\nre-routes and re-reads the shared bands, and may land on a *different*\nscene/date), this picks a single scene eligible for every requested index,\nreads the union of bands once and computes them all over the exact same\npixels/cloud mask — so NDVI, NDMI, NDWI… are mutually comparable. Honest\n``unavailable`` + cause when no real pixel can be served.\n\nShares the same per-API-key rate budget as the single-index endpoint (both\nare expensive live COG reads); a burst returns 429 with ``Retry-After``.","operationId":"analytics_zonal_stats_multi_v1_analytics_zonal_stats_multi_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MultiZonalStatsRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Analytics Zonal Stats Multi V1 Analytics Zonal Stats Multi Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]}]}},"/v1/products":{"get":{"tags":["products"],"summary":"Products Catalog","description":"The answers ORBITAL GRID can give today, by use case.","operationId":"products_catalog_v1_products_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Products Catalog V1 Products Get"}}}}},"security":[{"APIKeyHeader":[]}]}},"/v1/products/{product_id}":{"post":{"tags":["products"],"summary":"Run Product","description":"Run a product over an AOI. Cached by AOI + period + product (Fase D).","operationId":"run_product_v1_products__product_id__post","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"product_id","in":"path","required":true,"schema":{"type":"string","description":"Product id, e.g. crop_health, water_flood.","title":"Product Id"},"description":"Product id, e.g. crop_health, water_flood."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/answer":{"post":{"tags":["products"],"summary":"Answer","description":"The single conversational door. You say WHAT you need (free text) and\nWHERE (place name, bbox, GeoJSON, or lat/lon point); the platform picks the\nproduct and the satellites and answers in plain language.\n\nStage 1 (deterministic, auditable): understand the need and SELECT the\nproduct + AOI + period — no LLM in the decision. Stage 2 (grounded): run the\nproduct and translate the numbers. Per-client history biases the pick when\nthe query is ambiguous. The client never names a satellite.","operationId":"answer_v1_answer_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnswerRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]}]}},"/v1/agent/ask":{"post":{"tags":["agent"],"summary":"Agent Ask","description":"El agente de ORBITAL GRID: pregunta libre + punto -> respuesta grounded.\n\nPipeline: parser determinístico de intención -> producto por caso de uso\nsobre un área alrededor de tu punto -> números calculados por código\n(productos / motor de píxel real) -> respuesta en lenguaje simple compuesta\nSOLO con esos números. El LLM (si está configurado) redacta y se valida;\njamás calcula. Sin dato real, la respuesta lo dice — nunca se inventa.","operationId":"agent_ask_v1_agent_ask_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentAskRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentAnswer"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]}]}},"/v1/agent/capabilities":{"get":{"tags":["agent"],"summary":"Agent Capabilities","description":"Qué sabe responder el agente HOY — honesto, generado del registro real.","operationId":"agent_capabilities_v1_agent_capabilities_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Agent Capabilities V1 Agent Capabilities Get"}}}}},"security":[{"APIKeyHeader":[]}]}},"/v1/tracking/satellites":{"get":{"tags":["tracking"],"summary":"Tracking Satellites","description":"Posiciones orbitales EN VIVO, calculadas — no estimadas — propagando con\nSGP4 los TLEs públicos de Celestrak (cache local, TTL ~12 h).\n\nHonestidad de dato: solo aparecen los satélites del registry cuyo NORAD ID\nfue verificado contra Celestrak Y tienen TLE vigente propagable. Datasets\n(DEMs, mosaicos), vehículos decomisados y flotas sin ID único NO se listan.\nInstrumentos a bordo de la ISS reportan la posición de la ISS (aclarado en\n``platform``).","operationId":"tracking_satellites_v1_tracking_satellites_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"access","in":"query","required":false,"schema":{"anyOf":[{"enum":["live","requires_credential","pending_agreement"],"type":"string"},{"type":"null"}],"description":"Filtra por el acceso declarado en el registry público. Valores admitidos: live, requires_credential, pending_agreement. Cualquier otro valor devuelve 422 (nunca una lista vacía silenciosa). Sin filtro se listan todos los satélites rastreables. Medido el 2026-08-12: 36 sin filtro, 32 live, 4 requires_credential y 0 pending_agreement — este último es legítimamente cero porque esa capability no tiene número de catálogo NORAD asignado.","title":"Access"},"description":"Filtra por el acceso declarado en el registry público. Valores admitidos: live, requires_credential, pending_agreement. Cualquier otro valor devuelve 422 (nunca una lista vacía silenciosa). Sin filtro se listan todos los satélites rastreables. Medido el 2026-08-12: 36 sin filtro, 32 live, 4 requires_credential y 0 pending_agreement — este último es legítimamente cero porque esa capability no tiene número de catálogo NORAD asignado."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Tracking Satellites V1 Tracking Satellites Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/learning/stats":{"get":{"tags":["learning"],"summary":"Learning Stats","description":"Estado del auto-aprendizaje: eventos reales registrados por proveedor,\nel multiplicador que el routing aplica hoy y la explicación del método.\n\nHonesto por diseño: si todavía no hay eventos suficientes, los\nmultiplicadores son 1.0 (neutrales) y la respuesta lo dice.","operationId":"learning_stats_v1_learning_stats_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":90,"minimum":1,"description":"Ventana de análisis en días.","default":14,"title":"Days"},"description":"Ventana de análisis en días."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Learning Stats V1 Learning Stats Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/learning/orbit-quality":{"get":{"tags":["learning"],"summary":"Orbit Quality","description":"Panel/API de calidad de ORBIT: casos registrados, score y tags.","operationId":"orbit_quality_v1_learning_orbit_quality_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"description":"Ventana de casos conversacionales en dias.","default":30,"title":"Days"},"description":"Ventana de casos conversacionales en dias."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Orbit Quality V1 Learning Orbit Quality Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/learning/orbit-eval":{"get":{"tags":["learning"],"summary":"Orbit Eval Report","description":"Evaluator offline de ORBIT. No sale a red ni calcula pixeles.","operationId":"orbit_eval_report_v1_learning_orbit_eval_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Orbit Eval Report V1 Learning Orbit Eval Get"}}}}},"security":[{"APIKeyHeader":[]}]}},"/v1/learning/orbit-train/run":{"post":{"tags":["learning"],"summary":"Orbit Train Run","description":"Entrenamiento BAJO DEMANDA: corre evaluator y guarda el run historico.","operationId":"orbit_train_run_v1_learning_orbit_train_run_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Orbit Train Run V1 Learning Orbit Train Run Post"}}}}},"security":[{"APIKeyHeader":[]}]}},"/v1/learning/availability":{"get":{"tags":["learning"],"summary":"Orbit Availability","description":"Registro live que ORBIT puede nombrar/seleccionar hoy.","operationId":"orbit_availability_v1_learning_availability_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Orbit Availability V1 Learning Availability Get"}}}}},"security":[{"APIKeyHeader":[]}]}},"/v1/learning/product-availability":{"get":{"tags":["learning"],"summary":"Orbit Product Availability","description":"Matriz producto -> fuentes disponibles/limites.","operationId":"orbit_product_availability_v1_learning_product_availability_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Orbit Product Availability V1 Learning Product Availability Get"}}}}},"security":[{"APIKeyHeader":[]}]}},"/v1/learning/validated-zones":{"get":{"tags":["learning"],"summary":"Orbit Validated Zones","description":"Casos/zonas con evidencia validada y smoke tests Argentina/Brasil.","operationId":"orbit_validated_zones_v1_learning_validated_zones_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Orbit Validated Zones V1 Learning Validated Zones Get"}}}}},"security":[{"APIKeyHeader":[]}]}},"/v1/learning/orbit-readiness":{"get":{"tags":["learning"],"summary":"Orbit Readiness","description":"Compuertas operacionales reales de ORBIT para produccion/inversores.","operationId":"orbit_readiness_v1_learning_orbit_readiness_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Orbit Readiness V1 Learning Orbit Readiness Get"}}}}},"security":[{"APIKeyHeader":[]}]}},"/v1/learning/orbit-sellability":{"get":{"tags":["learning"],"summary":"Orbit Sellability","description":"Readiness comercial honesto: piloto vs venta enterprise.","operationId":"orbit_sellability_v1_learning_orbit_sellability_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Orbit Sellability V1 Learning Orbit Sellability Get"}}}}},"security":[{"APIKeyHeader":[]}]}},"/v1/learning/orbit-cases":{"get":{"tags":["learning"],"summary":"Orbit Cases","description":"Export de casos reales registrados para convertirlos en training/eval.","operationId":"orbit_cases_v1_learning_orbit_cases_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":200,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Orbit Cases V1 Learning Orbit Cases Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/learning/orbit-candidates":{"get":{"tags":["learning"],"summary":"Orbit Candidates","description":"Candidatos manuales para el evaluator permanente.","operationId":"orbit_candidates_v1_learning_orbit_candidates_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"status","in":"query","required":false,"schema":{"type":"string","pattern":"^(pending|approved|rejected)$","default":"pending","title":"Status"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":200,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Orbit Candidates V1 Learning Orbit Candidates Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["learning"],"summary":"Orbit Candidate Add","operationId":"orbit_candidate_add_v1_learning_orbit_candidates_post","security":[{"APIKeyHeader":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CandidateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Orbit Candidate Add V1 Learning Orbit Candidates Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/learning/orbit-candidates/{candidate_id}/review":{"post":{"tags":["learning"],"summary":"Orbit Candidate Review","operationId":"orbit_candidate_review_v1_learning_orbit_candidates__candidate_id__review_post","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"candidate_id","in":"path","required":true,"schema":{"type":"integer","title":"Candidate Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CandidateReviewRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Orbit Candidate Review V1 Learning Orbit Candidates  Candidate Id  Review Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/learning/orbit-eval-history":{"get":{"tags":["learning"],"summary":"Orbit Eval History","description":"Runs guardados por entrenamiento manual.","operationId":"orbit_eval_history_v1_learning_orbit_eval_history_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"default":30,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Orbit Eval History V1 Learning Orbit Eval History Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/learning/agents/{agent_id}/ml":{"get":{"tags":["learning"],"summary":"Agent Ml Status","operationId":"agent_ml_status_v1_learning_agents__agent_id__ml_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Agent Ml Status V1 Learning Agents  Agent Id  Ml Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/learning/agents/{agent_id}/ml/train":{"post":{"tags":["learning"],"summary":"Agent Ml Train","description":"Entrena un candidato bajo demanda; nunca lo activa automáticamente.","operationId":"agent_ml_train_v1_learning_agents__agent_id__ml_train_post","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentMLTrainRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Agent Ml Train V1 Learning Agents  Agent Id  Ml Train Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/learning/agents/{agent_id}/ml/promote":{"post":{"tags":["learning"],"summary":"Agent Ml Promote","description":"Promoción explícita luego de superar la evaluación.","operationId":"agent_ml_promote_v1_learning_agents__agent_id__ml_promote_post","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentMLPromoteRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Agent Ml Promote V1 Learning Agents  Agent Id  Ml Promote Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/learning/agents/{agent_id}/ml/predict":{"post":{"tags":["learning"],"summary":"Agent Ml Predict","description":"Inferencia inspeccionable del modelo activo o de una versión candidata.","operationId":"agent_ml_predict_v1_learning_agents__agent_id__ml_predict_post","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentMLPredictRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Agent Ml Predict V1 Learning Agents  Agent Id  Ml Predict Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/overpass":{"post":{"tags":["discovery"],"summary":"Overpass","description":"Estimated next-overpass windows over an AOI (revisit-cadence estimate).","operationId":"overpass_v1_overpass_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OverpassRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Overpass V1 Overpass Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]}]}},"/v1/geocode":{"get":{"tags":["discovery"],"summary":"Geocode Place","description":"Resolve a place name to a bounding box. Honest: reports not-found, never invents.","operationId":"geocode_place_v1_geocode_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":1,"maxLength":200,"description":"Place name, e.g. 'Pergamino'.","title":"Q"},"description":"Place name, e.g. 'Pergamino'."},{"name":"use_network","in":"query","required":false,"schema":{"type":"boolean","description":"Allow Nominatim online fallback for unknown places.","default":true,"title":"Use Network"},"description":"Allow Nominatim online fallback for unknown places."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Geocode Place V1 Geocode Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/jobs":{"post":{"tags":["jobs"],"summary":"Create Job","description":"Encola una corrida asíncrona del producto. 404 si el producto no existe.\n\nEl cliente de la API key queda grabado como dueño del job: es el único que va\na poder leerlo.\n\nContrato de resiliencia (portado de codex/consumer-evidence, 14/08):\n\n* ``Idempotency-Key`` (header, opcional): repetir el mismo pedido con la\n  misma clave devuelve el mismo ``job_id``; reusarla con un pedido distinto\n  responde **409**.\n* Cola saturada: **503** con ``Retry-After`` — nunca aceptar de más.","operationId":"create_job_v1_jobs_post","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Idempotency-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Create Job V1 Jobs Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/jobs/{job_id}":{"get":{"tags":["jobs"],"summary":"Get Job","description":"Registro del job (estado + resultado/error). 404 si no existe o es de otro.\n\n**404 y no 403**, a propósito: un 403 confirma que ese ``job_id`` existe, y\neso ya es una fuga —permite enumerar los trabajos de otros clientes aunque no\nse pueda leer su contenido—. La respuesta para un job ajeno es indistinguible\nde la de un job que no existe, incluido el texto del detalle.","operationId":"get_job_v1_jobs__job_id__get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Get Job V1 Jobs  Job Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/monitor/status":{"get":{"tags":["monitor"],"summary":"Monitor Status","description":"Live, verifiable 24/7 scheduler state (real timestamps, never simulated):\nrunning flag, last tick executed, tick interval, active-subscription count and\nthe most recent per-AOI satellite decisions the engine re-took each tick.\n\nPer-tenant detail is scoped to the caller; admin/bootstrap keys see the full\nview (see _key_prefix).","operationId":"monitor_status_v1_monitor_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Monitor Status V1 Monitor Status Get"}}}}},"security":[{"APIKeyHeader":[]}]}},"/v1/monitor/subscriptions":{"get":{"tags":["monitor"],"summary":"List Subs","description":"List the caller's subscriptions (all subscriptions for env/admin keys).","operationId":"list_subs_v1_monitor_subscriptions_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"active_only","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Active Only"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response List Subs V1 Monitor Subscriptions Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/monitor/subscriptions/{sub_id}":{"delete":{"tags":["monitor"],"summary":"Delete Sub","description":"Delete one subscription. Scoped to the owner when a portal key is used.","operationId":"delete_sub_v1_monitor_subscriptions__sub_id__delete","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"sub_id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"title":"Sub Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Delete Sub V1 Monitor Subscriptions  Sub Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/monitor/alerts":{"get":{"tags":["monitor"],"summary":"List Alerts","description":"Recent alerts for the caller's subscriptions (newest first).","operationId":"list_alerts_v1_monitor_alerts_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response List Alerts V1 Monitor Alerts Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/memory/series":{"get":{"tags":["memory"],"summary":"Memory Series","description":"Serie histórica YA medida para tu AOI (no sale a leer píxeles en vivo).\n\nDevuelve los puntos persistidos por el motor cada vez que midió este AOI +\nmétrica, ordenados por fecha de escena. Scoped por tu API key.","operationId":"memory_series_v1_memory_series_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"bbox","in":"query","required":true,"schema":{"type":"string","description":"oeste,sur,este,norte (WGS84) — AOI exacto.","title":"Bbox"},"description":"oeste,sur,este,norte (WGS84) — AOI exacto."},{"name":"metric","in":"query","required":true,"schema":{"type":"string","description":"Métrica/índice (p. ej. ndvi, ndmi).","title":"Metric"},"description":"Métrica/índice (p. ej. ndvi, ndmi)."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Solo escenas desde esta fecha ISO.","title":"Since"},"description":"Solo escenas desde esta fecha ISO."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Memory Series V1 Memory Series Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/memory/stats":{"get":{"tags":["memory"],"summary":"Memory Stats","description":"KPIs de la memoria de mediciones: total acumulado, mediciones por semana\n(últimas 12), zonas y AOIs cubiertos y conteo por métrica. Scoped por key.","operationId":"memory_stats_v1_memory_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Memory Stats V1 Memory Stats Get"}}}}},"security":[{"APIKeyHeader":[]}]}},"/v1/memory/coverage":{"get":{"tags":["memory"],"summary":"Memory Coverage","description":"Cobertura por celda geográfica (0.25°). ADMIN only: requiere una key sin\nprefijo (env/bootstrap). Con key de portal responde 403.","operationId":"memory_coverage_v1_memory_coverage_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Memory Coverage V1 Memory Coverage Get"}}}}},"security":[{"APIKeyHeader":[]}]}},"/v1/findings":{"get":{"tags":["autocompare"],"summary":"List Findings","description":"Hallazgos de la auto-comparación para el llamador (más nuevos primero).\nLas keys de env/admin ven todos los hallazgos; un portal-key ve solo los suyos.","operationId":"list_findings_v1_findings_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO-8601: solo hallazgos desde esta fecha.","title":"Since"},"description":"ISO-8601: solo hallazgos desde esta fecha."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response List Findings V1 Findings Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/findings/{finding_id}/feedback":{"post":{"tags":["autocompare"],"summary":"Finding Feedback","description":"Marca un hallazgo como útil / no útil (scoped al dueño).","operationId":"finding_feedback_v1_findings__finding_id__feedback_post","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"finding_id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"title":"Finding Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeedbackRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Finding Feedback V1 Findings  Finding Id  Feedback Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/findings/{finding_id}/images":{"get":{"tags":["autocompare"],"summary":"Finding Images","description":"Referencias de imagen antes/después del hallazgo (hrefs/preview URLs;\nnunca píxeles almacenados). Scoped al dueño.","operationId":"finding_images_v1_findings__finding_id__images_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"finding_id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"title":"Finding Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Finding Images V1 Findings  Finding Id  Images Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/autocompare/status":{"get":{"tags":["autocompare"],"summary":"Autocompare Status","description":"Estado vivo del subsistema (intervalo, presupuesto, último ciclo real,\nhallazgos abiertos). Detalle por tenant scoped; admin ve todo.","operationId":"autocompare_status_v1_autocompare_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Autocompare Status V1 Autocompare Status Get"}}}}},"security":[{"APIKeyHeader":[]}]}},"/v1/admin/autocompare/tick":{"post":{"tags":["autocompare"],"summary":"Admin Tick","description":"Fuerza un ciclo de auto-comparación ahora. Solo admin (key de env/sin\nprefijo); un portal-key recibe 403.","operationId":"admin_tick_v1_admin_autocompare_tick_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Admin Tick V1 Admin Autocompare Tick Post"}}}}},"security":[{"APIKeyHeader":[]}]}},"/v1/admin/calibrations":{"get":{"tags":["calibration"],"summary":"List Calibrations","description":"Lista calibraciones (más nuevas primero). Filtros opcionales por scope,\nparam y status.","operationId":"list_calibrations_v1_admin_calibrations_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scope"}},{"name":"param","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Param"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^(proposed|active|rolled_back)$"},{"type":"null"}],"title":"Status"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":2000,"minimum":1,"default":200,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response List Calibrations V1 Admin Calibrations Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/calibrations/{cal_id}/rollback":{"post":{"tags":["calibration"],"summary":"Rollback Calibration","description":"Rollback instantáneo de una calibración: pasa a ``rolled_back`` y reactiva\nla versión previa válida (si existe). Surte efecto en la próxima lectura.","operationId":"rollback_calibration_v1_admin_calibrations__cal_id__rollback_post","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"cal_id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"title":"Cal Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Rollback Calibration V1 Admin Calibrations  Cal Id  Rollback Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/proposals":{"get":{"tags":["proposals"],"summary":"List Proposals","description":"Lista propuestas (más nuevas primero). Filtros por status y kind.","operationId":"list_proposals_v1_admin_proposals_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^(open|applied|approved|rejected|expired)$"},{"type":"null"}],"title":"Status"}},{"name":"kind","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^(calibration|watch_zone|provider_degradation|code_issue)$"},{"type":"null"}],"title":"Kind"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":200,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response List Proposals V1 Admin Proposals Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/proposals/{proposal_id}/approve":{"post":{"tags":["proposals"],"summary":"Approve Proposal","description":"Aprueba una propuesta ``open`` y aplica su cambio de datos (reversible).\nUn ``code_issue`` se marca aprobado pero NUNCA se auto-aplica.","operationId":"approve_proposal_v1_admin_proposals__proposal_id__approve_post","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"proposal_id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"title":"Proposal Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Approve Proposal V1 Admin Proposals  Proposal Id  Approve Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/proposals/{proposal_id}/reject":{"post":{"tags":["proposals"],"summary":"Reject Proposal","description":"Rechaza una propuesta (queda ``rejected``, sin aplicarse).","operationId":"reject_proposal_v1_admin_proposals__proposal_id__reject_post","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"proposal_id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"title":"Proposal Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RejectRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Reject Proposal V1 Admin Proposals  Proposal Id  Reject Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/learning/run-cycle":{"post":{"tags":["proposals"],"summary":"Run Cycle","description":"Corre un ciclo de auto-calibración a demanda (normalmente semanal). Genera\ncandidatos de datos reales y los pasa por el gate. Nunca toca el repositorio.","operationId":"run_cycle_v1_admin_learning_run_cycle_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Run Cycle V1 Admin Learning Run Cycle Post"}}}}},"security":[{"APIKeyHeader":[]}]}},"/v1/learning/kpis":{"get":{"tags":["proposals"],"summary":"Learning Kpis","description":"KPIs del auto-aprendizaje (lectura): propuestas por estado, calibraciones\nactivas / rollbacks, y una lectura honesta de cobertura. Sin datos sensibles.","operationId":"learning_kpis_v1_learning_kpis_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Learning Kpis V1 Learning Kpis Get"}}}}},"security":[{"APIKeyHeader":[]}]}},"/v1/datasets/landcover":{"get":{"tags":["datasets"],"summary":"Get Landcover","description":"🌾 Cobertura de suelo dominante + composición (MapBiomas AR/BR, 30 m).","operationId":"get_landcover_v1_datasets_landcover_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"bbox","in":"query","required":true,"schema":{"type":"string","description":"Área 'oeste,sur,este,norte' (WGS84).","title":"Bbox"},"description":"Área 'oeste,sur,este,norte' (WGS84)."},{"name":"year","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Año 1985-2024 (default: el más reciente).","title":"Year"},"description":"Año 1985-2024 (default: el más reciente)."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/datasets/water-history":{"get":{"tags":["datasets"],"summary":"Get Water History","description":"💧 Superficie de agua anual (% del AOI + km²) — MapBiomas AR/BR, 30 m.\n\nCon ``baseline`` compara dos años (¿el embalse creció o se achicó?). La\ncolección mensual 'MapBiomas Água' requiere Google Earth Engine y aún no\nestá conectada; esto mide las clases de agua de la cobertura anual (real).","operationId":"get_water_history_v1_datasets_water_history_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"bbox","in":"query","required":true,"schema":{"type":"string","description":"Área 'oeste,sur,este,norte' (WGS84).","title":"Bbox"},"description":"Área 'oeste,sur,este,norte' (WGS84)."},{"name":"year","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Año 1985-2024 (default: el más reciente).","title":"Year"},"description":"Año 1985-2024 (default: el más reciente)."},{"name":"baseline","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Año base opcional para comparar (reservas hídricas / sequía).","title":"Baseline"},"description":"Año base opcional para comparar (reservas hídricas / sequía)."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/datasets/fire-history":{"get":{"tags":["datasets"],"summary":"Get Fire History","description":"🔥 Cicatriz de fuego anual (% del AOI quemado) — MapBiomas Brasil, 30 m.","operationId":"get_fire_history_v1_datasets_fire_history_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"bbox","in":"query","required":true,"schema":{"type":"string","description":"Área 'oeste,sur,este,norte' (WGS84).","title":"Bbox"},"description":"Área 'oeste,sur,este,norte' (WGS84)."},{"name":"year","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Año 1985-2024 (default: el más reciente).","title":"Year"},"description":"Año 1985-2024 (default: el más reciente)."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/datasets/climate":{"get":{"tags":["datasets"],"summary":"Get Climate","description":"🌡️ Clima diario (temp, lluvia, heladas) de un punto — NASA POWER.","operationId":"get_climate_v1_datasets_climate_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"lat","in":"query","required":true,"schema":{"type":"number","description":"Latitud WGS84.","title":"Lat"},"description":"Latitud WGS84."},{"name":"lon","in":"query","required":true,"schema":{"type":"number","description":"Longitud WGS84.","title":"Lon"},"description":"Longitud WGS84."},{"name":"start","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Inicio YYYYMMDD o YYYY-MM-DD.","title":"Start"},"description":"Inicio YYYYMMDD o YYYY-MM-DD."},{"name":"end","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Fin YYYYMMDD o YYYY-MM-DD.","title":"End"},"description":"Fin YYYYMMDD o YYYY-MM-DD."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/datasets/flood":{"get":{"tags":["datasets"],"summary":"Get Flood","description":"🌊 Nivel de río observado + pronóstico en la estación más cercana — INA (AR).","operationId":"get_flood_v1_datasets_flood_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"lat","in":"query","required":true,"schema":{"type":"number","description":"Latitud WGS84.","title":"Lat"},"description":"Latitud WGS84."},{"name":"lon","in":"query","required":true,"schema":{"type":"number","description":"Longitud WGS84.","title":"Lon"},"description":"Longitud WGS84."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/datasets/fires":{"get":{"tags":["datasets"],"summary":"Get Fires","description":"🛰️ Focos de calor: BR diario por bbox (INPE) o AR anual por provincia (SInIA).","operationId":"get_fires_v1_datasets_fires_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"country","in":"query","required":false,"schema":{"type":"string","description":"'BR' (INPE diario) o 'AR' (SInIA anual).","default":"BR","title":"Country"},"description":"'BR' (INPE diario) o 'AR' (SInIA anual)."},{"name":"bbox","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"BR: 'oeste,sur,este,norte' (WGS84).","title":"Bbox"},"description":"BR: 'oeste,sur,este,norte' (WGS84)."},{"name":"date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"BR: día YYYYMMDD (default: ayer).","title":"Date"},"description":"BR: día YYYYMMDD (default: ayer)."},{"name":"jurisdiction","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"AR: provincia (default: Total).","title":"Jurisdiction"},"description":"AR: provincia (default: Total)."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/landcover/status":{"get":{"tags":["landcover"],"summary":"Landcover Status","description":"Estado honesto del clasificador propio: qué clase se afirma y cuál no.","operationId":"landcover_status_v1_landcover_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Landcover Status V1 Landcover Status Get"}}}}},"security":[{"APIKeyHeader":[]}]}},"/v1/landcover/sources":{"get":{"tags":["landcover"],"summary":"Landcover Sources","description":"De dónde salen las etiquetas, qué rol cumple cada fuente y qué límites tiene.","operationId":"landcover_sources_v1_landcover_sources_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Landcover Sources V1 Landcover Sources Get"}}}}},"security":[{"APIKeyHeader":[]}]}},"/v1/landcover/classify":{"get":{"tags":["landcover"],"summary":"Landcover Classify","description":"Composición de cobertura de un AOI según nuestro clasificador.\n\nSepara siempre lo que afirmamos de lo que detectamos pero no afirmamos. Un\n``ok:false`` viene con la causa —sin modelo, sin habilitar, sin píxeles\nlimpios— y jamás con un porcentaje de relleno.","operationId":"landcover_classify_v1_landcover_classify_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"bbox","in":"query","required":true,"schema":{"type":"string","description":"oeste,sur,este,norte (WGS84)","title":"Bbox"},"description":"oeste,sur,este,norte (WGS84)"},{"name":"year","in":"query","required":false,"schema":{"type":"integer","description":"año a clasificar (por defecto, el anterior)","title":"Year"},"description":"año a clasificar (por defecto, el anterior)"},{"name":"max_cloud","in":"query","required":false,"schema":{"type":"number","maximum":100.0,"minimum":0.0,"default":30.0,"title":"Max Cloud"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Landcover Classify V1 Landcover Classify Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/landcover/labels":{"get":{"tags":["landcover"],"summary":"Landcover Labels Summary","description":"Conteos agregados de etiquetas propias. Sin geometrías ni identidades.\n\nEs lo único publicable: cuántas muestras propias tenemos por clase, que es\nel número que sostiene la confianza del producto y el que muestra cómo\navanza el círculo virtuoso. Ningún terreno es recuperable desde acá.","operationId":"landcover_labels_summary_v1_landcover_labels_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Landcover Labels Summary V1 Landcover Labels Get"}}}}},"security":[{"APIKeyHeader":[]}]},"post":{"tags":["landcover"],"summary":"Landcover Submit Labels","description":"El cliente declara qué hay en su terreno. Captura + curaduría + separación.\n\nCuerpo: un ``FeatureCollection`` GeoJSON; cada feature con geometría de\npolígono y propiedades ``cover`` (en las palabras del cliente),\n``observed_from`` y, opcional, ``observed_to`` y ``note``.\n\nLa respuesta trae qué se aceptó, qué quedó en cuarentena y, para lo\nrechazado, la pregunta exacta que hay que hacerle al cliente. Nunca se\ncompleta una cobertura que no se entendió.","operationId":"landcover_submit_labels_v1_landcover_labels_post","requestBody":{"content":{"application/json":{"schema":{"type":"object","title":"Payload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Landcover Submit Labels V1 Landcover Labels Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]}]}},"/v1/timeline":{"get":{"tags":["timeline"],"summary":"Timeline Capabilities","description":"Qué histórico hay DE VERDAD para esta zona, feature por feature.\n\nSin ``bbox`` devuelve el catálogo genérico + la profundidad de archivo\ndeclarada por backend. Con ``bbox`` resuelve la región (AR/BR) y marca qué\nfeatures tienen cobertura real ahí (ej.: cicatriz de fuego anual solo en BR).","operationId":"timeline_capabilities_v1_timeline_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"bbox","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"oeste,sur,este,norte (WGS84).","title":"Bbox"},"description":"oeste,sur,este,norte (WGS84)."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Timeline Capabilities V1 Timeline Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/timeline/timeseries":{"post":{"tags":["timeline"],"summary":"Timeline Timeseries","description":"Serie temporal de una feature sobre tu zona (AR/BR), con backend automático.","operationId":"timeline_timeseries_v1_timeline_timeseries_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__timeline__router__TimeseriesRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Timeline Timeseries V1 Timeline Timeseries Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]}]}},"/v1/timeline/compare":{"post":{"tags":["timeline"],"summary":"Timeline Compare","description":"Antes/después de una feature entre dos fechas o dos años, con delta honesto.","operationId":"timeline_compare_v1_timeline_compare_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__timeline__router__CompareRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Timeline Compare V1 Timeline Compare Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]}]}},"/v1/timeline/change":{"post":{"tags":["timeline"],"summary":"Timeline Change","description":"Detección + magnitud del cambio: veredicto (dirección/delta) + serie evidencia.","operationId":"timeline_change_v1_timeline_change_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__timeline__router__TimeseriesRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Timeline Change V1 Timeline Change Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]}]}},"/v1/risk":{"post":{"tags":["risk"],"summary":"Post Risk","description":"🔥🌊 Riesgo de incendio y/o inundación de una zona: score 0-100 + semáforo\n+ factores explicados con fuente y peso + confianza + disclaimer.","operationId":"post_risk_v1_risk_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RiskRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]}]}},"/v1/insar/capability":{"get":{"tags":["insar"],"summary":"Capability","operationId":"capability_v1_insar_capability_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Capability V1 Insar Capability Get"}}}}},"security":[{"APIKeyHeader":[]}]}},"/v1/insar":{"post":{"tags":["insar"],"summary":"Submit","operationId":"submit_v1_insar_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InsarRequest"}}},"required":true},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Submit V1 Insar Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]}]}},"/v1/insar/runs/{run_id}":{"get":{"tags":["insar"],"summary":"Run Status","operationId":"run_status_v1_insar_runs__run_id__get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"run_id","in":"path","required":true,"schema":{"type":"string","title":"Run Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Run Status V1 Insar Runs  Run Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/insar/jobs/{job_id}":{"get":{"tags":["insar"],"summary":"Job Status","operationId":"job_status_v1_insar_jobs__job_id__get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Job Status V1 Insar Jobs  Job Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/snap/processes":{"get":{"tags":["snap"],"summary":"List Processes","description":"Catálogo de procesos invocables con su madurez (``available`` / ``in_development``).","operationId":"list_processes_v1_snap_processes_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response List Processes V1 Snap Processes Get"}}}}},"security":[{"APIKeyHeader":[]}]}},"/v1/snap/jobs":{"post":{"tags":["snap"],"summary":"Create Job","description":"Encola un job SNAP. Sólo acepta procesos ``available`` del catálogo; un\nproceso desconocido o 'en desarrollo' se rechaza (422) — nunca se simula.","operationId":"create_job_v1_snap_jobs_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SnapJobCreate"}}},"required":true},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Create Job V1 Snap Jobs Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]}]}},"/v1/snap/jobs/{job_id}":{"get":{"tags":["snap"],"summary":"Get Job","description":"Estado del job. Cuando está ``done`` incluye ``result`` con la URL de\nlectura (firmada si R2 está configurado; passthrough si no).\n\nAutorización a nivel de OBJETO (QA GUARDIA 2026-07-24): el job se devuelve\nsólo a su dueño. ``enqueue`` guarda el ``client`` de la key que encoló; acá\nse compara contra el de la key que consulta. Un id ajeno responde 404 (no\n403: no se confirma la existencia de un recurso de otro cliente). Sin esto,\ncualquier key válida podía leer los ``params`` de cualquier job.","operationId":"get_job_v1_snap_jobs__job_id__get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Get Job V1 Snap Jobs  Job Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/snap/jobs/claim":{"post":{"tags":["snap-worker"],"summary":"Claim","description":"Toma ATÓMICAMENTE 1 job ``queued`` para el worker (o None si no hay). Antes\nre-encola los jobs con heartbeat vencido (rescate tras corte del worker).\n\nRespuesta con la forma ``Job`` del contrato: ``{\"job\": {job_id, proceso,\nparams, lease_seconds, attempt, upload, contract_version}}`` o ``{\"job\": null}``.","operationId":"claim_v1_snap_jobs_claim_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-worker-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Worker-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClaimRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Claim V1 Snap Jobs Claim Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/snap/jobs/{job_id}/heartbeat":{"post":{"tags":["snap-worker"],"summary":"Heartbeat","description":"Renueva el heartbeat (y pasa claimed→running en el primero).\n\nRespuesta con la forma ``HeartbeatReply`` del contrato:\n``{ok, cancel, lease_expires_at}``. ``cancel`` es siempre ``false``: todavía\nno existe cancelación de jobs — cuando exista, este es el canal por el que el\nworker se entera (no se inventa un true).","operationId":"heartbeat_v1_snap_jobs__job_id__heartbeat_post","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-worker-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Worker-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HeartbeatRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Heartbeat V1 Snap Jobs  Job Id  Heartbeat Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/snap/jobs/{job_id}/result":{"post":{"tags":["snap-worker"],"summary":"Report Result","description":"Cierra el job con los artefactos y el linaje reales.\n\nAcepta el vocabulario del contrato (``succeeded``/``failed``) y el interno\n(``done``/``error``). Responde ``{\"ok\": true}``.","operationId":"report_result_v1_snap_jobs__job_id__result_post","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-worker-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Worker-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResultRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Report Result V1 Snap Jobs  Job Id  Result Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/snap/jobs/{job_id}/upload-url":{"post":{"tags":["snap-worker"],"summary":"Upload Url","description":"(OPCIONAL del contrato) URL prefirmada de subida a R2 para el worker.\n\nRequiere las credenciales S3 de R2. Mientras no estén, responde 503 honesto y\nel worker usa su backend por defecto (el claim le manda ``upload: null``).","operationId":"upload_url_v1_snap_jobs__job_id__upload_url_post","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-worker-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Worker-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Upload Url V1 Snap Jobs  Job Id  Upload Url Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/validation/summary":{"get":{"tags":["validation"],"summary":"Validation Summary","description":"Acierto medido y publicable, agrupado por (check, métrica, tipo).\n\nEs la 'confianza vendible': en vez de afirmar que el dato es bueno, muestra\nel bias/RMSE (numérico) y la accuracy (etiqueta/binaria) MEDIDOS contra\nreferencias independientes. Sin muestras -> grupos vacíos, honesto.","operationId":"validation_summary_v1_validation_summary_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"check","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Check"}},{"name":"metric","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Metric"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Validation Summary V1 Validation Summary Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/validation/recent":{"get":{"tags":["validation"],"summary":"Validation Recent","description":"Últimas comparaciones de validación registradas (para inspección).","operationId":"validation_recent_v1_validation_recent_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"check","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Check"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Validation Recent V1 Validation Recent Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/validation/cross-sensor":{"post":{"tags":["validation"],"summary":"Validation Cross Sensor","description":"Corre el control HLSL30 vs HLSS30 sobre el AOI y registra los pares.\n\nVerifica con dato real que Landsat y Sentinel-2 armonizados (HLS) coinciden\nsobre la misma zona — la base de que el densificador de series (I-2) pueda\nmezclarlos. Devuelve RMSE/sesgo/% dentro de tolerancia.","operationId":"validation_cross_sensor_v1_validation_cross_sensor_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CrossSensorRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Validation Cross Sensor V1 Validation Cross Sensor Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]}]}},"/v1/crops":{"post":{"tags":["crops"],"summary":"Crops Recognize","description":"¿Qué se cultiva en esta zona? Reconocimiento honesto por zona.\n\nCruza (1) cobertura de suelo MapBiomas —¿es agrícola?—, (2) el Mapa Nacional\nde Cultivos de INTA —etiqueta de cultivo específico por campaña, Argentina— y\n(3) la firma temporal de NDVI —patrón de verano vs invierno—. Nunca afirma un\ncultivo sin sustento: si sólo hay cobertura agrícola genérica, responde\n\"agrícola, cultivo específico no determinado\". Devuelve confianza y fuentes.","operationId":"crops_recognize_v1_crops_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CropRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Crops Recognize V1 Crops Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/crops/campaign":{"post":{"tags":["crops"],"summary":"Crops Campaign","description":"Evolución del lote a lo largo de la campaña, con serie temporal de radar.\n\nConstruye la curva de Sentinel-1 (VV, VH, VH/VV, RVI) sobre la geometría\nEXACTA del lote usando solo pasadas de la misma órbita, detecta los puntos de\nquiebre que marcan las transiciones, deriva las fases (preparación, siembra\nacotada, emergencia, dosel, cosecha) con su ventana de incertidumbre real y\nclasifica el lote por COMPORTAMIENTO — nunca por especie, que exige verdad de\ncampo. Sin pasadas suficientes responde ``insufficient`` con la causa.","operationId":"crops_campaign_v1_crops_campaign_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CampaignRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Crops Campaign V1 Crops Campaign Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/crops/campaign/compare":{"post":{"tags":["crops"],"summary":"Crops Campaign Compare","description":"Compara el comportamiento del MISMO lote en varias campañas.\n\nCada campaña se mide con sus propias pasadas; las que no tienen serie\nsuficiente se declaran como tales y no se comparan contra un hueco.","operationId":"crops_campaign_compare_v1_crops_campaign_compare_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CampaignCompareRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Crops Campaign Compare V1 Crops Campaign Compare Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/crops/species-gate":{"get":{"tags":["crops"],"summary":"Crops Species Gate","description":"¿Hay verdad de campo suficiente para declarar ESPECIE? (hoy: no).\n\nDevuelve el conteo exacto de lotes etiquetados, qué falta para habilitarlo y\nlas fuentes candidatas para conseguir esas etiquetas. Barato: no lee píxeles.","operationId":"crops_species_gate_v1_crops_species_gate_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Crops Species Gate V1 Crops Species Gate Get"}}}}}}},"/v1/agro/crops":{"get":{"tags":["agro"],"summary":"Agro Crops","description":"Cultivos que el motor sabe evaluar hoy. Barato: no lee un solo píxel.\n\nLa lista sale de la tabla agronómica cargada (``app.agro.crops_db``), no de\nuna lista pegada: si un cultivo no tiene requerimientos edafoclimáticos\ncargados, no aparece y no se puede pedir.","operationId":"agro_crops_v1_agro_crops_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Agro Crops V1 Agro Crops Get"}}}}}}},"/v1/agro/suitability":{"post":{"tags":["agro"],"summary":"Agro Suitability","description":"Motor experimental interno, fuera del contrato comercial.\n\nSólo se habilita con flag de investigación y una API key administrativa de\nentorno. Sus salidas de aptitud, rinde, economía o veredicto no están\nautorizadas para consumidores ni constituyen una entrega comercial.","operationId":"agro_suitability_v1_agro_suitability_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuitabilityRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Agro Suitability V1 Agro Suitability Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/exports/png":{"post":{"tags":["exports"],"summary":"Export Png","description":"Run a product over an AOI and return a PNG report card.","operationId":"export_png_v1_exports_png_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExportRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]}]}},"/v1/exports/pdf":{"post":{"tags":["exports"],"summary":"Export Pdf","description":"Run a product over an AOI and return a one-page PDF report.","operationId":"export_pdf_v1_exports_pdf_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExportRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]}]}},"/v1/feedback":{"post":{"tags":["feedback"],"summary":"Submit Feedback","description":"Registra un voto. Asocia best-effort el prefijo de la API key que votó.","operationId":"submit_feedback_v1_feedback_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeedbackIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Submit Feedback V1 Feedback Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]}]}},"/v1/feedback/summary":{"get":{"tags":["feedback"],"summary":"Feedback Summary","description":"Conteos de votos ``{up, down, total}`` (global o por producto).","operationId":"feedback_summary_v1_feedback_summary_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"product_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filtra por producto.","title":"Product Id"},"description":"Filtra por producto."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Feedback Summary V1 Feedback Summary Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/history":{"get":{"tags":["history"],"summary":"History","description":"The needs this client has asked (what, where, which product, when).","operationId":"history_v1_history_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":100,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response History V1 History Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/history/profile":{"get":{"tags":["history"],"summary":"History Profile","description":"The learned preferences ORBITAL GRID uses to prioritize for this client.","operationId":"history_profile_v1_history_profile_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response History Profile V1 History Profile Get"}}}}},"security":[{"APIKeyHeader":[]}]}},"/v1/aoi/parse":{"post":{"tags":["aoi"],"summary":"Parse Aoi","description":"AOI intake para la API B2B (X-API-Key, wired en main.py).","operationId":"parse_aoi_v1_aoi_parse_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AOIResult"}}}}},"security":[{"APIKeyHeader":[]}]}},"/v1/exports/footprints":{"post":{"tags":["aoi"],"summary":"Export Footprints","description":"Export scene footprints as GeoJSON (default) or a zipped Shapefile.","operationId":"export_footprints_v1_exports_footprints_post","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"format","in":"query","required":false,"schema":{"type":"string","pattern":"^(geojson|shapefile)$","default":"geojson","title":"Format"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FootprintsRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/design/options":{"post":{"tags":["design"],"summary":"Design Options","description":"La IA PROPONE: combinaciones posibles con sus datos duros medidos.\n\nRead-only por contrato. Este endpoint no puede guardar nada — es la mitad \"propone\" de\nla regla del dueño. La otra mitad (\"el usuario decide\") vive en ``/v1/design/specs``,\ndetrás de otro scope.","operationId":"design_options_v1_design_options_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OptionsRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OptionsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]}]}},"/v1/design/revisit":{"post":{"tags":["design"],"summary":"Design Revisit","description":"Las DOS revisitas de una combinación, medidas sobre el AOI real.\n\nNunca una sola: ``revisit_of_answer`` es disponibilidad, ``revisit_of_same_measurement``\nes comparabilidad. Un banco compra la segunda (es la que permite detectar un cambio) y\ncasi siempre le venden la primera.","operationId":"design_revisit_v1_design_revisit_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RevisitRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RevisitPair"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]}]}},"/v1/design/preview":{"post":{"tags":["design"],"summary":"Design Preview","description":"Corre UNA combinación sobre el AOI de prueba y devuelve el resultado REAL.\n\nMismo motor y mismo gate que el consumo en producción: lo que ves acá es exactamente lo\nque vas a recibir por API. Un preview que corre por otro camino que el runtime es una\ndemo, y las demos mienten.","operationId":"design_preview_v1_design_preview_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreviewRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]}]}},"/v1/design/compare":{"post":{"tags":["design"],"summary":"Design Compare","description":"2-5 combinaciones lado a lado. Sin ranking: los números al lado, la decisión al humano.","operationId":"design_compare_v1_design_compare_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__design__router__CompareRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Design Compare V1 Design Compare Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]}]}},"/v1/design/specs":{"get":{"tags":["design"],"summary":"List Specs","operationId":"list_specs_v1_design_specs_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response List Specs V1 Design Specs Get"}}}}},"security":[{"APIKeyHeader":[]}]},"post":{"tags":["design"],"summary":"Save Spec","description":"EL USUARIO DECIDE: guarda el producto diseñado (draft, v1).\n\nRequiere scope ``design.write``, que el copiloto de IA **no tiene**. Esta ruta sólo se\nalcanza con una acción explícita del usuario.","operationId":"save_spec_v1_design_specs_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SaveSpecRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Save Spec V1 Design Specs Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]}]}},"/v1/design/specs/{product_id}/publish":{"post":{"tags":["design"],"summary":"Publish Spec","description":"Congela y versiona: ``version + 1``, status ``published``, consumible por API.\n\nLas versiones anteriores siguen sirviendo intactas. Un banco no puede tolerar que la\ndefinición de su producto cambie bajo sus pies entre dos consultas.","operationId":"publish_spec_v1_design_specs__product_id__publish_post","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"product_id","in":"path","required":true,"schema":{"type":"string","title":"Product Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SaveSpecRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Publish Spec V1 Design Specs  Product Id  Publish Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/design/specs/{product_id}":{"get":{"tags":["design"],"summary":"Get Spec","operationId":"get_spec_v1_design_specs__product_id__get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"product_id","in":"path","required":true,"schema":{"type":"string","title":"Product Id"}},{"name":"version","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Version"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Get Spec V1 Design Specs  Product Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/run":{"post":{"tags":["design"],"summary":"Run","description":"El consumo. Tres parámetros y nada más.\n\n    1. credencial   → header ``X-API-Key``\n    2. product_id   → body (versión pineable: ``pd_7f3a91c2@3``)\n    3. coordinates  → body\n\nSin fechas, sin satélites, sin bandas: todo eso está congelado en la spec que el cliente\ndiseñó. Ese es el punto entero del Modo Diseño.\n\nLa respuesta **nunca afirma**: entrega lo observado y —sólo si el gate lo autoriza— una\nprobabilidad anclada a la fecha y hora exacta de la pasada del satélite.","operationId":"run_v1_run_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]}]}},"/me/aoi/parse":{"post":{"tags":["aoi-platform"],"summary":"Parse Aoi Session","description":"AOI intake para usuarios logueados de la plataforma (widget de /app).\n\nrequire_user lanza 401 si no hay sesión válida (misma regla que /me/ask).","operationId":"parse_aoi_session_me_aoi_parse_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AOIResult"}}}}}}},"/me/chat":{"post":{"tags":["assistant"],"summary":"Chat","description":"Un turno de conversación con ORBIT (ver módulo orchestrator).","operationId":"chat_me_chat_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Chat Me Chat Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/me/chat/stream":{"post":{"tags":["assistant"],"summary":"Chat Stream","description":"Turno de chat con streaming SSE (#14): eventos en vivo, cero espera en blanco.\n\nEventos (SSE ``event:``/``data:`` con JSON):\n  status  {text, text_en}       etapas reales del pipeline mientras corre\n  chunk   {text}                el texto final YA VALIDADO, en trozos\n  done    {…contrato completo}  la misma respuesta que /me/chat (map, zone…)\n  error   {status, detail}      fallo honesto (auth/rate/interno)\n\nEl pipeline y su validación de grounding corren COMPLETOS antes de emitir\n``chunk``: se streamea entrega progresiva del texto validado, nunca tokens\nsin verificar (regla de oro intacta). Auth y rate-limit: los mismos de\n/me/chat (corre el mismo handler por dentro).","operationId":"chat_stream_me_chat_stream_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/me/report/terrain":{"post":{"tags":["assistant"],"summary":"Report Terrain","description":"Genera y descarga el REPORTE DE TERRENO (PDF) de la zona seleccionada.","operationId":"report_terrain_me_report_terrain_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReportRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/me/chat/history":{"delete":{"tags":["assistant"],"summary":"Chat History Clear","description":"Borra el historial de chat DEL PROPIO usuario (pedido del dueño\n2026-07-11). Scoped por sesión (default-deny): solo sus mensajes; no toca\ncuenta, roles ni permisos. Con ``conversation_id`` borra solo ese hilo.","operationId":"chat_history_clear_me_chat_history_delete","parameters":[{"name":"conversation_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Conversation Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Chat History Clear Me Chat History Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["assistant"],"summary":"Chat History","description":"Restaura el hilo del usuario (para que la conversación siga al recargar).","operationId":"chat_history_me_chat_history_get","parameters":[{"name":"conversation_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Conversation Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":40,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Chat History Me Chat History Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/me/chat/conversations":{"get":{"tags":["assistant"],"summary":"Chat Conversations","description":"Lista las conversaciones del usuario para el navegador de historial\n(más reciente primero). Scoped por sesión (default-deny): solo las propias.\n\nConstruido sobre el store real del chat (``chat_messages``, donde escribe\n``/me/chat``), no sobre un store paralelo — una sola fuente de verdad.","operationId":"chat_conversations_me_chat_conversations_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":30,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Chat Conversations Me Chat Conversations Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/web/orbit-guide":{"post":{"tags":["orbit-guide"],"summary":"Orbit Guide","description":"Guía pública de la vidriera. Informativo únicamente; sin datos ni\npipeline (este endpoint no tiene NINGÚN acceso al motor de consultas).","operationId":"orbit_guide_web_orbit_guide_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GuideRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Orbit Guide Web Orbit Guide Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/web/lead":{"post":{"tags":["orbit-guide"],"summary":"Web Lead","description":"Guarda consulta + mail + teléfono de un posible cliente. El registro\nqueda en la tabla ``leads`` (Postgres en prod) y se lee SOLO desde el\npanel de superadmin. Respuesta mínima a propósito: jamás refleja los\ndatos recibidos ni revela si el email ya existía.","operationId":"web_lead_web_lead_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LeadRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Web Lead Web Lead Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/conversations":{"get":{"tags":["conversations"],"summary":"List Conversations","description":"Historial (metadata) del usuario logueado, más reciente primero.","operationId":"list_conversations_api_conversations_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response List Conversations Api Conversations Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["conversations"],"summary":"Create Conversation","description":"Guarda la conversación actual del chat. Deriva ``summary`` (y ``title`` si\nfalta) del primer mensaje de usuario cuando no vienen dados.","operationId":"create_conversation_api_conversations_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConversationCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Create Conversation Api Conversations Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/conversations/{conv_id}":{"get":{"tags":["conversations"],"summary":"Get Conversation","description":"Recupera una conversación (con sus mensajes). 404 si no existe o no es del\nusuario logueado — nunca revela la existencia de conversaciones ajenas.","operationId":"get_conversation_api_conversations__conv_id__get","parameters":[{"name":"conv_id","in":"path","required":true,"schema":{"type":"integer","title":"Conv Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Get Conversation Api Conversations  Conv Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["conversations"],"summary":"Delete Conversation","description":"Elimina una conversación del usuario logueado (verifica ownership dentro\nde la query). 404 si no existe o es de otro usuario; 204 si se borró.","operationId":"delete_conversation_api_conversations__conv_id__delete","parameters":[{"name":"conv_id","in":"path","required":true,"schema":{"type":"integer","title":"Conv Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/me/areas":{"get":{"tags":["areas"],"summary":"List Areas","description":"Áreas guardadas del usuario logueado, más recientemente actualizada primero.","operationId":"list_areas_me_areas_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response List Areas Me Areas Get"}}}}}},"post":{"tags":["areas"],"summary":"Create Area","description":"Guarda un área nueva. Valida nombre, cuota (máx 50) y geometría con el\nparser AOI. Contenido inválido -> 200 {ok:false, error}.","operationId":"create_area_me_areas_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AreaCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Create Area Me Areas Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/me/areas/{area_id}":{"patch":{"tags":["areas"],"summary":"Rename Area","description":"Renombra un área propia. 404 si no existe o es de otro usuario; nombre\ninválido -> 200 {ok:false, error}.","operationId":"rename_area_me_areas__area_id__patch","parameters":[{"name":"area_id","in":"path","required":true,"schema":{"type":"string","title":"Area Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AreaRename"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Rename Area Me Areas  Area Id  Patch"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["areas"],"summary":"Delete Area","description":"Borra un área propia. 404 si no existe o es de otro usuario.","operationId":"delete_area_me_areas__area_id__delete","parameters":[{"name":"area_id","in":"path","required":true,"schema":{"type":"string","title":"Area Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Delete Area Me Areas  Area Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/me/prefs":{"get":{"tags":["areas"],"summary":"Get Prefs","description":"Preferencias del usuario (defaults {dark, 1.0, es} si no guardó ninguna).","operationId":"get_prefs_me_prefs_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Get Prefs Me Prefs Get"}}}}}},"put":{"tags":["areas"],"summary":"Update Prefs","description":"Update parcial de preferencias (solo los campos enviados). Valor inválido\n-> 200 {ok:false, error}.","operationId":"update_prefs_me_prefs_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrefsUpdate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Update Prefs Me Prefs Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/me/zone-request":{"post":{"tags":["zone-requests"],"summary":"Create Zone Request","description":"Registra el pedido de procesamiento de una zona del usuario logueado.","operationId":"create_zone_request_me_zone_request_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ZoneRequestIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Create Zone Request Me Zone Request Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/me/zone-features":{"post":{"tags":["platform"],"summary":"Post Zone Features","description":"Burbujas de stats por viewport para la exploración tipo Google Maps.\n\nAuth por sesión de usuario (cookie ``og_session``; 401 si no hay). Rate limit\npor usuario. Devuelve una grilla de celdas con valor real + semáforo, o un\n``ok:false`` honesto (zona demasiado grande, sin imágenes, timeout).","operationId":"post_zone_features_me_zone_features_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ZoneFeaturesRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Post Zone Features Me Zone Features Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/me/viewport-features":{"post":{"tags":["platform"],"summary":"Post Viewport Features","description":"Burbujas ricas por viewport para la exploración tipo Google Maps.\n\nAuth por sesión (cookie ``og_session``; 401 si no hay). Rate limit por\nusuario. Devuelve burbujas con stats reales por punto + fuego/sembrado del\nviewport, o un ``ok:false`` honesto (zona demasiado grande, sin datos).","operationId":"post_viewport_features_me_viewport_features_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ViewportFeaturesRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Post Viewport Features Me Viewport Features Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/me/viewport-cells":{"post":{"tags":["viewport-cells"],"summary":"Viewport Cells","description":"Celdas LOD del viewport ∩ AOI en NDJSON incremental (ver módulo).","operationId":"viewport_cells_me_viewport_cells_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CellsRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/me/geocode":{"get":{"tags":["platform"],"summary":"Geocode Suggest","description":"Autocompletado de lugares para el buscador del mapa (sesión requerida).","operationId":"geocode_suggest_me_geocode_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string","maxLength":120,"default":"","title":"Q"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":10,"minimum":1,"default":6,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Geocode Suggest Me Geocode Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/me/scene-tiles/{z}/{x}/{y}.png":{"get":{"tags":["scene-tiles"],"summary":"Scene Tile","description":"Tile WebMercator 256px true-color real del asset 'visual' de una escena.\n\nAuth por sesión (401 sin login). Zoom 6-16. Rate limit por usuario. SSRF gate\nsobre 'url'. Fuera del footprint -> PNG transparente; asset sin color -> 422;\ntimeout -> 504. Nunca una imagen de relleno.","operationId":"scene_tile_me_scene_tiles__z___x___y__png_get","parameters":[{"name":"z","in":"path","required":true,"schema":{"type":"integer","title":"Z"}},{"name":"x","in":"path","required":true,"schema":{"type":"integer","title":"X"}},{"name":"y","in":"path","required":true,"schema":{"type":"integer","title":"Y"}},{"name":"url","in":"query","required":true,"schema":{"type":"string","description":"Href del asset COG 'visual' (TCI RGB uint8) de la escena.","title":"Url"},"description":"Href del asset COG 'visual' (TCI RGB uint8) de la escena."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/mcp":{"post":{"tags":["mcp"],"summary":"Mcp Endpoint","description":"Endpoint MCP (streamable HTTP, JSON-RPC 2.0). Ver app/mcp/server.py.","operationId":"mcp_endpoint_mcp_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/fires":{"get":{"tags":["fires"],"summary":"Get Fires","description":"Focos de calor activos dentro de ``bbox`` como GeoJSON FeatureCollection.","operationId":"get_fires_v1_fires_get","parameters":[{"name":"bbox","in":"query","required":true,"schema":{"type":"string","description":"Área 'oeste,sur,este,norte' (WGS84).","title":"Bbox"},"description":"Área 'oeste,sur,este,norte' (WGS84)."},{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":5,"minimum":1,"description":"Ventana hacia atrás en días (1..5). Def: 1. NASA FIRMS rechaza rangos mayores (límite real del upstream).","default":1,"title":"Days"},"description":"Ventana hacia atrás en días (1..5). Def: 1. NASA FIRMS rechaza rangos mayores (límite real del upstream)."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/layers/water":{"get":{"tags":["layers"],"summary":"Get Water","description":"💧 Agua superficial / inundación (Sentinel-1 RTC) como GeoJSON.","operationId":"get_water_v1_layers_water_get","parameters":[{"name":"bbox","in":"query","required":true,"schema":{"type":"string","description":"Área 'oeste,sur,este,norte' (WGS84).","title":"Bbox"},"description":"Área 'oeste,sur,este,norte' (WGS84)."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["layers"],"summary":"Post Water","description":"💧 Agua sobre un terreno (geometry) o bbox — GeoJSON scoped.","operationId":"post_water_v1_layers_water_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LayerBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/layers/vigor":{"get":{"tags":["layers"],"summary":"Get Vigor","description":"🌱 Vigor de vegetación / cultivos (NDVI Sentinel-2, 4 clases) como GeoJSON.","operationId":"get_vigor_v1_layers_vigor_get","parameters":[{"name":"bbox","in":"query","required":true,"schema":{"type":"string","description":"Área 'oeste,sur,este,norte' (WGS84).","title":"Bbox"},"description":"Área 'oeste,sur,este,norte' (WGS84)."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["layers"],"summary":"Post Vigor","description":"🌱 Vigor sobre un terreno (geometry) o bbox — GeoJSON scoped.","operationId":"post_vigor_v1_layers_vigor_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LayerBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/layers/minerals":{"get":{"tags":["layers"],"summary":"Get Minerals","description":"⛏️ Anomalías minerales sobre roca expuesta (ratios Sentinel-2) como GeoJSON.","operationId":"get_minerals_v1_layers_minerals_get","parameters":[{"name":"bbox","in":"query","required":true,"schema":{"type":"string","description":"Área 'oeste,sur,este,norte' (WGS84).","title":"Bbox"},"description":"Área 'oeste,sur,este,norte' (WGS84)."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["layers"],"summary":"Post Minerals","description":"⛏️ Minerales sobre un terreno (geometry) o bbox — GeoJSON scoped.","operationId":"post_minerals_v1_layers_minerals_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LayerBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/layers/unified":{"post":{"tags":["layers"],"summary":"Post Layer Unified","description":"🗺️ Capa unificada de un dominio (minerals|crops|water|fires) sobre un\nterreno (geometry) o bbox: qué + dónde + cuánto por clase + narración.","operationId":"post_layer_unified_v1_layers_unified_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnifiedLayerBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["layers"],"summary":"Get Layer Unified","description":"🗺️ Capa unificada por bbox (GET same-origin).","operationId":"get_layer_unified_v1_layers_unified_get","parameters":[{"name":"domain","in":"query","required":true,"schema":{"type":"string","description":"minerals | crops | water | fires","title":"Domain"},"description":"minerals | crops | water | fires"},{"name":"bbox","in":"query","required":true,"schema":{"type":"string","description":"Área 'oeste,sur,este,norte' (WGS84).","title":"Bbox"},"description":"Área 'oeste,sur,este,norte' (WGS84)."},{"name":"lang","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"es | en | pt (opcional).","title":"Lang"},"description":"es | en | pt (opcional)."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/layers/risk":{"post":{"tags":["layers"],"summary":"Post Layer Risk","description":"🔥🌊 Riesgo de incendio/inundación de un terreno (geometry) o zona: score\n0-100 + semáforo + factores con fuente + confianza + disclaimer. Proxy\nsame-origin del motor ``app.risk`` para el mapa de ``/app`` (sesión, sin key).","operationId":"post_layer_risk_v1_layers_risk_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RiskLayerBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["layers"],"summary":"Get Layer Risk","description":"🔥🌊 Riesgo de una zona por bbox (GET same-origin).","operationId":"get_layer_risk_v1_layers_risk_get","parameters":[{"name":"bbox","in":"query","required":true,"schema":{"type":"string","description":"Área 'oeste,sur,este,norte' (WGS84).","title":"Bbox"},"description":"Área 'oeste,sur,este,norte' (WGS84)."},{"name":"hazard","in":"query","required":false,"schema":{"type":"string","description":"fire | flood | both","default":"both","title":"Hazard"},"description":"fire | flood | both"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/layers/crops":{"post":{"tags":["layers"],"summary":"Post Layer Crops","description":"🌱 ¿Qué se cultiva en un terreno (geometry) o zona? Proxy same-origin del\nmotor ``app.crops`` para el mapa de ``/app`` (sesión, sin API key).","operationId":"post_layer_crops_v1_layers_crops_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CropsLayerBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["layers"],"summary":"Get Layer Crops","description":"🌱 Reconocimiento de cultivo por bbox (GET same-origin).","operationId":"get_layer_crops_v1_layers_crops_get","parameters":[{"name":"bbox","in":"query","required":true,"schema":{"type":"string","description":"Área 'oeste,sur,este,norte' (WGS84).","title":"Bbox"},"description":"Área 'oeste,sur,este,norte' (WGS84)."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/portal/signup":{"post":{"tags":["portal"],"summary":"Crear una API key (self-service)","description":"Alta self-service: devuelve la API key EN CLARO una única vez.\n\nEn la base solo queda el SHA-256 de la key: si se pierde, se crea otra.\nDESHABILITADO por defecto (gate del dueño): responde 403 y orienta al\nflujo de solicitud. La defensa es server-side — ocultar el botón no basta.","operationId":"signup_v1_portal_signup_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignupRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Signup V1 Portal Signup Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/portal/keys/revoke":{"post":{"tags":["portal"],"summary":"Revocar la propia API key","description":"Revoca la key con la que se autentica este mismo request.","operationId":"revoke_key_v1_portal_keys_revoke_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Revoke Key V1 Portal Keys Revoke Post"}}}}},"security":[{"APIKeyHeader":[]}]}},"/v1/portal/keys/rotate":{"post":{"tags":["portal"],"summary":"Rotar la propia API key","description":"Rotación en un paso: emite una key NUEVA (mismo nombre/email/plan) y\nrevoca la actual. La key nueva se muestra EN CLARO una única vez.\n\nOrden deliberado: primero se crea la nueva y recién entonces se revoca la\nvieja — si la creación falla, la key vigente sigue funcionando (nunca se\ndeja al cliente sin acceso).","operationId":"rotate_key_v1_portal_keys_rotate_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Rotate Key V1 Portal Keys Rotate Post"}}}}},"security":[{"APIKeyHeader":[]}]}},"/v1/account":{"get":{"tags":["portal"],"summary":"Info de la API key autenticada","operationId":"account_v1_account_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Account V1 Account Get"}}}}},"security":[{"APIKeyHeader":[]}]}},"/v1/account/usage":{"get":{"tags":["portal"],"summary":"Uso de la API key (billing-ready)","description":"Contadores por día y por endpoint (últimos 30 días). SIN precios.","operationId":"account_usage_v1_account_usage_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Account Usage V1 Account Usage Get"}}}}},"security":[{"APIKeyHeader":[]}]}},"/v1/boundaries/levels":{"get":{"tags":["boundaries"],"summary":"Levels","operationId":"levels_v1_boundaries_levels_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"country","in":"query","required":true,"schema":{"type":"string","maxLength":100,"title":"Country"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Levels V1 Boundaries Levels Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/boundaries/admin/units":{"get":{"tags":["boundaries"],"summary":"Units","operationId":"units_v1_boundaries_admin_units_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"country","in":"query","required":true,"schema":{"type":"string","maxLength":100,"title":"Country"}},{"name":"level","in":"query","required":true,"schema":{"type":"string","maxLength":8,"title":"Level"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Units V1 Boundaries Admin Units Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/boundaries/admin":{"post":{"tags":["boundaries"],"summary":"Admin","operationId":"admin_v1_boundaries_admin_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Admin V1 Boundaries Admin Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]}]}},"/v1/boundaries/parcel":{"post":{"tags":["boundaries"],"summary":"Parcel","operationId":"parcel_v1_boundaries_parcel_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ParcelRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Parcel V1 Boundaries Parcel Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]}]}},"/v1/boundaries/clip":{"post":{"tags":["boundaries"],"summary":"Clip","operationId":"clip_v1_boundaries_clip_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClipRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Clip V1 Boundaries Clip Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]}]}},"/me/boundaries/levels":{"get":{"tags":["boundaries-platform"],"summary":"Levels Session","operationId":"levels_session_me_boundaries_levels_get","parameters":[{"name":"country","in":"query","required":true,"schema":{"type":"string","maxLength":100,"title":"Country"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Levels Session Me Boundaries Levels Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/me/boundaries/admin/units":{"get":{"tags":["boundaries-platform"],"summary":"Units Session","operationId":"units_session_me_boundaries_admin_units_get","parameters":[{"name":"country","in":"query","required":true,"schema":{"type":"string","maxLength":100,"title":"Country"}},{"name":"level","in":"query","required":true,"schema":{"type":"string","maxLength":8,"title":"Level"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Units Session Me Boundaries Admin Units Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/me/boundaries/admin":{"post":{"tags":["boundaries-platform"],"summary":"Admin Session","operationId":"admin_session_me_boundaries_admin_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Admin Session Me Boundaries Admin Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/me/boundaries/parcel":{"post":{"tags":["boundaries-platform"],"summary":"Parcel Session","operationId":"parcel_session_me_boundaries_parcel_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ParcelRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Parcel Session Me Boundaries Parcel Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/me/boundaries/clip":{"post":{"tags":["boundaries-platform"],"summary":"Clip Session","operationId":"clip_session_me_boundaries_clip_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClipRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Clip Session Me Boundaries Clip Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api":{"get":{"tags":["meta"],"summary":"Root","description":"Machine-readable service info. The human web front door lives at GET /.","operationId":"root_api_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Root Api Get"}}}}}}},"/livez":{"get":{"tags":["meta"],"summary":"Livez","description":"Liveness barato: sólo demuestra que el proceso HTTP responde.","operationId":"livez_livez_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Livez Livez Get"}}}}}}},"/readyz":{"get":{"tags":["meta"],"summary":"Readyz","description":"Readiness fail-closed para configuración, persistencia y assets críticos.","operationId":"readyz_readyz_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/health":{"get":{"tags":["meta"],"summary":"Health","description":"Observabilidad de upstreams; no se usa como liveness ni readiness.","operationId":"health_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Health Health Get"}}}}}}},"/v1/satellites":{"get":{"tags":["registry"],"summary":"List Satellites","operationId":"list_satellites_v1_satellites_get","parameters":[{"name":"data_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by data type. An invalid value returns 422, never an empty list with HTTP 200.","enum":["altimetry","atmospheric","elevation","multispectral","optical","sar","thermal"],"title":"Data Type"},"description":"Filter by data type. An invalid value returns 422, never an empty list with HTTP 200."},{"name":"access","in":"query","required":false,"schema":{"anyOf":[{"enum":["live","requires_credential","pending_agreement"],"type":"string"},{"type":"null"}],"description":"Filter by access: live, requires_credential or pending_agreement. Only live sources are routable.","title":"Access"},"description":"Filter by access: live, requires_credential or pending_agreement. Only live sources are routable."},{"name":"cost_tier","in":"query","required":false,"schema":{"anyOf":[{"enum":["free","commercial"],"type":"string"},{"type":"null"}],"description":"Filter by cost: free | commercial.","title":"Cost Tier"},"description":"Filter by cost: free | commercial."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response List Satellites V1 Satellites Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/imagery/search":{"post":{"tags":["imagery"],"summary":"Imagery Search","description":"Search imagery across all satellites. The engine picks the best and auto-switches.","operationId":"imagery_search_v1_imagery_search_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImagerySearchRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]}]}},"/v1/intent":{"post":{"tags":["intent"],"summary":"Intent","description":"Natural-language business intent → structured params → routed satellite.\n\nSend a Spanish business question (e.g. *\"humedad de mis campos de soja en\nPergamino en la última semana\"*). The intelligence layer infers the AOI,\ndata type, indices (NDVI/NDWI/NBR/SAR), cloud tolerance, time window and\npriority, then calls the existing routing engine and explains — in Spanish —\nwhat it understood and why it picked that satellite/source. Works with a\ndeterministic rule-based parser; a local Ollama LLM refines it when\navailable (its output is validated, never trusted blindly). ``lang``\n(\"es\"|\"en\", default \"es\") selects the language of the interpretation and\nexplanation; ``answer_es``/``answer_en`` always come in both languages.","operationId":"intent_v1_intent_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntentRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntentResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]}]}}},"components":{"schemas":{"AOIResult":{"properties":{"ok":{"type":"boolean","title":"Ok"},"geometry":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Geometry"},"bbox":{"anyOf":[{"items":{"type":"number"},"type":"array"},{"type":"null"}],"title":"Bbox"},"area_km2":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Area Km2"},"vertex_count":{"type":"integer","title":"Vertex Count","default":0},"simplified":{"type":"boolean","title":"Simplified","default":false},"source_format":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Format"},"notes":{"items":{"type":"string"},"type":"array","title":"Notes"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},"type":"object","required":["ok"],"title":"AOIResult","description":"Normalized parse result (the API response body for /v1/aoi/parse)."},"AdminRequest":{"properties":{"country":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Country"},"level":{"anyOf":[{"type":"string","maxLength":8},{"type":"null"}],"title":"Level"},"name":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Name"},"query":{"anyOf":[{"type":"string","maxLength":300},{"type":"null"}],"title":"Query"},"lat":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Lat"},"lon":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Lon"},"simplified":{"type":"boolean","title":"Simplified","default":true}},"type":"object","title":"AdminRequest"},"AdminUserCreate":{"properties":{"name":{"type":"string","maxLength":120,"minLength":1,"title":"Name"},"email":{"type":"string","maxLength":254,"minLength":3,"title":"Email"},"password":{"type":"string","maxLength":200,"minLength":8,"title":"Password"},"role":{"type":"string","maxLength":40,"minLength":2,"title":"Role"}},"type":"object","required":["name","email","password","role"],"title":"AdminUserCreate"},"AdminUserPatch":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":120,"minLength":1},{"type":"null"}],"title":"Name"},"email":{"anyOf":[{"type":"string","maxLength":254,"minLength":3},{"type":"null"}],"title":"Email"},"role":{"anyOf":[{"type":"string","maxLength":40,"minLength":2},{"type":"null"}],"title":"Role"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"must_change_password":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Must Change Password"},"email_verified":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Email Verified"}},"type":"object","title":"AdminUserPatch"},"AgentAnswer":{"properties":{"status":{"type":"string","enum":["delivered","no_data","unavailable","requires_credential"],"title":"Status"},"answer":{"type":"string","title":"Answer"},"semaphore":{"type":"string","enum":["verde","amarillo","rojo"],"title":"Semaphore"},"confidence":{"type":"object","title":"Confidence","default":{}},"provenance":{"type":"object","title":"Provenance","default":{}},"technical_detail":{"type":"object","title":"Technical Detail","default":{}}},"type":"object","required":["status","answer","semaphore"],"title":"AgentAnswer","description":"Respuesta del agente — contrato congelado (el portal de NOVA lo consume)."},"AgentAskRequest":{"properties":{"question":{"type":"string","maxLength":1000,"minLength":3,"title":"Question","description":"Qué necesitás saber, en tus palabras."},"lat":{"anyOf":[{"type":"number","maximum":90.0,"minimum":-90.0},{"type":"null"}],"title":"Lat"},"lon":{"anyOf":[{"type":"number","maximum":180.0,"minimum":-180.0},{"type":"null"}],"title":"Lon"},"lang":{"type":"string","enum":["es","en","pt"],"title":"Lang","default":"es"},"buffer_km":{"type":"number","maximum":50.0,"exclusiveMinimum":0.0,"title":"Buffer Km","description":"Radio del área alrededor del punto (opcional).","default":5.0},"bbox":{"anyOf":[{"items":{"type":"number"},"type":"array"},{"type":"null"}],"title":"Bbox","description":"Zona explícita [oeste, sur, este, norte] en grados WGS84 (alternativa al punto; p. ej. la envolvente de un AOI subido)."},"geometry":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Geometry","description":"Terreno exacto como GeoJSON Polygon/MultiPolygon. Si viene, reemplaza el bbox/punto como AOI en todo el pipeline."}},"type":"object","required":["question"],"title":"AgentAskRequest","description":"Pregunta libre + zona. El agente decide producto y satélites.\n\nLa zona se define de UNA de tres maneras (extensión aditiva; el contrato\noriginal punto+buffer y el bbox siguen funcionando igual):\n  * ``lat`` + ``lon`` (+ ``buffer_km`` opcional) — punto con radio, o\n  * ``bbox`` [oeste, sur, este, norte] WGS84 — p. ej. la envolvente de un\n    AOI subido por archivo (KML/GeoJSON/Shapefile...) vía /v1/aoi/parse, o\n  * ``geometry`` — un GeoJSON Polygon/MultiPolygon del TERRENO exacto. Cuando\n    viene, REEMPLAZA el bbox derivado del punto como AOI en todo el pipeline\n    (productos, píxeles zonales y radar). ``lat``/``lon`` quedan opcionales\n    solo para georreferencia."},"AgentMLExample":{"properties":{"text":{"type":"string","maxLength":1000,"minLength":2,"title":"Text"},"label":{"type":"string","maxLength":80,"minLength":1,"title":"Label"}},"type":"object","required":["text","label"],"title":"AgentMLExample"},"AgentMLPredictRequest":{"properties":{"text":{"type":"string","maxLength":1000,"minLength":2,"title":"Text"},"version":{"anyOf":[{"type":"string","maxLength":80},{"type":"null"}],"title":"Version"}},"type":"object","required":["text"],"title":"AgentMLPredictRequest"},"AgentMLPromoteRequest":{"properties":{"version":{"type":"string","maxLength":80,"minLength":8,"title":"Version"}},"type":"object","required":["version"],"title":"AgentMLPromoteRequest"},"AgentMLTrainRequest":{"properties":{"examples":{"items":{"$ref":"#/components/schemas/AgentMLExample"},"type":"array","minItems":12,"title":"Examples"}},"type":"object","required":["examples"],"title":"AgentMLTrainRequest"},"AnswerRequest":{"properties":{"query":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Query","description":"Qué necesitás, en lenguaje natural. Ej: '¿cómo está mi campo en Pergamino?'"},"bbox":{"anyOf":[{"items":{"type":"number"},"type":"array"},{"type":"null"}],"title":"Bbox","description":"AOI como [oeste, sur, este, norte] (WGS84). Alternativa a query/lat-lon."},"geometry":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Geometry","description":"AOI como geometría GeoJSON (polígono)."},"lat":{"anyOf":[{"type":"number","maximum":90.0,"minimum":-90.0},{"type":"null"}],"title":"Lat","description":"Latitud de un punto."},"lon":{"anyOf":[{"type":"number","maximum":180.0,"minimum":-180.0},{"type":"null"}],"title":"Lon","description":"Longitud de un punto."},"buffer_km":{"type":"number","maximum":500.0,"exclusiveMinimum":0.0,"title":"Buffer Km","description":"Radio en km para convertir un punto lat/lon en área.","default":5.0},"product_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Product Id","description":"Forzar un producto (si no, se elige desde la consulta)."},"language":{"type":"string","enum":["es","en","both"],"title":"Language","default":"both"},"use_network":{"type":"boolean","title":"Use Network","description":"Permitir geocoding online (Nominatim) para lugares desconocidos.","default":false}},"type":"object","title":"AnswerRequest","description":"A need expressed in natural language and/or by coordinates.\n\nThe single conversational door: the client says WHAT they need (free text)\nand WHERE (natural-language place, a bbox, a GeoJSON polygon, or a lat/lon\npoint) — both location routes end in the same AOI. The intelligence picks\nthe product and the satellites internally."},"ApiKeyCreate":{"properties":{"name":{"type":"string","maxLength":120,"minLength":1,"title":"Name"},"scopes":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Scopes"},"rate_limit":{"anyOf":[{"type":"integer","maximum":100000.0,"minimum":1.0},{"type":"null"}],"title":"Rate Limit"}},"type":"object","required":["name"],"title":"ApiKeyCreate"},"AreaCreate":{"properties":{"name":{"type":"string","maxLength":1000,"title":"Name"},"geometry":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Geometry"},"bbox":{"anyOf":[{"items":{"type":"number"},"type":"array"},{"type":"null"}],"title":"Bbox"}},"type":"object","required":["name"],"title":"AreaCreate"},"AreaRename":{"properties":{"name":{"type":"string","maxLength":1000,"title":"Name"}},"type":"object","required":["name"],"title":"AreaRename"},"AskRequest":{"properties":{"query":{"type":"string","maxLength":1000,"minLength":3,"title":"Query"},"lang":{"type":"string","title":"Lang","default":"es"},"lat":{"anyOf":[{"type":"number","maximum":90.0,"minimum":-90.0},{"type":"null"}],"title":"Lat"},"lon":{"anyOf":[{"type":"number","maximum":180.0,"minimum":-180.0},{"type":"null"}],"title":"Lon"},"buffer_km":{"anyOf":[{"type":"number","maximum":50.0,"exclusiveMinimum":0.0},{"type":"null"}],"title":"Buffer Km"},"aoi_bbox":{"anyOf":[{"items":{"type":"number"},"type":"array"},{"type":"null"}],"title":"Aoi Bbox"}},"type":"object","required":["query"],"title":"AskRequest"},"BandUsed":{"properties":{"name":{"type":"string","title":"Name"},"asset_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Asset Key"},"unit":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Unit"}},"type":"object","required":["name"],"title":"BandUsed"},"Body_ingest_file_ep_admin_knowledge_documents_upload_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"},"tags":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tags"}},"type":"object","required":["file"],"title":"Body_ingest_file_ep_admin_knowledge_documents_upload_post"},"CampaignCompareRequest":{"properties":{"geometry":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Geometry","description":"GeoJSON Polygon/MultiPolygon del lote. Recomendado: el análisis se ciñe EXACTAMENTE a esta geometría."},"bbox":{"anyOf":[{"items":{"type":"number"},"type":"array","maxItems":4,"minItems":4},{"type":"null"}],"title":"Bbox","description":"[oeste, sur, este, norte] WGS84."},"lat":{"anyOf":[{"type":"number","maximum":90.0,"minimum":-90.0},{"type":"null"}],"title":"Lat"},"lon":{"anyOf":[{"type":"number","maximum":180.0,"minimum":-180.0},{"type":"null"}],"title":"Lon"},"campaigns":{"items":{"type":"string"},"type":"array","maxItems":3,"minItems":1,"title":"Campaigns","description":"Campañas a comparar, p.ej. ['2023/24','2022/23']."},"include_optical":{"type":"boolean","title":"Include Optical","description":"Sumar NDVI a cada campaña (mucho más lento).","default":false},"max_scenes":{"anyOf":[{"type":"integer","maximum":34.0,"minimum":8.0},{"type":"null"}],"title":"Max Scenes"}},"type":"object","required":["campaigns"],"title":"CampaignCompareRequest","description":"Varias campañas del MISMO lote, cada una medida por separado."},"CampaignRequest":{"properties":{"geometry":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Geometry","description":"GeoJSON Polygon/MultiPolygon del lote. Recomendado: el análisis se ciñe EXACTAMENTE a esta geometría."},"bbox":{"anyOf":[{"items":{"type":"number"},"type":"array","maxItems":4,"minItems":4},{"type":"null"}],"title":"Bbox","description":"[oeste, sur, este, norte] WGS84."},"lat":{"anyOf":[{"type":"number","maximum":90.0,"minimum":-90.0},{"type":"null"}],"title":"Lat"},"lon":{"anyOf":[{"type":"number","maximum":180.0,"minimum":-180.0},{"type":"null"}],"title":"Lon"},"campaign":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Campaign","description":"Campaña agrícola ('2023/24'). Define la ventana jun→jun. Si se omite y no hay from/to, se usan los últimos 12 meses."},"from":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"From","description":"Inicio ISO de la ventana (pisa 'campaign')."},"to":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"To","description":"Fin ISO de la ventana (pisa 'campaign')."},"include_optical":{"type":"boolean","title":"Include Optical","description":"Sumar la serie NDVI Sentinel-2 como corroboración independiente (más lento; si las nubes la recortan, se declara y no se usa para mover la confianza).","default":true},"max_scenes":{"anyOf":[{"type":"integer","maximum":34.0,"minimum":8.0},{"type":"null"}],"title":"Max Scenes","description":"Tope de pasadas de radar a leer (default 34)."}},"type":"object","title":"CampaignRequest","description":"Ventana de la campaña + opciones del análisis temporal."},"CandidateInfo":{"properties":{"satellite_id":{"type":"string","title":"Satellite Id"},"satellite":{"type":"string","title":"Satellite"},"catalog":{"type":"string","title":"Catalog"},"collection":{"type":"string","title":"Collection"},"score":{"type":"number","title":"Score"},"reasons":{"items":{"type":"string"},"type":"array","title":"Reasons"},"queried":{"type":"boolean","title":"Queried"},"scenes_found":{"type":"integer","title":"Scenes Found"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"}},"type":"object","required":["satellite_id","satellite","catalog","collection","score","reasons","queried","scenes_found"],"title":"CandidateInfo"},"CandidateRequest":{"properties":{"question":{"type":"string","maxLength":1000,"minLength":3,"title":"Question"},"expected":{"type":"object","title":"Expected"},"source":{"type":"string","maxLength":80,"title":"Source","default":"manual"},"error_type":{"type":"string","maxLength":80,"title":"Error Type","default":"review_needed"},"note":{"type":"string","maxLength":1000,"title":"Note","default":""}},"type":"object","required":["question"],"title":"CandidateRequest"},"CandidateReviewRequest":{"properties":{"status":{"type":"string","pattern":"^(pending|approved|rejected)$","title":"Status"},"expected":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Expected"},"note":{"type":"string","maxLength":1000,"title":"Note","default":""}},"type":"object","required":["status"],"title":"CandidateReviewRequest"},"CellsRequest":{"properties":{"bbox":{"items":{"type":"number"},"type":"array","title":"Bbox","description":"Viewport visible [O,S,E,N] WGS84."},"aoi_bbox":{"anyOf":[{"items":{"type":"number"},"type":"array"},{"type":"null"}],"title":"Aoi Bbox","description":"Recuadro de investigación dibujado a mano."},"aoi_geometry":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Aoi Geometry","description":"Polígono GeoJSON del terreno dibujado. Si viene, las celdas se filtran punto-en-polígono (burbujas solo dentro del borde)."},"zoom":{"anyOf":[{"type":"number","maximum":22.0,"minimum":0.0},{"type":"null"}],"title":"Zoom","description":"Zoom del mapa. Informativo: desde 2026-07-13 la grilla se ancla al AOI (misma celda a cualquier zoom, las burbujas no saltan); el zoom ya no define el nivel."}},"type":"object","required":["bbox"],"title":"CellsRequest"},"ChatContext":{"properties":{"pin":{"anyOf":[{"additionalProperties":{"type":"number"},"type":"object"},{"type":"null"}],"title":"Pin"},"aoi":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Aoi"},"zone":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Zone"},"viewport_bbox":{"anyOf":[{"items":{"type":"number"},"type":"array"},{"type":"null"}],"title":"Viewport Bbox"},"geometry":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Geometry"},"layers":{"anyOf":[{"items":{"type":"object"},"type":"array"},{"type":"null"}],"title":"Layers"}},"type":"object","title":"ChatContext"},"ChatRequest":{"properties":{"message":{"type":"string","maxLength":1000,"minLength":1,"title":"Message"},"lang":{"type":"string","title":"Lang","default":"es"},"conversation_id":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Conversation Id"},"context":{"$ref":"#/components/schemas/ChatContext"}},"type":"object","required":["message"],"title":"ChatRequest"},"ClaimRequest":{"properties":{"worker_id":{"type":"string","maxLength":200,"minLength":1,"title":"Worker Id","description":"Identidad del worker (idempotencia del claim)."},"capabilities":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Capabilities","description":"Procesos que este worker sabe ejecutar (None = cualquiera)."},"processes":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Processes","description":"Alias de 'capabilities'."},"contract_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contract Version"},"max_jobs":{"type":"integer","minimum":1.0,"title":"Max Jobs","description":"El motor SNAP procesa de a un job por máquina.","default":1}},"type":"object","required":["worker_id"],"title":"ClaimRequest","description":"Cuerpo de ``POST /v1/snap/jobs/claim`` (worker toma trabajo).\n\nContrato GUARDIA: ``{worker_id, capabilities, contract_version, max_jobs}``.\n``processes`` se acepta como alias histórico de ``capabilities``."},"ClipRequest":{"properties":{"geometry":{"type":"object","title":"Geometry"},"boundary":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Boundary"},"country":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Country"},"level":{"anyOf":[{"type":"string","maxLength":8},{"type":"null"}],"title":"Level"},"name":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Name"}},"type":"object","required":["geometry"],"title":"ClipRequest"},"Confidence":{"type":"string","enum":["high","medium","low"],"title":"Confidence","description":"How much to trust the answer as a whole."},"ConversationCreate":{"properties":{"title":{"anyOf":[{"type":"string","maxLength":300},{"type":"null"}],"title":"Title"},"summary":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Summary"},"messages":{"items":{},"type":"array","title":"Messages"}},"type":"object","title":"ConversationCreate"},"CropRequest":{"properties":{"geometry":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Geometry","description":"GeoJSON Polygon/MultiPolygon."},"bbox":{"anyOf":[{"items":{"type":"number"},"type":"array","maxItems":4,"minItems":4},{"type":"null"}],"title":"Bbox","description":"[oeste, sur, este, norte] WGS84."},"lat":{"anyOf":[{"type":"number","maximum":90.0,"minimum":-90.0},{"type":"null"}],"title":"Lat"},"lon":{"anyOf":[{"type":"number","maximum":180.0,"minimum":-180.0},{"type":"null"}],"title":"Lon"},"season":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Season","description":"'verano'/'invierno' (o summer/winter). Si se omite, se infiere de la firma NDVI."},"year":{"anyOf":[{"type":"integer","maximum":2024.0,"minimum":1985.0},{"type":"null"}],"title":"Year","description":"Año de la cobertura MapBiomas (default: el más reciente)."},"include_phenology":{"type":"boolean","title":"Include Phenology","description":"Computar la firma fenológica NDVI (más lento).","default":true},"from":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"From","description":"Inicio ISO de la ventana de fenología."},"to":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"To","description":"Fin ISO de la ventana de fenología."},"campaign":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Campaign","description":"Campaña INTA a consultar ('2024/25'|'2023/24'|'2022/23'). Si se omite, la última publicada (una campaña pasada)."},"include_rotation":{"type":"boolean","title":"Include Rotation","description":"Historial de rotación INTA multi-campaña (más lento: una lectura COG por campaña).","default":false},"include_sar":{"type":"boolean","title":"Include Sar","description":"Corroborar con una escena de radar Sentinel-1 (más lento; separa arroz por parcela inundada y confirma cultivo bajo nubes).","default":false}},"type":"object","title":"CropRequest","description":"AOI (geometry | bbox | lat+lon) + opciones del reconocimiento."},"CropsLayerBody":{"properties":{"geometry":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Geometry"},"bbox":{"anyOf":[{"items":{"type":"number"},"type":"array"},{"type":"null"}],"title":"Bbox"},"lat":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Lat"},"lon":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Lon"}},"type":"object","title":"CropsLayerBody","description":"Terreno (geometry) | bbox [O,S,E,N] | punto (lat/lon)."},"CrossSensorRequest":{"properties":{"bbox":{"anyOf":[{"items":{"type":"number"},"type":"array"},{"type":"null"}],"title":"Bbox","description":"[oeste, sur, este, norte] WGS84."},"geometry":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Geometry","description":"GeoJSON Polygon/MultiPolygon (alternativa al bbox)."},"index":{"type":"string","maxLength":12,"title":"Index","default":"ndvi"},"datetime_from":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Datetime From"},"datetime_to":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Datetime To"}},"type":"object","title":"CrossSensorRequest"},"DataType":{"type":"string","enum":["optical","multispectral","sar","thermal","atmospheric","elevation"],"title":"DataType"},"ExportRequest":{"properties":{"product_id":{"type":"string","title":"Product Id"},"request":{"$ref":"#/components/schemas/ProductRequest"},"lang":{"type":"string","title":"Lang","default":"es"}},"type":"object","required":["product_id","request"],"title":"ExportRequest"},"FeedbackIn":{"properties":{"response_id":{"type":"string","title":"Response Id","description":"response_id de la respuesta votada."},"product_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Product Id","description":"Id del producto (opcional)."},"vote":{"type":"string","enum":["up","down"],"title":"Vote","description":"Voto: 'up' o 'down'."},"comment":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Comment","description":"Comentario libre (opcional)."}},"type":"object","required":["response_id","vote"],"title":"FeedbackIn","description":"Cuerpo de ``POST /v1/feedback``. ``vote`` se valida con Literal (422 si no)."},"FeedbackRequest":{"properties":{"useful":{"type":"boolean","title":"Useful","description":"¿El hallazgo te sirvió?"},"comment":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Comment","description":"Comentario opcional del usuario."}},"type":"object","required":["useful"],"title":"FeedbackRequest"},"FootprintsRequest":{"properties":{"scenes":{"anyOf":[{"items":{"type":"object"},"type":"array"},{"type":"null"}],"title":"Scenes"},"search":{"anyOf":[{"$ref":"#/components/schemas/ImagerySearchRequest"},{"type":"null"}]}},"type":"object","title":"FootprintsRequest"},"ForgotRequest":{"properties":{"email":{"type":"string","maxLength":254,"minLength":3,"title":"Email"}},"type":"object","required":["email"],"title":"ForgotRequest"},"GuideRequest":{"properties":{"message":{"type":"string","maxLength":600,"minLength":1,"title":"Message"},"lang":{"type":"string","title":"Lang","default":"es"},"history":{"items":{"$ref":"#/components/schemas/GuideTurn"},"type":"array","maxItems":8,"title":"History"}},"type":"object","required":["message"],"title":"GuideRequest"},"GuideTurn":{"properties":{"role":{"type":"string","pattern":"^(user|orbit)$","title":"Role"},"content":{"type":"string","maxLength":400,"title":"Content"}},"type":"object","required":["role","content"],"title":"GuideTurn"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"HeartbeatRequest":{"properties":{"worker_id":{"type":"string","maxLength":200,"minLength":1,"title":"Worker Id"},"stage":{"anyOf":[{"type":"string","maxLength":80},{"type":"null"}],"title":"Stage","description":"Etapa legible: g1/g2a/g2b/g3/export/upload."},"progress":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Progress"},"status":{"anyOf":[{"type":"string","maxLength":40},{"type":"null"}],"title":"Status"}},"type":"object","required":["worker_id"],"title":"HeartbeatRequest","description":"Cuerpo de ``POST /v1/snap/jobs/{id}/heartbeat``.\n\nContrato GUARDIA: ``{worker_id, stage, progress, status}``. ``stage`` y\n``progress`` son telemetría del worker: se aceptan, no cambian la máquina de\nestados (el latido sí pasa claimed → running)."},"ImagerySearchRequest":{"properties":{"bbox":{"anyOf":[{"items":{"type":"number"},"type":"array"},{"type":"null"}],"title":"Bbox","description":"Area of interest as [west, south, east, north] in WGS84 degrees."},"geometry":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Geometry","description":"Area of interest as a GeoJSON geometry (Polygon/Point). Alternative to bbox."},"datetime_from":{"type":"string","title":"Datetime From","description":"Start of date range, ISO-8601 (e.g. 2024-01-01)."},"datetime_to":{"type":"string","title":"Datetime To","description":"End of date range, ISO-8601 (e.g. 2024-03-01)."},"data_type":{"$ref":"#/components/schemas/DataType","description":"Kind of data requested.","default":"optical"},"measurement":{"anyOf":[{"$ref":"#/components/schemas/Measurement"},{"type":"null"}],"description":"Optional physical measurement to route by (finer than data_type): reflectance | surface_temperature | radar_backscatter | trace_gas | elevation | active_fire | nightlights. When set, the engine prefers sources that deliver exactly this and strongly favors pixel-ready (computable) collections; active_fire routes to NASA FIRMS and nightlights to VIIRS Black Marble. Omit for the classic data_type routing."},"max_resolution_m":{"anyOf":[{"type":"number","exclusiveMinimum":0.0},{"type":"null"}],"title":"Max Resolution M","description":"Coarsest acceptable ground resolution in meters. A satellite qualifies if its native resolution is <= this value (finer or equal)."},"cloud_cover_max":{"anyOf":[{"type":"number","maximum":100.0,"minimum":0.0},{"type":"null"}],"title":"Cloud Cover Max","description":"Maximum acceptable cloud cover percent (optical only; ignored for SAR)."},"priority":{"$ref":"#/components/schemas/Priority","description":"What to optimize the routing for.","default":"recency"},"limit":{"type":"integer","maximum":50.0,"minimum":1.0,"title":"Limit","description":"Max scenes to return.","default":5},"allow_sar_fallback":{"type":"boolean","title":"Allow Sar Fallback","description":"Gates the multi-sensor auto-switch cascade: if the requested sensor family finds nothing (e.g. optical under the cloud constraint), auto-switch to the next pertinent family (optical/multispectral -> SAR; thermal -> optical -> SAR) and flag it in the reasoning.","default":true},"off_nadir_max":{"anyOf":[{"type":"number","maximum":90.0,"minimum":0.0},{"type":"null"}],"title":"Off Nadir Max","description":"Maximum acceptable off-nadir view angle in degrees (view:off_nadir). Filters near-nadir acquisitions (less geometric distortion). IMPORTANT: a scene that does NOT publish view:off_nadir is NOT discarded — it is kept with a warning; discarding on a missing datum would punish the provider's honesty."},"level":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Level","description":"Desired processing level in ORBITAL GRID's own vocabulary: one of raw|calibrated|surface|composite|model (og:level, playbook §1.3). IMPORTANT: a scene whose level cannot be determined is NOT discarded — it is kept with a warning; discarding on a missing datum would punish the provider's honesty."}},"type":"object","required":["datetime_from","datetime_to"],"title":"ImagerySearchRequest","description":"A single request to the unified imagery endpoint.\n\nThe client describes *what* it needs; the routing engine decides *which*\nsatellite(s) serve it best and auto-switches on failure."},"InferredParams":{"properties":{"bbox":{"anyOf":[{"items":{"type":"number"},"type":"array"},{"type":"null"}],"title":"Bbox"},"location_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Location Name"},"location_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Location Source"},"data_type":{"type":"string","title":"Data Type","default":"optical"},"indices":{"items":{"type":"string"},"type":"array","title":"Indices","default":[]},"cloud_cover_max":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Cloud Cover Max"},"max_resolution_m":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Max Resolution M"},"priority":{"type":"string","title":"Priority","default":"recency"},"window_days":{"type":"integer","title":"Window Days","default":30},"datetime_from":{"type":"string","title":"Datetime From","default":""},"datetime_to":{"type":"string","title":"Datetime To","default":""},"allow_sar_fallback":{"type":"boolean","title":"Allow Sar Fallback","default":true},"limit":{"type":"integer","title":"Limit","default":5}},"type":"object","title":"InferredParams","description":"Structured parameters inferred from a natural-language query.\n\nThis is exactly the shape the routing engine consumes (an\n`ImagerySearchRequest` is built from it), plus a couple of explanatory\nfields (indices, location metadata) that never reach the engine."},"IngestTextRequest":{"properties":{"title":{"type":"string","maxLength":300,"minLength":1,"title":"Title"},"text":{"type":"string","minLength":20,"title":"Text"},"source":{"anyOf":[{"type":"string","maxLength":300},{"type":"null"}],"title":"Source"},"tags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Tags"}},"type":"object","required":["title","text"],"title":"IngestTextRequest"},"InsarRequest":{"properties":{"engine":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Engine","description":"hyp3 | snap (default: OG_INSAR_ENGINE)"},"reference":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reference"},"secondary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Secondary"},"zona_publica":{"type":"boolean","title":"Zona Publica","default":false},"looks":{"type":"string","title":"Looks","default":"20x4"},"reference_zip":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reference Zip"},"secondary_zip":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Secondary Zip"},"aoi":{"anyOf":[{"items":{"type":"number"},"type":"array"},{"type":"null"}],"title":"Aoi"}},"type":"object","title":"InsarRequest"},"IntentRequest":{"properties":{"query":{"type":"string","maxLength":1000,"minLength":1,"title":"Query","description":"Consulta de negocio en lenguaje natural (español o inglés). Ej: 'humedad de mis campos de soja en Pergamino en la última semana' / 'soil moisture of my soybean fields in Pergamino this week'."},"lang":{"type":"string","enum":["es","en"],"title":"Lang","description":"Idioma de la explicación e interpretación de la respuesta (answer_es/answer_en vienen siempre en ambos idiomas). / Language of the response's explanation and interpretation notes.","default":"es"}},"type":"object","required":["query"],"title":"IntentRequest","description":"A business question in natural language (Spanish or English)."},"IntentResponse":{"properties":{"ok":{"type":"boolean","title":"Ok"},"query":{"type":"string","title":"Query"},"answer_es":{"type":"string","title":"Answer Es","default":""},"answer_en":{"type":"string","title":"Answer En","default":""},"semaphore":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Semaphore"},"location":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Location"},"parser_used":{"type":"string","title":"Parser Used"},"interpretation":{"items":{"type":"string"},"type":"array","title":"Interpretation","default":[]},"inferred_params":{"anyOf":[{"$ref":"#/components/schemas/InferredParams"},{"type":"null"}]},"routing_request":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Routing Request"},"selected_satellite":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Selected Satellite"},"selected_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Selected Source"},"switched":{"type":"boolean","title":"Switched","default":false},"switch_trace":{"items":{"type":"string"},"type":"array","title":"Switch Trace","default":[]},"total_scenes":{"type":"integer","title":"Total Scenes","default":0},"scenes":{"items":{"$ref":"#/components/schemas/Scene"},"type":"array","title":"Scenes","default":[]},"explanation":{"type":"string","title":"Explanation","default":""},"warnings":{"items":{"type":"string"},"type":"array","title":"Warnings","default":[]},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},"type":"object","required":["ok","query","parser_used"],"title":"IntentResponse","description":"The answer to /intent: what was understood, what was chosen, and why.\n\nConsumer-first: ``answer_es``/``answer_en`` and ``location``/``semaphore``\nlead with a plain-language answer + the AOI coordinates; the routing\nmetadata below is evidence, collapsed as technical detail by UIs."},"JobCreate":{"properties":{"product_id":{"type":"string","title":"Product Id","description":"Id del producto a correr (p. ej. crop_health)."},"request":{"type":"object","title":"Request","description":"Cuerpo ProductRequest (bbox/geometry, período, idioma…)."},"webhook_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Webhook Url","description":"URL http/https a notificar al terminar (best-effort)."}},"type":"object","required":["product_id"],"title":"JobCreate","description":"Cuerpo de ``POST /v1/jobs``."},"LayerBody":{"properties":{"bbox":{"anyOf":[{"items":{"type":"number"},"type":"array"},{"type":"null"}],"title":"Bbox"},"geometry":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Geometry"}},"type":"object","title":"LayerBody","description":"Cuerpo del POST de una capa: bbox O geometry (terreno del usuario)."},"LeadRequest":{"properties":{"name":{"type":"string","maxLength":120,"title":"Name","default":""},"email":{"type":"string","maxLength":200,"minLength":5,"title":"Email"},"phone":{"type":"string","maxLength":40,"title":"Phone","default":""},"message":{"type":"string","maxLength":1000,"title":"Message","default":""},"source":{"type":"string","maxLength":40,"title":"Source","default":"orbit-widget"},"lang":{"type":"string","maxLength":8,"title":"Lang","default":"es"},"website":{"type":"string","maxLength":200,"title":"Website","default":""}},"type":"object","required":["email"],"title":"LeadRequest"},"LeadStatusPatch":{"properties":{"status":{"type":"string","pattern":"^(new|contacted|closed)$","title":"Status"}},"type":"object","required":["status"],"title":"LeadStatusPatch"},"LoginRequest":{"properties":{"email":{"type":"string","maxLength":254,"minLength":3,"title":"Email"},"password":{"type":"string","maxLength":200,"minLength":1,"title":"Password"}},"type":"object","required":["email","password"],"title":"LoginRequest"},"Measurement":{"type":"string","enum":["reflectance","surface_temperature","radar_backscatter","trace_gas","elevation","active_fire","nightlights","surface_mineralogy"],"title":"Measurement","description":"Physical measurement requested, finer-grained than ``DataType`` (sensor\nfamily). Optional: when omitted the engine routes by ``data_type`` as before.\nSpecialized measurements (active_fire, nightlights) are opt-in — only routed\nto their dedicated source when explicitly asked for."},"MethodMaturity":{"properties":{"level":{"type":"string","enum":["validated","experimental","not_validated"],"title":"Level"},"evidence":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Evidence"},"validity_domain":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Validity Domain"},"applies_to_this_aoi":{"type":"boolean","title":"Applies To This Aoi","description":"Si es False, la tarjeta NO puede presentar las métricas del modelo como si fueran la precisión sobre ESTE lote."},"why":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Why"}},"type":"object","required":["level","applies_to_this_aoi"],"title":"MethodMaturity","description":"Impide el fraude más probable del sistema: pegarle el F1 de Pergamino a Mato Grosso."},"MultiZonalStatsRequest":{"properties":{"bbox":{"anyOf":[{"items":{"type":"number"},"type":"array","maxItems":4,"minItems":4},{"type":"null"}],"title":"Bbox","description":"AOI as [west, south, east, north] (WGS84 degrees). Max span 1.0° per side. Alternative to 'geometry'."},"geometry":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Geometry","description":"AOI as a GeoJSON Polygon/MultiPolygon (WGS84). Alternative to 'bbox'. Envelope max span 1.0° per side."},"datetime_from":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Datetime From","description":"Start of search period, ISO-8601 (default: 30 days ago)."},"datetime_to":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Datetime To","description":"End of search period, ISO-8601 (default: today)."},"max_cloud":{"type":"number","maximum":100.0,"minimum":0.0,"title":"Max Cloud","description":"Max scene-level cloud cover percent considered.","default":60.0},"indices":{"items":{"type":"string"},"type":"array","maxItems":7,"minItems":1,"title":"Indices","description":"Spectral indices to compute over the same scene: evi, nbr, ndmi, ndre, ndvi, ndwi, savi."}},"type":"object","required":["indices"],"title":"MultiZonalStatsRequest","description":"AOI + several spectral indices computed from ONE scene, one read."},"OptionCard":{"properties":{"option_id":{"type":"string","title":"Option Id"},"label":{"type":"string","title":"Label"},"family":{"type":"string","enum":["optical","sar","thermal","hyperspectral","other"],"title":"Family"},"satellites":{"items":{"type":"string"},"type":"array","title":"Satellites"},"catalog":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Catalog"},"collection":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Collection"},"bands":{"items":{"type":"string"},"type":"array","title":"Bands"},"radar_band":{"anyOf":[{"type":"string","enum":["C","L","X","P","S"]},{"type":"null"}],"title":"Radar Band","description":"Banda de radar. El dueño pide comparar C contra L."},"index":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Index"},"resolution":{"type":"object","title":"Resolution"},"revisit":{"anyOf":[{"$ref":"#/components/schemas/RevisitPair"},{"type":"null"}]},"coverage":{"type":"object","title":"Coverage"},"cloud_expectation":{"type":"object","title":"Cloud Expectation"},"latency":{"type":"object","title":"Latency"},"method_maturity":{"anyOf":[{"$ref":"#/components/schemas/MethodMaturity"},{"type":"null"}]},"cost":{"type":"object","title":"Cost"},"buildable_today":{"type":"boolean","title":"Buildable Today","default":true},"blocked_by":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Blocked By","description":"Si buildable_today=False, el motivo EXACTO."}},"type":"object","required":["option_id","label","family"],"title":"OptionCard","description":"Una combinación propuesta, con sus datos duros.\n\n**NO existe el campo ``recommended``, ni ``best``, ni ``score``.** La IA propone; el\nusuario decide. El contrato no tiene dónde expresar una elección — es una restricción\nde capability, no una instrucción de prompt (un prompt se elude; un campo que no existe\nno se puede llenar).\n\nTodo campo desconocido va ``null`` con su causa. Un null honesto vale más que un número\nde folleto."},"OptionsRequest":{"properties":{"coordinates":{"title":"Coordinates"},"question":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Question"},"combos":{"items":{"$ref":"#/components/schemas/SensingCombo"},"type":"array","title":"Combos","description":"Combinaciones a evaluar. Vacío ⇒ se proponen las construibles hoy."},"days":{"type":"integer","maximum":1095.0,"minimum":30.0,"title":"Days","default":365},"cloud_lte":{"anyOf":[{"type":"number","maximum":100.0,"minimum":0.0},{"type":"null"}],"title":"Cloud Lte","default":20.0}},"type":"object","required":["coordinates"],"title":"OptionsRequest"},"OptionsResponse":{"properties":{"aoi":{"type":"object","title":"Aoi"},"options":{"items":{"$ref":"#/components/schemas/OptionCard"},"type":"array","title":"Options"},"note":{"type":"string","title":"Note","default":"Estas son las combinaciones con sus datos medidos. No elegimos por vos: la revisita que te sirve depende de tu caso de uso, y eso lo sabés vos."}},"type":"object","required":["aoi","options"],"title":"OptionsResponse","description":"Opciones con sus datos duros.\n\n**No hay campo ``recommended``, ni ``best``, ni ranking.** El orden es el que pidió el\nusuario. La IA pone los números adelante; la elección es del humano."},"OutputRef":{"properties":{"key":{"type":"string","maxLength":200,"title":"Key","description":"'phase_rad', 'coherence', ..."},"storage_url":{"type":"string","maxLength":2000,"title":"Storage Url","description":"r2://bucket/clave | file:///... (stub)"},"kind":{"type":"string","maxLength":40,"title":"Kind","default":"cog"},"bytes":{"type":"integer","minimum":0.0,"title":"Bytes","default":0},"checksum":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Checksum"},"content_type":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Content Type"}},"type":"object","required":["key","storage_url"],"title":"OutputRef","description":"Un artefacto producido por el worker (contrato GUARDIA ``Output``)."},"OverpassRequest":{"properties":{"bbox":{"anyOf":[{"items":{"type":"number"},"type":"array"},{"type":"null"}],"title":"Bbox","description":"AOI as [west, south, east, north] (optional; global sats)."},"data_types":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Data Types","description":"Filter, e.g. ['optical','multispectral','sar']."},"limit":{"type":"integer","maximum":50.0,"minimum":1.0,"title":"Limit","default":10}},"type":"object","title":"OverpassRequest"},"ParcelRequest":{"properties":{"lat":{"type":"number","title":"Lat"},"lon":{"type":"number","title":"Lon"},"country":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Country"},"radius_m":{"type":"integer","maximum":500.0,"minimum":1.0,"title":"Radius M","default":60}},"type":"object","required":["lat","lon"],"title":"ParcelRequest"},"PasswordChangeRequest":{"properties":{"current_password":{"type":"string","maxLength":200,"minLength":1,"title":"Current Password"},"new_password":{"type":"string","maxLength":200,"minLength":8,"title":"New Password"}},"type":"object","required":["current_password","new_password"],"title":"PasswordChangeRequest"},"PrefsUpdate":{"properties":{"theme":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"title":"Theme"},"font_scale":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Font Scale"},"lang":{"anyOf":[{"type":"string","maxLength":8},{"type":"null"}],"title":"Lang"}},"type":"object","title":"PrefsUpdate"},"PreviewRequest":{"properties":{"coordinates":{"title":"Coordinates"},"spec":{"type":"object","title":"Spec","description":"ProductSpec candidato (sin guardar)."}},"type":"object","required":["coordinates","spec"],"title":"PreviewRequest"},"Priority":{"type":"string","enum":["recency","resolution","cost"],"title":"Priority"},"Probability":{"properties":{"value":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Value"},"class":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Class"},"as_of":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"As Of","description":"Timestamp EXACTO de la pasada del satélite (UTC)."},"statement_es":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Statement Es"},"statement_en":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Statement En"},"margin":{"anyOf":[{"$ref":"#/components/schemas/ProbabilityMargin"},{"type":"null"}]},"calibration_ref":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Calibration Ref"},"in_validity_domain":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"In Validity Domain"},"probability_unavailable_reason":{"anyOf":[{"$ref":"#/components/schemas/ProbabilityUnavailableReason"},{"type":"null"}]},"what_we_need":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"What We Need"}},"type":"object","title":"Probability","description":"Probabilidad SIEMPRE anclada a la fecha y hora exacta de la pasada.\n\n``as_of`` NO es cuándo respondimos: es **cuándo el satélite miró el lote**. Esa es la\ndiferencia entre \"99,2% de probabilidad\" (ruido) y \"el 3 de julio a las 10:41 UTC,\n99,2% de probabilidad\" (información).\n\nInvariante duro (R2): ``value is not None`` ⇒ ``as_of is not None``. Y si no hay value,\ntiene que haber causa. No hay tercera opción: o hay número con momento, o hay null con\nmotivo."},"ProbabilityMargin":{"properties":{"kind":{"type":"string","enum":["model_validation","empirical","none"],"title":"Kind","default":"model_validation"},"f1":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"F1"},"precision":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Precision"},"recall":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Recall"},"expected_error_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Expected Error Rate"},"basis":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Basis"}},"type":"object","title":"ProbabilityMargin","description":"El margen de error. Sin esto, una probabilidad es una opinión con decimales."},"ProbabilityUnavailableReason":{"type":"string","enum":["out_of_validity_domain","no_calibration","insufficient_valid_pixels","served_by_uncalibrated_fallback","stale_scene","no_inference_for_scene"],"title":"ProbabilityUnavailableReason","description":"Por qué NO emitimos probabilidad. Un null sin causa es tan opaco como un número falso."},"ProductRequest":{"properties":{"bbox":{"anyOf":[{"items":{"type":"number"},"type":"array"},{"type":"null"}],"title":"Bbox","description":"AOI as [west, south, east, north] (WGS84)."},"geometry":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Geometry","description":"AOI as a GeoJSON geometry. Alternative to bbox."},"datetime_from":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Datetime From","description":"Start of the window, ISO-8601. Defaults per product."},"datetime_to":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Datetime To","description":"End of the window, ISO-8601. Defaults to today."},"language":{"type":"string","enum":["es","en","both"],"title":"Language","description":"Which plain-language summary to compute.","default":"both"},"options":{"type":"object","title":"Options","description":"Product-specific options (e.g. min_confidence)."}},"type":"object","title":"ProductRequest","description":"AOI + period + options for a product run.\n\nAn AOI is required (bbox or GeoJSON geometry). The period is optional: each\nproduct applies a sensible default window when omitted."},"ProductResponse":{"properties":{"product_id":{"type":"string","title":"Product Id"},"product_name":{"type":"string","title":"Product Name"},"product_name_i18n":{"additionalProperties":{"type":"string"},"type":"object","title":"Product Name I18N","default":{}},"use_case":{"type":"string","title":"Use Case"},"use_case_i18n":{"additionalProperties":{"type":"string"},"type":"object","title":"Use Case I18N","default":{}},"status":{"type":"string","enum":["delivered","accepted_on_demand","no_data"],"title":"Status"},"plain_summary_es":{"type":"string","title":"Plain Summary Es","default":""},"plain_summary_en":{"type":"string","title":"Plain Summary En","default":""},"semaphore":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Semaphore"},"confidence":{"$ref":"#/components/schemas/Confidence","default":"medium"},"location":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Location"},"quality":{"anyOf":[{"$ref":"#/components/schemas/QualityScore"},{"type":"null"}]},"aoi":{"type":"object","title":"Aoi"},"period":{"additionalProperties":{"anyOf":[{"type":"string"},{"type":"null"}]},"type":"object","title":"Period"},"metrics":{"type":"object","title":"Metrics","default":{}},"technical_detail":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Technical Detail"},"provenance":{"type":"object","title":"Provenance","default":{}},"summary_engine":{"type":"string","title":"Summary Engine","default":"template"},"warnings":{"items":{"type":"string"},"type":"array","title":"Warnings","default":[]},"request_fingerprint":{"type":"string","title":"Request Fingerprint","default":""},"response_id":{"type":"string","title":"Response Id","default":""}},"type":"object","required":["product_id","product_name","use_case","status","aoi","period"],"title":"ProductResponse","description":"The unified answer a product returns.\n\n``metrics`` is the single source of truth: every number that appears in the\nplain-language summaries MUST come from here (grounding is enforced in\n``app.products.summarize``). ``plain_summary_*`` never invents figures."},"QualityLabel":{"type":"string","enum":["reliable","acceptable","stale"],"title":"QualityLabel","description":"Traffic-light scene-quality grade (Fase F)."},"QualityScore":{"properties":{"label":{"$ref":"#/components/schemas/QualityLabel"},"score":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Score"},"cloud_cover_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Cloud Cover Pct"},"resolution_m":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Resolution M"},"scene_age_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Scene Age Days"},"reasons":{"items":{"type":"string"},"type":"array","title":"Reasons","default":[]}},"type":"object","required":["label","score"],"title":"QualityScore","description":"Semaphore quality of the imagery backing an answer.\n\nGrounded strictly in scene metadata: cloudiness, native resolution and how\nold the freshest usable scene is. Never invented — if a dimension is unknown\nit stays None and is called out in ``reasons``."},"RegisterRequest":{"properties":{"name":{"type":"string","maxLength":120,"minLength":1,"title":"Name"},"email":{"type":"string","maxLength":254,"minLength":3,"title":"Email"},"password":{"type":"string","maxLength":200,"minLength":8,"title":"Password"}},"type":"object","required":["name","email","password"],"title":"RegisterRequest"},"RejectRequest":{"properties":{"note":{"type":"string","maxLength":1000,"title":"Note","default":""}},"type":"object","title":"RejectRequest"},"ReportRequest":{"properties":{"lang":{"type":"string","title":"Lang","default":"es"},"context":{"$ref":"#/components/schemas/ChatContext"},"question":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Question","description":"Última pregunta del cliente; contextualiza la evidencia permitida."}},"type":"object","title":"ReportRequest"},"ResetRequest":{"properties":{"token":{"type":"string","maxLength":512,"minLength":8,"title":"Token"},"new_password":{"type":"string","maxLength":200,"minLength":8,"title":"New Password"}},"type":"object","required":["token","new_password"],"title":"ResetRequest"},"ResultRequest":{"properties":{"worker_id":{"type":"string","maxLength":200,"minLength":1,"title":"Worker Id"},"status":{"type":"string","title":"Status","description":"'succeeded' | 'failed' (o 'done' | 'error')."},"outputs":{"items":{"$ref":"#/components/schemas/OutputRef"},"type":"array","title":"Outputs","description":"Artefactos producidos y subidos."},"lineage":{"type":"object","title":"Lineage","description":"lineage.json real (honestidad de dato)."},"metrics":{"type":"object","title":"Metrics","description":"Tiempos por etapa, etc."},"error":{"anyOf":[{"type":"string","maxLength":4000},{"type":"null"}],"title":"Error","description":"Causa si falló (sin rutas del server)."},"result_url":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Result Url","description":"URL/clave del artefacto principal. Si falta, se toma de outputs[0]."},"contract_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contract Version"}},"type":"object","required":["worker_id","status"],"title":"ResultRequest","description":"Cuerpo de ``POST /v1/snap/jobs/{id}/result`` (worker cierra el job).\n\nContrato GUARDIA: ``{worker_id, status: 'succeeded'|'failed', outputs,\nlineage, error, metrics, contract_version}``. Se aceptan además los valores\ninternos ``done``/``error`` y un ``result_url`` suelto (conveniencia)."},"RevisitBasis":{"type":"string","enum":["measured","measured_aoi_mask","modeled"],"title":"RevisitBasis","description":"Cómo se obtuvo un número de revisita. SIEMPRE presente, nunca implícito."},"RevisitMeasurement":{"properties":{"raw_days":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Raw Days","description":"365 / pasadas totales."},"effective_days":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Effective Days","description":"365 / pasadas ÚTILES (con filtro de nubes). Óptico."},"worst_gap_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Worst Gap Days","description":"El peor hueco medido ENTRE escenas. Base del SLA."},"open_gap_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Open Gap Days","description":"Días transcurridos desde la ÚLTIMA escena útil hasta hoy. El hueco que sigue ABIERTO. Los gaps cerrados son historia; éste es la ceguera actual del cliente."},"median_gap_days":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Median Gap Days"},"passes_total":{"type":"integer","title":"Passes Total","default":0},"passes_usable":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Passes Usable"},"cloud_dependent":{"type":"boolean","title":"Cloud Dependent","default":true},"cloud_threshold_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Cloud Threshold Pct"},"measured_over_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Measured Over Days"},"measured_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Measured At"},"first_scene":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First Scene"},"last_scene":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Scene"},"satellites_actually_passing":{"additionalProperties":{"type":"integer"},"type":"object","title":"Satellites Actually Passing","description":"Qué plataformas REALMENTE pasan y cuántas veces. Sorriso: S1A x30, S1D x1."},"basis":{"$ref":"#/components/schemas/RevisitBasis"},"warnings":{"items":{"type":"string"},"type":"array","title":"Warnings"}},"type":"object","required":["basis"],"title":"RevisitMeasurement","description":"Revisita de UNA combinación sobre UN AOI.\n\n``worst_gap_days`` tiene la misma jerarquía que el promedio, por contrato: el promedio\nmiente. Medido por ORBIT en Sorriso: gap mediano 5 d, pero **peor gap 80 d** — y esos\n80 días caen justo en la ventana de siembra. Un banco que planifica con el promedio se\nqueda ciego exactamente cuando importa."},"RevisitPair":{"properties":{"revisit_of_answer":{"$ref":"#/components/schemas/RevisitMeasurement","description":"Cada cuánto obtenés ALGUNA respuesta (unión de sensores + fallback)."},"revisit_of_same_measurement":{"$ref":"#/components/schemas/RevisitMeasurement","description":"Cada cuánto obtenés el MISMO indicador, comparable contra el anterior (sólo primario, sin fallback). Gobierna cualquier detección de cambio: es lo que el cliente realmente compra."},"note":{"type":"string","title":"Note","default":"Dos números distintos a propósito. El primero es disponibilidad; el segundo es comparabilidad. Un cambio sólo se puede detectar contra una medición del mismo tipo."}},"type":"object","required":["revisit_of_answer","revisit_of_same_measurement"],"title":"RevisitPair","description":"Las DOS revisitas. Nunca una sola (spec §2.6).\n\nColapsarlas en un número es mentir: un fallback SAR↔óptico da continuidad de RESPUESTA,\nno continuidad de SERIE. SAR mide estructura (backscatter); óptico mide verdor\n(reflectancia). No son el mismo indicador y no forman una serie comparable."},"RevisitRequest":{"properties":{"coordinates":{"title":"Coordinates"},"primary":{"$ref":"#/components/schemas/SensingCombo"},"fallback":{"items":{"$ref":"#/components/schemas/SensingCombo"},"type":"array","title":"Fallback"},"days":{"type":"integer","maximum":1095.0,"minimum":30.0,"title":"Days","default":365},"cloud_lte":{"anyOf":[{"type":"number","maximum":100.0,"minimum":0.0},{"type":"null"}],"title":"Cloud Lte","default":20.0}},"type":"object","required":["coordinates","primary"],"title":"RevisitRequest"},"RiskLayerBody":{"properties":{"geometry":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Geometry"},"bbox":{"anyOf":[{"items":{"type":"number"},"type":"array"},{"type":"null"}],"title":"Bbox"},"lat":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Lat"},"lon":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Lon"},"hazard":{"type":"string","title":"Hazard","default":"both"}},"type":"object","title":"RiskLayerBody","description":"Terreno (geometry) | bbox [O,S,E,N] | punto (lat/lon) + hazard."},"RiskRequest":{"properties":{"lat":{"anyOf":[{"type":"number","maximum":90.0,"minimum":-90.0},{"type":"null"}],"title":"Lat"},"lon":{"anyOf":[{"type":"number","maximum":180.0,"minimum":-180.0},{"type":"null"}],"title":"Lon"},"bbox":{"anyOf":[{"items":{"type":"number"},"type":"array"},{"type":"null"}],"title":"Bbox"},"geometry":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Geometry"},"hazard":{"type":"string","title":"Hazard","default":"both"}},"type":"object","title":"RiskRequest","description":"Punto (lat/lon), bbox [O,S,E,N] o geometry GeoJSON — al menos uno."},"RoleCreate":{"properties":{"name":{"type":"string","maxLength":40,"minLength":2,"title":"Name"},"description":{"anyOf":[{"type":"string","maxLength":400},{"type":"null"}],"title":"Description"},"permissions":{"items":{"type":"string"},"type":"array","title":"Permissions"}},"type":"object","required":["name"],"title":"RoleCreate"},"RolePatch":{"properties":{"description":{"anyOf":[{"type":"string","maxLength":400},{"type":"null"}],"title":"Description"},"permissions":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Permissions"}},"type":"object","title":"RolePatch"},"RunRequest":{"properties":{"product_id":{"type":"string","title":"Product Id","description":"Parámetro 2. Versión pineable: 'pd_7f3a91c2@3'."},"coordinates":{"title":"Coordinates","description":"Parámetro 3. [lon,lat] (punto+buffer) | [w,s,e,n] (bbox) | GeoJSON Polygon."}},"type":"object","required":["product_id","coordinates"],"title":"RunRequest","description":"Los 3 parámetros. Ni uno más.\n\nLa credencial va en el header ``X-API-Key`` (parámetro 1). Acá viajan los otros dos.\nSin fechas, sin satélites, sin bandas: todo eso ya está congelado en la spec. Ese es el\npunto entero del Modo Diseño."},"RunResponse":{"properties":{"run_id":{"type":"string","title":"Run Id"},"product":{"type":"object","title":"Product"},"status":{"$ref":"#/components/schemas/RunStatus"},"served_by":{"type":"string","enum":["primary","fallback"],"title":"Served By","default":"primary"},"observed":{"type":"object","title":"Observed","description":"Lo que se midió. Real, siempre, aunque no haya probabilidad."},"probability":{"anyOf":[{"$ref":"#/components/schemas/Probability"},{"type":"null"}]},"traceability":{"$ref":"#/components/schemas/Traceability"},"freshness":{"type":"object","title":"Freshness"},"revisit_commitment":{"type":"object","title":"Revisit Commitment"},"aoi":{"type":"object","title":"Aoi"},"warnings":{"items":{"type":"string"},"type":"array","title":"Warnings"}},"type":"object","required":["run_id","product","status"],"title":"RunResponse","description":"La respuesta del consumo.\n\n**NO existe el campo ``answer``.** Nunca se afirma un resultado. Existen ``observed``\n(lo que efectivamente se midió) y ``probability`` (anclada a la pasada, y sólo si el\ngate la autoriza). El sistema no *puede* afirmar — no hay dónde escribirlo."},"RunStatus":{"type":"string","enum":["delivered","delivered_without_probability","no_data"],"title":"RunStatus"},"SaveSpecRequest":{"properties":{"name":{"type":"string","maxLength":160,"minLength":1,"title":"Name"},"body":{"type":"object","title":"Body"}},"type":"object","required":["name","body"],"title":"SaveSpecRequest"},"Scene":{"properties":{"scene_id":{"type":"string","title":"Scene Id"},"satellite":{"type":"string","title":"Satellite"},"satellite_id":{"type":"string","title":"Satellite Id"},"constellation":{"type":"string","title":"Constellation"},"catalog":{"type":"string","title":"Catalog"},"collection":{"type":"string","title":"Collection"},"datetime":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Datetime"},"data_type":{"type":"string","title":"Data Type"},"cloud_cover":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Cloud Cover"},"resolution_m":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Resolution M"},"bbox":{"anyOf":[{"items":{"type":"number"},"type":"array"},{"type":"null"}],"title":"Bbox"},"preview_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Preview Url"},"assets":{"additionalProperties":{"type":"string"},"type":"object","title":"Assets"},"asset_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Asset Note"},"stac_href":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stac Href"},"geometry":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Geometry"},"license":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"License"},"og_level":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Og Level"},"instruments":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Instruments"},"proj_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Proj Code"},"view":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"View"},"eo_bands":{"anyOf":[{"items":{"type":"object"},"type":"array"},{"type":"null"}],"title":"Eo Bands"},"sar":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Sar"},"quality_mask":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Quality Mask"},"contract_gaps":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Contract Gaps"}},"type":"object","required":["scene_id","satellite","satellite_id","constellation","catalog","collection","datetime","data_type","cloud_cover","resolution_m","bbox","preview_url","assets","stac_href"],"title":"Scene","description":"A normalized result scene, catalog-agnostic."},"SearchRequest":{"properties":{"query":{"type":"string","maxLength":500,"minLength":1,"title":"Query"},"k":{"type":"integer","maximum":20.0,"minimum":1.0,"title":"K","default":5}},"type":"object","required":["query"],"title":"SearchRequest"},"SearchResponse":{"properties":{"request_echo":{"type":"object","title":"Request Echo"},"selected_satellite":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Selected Satellite"},"selected_reason":{"type":"string","title":"Selected Reason"},"switched":{"type":"boolean","title":"Switched"},"switch_trace":{"items":{"type":"string"},"type":"array","title":"Switch Trace"},"total_scenes":{"type":"integer","title":"Total Scenes"},"scenes":{"items":{"$ref":"#/components/schemas/Scene"},"type":"array","title":"Scenes"},"candidates_considered":{"items":{"$ref":"#/components/schemas/CandidateInfo"},"type":"array","title":"Candidates Considered"},"catalogs_status":{"additionalProperties":{"type":"string"},"type":"object","title":"Catalogs Status"},"contract_report":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Contract Report"}},"type":"object","required":["request_echo","selected_satellite","selected_reason","switched","switch_trace","total_scenes","scenes","candidates_considered","catalogs_status"],"title":"SearchResponse"},"SensingCombo":{"properties":{"catalog":{"type":"string","title":"Catalog"},"collection":{"type":"string","title":"Collection"},"family":{"type":"string","title":"Family","default":"optical"},"satellites":{"items":{"type":"string"},"type":"array","title":"Satellites"},"bands":{"items":{"type":"string"},"type":"array","title":"Bands"},"index":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Index"},"engine":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Engine"},"cloud_dependent":{"type":"boolean","title":"Cloud Dependent","default":true}},"type":"object","required":["catalog","collection"],"title":"SensingCombo","description":"Una combinación a medir/correr. Es lo que el usuario arma en el banco de pruebas."},"SignupRequest":{"properties":{"name":{"type":"string","maxLength":100,"minLength":1,"title":"Name","description":"Nombre o empresa."},"email":{"type":"string","maxLength":254,"minLength":3,"title":"Email","description":"Email de contacto."}},"type":"object","required":["name","email"],"title":"SignupRequest"},"SnapJobCreate":{"properties":{"proceso":{"type":"string","title":"Proceso","description":"Id del proceso del catálogo (p.ej. 'insar')."},"params":{"type":"object","title":"Params","description":"Parámetros del proceso (AOI, fechas, insumos, opciones del grafo)."}},"type":"object","required":["proceso"],"title":"SnapJobCreate","description":"Cuerpo de ``POST /v1/snap/jobs`` (cliente encola un job)."},"SuitabilityRequest":{"properties":{"geometry":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Geometry","description":"GeoJSON Polygon/MultiPolygon del lote. Recomendado: el análisis se ciñe EXACTAMENTE a esta geometría, nunca al bbox."},"bbox":{"anyOf":[{"items":{"type":"number"},"type":"array","maxItems":4,"minItems":4},{"type":"null"}],"title":"Bbox","description":"[oeste, sur, este, norte] WGS84. Alternativa a 'geometry'."},"crops":{"items":{"type":"string"},"type":"array","maxItems":3,"minItems":1,"title":"Crops","description":"Cultivos a evaluar, p. ej. ['soja','maiz']. Ver GET /v1/agro/crops."},"season":{"type":"string","title":"Season","description":"'verano' o 'invierno' (ciclo de la campaña).","default":"verano"},"distance_to_port_km":{"anyOf":[{"type":"number","maximum":5000.0,"minimum":0.0},{"type":"null"}],"title":"Distance To Port Km","description":"Distancia real a puerto, para el flete de la capa económica. Si se omite se usa la referencia de zona núcleo y se declara."},"include_economics":{"type":"boolean","title":"Include Economics","description":"Sólo investigación interna: calcular economía experimental. Por defecto queda deshabilitada.","default":false}},"type":"object","required":["crops"],"title":"SuitabilityRequest","description":"Lote + cultivos a evaluar.\n\n``geometry`` es lo recomendado y lo que el producto premia: el análisis se\nciñe EXACTAMENTE a ese polígono. Con ``bbox`` se analiza el rectángulo y la\nrespuesta lo declara — un rectángulo mete alambrados, caminos y lotes\nvecinos dentro del promedio."},"TokenRequest":{"properties":{"token":{"type":"string","maxLength":512,"minLength":8,"title":"Token"}},"type":"object","required":["token"],"title":"TokenRequest"},"TraceSource":{"properties":{"provider":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Provider"},"collection":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Collection"},"satellite":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Satellite"},"scene_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scene Id"},"acquired_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Acquired At","description":"Hora de la pasada. El momento de la verdad."},"indexed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Indexed At"},"license":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"License"},"processing_level":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Processing Level"}},"type":"object","title":"TraceSource"},"Traceability":{"properties":{"source":{"$ref":"#/components/schemas/TraceSource"},"bands_used":{"items":{"$ref":"#/components/schemas/BandUsed"},"type":"array","title":"Bands Used"},"math":{"items":{"type":"string"},"type":"array","title":"Math","description":"Pasos del cálculo con los números reales. Rehacible a mano."},"threshold":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Threshold"},"known_limits":{"items":{"type":"string"},"type":"array","title":"Known Limits"}},"type":"object","title":"Traceability","description":"La matemática detrás, explícita, determinística y auditable.\n\n``math`` es una lista de pasos en texto plano, con los números reales sustituidos. Un\ncliente (o un regulador) tiene que poder rehacer la cuenta a mano. La IA no puede\nintroducir opacidad: el LLM redacta, el código calcula."},"UnifiedLayerBody":{"properties":{"domain":{"type":"string","title":"Domain"},"geometry":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Geometry"},"bbox":{"anyOf":[{"items":{"type":"number"},"type":"array"},{"type":"null"}],"title":"Bbox"},"lang":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lang"},"include_behavior":{"type":"boolean","title":"Include Behavior","default":false}},"type":"object","required":["domain"],"title":"UnifiedLayerBody","description":"Dominio (minerals|crops|water|fires) + terreno (geometry) o bbox."},"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"},"ViewportFeaturesRequest":{"properties":{"bbox":{"items":{"type":"number"},"type":"array","maxItems":4,"minItems":4,"title":"Bbox","description":"Viewport como [oeste, sur, este, norte] (WGS84 grados)."},"limit":{"anyOf":[{"type":"integer","maximum":9.0,"minimum":1.0},{"type":"null"}],"title":"Limit","description":"Nº de burbujas por vista (default automático según el área)."}},"type":"object","required":["bbox"],"title":"ViewportFeaturesRequest","description":"Viewport visible del mapa (∩ zona de interés) para las burbujas ricas."},"ZonalStatsRequest":{"properties":{"bbox":{"anyOf":[{"items":{"type":"number"},"type":"array","maxItems":4,"minItems":4},{"type":"null"}],"title":"Bbox","description":"AOI as [west, south, east, north] (WGS84 degrees). Max span 1.0° per side. Alternative to 'geometry'."},"geometry":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Geometry","description":"AOI as a GeoJSON Polygon/MultiPolygon (WGS84). Alternative to 'bbox'. Envelope max span 1.0° per side."},"datetime_from":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Datetime From","description":"Start of search period, ISO-8601 (default: 30 days ago)."},"datetime_to":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Datetime To","description":"End of search period, ISO-8601 (default: today)."},"max_cloud":{"type":"number","maximum":100.0,"minimum":0.0,"title":"Max Cloud","description":"Max scene-level cloud cover percent considered.","default":60.0},"index":{"type":"string","title":"Index","description":"Spectral index to compute: evi, nbr, ndmi, ndre, ndvi, ndwi, savi.","default":"ndvi"}},"type":"object","title":"ZonalStatsRequest","description":"AOI + a single spectral index for real-pixel zonal statistics."},"ZoneFeaturesRequest":{"properties":{"bbox":{"items":{"type":"number"},"type":"array","maxItems":4,"minItems":4,"title":"Bbox","description":"Viewport como [oeste, sur, este, norte] (WGS84 grados)."},"index":{"type":"string","title":"Index","description":"Índice a pintar: ndvi | ndmi (default ndvi).","default":"ndvi"},"grid":{"anyOf":[{"type":"integer","maximum":12.0,"minimum":2.0},{"type":"null"}],"title":"Grid","description":"Nº de celdas por lado (default automático según el zoom)."},"datetime_from":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Datetime From","description":"Inicio del período de búsqueda, ISO-8601 (default: 30 días atrás)."},"datetime_to":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Datetime To","description":"Fin del período de búsqueda, ISO-8601 (default: hoy)."}},"type":"object","required":["bbox"],"title":"ZoneFeaturesRequest","description":"Viewport visible del mapa (∩ zona de interés) + índice a pintar."},"ZoneRequestIn":{"properties":{"bbox":{"anyOf":[{"items":{"type":"number"},"type":"array","maxItems":4,"minItems":4},{"type":"null"}],"title":"Bbox","description":"Recuadro [oeste, sur, este, norte] en WGS84. Tiene prioridad sobre lat/lon si vienen los dos. Largo exacto 4: sin cota, un body de MB en floats se parseaba entero antes del rate limit (GUARDIA M-04)."},"lat":{"anyOf":[{"type":"number","maximum":90.0,"minimum":-90.0},{"type":"null"}],"title":"Lat"},"lon":{"anyOf":[{"type":"number","maximum":180.0,"minimum":-180.0},{"type":"null"}],"title":"Lon"},"note":{"type":"string","maxLength":500,"title":"Note","description":"Qué necesita el usuario de esa zona (opcional).","default":""},"lang":{"type":"string","maxLength":8,"title":"Lang","default":"es"}},"type":"object","title":"ZoneRequestIn","description":"Zona pedida: recuadro (``bbox``) o punto (``lat``/``lon``), y nota libre."},"app__analytics__router__CompareRequest":{"properties":{"bbox":{"anyOf":[{"items":{"type":"number"},"type":"array","maxItems":4,"minItems":4},{"type":"null"}],"title":"Bbox","description":"[oeste, sur, este, norte] WGS84; máx 0.5° por lado."},"geometry":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Geometry","description":"GeoJSON Polygon/MultiPolygon (alternativa a bbox)."},"index":{"type":"string","title":"Index","description":"Uno de: ndvi, ndmi, ndwi, nbr.","default":"ndvi"},"date_a":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Date A","description":"Fecha 'antes' (ISO) o 'auto'/None para automático."},"date_b":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Date B","description":"Fecha 'después' (ISO) o 'auto'/None (auto = escena más fresca vs ~30 días antes)."}},"type":"object","title":"CompareRequest"},"app__analytics__router__TimeseriesRequest":{"properties":{"bbox":{"anyOf":[{"items":{"type":"number"},"type":"array","maxItems":4,"minItems":4},{"type":"null"}],"title":"Bbox","description":"[oeste, sur, este, norte] WGS84; máx 0.5° por lado."},"geometry":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Geometry","description":"GeoJSON Polygon/MultiPolygon (alternativa a bbox)."},"index":{"type":"string","title":"Index","description":"Uno de: ndvi, ndmi, ndwi, nbr.","default":"ndvi"},"from":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"From","description":"Inicio ISO-8601 (default: hace 90 días)."},"to":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"To","description":"Fin ISO-8601 (default: hoy)."},"max_scenes":{"type":"integer","maximum":16.0,"minimum":2.0,"title":"Max Scenes","description":"Máx escenas medidas (submuestreo uniforme del período).","default":12}},"type":"object","title":"TimeseriesRequest"},"app__design__router__CompareRequest":{"properties":{"coordinates":{"title":"Coordinates"},"specs":{"items":{"type":"object"},"type":"array","maxItems":5,"minItems":2,"title":"Specs"}},"type":"object","required":["coordinates","specs"],"title":"CompareRequest"},"app__timeline__router__CompareRequest":{"properties":{"feature":{"type":"string","title":"Feature","description":"Feature histórica: vegetation, water, flood, forest, fire, urban, landcover, moisture, temperature — o un product_id (crop_health, water_flood, …) o texto libre ('agua', 'bosque')."},"bbox":{"anyOf":[{"items":{"type":"number"},"type":"array","maxItems":4,"minItems":4},{"type":"null"}],"title":"Bbox","description":"[oeste, sur, este, norte] WGS84."},"geometry":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Geometry","description":"GeoJSON Polygon/MultiPolygon (alternativa a bbox)."},"backend":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Backend","description":"Forzar backend: fine | annual | fire | climate (default: el motor elige por feature y período)."},"date_a":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Date A","description":"'Antes' — fecha ISO o año."},"date_b":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Date B","description":"'Después' — fecha ISO o año."}},"type":"object","required":["feature"],"title":"CompareRequest"},"app__timeline__router__TimeseriesRequest":{"properties":{"feature":{"type":"string","title":"Feature","description":"Feature histórica: vegetation, water, flood, forest, fire, urban, landcover, moisture, temperature — o un product_id (crop_health, water_flood, …) o texto libre ('agua', 'bosque')."},"bbox":{"anyOf":[{"items":{"type":"number"},"type":"array","maxItems":4,"minItems":4},{"type":"null"}],"title":"Bbox","description":"[oeste, sur, este, norte] WGS84."},"geometry":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Geometry","description":"GeoJSON Polygon/MultiPolygon (alternativa a bbox)."},"backend":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Backend","description":"Forzar backend: fine | annual | fire | climate (default: el motor elige por feature y período)."},"from":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"From","description":"Inicio ISO-8601 o año (default por feature)."},"to":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"To","description":"Fin ISO-8601 o año (default: hoy)."}},"type":"object","required":["feature"],"title":"TimeseriesRequest"}},"securitySchemes":{"APIKeyHeader":{"type":"apiKey","in":"header","name":"X-API-Key"}}}}