{"openapi":"3.1.0","info":{"title":"LEX-MEX","description":"Asistente jurídico para legislación federal mexicana","version":"15.0"},"paths":{"/legal-tracer":{"post":{"summary":"Trazabilidad legal de un caso (UT8 Legal Tracer) — requiere plan Premium o VIP","description":"Analiza un caso legal y devuelve la cadena normativa aplicable.\n\nRequiere autenticación (JWT Bearer) y plan Premium o VIP.\nRate limit: 10 req/min (premium) · 30 req/min (vip).","operationId":"legal_tracer_legal_tracer_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CasoRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/legal-tracer/pdf":{"post":{"summary":"Descarga en PDF el último análisis de Legal Tracer — requiere plan Premium o VIP","description":"UPGRADE (2026-07-08): endpoint que faltaba montar. legal_tracer_pdf.py\n(generar_pdf_legal_tracer) ya existía completo y funcional en el repo\n— nadie lo había conectado a una ruta, así que el botón \"Descargar\nPDF\" del frontend (que sí lo llama desde hace tiempo) devolvía 404\nen el 100% de los casos. No se toca legal_tracer_pdf.py.\n\nNo vuelve a llamar al LLM — solo formatea a PDF el `resultado` que\nel cliente ya recibió de POST /legal-tracer. Mismo gating de plan\nque el análisis; rate limit propio y más estricto porque generar\nPDF es más costoso en CPU que servir el JSON.","operationId":"legal_tracer_pdf_legal_tracer_pdf_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PdfRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/mcp/{path}":{"delete":{"summary":" Mcp Gateway","description":"Proxy transparente app.py → mcp_service.py, con streaming.","operationId":"_mcp_gateway_mcp__path__delete","parameters":[{"name":"path","in":"path","required":true,"schema":{"type":"string","title":"Path"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"summary":" Mcp Gateway","description":"Proxy transparente app.py → mcp_service.py, con streaming.","operationId":"_mcp_gateway_mcp__path__delete","parameters":[{"name":"path","in":"path","required":true,"schema":{"type":"string","title":"Path"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":" Mcp Gateway","description":"Proxy transparente app.py → mcp_service.py, con streaming.","operationId":"_mcp_gateway_mcp__path__delete","parameters":[{"name":"path","in":"path","required":true,"schema":{"type":"string","title":"Path"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/mcp":{"delete":{"summary":" Mcp Gateway","description":"Proxy transparente app.py → mcp_service.py, con streaming.","operationId":"_mcp_gateway_mcp_delete","parameters":[{"name":"path","in":"query","required":false,"schema":{"type":"string","default":"","title":"Path"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"summary":" Mcp Gateway","description":"Proxy transparente app.py → mcp_service.py, con streaming.","operationId":"_mcp_gateway_mcp_delete","parameters":[{"name":"path","in":"query","required":false,"schema":{"type":"string","default":"","title":"Path"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":" Mcp Gateway","description":"Proxy transparente app.py → mcp_service.py, con streaming.","operationId":"_mcp_gateway_mcp_delete","parameters":[{"name":"path","in":"query","required":false,"schema":{"type":"string","default":"","title":"Path"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/.well-known/oauth-protected-resource/mcp":{"get":{"summary":" Mcp Well Known Gateway","operationId":"_mcp_well_known_gateway__well_known_oauth_protected_resource_mcp_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"options":{"summary":" Mcp Well Known Gateway","operationId":"_mcp_well_known_gateway__well_known_oauth_protected_resource_mcp_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/mcp-oauth/consent/info":{"get":{"tags":["MCP OAuth"],"summary":"Datos públicos de una solicitud de consentimiento pendiente","description":"Sin autenticación — el request_id ya es la capacidad secreta\n(impredecible, TTL de 10 min, un solo uso). Devuelve solo lo\nnecesario para pintar la pantalla; nunca el code_challenge.","operationId":"consent_info_mcp_oauth_consent_info_get","parameters":[{"name":"request_id","in":"query","required":true,"schema":{"type":"string","title":"Request Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/mcp-oauth/consent/aprobar":{"post":{"tags":["MCP OAuth"],"summary":"Aprobar una solicitud de acceso MCP","operationId":"consent_aprobar_mcp_oauth_consent_aprobar_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/_AccionConsentimiento"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/mcp-oauth/consent/rechazar":{"post":{"tags":["MCP OAuth"],"summary":"Rechazar una solicitud de acceso MCP","operationId":"consent_rechazar_mcp_oauth_consent_rechazar_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/_AccionConsentimiento"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/mcp-oauth/consent":{"get":{"tags":["MCP OAuth"],"summary":"Pantalla de consentimiento MCP (humano)","description":"Página estática con JS mínimo — a propósito no es parte del\nfrontend SPA (static/index.html): este flujo lo abre un cliente\nMCP externo (Claude Desktop, VS Code) en un navegador del sistema,\nno dentro de la app de LexMex, así que tiene que sostenerse sola.\n\nReusa localStorage/sessionStorage(\"lexmex_token\") — el mismo JWT\nque ya usa el resto del sitio (ver static/dashboard.html,\nstatic/index.html) — así que si el humano ya tenía sesión iniciada\nen el navegador, esta pantalla la detecta sola y no vuelve a pedir\nlogin.","operationId":"consent_page_mcp_oauth_consent_get","parameters":[{"name":"request_id","in":"query","required":true,"schema":{"type":"string","title":"Request Id"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/mcp-oauth/introspect":{"post":{"tags":["MCP OAuth"],"summary":"[interno] Verifica un Bearer token para el Resource Server MCP","operationId":"introspect_mcp_oauth_introspect_post","parameters":[{"name":"x-introspect-secret","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Introspect-Secret"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/_IntrospectRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/register":{"post":{"tags":["Autenticación"],"summary":"Crear cuenta nueva con email/password","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":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/login":{"post":{"tags":["Autenticación"],"summary":"Iniciar sesión con email/password","operationId":"login_login_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/forgot-password":{"post":{"tags":["Autenticación"],"summary":"Solicitar enlace de recuperación de contraseña","operationId":"forgot_password_forgot_password_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForgotPasswordRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/reset-password":{"post":{"tags":["Autenticación"],"summary":"Establecer nueva contraseña con el token del correo","operationId":"reset_password_reset_password_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResetPasswordRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/refresh":{"post":{"tags":["Autenticación"],"summary":"Renueva el access token","operationId":"refresh_refresh_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RefreshRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/logout":{"post":{"tags":["Autenticación"],"summary":"Cerrar sesión (revoca refresh token actual)","operationId":"logout_logout_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RefreshRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/logout-all":{"post":{"tags":["Autenticación"],"summary":"Cerrar todas las sesiones","operationId":"logout_all_logout_all_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/me":{"get":{"tags":["Autenticación"],"summary":"Perfil del usuario autenticado","operationId":"me_me_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Autenticación"],"summary":"Actualizar perfil","operationId":"actualizar_perfil_me_patch","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActualizarPerfilRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/mi-uso":{"get":{"tags":["Autenticación"],"summary":"Uso actual del plan","operationId":"mi_uso_mi_uso_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/mi-actividad":{"get":{"tags":["Autenticación"],"summary":"Historial de uso para el dashboard","description":"Historial de actividad para graficar en el dashboard.\n\nPlan gratuito: acumula consultas de por vida (un solo contador).\nPlanes premium/vip: serie diaria real de los últimos N días (sin huecos).","operationId":"mi_actividad_mi_actividad_get","parameters":[{"name":"dias","in":"query","required":false,"schema":{"type":"integer","maximum":90,"minimum":7,"description":"Días de historial (solo planes de pago)","default":30,"title":"Dias"},"description":"Días de historial (solo planes de pago)"},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/downgrade-gratuito":{"post":{"tags":["Autenticación"],"summary":"Bajar al plan Gratuito voluntariamente","description":"Permite que el usuario baje su propio plan al nivel Gratuito.\nEste es el único cambio de plan que un usuario puede hacer\ndirectamente — cualquier upgrade requiere pasar por Stripe.\n\nNota: si tiene una suscripción activa en Stripe, debe cancelarla\nprimero desde /cancelar-suscripcion para evitar cargos continuos.","operationId":"downgrade_gratuito_downgrade_gratuito_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/crear-checkout":{"post":{"tags":["Autenticación"],"summary":"Crear sesión de pago Stripe","description":"v15.0 — FIX C4: el price_id ya no viene del cliente.\nEl servidor lo resuelve internamente desde config.STRIPE_PRICE_MAP.\nEl cliente solo manda el nombre del plan ('premium' o 'vip').","operationId":"crear_checkout_crear_checkout_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckoutRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/crear-portal-stripe":{"post":{"tags":["Autenticación"],"summary":"Crear sesión del Customer Portal de Stripe (facturación)","description":"Genera una URL al Customer Portal de Stripe, donde el usuario puede\nver/descargar sus facturas, actualizar su método de pago y gestionar\nsu suscripción directamente con Stripe como fuente de verdad.","operationId":"crear_portal_stripe_crear_portal_stripe_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/cancelar-suscripcion":{"post":{"tags":["Autenticación"],"summary":"Cancelar suscripción al fin del periodo actual","description":"Marca la suscripción para cancelarse al final del periodo ya pagado.\nEl usuario conserva los beneficios hasta esa fecha; después pasa a Gratuito.","operationId":"cancelar_suscripcion_cancelar_suscripcion_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/transcribir":{"post":{"tags":["Autenticación"],"summary":"Transcribe audio con Whisper via Groq","description":"v15.0 — FIX C3:\n- Requiere autenticación (cualquier plan, incluido gratuito).\n- Límite de tamaño: TRANSCRIBIR_MAX_BYTES (default 10 MB).\n- Rate limit propio: 20 req/min por UID + 10 req/min por IP.\n- Validación de extensión de archivo.\n- Movido de app.py a auth_routes.py para centralizar la auth.\n\nNota para el frontend: este endpoint ya no está en /transcribir (app.py).\nEl router de auth se monta en app.py sin prefijo, así que la URL\nsigue siendo POST /transcribir — sin cambios en el cliente.","operationId":"transcribir_transcribir_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/aceptar-tc":{"post":{"tags":["Autenticación"],"summary":"Registrar aceptación de T&C y Aviso de Privacidad","description":"Registra la aceptación legal con IP + timestamp + user_agent.\nFunciona con o sin sesión.\n\nNota M5: actualmente guarda en Redis (ephemeral). La migración a\nPostgres (persistente) está pendiente en el backlog de seguridad.","operationId":"aceptar_tc_aceptar_tc_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/mi-cuenta":{"delete":{"tags":["Autenticación"],"summary":"Elimina la cuenta de forma permanente e irreversible","description":"Elimina la cuenta del usuario autenticado.\n\nIRREVERSIBLE: email, nombre, contraseña y vínculo de Google se\nsobrescriben permanentemente. La fila en DB se conserva solo para\nintegridad referencial con historial de uso y pagos de Stripe.\n\nRequiere confirmación explícita: el email exacto de la cuenta\no la palabra \"ELIMINAR\".","operationId":"eliminar_mi_cuenta_mi_cuenta_delete","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConfirmarEliminacionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/validador/feedback":{"post":{"tags":["Autenticación","Validadores"],"summary":"Registrar calificación de respuesta (solo validadores)","description":"v20.0 — Consejo Validador.\n\nRegistra la calificación (👍/👎) de un validador sobre una respuesta\ndel sistema. Solo usuarios con is_validator=True pueden usar este endpoint.\n\nEl campo query_id es el identificador de la respuesta en el frontend\n(generado en el cliente al renderizar la respuesta).\nEl campo comment es opcional — para el juicio jurídico del abogado.","operationId":"validador_feedback_validador_feedback_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidatorFeedbackRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/costos":{"get":{"tags":["admin"],"summary":"Costos Mes Actual","description":"Devuelve el resumen de costos del mes actual.\nHeader requerido: X-Admin-Token","operationId":"costos_mes_actual_admin_costos_get","parameters":[{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/costos/{mes}":{"get":{"tags":["admin"],"summary":"Costos Mes","description":"Devuelve el resumen de costos de un mes específico (formato YYYY-MM).\nHeader requerido: X-Admin-Token","operationId":"costos_mes_admin_costos__mes__get","parameters":[{"name":"mes","in":"path","required":true,"schema":{"type":"string","title":"Mes"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/verificaciones/resumen":{"get":{"tags":["admin"],"summary":"Verificaciones Resumen","description":"Tasa de respuestas de /chat con citas no verificadas en los últimos\n`dias` días (default 7, máx 90). Útil para ver si el pipeline RAG\nmejora o empeora con el tiempo, y detectar picos tras un deploy.","operationId":"verificaciones_resumen_admin_verificaciones_resumen_get","parameters":[{"name":"dias","in":"query","required":false,"schema":{"type":"integer","maximum":90,"minimum":1,"default":7,"title":"Dias"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/verificaciones/top-alucinaciones":{"get":{"tags":["admin"],"summary":"Verificaciones Top","description":"Artículos citados por el LLM que más veces NO se encontraron en el\ncontexto RAG — la lista priorizada de qué revisar primero en la\nindexación/base de artículos (¿falta esa ley? ¿el número está mal\nnormalizado? ¿el LLM simplemente inventó el artículo?).","operationId":"verificaciones_top_admin_verificaciones_top_alucinaciones_get","parameters":[{"name":"dias","in":"query","required":false,"schema":{"type":"integer","maximum":90,"minimum":1,"default":7,"title":"Dias"}},{"name":"limite","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":15,"title":"Limite"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/documentos/subir":{"post":{"tags":["Documentos"],"summary":"Sube un contrato, demanda o convenio para análisis jurídico con IA","description":"Recibe archivo (PDF/DOCX/TXT), extrae texto, guarda en BD y lanza análisis en background.\n\nParámetro de form-data opcional:\n  retencion: 'guardar' (default) | 'efimero'\n    - 'guardar'  → comportamiento normal: texto + análisis persisten en Postgres\n    - 'efimero'  → Zero Data Retention: funciona con normalidad (análisis,\n                   preguntas de seguimiento) mientras la sesión sigue activa.\n                   El documento se borra al cerrar sesión (/logout o\n                   /logout-all), no inmediatamente tras el análisis.","operationId":"subir_documento_api_v1_documentos_subir_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/documentos":{"get":{"tags":["Documentos"],"summary":"Lista los documentos del usuario con estado de procesamiento","operationId":"listar_documentos_api_v1_documentos_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/documentos/{documento_id}/analisis":{"get":{"tags":["Documentos"],"summary":"Obtiene el análisis de un documento (polling-friendly)","description":"Devuelve el análisis de un documento.\n\nEstados posibles en la respuesta:\n  estado='procesando' → análisis LLM aún corriendo (HTTP 202)\n  estado='completado' → análisis disponible (HTTP 200)\n  estado='error'      → el análisis falló (HTTP 200 con campo error)\n\nFIX v21: usa JSONResponse(status_code=202) correctamente (no la sintaxis Flask).","operationId":"obtener_analisis_api_v1_documentos__documento_id__analisis_get","parameters":[{"name":"documento_id","in":"path","required":true,"schema":{"type":"integer","title":"Documento Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/documentos/{documento_id}/texto":{"get":{"tags":["Documentos"],"summary":"Texto original extraído del documento, para comparar contra el análisis","operationId":"obtener_texto_documento_api_v1_documentos__documento_id__texto_get","parameters":[{"name":"documento_id","in":"path","required":true,"schema":{"type":"integer","title":"Documento Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/documentos/{documento_id}/exportar":{"get":{"tags":["Documentos"],"summary":"Exporta el análisis de un documento a PDF o Markdown","description":"Exporta el análisis YA COMPLETADO de un documento como archivo\ndescargable — formato='pdf' (default) o 'markdown'.\n\nNo requiere texto_extraido: solo analisis_json, que persiste incluso\npara documentos efímeros (ZDR) cuyo texto ya fue borrado.","operationId":"exportar_analisis_api_v1_documentos__documento_id__exportar_get","parameters":[{"name":"documento_id","in":"path","required":true,"schema":{"type":"integer","title":"Documento Id"}},{"name":"formato","in":"query","required":false,"schema":{"type":"string","default":"pdf","title":"Formato"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/documentos/{documento_id}/preguntar":{"post":{"tags":["Documentos"],"summary":"Pregunta de seguimiento sobre un documento (LLM real)","description":"Chat de seguimiento con LLM real sobre un documento analizado.\nNo disponible para documentos efímeros (el texto fue eliminado).","operationId":"preguntar_documento_api_v1_documentos__documento_id__preguntar_post","parameters":[{"name":"documento_id","in":"path","required":true,"schema":{"type":"integer","title":"Documento Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreguntarDocumentoRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/documentos/{documento_id}/chat":{"get":{"tags":["Documentos"],"summary":"Historial de chat de un documento","operationId":"obtener_chat_api_v1_documentos__documento_id__chat_get","parameters":[{"name":"documento_id","in":"path","required":true,"schema":{"type":"integer","title":"Documento Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/documentos/{documento_id}":{"delete":{"tags":["Documentos"],"summary":"Elimina un documento, su análisis y chat","operationId":"eliminar_documento_api_v1_documentos__documento_id__delete","parameters":[{"name":"documento_id","in":"path","required":true,"schema":{"type":"integer","title":"Documento Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/casos":{"post":{"tags":["Casos"],"summary":"Crea un nuevo expediente","operationId":"crear_caso_api_v1_casos_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CasoCrear"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Casos"],"summary":"Lista los expedientes del usuario","operationId":"listar_casos_api_v1_casos_get","parameters":[{"name":"estatus","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Estatus"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/casos/{caso_id}":{"get":{"tags":["Casos"],"summary":"Detalle de un expediente con sus documentos","operationId":"obtener_caso_api_v1_casos__caso_id__get","parameters":[{"name":"caso_id","in":"path","required":true,"schema":{"type":"integer","title":"Caso Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["Casos"],"summary":"Actualiza un expediente","operationId":"actualizar_caso_api_v1_casos__caso_id__put","parameters":[{"name":"caso_id","in":"path","required":true,"schema":{"type":"integer","title":"Caso Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CasoActualizar"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Casos"],"summary":"Elimina un expediente","operationId":"eliminar_caso_api_v1_casos__caso_id__delete","parameters":[{"name":"caso_id","in":"path","required":true,"schema":{"type":"integer","title":"Caso Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/casos/{caso_id}/archivar":{"post":{"tags":["Casos"],"summary":"Cambia el estatus del expediente","operationId":"archivar_caso_api_v1_casos__caso_id__archivar_post","parameters":[{"name":"caso_id","in":"path","required":true,"schema":{"type":"integer","title":"Caso Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ArchivarRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/casos/{caso_id}/documentos/{documento_id}":{"post":{"tags":["Casos"],"summary":"Vincula un documento ya subido a este expediente","operationId":"vincular_documento_api_v1_casos__caso_id__documentos__documento_id__post","parameters":[{"name":"caso_id","in":"path","required":true,"schema":{"type":"integer","title":"Caso Id"}},{"name":"documento_id","in":"path","required":true,"schema":{"type":"integer","title":"Documento Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Casos"],"summary":"Desvincula un documento de este expediente (no lo elimina)","operationId":"desvincular_documento_api_v1_casos__caso_id__documentos__documento_id__delete","parameters":[{"name":"caso_id","in":"path","required":true,"schema":{"type":"integer","title":"Caso Id"}},{"name":"documento_id","in":"path","required":true,"schema":{"type":"integer","title":"Documento Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/casos/{caso_id}/redactar":{"post":{"tags":["Casos"],"summary":"Redacta un escrito (demanda/incidente/amparo) con base en el expediente completo","operationId":"redactar_api_v1_casos__caso_id__redactar_post","parameters":[{"name":"caso_id","in":"path","required":true,"schema":{"type":"integer","title":"Caso Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedactarRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/directorio":{"get":{"summary":"Lista despachos aprobados en el directorio","description":"v21.3 — FIX: esta ruta vivía en GET /directorio, exactamente el mismo path que\nla página HTML pública (@app.get(\"/directorio\") en app.py, sirve directorio.html).\nComo este router se monta con app.include_router() ANTES de que se registre la\nruta de la página (más abajo en app.py), FastAPI/Starlette hacía match con ESTA\nruta primero para cualquier GET /directorio — por eso el navegador siempre veía\nel JSON crudo en vez de la página. Se movió a /api/v1/directorio (mismo patrón\nque el resto de la API, p.ej. /api/v1/documentos) para que /directorio quede\nlibre exclusivamente para la página HTML. static/directorio.html se actualizó\npara pedir datos a esta nueva ruta.","operationId":"listar_directorio_api_v1_directorio_get","parameters":[{"name":"especialidad","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Especialidad"}},{"name":"ciudad","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ciudad"}},{"name":"estado_mx","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Estado Mx"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/directorio/mi-despacho":{"post":{"summary":"[VIP] Registra tu despacho en el directorio","operationId":"crear_mi_despacho_directorio_mi_despacho_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DespachoRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"summary":"[VIP] Ver mi registro en el directorio","operationId":"ver_mi_despacho_directorio_mi_despacho_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"summary":"[VIP] Edita tu despacho","operationId":"editar_mi_despacho_directorio_mi_despacho_put","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DespachoUpdateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"[VIP] Da de baja tu despacho","operationId":"borrar_mi_despacho_directorio_mi_despacho_delete","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/firmas":{"post":{"summary":"[Premium/VIP] Envía un documento a firma electrónica","operationId":"crear_firma_api_v1_firmas_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CrearFirmaRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"summary":"[Premium/VIP] Lista mis solicitudes de firma","operationId":"listar_firmas_api_v1_firmas_get","parameters":[{"name":"documento_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Documento Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/firmas/{firma_id}/refresh":{"post":{"summary":"[Premium/VIP] Sincroniza el estatus con el proveedor","operationId":"sincronizar_firma_api_v1_firmas__firma_id__refresh_post","parameters":[{"name":"firma_id","in":"path","required":true,"schema":{"type":"integer","title":"Firma Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/arco/solicitud":{"post":{"summary":"Ejercer un derecho ARCO (Acceso/Rectificación/Cancelación/Oposición)","operationId":"crear_solicitud_arco_solicitud_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ARCOSolicitudRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/arco/solicitudes":{"get":{"summary":"Listar mis solicitudes ARCO","operationId":"listar_mis_solicitudes_arco_solicitudes_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/arco/solicitud/{ticket}":{"get":{"summary":"Consultar el estado de una solicitud ARCO","operationId":"consultar_solicitud_arco_solicitud__ticket__get","parameters":[{"name":"ticket","in":"path","required":true,"schema":{"type":"string","title":"Ticket"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agenda/terminos":{"post":{"tags":["Agenda"],"summary":"Crea un término, audiencia o recordatorio","operationId":"crear_termino_agenda_terminos_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TerminoCrear"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Agenda"],"summary":"Lista los términos del usuario","operationId":"listar_terminos_agenda_terminos_get","parameters":[{"name":"incluir_cumplidos","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Incluir Cumplidos"}},{"name":"caso_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Caso Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agenda/terminos/{termino_id}":{"get":{"tags":["Agenda"],"summary":"Detalle de un término","operationId":"obtener_termino_agenda_terminos__termino_id__get","parameters":[{"name":"termino_id","in":"path","required":true,"schema":{"type":"integer","title":"Termino Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["Agenda"],"summary":"Actualiza un término","operationId":"actualizar_termino_agenda_terminos__termino_id__put","parameters":[{"name":"termino_id","in":"path","required":true,"schema":{"type":"integer","title":"Termino Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TerminoActualizar"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Agenda"],"summary":"Elimina un término","operationId":"eliminar_termino_agenda_terminos__termino_id__delete","parameters":[{"name":"termino_id","in":"path","required":true,"schema":{"type":"integer","title":"Termino Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agenda/terminos/{termino_id}/cumplir":{"post":{"tags":["Agenda"],"summary":"Marca un término como cumplido","operationId":"cumplir_termino_agenda_terminos__termino_id__cumplir_post","parameters":[{"name":"termino_id","in":"path","required":true,"schema":{"type":"integer","title":"Termino Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agenda/alertas":{"get":{"tags":["Agenda"],"summary":"Términos próximos a vencer o vencidos (para el dashboard)","description":"Pensado para llamarse al iniciar sesión: devuelve los términos\npendientes anotados con 'urgente' (vencen dentro de `dias` días) y\n'vencido' (ya pasó la fecha), calculado en tiempo real — no depende\nde ningún proceso en segundo plano.","operationId":"listar_alertas_agenda_alertas_get","parameters":[{"name":"dias","in":"query","required":false,"schema":{"type":"integer","default":3,"title":"Dias"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/contactos":{"post":{"tags":["Contactos"],"summary":"Crea un contacto (cliente, contraparte, testigo...)","operationId":"crear_contacto_contactos_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContactoCrear"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Contactos"],"summary":"Lista los contactos del usuario","operationId":"listar_contactos_contactos_get","parameters":[{"name":"tipo","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tipo"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/contactos/{contacto_id}":{"get":{"tags":["Contactos"],"summary":"Detalle de un contacto","operationId":"obtener_contacto_contactos__contacto_id__get","parameters":[{"name":"contacto_id","in":"path","required":true,"schema":{"type":"integer","title":"Contacto Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["Contactos"],"summary":"Actualiza un contacto","operationId":"actualizar_contacto_contactos__contacto_id__put","parameters":[{"name":"contacto_id","in":"path","required":true,"schema":{"type":"integer","title":"Contacto Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContactoActualizar"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Contactos"],"summary":"Elimina un contacto","operationId":"eliminar_contacto_contactos__contacto_id__delete","parameters":[{"name":"contacto_id","in":"path","required":true,"schema":{"type":"integer","title":"Contacto Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/casos/{caso_id}/contactos/{contacto_id}":{"post":{"tags":["Contactos"],"summary":"Vincula un contacto a un expediente (con rol específico)","operationId":"vincular_contacto_api_v1_casos__caso_id__contactos__contacto_id__post","parameters":[{"name":"caso_id","in":"path","required":true,"schema":{"type":"integer","title":"Caso Id"}},{"name":"contacto_id","in":"path","required":true,"schema":{"type":"integer","title":"Contacto Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VincularContactoRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Contactos"],"summary":"Desvincula un contacto de un expediente","operationId":"desvincular_contacto_api_v1_casos__caso_id__contactos__contacto_id__delete","parameters":[{"name":"caso_id","in":"path","required":true,"schema":{"type":"integer","title":"Caso Id"}},{"name":"contacto_id","in":"path","required":true,"schema":{"type":"integer","title":"Contacto Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/casos/{caso_id}/contactos":{"get":{"tags":["Contactos"],"summary":"Lista los contactos vinculados a un expediente","operationId":"listar_contactos_del_caso_api_v1_casos__caso_id__contactos_get","parameters":[{"name":"caso_id","in":"path","required":true,"schema":{"type":"integer","title":"Caso Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/agents/pricing":{"get":{"tags":["Agentic Commerce"],"summary":"Precios machine-readable para agentes de IA","description":"Versión machine-readable de los planes reales de LexMex (los mismos\nque ve un humano en /app/dashboard), pensada para que un agente de\nIA evalúe costos antes de recomendar o integrar LexMex.\n\nFuente de verdad: auth/planes.py — el mismo dict que usa todo el\nsistema de límites de consultas/documentos. Si cambias un precio\nahí, este endpoint lo refleja automáticamente sin tocar nada aquí.","operationId":"pricing_para_agentes_api_v1_agents_pricing_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/agents/stripe-config":{"get":{"tags":["Agentic Commerce"],"summary":"Clave publicable de Stripe (necesaria para completar 3DS en el navegador)","operationId":"stripe_config_api_v1_agents_stripe_config_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/agents/servicios":{"get":{"tags":["Agentic Commerce"],"summary":"Catálogo de servicios de pago único (machine-readable)","operationId":"catalogo_servicios_api_v1_agents_servicios_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/agents/cobro-directo":{"post":{"tags":["Agentic Commerce"],"summary":"Cobra un servicio de pago único con la tarjeta ya guardada en Stripe","operationId":"cobro_directo_api_v1_agents_cobro_directo_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CobroDirectoRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/agents/mis-compras":{"get":{"tags":["Agentic Commerce"],"summary":"Historial de compras de pago único del usuario autenticado","operationId":"mis_compras_api_v1_agents_mis_compras_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/agents/confirmar-3ds":{"post":{"tags":["Agentic Commerce"],"summary":"Reconcilia una compra tras completar la autenticación 3DS en el navegador","operationId":"confirmar_3ds_api_v1_agents_confirmar_3ds_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Confirmar3DSRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/agents/detectar-intento":{"post":{"tags":["Agentic Commerce"],"summary":"Detecta (por palabras clave) si el mensaje sugiere intención de compra","operationId":"detectar_intento_api_v1_agents_detectar_intento_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DetectarIntentoRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/checkout_sessions":{"post":{"tags":["ACP Agentic Checkout"],"summary":"Crear Checkout Session","operationId":"crear_checkout_session_checkout_sessions_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"API-Version","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api-Version"}},{"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/CrearSesionRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/checkout_sessions/{session_id}":{"post":{"tags":["ACP Agentic Checkout"],"summary":"Actualizar Checkout Session","operationId":"actualizar_checkout_session_checkout_sessions__session_id__post","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"API-Version","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api-Version"}},{"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/ActualizarSesionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["ACP Agentic Checkout"],"summary":"Obtener Checkout Session","operationId":"obtener_checkout_session_checkout_sessions__session_id__get","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"API-Version","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api-Version"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/checkout_sessions/{session_id}/complete":{"post":{"tags":["ACP Agentic Checkout"],"summary":"Completar Checkout Session","operationId":"completar_checkout_session_checkout_sessions__session_id__complete_post","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"API-Version","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api-Version"}},{"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/CompletarSesionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/checkout_sessions/{session_id}/cancel":{"post":{"tags":["ACP Agentic Checkout"],"summary":"Cancelar Checkout Session","operationId":"cancelar_checkout_session_checkout_sessions__session_id__cancel_post","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"API-Version","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api-Version"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Idempotency-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/leyes":{"get":{"summary":"Lista todas las leyes indexadas","operationId":"listar_leyes_leyes_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string","description":"Filtrar por nombre","default":"","title":"Q"},"description":"Filtrar por nombre"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/articulo":{"get":{"summary":"Consulta directa de artículo por ley y número","operationId":"consultar_articulo_articulo_get","parameters":[{"name":"pdf","in":"query","required":true,"schema":{"type":"string","title":"Pdf"}},{"name":"num","in":"query","required":true,"schema":{"type":"string","title":"Num"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/health":{"get":{"summary":"Health check","operationId":"health_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/status":{"get":{"summary":"Estado del sistema (público — resumen; detalle con X-Admin-Token)","description":"SECURITY FIX v22.1 (auditoría 2026-07-05, punto 1 — exposición de\ninformación): /status era público y devolvía conteos de API keys\npor proveedor, si Stripe/Google OAuth/Sentry están activos y el\nvolumen de llamadas LLM — reconocimiento gratis de infraestructura\npara cualquier visitante anónimo.\n\nFIX (cero downgrade — no rompe monitoreo existente que ya hace polling\nde /status sin header): sin X-Admin-Token válido se devuelve un\nresumen mínimo (ok/degraded + versión + uptime), suficiente para un\nuptime monitor externo. El detalle completo (antes 100% público)\nsigue disponible exactamente igual que antes, pero ahora requiere el\nmismo X-Admin-Token que ya protege /upgrade y /admin/* — no hay\nsuperficie nueva, es el secreto que ya tenías en Railway.","operationId":"status_status_get","parameters":[{"name":"X-Admin-Token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/nueva_sesion":{"post":{"summary":"Reinicia una sesión existente","operationId":"nueva_sesion_nueva_sesion_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NuevaSesionRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/chat":{"post":{"summary":"Consulta jurídica principal con RAG + LLM","operationId":"chat_chat_post","parameters":[{"name":"X-Admin-Token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}},{"name":"X-Debug-No-Cache","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Debug-No-Cache"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/analizar-documento":{"post":{"tags":["Ordina"],"summary":"Extrae citas jurídicas de un documento (Ordina)","description":"Analiza texto libre y extrae artículos, tesis y jurisprudencias citadas.\nDetecta abreviaturas (LFT, CPEUM, etc.) y las expande automáticamente.\nPowered by Ordina — Jurislex + SJF.","operationId":"analizar_documento_api_v1_analizar_documento_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnalizarDocumentoRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/articulo-oficial":{"post":{"tags":["Ordina"],"summary":"Busca artículo en fuentes oficiales (Ordina/Jurislex/SIL)","description":"Obtiene el texto oficial actualizado de un artículo directamente\ndesde Jurislex (SCJN) o SIL, vía Ordina.","operationId":"buscar_articulo_oficial_endpoint_api_v1_articulo_oficial_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BuscarArticuloRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/jurisprudencia":{"get":{"tags":["Ordina"],"summary":"Busca jurisprudencia en el SJF (Ordina)","description":"Busca tesis y jurisprudencia en el Semanario Judicial de la Federación.","operationId":"buscar_jurisprudencia_endpoint_api_v1_jurisprudencia_get","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":3,"description":"Término de búsqueda","title":"Q"},"description":"Término de búsqueda"},{"name":"n","in":"query","required":false,"schema":{"type":"integer","maximum":20,"minimum":1,"description":"Número de resultados","default":5,"title":"N"},"description":"Número de resultados"},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/consulta":{"post":{"tags":["API Pública"],"summary":"Consulta jurídica programática (requiere plan VIP)","description":"Versión programática de /chat para integraciones de terceros.\n\nCada llamada es independiente (sin memoria de conversación entre\nrequests — cada integración externa gestiona su propio contexto\nsi lo necesita). Reutiliza exactamente el mismo motor RAG+LLM que\nel chat web, así que cuenta contra el mismo límite de consultas\nde tu plan y aparece en tu Actividad reciente del dashboard.\n\nRespuesta:\n  respuesta   — texto de la respuesta legal\n  fuentes     — leyes/artículos/jurisprudencia citados\n  confianza   — \"alta\" | \"media\" | \"baja\"\n  version     — versión del motor LEX-MEX que generó la respuesta","operationId":"api_consulta_api_v1_consulta_post","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiConsultaRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/keys":{"post":{"tags":["API Pública"],"summary":"Genera una nueva API key (requiere plan VIP)","operationId":"crear_api_key_endpoint_api_v1_keys_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CrearApiKeyRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["API Pública"],"summary":"Lista tus API keys (sin exponer la key completa)","operationId":"listar_api_keys_endpoint_api_v1_keys_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/keys/{key_id}":{"delete":{"tags":["API Pública"],"summary":"Revoca una API key de forma permanente","operationId":"revocar_api_key_endpoint_api_v1_keys__key_id__delete","parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","title":"Key Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"ARCOSolicitudRequest":{"properties":{"tipo":{"type":"string","enum":["acceso","rectificacion","cancelacion","oposicion"],"title":"Tipo","description":"Derecho ARCO que se ejerce"},"descripcion":{"type":"string","maxLength":2000,"minLength":10,"title":"Descripcion","description":"Explica qué información quieres consultar, corregir, cancelar u oponerte a que se use"},"datos_adicionales":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Datos Adicionales","description":"Campo libre para adjuntar contexto estructurado (ej. qué dato específico corregir y a qué valor)"},"email_confirmacion":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email Confirmacion","description":"Email donde recibir el acuse. Si se omite, se usa el email de tu cuenta."}},"type":"object","required":["tipo","descripcion"],"title":"ARCOSolicitudRequest"},"ActualizarPerfilRequest":{"properties":{"nombre":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Nombre","description":"Nuevo nombre del usuario"}},"type":"object","title":"ActualizarPerfilRequest"},"ActualizarSesionRequest":{"properties":{"items":{"anyOf":[{"items":{"$ref":"#/components/schemas/_Item"},"type":"array"},{"type":"null"}],"title":"Items"},"fulfillment_details":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Fulfillment Details"},"selected_fulfillment_options":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Selected Fulfillment Options"}},"type":"object","title":"ActualizarSesionRequest"},"AnalizarDocumentoRequest":{"properties":{"texto":{"type":"string","minLength":10,"title":"Texto","description":"Texto del documento jurídico a analizar"},"resolver":{"type":"boolean","title":"Resolver","description":"Si True, trae el texto completo de cada cita","default":false}},"type":"object","required":["texto"],"title":"AnalizarDocumentoRequest"},"ApiConsultaRequest":{"properties":{"pregunta":{"type":"string","maxLength":2000,"minLength":1,"title":"Pregunta","description":"Consulta legal en lenguaje natural"}},"type":"object","required":["pregunta"],"title":"ApiConsultaRequest"},"ArchivarRequest":{"properties":{"estatus":{"type":"string","pattern":"^(activo|archivado|concluido)$","title":"Estatus"}},"type":"object","required":["estatus"],"title":"ArchivarRequest"},"BuscarArticuloRequest":{"properties":{"ley":{"type":"string","title":"Ley","description":"Nombre de la ley, ej: 'ley federal del trabajo'"},"articulo":{"type":"string","title":"Articulo","description":"Número de artículo, ej: '123'"}},"type":"object","required":["ley","articulo"],"title":"BuscarArticuloRequest"},"CasoActualizar":{"properties":{"titulo":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Titulo"},"numero_expediente":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Numero Expediente"},"juzgado":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Juzgado"},"materia":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Materia"},"descripcion":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Descripcion"},"partes":{"anyOf":[{"items":{"$ref":"#/components/schemas/ParteModel"},"type":"array"},{"type":"null"}],"title":"Partes"}},"type":"object","title":"CasoActualizar"},"CasoCrear":{"properties":{"titulo":{"type":"string","maxLength":300,"minLength":1,"title":"Titulo"},"numero_expediente":{"type":"string","title":"Numero Expediente","default":""},"juzgado":{"type":"string","title":"Juzgado","default":""},"materia":{"type":"string","title":"Materia","default":""},"descripcion":{"type":"string","title":"Descripcion","default":""},"partes":{"items":{"$ref":"#/components/schemas/ParteModel"},"type":"array","title":"Partes"}},"type":"object","required":["titulo"],"title":"CasoCrear"},"CasoRequest":{"properties":{"caso":{"type":"string","maxLength":2000,"minLength":10,"title":"Caso","description":"Descripción del caso legal a analizar (máx 2 000 caracteres)"}},"type":"object","required":["caso"],"title":"CasoRequest"},"ChatRequest":{"properties":{"pregunta":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pregunta","description":"Consulta legal"},"query":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Query","description":"Alias de pregunta"},"session_id":{"type":"string","title":"Session Id","description":"ID de sesión","default":"default"}},"type":"object","title":"ChatRequest"},"CheckoutRequest":{"properties":{"plan":{"type":"string","title":"Plan","description":"Plan a contratar: 'premium' o 'vip'"}},"type":"object","required":["plan"],"title":"CheckoutRequest","description":"v15.0: solo se acepta `plan`. El servidor resuelve el price_id\ndesde config.STRIPE_PRICE_MAP — el cliente nunca lo manda."},"CobroDirectoRequest":{"properties":{"servicio":{"type":"string","title":"Servicio","description":"Clave del servicio. Ver GET /api/v1/agents/servicios"}},"type":"object","required":["servicio"],"title":"CobroDirectoRequest"},"CompletarSesionRequest":{"properties":{"buyer":{"anyOf":[{"$ref":"#/components/schemas/_Buyer"},{"type":"null"}]},"payment_data":{"$ref":"#/components/schemas/PaymentData"},"authentication_result":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Authentication Result"}},"type":"object","required":["payment_data"],"title":"CompletarSesionRequest"},"Confirmar3DSRequest":{"properties":{"compra_id":{"type":"integer","title":"Compra Id","description":"id devuelto por /cobro-directo"},"payment_intent_id":{"type":"string","title":"Payment Intent Id","description":"id del PaymentIntent (pi_...)"}},"type":"object","required":["compra_id","payment_intent_id"],"title":"Confirmar3DSRequest"},"ConfirmarEliminacionRequest":{"properties":{"confirmacion":{"type":"string","title":"Confirmacion","description":"Debe ser exactamente el email de la cuenta o la palabra ELIMINAR"}},"type":"object","required":["confirmacion"],"title":"ConfirmarEliminacionRequest"},"ContactoActualizar":{"properties":{"nombre":{"anyOf":[{"type":"string","maxLength":300,"minLength":1},{"type":"null"}],"title":"Nombre"},"tipo":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tipo"},"tipo_persona":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tipo Persona"},"rfc":{"anyOf":[{"type":"string","maxLength":13},{"type":"null"}],"title":"Rfc"},"telefono":{"anyOf":[{"type":"string","maxLength":30},{"type":"null"}],"title":"Telefono"},"email":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Email"},"direccion":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Direccion"},"notas":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Notas"}},"type":"object","title":"ContactoActualizar"},"ContactoCrear":{"properties":{"nombre":{"type":"string","maxLength":300,"minLength":1,"title":"Nombre"},"tipo":{"type":"string","title":"Tipo","description":"cliente|contraparte|testigo|perito|abogado_contrario|otro","default":"otro"},"tipo_persona":{"type":"string","title":"Tipo Persona","description":"fisica|moral","default":"fisica"},"rfc":{"type":"string","maxLength":13,"title":"Rfc","default":""},"telefono":{"type":"string","maxLength":30,"title":"Telefono","default":""},"email":{"type":"string","maxLength":200,"title":"Email","default":""},"direccion":{"type":"string","maxLength":500,"title":"Direccion","default":""},"notas":{"type":"string","maxLength":2000,"title":"Notas","default":""}},"type":"object","required":["nombre"],"title":"ContactoCrear"},"CrearApiKeyRequest":{"properties":{"nombre":{"type":"string","maxLength":60,"title":"Nombre","description":"Nombre descriptivo, ej. 'Integración Zapier'","default":"Default"}},"type":"object","title":"CrearApiKeyRequest"},"CrearFirmaRequest":{"properties":{"nombre_doc":{"type":"string","maxLength":255,"minLength":1,"title":"Nombre Doc"},"documento_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Documento Id"},"firmantes":{"items":{"$ref":"#/components/schemas/FirmanteRequest"},"type":"array","maxItems":20,"minItems":1,"title":"Firmantes"},"pdf_base64":{"type":"string","minLength":10,"title":"Pdf Base64"},"mensaje_personalizado":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Mensaje Personalizado"},"lang":{"type":"string","maxLength":5,"title":"Lang","default":"es"}},"type":"object","required":["nombre_doc","firmantes","pdf_base64"],"title":"CrearFirmaRequest"},"CrearSesionRequest":{"properties":{"items":{"items":{"$ref":"#/components/schemas/_Item"},"type":"array","title":"Items"},"buyer":{"anyOf":[{"$ref":"#/components/schemas/_Buyer"},{"type":"null"}]},"fulfillment_details":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Fulfillment Details"}},"type":"object","required":["items"],"title":"CrearSesionRequest"},"DespachoRequest":{"properties":{"nombre":{"type":"string","maxLength":200,"title":"Nombre"},"especialidades":{"items":{"type":"string"},"type":"array","maxItems":20,"title":"Especialidades"},"ciudad":{"type":"string","maxLength":120,"title":"Ciudad","default":""},"estado_mx":{"type":"string","maxLength":120,"title":"Estado Mx","default":""},"contacto_email":{"type":"string","maxLength":200,"title":"Contacto Email","default":""},"contacto_telefono":{"type":"string","maxLength":40,"title":"Contacto Telefono","default":""},"sitio_web":{"type":"string","maxLength":300,"title":"Sitio Web","default":""},"descripcion":{"type":"string","maxLength":2000,"title":"Descripcion","default":""},"logo_url":{"type":"string","maxLength":500,"title":"Logo Url","default":""},"solicitante_telefono":{"type":"string","maxLength":40,"title":"Solicitante Telefono","default":""},"solicitante_email":{"type":"string","maxLength":200,"title":"Solicitante Email","default":""}},"type":"object","required":["nombre"],"title":"DespachoRequest"},"DespachoUpdateRequest":{"properties":{"nombre":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Nombre"},"especialidades":{"anyOf":[{"items":{"type":"string"},"type":"array","maxItems":20},{"type":"null"}],"title":"Especialidades"},"ciudad":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Ciudad"},"estado_mx":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Estado Mx"},"contacto_email":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Contacto Email"},"contacto_telefono":{"anyOf":[{"type":"string","maxLength":40},{"type":"null"}],"title":"Contacto Telefono"},"sitio_web":{"anyOf":[{"type":"string","maxLength":300},{"type":"null"}],"title":"Sitio Web"},"descripcion":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Descripcion"},"logo_url":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Logo Url"},"solicitante_telefono":{"anyOf":[{"type":"string","maxLength":40},{"type":"null"}],"title":"Solicitante Telefono"},"solicitante_email":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Solicitante Email"}},"type":"object","title":"DespachoUpdateRequest"},"DetectarIntentoRequest":{"properties":{"mensaje":{"type":"string","maxLength":4000,"title":"Mensaje","description":"Último mensaje del usuario en el chat"}},"type":"object","required":["mensaje"],"title":"DetectarIntentoRequest"},"FirmanteRequest":{"properties":{"nombre":{"type":"string","maxLength":120,"minLength":1,"title":"Nombre"},"email":{"type":"string","maxLength":200,"minLength":3,"title":"Email"},"auth_mode":{"type":"string","maxLength":40,"title":"Auth Mode","default":"assinaturaTela"}},"type":"object","required":["nombre","email"],"title":"FirmanteRequest"},"ForgotPasswordRequest":{"properties":{"email":{"type":"string","title":"Email","description":"Email de la cuenta a recuperar"}},"type":"object","required":["email"],"title":"ForgotPasswordRequest"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"LoginRequest":{"properties":{"email":{"type":"string","title":"Email","description":"Email registrado"},"password":{"type":"string","title":"Password","description":"Contraseña"}},"type":"object","required":["email","password"],"title":"LoginRequest"},"NuevaSesionRequest":{"properties":{"session_id":{"type":"string","title":"Session Id","default":"default"}},"type":"object","title":"NuevaSesionRequest"},"ParteModel":{"properties":{"nombre":{"type":"string","title":"Nombre"},"rol":{"type":"string","title":"Rol","default":"otro"}},"type":"object","required":["nombre"],"title":"ParteModel"},"PaymentData":{"properties":{"handler_id":{"type":"string","title":"Handler Id"},"instrument":{"additionalProperties":true,"type":"object","title":"Instrument"},"billing_address":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Billing Address"}},"type":"object","required":["handler_id","instrument"],"title":"PaymentData"},"PdfRequest":{"properties":{"caso":{"type":"string","maxLength":2000,"title":"Caso","default":""},"resultado":{"additionalProperties":true,"type":"object","title":"Resultado","description":"El JSON que devolvió POST /legal-tracer"}},"type":"object","required":["resultado"],"title":"PdfRequest","description":"Payload de POST /legal-tracer/pdf — coincide exactamente con lo que\nya manda el frontend (tracerPanel.descargarPdf en static/app.html):\nel caso original y el resultado JSON que devolvió POST /legal-tracer.\nNo se vuelve a llamar al LLM aquí — solo se formatea a PDF lo que ya\nse generó, así que no consume presupuesto de proveedores."},"PreguntarDocumentoRequest":{"properties":{"pregunta":{"type":"string","maxLength":2000,"minLength":1,"title":"Pregunta"}},"type":"object","required":["pregunta"],"title":"PreguntarDocumentoRequest"},"RedactarRequest":{"properties":{"tipo_escrito":{"type":"string","title":"Tipo Escrito","description":"Uno de: ['amparo', 'demanda', 'incidente']"}},"type":"object","required":["tipo_escrito"],"title":"RedactarRequest"},"RefreshRequest":{"properties":{"refresh_token":{"type":"string","title":"Refresh Token","description":"Refresh token obtenido al hacer login"}},"type":"object","required":["refresh_token"],"title":"RefreshRequest"},"RegisterRequest":{"properties":{"email":{"type":"string","title":"Email","description":"Email del usuario"},"password":{"type":"string","minLength":8,"title":"Password","description":"Contraseña (mín. 8 caracteres)"},"nombre":{"type":"string","title":"Nombre","description":"Nombre del usuario","default":""}},"type":"object","required":["email","password"],"title":"RegisterRequest"},"ResetPasswordRequest":{"properties":{"token":{"type":"string","title":"Token","description":"Token recibido por correo"},"password":{"type":"string","minLength":8,"title":"Password","description":"Nueva contraseña (mín. 8 caracteres)"}},"type":"object","required":["token","password"],"title":"ResetPasswordRequest"},"TerminoActualizar":{"properties":{"titulo":{"anyOf":[{"type":"string","maxLength":300,"minLength":1},{"type":"null"}],"title":"Titulo"},"fecha_limite":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Fecha Limite"},"caso_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Caso Id"},"descripcion":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Descripcion"},"tipo":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tipo"}},"type":"object","title":"TerminoActualizar"},"TerminoCrear":{"properties":{"titulo":{"type":"string","maxLength":300,"minLength":1,"title":"Titulo"},"fecha_limite":{"type":"integer","title":"Fecha Limite","description":"Epoch en milisegundos"},"caso_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Caso Id","description":"Expediente asociado (opcional)"},"descripcion":{"type":"string","maxLength":2000,"title":"Descripcion","default":""},"tipo":{"type":"string","title":"Tipo","description":"audiencia|termino|notificacion|otro","default":"termino"}},"type":"object","required":["titulo","fecha_limite"],"title":"TerminoCrear"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"ValidatorFeedbackRequest":{"properties":{"query_id":{"type":"string","title":"Query Id","description":"ID único de la consulta/respuesta calificada"},"query_text":{"type":"string","title":"Query Text","description":"Texto de la consulta (para contexto del CTO)","default":""},"rating":{"type":"boolean","title":"Rating","description":"True=👍 aprobado, False=👎 rechazado"},"comment":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Comment","description":"Comentario jurídico opcional (máx 1000 chars)"},"respuesta_correcta":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Respuesta Correcta","description":"Respuesta jurídicamente correcta propuesta por el validador (solo relevante si rating=False)"},"pregunta_usuario":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pregunta Usuario","description":"v24.3 — pregunta original del usuario que generó la respuesta calificada (para dar contexto al CTO)"}},"type":"object","required":["query_id","rating"],"title":"ValidatorFeedbackRequest"},"VincularContactoRequest":{"properties":{"rol":{"type":"string","maxLength":200,"title":"Rol","description":"Ej. \"cliente principal\", \"co-demandado\"","default":""}},"type":"object","title":"VincularContactoRequest"},"_AccionConsentimiento":{"properties":{"request_id":{"type":"string","title":"Request Id"}},"type":"object","required":["request_id"],"title":"_AccionConsentimiento"},"_Buyer":{"properties":{"first_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First Name"},"last_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Name"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"phone_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone Number"}},"type":"object","title":"_Buyer"},"_IntrospectRequest":{"properties":{"token":{"type":"string","title":"Token"}},"type":"object","required":["token"],"title":"_IntrospectRequest"},"_Item":{"properties":{"id":{"type":"string","title":"Id"},"quantity":{"type":"integer","minimum":1.0,"title":"Quantity","default":1}},"type":"object","required":["id"],"title":"_Item"}}}}