openapi: 3.0.3 info: title: 'Alvamex API Documentation' description: 'API REST para aplicación móvil con sincronización offline/online, autenticación Sanctum y gestión de usuarios.' version: 1.0.0 contact: name: 'API Support' email: support@example.com servers: - url: 'http://localhost' description: 'Development Server' tags: - name: Autenticación description: "\nAPIs para registro, login y gestión de autenticación de usuarios" - name: Usuarios description: "\nAPIs para gestión de usuarios y perfiles" - name: Sincronización description: "\nAPIs para sincronización de datos entre la aplicación móvil y el servidor" - name: General description: '' - name: CEDIS description: "\nAPIs para gestionar centros de distribución (CEDIS)" - name: Cuestionarios description: "\nAPIs para gestión de cuestionarios con soporte de sincronización offline" components: securitySchemes: default: type: http scheme: bearer description: 'Para obtener un token, haz POST a /api/auth/login con tus credenciales. El token tiene una duración de 24 horas.' security: - default: [] paths: /api/auth/register: post: summary: 'Registrar nuevo usuario' operationId: registrarNuevoUsuario description: 'Crea una nueva cuenta de usuario con autenticación Sanctum.' parameters: - in: header name: X-Requested-With description: '' example: XMLHttpRequest schema: type: string responses: 201: description: '' content: application/json: schema: type: object example: success: true message: 'Usuario registrado exitosamente' data: user: id: 1 name: 'Juan Pérez' email: juan@example.com status: active token: 1|abcdefghijklmnop offline_token: xyz789 session_id: 1 expires_at: '2024-02-15T10:00:00.000000Z' properties: success: type: boolean example: true message: type: string example: 'Usuario registrado exitosamente' data: type: object properties: user: type: object properties: id: type: integer example: 1 name: type: string example: 'Juan Pérez' email: type: string example: juan@example.com status: type: string example: active token: type: string example: 1|abcdefghijklmnop offline_token: type: string example: xyz789 session_id: type: integer example: 1 expires_at: type: string example: '2024-02-15T10:00:00.000000Z' tags: - Autenticación requestBody: required: true content: application/json: schema: type: object properties: name: type: string description: 'Nombre completo del usuario.' example: 'Juan Pérez' nullable: false email: type: string description: 'Email del usuario.' example: juan@example.com nullable: false password: type: string description: 'Contraseña (mínimo 8 caracteres).' example: Password123! nullable: false password_confirmation: type: string description: 'The value and password must match.' example: consequatur nullable: false phone_number: type: string description: 'Número de teléfono.' example: '+52 555 123 4567' nullable: true device_id: type: string description: 'ID del dispositivo.' example: abc123def456 nullable: true device_name: type: string description: 'Nombre del dispositivo.' example: 'Samsung Galaxy S21' nullable: true device_type: type: string description: 'Tipo de dispositivo.' example: android nullable: true app_version: type: string description: 'Versión de la app.' example: 1.0.0 nullable: true is_offline_capable: type: boolean description: 'Soporte offline.' example: true nullable: false preferences: type: object description: '' example: null nullable: true properties: theme: type: string description: '' example: dark nullable: true enum: - light - dark - auto language: type: string description: 'Must not be greater than 5 characters.' example: bzvrb nullable: true notifications: type: boolean description: '' example: true nullable: false auto_sync: type: boolean description: '' example: true nullable: false sync_frequency: type: string description: '' example: realtime nullable: true enum: - realtime - hourly - daily - manual accept_terms: type: boolean description: 'Must be accepted.' example: true nullable: false accept_privacy: type: boolean description: 'Must be accepted.' example: true nullable: false timezone: type: string description: 'Must not be greater than 50 characters.' example: America/Punta_Arenas nullable: true referral_code: type: string description: 'Must not be greater than 20 characters.' example: znkygloigmkwxphlv nullable: true required: - name - email - password - password_confirmation - accept_terms - accept_privacy security: [] /api/auth/login: post: summary: 'Iniciar sesión' operationId: iniciarSesin description: 'Autentica un usuario y retorna un token de acceso.' parameters: - in: header name: X-Requested-With description: '' example: XMLHttpRequest schema: type: string responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Inicio de sesión exitoso' data: user: id: 1 name: 'Juan Pérez' email: juan@example.com token: 1|abcdefghijklmnop offline_token: xyz789 session_id: 1 expires_at: '2024-02-15T10:00:00.000000Z' properties: success: type: boolean example: true message: type: string example: 'Inicio de sesión exitoso' data: type: object properties: user: type: object properties: id: type: integer example: 1 name: type: string example: 'Juan Pérez' email: type: string example: juan@example.com token: type: string example: 1|abcdefghijklmnop offline_token: type: string example: xyz789 session_id: type: integer example: 1 expires_at: type: string example: '2024-02-15T10:00:00.000000Z' 422: description: '' content: application/json: schema: type: object example: success: false message: 'Credenciales incorrectas' properties: success: type: boolean example: false message: type: string example: 'Credenciales incorrectas' tags: - Autenticación requestBody: required: true content: application/json: schema: type: object properties: email: type: string description: 'Email del usuario.' example: juan@example.com nullable: false password: type: string description: Contraseña. example: Password123! nullable: false device_id: type: string description: 'ID del dispositivo.' example: abc123def456 nullable: true device_name: type: string description: 'Nombre del dispositivo.' example: 'Samsung Galaxy S21' nullable: true device_type: type: string description: 'Tipo de dispositivo.' example: android nullable: true app_version: type: string description: 'Versión de la app.' example: 1.0.0 nullable: true revoke_other_tokens: type: boolean description: 'Revocar otros tokens activos.' example: false nullable: false is_offline_capable: type: boolean description: '' example: false nullable: false remember_me: type: boolean description: '' example: true nullable: false timezone: type: string description: 'Must not be greater than 50 characters.' example: Europe/Moscow nullable: true language: type: string description: 'Must not be greater than 5 characters.' example: rbyic nullable: true required: - email - password security: [] /api/auth/forgot-password: post: summary: "Solicitar recuperación de contraseña\nPOST /api/auth/forgot-password" operationId: solicitarRecuperacinDeContraseaPOSTapiauthforgotPassword description: '' parameters: - in: header name: X-Requested-With description: '' example: XMLHttpRequest schema: type: string responses: { } tags: - Autenticación requestBody: required: true content: application/json: schema: type: object properties: email: type: string description: 'Must be a valid email address. The email of an existing record in the users table. Must not be greater than 255 characters.' example: qkunze@example.com nullable: false device_id: type: string description: 'Must not be greater than 100 characters.' example: opfuudtdsufvyvddqamni nullable: true device_type: type: string description: '' example: android nullable: true enum: - android - ios - web app_version: type: string description: 'Must not be greater than 20 characters.' example: hfqcoynlazghdtqtq nullable: true language: type: string description: 'Must not be greater than 5 characters.' example: xbajw nullable: true timezone: type: string description: 'Must not be greater than 50 characters.' example: Africa/Kampala nullable: true required: - email security: [] /api/auth/reset-password: post: summary: "Resetear contraseña con token\nPOST /api/auth/reset-password" operationId: resetearContraseaConTokenPOSTapiauthresetPassword description: '' parameters: - in: header name: X-Requested-With description: '' example: XMLHttpRequest schema: type: string responses: { } tags: - Autenticación requestBody: required: true content: application/json: schema: type: object properties: email: type: string description: 'Must be a valid email address.' example: qkunze@example.com nullable: false token: type: string description: '' example: consequatur nullable: false password: type: string description: 'Must be at least 8 characters.' example: '[2UZ5ij-e/dl4' nullable: false required: - email - token - password security: [] '/api/auth/verify-email/{token}': get: summary: "Verificar email del usuario\nGET /api/auth/verify-email/{token}" operationId: verificarEmailDelUsuarioGETapiauthverifyEmailtoken description: '' parameters: - in: header name: X-Requested-With description: '' example: XMLHttpRequest schema: type: string responses: 500: description: '' content: application/json: schema: type: object example: message: 'Server Error' properties: message: type: string example: 'Server Error' tags: - Autenticación security: [] parameters: - in: path name: token description: '' example: consequatur required: true schema: type: string /api/auth/profile: get: summary: "Obtener perfil del usuario autenticado\nGET /api/auth/profile" operationId: obtenerPerfilDelUsuarioAutenticadoGETapiauthprofile description: '' parameters: - in: header name: X-Requested-With description: '' example: XMLHttpRequest schema: type: string responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Autenticación security: [] /api/auth/logout: post: summary: 'Cerrar sesión' operationId: cerrarSesin description: 'Cierra la sesión actual y revoca el token de acceso.' parameters: - in: header name: X-Session-ID description: '' example: 'string ID de la sesión activa. Example: 123' schema: type: string - in: header name: X-Requested-With description: '' example: XMLHttpRequest schema: type: string responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Sesión cerrada exitosamente' properties: success: type: boolean example: true message: type: string example: 'Sesión cerrada exitosamente' tags: - Autenticación /api/auth/logout-all: post: summary: "Cerrar todas las sesiones del usuario\nPOST /api/auth/logout-all" operationId: cerrarTodasLasSesionesDelUsuarioPOSTapiauthlogoutAll description: '' parameters: - in: header name: X-Requested-With description: '' example: XMLHttpRequest schema: type: string responses: { } tags: - Autenticación security: [] /api/auth/refresh: post: summary: "Renovar token de autenticación\nPOST /api/auth/refresh" operationId: renovarTokenDeAutenticacinPOSTapiauthrefresh description: '' parameters: - in: header name: X-Requested-With description: '' example: XMLHttpRequest schema: type: string responses: { } tags: - Autenticación security: [] /api/auth/validate-token: get: summary: "Validar y verificar estado del token\nGET /api/auth/validate-token\nPOST /api/auth/validate-token" operationId: validarYVerificarEstadoDelTokenGETapiauthvalidateTokenPOSTapiauthvalidateToken description: '' parameters: - in: header name: X-Requested-With description: '' example: XMLHttpRequest schema: type: string responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Autenticación security: [] /api/auth/check-token: get: summary: "DEPRECATED: Usar validateToken en su lugar\nGET /api/auth/check-token" operationId: dEPRECATEDUsarValidateTokenEnSuLugarGETapiauthcheckToken description: '' parameters: - in: header name: X-Requested-With description: '' example: XMLHttpRequest schema: type: string responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Autenticación security: [] /api/users: get: summary: 'Listar usuarios' operationId: listarUsuarios description: 'Obtiene la lista de usuarios (solo administradores).' parameters: - in: query name: page description: 'Número de página.' example: 1 required: false schema: type: integer description: 'Número de página.' example: 1 nullable: false - in: query name: per_page description: 'Registros por página (max 100).' example: 15 required: false schema: type: integer description: 'Registros por página (max 100).' example: 15 nullable: false - in: query name: search description: 'Búsqueda por nombre o email.' example: juan required: false schema: type: string description: 'Búsqueda por nombre o email.' example: juan nullable: false - in: query name: status description: 'Filtrar por estado (active, inactive, suspended).' example: active required: false schema: type: string description: 'Filtrar por estado (active, inactive, suspended).' example: active nullable: false - in: query name: role description: 'Filtrar por rol (user, admin, moderator).' example: user required: false schema: type: string description: 'Filtrar por rol (user, admin, moderator).' example: user nullable: false - in: query name: sort_by description: 'Ordenar por campo.' example: created_at required: false schema: type: string description: 'Ordenar por campo.' example: created_at nullable: false - in: query name: sort_order description: 'Orden (asc, desc).' example: desc required: false schema: type: string description: 'Orden (asc, desc).' example: desc nullable: false - in: header name: X-Requested-With description: '' example: XMLHttpRequest schema: type: string responses: 200: description: '' content: application/json: schema: type: object example: success: true data: current_page: 1 data: - id: 1 name: 'Juan Pérez' email: juan@example.com status: active role: user total: 50 properties: success: type: boolean example: true data: type: object properties: current_page: type: integer example: 1 data: type: array example: - id: 1 name: 'Juan Pérez' email: juan@example.com status: active role: user items: type: object properties: id: type: integer example: 1 name: type: string example: 'Juan Pérez' email: type: string example: juan@example.com status: type: string example: active role: type: string example: user total: type: integer example: 50 403: description: '' content: application/json: schema: type: object example: success: false message: 'Sin permisos para ver usuarios' properties: success: type: boolean example: false message: type: string example: 'Sin permisos para ver usuarios' tags: - Usuarios requestBody: required: false content: application/json: schema: type: object properties: page: type: integer description: 'Must be at least 1.' example: 73 nullable: false per_page: type: integer description: 'Must be at least 1. Must not be greater than 100.' example: 13 nullable: false search: type: string description: 'Must not be greater than 100 characters.' example: qeopfuudtdsufvyvddqam nullable: false status: type: string description: '' example: suspended nullable: false enum: - active - inactive - suspended role: type: string description: '' example: user nullable: false enum: - user - admin - moderator sort_by: type: string description: '' example: name nullable: false enum: - name - email - created_at - last_login_at sort_order: type: string description: '' example: desc nullable: false enum: - asc - desc '/api/users/{id}': get: summary: "Mostrar usuario específico\nGET /api/users/{id}" operationId: mostrarUsuarioEspecficoGETapiusersid description: '' parameters: - in: header name: X-Requested-With description: '' example: XMLHttpRequest schema: type: string responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Usuarios security: [] put: summary: "Actualizar perfil del usuario\nPUT /api/users/{id}" operationId: actualizarPerfilDelUsuarioPUTapiusersid description: '' parameters: - in: header name: X-Requested-With description: '' example: XMLHttpRequest schema: type: string responses: { } tags: - Usuarios requestBody: required: false content: application/json: schema: type: object properties: name: type: string description: 'Must not be greater than 255 characters.' example: vmqeopfuudtdsufvyvddq nullable: false email: type: string description: 'Must be a valid email address.' example: kunde.eloisa@example.com nullable: false phone_number: type: string description: 'Must not be greater than 20 characters.' example: hfqcoynlazghdtqtq nullable: true password: type: string description: 'Must be at least 8 characters.' example: "(!Cs'YAKYLk4>SJIrIV" nullable: true security: [] delete: summary: "Eliminar usuario (soft delete)\nDELETE /api/users/{id}" operationId: eliminarUsuariosoftDeleteDELETEapiusersid description: '' parameters: - in: header name: X-Requested-With description: '' example: XMLHttpRequest schema: type: string responses: { } tags: - Usuarios security: [] parameters: - in: path name: id description: 'The ID of the user.' example: consequatur required: true schema: type: string '/api/users/{id}/preferences': put: summary: "Actualizar preferencias del usuario\nPUT /api/users/{id}/preferences" operationId: actualizarPreferenciasDelUsuarioPUTapiusersidpreferences description: '' parameters: - in: header name: X-Requested-With description: '' example: XMLHttpRequest schema: type: string responses: { } tags: - Usuarios requestBody: required: true content: application/json: schema: type: object properties: preferences: type: object description: '' example: [] nullable: false properties: { } merge: type: boolean description: '' example: false nullable: false required: - preferences security: [] parameters: - in: path name: id description: 'The ID of the user.' example: consequatur required: true schema: type: string '/api/users/{id}/profile-photo': post: summary: "Subir foto de perfil\nPOST /api/users/{id}/profile-photo" operationId: subirFotoDePerfilPOSTapiusersidprofilePhoto description: '' parameters: - in: header name: X-Requested-With description: '' example: XMLHttpRequest schema: type: string responses: { } tags: - Usuarios requestBody: required: true content: multipart/form-data: schema: type: object properties: photo: type: string format: binary description: 'Must be an image. Must not be greater than 2048 kilobytes.' nullable: false required: - photo security: [] parameters: - in: path name: id description: 'The ID of the user.' example: consequatur required: true schema: type: string '/api/users/{id}/sessions': get: summary: "Obtener sesiones activas del usuario\nGET /api/users/{id}/sessions" operationId: obtenerSesionesActivasDelUsuarioGETapiusersidsessions description: '' parameters: - in: header name: X-Requested-With description: '' example: XMLHttpRequest schema: type: string responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Usuarios security: [] parameters: - in: path name: id description: 'The ID of the user.' example: consequatur required: true schema: type: string '/api/users/{id}/sessions/{sessionId}': delete: summary: "Revocar sesión específica\nDELETE /api/users/{id}/sessions/{sessionId}" operationId: revocarSesinEspecficaDELETEapiusersidsessionssessionId description: '' parameters: - in: header name: X-Requested-With description: '' example: XMLHttpRequest schema: type: string responses: { } tags: - Usuarios security: [] parameters: - in: path name: id description: 'The ID of the user.' example: consequatur required: true schema: type: string - in: path name: sessionId description: '' example: consequatur required: true schema: type: string /api/sync/upload: post: summary: 'Cargar datos desde el cliente' operationId: cargarDatosDesdeElCliente description: 'Recibe datos del cliente Android para sincronizar con el servidor.' parameters: - in: header name: X-Requested-With description: '' example: XMLHttpRequest schema: type: string responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Sincronización completada' data: processed: 5 failed: 0 properties: success: type: boolean example: true message: type: string example: 'Sincronización completada' data: type: object properties: processed: type: integer example: 5 failed: type: integer example: 0 tags: - Sincronización requestBody: required: true content: application/json: schema: type: object properties: sync_items: type: array description: 'Items a sincronizar.' example: - sync_type: CREATE table_name: questionnaires data: { } timestamp: 1234567890 items: type: string device_id: type: string description: 'ID del dispositivo.' example: abc123 nullable: false session_id: type: string description: 'ID de la sesión.' example: xyz789 nullable: true required: - sync_items - device_id /api/sync/download: post: summary: "Enviar actualizaciones al cliente\nPOST /api/sync/download" operationId: enviarActualizacionesAlClientePOSTapisyncdownload description: '' parameters: - in: header name: X-Requested-With description: '' example: XMLHttpRequest schema: type: string responses: { } tags: - Sincronización requestBody: required: true content: application/json: schema: type: object properties: last_sync: type: integer description: 'Must be at least 0.' example: 73 nullable: true device_id: type: string description: 'CAMBIADO: nullable en lugar de required.' example: consequatur nullable: false tables: type: array description: '' example: - notifications items: type: string enum: - users - questionnaires - settings - notifications limit: type: integer description: 'Must be at least 1. Must not be greater than 100.' example: 16 nullable: true required: - device_id security: [] /api/sync/status: get: summary: "Obtener estado de sincronización\nGET /api/sync/status" operationId: obtenerEstadoDeSincronizacinGETapisyncstatus description: '' parameters: - in: header name: X-Requested-With description: '' example: XMLHttpRequest schema: type: string responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Sincronización security: [] /api/sync/queue: post: summary: "Gestionar cola de sincronización\nPOST /api/sync/queue" operationId: gestionarColaDeSincronizacinPOSTapisyncqueue description: '' parameters: - in: header name: X-Requested-With description: '' example: XMLHttpRequest schema: type: string responses: { } tags: - Sincronización requestBody: required: true content: application/json: schema: type: object properties: action: type: string description: '' example: list nullable: false enum: - add - remove - clear - list sync_type: type: string description: 'This field is required when action is add.' example: UPDATE nullable: false enum: - CREATE - UPDATE - DELETE - UPLOAD - DOWNLOAD table_name: type: string description: 'This field is required when action is add.' example: consequatur nullable: false data: type: string description: 'This field is required when action is add.' example: null nullable: false queue_id: type: integer description: 'This field is required when action is remove.' example: 17 nullable: false priority: type: integer description: 'Must be at least 1. Must not be greater than 3.' example: 2 nullable: true object_id: type: integer description: '' example: 17 nullable: true required: - action security: [] /api/sync/bulk: post: summary: "Sincronización masiva (batch)\nPOST /api/sync/bulk" operationId: sincronizacinMasivabatchPOSTapisyncbulk description: '' parameters: - in: header name: X-Requested-With description: '' example: XMLHttpRequest schema: type: string responses: { } tags: - Sincronización requestBody: required: true content: application/json: schema: type: object properties: operations: type: array description: 'Must have at least 1 items. Must not have more than 100 items.' example: - [] items: type: object properties: type: type: string description: '' example: download nullable: false enum: - upload - download data: type: string description: '' example: consequatur nullable: false required: - type - data device_id: type: string description: '' example: consequatur nullable: false required: - operations - device_id security: [] /api/sync/conflict: post: summary: "Resolver conflictos de datos\nPOST /api/sync/conflict" operationId: resolverConflictosDeDatosPOSTapisyncconflict description: '' parameters: - in: header name: X-Requested-With description: '' example: XMLHttpRequest schema: type: string responses: { } tags: - Sincronización requestBody: required: true content: application/json: schema: type: object properties: conflicts: type: array description: 'Must have at least 1 items.' example: - [] items: type: object properties: sync_log_id: type: integer description: '' example: 17 nullable: false resolution: type: string description: '' example: skip nullable: false enum: - client_wins - server_wins - merge - skip merged_data: type: string description: 'This field is required when conflicts.*.resolution is merge.' example: null nullable: false required: - sync_log_id - resolution required: - conflicts security: [] /api/sync/questionnaires/status: get: summary: "Endpoint específico para cuestionarios\nGET /api/sync/questionnaires/status" operationId: endpointEspecficoParaCuestionariosGETapisyncquestionnairesstatus description: '' parameters: - in: header name: X-Requested-With description: '' example: XMLHttpRequest schema: type: string responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Sincronización security: [] '/api/sync/logs/{userId}': get: summary: '' operationId: getApiSyncLogsUserId description: '' parameters: - in: header name: X-Requested-With description: '' example: XMLHttpRequest schema: type: string responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - General security: [] parameters: - in: path name: userId description: '' example: consequatur required: true schema: type: string '/api/sync/clear/{userId}': delete: summary: '' operationId: deleteApiSyncClearUserId description: '' parameters: - in: header name: X-Requested-With description: '' example: XMLHttpRequest schema: type: string responses: { } tags: - General security: [] parameters: - in: path name: userId description: '' example: consequatur required: true schema: type: string '/api/sync/questionnaires/debug/{userId}': get: summary: '' operationId: getApiSyncQuestionnairesDebugUserId description: '' parameters: - in: header name: X-Requested-With description: '' example: XMLHttpRequest schema: type: string responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - General security: [] parameters: - in: path name: userId description: '' example: consequatur required: true schema: type: string /api/questionnaires/android/list: get: summary: '' operationId: getApiQuestionnairesAndroidList description: '' parameters: - in: header name: X-Requested-With description: '' example: XMLHttpRequest schema: type: string responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - General security: [] /api/questionnaires/android/unsynced: get: summary: '' operationId: getApiQuestionnairesAndroidUnsynced description: '' parameters: - in: header name: X-Requested-With description: '' example: XMLHttpRequest schema: type: string responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - General security: [] /api/me: get: summary: '' operationId: getApiMe description: '' parameters: - in: header name: X-Requested-With description: '' example: XMLHttpRequest schema: type: string responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - General security: [] put: summary: '' operationId: putApiMe description: '' parameters: - in: header name: X-Requested-With description: '' example: XMLHttpRequest schema: type: string responses: { } tags: - General security: [] /api/me/preferences: put: summary: '' operationId: putApiMePreferences description: '' parameters: - in: header name: X-Requested-With description: '' example: XMLHttpRequest schema: type: string responses: { } tags: - General security: [] /api/me/profile-photo: post: summary: '' operationId: postApiMeProfilePhoto description: '' parameters: - in: header name: X-Requested-With description: '' example: XMLHttpRequest schema: type: string responses: { } tags: - General security: [] /api/me/sessions: get: summary: '' operationId: getApiMeSessions description: '' parameters: - in: header name: X-Requested-With description: '' example: XMLHttpRequest schema: type: string responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - General security: [] /api/me/stats: get: summary: '' operationId: getApiMeStats description: '' parameters: - in: header name: X-Requested-With description: '' example: XMLHttpRequest schema: type: string responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - General security: [] /api/me/questionnaires: get: summary: '' operationId: getApiMeQuestionnaires description: '' parameters: - in: header name: X-Requested-With description: '' example: XMLHttpRequest schema: type: string responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - General security: [] /api/me/questionnaires/stats: get: summary: '' operationId: getApiMeQuestionnairesStats description: '' parameters: - in: header name: X-Requested-With description: '' example: XMLHttpRequest schema: type: string responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - General security: [] /api/me/questionnaires/recent: get: summary: '' operationId: getApiMeQuestionnairesRecent description: '' parameters: - in: header name: X-Requested-With description: '' example: XMLHttpRequest schema: type: string responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - General security: [] /api/me/questionnaires/pending-sync: get: summary: '' operationId: getApiMeQuestionnairesPendingSync description: '' parameters: - in: header name: X-Requested-With description: '' example: XMLHttpRequest schema: type: string responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - General security: [] /api/admin/stats: get: summary: '' operationId: getApiAdminStats description: '' parameters: - in: header name: X-Requested-With description: '' example: XMLHttpRequest schema: type: string responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - General security: [] /api/admin/questionnaires/stats: get: summary: '' operationId: getApiAdminQuestionnairesStats description: '' parameters: - in: header name: X-Requested-With description: '' example: XMLHttpRequest schema: type: string responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - General security: [] /api/admin/cleanup: post: summary: '' operationId: postApiAdminCleanup description: '' parameters: - in: header name: X-Requested-With description: '' example: XMLHttpRequest schema: type: string responses: { } tags: - General security: [] /api/admin/users/bulk-action: post: summary: '' operationId: postApiAdminUsersBulkAction description: '' parameters: - in: header name: X-Requested-With description: '' example: XMLHttpRequest schema: type: string responses: { } tags: - General security: [] /api/notifications: get: summary: '' operationId: getApiNotifications description: '' parameters: - in: header name: X-Requested-With description: '' example: XMLHttpRequest schema: type: string responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - General security: [] '/api/notifications/mark-read/{id}': post: summary: '' operationId: postApiNotificationsMarkReadId description: '' parameters: - in: header name: X-Requested-With description: '' example: XMLHttpRequest schema: type: string responses: { } tags: - General security: [] parameters: - in: path name: id description: 'The ID of the mark read.' example: consequatur required: true schema: type: string /api/config: get: summary: '' operationId: getApiConfig description: '' parameters: - in: header name: X-Requested-With description: '' example: XMLHttpRequest schema: type: string responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - General security: [] /api/config/questionnaires: get: summary: '' operationId: getApiConfigQuestionnaires description: '' parameters: - in: header name: X-Requested-With description: '' example: XMLHttpRequest schema: type: string responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - General security: [] '/api/{fallbackPlaceholder}': get: summary: '' operationId: getApiFallbackPlaceholder description: '' parameters: - in: header name: X-Requested-With description: '' example: XMLHttpRequest schema: type: string responses: 404: description: '' content: application/json: schema: type: object example: success: false message: 'Endpoint no encontrado' error_code: NOT_FOUND available_endpoints: auth: '/api/auth/{login,register,logout}' users: /api/users sync: '/api/sync/{upload,download,status}' questionnaires: /api/questionnaires me: /api/me admin: /api/admin questionnaire_endpoints: list: 'GET /api/questionnaires' create: 'POST /api/questionnaires' show: 'GET /api/questionnaires/{id}' update: 'PUT /api/questionnaires/{id}' delete: 'DELETE /api/questionnaires/{id}' stats: 'GET /api/questionnaires/stats/summary' search: 'GET /api/questionnaires/search/query' export: 'GET /api/questionnaires/export/data' properties: success: type: boolean example: false message: type: string example: 'Endpoint no encontrado' error_code: type: string example: NOT_FOUND available_endpoints: type: object properties: auth: type: string example: '/api/auth/{login,register,logout}' users: type: string example: /api/users sync: type: string example: '/api/sync/{upload,download,status}' questionnaires: type: string example: /api/questionnaires me: type: string example: /api/me admin: type: string example: /api/admin questionnaire_endpoints: type: object properties: list: type: string example: 'GET /api/questionnaires' create: type: string example: 'POST /api/questionnaires' show: type: string example: 'GET /api/questionnaires/{id}' update: type: string example: 'PUT /api/questionnaires/{id}' delete: type: string example: 'DELETE /api/questionnaires/{id}' stats: type: string example: 'GET /api/questionnaires/stats/summary' search: type: string example: 'GET /api/questionnaires/search/query' export: type: string example: 'GET /api/questionnaires/export/data' tags: - General security: [] parameters: - in: path name: fallbackPlaceholder description: '' example: 2UZ5i required: true schema: type: string /api/cedis/active: get: summary: 'Obtener CEDIS activos' operationId: obtenerCEDISActivos description: 'Retorna únicamente los CEDIS que están marcados como activos, ordenados alfabéticamente por nombre.' parameters: - in: header name: X-Requested-With description: '' example: XMLHttpRequest schema: type: string responses: 200: description: '' content: application/json: schema: type: object example: success: true data: - id: 1 nombre: 'CEDIS Ciudad de México' codigo: CDMX-001 activo: true created_at: '2024-01-15T10:00:00.000000Z' updated_at: '2024-01-15T10:00:00.000000Z' - id: 2 nombre: 'CEDIS Guadalajara' codigo: GDL-001 activo: true created_at: '2024-01-15T10:00:00.000000Z' updated_at: '2024-01-15T10:00:00.000000Z' total: 2 properties: success: type: boolean example: true data: type: array example: - id: 1 nombre: 'CEDIS Ciudad de México' codigo: CDMX-001 activo: true created_at: '2024-01-15T10:00:00.000000Z' updated_at: '2024-01-15T10:00:00.000000Z' - id: 2 nombre: 'CEDIS Guadalajara' codigo: GDL-001 activo: true created_at: '2024-01-15T10:00:00.000000Z' updated_at: '2024-01-15T10:00:00.000000Z' items: type: object properties: id: type: integer example: 1 nombre: type: string example: 'CEDIS Ciudad de México' codigo: type: string example: CDMX-001 activo: type: boolean example: true created_at: type: string example: '2024-01-15T10:00:00.000000Z' updated_at: type: string example: '2024-01-15T10:00:00.000000Z' total: type: integer example: 2 500: description: '' content: application/json: schema: type: object example: success: false message: 'Error al obtener los CEDIS activos' error: 'Database connection failed' properties: success: type: boolean example: false message: type: string example: 'Error al obtener los CEDIS activos' error: type: string example: 'Database connection failed' tags: - CEDIS security: [] /api/cedis: get: summary: 'Listar todos los CEDIS' operationId: listarTodosLosCEDIS description: 'Obtiene la lista completa de CEDIS con opciones de filtrado.' parameters: - in: query name: activo description: 'Filtrar por estado activo/inactivo.' example: true required: false schema: type: boolean description: 'Filtrar por estado activo/inactivo.' example: true nullable: false - in: query name: search description: 'Buscar por nombre o código.' example: CDMX required: false schema: type: string description: 'Buscar por nombre o código.' example: CDMX nullable: false - in: header name: X-Requested-With description: '' example: XMLHttpRequest schema: type: string responses: 200: description: '' content: application/json: schema: type: object example: success: true data: - id: 1 nombre: 'CEDIS Ciudad de México' codigo: CDMX-001 activo: true created_at: '2024-01-15T10:00:00.000000Z' updated_at: '2024-01-15T10:00:00.000000Z' total: 1 properties: success: type: boolean example: true data: type: array example: - id: 1 nombre: 'CEDIS Ciudad de México' codigo: CDMX-001 activo: true created_at: '2024-01-15T10:00:00.000000Z' updated_at: '2024-01-15T10:00:00.000000Z' items: type: object properties: id: type: integer example: 1 nombre: type: string example: 'CEDIS Ciudad de México' codigo: type: string example: CDMX-001 activo: type: boolean example: true created_at: type: string example: '2024-01-15T10:00:00.000000Z' updated_at: type: string example: '2024-01-15T10:00:00.000000Z' total: type: integer example: 1 422: description: '' content: application/json: schema: type: object example: success: false message: 'Parámetros inválidos' errors: activo: - 'El campo activo debe ser verdadero o falso' properties: success: type: boolean example: false message: type: string example: 'Parámetros inválidos' errors: type: object properties: activo: type: array example: - 'El campo activo debe ser verdadero o falso' items: type: string tags: - CEDIS security: [] '/api/cedis/{id}': get: summary: 'Obtener un CEDIS específico' operationId: obtenerUnCEDISEspecfico description: 'Recupera la información detallada de un CEDIS por su ID.' parameters: - in: header name: X-Requested-With description: '' example: XMLHttpRequest schema: type: string responses: 200: description: '' content: application/json: schema: type: object example: success: true data: id: 1 nombre: 'CEDIS Ciudad de México' codigo: CDMX-001 activo: true created_at: '2024-01-15T10:00:00.000000Z' updated_at: '2024-01-15T10:00:00.000000Z' properties: success: type: boolean example: true data: type: object properties: id: type: integer example: 1 nombre: type: string example: 'CEDIS Ciudad de México' codigo: type: string example: CDMX-001 activo: type: boolean example: true created_at: type: string example: '2024-01-15T10:00:00.000000Z' updated_at: type: string example: '2024-01-15T10:00:00.000000Z' 404: description: '' content: application/json: schema: type: object example: success: false message: 'CEDIS no encontrado' properties: success: type: boolean example: false message: type: string example: 'CEDIS no encontrado' tags: - CEDIS security: [] parameters: - in: path name: id description: 'ID del CEDIS.' example: 1 required: true schema: type: integer /api/questionnaires: get: summary: 'Listar cuestionarios' operationId: listarCuestionarios description: 'Obtiene la lista de cuestionarios del usuario con filtros y paginación.' parameters: - in: query name: page description: 'Número de página.' example: 1 required: false schema: type: integer description: 'Número de página.' example: 1 nullable: false - in: query name: per_page description: 'Registros por página (max 100).' example: 20 required: false schema: type: integer description: 'Registros por página (max 100).' example: 20 nullable: false - in: query name: folio description: 'Filtrar por folio.' example: F-001 required: false schema: type: string description: 'Filtrar por folio.' example: F-001 nullable: false - in: query name: cedis description: 'Filtrar por CEDIS.' example: CDMX required: false schema: type: string description: 'Filtrar por CEDIS.' example: CDMX nullable: false - in: query name: cuadrilla description: 'Filtrar por cuadrilla.' example: A required: false schema: type: string description: 'Filtrar por cuadrilla.' example: A nullable: false - in: query name: sync_status description: 'Estado de sincronización (synced, unsynced, error).' example: synced required: false schema: type: string description: 'Estado de sincronización (synced, unsynced, error).' example: synced nullable: false - in: query name: date_from description: 'date Fecha desde.' example: '2024-01-01' required: false schema: type: string description: 'date Fecha desde.' example: '2024-01-01' nullable: false - in: query name: date_to description: 'date Fecha hasta.' example: '2024-01-31' required: false schema: type: string description: 'date Fecha hasta.' example: '2024-01-31' nullable: false - in: query name: sort_by description: 'Ordenar por (created_at, questionnaire_timestamp, folio).' example: created_at required: false schema: type: string description: 'Ordenar por (created_at, questionnaire_timestamp, folio).' example: created_at nullable: false - in: query name: sort_order description: 'Orden (asc, desc).' example: desc required: false schema: type: string description: 'Orden (asc, desc).' example: desc nullable: false - in: header name: X-Requested-With description: '' example: XMLHttpRequest schema: type: string responses: 200: description: '' content: application/json: schema: type: object example: success: true data: questionnaires: - id: 1 folio: F-001 cedis: CDMX sync_status: synced total: 100 page: 1 per_page: 20 properties: success: type: boolean example: true data: type: object properties: questionnaires: type: array example: - id: 1 folio: F-001 cedis: CDMX sync_status: synced items: type: object properties: id: type: integer example: 1 folio: type: string example: F-001 cedis: type: string example: CDMX sync_status: type: string example: synced total: type: integer example: 100 page: type: integer example: 1 per_page: type: integer example: 20 tags: - Cuestionarios post: summary: "Crear nuevo cuestionario\nPOST /api/questionnaires" operationId: crearNuevoCuestionarioPOSTapiquestionnaires description: '' parameters: - in: header name: X-Requested-With description: '' example: XMLHttpRequest schema: type: string responses: { } tags: - Cuestionarios security: [] '/api/questionnaires/{id}': get: summary: "Mostrar cuestionario específico\nGET /api/questionnaires/{questionnaire}" operationId: mostrarCuestionarioEspecficoGETapiquestionnairesquestionnaire description: '' parameters: - in: header name: X-Requested-With description: '' example: XMLHttpRequest schema: type: string responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Cuestionarios security: [] put: summary: "Actualizar cuestionario\nPUT/PATCH /api/questionnaires/{questionnaire}" operationId: actualizarCuestionarioPUTPATCHapiquestionnairesquestionnaire description: '' parameters: - in: header name: X-Requested-With description: '' example: XMLHttpRequest schema: type: string responses: { } tags: - Cuestionarios security: [] delete: summary: "Eliminar cuestionario\nDELETE /api/questionnaires/{questionnaire}" operationId: eliminarCuestionarioDELETEapiquestionnairesquestionnaire description: '' parameters: - in: header name: X-Requested-With description: '' example: XMLHttpRequest schema: type: string responses: { } tags: - Cuestionarios security: [] parameters: - in: path name: id description: 'The ID of the questionnaire.' example: 33 required: true schema: type: integer '/api/questionnaires/{questionnaire_id}': patch: summary: "Actualizar cuestionario\nPUT/PATCH /api/questionnaires/{questionnaire}" operationId: actualizarCuestionarioPUTPATCHapiquestionnairesquestionnaire description: '' parameters: - in: header name: X-Requested-With description: '' example: XMLHttpRequest schema: type: string responses: { } tags: - Cuestionarios security: [] parameters: - in: path name: questionnaire_id description: 'The ID of the questionnaire.' example: 33 required: true schema: type: integer /api/questionnaires/stats/summary: get: summary: "Obtener estadísticas de cuestionarios\nGET /api/questionnaires/stats" operationId: obtenerEstadsticasDeCuestionariosGETapiquestionnairesstats description: '' parameters: - in: header name: X-Requested-With description: '' example: XMLHttpRequest schema: type: string responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Cuestionarios security: [] /api/questionnaires/search/query: get: summary: "Buscar cuestionarios\nGET /api/questionnaires/search" operationId: buscarCuestionariosGETapiquestionnairessearch description: '' parameters: - in: header name: X-Requested-With description: '' example: XMLHttpRequest schema: type: string responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Cuestionarios security: [] /api/questionnaires/export/data: get: summary: "Exportar cuestionarios\nGET /api/questionnaires/export" operationId: exportarCuestionariosGETapiquestionnairesexport description: '' parameters: - in: header name: X-Requested-With description: '' example: XMLHttpRequest schema: type: string responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Cuestionarios security: [] /api/questionnaires/duplicates/list: get: summary: "Obtener cuestionarios duplicados por folio\nGET /api/questionnaires/duplicates" operationId: obtenerCuestionariosDuplicadosPorFolioGETapiquestionnairesduplicates description: '' parameters: - in: header name: X-Requested-With description: '' example: XMLHttpRequest schema: type: string responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Cuestionarios security: [] /api/questionnaires/validate/check: post: summary: 'Validate the given request with the given rules.' operationId: validateTheGivenRequestWithTheGivenRules description: '' parameters: - in: header name: X-Requested-With description: '' example: XMLHttpRequest schema: type: string responses: { } tags: - Cuestionarios security: [] /api/questionnaires/bulk/mark-synced: post: summary: "Marcar cuestionarios como sincronizados\nPOST /api/questionnaires/mark-synced" operationId: marcarCuestionariosComoSincronizadosPOSTapiquestionnairesmarkSynced description: '' parameters: - in: header name: X-Requested-With description: '' example: XMLHttpRequest schema: type: string responses: { } tags: - Cuestionarios security: [] '/api/questionnaires/verify/{folio}': get: summary: "Verificar existencia y estado de sincronización de un cuestionario por folio y cedis\nGET /api/questionnaires/verify/{folio}?cedis=CDMX" operationId: verificarExistenciaYEstadoDeSincronizacinDeUnCuestionarioPorFolioYCedisGETapiquestionnairesverifyfoliocedisCDMX description: '' parameters: - in: header name: X-Requested-With description: '' example: XMLHttpRequest schema: type: string responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Cuestionarios security: [] parameters: - in: path name: folio description: '' example: consequatur required: true schema: type: string '/api/questionnaires/{questionnaire_id}/reset-sync': post: summary: "Resetear estado de sincronización\nPOST /api/questionnaires/{questionnaire}/reset-sync" operationId: resetearEstadoDeSincronizacinPOSTapiquestionnairesquestionnaireresetSync description: '' parameters: - in: header name: X-Requested-With description: '' example: XMLHttpRequest schema: type: string responses: { } tags: - Cuestionarios security: [] parameters: - in: path name: questionnaire_id description: 'The ID of the questionnaire.' example: 33 required: true schema: type: integer