{"openapi":"3.1.0","info":{"title":"Rayuela","version":"v1","description":"# Rayuela Recommendation Engine - Public API\n\nEsta es la API pública de Rayuela que proporciona funcionalidades esenciales \npara integrar recomendaciones personalizadas en su aplicación.\n\n## Características Principales\n\n- **Recomendaciones Personalizadas**: Algoritmos avanzados adaptados a sus usuarios\n- **Gestión de Catálogo**: Administre productos y usuarios fácilmente  \n- **Analytics Simplificados**: Métricas de rendimiento orientadas al negocio\n- **Múltiples Estrategias**: Optimice para conversión, engagement o descubrimiento\n\n## Autenticación\n\nLa API utiliza autenticación por API Key. Incluya su clave en el header:\n```\nX-API-Key: su_api_key_aqui\n```\n\n## Límites de Uso\n\nLos límites dependen de su plan de suscripción. Consulte `/api/v1/accounts/usage` \npara ver su uso actual.\n\n## Soporte\n\nPara soporte técnico, contacte: support@rayuela.ai"},"paths":{"/health":{"get":{"tags":["Health"],"summary":"Health Check","operationId":"health_check_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"401":{"description":"API Key ausente o inválida."},"403":{"description":"Permiso/scope insuficiente, o cuenta sin suscripción activa."},"429":{"description":"Límite de tasa por minuto o del plan excedido (ver Retry-After)."},"500":{"description":"Error interno. Incluye un requestId para soporte."}}}},"/api/v1/system-users/me":{"get":{"tags":["system-users"],"summary":"Get Current User Info","description":"Get information about the current authenticated user.\n\nThis endpoint only requires a valid JWT token, no API Key is needed.\nIt's useful for the initial login flow when the user hasn't confirmed\nthe API Key yet.\n\nFor FREE plan users with unverified emails, this endpoint also returns\ngrace period information to help the frontend display countdown timers.","operationId":"get_system_user_me_with_account_context","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SystemUserResponseLite"}}}},"401":{"description":"API Key ausente o inválida."},"403":{"description":"Permiso/scope insuficiente, o cuenta sin suscripción activa."},"429":{"description":"Límite de tasa por minuto o del plan excedido (ver Retry-After)."},"500":{"description":"Error interno. Incluye un requestId para soporte."}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}]},"put":{"tags":["system-users"],"summary":"Update User Me","description":"Update current user's information.","operationId":"update_user_me_api_v1_system_users_me_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SystemUserUpdate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SystemUserResponse"}}}},"401":{"description":"API Key ausente o inválida."},"403":{"description":"Permiso/scope insuficiente, o cuenta sin suscripción activa."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"429":{"description":"Límite de tasa por minuto o del plan excedido (ver Retry-After)."},"500":{"description":"Error interno. Incluye un requestId para soporte."}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}]},"delete":{"tags":["system-users"],"summary":"Delete User Me","description":"Delete current user.","operationId":"delete_user_me_api_v1_system_users_me_delete","responses":{"204":{"description":"Successful Response"},"401":{"description":"API Key ausente o inválida."},"403":{"description":"Permiso/scope insuficiente, o cuenta sin suscripción activa."},"429":{"description":"Límite de tasa por minuto o del plan excedido (ver Retry-After)."},"500":{"description":"Error interno. Incluye un requestId para soporte."}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}]}},"/api/v1/api-keys/":{"get":{"tags":["api-keys"],"summary":"List Api Keys","description":"Lista todas las API Keys activas para la cuenta actual.\n\nRetorna una lista de todas las API Keys activas asociadas a la cuenta,\nincluyendo información como nombre, prefijo, últimos caracteres, fecha de creación\ny último uso.\n\n**Nota**: No se incluyen las API Keys completas por seguridad.","operationId":"list_api_keys_api_v1_api_keys__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyListResponse"}}}},"401":{"description":"API Key ausente o inválida."},"403":{"description":"Permiso/scope insuficiente, o cuenta sin suscripción activa."},"429":{"description":"Límite de tasa por minuto o del plan excedido (ver Retry-After)."},"500":{"description":"Error interno. Incluye un requestId para soporte."}}},"post":{"tags":["api-keys"],"summary":"Create Api Key","description":"Crea una nueva API Key para la cuenta actual.\n\nEste endpoint permite crear múltiples API Keys para una cuenta, lo que mejora\nla seguridad y flexibilidad:\n- Diferentes claves para diferentes entornos (desarrollo, staging, producción)\n- Claves específicas para diferentes miembros del equipo\n- Posibilidad de revocar claves específicas sin afectar otras integraciones\n\n**IMPORTANTE**:\n- Requiere autenticación JWT (debes estar logueado)\n- La API Key completa solo se devolverá una vez\n- Puedes crear múltiples API Keys activas\n- Cada API Key puede tener un nombre descriptivo\n\n**Autenticación requerida**: JWT token en el header Authorization: Bearer <token>\n\nReturns:\n- **id**: ID único de la API Key\n- **api_key**: Tu nueva API Key completa (solo se muestra una vez)\n- **name**: Nombre descriptivo de la API Key\n- **prefix**: Prefijo de la API Key para identificación\n- **created_at**: Fecha y hora de creación\n- **message**: Mensaje informativo sobre el uso seguro","operationId":"create_api_key_api_v1_api_keys__post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NewApiKeyResponse"}}}},"401":{"description":"API Key ausente o inválida."},"403":{"description":"Permiso/scope insuficiente, o cuenta sin suscripción activa."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"429":{"description":"Límite de tasa por minuto o del plan excedido (ver Retry-After)."},"500":{"description":"Error interno. Incluye un requestId para soporte."}}},"delete":{"tags":["api-keys"],"summary":"Revoke Api Key","description":"Revoca todas las API Keys de la cuenta actual.\nEsta acción es irreversible. Después de revocar, tendrás que generar nuevas API Keys.","operationId":"revoke_api_key_api_v1_api_keys__delete","responses":{"204":{"description":"Successful Response"},"401":{"description":"API Key ausente o inválida."},"403":{"description":"Permiso/scope insuficiente, o cuenta sin suscripción activa."},"429":{"description":"Límite de tasa por minuto o del plan excedido (ver Retry-After)."},"500":{"description":"Error interno. Incluye un requestId para soporte."}}}},"/api/v1/api-keys/current":{"get":{"tags":["api-keys"],"summary":"Get Current Api Key","description":"Obtiene información sobre la API Key actual.\nNo devuelve la API Key completa, solo metadatos como:\n- Prefijo de la API Key\n- Últimos caracteres\n- Fecha de creación\n- Último uso (si está disponible)\n\nEsta información permite identificar la API Key sin comprometer seguridad.","operationId":"get_current_api_key_api_v1_api_keys_current_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyResponse"}}}},"401":{"description":"API Key ausente o inválida."},"403":{"description":"Permiso/scope insuficiente, o cuenta sin suscripción activa."},"429":{"description":"Límite de tasa por minuto o del plan excedido (ver Retry-After)."},"500":{"description":"Error interno. Incluye un requestId para soporte."}}}},"/api/v1/api-keys/{api_key_id}":{"put":{"tags":["api-keys"],"summary":"Update Api Key","description":"Actualiza los metadatos de una API Key específica.\n\nPermite actualizar información como el nombre descriptivo de la API Key.\nNo se puede cambiar la clave en sí, solo sus metadatos.\n\n**IMPORTANTE**:\n- Solo puedes actualizar API Keys que pertenecen a tu cuenta\n- No se puede cambiar la API Key en sí, solo metadatos\n- La API Key debe estar activa para poder actualizarla","operationId":"update_api_key_api_v1_api_keys__api_key_id__put","parameters":[{"name":"api_key_id","in":"path","required":true,"schema":{"type":"integer","description":"ID de la API Key a actualizar","title":"Api Key Id"},"description":"ID de la API Key a actualizar"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyResponse"}}}},"401":{"description":"API Key ausente o inválida."},"403":{"description":"Permiso/scope insuficiente, o cuenta sin suscripción activa."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"429":{"description":"Límite de tasa por minuto o del plan excedido (ver Retry-After)."},"500":{"description":"Error interno. Incluye un requestId para soporte."}}},"delete":{"tags":["api-keys"],"summary":"Revoke Specific Api Key","description":"Revoca una API Key específica.\n\nEsta acción es irreversible. La API Key será desactivada y no podrá\nutilizarse para autenticar solicitudes.\n\n**IMPORTANTE**:\n- Solo puedes revocar API Keys que pertenecen a tu cuenta\n- Esta acción es irreversible\n- La API Key dejará de funcionar inmediatamente\n- Otras API Keys de la cuenta no se verán afectadas","operationId":"revoke_specific_api_key_api_v1_api_keys__api_key_id__delete","parameters":[{"name":"api_key_id","in":"path","required":true,"schema":{"type":"integer","description":"ID de la API Key a revocar","title":"Api Key Id"},"description":"ID de la API Key a revocar"}],"responses":{"204":{"description":"Successful Response"},"401":{"description":"API Key ausente o inválida."},"403":{"description":"Permiso/scope insuficiente, o cuenta sin suscripción activa."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"429":{"description":"Límite de tasa por minuto o del plan excedido (ver Retry-After)."},"500":{"description":"Error interno. Incluye un requestId para soporte."}}}},"/api/v1/pipeline/train":{"post":{"tags":["pipeline"],"summary":"Train Models","description":"Inicia el entrenamiento de modelos usando Celery.\n\nVerifica los límites de API y la frecuencia de entrenamiento permitida según el plan de suscripción\nantes de crear el trabajo de entrenamiento y encolar la tarea.\n\nReturns:\n    TrainingResponse: Respuesta con el ID del trabajo y la tarea iniciada.\n    Status: 202 Accepted - El trabajo ha sido aceptado y está siendo procesado.","operationId":"train_models_api_v1_pipeline_train_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrainingRequest","default":{}}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrainingResponse"}}}},"401":{"description":"API Key ausente o inválida."},"403":{"description":"Permiso/scope insuficiente, o cuenta sin suscripción activa."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"429":{"description":"Límite de tasa por minuto o del plan excedido (ver Retry-After)."},"500":{"description":"Error interno. Incluye un requestId para soporte."}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}]}},"/api/v1/pipeline/status":{"get":{"tags":["pipeline"],"summary":"Get Training Status","description":"Obtiene el estado del último entrenamiento completado.\n\nEste endpoint devuelve las métricas del último modelo entrenado exitosamente,\nno el estado de un trabajo en curso. Para consultar el estado de un trabajo\nespecífico, use el endpoint /pipeline/jobs/{job_id}/status.","operationId":"get_training_status_api_v1_pipeline_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrainingStatus"}}}},"401":{"description":"API Key ausente o inválida."},"403":{"description":"Permiso/scope insuficiente, o cuenta sin suscripción activa."},"429":{"description":"Límite de tasa por minuto o del plan excedido (ver Retry-After)."},"500":{"description":"Error interno. Incluye un requestId para soporte."}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}]}},"/api/v1/pipeline/jobs/{job_id}/status":{"get":{"tags":["pipeline"],"summary":"Get Training Job Status","description":"Consulta el estado de un trabajo de entrenamiento específico.\n\nArgs:\n    job_id: ID del trabajo de entrenamiento\n    account: Cuenta actual\n    db: Sesión de base de datos\n\nReturns:\n    Estado detallado del trabajo de entrenamiento","operationId":"get_training_job_status_api_v1_pipeline_jobs__job_id__status_get","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrainingJobStatus"}}}},"401":{"description":"API Key ausente o inválida."},"403":{"description":"Permiso/scope insuficiente, o cuenta sin suscripción activa."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"429":{"description":"Límite de tasa por minuto o del plan excedido (ver Retry-After)."},"500":{"description":"Error interno. Incluye un requestId para soporte."}}}},"/api/v1/pipeline/models":{"get":{"tags":["pipeline"],"summary":"List Models","description":"Lista todos los modelos entrenados para la cuenta.","operationId":"list_models_api_v1_pipeline_models_get","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":10,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ModelMetadataResponse"},"title":"Response List Models Api V1 Pipeline Models Get"}}}},"401":{"description":"API Key ausente o inválida."},"403":{"description":"Permiso/scope insuficiente, o cuenta sin suscripción activa."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"429":{"description":"Límite de tasa por minuto o del plan excedido (ver Retry-After)."},"500":{"description":"Error interno. Incluye un requestId para soporte."}}}},"/api/v1/pipeline/jobs":{"get":{"tags":["pipeline"],"summary":"List Training Jobs","description":"Lista los trabajos de entrenamiento recientes para la cuenta actual.\n\nEste endpoint permite obtener una lista de trabajos de entrenamiento,\nordenados por fecha de creación (más recientes primero).\n\nArgs:\n    limit: Número máximo de trabajos a devolver (máximo 100)\n    status: Filtrar por estado del trabajo (opcional)\n    account: Cuenta actual\n    db: Sesión de base de datos\n\nReturns:\n    Lista de trabajos de entrenamiento","operationId":"list_training_jobs_api_v1_pipeline_jobs_get","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Maximum number of jobs to return","default":20,"title":"Limit"},"description":"Maximum number of jobs to return"},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by job status","title":"Status"},"description":"Filter by job status"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TrainingJobStatus"},"title":"Response List Training Jobs Api V1 Pipeline Jobs Get"}}}},"401":{"description":"API Key ausente o inválida."},"403":{"description":"Permiso/scope insuficiente, o cuenta sin suscripción activa."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"429":{"description":"Límite de tasa por minuto o del plan excedido (ver Retry-After)."},"500":{"description":"Error interno. Incluye un requestId para soporte."}}}},"/api/v1/ingestion/batch":{"post":{"tags":["ingestion"],"summary":"Batch Data Ingestion","description":"Carga masiva de datos de usuarios, productos e interacciones.\n\nEste endpoint permite cargar datos en lote para inicializar o actualizar el sistema de recomendación.\nLos datos se procesan de forma asíncrona utilizando Celery para mayor robustez.\nLos datos sensibles se almacenan de forma segura en GCS o en el sistema de archivos local.\n\nPara una guía detallada sobre cómo formatear y enviar datos, consulte la\n[Guía de Ingesta de Datos Masiva](/docs/guides/data_ingestion_guide).","operationId":"batch_data_ingestion_api_v1_ingestion_batch_post","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchIngestionRequest"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchIngestionResponse"}}}},"401":{"description":"API Key ausente o inválida."},"403":{"description":"Permiso/scope insuficiente, o cuenta sin suscripción activa."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"429":{"description":"Límite de tasa por minuto o del plan excedido (ver Retry-After)."},"500":{"description":"Error interno. Incluye un requestId para soporte."}}},"get":{"tags":["ingestion"],"summary":"List Batch Jobs","description":"Lista los trabajos de ingesta masiva recientes para la cuenta actual.\n\nEste endpoint permite obtener una lista de trabajos de ingesta masiva,\nordenados por fecha de creación (más recientes primero).\n\nArgs:\n    limit: Número máximo de trabajos a devolver (máximo 100)\n    status: Filtrar por estado del trabajo (opcional)\n    account: Cuenta actual\n    db: Sesión de base de datos\n\nReturns:\n    Lista de trabajos de ingesta masiva","operationId":"list_batch_jobs_api_v1_ingestion_batch_get","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Maximum number of jobs to return","default":20,"title":"Limit"},"description":"Maximum number of jobs to return"},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by job status","title":"Status"},"description":"Filter by job status"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/BatchIngestionJobStatus"},"title":"Response List Batch Jobs Api V1 Ingestion Batch Get"}}}},"401":{"description":"API Key ausente o inválida."},"403":{"description":"Permiso/scope insuficiente, o cuenta sin suscripción activa."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"429":{"description":"Límite de tasa por minuto o del plan excedido (ver Retry-After)."},"500":{"description":"Error interno. Incluye un requestId para soporte."}}}},"/api/v1/ingestion/batch/{job_id}":{"get":{"tags":["ingestion"],"summary":"Get Batch Job Status","description":"Consulta el estado de un trabajo de ingesta masiva.\n\nEste endpoint permite verificar el progreso de un trabajo de ingesta masiva,\nincluyendo la cantidad de registros procesados, errores encontrados y tiempo estimado\nde finalización.\n\nPara más detalles sobre cómo monitorear el proceso de ingesta y manejar errores,\nconsulte la sección [Monitoreo del Proceso](/docs/guides/data_ingestion_guide#monitoreo-del-proceso)\nen la Guía de Ingesta de Datos.\n\nArgs:\n    job_id: ID del trabajo de ingesta masiva\n    account: Cuenta actual\n    db: Sesión de base de datos\n\nReturns:\n    Estado del trabajo de ingesta masiva","operationId":"get_batch_job_status_api_v1_ingestion_batch__job_id__get","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchIngestionJobStatus"}}}},"401":{"description":"API Key ausente o inválida."},"403":{"description":"Permiso/scope insuficiente, o cuenta sin suscripción activa."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"429":{"description":"Límite de tasa por minuto o del plan excedido (ver Retry-After)."},"500":{"description":"Error interno. Incluye un requestId para soporte."}}}},"/api/v1/usage/summary":{"get":{"tags":["usage"],"summary":"Get Usage Summary","description":"Return a consolidated summary of usage information for the current account (JWT-only).","operationId":"get_usage_summary_api_v1_usage_summary_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UsageSummaryResponse"}}}},"401":{"description":"API Key ausente o inválida."},"403":{"description":"Permiso/scope insuficiente, o cuenta sin suscripción activa."},"429":{"description":"Límite de tasa por minuto o del plan excedido (ver Retry-After)."},"500":{"description":"Error interno. Incluye un requestId para soporte."}}}},"/api/v1/usage/":{"get":{"tags":["usage"],"summary":"Get Usage History","description":"Get historical usage data for the current account.\n\nArgs:\n    start_date: Optional start date for filtering data\n    end_date: Optional end date for filtering data\n\nReturns:\n    List of daily usage data points","operationId":"get_usage_history_api_v1_usage__get","parameters":[{"name":"start_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"Start date for historical data","title":"Start Date"},"description":"Start date for historical data"},{"name":"end_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"End date for historical data","title":"End Date"},"description":"End date for historical data"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/UsageHistoryItemResponse"},"title":"Response Get Usage History Api V1 Usage  Get"}}}},"401":{"description":"API Key ausente o inválida."},"403":{"description":"Permiso/scope insuficiente, o cuenta sin suscripción activa."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"429":{"description":"Límite de tasa por minuto o del plan excedido (ver Retry-After)."},"500":{"description":"Error interno. Incluye un requestId para soporte."}}}},"/api/v1/accounts/current":{"get":{"tags":["accounts"],"summary":"Get Account Info","description":"Get information about the current account.","operationId":"get_account_info_api_v1_accounts_current_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccountResponse"}}}},"401":{"description":"API Key ausente o inválida."},"403":{"description":"Permiso/scope insuficiente, o cuenta sin suscripción activa."},"429":{"description":"Límite de tasa por minuto o del plan excedido (ver Retry-After)."},"500":{"description":"Error interno. Incluye un requestId para soporte."}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}]},"put":{"tags":["accounts"],"summary":"Update Current Account","description":"Update the current account information (admin only).\n\nFull update of account fields including name, is_active, etc.\nRequires admin privileges.","operationId":"update_current_account_api_v1_accounts_current_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccountUpdate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccountResponse"}}}},"401":{"description":"API Key ausente o inválida."},"403":{"description":"Permiso/scope insuficiente, o cuenta sin suscripción activa."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"429":{"description":"Límite de tasa por minuto o del plan excedido (ver Retry-After)."},"500":{"description":"Error interno. Incluye un requestId para soporte."}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}]},"patch":{"tags":["accounts"],"summary":"Patch Current Account","description":"Partially update the current account information.\n\nRegular users can update onboarding_checklist_status.\nAdmin-only fields: name, is_active, mercadopago_customer_id.","operationId":"patch_current_account_api_v1_accounts_current_patch","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccountUpdate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccountResponse"}}}},"401":{"description":"API Key ausente o inválida."},"403":{"description":"Permiso/scope insuficiente, o cuenta sin suscripción activa."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"429":{"description":"Límite de tasa por minuto o del plan excedido (ver Retry-After)."},"500":{"description":"Error interno. Incluye un requestId para soporte."}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}]}},"/api/v1/auth/send-verification-email":{"post":{"tags":["auth"],"summary":"Send Verification Email","description":"Envía un email de verificación al usuario actual.","operationId":"send_verification_email_api_v1_auth_send_verification_email_post","responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"401":{"description":"API Key ausente o inválida."},"403":{"description":"Permiso/scope insuficiente, o cuenta sin suscripción activa."},"429":{"description":"Límite de tasa por minuto o del plan excedido (ver Retry-After)."},"500":{"description":"Error interno. Incluye un requestId para soporte."}}}},"/api/v1/auth/verify-email":{"get":{"tags":["auth"],"summary":"Verify Email","description":"Verifica el email de un usuario usando un token.","operationId":"verify_email_api_v1_auth_verify_email_get","parameters":[{"name":"token","in":"query","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"401":{"description":"API Key ausente o inválida."},"403":{"description":"Permiso/scope insuficiente, o cuenta sin suscripción activa."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"429":{"description":"Límite de tasa por minuto o del plan excedido (ver Retry-After)."},"500":{"description":"Error interno. Incluye un requestId para soporte."}}}},"/api/v1/auth/register":{"post":{"tags":["auth"],"summary":"Register a new account","description":"Creates a new account with global email uniqueness validation and returns a JWT token and the first API Key","operationId":"register_api_v1_auth_register_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterResponse"}}}},"401":{"description":"API Key ausente o inválida."},"403":{"description":"Permiso/scope insuficiente, o cuenta sin suscripción activa."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"429":{"description":"Límite de tasa por minuto o del plan excedido (ver Retry-After)."},"500":{"description":"Error interno. Incluye un requestId para soporte."}}}},"/api/v1/auth/token":{"post":{"tags":["auth"],"summary":"Login to obtain JWT token","description":"Authenticates a user and returns a JWT token for dashboard access. Accepts JSON payload with email and password.","operationId":"login_api_v1_auth_token_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginResponse"}}}},"401":{"description":"API Key ausente o inválida."},"403":{"description":"Permiso/scope insuficiente, o cuenta sin suscripción activa."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"429":{"description":"Límite de tasa por minuto o del plan excedido (ver Retry-After)."},"500":{"description":"Error interno. Incluye un requestId para soporte."}}}},"/api/v1/auth/logout":{"post":{"tags":["auth"],"summary":"Logout","description":"Revoca el token JWT actual.","operationId":"logout_api_v1_auth_logout_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"401":{"description":"API Key ausente o inválida."},"403":{"description":"Permiso/scope insuficiente, o cuenta sin suscripción activa."},"429":{"description":"Límite de tasa por minuto o del plan excedido (ver Retry-After)."},"500":{"description":"Error interno. Incluye un requestId para soporte."}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}]}},"/api/v1/accounts/usage":{"get":{"tags":["accounts"],"summary":"Get Api Usage","description":"Get API usage statistics for the current account.","operationId":"get_api_usage_api_v1_accounts_usage_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UsageStats"}}}},"401":{"description":"API Key ausente o inválida."},"403":{"description":"Permiso/scope insuficiente, o cuenta sin suscripción activa."},"429":{"description":"Límite de tasa por minuto o del plan excedido (ver Retry-After)."},"500":{"description":"Error interno. Incluye un requestId para soporte."}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}]}},"/api/v1/plans/":{"get":{"tags":["plans"],"summary":"Get Available Plans","description":"Get all available subscription plans with their details.\n\nReturns:\n    Dict with plan information for all available plans.","operationId":"get_available_plans_api_v1_plans__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":{"$ref":"#/components/schemas/PlanDetails"},"type":"object","title":"Response Get Available Plans Api V1 Plans  Get"}}}},"401":{"description":"API Key ausente o inválida."},"403":{"description":"Permiso/scope insuficiente, o cuenta sin suscripción activa."},"429":{"description":"Límite de tasa por minuto o del plan excedido (ver Retry-After)."},"500":{"description":"Error interno. Incluye un requestId para soporte."}}}},"/api/v1/end-users/":{"post":{"tags":["end-users"],"summary":"Create End User","operationId":"create_end_user_api_v1_end_users__post","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EndUserCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EndUser"}}}},"401":{"description":"API Key ausente o inválida."},"403":{"description":"Permiso/scope insuficiente, o cuenta sin suscripción activa."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"429":{"description":"Límite de tasa por minuto o del plan excedido (ver Retry-After)."},"500":{"description":"Error interno. Incluye un requestId para soporte."}}},"get":{"tags":["end-users"],"summary":"Read End Users","operationId":"read_end_users_api_v1_end_users__get","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"skip","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Skip"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":100,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_EndUser_"}}}},"401":{"description":"API Key ausente o inválida."},"403":{"description":"Permiso/scope insuficiente, o cuenta sin suscripción activa."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"429":{"description":"Límite de tasa por minuto o del plan excedido (ver Retry-After)."},"500":{"description":"Error interno. Incluye un requestId para soporte."}}}},"/api/v1/end-users/external/{external_user_id}":{"get":{"tags":["end-users"],"summary":"Read End User External","description":"Get an end user by external ID.\n\n**🎯 Recommended**: Use your own user ID without needing to store Rayuela's internal IDs.\n\nArgs:\n    external_user_id: Your external user ID\n    account: Current account\n    db: Database session\n\nReturns:\n    EndUser: User information","operationId":"read_end_user_external_api_v1_end_users_external__external_user_id__get","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"external_user_id","in":"path","required":true,"schema":{"type":"string","title":"External User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EndUser"}}}},"401":{"description":"API Key ausente o inválida."},"403":{"description":"Permiso/scope insuficiente, o cuenta sin suscripción activa."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"429":{"description":"Límite de tasa por minuto o del plan excedido (ver Retry-After)."},"500":{"description":"Error interno. Incluye un requestId para soporte."}}},"delete":{"tags":["end-users"],"summary":"Borrar (hard delete) un end-user y sus datos personales","description":"Derecho al olvido (GDPR Art. 17 / Ley 25.326 Art. 16). Elimina físicamente el end-user y sus datos personales asociados (interacciones, búsquedas, recomendaciones y órdenes) dentro del tenant autenticado. La propagación al modelo ML es best-effort y completa en el siguiente reentrenamiento (< 24 h).","operationId":"delete_end_user_external_api_v1_end_users_external__external_user_id__delete","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"external_user_id","in":"path","required":true,"schema":{"type":"string","title":"External User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EndUserErasureResult"}}}},"401":{"description":"API Key ausente o inválida."},"403":{"description":"Permiso/scope insuficiente, o cuenta sin suscripción activa."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"429":{"description":"Límite de tasa por minuto o del plan excedido (ver Retry-After)."},"500":{"description":"Error interno. Incluye un requestId para soporte."}}}},"/api/v1/end-users/external/{external_user_id}/export":{"get":{"tags":["end-users"],"summary":"Exportar los datos personales de un end-user","description":"Portabilidad de datos (GDPR Art. 20 / Ley 25.326). Devuelve el registro del sujeto y todos sus datos asociados (interacciones, búsquedas, recomendaciones y órdenes) filtrados por el tenant autenticado.","operationId":"export_end_user_external_api_v1_end_users_external__external_user_id__export_get","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"external_user_id","in":"path","required":true,"schema":{"type":"string","title":"External User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EndUserDataExport"}}}},"401":{"description":"API Key ausente o inválida."},"403":{"description":"Permiso/scope insuficiente, o cuenta sin suscripción activa."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"429":{"description":"Límite de tasa por minuto o del plan excedido (ver Retry-After)."},"500":{"description":"Error interno. Incluye un requestId para soporte."}}}},"/api/v1/products/":{"post":{"tags":["products"],"summary":"Create Product","operationId":"create_product_api_v1_products__post","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Product"}}}},"401":{"description":"API Key ausente o inválida."},"403":{"description":"Permiso/scope insuficiente, o cuenta sin suscripción activa."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"429":{"description":"Límite de tasa por minuto o del plan excedido (ver Retry-After)."},"500":{"description":"Error interno. Incluye un requestId para soporte."}}},"get":{"tags":["products"],"summary":"Read Products","description":"Obtener productos paginados para la cuenta actual","operationId":"read_products_api_v1_products__get","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"category","in":"query","required":false,"schema":{"type":"string","title":"Category"}},{"name":"skip","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Skip"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":100,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_Product_"}}}},"401":{"description":"API Key ausente o inválida."},"403":{"description":"Permiso/scope insuficiente, o cuenta sin suscripción activa."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"429":{"description":"Límite de tasa por minuto o del plan excedido (ver Retry-After)."},"500":{"description":"Error interno. Incluye un requestId para soporte."}}}},"/api/v1/products/external/{external_id}":{"get":{"tags":["products"],"summary":"Get Product By External Id","description":"Get a product by its external_id.","operationId":"get_product_by_external_id_api_v1_products_external__external_id__get","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"external_id","in":"path","required":true,"schema":{"type":"string","title":"External Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Product"}}}},"401":{"description":"API Key ausente o inválida."},"403":{"description":"Permiso/scope insuficiente, o cuenta sin suscripción activa."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"429":{"description":"Límite de tasa por minuto o del plan excedido (ver Retry-After)."},"500":{"description":"Error interno. Incluye un requestId para soporte."}}},"put":{"tags":["products"],"summary":"Update Product By External Id","description":"Update a product by its external_id.","operationId":"update_product_by_external_id_api_v1_products_external__external_id__put","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"external_id","in":"path","required":true,"schema":{"type":"string","title":"External Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Product"}}}},"401":{"description":"API Key ausente o inválida."},"403":{"description":"Permiso/scope insuficiente, o cuenta sin suscripción activa."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"429":{"description":"Límite de tasa por minuto o del plan excedido (ver Retry-After)."},"500":{"description":"Error interno. Incluye un requestId para soporte."}}},"delete":{"tags":["products"],"summary":"Delete Product By External Id","description":"Delete (soft delete) a product by its external_id.","operationId":"delete_product_by_external_id_api_v1_products_external__external_id__delete","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"external_id","in":"path","required":true,"schema":{"type":"string","title":"External Id"}}],"responses":{"204":{"description":"Successful Response"},"401":{"description":"API Key ausente o inválida."},"403":{"description":"Permiso/scope insuficiente, o cuenta sin suscripción activa."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"429":{"description":"Límite de tasa por minuto o del plan excedido (ver Retry-After)."},"500":{"description":"Error interno. Incluye un requestId para soporte."}}}},"/api/v1/recommendations/category/{category}":{"get":{"tags":["recommendations"],"summary":"Get Category Products","operationId":"get_category_products_api_v1_recommendations_category__category__get","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"category","in":"path","required":true,"schema":{"type":"string","title":"Category"}},{"name":"sort_by","in":"query","required":false,"schema":{"type":"string","enum":["popularity","rating","price_asc","price_desc"],"default":"popularity","title":"Sort By"}},{"name":"skip","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Skip"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":100,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_Product_"}}}},"401":{"description":"API Key ausente o inválida."},"403":{"description":"Permiso/scope insuficiente, o cuenta sin suscripción activa."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"429":{"description":"Límite de tasa por minuto o del plan excedido (ver Retry-After)."},"500":{"description":"Error interno. Incluye un requestId para soporte."}}}},"/api/v1/recommendations/personalized/query":{"post":{"tags":["recommendations"],"summary":"Get personalized recommendations","description":"Main endpoint for obtaining personalized recommendations with complex filters and structured context.","operationId":"query_personalized_recommendations_api_v1_recommendations_personalized_query_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicRecommendationQueryExternalRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_Product_"}}}},"401":{"description":"API Key ausente o inválida."},"403":{"description":"Permiso/scope insuficiente, o cuenta sin suscripción activa."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"429":{"description":"Límite de tasa por minuto o del plan excedido (ver Retry-After)."},"500":{"description":"Error interno. Incluye un requestId para soporte."}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}]}},"/api/v1/recommendations/ecommerce/homepage":{"post":{"tags":["recommendations"],"summary":"E-commerce homepage recommendations","description":"Optimized recommendations for e-commerce homepage (relevance-focused)","operationId":"get_ecommerce_homepage_recommendations_api_v1_recommendations_ecommerce_homepage_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecommendationQueryExternalRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_Product_"}}}},"401":{"description":"API Key ausente o inválida."},"403":{"description":"Permiso/scope insuficiente, o cuenta sin suscripción activa."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"429":{"description":"Límite de tasa por minuto o del plan excedido (ver Retry-After)."},"500":{"description":"Error interno. Incluye un requestId para soporte."}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}]}},"/api/v1/recommendations/ecommerce/product-page":{"post":{"tags":["recommendations"],"summary":"E-commerce product page recommendations","description":"Cross-sell and related product recommendations for product detail pages","operationId":"get_ecommerce_product_page_recommendations_api_v1_recommendations_ecommerce_product_page_post","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"current_product_id","in":"query","required":true,"schema":{"type":"string","description":"External ID of the current product being viewed","title":"Current Product Id"},"description":"External ID of the current product being viewed"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecommendationQueryExternalRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_Product_"}}}},"401":{"description":"API Key ausente o inválida."},"403":{"description":"Permiso/scope insuficiente, o cuenta sin suscripción activa."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"429":{"description":"Límite de tasa por minuto o del plan excedido (ver Retry-After)."},"500":{"description":"Error interno. Incluye un requestId para soporte."}}}},"/api/v1/recommendations/ecommerce/cart":{"post":{"tags":["recommendations"],"summary":"E-commerce cart recommendations","description":"Complementary product recommendations for shopping cart page","operationId":"get_ecommerce_cart_recommendations_api_v1_recommendations_ecommerce_cart_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CartQueryExternalRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_Product_"}}}},"401":{"description":"API Key ausente o inválida."},"403":{"description":"Permiso/scope insuficiente, o cuenta sin suscripción activa."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"429":{"description":"Límite de tasa por minuto o del plan excedido (ver Retry-After)."},"500":{"description":"Error interno. Incluye un requestId para soporte."}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}]}},"/api/v1/recommendations/ecommerce/checkout":{"post":{"tags":["recommendations"],"summary":"E-commerce checkout recommendations","description":"Last-chance upsell recommendations for checkout page","operationId":"get_ecommerce_checkout_recommendations_api_v1_recommendations_ecommerce_checkout_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckoutQueryExternalRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_Product_"}}}},"401":{"description":"API Key ausente o inválida."},"403":{"description":"Permiso/scope insuficiente, o cuenta sin suscripción activa."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"429":{"description":"Límite de tasa por minuto o del plan excedido (ver Retry-After)."},"500":{"description":"Error interno. Incluye un requestId para soporte."}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}]}},"/api/v1/recommendations/products/external/{external_product_id}/similar":{"get":{"tags":["recommendations"],"summary":"Get similar products using external ID","operationId":"get_similar_products_external_api_v1_recommendations_products_external__external_product_id__similar_get","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"external_product_id","in":"path","required":true,"schema":{"type":"string","title":"External Product Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":100,"title":"Limit"}},{"name":"include_explanation","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Include Explanation"}},{"name":"explanation_level","in":"query","required":false,"schema":{"$ref":"#/components/schemas/ExplanationLevel","default":"simple"}},{"name":"skip","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Skip"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_Product_"}}}},"401":{"description":"API Key ausente o inválida."},"403":{"description":"Permiso/scope insuficiente, o cuenta sin suscripción activa."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"429":{"description":"Límite de tasa por minuto o del plan excedido (ver Retry-After)."},"500":{"description":"Error interno. Incluye un requestId para soporte."}}}},"/api/v1/interactions/":{"get":{"tags":["interactions"],"summary":"Read Interactions","description":"Get all interactions for the current account.","operationId":"read_interactions_api_v1_interactions__get","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"skip","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Skip"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":100,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_Interaction_"}}}},"401":{"description":"API Key ausente o inválida."},"403":{"description":"Permiso/scope insuficiente, o cuenta sin suscripción activa."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"429":{"description":"Límite de tasa por minuto o del plan excedido (ver Retry-After)."},"500":{"description":"Error interno. Incluye un requestId para soporte."}}},"post":{"tags":["interactions"],"summary":"Create Interaction","description":"Create a new user interaction.\n\n**🎯 Developer Experience Priority**: Uses your external IDs only.\nNo need to store or map Rayuela's internal IDs.\n\nArgs:\n    interaction: Interaction data with external_user_id and external_product_id\n\nReturns:\n    Created interaction record\n\nExample:\n    ```json\n    {\n        \"external_user_id\": \"customer-abc123\",\n        \"external_product_id\": \"product-xyz789\",\n        \"interaction_type\": \"view\",\n        \"value\": 1.0\n    }\n    ```","operationId":"create_interaction_api_v1_interactions__post","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InteractionExternalCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Interaction"}}}},"401":{"description":"API Key ausente o inválida."},"403":{"description":"Permiso/scope insuficiente, o cuenta sin suscripción activa."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"429":{"description":"Límite de tasa por minuto o del plan excedido (ver Retry-After)."},"500":{"description":"Error interno. Incluye un requestId para soporte."}}}},"/api/v1/billing/create-checkout-session":{"post":{"tags":["billing"],"summary":"Create Checkout Session","description":"Crea una sesión de checkout para suscribirse o cambiar de plan.\n\nRequiere autenticación con API Key y JWT.","operationId":"create_checkout_session_api_v1_billing_create_checkout_session_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCheckoutSessionRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCheckoutSessionResponse"}}}},"401":{"description":"API Key ausente o inválida."},"403":{"description":"Permiso/scope insuficiente, o cuenta sin suscripción activa."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"429":{"description":"Límite de tasa por minuto o del plan excedido (ver Retry-After)."},"500":{"description":"Error interno. Incluye un requestId para soporte."}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}]}},"/api/v1/billing/create-subscription-session":{"post":{"tags":["billing"],"summary":"Create Subscription Session","description":"Crea una suscripción recurrente (preapproval) y devuelve la URL de checkout.\n\nRequiere autenticación con API Key y JWT. Mercado Pago cobra automáticamente\ncada mes; el plan se activa cuando el cliente autoriza la suscripción\n(webhook `subscription_preapproval`).","operationId":"create_subscription_session_api_v1_billing_create_subscription_session_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSubscriptionSessionRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSubscriptionSessionResponse"}}}},"401":{"description":"API Key ausente o inválida."},"403":{"description":"Permiso/scope insuficiente, o cuenta sin suscripción activa."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"429":{"description":"Límite de tasa por minuto o del plan excedido (ver Retry-After)."},"500":{"description":"Error interno. Incluye un requestId para soporte."}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}]}},"/api/v1/billing/create-portal-session":{"post":{"tags":["billing"],"summary":"Create Portal Session","description":"Crea una sesión del portal de facturación para gestionar la suscripción.\n\nRequiere autenticación con API Key y JWT.","operationId":"create_portal_session_api_v1_billing_create_portal_session_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatePortalSessionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatePortalSessionResponse"}}}},"401":{"description":"API Key ausente o inválida."},"403":{"description":"Permiso/scope insuficiente, o cuenta sin suscripción activa."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"429":{"description":"Límite de tasa por minuto o del plan excedido (ver Retry-After)."},"500":{"description":"Error interno. Incluye un requestId para soporte."}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}]}},"/api/v1/sandbox/reset":{"post":{"tags":["sandbox"],"summary":"Reset Sandbox Data","description":"Reset all sandbox data for FREE plan users.\n\nThis endpoint allows FREE plan users to clean their experimental data\nto start fresh with new experiments.\n\nOnly available for FREE plan users.","operationId":"reset_sandbox_data_api_v1_sandbox_reset_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SandboxResetResponse"}}}},"401":{"description":"API Key ausente o inválida."},"403":{"description":"Permiso/scope insuficiente, o cuenta sin suscripción activa."},"429":{"description":"Límite de tasa por minuto o del plan excedido (ver Retry-After)."},"500":{"description":"Error interno. Incluye un requestId para soporte."}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}]}},"/api/v1/sandbox/status":{"get":{"tags":["sandbox"],"summary":"Get Sandbox Status","description":"Get current sandbox status and data counts.\n\nReturns information about the current state of sandbox data.","operationId":"get_sandbox_status_api_v1_sandbox_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SandboxStatusResponse"}}}},"401":{"description":"API Key ausente o inválida."},"403":{"description":"Permiso/scope insuficiente, o cuenta sin suscripción activa."},"429":{"description":"Límite de tasa por minuto o del plan excedido (ver Retry-After)."},"500":{"description":"Error interno. Incluye un requestId para soporte."}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}]}},"/api/v1/sandbox/quick-start":{"post":{"tags":["sandbox"],"summary":"Create Quick Start Data","description":"Create sample data for immediate testing and recommendations.\n\nThis endpoint creates a complete dataset (users, products, interactions)\noptimized for the specified template, allowing developers to get\nrecommendations in under 5 minutes without any setup.\n\nAvailable templates:\n- ecommerce: Sample e-commerce products and user behavior\n- content: Articles, videos, and content consumption patterns\n- marketplace: Services, vendors, and marketplace interactions","operationId":"create_quick_start_data_api_v1_sandbox_quick_start_post","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"template","in":"query","required":false,"schema":{"type":"string","description":"Template type: ecommerce, content, marketplace","default":"ecommerce","title":"Template"},"description":"Template type: ecommerce, content, marketplace"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuickStartResponse"}}}},"401":{"description":"API Key ausente o inválida."},"403":{"description":"Permiso/scope insuficiente, o cuenta sin suscripción activa."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"429":{"description":"Límite de tasa por minuto o del plan excedido (ver Retry-After)."},"500":{"description":"Error interno. Incluye un requestId para soporte."}}}},"/api/v1/sandbox/quick-start/demo":{"get":{"tags":["sandbox"],"summary":"Get Quick Start Demo","description":"Get instant demo recommendations using sample data.\n\nThis endpoint provides immediate recommendations using pre-generated\nsample data, perfect for testing and demonstrations.","operationId":"get_quick_start_demo_api_v1_sandbox_quick_start_demo_get","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"user_id","in":"query","required":false,"schema":{"type":"string","description":"User ID for demo recommendations","default":"demo-user-001","title":"User Id"},"description":"User ID for demo recommendations"},{"name":"template","in":"query","required":false,"schema":{"type":"string","description":"Template type","default":"ecommerce","title":"Template"},"description":"Template type"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuickStartDemoResponse"}}}},"401":{"description":"API Key ausente o inválida."},"403":{"description":"Permiso/scope insuficiente, o cuenta sin suscripción activa."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"429":{"description":"Límite de tasa por minuto o del plan excedido (ver Retry-After)."},"500":{"description":"Error interno. Incluye un requestId para soporte."}}}}},"components":{"schemas":{"AccountCreate":{"properties":{"name":{"type":"string","minLength":1,"title":"Name"},"mercadopagoCustomerId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mercadopagocustomerid"},"isActive":{"type":"boolean","title":"Isactive","default":true}},"type":"object","required":["name"],"title":"AccountCreate"},"AccountResponse":{"properties":{"name":{"type":"string","title":"Name"},"accountId":{"type":"integer","title":"Accountid"},"mercadopagoCustomerId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mercadopagocustomerid"},"createdAt":{"type":"string","format":"date-time","title":"Createdat"},"updatedAt":{"type":"string","format":"date-time","title":"Updatedat"},"isActive":{"type":"boolean","title":"Isactive"},"deletedAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Deletedat"},"onboardingChecklistStatus":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Onboardingcheckliststatus"},"subscription":{"anyOf":[{"$ref":"#/components/schemas/SubscriptionBasicInfo"},{"type":"null"}]}},"type":"object","required":["name","accountId","createdAt","updatedAt","isActive"],"title":"AccountResponse"},"AccountUpdate":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"mercadopagoCustomerId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mercadopagocustomerid"},"isActive":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Isactive"},"onboardingChecklistStatus":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Onboardingcheckliststatus"}},"type":"object","title":"AccountUpdate"},"ApiCallsUsage":{"properties":{"used":{"type":"integer","title":"Used","description":"Number of API calls used","default":0},"limit":{"type":"integer","title":"Limit","description":"API calls limit","default":10000},"percentage":{"type":"number","title":"Percentage","description":"Percentage of limit used","default":0},"overage":{"type":"integer","title":"Overage","description":"API calls made beyond the plan limit in the current billing period (only non-zero for plans with a soft limit / overage enabled)","default":0},"allowOverage":{"type":"boolean","title":"Allowoverage","description":"Whether the plan uses a soft limit that permits billable overage instead of blocking requests with 429","default":false},"resetDate":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Resetdate","description":"Date when usage resets"}},"type":"object","title":"ApiCallsUsage","description":"API calls usage information"},"ApiKeyCreate":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name","description":"Nombre descriptivo para esta API Key"},"keyType":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Keytype","description":"Tipo de API Key: 'sk_' (secreta, servidor) o 'pk_' (pública, embebible en navegador). Default: 'sk_'"},"scopes":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Scopes","description":"Scopes otorgados. Si se omite: 'sk_' → acceso completo ('*'); 'pk_' → ['interactions:write', 'recommendations:read']"},"allowedDomains":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Alloweddomains","description":"Allowlist de dominios (Origin/Referer) para keys 'pk_'. Acepta dominios desnudos o URLs. Si se omite, sin restricción."}},"type":"object","title":"ApiKeyCreate","description":"Schema for creating a new API Key"},"ApiKeyListResponse":{"properties":{"apiKeys":{"items":{"$ref":"#/components/schemas/ApiKeyResponse"},"type":"array","title":"Apikeys","description":"Lista de API Keys"},"total":{"type":"integer","title":"Total","description":"Número total de API Keys"}},"type":"object","required":["apiKeys","total"],"title":"ApiKeyListResponse","description":"Schema for listing API Keys.\n\nSerializa a camelCase:\n- api_keys -> apiKeys\n- total -> total"},"ApiKeyResponse":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name","description":"Nombre descriptivo para esta API Key"},"id":{"type":"integer","title":"Id","description":"ID único de la API Key"},"prefix":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Prefix","description":"Prefijo de la API Key"},"lastChars":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lastchars","description":"Últimos caracteres de la API Key"},"createdAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Createdat","description":"Fecha de creación"},"isActive":{"type":"boolean","title":"Isactive","description":"Estado de la API Key","default":true},"lastUsed":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Lastused","description":"Último uso de la API Key"},"keyType":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Keytype","description":"Tipo de API Key: 'sk_' (secreta) o 'pk_' (pública)"},"scopes":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Scopes","description":"Scopes otorgados ('*' = acceso completo)"},"allowedDomains":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Alloweddomains","description":"Allowlist de dominios para keys 'pk_'"}},"type":"object","required":["id"],"title":"ApiKeyResponse","description":"Schema for API Key information (no sensitive data).\n\nSerializa a camelCase:\n- id -> id\n- prefix -> prefix\n- last_chars -> lastChars\n- created_at -> createdAt\n- is_active -> isActive\n- last_used -> lastUsed\n\nCRITICAL FIX: Usa aliases para mapear nombres del ORM (api_key_prefix, api_key_last_chars)\na nombres del esquema (prefix, last_chars) para que from_attributes=True funcione correctamente."},"ApiKeyUpdate":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name","description":"Nuevo nombre descriptivo para la API Key"},"scopes":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Scopes","description":"Nuevos scopes para la API Key"},"allowedDomains":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Alloweddomains","description":"Nueva allowlist de dominios para la API Key"}},"type":"object","title":"ApiKeyUpdate","description":"Schema for updating an API Key"},"BatchIngestionJobStatus":{"properties":{"jobId":{"type":"integer","title":"Jobid"},"status":{"type":"string","title":"Status"},"createdAt":{"type":"string","format":"date-time","title":"Createdat"},"startedAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Startedat"},"completedAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Completedat"},"errorMessage":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Errormessage"},"taskId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Taskid"},"processedCount":{"anyOf":[{"$ref":"#/components/schemas/ProcessedCounts"},{"type":"null"}]},"progressPercentage":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Progresspercentage"},"estimatedRemainingTime":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Estimatedremainingtime"},"successRate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Successrate"},"errorCount":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Errorcount"},"errorDetails":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Errordetails"}},"type":"object","required":["jobId","status","createdAt"],"title":"BatchIngestionJobStatus","description":"Esquema para consultar el estado de un trabajo de ingesta masiva.\n\nSerializa a camelCase:\n- job_id -> jobId\n- created_at -> createdAt\n- started_at -> startedAt\n- completed_at -> completedAt\n- error_message -> errorMessage\n- task_id -> taskId\n- processed_count -> processedCount\n- progress_percentage -> progressPercentage\n- estimated_remaining_time -> estimatedRemainingTime\n- success_rate -> successRate\n- error_count -> errorCount\n- error_details -> errorDetails"},"BatchIngestionRequest":{"properties":{"users":{"anyOf":[{"items":{"$ref":"#/components/schemas/EndUserCreate"},"type":"array"},{"type":"null"}],"title":"Users","description":"Lista de usuarios a cargar"},"products":{"anyOf":[{"items":{"$ref":"#/components/schemas/ProductCreate"},"type":"array"},{"type":"null"}],"title":"Products","description":"Lista de productos a cargar"},"interactions":{"anyOf":[{"items":{"anyOf":[{"$ref":"#/components/schemas/InteractionCreate"},{"$ref":"#/components/schemas/InteractionExternalCreate"}]},"type":"array"},{"type":"null"}],"title":"Interactions","description":"Lista de interacciones a cargar (pueden usar IDs internos o externos)"},"webhookUrl":{"anyOf":[{"type":"string","maxLength":512},{"type":"null"}],"title":"Webhookurl","description":"URL opcional para recibir notificaciones cuando el trabajo finalice. Se enviará un POST con el estado del trabajo."}},"type":"object","title":"BatchIngestionRequest","description":"Esquema para la carga masiva de datos"},"BatchIngestionResponse":{"properties":{"message":{"type":"string","title":"Message"},"status":{"type":"string","title":"Status"},"jobId":{"type":"integer","title":"Jobid"},"taskId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Taskid"},"totalUsers":{"type":"integer","title":"Totalusers"},"totalProducts":{"type":"integer","title":"Totalproducts"},"totalInteractions":{"type":"integer","title":"Totalinteractions"}},"type":"object","required":["message","status","jobId","totalUsers","totalProducts","totalInteractions"],"title":"BatchIngestionResponse","description":"Esquema para la respuesta de la carga masiva"},"CartQueryExternalRequest":{"properties":{"externalUserId":{"type":"string","title":"Externaluserid","description":"ID externo del usuario proporcionado por el cliente"},"filters":{"anyOf":[{"$ref":"#/components/schemas/FilterGroup"},{"type":"null"}],"description":"Filtros estructurados para aplicar a las recomendaciones"},"context":{"anyOf":[{"$ref":"#/components/schemas/RecommendationContext"},{"type":"null"}],"description":"Contexto explícito para filtrar o re-rankear recomendaciones"},"modelType":{"type":"string","title":"Modeltype","description":"Tipo de modelo a utilizar","default":"standard"},"includeExplanation":{"type":"boolean","title":"Includeexplanation","description":"Incluir explicación de la recomendación","default":false},"sortBy":{"anyOf":[{"$ref":"#/components/schemas/SortConfig"},{"type":"null"}],"description":"Configuración de ordenamiento"},"skip":{"type":"integer","minimum":0,"title":"Skip","description":"Número de elementos a saltar","default":0},"limit":{"type":"integer","maximum":100,"exclusiveMinimum":0,"title":"Limit","description":"Número máximo de elementos a devolver","default":10},"cartItems":{"items":{"type":"string"},"type":"array","minItems":1,"title":"Cartitems","description":"External IDs de los productos actualmente en el carrito"}},"type":"object","required":["externalUserId","cartItems"],"title":"CartQueryExternalRequest","description":"Esquema para solicitudes de recomendaciones de carrito (e-commerce).\nExtiende RecommendationQueryExternalRequest agregando los items del carrito\nen el body (evita query params frágiles con URLs muy largas).","example":{"example":"safe_value"}},"Category":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"},"relevance":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Relevance"}},"type":"object","required":["id","name"],"title":"Category","description":"Esquema para representar una categoría de productos."},"CheckoutQueryExternalRequest":{"properties":{"externalUserId":{"type":"string","title":"Externaluserid","description":"ID externo del usuario proporcionado por el cliente"},"filters":{"anyOf":[{"$ref":"#/components/schemas/FilterGroup"},{"type":"null"}],"description":"Filtros estructurados para aplicar a las recomendaciones"},"context":{"anyOf":[{"$ref":"#/components/schemas/RecommendationContext"},{"type":"null"}],"description":"Contexto explícito para filtrar o re-rankear recomendaciones"},"modelType":{"type":"string","title":"Modeltype","description":"Tipo de modelo a utilizar","default":"standard"},"includeExplanation":{"type":"boolean","title":"Includeexplanation","description":"Incluir explicación de la recomendación","default":false},"sortBy":{"anyOf":[{"$ref":"#/components/schemas/SortConfig"},{"type":"null"}],"description":"Configuración de ordenamiento"},"skip":{"type":"integer","minimum":0,"title":"Skip","description":"Número de elementos a saltar","default":0},"limit":{"type":"integer","maximum":100,"exclusiveMinimum":0,"title":"Limit","description":"Número máximo de elementos a devolver","default":10},"orderValue":{"type":"number","exclusiveMinimum":0,"title":"Ordervalue","description":"Valor total del pedido actual (para caps de precio de upsell)"}},"type":"object","required":["externalUserId","orderValue"],"title":"CheckoutQueryExternalRequest","description":"Esquema para solicitudes de recomendaciones de checkout (e-commerce).\nExtiende RecommendationQueryExternalRequest agregando el valor del pedido\nen el body.","example":{"example":"safe_value"}},"CreateCheckoutSessionRequest":{"properties":{"priceId":{"type":"string","title":"Priceid","description":"Price ID (Mercado Pago)"},"successUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Successurl","description":"URL de redirección en caso de éxito"},"cancelUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cancelurl","description":"URL de redirección en caso de cancelación"},"paymentGateway":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Paymentgateway","description":"Pasarela de pago a utilizar (mercadopago)","default":"mercadopago"}},"type":"object","required":["priceId"],"title":"CreateCheckoutSessionRequest","description":"Schema para crear una sesión de checkout."},"CreateCheckoutSessionResponse":{"properties":{"url":{"type":"string","title":"Url","description":"URL de la sesión de checkout"},"sessionId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sessionid","description":"ID de la sesión de checkout (solo para Stripe)"}},"type":"object","required":["url"],"title":"CreateCheckoutSessionResponse","description":"Schema para la respuesta de creación de sesión de checkout."},"CreatePortalSessionRequest":{"properties":{"returnUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Returnurl","description":"URL de retorno después de usar el portal"},"paymentGateway":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Paymentgateway","description":"Pasarela de pago a utilizar (mercadopago)","default":"mercadopago"}},"type":"object","title":"CreatePortalSessionRequest","description":"Schema para crear una sesión del portal de facturación."},"CreatePortalSessionResponse":{"properties":{"url":{"type":"string","title":"Url","description":"URL de la sesión del portal de facturación"}},"type":"object","required":["url"],"title":"CreatePortalSessionResponse","description":"Schema para la respuesta de creación de sesión del portal de facturación."},"CreateSubscriptionSessionRequest":{"properties":{"priceId":{"type":"string","title":"Priceid","description":"Price ID interno del plan (Rayuela)"},"successUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Successurl","description":"URL de redirección en caso de éxito"},"cancelUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cancelurl","description":"URL de redirección en caso de cancelación"},"paymentGateway":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Paymentgateway","description":"Pasarela de pago a utilizar (mercadopago)","default":"mercadopago"}},"type":"object","required":["priceId"],"title":"CreateSubscriptionSessionRequest","description":"Schema para crear una sesión de suscripción recurrente (preapproval)."},"CreateSubscriptionSessionResponse":{"properties":{"url":{"type":"string","title":"Url","description":"URL de checkout para autorizar la suscripción"},"subscriptionId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subscriptionid","description":"ID de la suscripción (preapproval) en la pasarela"}},"type":"object","required":["url"],"title":"CreateSubscriptionSessionResponse","description":"Schema para la respuesta de creación de sesión de suscripción."},"DeviceType":{"type":"string","enum":["desktop","mobile","tablet","tv","other"],"title":"DeviceType","description":"Tipos de dispositivos desde donde se solicitan recomendaciones"},"EndUser":{"properties":{"externalId":{"type":"string","title":"Externalid"},"accountId":{"type":"integer","title":"Accountid"},"userId":{"type":"integer","title":"Userid"},"createdAt":{"type":"string","format":"date-time","title":"Createdat"},"updatedAt":{"type":"string","format":"date-time","title":"Updatedat"},"isActive":{"type":"boolean","title":"Isactive"},"deletedAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Deletedat"},"preferredCategories":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Preferredcategories"},"dislikedCategories":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Dislikedcategories"},"preferredBrands":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Preferredbrands"},"dislikedBrands":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Dislikedbrands"},"priceRangeMin":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Pricerangemin"},"priceRangeMax":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Pricerangemax"},"demographicInfo":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Demographicinfo"},"onboardingPreferences":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Onboardingpreferences"}},"type":"object","required":["externalId","accountId","userId","createdAt","updatedAt","isActive"],"title":"EndUser"},"EndUserCreate":{"properties":{"externalId":{"type":"string","title":"Externalid"},"preferredCategories":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Preferredcategories","description":"List of preferred product categories for initial recommendations"},"dislikedCategories":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Dislikedcategories","description":"List of categories to avoid in recommendations"},"preferredBrands":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Preferredbrands","description":"List of preferred brands for initial recommendations"},"dislikedBrands":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Dislikedbrands","description":"List of brands to avoid in recommendations"},"priceRangeMin":{"anyOf":[{"type":"number","minimum":0},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Pricerangemin","description":"Minimum price preference for recommendations"},"priceRangeMax":{"anyOf":[{"type":"number","minimum":0},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Pricerangemax","description":"Maximum price preference for recommendations"},"demographicInfo":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Demographicinfo","description":"Demographic information (age_group, gender, location, etc.)"},"onboardingPreferences":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Onboardingpreferences","description":"Additional preferences collected during onboarding"}},"type":"object","required":["externalId"],"title":"EndUserCreate"},"EndUserDataExport":{"properties":{"formatVersion":{"type":"string","title":"Formatversion","description":"Versión del formato de export para evolucionar el contrato","default":"1.0"},"exportedAt":{"type":"string","format":"date-time","title":"Exportedat","description":"Instante de generación del export"},"endUser":{"$ref":"#/components/schemas/EndUser"},"interactions":{"items":{"$ref":"#/components/schemas/EndUserExportInteraction"},"type":"array","title":"Interactions"},"searches":{"items":{"$ref":"#/components/schemas/EndUserExportSearch"},"type":"array","title":"Searches"},"recommendations":{"items":{"$ref":"#/components/schemas/EndUserExportRecommendation"},"type":"array","title":"Recommendations"},"orders":{"items":{"$ref":"#/components/schemas/EndUserExportOrder"},"type":"array","title":"Orders"},"orderItems":{"items":{"$ref":"#/components/schemas/EndUserExportOrderItem"},"type":"array","title":"Orderitems"}},"type":"object","required":["exportedAt","endUser"],"title":"EndUserDataExport","description":"Export completo de los datos personales de un end-user (portabilidad).\n\nRespuesta de ``GET /end-users/external/{external_user_id}/export``.\nIncluye el registro del sujeto y todos sus datos asociados, filtrados\nsiempre por ``account_id`` (aislamiento multi-tenant)."},"EndUserErasureResult":{"properties":{"externalId":{"type":"string","title":"Externalid"},"userId":{"type":"integer","title":"Userid"},"deleted":{"type":"boolean","title":"Deleted","default":true},"interactionsDeleted":{"type":"integer","title":"Interactionsdeleted","default":0},"searchesDeleted":{"type":"integer","title":"Searchesdeleted","default":0},"recommendationsDeleted":{"type":"integer","title":"Recommendationsdeleted","default":0},"ordersDeleted":{"type":"integer","title":"Ordersdeleted","default":0},"orderItemsDeleted":{"type":"integer","title":"Orderitemsdeleted","default":0},"endUserDeleted":{"type":"integer","title":"Enduserdeleted","default":0},"erasedAt":{"type":"string","format":"date-time","title":"Erasedat"}},"type":"object","required":["externalId","userId","erasedAt"],"title":"EndUserErasureResult","description":"Resultado de la eliminación física (hard delete) de un end-user.\n\nRespuesta de ``DELETE /end-users/external/{external_user_id}``.\nSólo expone conteos y el identificador externo solicitado por el cliente;\nno devuelve datos personales ya borrados."},"EndUserExportInteraction":{"properties":{"id":{"type":"integer","title":"Id"},"productId":{"type":"integer","title":"Productid"},"interactionType":{"$ref":"#/components/schemas/InteractionType"},"value":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Value"},"recommendationMetadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Recommendationmetadata"},"timestamp":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Timestamp"}},"type":"object","required":["id","productId","interactionType"],"title":"EndUserExportInteraction","description":"Interacción de un end-user incluida en el export de datos personales."},"EndUserExportOrder":{"properties":{"id":{"type":"integer","title":"Id"},"orderNumber":{"type":"string","title":"Ordernumber"},"status":{"$ref":"#/components/schemas/OrderStatus"},"totalAmount":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Totalamount"},"currency":{"type":"string","title":"Currency"},"shippingAddress":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Shippingaddress"},"billingAddress":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Billingaddress"},"paymentMethod":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Paymentmethod"},"orderDate":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Orderdate"}},"type":"object","required":["id","orderNumber","status","totalAmount","currency"],"title":"EndUserExportOrder","description":"Orden de un end-user (contiene datos personales: dirección, pago)."},"EndUserExportOrderItem":{"properties":{"id":{"type":"integer","title":"Id"},"orderId":{"type":"integer","title":"Orderid"},"productId":{"type":"integer","title":"Productid"},"quantity":{"type":"integer","title":"Quantity"},"unitPrice":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Unitprice"},"totalPrice":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Totalprice"}},"type":"object","required":["id","orderId","productId","quantity","unitPrice","totalPrice"],"title":"EndUserExportOrderItem","description":"Ítem de una orden de un end-user."},"EndUserExportRecommendation":{"properties":{"id":{"type":"integer","title":"Id"},"productId":{"type":"integer","title":"Productid"},"score":{"type":"number","title":"Score"},"createdAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Createdat"}},"type":"object","required":["id","productId","score"],"title":"EndUserExportRecommendation","description":"Recomendación mostrada a un end-user (dato derivado)."},"EndUserExportSearch":{"properties":{"id":{"type":"integer","title":"Id"},"queryText":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Querytext"},"resultsMetadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Resultsmetadata"},"timestamp":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Timestamp"}},"type":"object","required":["id"],"title":"EndUserExportSearch","description":"Búsqueda de un end-user incluida en el export de datos personales."},"EndUserUpdate":{"properties":{"externalId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Externalid"},"isActive":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Isactive"},"preferredCategories":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Preferredcategories"},"dislikedCategories":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Dislikedcategories"},"preferredBrands":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Preferredbrands"},"dislikedBrands":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Dislikedbrands"},"priceRangeMin":{"anyOf":[{"type":"number","minimum":0},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Pricerangemin"},"priceRangeMax":{"anyOf":[{"type":"number","minimum":0},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Pricerangemax"},"demographicInfo":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Demographicinfo"},"onboardingPreferences":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Onboardingpreferences"}},"type":"object","title":"EndUserUpdate"},"ExplanationLevel":{"type":"string","enum":["simple"],"title":"ExplanationLevel","description":"Niveles de detalle para explicaciones de recomendaciones"},"Filter":{"properties":{"field":{"type":"string","title":"Field","description":"Campo a filtrar"},"operator":{"$ref":"#/components/schemas/FilterOperator","description":"Operador de filtrado"},"value":{"title":"Value","description":"Valor a comparar"}},"type":"object","required":["field","operator","value"],"title":"Filter","description":"Filtro para recomendaciones"},"FilterGroup":{"properties":{"logic":{"$ref":"#/components/schemas/LogicalOperator","description":"Lógica de combinación (and/or)","default":"and"},"filters":{"items":{"anyOf":[{"$ref":"#/components/schemas/Filter"},{"$ref":"#/components/schemas/FilterGroup"}]},"type":"array","title":"Filters","description":"Lista de filtros o grupos de filtros"}},"type":"object","required":["filters"],"title":"FilterGroup","description":"Grupo de filtros con lógica AND/OR"},"FilterOperator":{"type":"string","enum":["eq","ne","gt","gte","lt","lte","in","nin","contains","startswith","endswith"],"title":"FilterOperator","description":"Operadores para filtros estructurados"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"Interaction":{"properties":{"userId":{"type":"integer","title":"Userid"},"productId":{"type":"integer","title":"Productid"},"interactionType":{"$ref":"#/components/schemas/InteractionType"},"value":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Value"},"recommendationMetadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Recommendationmetadata"},"id":{"type":"integer","title":"Id"},"accountId":{"type":"integer","title":"Accountid"},"timestamp":{"type":"string","format":"date-time","title":"Timestamp"}},"type":"object","required":["userId","productId","interactionType","value","id","accountId","timestamp"],"title":"Interaction"},"InteractionCreate":{"properties":{"userId":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Userid","description":"Internal user ID"},"productId":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Productid","description":"Internal product ID"},"externalUserId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Externaluserid","description":"External user identifier provided by the client"},"externalProductId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Externalproductid","description":"External product identifier provided by the client"},"interactionType":{"$ref":"#/components/schemas/InteractionType"},"value":{"anyOf":[{"type":"number"},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"}],"title":"Value"},"recommendationMetadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Recommendationmetadata"}},"type":"object","required":["interactionType","value"],"title":"InteractionCreate","description":"Schema for creating interactions with support for both internal and external IDs."},"InteractionExternalCreate":{"properties":{"externalUserId":{"type":"string","title":"Externaluserid","description":"External user identifier provided by the client"},"externalProductId":{"type":"string","title":"Externalproductid","description":"External product identifier provided by the client"},"interactionType":{"$ref":"#/components/schemas/InteractionType"},"value":{"anyOf":[{"type":"number"},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"}],"title":"Value"},"recommendationMetadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Recommendationmetadata"}},"type":"object","required":["externalUserId","externalProductId","interactionType","value"],"title":"InteractionExternalCreate","description":"Schema for creating interactions using external IDs."},"InteractionType":{"type":"string","enum":["VIEW","LIKE","PURCHASE","CART","RATING","WISHLIST","CLICK","SEARCH","FAVORITE"],"title":"InteractionType"},"InventoryUpdate":{"properties":{"inventoryCount":{"type":"integer","minimum":0,"title":"Inventorycount","description":"Cantidad de inventario disponible"}},"type":"object","required":["inventoryCount"],"title":"InventoryUpdate","description":"Esquema para actualización de inventario.\n\nSerializa a camelCase:\n- inventory_count -> inventoryCount"},"LogicalOperator":{"type":"string","enum":["and","or"],"title":"LogicalOperator","description":"Operadores lógicos para combinar filtros"},"LoginRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email","description":"Email del usuario"},"password":{"type":"string","minLength":1,"title":"Password","description":"Contraseña del usuario"}},"type":"object","required":["email","password"],"title":"LoginRequest","description":"Schema para el login de usuarios con JSON payload."},"LoginResponse":{"properties":{"accessToken":{"type":"string","title":"Accesstoken","description":"JWT access token"},"tokenType":{"type":"string","title":"Tokentype","description":"Token type (bearer)"},"accountId":{"type":"integer","title":"Accountid","description":"Account ID"},"isAdmin":{"type":"boolean","title":"Isadmin","description":"Whether user is admin"},"apiKeyPrefix":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Apikeyprefix","description":"Prefijo de la API Key activa (sk_...) — el valor completo solo se muestra una vez al crearla. Permite al desarrollador saber que la clave existe sin exponerla. DX #2."}},"type":"object","required":["accessToken","tokenType","accountId","isAdmin"],"title":"LoginResponse","description":"Login response schema"},"ModelInfo":{"properties":{"id":{"type":"integer","title":"Id"},"artifactName":{"type":"string","title":"Artifactname"},"artifactVersion":{"type":"string","title":"Artifactversion"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"trainingDate":{"type":"string","format":"date-time","title":"Trainingdate"}},"type":"object","required":["id","artifactName","artifactVersion","trainingDate"],"title":"ModelInfo","description":"Información básica de un modelo"},"ModelMetadataResponse":{"properties":{"id":{"type":"integer","title":"Id"},"artifactName":{"type":"string","title":"Artifactname"},"artifactVersion":{"type":"string","title":"Artifactversion"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"trainingDate":{"type":"string","format":"date-time","title":"Trainingdate"},"performanceMetrics":{"additionalProperties":true,"type":"object","title":"Performancemetrics"},"gitSha":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Gitsha","description":"Git commit SHA for reproducibility"}},"type":"object","required":["id","artifactName","artifactVersion","trainingDate","performanceMetrics","parameters"],"title":"ModelMetadataResponse"},"NewApiKeyResponse":{"properties":{"id":{"type":"integer","title":"Id","description":"ID único de la API Key"},"apiKey":{"type":"string","title":"Apikey","description":"API Key completa (solo se muestra una vez)"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name","description":"Nombre descriptivo de la API Key"},"prefix":{"type":"string","title":"Prefix","description":"Prefijo de la API Key"},"keyType":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Keytype","description":"Tipo de API Key: 'sk_' (secreta) o 'pk_' (pública)"},"scopes":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Scopes","description":"Scopes otorgados ('*' = acceso completo)"},"allowedDomains":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Alloweddomains","description":"Allowlist de dominios para keys 'pk_'"},"createdAt":{"type":"string","format":"date-time","title":"Createdat","description":"Fecha de creación"},"message":{"type":"string","title":"Message","description":"Mensaje informativo"}},"type":"object","required":["id","apiKey","prefix","createdAt","message"],"title":"NewApiKeyResponse","description":"Schema for a newly created API Key (includes the full key).\n\nSerializa a camelCase:\n- id -> id\n- api_key -> apiKey\n- name -> name\n- prefix -> prefix\n- created_at -> createdAt\n- message -> message"},"OrderStatus":{"type":"string","enum":["PENDING","CONFIRMED","PROCESSING","SHIPPED","DELIVERED","CANCELED","REFUNDED"],"title":"OrderStatus"},"PageType":{"type":"string","enum":["home","product_detail","category","search_results","cart","checkout","user_profile"],"title":"PageType","description":"Tipos de páginas donde se muestran recomendaciones"},"PaginatedResponse_Category_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/Category"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total"},"skip":{"type":"integer","title":"Skip"},"limit":{"type":"integer","title":"Limit"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta"}},"type":"object","required":["items","total","skip","limit"],"title":"PaginatedResponse[Category]"},"PaginatedResponse_EndUser_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/EndUser"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total"},"skip":{"type":"integer","title":"Skip"},"limit":{"type":"integer","title":"Limit"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta"}},"type":"object","required":["items","total","skip","limit"],"title":"PaginatedResponse[EndUser]"},"PaginatedResponse_Interaction_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/Interaction"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total"},"skip":{"type":"integer","title":"Skip"},"limit":{"type":"integer","title":"Limit"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta"}},"type":"object","required":["items","total","skip","limit"],"title":"PaginatedResponse[Interaction]"},"PaginatedResponse_Product_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/Product"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total"},"skip":{"type":"integer","title":"Skip"},"limit":{"type":"integer","title":"Limit"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta"}},"type":"object","required":["items","total","skip","limit"],"title":"PaginatedResponse[Product]"},"PaginatedResponse_Search_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/Search"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total"},"skip":{"type":"integer","title":"Skip"},"limit":{"type":"integer","title":"Limit"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta"}},"type":"object","required":["items","total","skip","limit"],"title":"PaginatedResponse[Search]"},"PlanDetails":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"description":{"type":"string","title":"Description"},"price":{"type":"string","title":"Price"},"features":{"items":{"type":"string"},"type":"array","title":"Features"},"limits":{"additionalProperties":true,"type":"object","title":"Limits"},"mercadopago_price_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mercadopago Price Id"},"contact_required":{"type":"boolean","title":"Contact Required","default":false},"recommended":{"type":"boolean","title":"Recommended","default":false}},"type":"object","required":["id","name","description","price","features","limits"],"title":"PlanDetails","description":"Plan information model."},"PlanFeatures":{"properties":{"availableModels":{"items":{"type":"string"},"type":"array","title":"Availablemodels","description":"Available models"}},"type":"object","title":"PlanFeatures","description":"Plan features information"},"PlanInfo":{"properties":{"id":{"type":"string","title":"Id","description":"Plan ID"},"limits":{"$ref":"#/components/schemas/PlanLimits","description":"Plan limits"},"features":{"$ref":"#/components/schemas/PlanFeatures","description":"Plan features"}},"type":"object","required":["id","limits","features"],"title":"PlanInfo","description":"Plan information"},"PlanLimits":{"properties":{"apiCalls":{"type":"integer","title":"Apicalls","description":"API calls limit","default":10000},"storageBytes":{"type":"integer","title":"Storagebytes","description":"Storage limit in bytes","default":1000000},"storageMb":{"type":"number","title":"Storagemb","description":"Storage limit in MB","default":1},"storageGb":{"type":"number","title":"Storagegb","description":"Storage limit in GB","default":0.001},"maxRequestsPerMinute":{"type":"integer","title":"Maxrequestsperminute","description":"Rate limit per minute","default":60},"maxConcurrentRequests":{"type":"integer","title":"Maxconcurrentrequests","description":"Concurrent requests limit","default":10},"trainingFrequency":{"type":"string","title":"Trainingfrequency","description":"Training frequency","default":"manual"},"trainingDataLimit":{"type":"integer","title":"Trainingdatalimit","description":"Training data limit","default":0},"trainingDataLimitFormatted":{"type":"string","title":"Trainingdatalimitformatted","description":"Formatted training data limit","default":"Unlimited"},"maxItems":{"type":"integer","title":"Maxitems","description":"Maximum items","default":0},"maxItemsFormatted":{"type":"string","title":"Maxitemsformatted","description":"Formatted max items","default":"Unlimited"},"maxUsers":{"type":"integer","title":"Maxusers","description":"Maximum users","default":0},"maxUsersFormatted":{"type":"string","title":"Maxusersformatted","description":"Formatted max users","default":"Unlimited"},"recommendationCacheTtl":{"type":"integer","title":"Recommendationcachettl","description":"Cache TTL in seconds","default":3600}},"type":"object","title":"PlanLimits","description":"Plan limits information"},"ProcessedCounts":{"properties":{"users":{"type":"integer","title":"Users","description":"Número de usuarios procesados","default":0},"products":{"type":"integer","title":"Products","description":"Número de productos procesados","default":0},"interactions":{"type":"integer","title":"Interactions","description":"Número de interacciones procesadas","default":0},"total":{"type":"integer","title":"Total","description":"Total de registros procesados","default":0},"errors":{"type":"integer","title":"Errors","description":"Número de errores encontrados","default":0}},"type":"object","title":"ProcessedCounts","description":"Conteo de registros procesados en un trabajo de ingesta.\n\nEsquema tipado para evitar usar Dict[str, Any] y asegurar\nla conversión automática a camelCase.\n\nSerializa a camelCase:\n- users -> users\n- products -> products\n- interactions -> interactions\n- total -> total\n- errors -> errors"},"Product":{"properties":{"externalId":{"type":"string","maxLength":255,"minLength":1,"title":"Externalid","description":"External identifier provided by the client (e.g., SKU, product code)"},"name":{"type":"string","maxLength":255,"minLength":1,"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"price":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*(?:\\d{0,8}|(?=[\\d.]{1,11}0*$)\\d{0,8}\\.\\d{0,2}0*$)","title":"Price"},"category":{"type":"string","maxLength":100,"minLength":1,"title":"Category"},"averageRating":{"type":"number","maximum":5,"minimum":0,"title":"Averagerating","default":0},"numRatings":{"type":"integer","minimum":0,"title":"Numratings","default":0},"inventoryCount":{"type":"integer","minimum":0,"title":"Inventorycount","default":0},"productId":{"type":"integer","title":"Productid"},"accountId":{"type":"integer","title":"Accountid"},"createdAt":{"type":"string","format":"date-time","title":"Createdat"},"updatedAt":{"type":"string","format":"date-time","title":"Updatedat"},"isActive":{"type":"boolean","title":"Isactive","default":true},"deletedAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Deletedat"},"score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Score"},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"},"explanation":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Explanation"}},"type":"object","required":["externalId","name","price","category","productId","accountId","createdAt","updatedAt"],"title":"Product"},"ProductCreate":{"properties":{"externalId":{"type":"string","maxLength":255,"minLength":1,"title":"Externalid","description":"External identifier provided by the client (e.g., SKU, product code)"},"name":{"type":"string","maxLength":255,"minLength":1,"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"price":{"anyOf":[{"type":"number","exclusiveMinimum":0},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*(?:\\d{0,8}|(?=[\\d.]{1,11}0*$)\\d{0,8}\\.\\d{0,2}0*$)"}],"title":"Price"},"category":{"type":"string","maxLength":100,"minLength":1,"title":"Category"},"averageRating":{"type":"number","maximum":5,"minimum":0,"title":"Averagerating","default":0},"numRatings":{"type":"integer","minimum":0,"title":"Numratings","default":0},"inventoryCount":{"type":"integer","minimum":0,"title":"Inventorycount","default":0}},"type":"object","required":["externalId","name","price","category"],"title":"ProductCreate"},"ProductUpdate":{"properties":{"externalId":{"anyOf":[{"type":"string","maxLength":255,"minLength":1},{"type":"null"}],"title":"Externalid","description":"External identifier provided by the client (e.g., SKU, product code)"},"name":{"anyOf":[{"type":"string","maxLength":255,"minLength":1},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"price":{"anyOf":[{"type":"number","exclusiveMinimum":0},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*(?:\\d{0,8}|(?=[\\d.]{1,11}0*$)\\d{0,8}\\.\\d{0,2}0*$)"},{"type":"null"}],"title":"Price"},"category":{"anyOf":[{"type":"string","maxLength":100,"minLength":1},{"type":"null"}],"title":"Category"},"averageRating":{"anyOf":[{"type":"number","maximum":5,"minimum":0},{"type":"null"}],"title":"Averagerating"},"numRatings":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"title":"Numratings"},"inventoryCount":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"title":"Inventorycount"}},"type":"object","title":"ProductUpdate","description":"Esquema para actualización de productos.\n\nHereda de CamelCaseModel para garantizar consistencia con el resto de la API:\n- external_id -> externalId\n- inventory_count -> inventoryCount\n- average_rating -> averageRating\n- num_ratings -> numRatings"},"PublicExplanationLevel":{"type":"string","enum":["simple"],"title":"PublicExplanationLevel","description":"Niveles de explicación disponibles públicamente"},"PublicModelVariant":{"type":"string","enum":["standard","premium","enterprise"],"title":"PublicModelVariant","description":"Variantes de modelo orientadas al plan de suscripción"},"PublicRecommendationContext":{"properties":{"pageType":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pagetype","description":"Tipo de página donde se muestran las recomendaciones"},"device":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Device","description":"Tipo de dispositivo desde donde se solicitan las recomendaciones"},"sourceExternalProductId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sourceexternalproductid","description":"ID externo del producto de origen (ej: en página de detalle)"},"searchQuery":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Searchquery","description":"Consulta de búsqueda actual"},"categoryName":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Categoryname","description":"Nombre de la categoría actual"},"cartExternalProductIds":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Cartexternalproductids","description":"IDs externos de productos en el carrito"},"recentlyViewedExternalProductIds":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Recentlyviewedexternalproductids","description":"IDs externos de productos vistos recientemente"},"location":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Location","description":"Ubicación geográfica del usuario"},"timeOfDay":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Timeofday","description":"Momento del día (mañana, tarde, noche)"},"customAttributes":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Customattributes","description":"Atributos personalizados adicionales"}},"type":"object","title":"PublicRecommendationContext","description":"Contexto público para recomendaciones usando external IDs.\n\nSEGURIDAD: Solo expone IDs externos que el cliente controla."},"PublicRecommendationGoal":{"type":"string","enum":["conversion_optimization","user_engagement","discovery_mode","catalog_promotion"],"title":"PublicRecommendationGoal","description":"Objetivos de recomendación orientados al negocio (nombres ofuscados)"},"PublicRecommendationQueryExternalRequest":{"properties":{"externalUserId":{"type":"string","title":"Externaluserid","description":"ID externo del usuario proporcionado por el cliente"},"filters":{"anyOf":[{"$ref":"#/components/schemas/FilterGroup"},{"type":"null"}],"description":"Filtros para aplicar a las recomendaciones"},"context":{"anyOf":[{"$ref":"#/components/schemas/PublicRecommendationContext"},{"type":"null"}],"description":"Contexto para personalizar recomendaciones"},"recommendationGoal":{"anyOf":[{"$ref":"#/components/schemas/PublicRecommendationGoal"},{"type":"null"}],"description":"Objetivo de la recomendación","default":"user_engagement"},"modelVariant":{"$ref":"#/components/schemas/PublicModelVariant","description":"Variante del modelo según su plan de suscripción","default":"standard"},"includeExplanation":{"type":"boolean","title":"Includeexplanation","description":"Incluir explicación de las recomendaciones","default":false},"explanationLevel":{"$ref":"#/components/schemas/PublicExplanationLevel","description":"Nivel de detalle de la explicación","default":"simple"},"skip":{"type":"integer","minimum":0,"title":"Skip","description":"Número de elementos a omitir","default":0},"limit":{"type":"integer","maximum":100,"minimum":1,"title":"Limit","description":"Número máximo de elementos a devolver","default":10}},"type":"object","required":["externalUserId"],"title":"PublicRecommendationQueryExternalRequest","description":"Esquema público para solicitudes usando external_user_id.\n\nSEGURIDAD: Versión simplificada sin exposición de parámetros internos.","example":{"example":"safe_value"}},"QuickStartDataCreated":{"properties":{"usersCount":{"type":"integer","title":"Userscount","description":"Número de usuarios de ejemplo creados"},"productsCount":{"type":"integer","title":"Productscount","description":"Número de productos de ejemplo creados"},"interactionsCount":{"type":"integer","title":"Interactionscount","description":"Número de interacciones de ejemplo creadas"},"sampleUserId":{"type":"string","title":"Sampleuserid","description":"ID de usuario de ejemplo para pruebas"}},"type":"object","required":["usersCount","productsCount","interactionsCount","sampleUserId"],"title":"QuickStartDataCreated","description":"Información sobre los datos creados por Quick Start.\n\nSerializa a camelCase:\n- users_count -> usersCount\n- products_count -> productsCount\n- interactions_count -> interactionsCount\n- sample_user_id -> sampleUserId"},"QuickStartDemoBusinessImpact":{"properties":{"estimatedCtrLift":{"type":"string","title":"Estimatedctrlift","description":"Aumento estimado de CTR"},"estimatedRevenueImpact":{"type":"string","title":"Estimatedrevenueimpact","description":"Impacto estimado en ingresos"},"timeToImplementation":{"type":"string","title":"Timetoimplementation","description":"Tiempo estimado de implementación"}},"type":"object","required":["estimatedCtrLift","estimatedRevenueImpact","timeToImplementation"],"title":"QuickStartDemoBusinessImpact","description":"Impacto de negocio estimado.\n\nSerializa a camelCase:\n- estimated_ctr_lift -> estimatedCtrLift\n- estimated_revenue_impact -> estimatedRevenueImpact\n- time_to_implementation -> timeToImplementation"},"QuickStartDemoRecommendationItem":{"properties":{"id":{"type":"integer","title":"Id","description":"ID del producto"},"name":{"type":"string","title":"Name","description":"Nombre del producto"},"price":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Price","description":"Precio del producto"},"category":{"type":"string","title":"Category","description":"Categoría del producto"},"score":{"type":"number","title":"Score","description":"Puntuación de relevancia"},"explanation":{"type":"string","title":"Explanation","description":"Explicación de la recomendación"}},"type":"object","required":["id","name","category","score","explanation"],"title":"QuickStartDemoRecommendationItem","description":"Item de recomendación en el demo."},"QuickStartDemoRecommendationMeta":{"properties":{"usedSampleData":{"type":"boolean","title":"Usedsampledata","description":"Indica si se usaron datos de ejemplo"},"responseTimeMs":{"type":"integer","title":"Responsetimems","description":"Tiempo de respuesta en milisegundos"}},"type":"object","required":["strategy","usedSampleData","responseTimeMs"],"title":"QuickStartDemoRecommendationMeta","description":"Metadatos de recomendaciones del demo.\n\nSerializa a camelCase:\n- used_sample_data -> usedSampleData\n- response_time_ms -> responseTimeMs"},"QuickStartDemoRecommendations":{"properties":{"items":{"items":{"$ref":"#/components/schemas/QuickStartDemoRecommendationItem"},"type":"array","title":"Items","description":"Lista de productos recomendados"},"total":{"type":"integer","title":"Total","description":"Total de recomendaciones disponibles"},"meta":{"$ref":"#/components/schemas/QuickStartDemoRecommendationMeta","description":"Metadatos de la consulta"}},"type":"object","required":["items","total","meta"],"title":"QuickStartDemoRecommendations","description":"Recomendaciones del demo."},"QuickStartDemoResponse":{"properties":{"success":{"type":"boolean","title":"Success","description":"Indica si la operación fue exitosa"},"userId":{"type":"string","title":"Userid","description":"ID del usuario utilizado para el demo"},"template":{"type":"string","title":"Template","description":"Tipo de plantilla utilizada"},"recommendations":{"$ref":"#/components/schemas/QuickStartDemoRecommendations","description":"Recomendaciones generadas"},"businessImpact":{"$ref":"#/components/schemas/QuickStartDemoBusinessImpact","description":"Impacto de negocio estimado"}},"type":"object","required":["success","userId","template","recommendations","businessImpact"],"title":"QuickStartDemoResponse","description":"Respuesta del endpoint de demo de Quick Start.\n\nSerializa a camelCase:\n- user_id -> userId\n- business_impact -> businessImpact"},"QuickStartResponse":{"properties":{"success":{"type":"boolean","title":"Success","description":"Indica si la operación fue exitosa"},"template":{"type":"string","title":"Template","description":"Tipo de plantilla utilizada: ecommerce, content, marketplace"},"dataCreated":{"$ref":"#/components/schemas/QuickStartDataCreated","description":"Información de los datos creados"},"message":{"type":"string","title":"Message","description":"Mensaje informativo"},"nextSteps":{"items":{"type":"string"},"type":"array","title":"Nextsteps","description":"Lista de pasos siguientes recomendados"}},"type":"object","required":["success","template","dataCreated","message","nextSteps"],"title":"QuickStartResponse","description":"Respuesta del endpoint Quick Start.\n\nSerializa a camelCase:\n- data_created -> dataCreated\n- next_steps -> nextSteps"},"RecommendationContext":{"properties":{"pageType":{"anyOf":[{"$ref":"#/components/schemas/PageType"},{"type":"null"}],"description":"Tipo de página donde se muestran las recomendaciones"},"device":{"anyOf":[{"$ref":"#/components/schemas/DeviceType"},{"type":"null"}],"description":"Tipo de dispositivo desde donde se solicitan las recomendaciones"},"sourceItemId":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Sourceitemid","description":"ID del producto de origen (ej: en página de detalle)"},"searchQuery":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Searchquery","description":"Consulta de búsqueda actual"},"categoryId":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Categoryid","description":"ID de la categoría actual"},"cartItemIds":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"Cartitemids","description":"IDs de productos en el carrito"},"recentlyViewedIds":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"Recentlyviewedids","description":"IDs de productos vistos recientemente"},"location":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Location","description":"Ubicación geográfica del usuario"},"timeOfDay":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Timeofday","description":"Momento del día (mañana, tarde, noche)"},"customAttributes":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Customattributes","description":"Atributos personalizados adicionales"}},"type":"object","title":"RecommendationContext","description":"Contexto explícito para recomendaciones personalizadas"},"RecommendationQueryExternalRequest":{"properties":{"externalUserId":{"type":"string","title":"Externaluserid","description":"ID externo del usuario proporcionado por el cliente"},"filters":{"anyOf":[{"$ref":"#/components/schemas/FilterGroup"},{"type":"null"}],"description":"Filtros estructurados para aplicar a las recomendaciones"},"context":{"anyOf":[{"$ref":"#/components/schemas/RecommendationContext"},{"type":"null"}],"description":"Contexto explícito para filtrar o re-rankear recomendaciones"},"modelType":{"type":"string","title":"Modeltype","description":"Tipo de modelo a utilizar","default":"standard"},"includeExplanation":{"type":"boolean","title":"Includeexplanation","description":"Incluir explicación de la recomendación","default":false},"sortBy":{"anyOf":[{"$ref":"#/components/schemas/SortConfig"},{"type":"null"}],"description":"Configuración de ordenamiento"},"skip":{"type":"integer","minimum":0,"title":"Skip","description":"Número de elementos a saltar","default":0},"limit":{"type":"integer","maximum":100,"exclusiveMinimum":0,"title":"Limit","description":"Número máximo de elementos a devolver","default":10}},"type":"object","required":["externalUserId"],"title":"RecommendationQueryExternalRequest","description":"Esquema para solicitudes de recomendaciones usando external_user_id.\nPermite a los clientes usar sus propios identificadores de usuario.","example":{"example":"safe_value"}},"RegisterRequest":{"properties":{"accountName":{"type":"string","minLength":1,"title":"Accountname","description":"Nombre de la cuenta"},"email":{"type":"string","format":"email","title":"Email","description":"Email del usuario administrador"},"password":{"type":"string","minLength":8,"title":"Password","description":"Contraseña del usuario administrador"}},"type":"object","required":["accountName","email","password"],"title":"RegisterRequest","description":"Schema para el registro completo de una cuenta con usuario administrador."},"RegisterResponse":{"properties":{"accessToken":{"type":"string","title":"Accesstoken","description":"JWT access token"},"tokenType":{"type":"string","title":"Tokentype","description":"Token type (bearer)"},"accountId":{"type":"integer","title":"Accountid","description":"Account ID"},"userId":{"type":"integer","title":"Userid","description":"User ID"},"isAdmin":{"type":"boolean","title":"Isadmin","description":"Whether user is admin"},"apiKey":{"type":"string","title":"Apikey","description":"Initial API key for the user"},"message":{"type":"string","title":"Message","description":"Success message"},"emailVerificationRequired":{"type":"boolean","title":"Emailverificationrequired","description":"Whether email verification is required (FREE plan only)","default":false},"gracePeriodHours":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Graceperiodhours","description":"Grace period in hours before email verification is enforced (FREE plan: 24 hours)"}},"type":"object","required":["accessToken","tokenType","accountId","userId","isAdmin","apiKey","message"],"title":"RegisterResponse","description":"Registration response schema"},"Role":{"properties":{"name":{"$ref":"#/components/schemas/RoleType"},"description":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Description","description":"Descripción del rol"},"account_id":{"type":"integer","title":"Account Id"},"id":{"type":"integer","title":"Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["name","account_id","id","created_at","updated_at"],"title":"Role"},"RoleType":{"type":"string","enum":["ADMIN","EDITOR","VIEWER"],"title":"RoleType"},"SandboxResetResponse":{"properties":{"success":{"type":"boolean","title":"Success","description":"Indica si el reset fue exitoso"},"message":{"type":"string","title":"Message","description":"Mensaje informativo"},"resetSummary":{"$ref":"#/components/schemas/SandboxResetSummary","description":"Resumen de datos eliminados"}},"type":"object","required":["success","message","resetSummary"],"title":"SandboxResetResponse","description":"Respuesta del endpoint de reset del sandbox.\n\nSerializa a camelCase:\n- reset_summary -> resetSummary"},"SandboxResetSummary":{"properties":{"usersDeleted":{"type":"integer","title":"Usersdeleted","description":"Usuarios eliminados","default":0},"productsDeleted":{"type":"integer","title":"Productsdeleted","description":"Productos eliminados","default":0},"interactionsDeleted":{"type":"integer","title":"Interactionsdeleted","description":"Interacciones eliminadas","default":0}},"type":"object","title":"SandboxResetSummary","description":"Resumen de datos eliminados durante el reset.\n\nSerializa a camelCase:\n- users_deleted -> usersDeleted\n- products_deleted -> productsDeleted\n- interactions_deleted -> interactionsDeleted"},"SandboxStatusInfo":{"properties":{"usersCount":{"type":"integer","title":"Userscount","description":"Número de usuarios en el sandbox","default":0},"productsCount":{"type":"integer","title":"Productscount","description":"Número de productos en el sandbox","default":0},"interactionsCount":{"type":"integer","title":"Interactionscount","description":"Número de interacciones en el sandbox","default":0},"apiCallsCount":{"type":"integer","title":"Apicallscount","description":"Número de llamadas API realizadas","default":0}},"type":"object","title":"SandboxStatusInfo","description":"Información del estado actual del sandbox.\n\nSerializa a camelCase:\n- users_count -> usersCount\n- products_count -> productsCount\n- interactions_count -> interactionsCount\n- api_calls_count -> apiCallsCount"},"SandboxStatusResponse":{"properties":{"isSandbox":{"type":"boolean","title":"Issandbox","description":"Indica si es una cuenta sandbox (plan FREE)"},"status":{"anyOf":[{"$ref":"#/components/schemas/SandboxStatusInfo"},{"type":"null"}],"description":"Estado actual del sandbox"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message","description":"Mensaje adicional"}},"type":"object","required":["isSandbox"],"title":"SandboxStatusResponse","description":"Respuesta del endpoint de estado del sandbox.\n\nSerializa a camelCase:\n- is_sandbox -> isSandbox"},"Search":{"properties":{"user_id":{"type":"integer","title":"User Id"},"query":{"type":"string","title":"Query"},"id":{"type":"integer","title":"Id"},"account_id":{"type":"integer","title":"Account Id"},"timestamp":{"type":"string","format":"date-time","title":"Timestamp"}},"type":"object","required":["user_id","query","id","account_id","timestamp"],"title":"Search"},"SortConfig":{"properties":{"field":{"type":"string","title":"Field","description":"Campo por el cual ordenar"},"direction":{"$ref":"#/components/schemas/SortDirection","description":"Dirección del ordenamiento","default":"desc"}},"type":"object","required":["field"],"title":"SortConfig","description":"Configuración de ordenamiento"},"SortDirection":{"type":"string","enum":["asc","desc"],"title":"SortDirection","description":"Dirección de ordenamiento"},"StorageUsage":{"properties":{"usedBytes":{"type":"integer","title":"Usedbytes","description":"Storage used in bytes","default":0},"limitBytes":{"type":"integer","title":"Limitbytes","description":"Storage limit in bytes","default":1000000},"percentage":{"type":"number","title":"Percentage","description":"Percentage of limit used","default":0},"lastMeasured":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lastmeasured","description":"Last measurement timestamp"},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source","description":"Source of measurement (redis_cache, database_calculation)"}},"type":"object","title":"StorageUsage","description":"Storage usage information"},"SubscriptionBasicInfo":{"properties":{"plan":{"type":"string","title":"Plan"},"isActive":{"type":"boolean","title":"Isactive"},"expiresAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expiresat"}},"type":"object","required":["plan","isActive"],"title":"SubscriptionBasicInfo","description":"Información básica de suscripción para incluir en las respuestas de cuenta"},"SubscriptionInfo":{"properties":{"plan":{"type":"string","title":"Plan","description":"Plan type"},"isActive":{"type":"boolean","title":"Isactive","description":"Whether subscription is active","default":true},"expiresAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expiresat","description":"Expiration date"}},"type":"object","required":["plan"],"title":"SubscriptionInfo","description":"Subscription information"},"SystemUserResponse":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"accountId":{"type":"integer","title":"Accountid"},"id":{"type":"integer","title":"Id"},"isActive":{"type":"boolean","title":"Isactive"},"isAdmin":{"type":"boolean","title":"Isadmin"},"createdAt":{"type":"string","format":"date-time","title":"Createdat"},"updatedAt":{"type":"string","format":"date-time","title":"Updatedat"},"deletedAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Deletedat"},"roles":{"items":{"$ref":"#/components/schemas/Role"},"type":"array","title":"Roles","default":[]}},"type":"object","required":["email","accountId","id","isActive","isAdmin","createdAt","updatedAt"],"title":"SystemUserResponse","description":"Esquema de respuesta para usuarios del sistema que excluye campos sensibles"},"SystemUserResponseLite":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"accountId":{"type":"integer","title":"Accountid"},"id":{"type":"integer","title":"Id"},"isActive":{"type":"boolean","title":"Isactive"},"isAdmin":{"type":"boolean","title":"Isadmin"},"emailVerified":{"type":"boolean","title":"Emailverified","default":false},"createdAt":{"type":"string","format":"date-time","title":"Createdat"},"updatedAt":{"type":"string","format":"date-time","title":"Updatedat"},"deletedAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Deletedat"},"gracePeriodExpiresAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Graceperiodexpiresat"},"gracePeriodRemainingHours":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Graceperiodremaininghours"}},"type":"object","required":["email","accountId","id","isActive","isAdmin","createdAt","updatedAt"],"title":"SystemUserResponseLite","description":"Esquema de respuesta ligero para usuarios del sistema sin relaciones (evita MissingGreenlet)"},"SystemUserUpdate":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"password":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Password"}},"type":"object","required":["email"],"title":"SystemUserUpdate"},"TrainingJobStatus":{"properties":{"jobId":{"type":"integer","title":"Jobid"},"status":{"type":"string","title":"Status"},"createdAt":{"type":"string","format":"date-time","title":"Createdat"},"startedAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Startedat"},"completedAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Completedat"},"errorMessage":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Errormessage"},"taskId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Taskid"},"metrics":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Metrics"},"model":{"anyOf":[{"$ref":"#/components/schemas/ModelInfo"},{"type":"null"}]}},"type":"object","required":["jobId","status","createdAt"],"title":"TrainingJobStatus","description":"Estado detallado de un trabajo de entrenamiento"},"TrainingRequest":{"properties":{"maxInteractions":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Maxinteractions","description":"Número máximo de interacciones a usar para el entrenamiento"},"sampleSize":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Samplesize","description":"Tamaño de muestra para el entrenamiento"},"daysLimit":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Dayslimit","description":"Limitar interacciones a los últimos N días"},"interactionTypes":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Interactiontypes","description":"Tipos de interacciones a incluir en el entrenamiento"},"webhookUrl":{"anyOf":[{"type":"string","maxLength":512},{"type":"null"}],"title":"Webhookurl","description":"URL opcional para recibir notificaciones cuando el entrenamiento finalice. Se enviará un POST con el estado del trabajo."}},"type":"object","title":"TrainingRequest","description":"Esquema para la solicitud de entrenamiento"},"TrainingResponse":{"properties":{"message":{"type":"string","title":"Message"},"jobId":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Jobid"},"taskId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Taskid"},"accountId":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Accountid"}},"type":"object","required":["message"],"title":"TrainingResponse","description":"Respuesta para el inicio de entrenamiento"},"TrainingStatus":{"properties":{"map":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Map"},"coverage":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Coverage"},"trainingTime":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Trainingtime"},"dataPoints":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Datapoints"},"customMetrics":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Custommetrics"}},"type":"object","title":"TrainingStatus","description":"Estado del entrenamiento y métricas"},"TrainingUsage":{"properties":{"lastTrainingDate":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Lasttrainingdate","description":"Date of last training"},"frequencyLimit":{"type":"string","title":"Frequencylimit","description":"Training frequency limit","default":"manual"},"nextAvailable":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Nextavailable","description":"Next available training time"},"canTrainNow":{"type":"boolean","title":"Cantrainnow","description":"Whether training is available now","default":true}},"type":"object","title":"TrainingUsage","description":"Training usage information"},"UsageHistoryItemResponse":{"properties":{"date":{"type":"string","format":"date-time","title":"Date","description":"Date of the usage record"},"apiCalls":{"type":"integer","title":"Apicalls","description":"Number of API calls made on this date"},"storage":{"type":"integer","title":"Storage","description":"Storage used in bytes on this date"}},"type":"object","required":["date","apiCalls","storage"],"title":"UsageHistoryItemResponse","description":"Usage history item response schema"},"UsageStats":{"properties":{"apiCallsCount":{"type":"integer","title":"Apicallscount","default":0},"storageUsed":{"type":"integer","title":"Storageused","default":0},"lastReset":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Lastreset"},"updatedAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updatedat"}},"type":"object","title":"UsageStats","description":"Estadísticas de uso de la API"},"UsageSummaryResponse":{"properties":{"subscription":{"$ref":"#/components/schemas/SubscriptionInfo"},"apiCalls":{"$ref":"#/components/schemas/ApiCallsUsage","description":"API calls usage"},"storage":{"$ref":"#/components/schemas/StorageUsage","description":"Storage usage"},"training":{"$ref":"#/components/schemas/TrainingUsage","description":"Training usage"},"planLimits":{"$ref":"#/components/schemas/PlanLimits","description":"Current plan limits"},"allPlans":{"additionalProperties":{"$ref":"#/components/schemas/PlanInfo"},"type":"object","title":"Allplans","description":"All available plans"},"billingPortalUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Billingportalurl","description":"Billing portal URL"}},"type":"object","required":["subscription","apiCalls","storage","training","planLimits"],"title":"UsageSummaryResponse","description":"Complete usage summary response"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"src__db__schemas__usage_summary__PlanInfo":{"type":"object","properties":{"id":{"type":"string","title":"Id","description":"Plan ID"},"limits":{"$ref":"#/components/schemas/PlanLimits"},"features":{"$ref":"#/components/schemas/PlanFeatures"}},"required":["id","limits","features"],"title":"PlanInfo","description":"Plan information (usage summary)"}},"securitySchemes":{"APIKeyHeader":{"type":"apiKey","in":"header","name":"X-API-Key","description":"API Key para autenticación"}}},"security":[{"APIKeyHeader":[]}],"servers":[{"url":"https://api.rayuela.ai","description":"Producción"}]}