{
	"openapi": "3.0.3",
	"info": {
		"title": "Chismógrafo API REST 📓",
		"description": "API REST y widgets incrustables del Chismógrafo para auditar plataformas de e-commerce, pasarelas de pago, aplicaciones y plugins instalados, infraestructura, píxeles de seguimiento, geolocalización de servidores y velocidad Lighthouse móvil en cualquier sitio web... ¡Todo sin que se enteren! 🤫",
		"version": "1.14.0",
		"contact": {
			"name": "Equipo Rífatela",
			"url": "https://rifatela.lol"
		}
	},
	"servers": [
		{
			"url": "http://localhost:3000",
			"description": "Servidor local de desarrollo"
		},
		{
			"url": "https://chismografo.rifatela.lol",
			"description": "Servidor de producción en la nube"
		}
	],
	"paths": {
		"/api/detect": {
			"post": {
				"summary": "Sacarle el chisme completo a un sitio (POST) 🕵️",
				"description": "Envía una URL en el cuerpo JSON para analizar estructura DOM, CMS/tecnología, apps instaladas, pasarelas de pago, píxeles, infraestructura, geolocalización y capturas de pantalla.",
				"tags": [
					"Detección"
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/DetectRequest"
							}
						}
					}
				},
				"responses": {
					"200": {
						"description": "Expediente chismoso completado exitosamente",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/DetectResponse"
								}
							}
						}
					},
					"400": {
						"description": "URL faltante o formato inválido",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ErrorResponse"
								}
							}
						}
					},
					"403": {
						"description": "Denegado por restricciones de CORS",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ErrorResponse"
								}
							}
						}
					},
					"422": {
						"description": "Error al conectar con el sitio objetivo",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/DetectResponse"
								}
							}
						}
					}
				}
			},
			"get": {
				"summary": "Sacarle el chisme completo a un sitio (GET) 🕵️",
				"description": "Envía una URL como parámetro query para analizar firmas de e-commerce, apps, pasarelas, píxeles y geolocalizar el servidor.",
				"tags": [
					"Detección"
				],
				"parameters": [
					{
						"name": "url",
						"in": "query",
						"required": true,
						"description": "La URL del sitio web a auditar",
						"schema": {
							"type": "string",
							"format": "uri",
							"example": "https://tienda-ejemplo.com"
						}
					}
				],
				"responses": {
					"200": {
						"description": "Expediente chismoso completado exitosamente",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/DetectResponse"
								}
							}
						}
					},
					"400": {
						"description": "URL faltante o formato inválido",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ErrorResponse"
								}
							}
						}
					},
					"422": {
						"description": "Error al conectar con el sitio objetivo"
					}
				}
			}
		},
		"/api/rules/test": {
			"post": {
				"summary": "Probar lote de reglas dinámicas 🧪",
				"description": "Evalúa un lote de reglas de detección (detectionRules) personalizadas contra una URL o código HTML en vivo.",
				"tags": [
					"Reglas"
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/RulesTestRequest"
							}
						}
					}
				},
				"responses": {
					"200": {
						"description": "Resultados de evaluación de las reglas",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/RulesTestResponse"
								}
							}
						}
					},
					"400": {
						"description": "Petición inválida: Se requiere URL o HTML y al menos una regla",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ErrorResponse"
								}
							}
						}
					}
				}
			}
		},
		"/api/cms": {
			"get": {
				"summary": "Detectar plataforma de CMS / E-commerce 🛍️",
				"description": "Obtiene la plataforma CMS (Shopify, WooCommerce, Magento, etc.), nivel de confianza y tema activo.",
				"tags": [
					"Componentes Modulares"
				],
				"parameters": [
					{
						"$ref": "#/components/parameters/UrlQueryParam"
					}
				],
				"responses": {
					"200": {
						"description": "Plataforma detectada exitosamente",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/CmsResponse"
								}
							}
						}
					}
				}
			},
			"post": {
				"summary": "Detectar plataforma de CMS / E-commerce (POST) 🛍️",
				"tags": [
					"Componentes Modulares"
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/DetectRequest"
							}
						}
					}
				},
				"responses": {
					"200": {
						"description": "Plataforma detectada exitosamente",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/CmsResponse"
								}
							}
						}
					}
				}
			}
		},
		"/api/apps": {
			"get": {
				"summary": "Detectar apps y plugins instalados 🔌",
				"description": "Lista todas las aplicaciones, extensiones y plugins detectados en el sitio web.",
				"tags": [
					"Componentes Modulares"
				],
				"parameters": [
					{
						"$ref": "#/components/parameters/UrlQueryParam"
					}
				],
				"responses": {
					"200": {
						"description": "Apps y plugins detectados",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/AppsResponse"
								}
							}
						}
					}
				}
			},
			"post": {
				"summary": "Detectar apps y plugins instalados (POST) 🔌",
				"tags": [
					"Componentes Modulares"
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/DetectRequest"
							}
						}
					}
				},
				"responses": {
					"200": {
						"description": "Apps y plugins detectados",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/AppsResponse"
								}
							}
						}
					}
				}
			}
		},
		"/api/infra": {
			"get": {
				"summary": "Obtener pila de infraestructura y CDN 🌐",
				"description": "Retorna los componentes de infraestructura (CDN, Proxy, Servidor Web, Seguridad) detectados.",
				"tags": [
					"Componentes Modulares"
				],
				"parameters": [
					{
						"$ref": "#/components/parameters/UrlQueryParam"
					}
				],
				"responses": {
					"200": {
						"description": "Infraestructura analizada y listada",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/InfraResponse"
								}
							}
						}
					}
				}
			},
			"post": {
				"summary": "Obtener pila de infraestructura y CDN (POST) 🌐",
				"tags": [
					"Componentes Modulares"
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/DetectRequest"
							}
						}
					}
				},
				"responses": {
					"200": {
						"description": "Infraestructura analizada y listada",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/InfraResponse"
								}
							}
						}
					}
				}
			}
		},
		"/api/payment-processors": {
			"get": {
				"summary": "Detectar procesadores de pago y pasarelas 💳",
				"description": "Obtiene la lista de pasarelas de pago encontradas (Stripe, PayPal, Mercado Pago, Conekta, etc.).",
				"tags": [
					"Componentes Modulares"
				],
				"parameters": [
					{
						"$ref": "#/components/parameters/UrlQueryParam"
					}
				],
				"responses": {
					"200": {
						"description": "Pasarelas detectadas exitosamente",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/PaymentGatewaysResponse"
								}
							}
						}
					}
				}
			},
			"post": {
				"summary": "Detectar procesadores de pago y pasarelas (POST) 💳",
				"tags": [
					"Componentes Modulares"
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/DetectRequest"
							}
						}
					}
				},
				"responses": {
					"200": {
						"description": "Pasarelas detectadas exitosamente",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/PaymentGatewaysResponse"
								}
							}
						}
					}
				}
			}
		},
		"/api/location": {
			"get": {
				"summary": "Geolocalización del servidor y DNS 📍",
				"description": "Resuelve la IP del servidor de la tienda y su ubicación física aproximada (país, ciudad, coordenadas).",
				"tags": [
					"Componentes Modulares"
				],
				"parameters": [
					{
						"$ref": "#/components/parameters/UrlQueryParam"
					}
				],
				"responses": {
					"200": {
						"description": "Ubicación del servidor obtenida",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/LocationResponse"
								}
							}
						}
					}
				}
			},
			"post": {
				"summary": "Geolocalización del servidor y DNS (POST) 📍",
				"tags": [
					"Componentes Modulares"
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/DetectRequest"
							}
						}
					}
				},
				"responses": {
					"200": {
						"description": "Ubicación del servidor obtenida",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/LocationResponse"
								}
							}
						}
					}
				}
			}
		},
		"/api/latency": {
			"get": {
				"summary": "Medir latencia desde México ⏱️",
				"description": "Calcula el tiempo de respuesta estimado en milisegundos hacia el servidor del sitio.",
				"tags": [
					"Componentes Modulares"
				],
				"parameters": [
					{
						"$ref": "#/components/parameters/UrlQueryParam"
					}
				],
				"responses": {
					"200": {
						"description": "Latencia calculada",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/LatencyResponse"
								}
							}
						}
					}
				}
			},
			"post": {
				"summary": "Medir latencia desde México (POST) ⏱️",
				"tags": [
					"Componentes Modulares"
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/DetectRequest"
							}
						}
					}
				},
				"responses": {
					"200": {
						"description": "Latencia calculada",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/LatencyResponse"
								}
							}
						}
					}
				}
			}
		},
		"/api/pagespeed": {
			"get": {
				"summary": "Auditoría de velocidad Google PageSpeed ⚡",
				"description": "Consulta métricas de rendimiento, accesibilidad y SEO móvil usando Google Lighthouse.",
				"tags": [
					"PageSpeed"
				],
				"parameters": [
					{
						"$ref": "#/components/parameters/UrlQueryParam"
					}
				],
				"responses": {
					"200": {
						"description": "Métricas Lighthouse",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/PageSpeedResponse"
								}
							}
						}
					}
				}
			},
			"post": {
				"summary": "Auditoría de velocidad Google PageSpeed (POST) ⚡",
				"description": "Consulta métricas de rendimiento, accesibilidad y SEO móvil usando Google Lighthouse.",
				"tags": [
					"PageSpeed"
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/DetectRequest"
							}
						}
					}
				},
				"responses": {
					"200": {
						"description": "Métricas Lighthouse",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/PageSpeedResponse"
								}
							}
						}
					}
				}
			}
		},
		"/api/screenshot": {
			"get": {
				"summary": "Generar captura de pantalla de la tienda 📸",
				"description": "Genera una captura visual en formato desktop o móvil de la página de inicio.",
				"tags": [
					"Capturas"
				],
				"parameters": [
					{
						"$ref": "#/components/parameters/UrlQueryParam"
					},
					{
						"name": "device",
						"in": "query",
						"required": false,
						"description": "Dispositivo para la captura ('desktop' o 'mobile')",
						"schema": {
							"type": "string",
							"enum": [
								"desktop",
								"mobile"
							],
							"default": "desktop"
						}
					}
				],
				"responses": {
					"200": {
						"description": "URL o base64 de la captura generada",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ScreenshotResponse"
								}
							}
						}
					}
				}
			},
			"post": {
				"summary": "Generar captura de pantalla de la tienda (POST) 📸",
				"tags": [
					"Capturas"
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"type": "object",
								"required": [
									"url"
								],
								"properties": {
									"url": {
										"type": "string",
										"format": "uri"
									},
									"device": {
										"type": "string",
										"enum": [
											"desktop",
											"mobile"
										],
										"default": "desktop"
									}
								}
							}
						}
					}
				},
				"responses": {
					"200": {
						"description": "Captura generada exitosamente",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ScreenshotResponse"
								}
							}
						}
					}
				}
			}
		},
		"/api/report": {
			"post": {
				"summary": "Enviar reporte chismoso por correo ✉️",
				"description": "Envía un correo electrónico con el expediente visual completo generado por el Chismógrafo a través del servicio Brevo.",
				"tags": [
					"Reportes"
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/EmailReportRequest"
							}
						}
					}
				},
				"responses": {
					"200": {
						"description": "Reporte enviado exitosamente",
						"content": {
							"application/json": {
								"schema": {
									"type": "object",
									"properties": {
										"success": {
											"type": "boolean",
											"example": true
										},
										"message": {
											"type": "string",
											"example": "¡Reporte enviado exitosamente! Revisa tu bandeja de entrada."
										}
									}
								}
							}
						}
					},
					"400": {
						"description": "Correo inválido o datos incompletos",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ErrorResponse"
								}
							}
						}
					}
				}
			}
		},
		"/api/techs": {
			"get": {
				"summary": "Obtener catálogo de firmas y tecnologías soportadas 📚",
				"description": "Retorna el listado completo de CMS, aplicaciones, infraestructuras, pasarelas y píxeles compilados en el motor.",
				"tags": [
					"Catálogo"
				],
				"responses": {
					"200": {
						"description": "Catálogo completo de tecnologías",
						"content": {
							"application/json": {
								"schema": {
									"type": "object",
									"properties": {
										"cms": {
											"type": "array",
											"items": {
												"type": "object"
											}
										},
										"apps": {
											"type": "array",
											"items": {
												"type": "object"
											}
										},
										"infra": {
											"type": "array",
											"items": {
												"type": "object"
											}
										},
										"gateways": {
											"type": "array",
											"items": {
												"type": "object"
											}
										},
										"pixels": {
											"type": "array",
											"items": {
												"type": "object"
											}
										}
									}
								}
							}
						}
					}
				}
			}
		},
		"/api/config": {
			"get": {
				"summary": "Obtener configuración pública del cliente ⚙️",
				"description": "Retorna tokens públicos configurados en el servidor para logos y mapas.",
				"tags": [
					"Configuración"
				],
				"responses": {
					"200": {
						"description": "Configuración pública del cliente",
						"content": {
							"application/json": {
								"schema": {
									"type": "object",
									"properties": {
										"logoDevToken": {
											"type": "string"
										},
										"maptilerKey": {
											"type": "string"
										}
									}
								}
							}
						}
					}
				}
			}
		},
		"/widget": {
			"get": {
				"summary": "Calcomanía/Sticker de verificación e-commerce 🏷️",
				"description": "Servicio que genera un badge HTML responsivo diseñado en forma de sticker amarillo/post-it que resume el CMS detectado del sitio solicitado.",
				"tags": [
					"Widgets"
				],
				"parameters": [
					{
						"$ref": "#/components/parameters/UrlQueryParam"
					}
				],
				"responses": {
					"200": {
						"description": "Documento HTML con el sticker de verificación e-commerce",
						"content": {
							"text/html": {
								"schema": {
									"type": "string"
								}
							}
						}
					}
				}
			}
		},
		"/search-widget": {
			"get": {
				"summary": "Buscador de chismes compacto (Widget) 🔎",
				"description": "Página HTML responsiva autocontenida que integra el formulario de búsqueda, barra de carga y panel de resultados simplificado diseñado estilo cuaderno Y2K.",
				"tags": [
					"Widgets"
				],
				"responses": {
					"200": {
						"description": "Documento HTML del buscador incrustable",
						"content": {
							"text/html": {
								"schema": {
									"type": "string"
								}
							}
						}
					}
				}
			}
		},
		"/api/screenshots": {
			"get": {
				"summary": "Obtener screenshots (móvil, escritorio o ambas) 📸",
				"description": "Obtiene las capturas de pantalla de un sitio web. Si se especifica `device=mobile` o `device=desktop`, devuelve esa captura; si se omite, devuelve ambas.",
				"tags": [
					"Capturas de Pantalla"
				],
				"parameters": [
					{
						"$ref": "#/components/parameters/UrlQueryParam"
					},
					{
						"$ref": "#/components/parameters/DeviceQueryParam"
					}
				],
				"responses": {
					"200": {
						"description": "Capturas obtenidas exitosamente",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ScreenshotsFullResponse"
								}
							}
						}
					},
					"400": {
						"description": "Parámetro URL faltante o inválido",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ErrorResponse"
								}
							}
						}
					}
				}
			},
			"post": {
				"summary": "Crear screenshots para un dominio 📸",
				"description": "Genera y almacena capturas de pantalla de la URL especificada (móvil, escritorio o ambas).",
				"tags": [
					"Capturas de Pantalla"
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"type": "object",
								"required": [
									"url"
								],
								"properties": {
									"url": {
										"type": "string",
										"format": "uri",
										"example": "https://shopify.com"
									},
									"device": {
										"type": "string",
										"enum": [
											"desktop",
											"mobile"
										],
										"example": "desktop"
									}
								}
							}
						}
					}
				},
				"responses": {
					"200": {
						"description": "Captura creada exitosamente",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ScreenshotsFullResponse"
								}
							}
						}
					}
				}
			},
			"put": {
				"summary": "Actualizar screenshots existentes 🔄",
				"description": "Fuerza la regeneración y reemplazo de las capturas de pantalla existentes para el dominio indicado.",
				"tags": [
					"Capturas de Pantalla"
				],
				"parameters": [
					{
						"$ref": "#/components/parameters/UrlQueryParam"
					},
					{
						"$ref": "#/components/parameters/DeviceQueryParam"
					}
				],
				"responses": {
					"200": {
						"description": "Capturas actualizadas y reemplazadas exitosamente",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ScreenshotsFullResponse"
								}
							}
						}
					}
				}
			},
			"delete": {
				"summary": "Eliminar screenshots de un dominio 🗑️",
				"description": "Elimina del servidor/almacenamiento las capturas de pantalla asociadas a un dominio.",
				"tags": [
					"Capturas de Pantalla"
				],
				"parameters": [
					{
						"$ref": "#/components/parameters/UrlQueryParam"
					}
				],
				"responses": {
					"200": {
						"description": "Capturas eliminadas exitosamente",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ScreenshotsDeleteResponse"
								}
							}
						}
					}
				}
			},
			"patch": {
				"summary": "Actualizar screenshots existentes (PATCH) 🔄",
				"description": "Fuerza la regeneración y reemplazo de las capturas de pantalla existentes.",
				"tags": [
					"Capturas de Pantalla"
				],
				"parameters": [
					{
						"$ref": "#/components/parameters/UrlQueryParam"
					},
					{
						"$ref": "#/components/parameters/DeviceQueryParam"
					}
				],
				"responses": {
					"200": {
						"description": "Capturas actualizadas y reemplazadas exitosamente",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ScreenshotsFullResponse"
								}
							}
						}
					}
				}
			}
		},
		"/api/techs/apps": {
			"get": {
				"summary": "Listar apps con paginación y filtro de categoría 📦",
				"description": "Obtiene el listado paginado de apps registradas en el catálogo del Chismógrafo. Permite filtrar por categoría y definir la cantidad de elementos por página (por defecto 5).",
				"tags": [
					"Catálogo de Apps"
				],
				"parameters": [
					{
						"$ref": "#/components/parameters/CategoryQueryParam"
					},
					{
						"$ref": "#/components/parameters/PageQueryParam"
					},
					{
						"$ref": "#/components/parameters/LimitQueryParam"
					}
				],
				"responses": {
					"200": {
						"description": "Listado de apps paginado",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/PaginatedTechResponse"
								}
							}
						}
					}
				}
			},
			"post": {
				"summary": "Crear Aplicación con planes de precios ➕",
				"description": "Registra una nueva tecnología en el catálogo de apps con identificador único y configuración de planes de precios.",
				"tags": [
					"Catálogo de Apps"
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/TechInput"
							}
						}
					}
				},
				"responses": {
					"201": {
						"description": "Aplicación creado exitosamente",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/TechSingleResponse"
								}
							}
						}
					},
					"400": {
						"description": "Datos inválidos o ID duplicado",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ErrorResponse"
								}
							}
						}
					}
				}
			}
		},
		"/api/techs/apps/{id}": {
			"get": {
				"summary": "Obtener Aplicación por ID 🔍",
				"description": "Recupera los datos completos de un expediente de Aplicación por su identificador único (slug).",
				"tags": [
					"Catálogo de Apps"
				],
				"parameters": [
					{
						"name": "id",
						"in": "path",
						"required": true,
						"description": "ID único / slug de la tecnología (ej. microsoft-clarity)",
						"schema": {
							"type": "string"
						}
					}
				],
				"responses": {
					"200": {
						"description": "Aplicación encontrado",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/TechSingleResponse"
								}
							}
						}
					},
					"404": {
						"description": "No encontrado",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ErrorResponse"
								}
							}
						}
					}
				}
			},
			"put": {
				"summary": "Actualizar Aplicación por ID ✏️",
				"description": "Actualiza la información, planes de precios o reglas de detección de un Aplicación existente.",
				"tags": [
					"Catálogo de Apps"
				],
				"parameters": [
					{
						"name": "id",
						"in": "path",
						"required": true,
						"description": "ID único / slug a actualizar",
						"schema": {
							"type": "string"
						}
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/TechInput"
							}
						}
					}
				},
				"responses": {
					"200": {
						"description": "Aplicación actualizado exitosamente",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/TechSingleResponse"
								}
							}
						}
					},
					"404": {
						"description": "No encontrado",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ErrorResponse"
								}
							}
						}
					}
				}
			},
			"delete": {
				"summary": "Eliminar Aplicación por ID 🗑️",
				"description": "Elimina del catálogo y del sistema de archivos el expediente del Aplicación.",
				"tags": [
					"Catálogo de Apps"
				],
				"parameters": [
					{
						"name": "id",
						"in": "path",
						"required": true,
						"description": "ID único / slug a eliminar",
						"schema": {
							"type": "string"
						}
					}
				],
				"responses": {
					"200": {
						"description": "Aplicación eliminado exitosamente",
						"content": {
							"application/json": {
								"schema": {
									"type": "object",
									"properties": {
										"success": {
											"type": "boolean",
											"example": true
										},
										"message": {
											"type": "string"
										}
									}
								}
							}
						}
					},
					"404": {
						"description": "No encontrado",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ErrorResponse"
								}
							}
						}
					}
				}
			},
			"patch": {
				"summary": "Actualizar parcialmente apps por ID (PATCH) ✏️",
				"description": "Actualiza campos específicos, planes de precios o reglas de detección de un elemento en apps.",
				"tags": [
					"Catálogo de Apps"
				],
				"parameters": [
					{
						"name": "id",
						"in": "path",
						"required": true,
						"description": "ID único / slug a actualizar",
						"schema": {
							"type": "string"
						}
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/TechInput"
							}
						}
					}
				},
				"responses": {
					"200": {
						"description": "Aplicación actualizado exitosamente",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/TechSingleResponse"
								}
							}
						}
					},
					"404": {
						"description": "No encontrado",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ErrorResponse"
								}
							}
						}
					}
				}
			}
		},
		"/api/techs/infra": {
			"get": {
				"summary": "Listar infra con paginación y filtro de categoría 📦",
				"description": "Obtiene el listado paginado de infra registradas en el catálogo del Chismógrafo. Permite filtrar por categoría y definir la cantidad de elementos por página (por defecto 5).",
				"tags": [
					"Catálogo de Infraestructura"
				],
				"parameters": [
					{
						"$ref": "#/components/parameters/CategoryQueryParam"
					},
					{
						"$ref": "#/components/parameters/PageQueryParam"
					},
					{
						"$ref": "#/components/parameters/LimitQueryParam"
					}
				],
				"responses": {
					"200": {
						"description": "Listado de infra paginado",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/PaginatedTechResponse"
								}
							}
						}
					}
				}
			},
			"post": {
				"summary": "Crear Infraestructura con planes de precios ➕",
				"description": "Registra una nueva tecnología en el catálogo de infra con identificador único y configuración de planes de precios.",
				"tags": [
					"Catálogo de Infraestructura"
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/TechInput"
							}
						}
					}
				},
				"responses": {
					"201": {
						"description": "Infraestructura creado exitosamente",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/TechSingleResponse"
								}
							}
						}
					},
					"400": {
						"description": "Datos inválidos o ID duplicado",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ErrorResponse"
								}
							}
						}
					}
				}
			}
		},
		"/api/techs/infra/{id}": {
			"get": {
				"summary": "Obtener Infraestructura por ID 🔍",
				"description": "Recupera los datos completos de un expediente de Infraestructura por su identificador único (slug).",
				"tags": [
					"Catálogo de Infraestructura"
				],
				"parameters": [
					{
						"name": "id",
						"in": "path",
						"required": true,
						"description": "ID único / slug de la tecnología (ej. microsoft-clarity)",
						"schema": {
							"type": "string"
						}
					}
				],
				"responses": {
					"200": {
						"description": "Infraestructura encontrado",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/TechSingleResponse"
								}
							}
						}
					},
					"404": {
						"description": "No encontrado",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ErrorResponse"
								}
							}
						}
					}
				}
			},
			"put": {
				"summary": "Actualizar Infraestructura por ID ✏️",
				"description": "Actualiza la información, planes de precios o reglas de detección de un Infraestructura existente.",
				"tags": [
					"Catálogo de Infraestructura"
				],
				"parameters": [
					{
						"name": "id",
						"in": "path",
						"required": true,
						"description": "ID único / slug a actualizar",
						"schema": {
							"type": "string"
						}
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/TechInput"
							}
						}
					}
				},
				"responses": {
					"200": {
						"description": "Infraestructura actualizado exitosamente",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/TechSingleResponse"
								}
							}
						}
					},
					"404": {
						"description": "No encontrado",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ErrorResponse"
								}
							}
						}
					}
				}
			},
			"delete": {
				"summary": "Eliminar Infraestructura por ID 🗑️",
				"description": "Elimina del catálogo y del sistema de archivos el expediente del Infraestructura.",
				"tags": [
					"Catálogo de Infraestructura"
				],
				"parameters": [
					{
						"name": "id",
						"in": "path",
						"required": true,
						"description": "ID único / slug a eliminar",
						"schema": {
							"type": "string"
						}
					}
				],
				"responses": {
					"200": {
						"description": "Infraestructura eliminado exitosamente",
						"content": {
							"application/json": {
								"schema": {
									"type": "object",
									"properties": {
										"success": {
											"type": "boolean",
											"example": true
										},
										"message": {
											"type": "string"
										}
									}
								}
							}
						}
					},
					"404": {
						"description": "No encontrado",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ErrorResponse"
								}
							}
						}
					}
				}
			},
			"patch": {
				"summary": "Actualizar parcialmente infra por ID (PATCH) ✏️",
				"description": "Actualiza campos específicos, planes de precios o reglas de detección de un elemento en infra.",
				"tags": [
					"Catálogo de Infraestructura"
				],
				"parameters": [
					{
						"name": "id",
						"in": "path",
						"required": true,
						"description": "ID único / slug a actualizar",
						"schema": {
							"type": "string"
						}
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/TechInput"
							}
						}
					}
				},
				"responses": {
					"200": {
						"description": "Infraestructura actualizado exitosamente",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/TechSingleResponse"
								}
							}
						}
					},
					"404": {
						"description": "No encontrado",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ErrorResponse"
								}
							}
						}
					}
				}
			}
		},
		"/api/techs/pixels": {
			"get": {
				"summary": "Listar pixels con paginación y filtro de categoría 📦",
				"description": "Obtiene el listado paginado de pixels registradas en el catálogo del Chismógrafo. Permite filtrar por categoría y definir la cantidad de elementos por página (por defecto 5).",
				"tags": [
					"Catálogo de Píxeles"
				],
				"parameters": [
					{
						"$ref": "#/components/parameters/CategoryQueryParam"
					},
					{
						"$ref": "#/components/parameters/PageQueryParam"
					},
					{
						"$ref": "#/components/parameters/LimitQueryParam"
					}
				],
				"responses": {
					"200": {
						"description": "Listado de pixels paginado",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/PaginatedTechResponse"
								}
							}
						}
					}
				}
			},
			"post": {
				"summary": "Crear Píxel con planes de precios ➕",
				"description": "Registra una nueva tecnología en el catálogo de pixels con identificador único y configuración de planes de precios.",
				"tags": [
					"Catálogo de Píxeles"
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/TechInput"
							}
						}
					}
				},
				"responses": {
					"201": {
						"description": "Píxel creado exitosamente",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/TechSingleResponse"
								}
							}
						}
					},
					"400": {
						"description": "Datos inválidos o ID duplicado",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ErrorResponse"
								}
							}
						}
					}
				}
			}
		},
		"/api/techs/pixels/{id}": {
			"get": {
				"summary": "Obtener Píxel por ID 🔍",
				"description": "Recupera los datos completos de un expediente de Píxel por su identificador único (slug).",
				"tags": [
					"Catálogo de Píxeles"
				],
				"parameters": [
					{
						"name": "id",
						"in": "path",
						"required": true,
						"description": "ID único / slug de la tecnología (ej. microsoft-clarity)",
						"schema": {
							"type": "string"
						}
					}
				],
				"responses": {
					"200": {
						"description": "Píxel encontrado",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/TechSingleResponse"
								}
							}
						}
					},
					"404": {
						"description": "No encontrado",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ErrorResponse"
								}
							}
						}
					}
				}
			},
			"put": {
				"summary": "Actualizar Píxel por ID ✏️",
				"description": "Actualiza la información, planes de precios o reglas de detección de un Píxel existente.",
				"tags": [
					"Catálogo de Píxeles"
				],
				"parameters": [
					{
						"name": "id",
						"in": "path",
						"required": true,
						"description": "ID único / slug a actualizar",
						"schema": {
							"type": "string"
						}
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/TechInput"
							}
						}
					}
				},
				"responses": {
					"200": {
						"description": "Píxel actualizado exitosamente",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/TechSingleResponse"
								}
							}
						}
					},
					"404": {
						"description": "No encontrado",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ErrorResponse"
								}
							}
						}
					}
				}
			},
			"delete": {
				"summary": "Eliminar Píxel por ID 🗑️",
				"description": "Elimina del catálogo y del sistema de archivos el expediente del Píxel.",
				"tags": [
					"Catálogo de Píxeles"
				],
				"parameters": [
					{
						"name": "id",
						"in": "path",
						"required": true,
						"description": "ID único / slug a eliminar",
						"schema": {
							"type": "string"
						}
					}
				],
				"responses": {
					"200": {
						"description": "Píxel eliminado exitosamente",
						"content": {
							"application/json": {
								"schema": {
									"type": "object",
									"properties": {
										"success": {
											"type": "boolean",
											"example": true
										},
										"message": {
											"type": "string"
										}
									}
								}
							}
						}
					},
					"404": {
						"description": "No encontrado",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ErrorResponse"
								}
							}
						}
					}
				}
			},
			"patch": {
				"summary": "Actualizar parcialmente pixels por ID (PATCH) ✏️",
				"description": "Actualiza campos específicos, planes de precios o reglas de detección de un elemento en pixels.",
				"tags": [
					"Catálogo de Píxeles"
				],
				"parameters": [
					{
						"name": "id",
						"in": "path",
						"required": true,
						"description": "ID único / slug a actualizar",
						"schema": {
							"type": "string"
						}
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/TechInput"
							}
						}
					}
				},
				"responses": {
					"200": {
						"description": "Píxel actualizado exitosamente",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/TechSingleResponse"
								}
							}
						}
					},
					"404": {
						"description": "No encontrado",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ErrorResponse"
								}
							}
						}
					}
				}
			}
		},
		"/api/techs/gateways": {
			"get": {
				"summary": "Listar gateways con paginación y filtro de categoría 📦",
				"description": "Obtiene el listado paginado de gateways registradas en el catálogo del Chismógrafo. Permite filtrar por categoría y definir la cantidad de elementos por página (por defecto 5).",
				"tags": [
					"Catálogo de Pasarelas"
				],
				"parameters": [
					{
						"$ref": "#/components/parameters/CategoryQueryParam"
					},
					{
						"$ref": "#/components/parameters/PageQueryParam"
					},
					{
						"$ref": "#/components/parameters/LimitQueryParam"
					}
				],
				"responses": {
					"200": {
						"description": "Listado de gateways paginado",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/PaginatedTechResponse"
								}
							}
						}
					}
				}
			},
			"post": {
				"summary": "Crear Pasarela de Pago con planes de precios ➕",
				"description": "Registra una nueva tecnología en el catálogo de gateways con identificador único y configuración de planes de precios.",
				"tags": [
					"Catálogo de Pasarelas"
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/TechInput"
							}
						}
					}
				},
				"responses": {
					"201": {
						"description": "Pasarela de Pago creado exitosamente",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/TechSingleResponse"
								}
							}
						}
					},
					"400": {
						"description": "Datos inválidos o ID duplicado",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ErrorResponse"
								}
							}
						}
					}
				}
			}
		},
		"/api/techs/gateways/{id}": {
			"get": {
				"summary": "Obtener Pasarela de Pago por ID 🔍",
				"description": "Recupera los datos completos de un expediente de Pasarela de Pago por su identificador único (slug).",
				"tags": [
					"Catálogo de Pasarelas"
				],
				"parameters": [
					{
						"name": "id",
						"in": "path",
						"required": true,
						"description": "ID único / slug de la tecnología (ej. microsoft-clarity)",
						"schema": {
							"type": "string"
						}
					}
				],
				"responses": {
					"200": {
						"description": "Pasarela de Pago encontrado",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/TechSingleResponse"
								}
							}
						}
					},
					"404": {
						"description": "No encontrado",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ErrorResponse"
								}
							}
						}
					}
				}
			},
			"put": {
				"summary": "Actualizar Pasarela de Pago por ID ✏️",
				"description": "Actualiza la información, planes de precios o reglas de detección de un Pasarela de Pago existente.",
				"tags": [
					"Catálogo de Pasarelas"
				],
				"parameters": [
					{
						"name": "id",
						"in": "path",
						"required": true,
						"description": "ID único / slug a actualizar",
						"schema": {
							"type": "string"
						}
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/TechInput"
							}
						}
					}
				},
				"responses": {
					"200": {
						"description": "Pasarela de Pago actualizado exitosamente",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/TechSingleResponse"
								}
							}
						}
					},
					"404": {
						"description": "No encontrado",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ErrorResponse"
								}
							}
						}
					}
				}
			},
			"delete": {
				"summary": "Eliminar Pasarela de Pago por ID 🗑️",
				"description": "Elimina del catálogo y del sistema de archivos el expediente del Pasarela de Pago.",
				"tags": [
					"Catálogo de Pasarelas"
				],
				"parameters": [
					{
						"name": "id",
						"in": "path",
						"required": true,
						"description": "ID único / slug a eliminar",
						"schema": {
							"type": "string"
						}
					}
				],
				"responses": {
					"200": {
						"description": "Pasarela de Pago eliminado exitosamente",
						"content": {
							"application/json": {
								"schema": {
									"type": "object",
									"properties": {
										"success": {
											"type": "boolean",
											"example": true
										},
										"message": {
											"type": "string"
										}
									}
								}
							}
						}
					},
					"404": {
						"description": "No encontrado",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ErrorResponse"
								}
							}
						}
					}
				}
			},
			"patch": {
				"summary": "Actualizar parcialmente gateways por ID (PATCH) ✏️",
				"description": "Actualiza campos específicos, planes de precios o reglas de detección de un elemento en gateways.",
				"tags": [
					"Catálogo de Pasarelas"
				],
				"parameters": [
					{
						"name": "id",
						"in": "path",
						"required": true,
						"description": "ID único / slug a actualizar",
						"schema": {
							"type": "string"
						}
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/TechInput"
							}
						}
					}
				},
				"responses": {
					"200": {
						"description": "Pasarela de Pago actualizado exitosamente",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/TechSingleResponse"
								}
							}
						}
					},
					"404": {
						"description": "No encontrado",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ErrorResponse"
								}
							}
						}
					}
				}
			}
		},
		"/api/techs/cms": {
			"get": {
				"summary": "Listar cms con paginación y filtro de categoría 📦",
				"description": "Obtiene el listado paginado de cms registradas en el catálogo del Chismógrafo. Permite filtrar por categoría y definir la cantidad de elementos por página (por defecto 5).",
				"tags": [
					"Catálogo de CMS"
				],
				"parameters": [
					{
						"$ref": "#/components/parameters/CategoryQueryParam"
					},
					{
						"$ref": "#/components/parameters/PageQueryParam"
					},
					{
						"$ref": "#/components/parameters/LimitQueryParam"
					}
				],
				"responses": {
					"200": {
						"description": "Listado de cms paginado",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/PaginatedTechResponse"
								}
							}
						}
					}
				}
			},
			"post": {
				"summary": "Crear CMS con planes de precios ➕",
				"description": "Registra una nueva tecnología en el catálogo de cms con identificador único y configuración de planes de precios.",
				"tags": [
					"Catálogo de CMS"
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/TechInput"
							}
						}
					}
				},
				"responses": {
					"201": {
						"description": "CMS creado exitosamente",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/TechSingleResponse"
								}
							}
						}
					},
					"400": {
						"description": "Datos inválidos o ID duplicado",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ErrorResponse"
								}
							}
						}
					}
				}
			}
		},
		"/api/techs/cms/{id}": {
			"get": {
				"summary": "Obtener CMS por ID 🔍",
				"description": "Recupera los datos completos de un expediente de CMS por su identificador único (slug).",
				"tags": [
					"Catálogo de CMS"
				],
				"parameters": [
					{
						"name": "id",
						"in": "path",
						"required": true,
						"description": "ID único / slug de la tecnología (ej. shopify)",
						"schema": {
							"type": "string"
						}
					}
				],
				"responses": {
					"200": {
						"description": "CMS encontrado",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/TechSingleResponse"
								}
							}
						}
					},
					"404": {
						"description": "No encontrado",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ErrorResponse"
								}
							}
						}
					}
				}
			},
			"put": {
				"summary": "Actualizar CMS por ID ✏️",
				"description": "Actualiza la información, planes de precios o reglas de detección de un CMS existente.",
				"tags": [
					"Catálogo de CMS"
				],
				"parameters": [
					{
						"name": "id",
						"in": "path",
						"required": true,
						"description": "ID único / slug a actualizar",
						"schema": {
							"type": "string"
						}
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/TechInput"
							}
						}
					}
				},
				"responses": {
					"200": {
						"description": "CMS actualizado exitosamente",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/TechSingleResponse"
								}
							}
						}
					},
					"404": {
						"description": "No encontrado",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ErrorResponse"
								}
							}
						}
					}
				}
			},
			"delete": {
				"summary": "Eliminar CMS por ID 🗑️",
				"description": "Elimina del catálogo y del sistema de archivos el expediente del CMS.",
				"tags": [
					"Catálogo de CMS"
				],
				"parameters": [
					{
						"name": "id",
						"in": "path",
						"required": true,
						"description": "ID único / slug a eliminar",
						"schema": {
							"type": "string"
						}
					}
				],
				"responses": {
					"200": {
						"description": "CMS eliminado exitosamente",
						"content": {
							"application/json": {
								"schema": {
									"type": "object",
									"properties": {
										"success": {
											"type": "boolean",
											"example": true
										},
										"message": {
											"type": "string"
										}
									}
								}
							}
						}
					},
					"404": {
						"description": "No encontrado",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ErrorResponse"
								}
							}
						}
					}
				}
			},
			"patch": {
				"summary": "Actualizar parcialmente cms por ID (PATCH) ✏️",
				"description": "Actualiza campos específicos, planes de precios o reglas de detección de un elemento en cms.",
				"tags": [
					"Catálogo de CMS"
				],
				"parameters": [
					{
						"name": "id",
						"in": "path",
						"required": true,
						"description": "ID único / slug a actualizar",
						"schema": {
							"type": "string"
						}
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/TechInput"
							}
						}
					}
				},
				"responses": {
					"200": {
						"description": "CMS actualizado exitosamente",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/TechSingleResponse"
								}
							}
						}
					},
					"404": {
						"description": "No encontrado",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ErrorResponse"
								}
							}
						}
					}
				}
			}
		},
		"/api/apps/{id}": {
			"get": {
				"summary": "Obtener Aplicación por ID 🔍",
				"description": "Recupera los datos completos de un expediente de Aplicación por su identificador único (slug).",
				"tags": [
					"Catálogo de Apps"
				],
				"parameters": [
					{
						"name": "id",
						"in": "path",
						"required": true,
						"description": "ID único / slug de la tecnología (ej. microsoft-clarity)",
						"schema": {
							"type": "string"
						}
					}
				],
				"responses": {
					"200": {
						"description": "Aplicación encontrado",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/TechSingleResponse"
								}
							}
						}
					},
					"404": {
						"description": "No encontrado",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ErrorResponse"
								}
							}
						}
					}
				}
			},
			"put": {
				"summary": "Actualizar Aplicación por ID ✏️",
				"description": "Actualiza la información, planes de precios o reglas de detección de un Aplicación existente.",
				"tags": [
					"Catálogo de Apps"
				],
				"parameters": [
					{
						"name": "id",
						"in": "path",
						"required": true,
						"description": "ID único / slug a actualizar",
						"schema": {
							"type": "string"
						}
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/TechInput"
							}
						}
					}
				},
				"responses": {
					"200": {
						"description": "Aplicación actualizado exitosamente",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/TechSingleResponse"
								}
							}
						}
					},
					"404": {
						"description": "No encontrado",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ErrorResponse"
								}
							}
						}
					}
				}
			},
			"delete": {
				"summary": "Eliminar Aplicación por ID 🗑️",
				"description": "Elimina del catálogo y del sistema de archivos el expediente del Aplicación.",
				"tags": [
					"Catálogo de Apps"
				],
				"parameters": [
					{
						"name": "id",
						"in": "path",
						"required": true,
						"description": "ID único / slug a eliminar",
						"schema": {
							"type": "string"
						}
					}
				],
				"responses": {
					"200": {
						"description": "Aplicación eliminado exitosamente",
						"content": {
							"application/json": {
								"schema": {
									"type": "object",
									"properties": {
										"success": {
											"type": "boolean",
											"example": true
										},
										"message": {
											"type": "string"
										}
									}
								}
							}
						}
					},
					"404": {
						"description": "No encontrado",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ErrorResponse"
								}
							}
						}
					}
				}
			},
			"patch": {
				"summary": "Actualizar parcialmente apps por ID (PATCH) ✏️",
				"description": "Actualiza campos específicos, planes de precios o reglas de detección de un elemento en apps.",
				"tags": [
					"Catálogo de Apps"
				],
				"parameters": [
					{
						"name": "id",
						"in": "path",
						"required": true,
						"description": "ID único / slug a actualizar",
						"schema": {
							"type": "string"
						}
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/TechInput"
							}
						}
					}
				},
				"responses": {
					"200": {
						"description": "Aplicación actualizado exitosamente",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/TechSingleResponse"
								}
							}
						}
					},
					"404": {
						"description": "No encontrado",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ErrorResponse"
								}
							}
						}
					}
				}
			},
			"summary": "Alias directo para apps por ID"
		},
		"/api/infra/{id}": {
			"get": {
				"summary": "Obtener Infraestructura por ID 🔍",
				"description": "Recupera los datos completos de un expediente de Infraestructura por su identificador único (slug).",
				"tags": [
					"Catálogo de Infraestructura"
				],
				"parameters": [
					{
						"name": "id",
						"in": "path",
						"required": true,
						"description": "ID único / slug de la tecnología (ej. microsoft-clarity)",
						"schema": {
							"type": "string"
						}
					}
				],
				"responses": {
					"200": {
						"description": "Infraestructura encontrado",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/TechSingleResponse"
								}
							}
						}
					},
					"404": {
						"description": "No encontrado",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ErrorResponse"
								}
							}
						}
					}
				}
			},
			"put": {
				"summary": "Actualizar Infraestructura por ID ✏️",
				"description": "Actualiza la información, planes de precios o reglas de detección de un Infraestructura existente.",
				"tags": [
					"Catálogo de Infraestructura"
				],
				"parameters": [
					{
						"name": "id",
						"in": "path",
						"required": true,
						"description": "ID único / slug a actualizar",
						"schema": {
							"type": "string"
						}
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/TechInput"
							}
						}
					}
				},
				"responses": {
					"200": {
						"description": "Infraestructura actualizado exitosamente",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/TechSingleResponse"
								}
							}
						}
					},
					"404": {
						"description": "No encontrado",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ErrorResponse"
								}
							}
						}
					}
				}
			},
			"delete": {
				"summary": "Eliminar Infraestructura por ID 🗑️",
				"description": "Elimina del catálogo y del sistema de archivos el expediente del Infraestructura.",
				"tags": [
					"Catálogo de Infraestructura"
				],
				"parameters": [
					{
						"name": "id",
						"in": "path",
						"required": true,
						"description": "ID único / slug a eliminar",
						"schema": {
							"type": "string"
						}
					}
				],
				"responses": {
					"200": {
						"description": "Infraestructura eliminado exitosamente",
						"content": {
							"application/json": {
								"schema": {
									"type": "object",
									"properties": {
										"success": {
											"type": "boolean",
											"example": true
										},
										"message": {
											"type": "string"
										}
									}
								}
							}
						}
					},
					"404": {
						"description": "No encontrado",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ErrorResponse"
								}
							}
						}
					}
				}
			},
			"patch": {
				"summary": "Actualizar parcialmente infra por ID (PATCH) ✏️",
				"description": "Actualiza campos específicos, planes de precios o reglas de detección de un elemento en infra.",
				"tags": [
					"Catálogo de Infraestructura"
				],
				"parameters": [
					{
						"name": "id",
						"in": "path",
						"required": true,
						"description": "ID único / slug a actualizar",
						"schema": {
							"type": "string"
						}
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/TechInput"
							}
						}
					}
				},
				"responses": {
					"200": {
						"description": "Infraestructura actualizado exitosamente",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/TechSingleResponse"
								}
							}
						}
					},
					"404": {
						"description": "No encontrado",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ErrorResponse"
								}
							}
						}
					}
				}
			},
			"summary": "Alias directo para infra por ID"
		},
		"/api/pixels": {
			"get": {
				"summary": "Listar pixels con paginación y filtro de categoría 📦",
				"description": "Obtiene el listado paginado de pixels registradas en el catálogo del Chismógrafo. Permite filtrar por categoría y definir la cantidad de elementos por página (por defecto 5).",
				"tags": [
					"Catálogo de Píxeles"
				],
				"parameters": [
					{
						"$ref": "#/components/parameters/CategoryQueryParam"
					},
					{
						"$ref": "#/components/parameters/PageQueryParam"
					},
					{
						"$ref": "#/components/parameters/LimitQueryParam"
					}
				],
				"responses": {
					"200": {
						"description": "Listado de pixels paginado",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/PaginatedTechResponse"
								}
							}
						}
					}
				}
			},
			"post": {
				"summary": "Crear Píxel con planes de precios ➕",
				"description": "Registra una nueva tecnología en el catálogo de pixels con identificador único y configuración de planes de precios.",
				"tags": [
					"Catálogo de Píxeles"
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/TechInput"
							}
						}
					}
				},
				"responses": {
					"201": {
						"description": "Píxel creado exitosamente",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/TechSingleResponse"
								}
							}
						}
					},
					"400": {
						"description": "Datos inválidos o ID duplicado",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ErrorResponse"
								}
							}
						}
					}
				}
			},
			"summary": "Alias directo para pixels"
		},
		"/api/pixels/{id}": {
			"get": {
				"summary": "Obtener Píxel por ID 🔍",
				"description": "Recupera los datos completos de un expediente de Píxel por su identificador único (slug).",
				"tags": [
					"Catálogo de Píxeles"
				],
				"parameters": [
					{
						"name": "id",
						"in": "path",
						"required": true,
						"description": "ID único / slug de la tecnología (ej. microsoft-clarity)",
						"schema": {
							"type": "string"
						}
					}
				],
				"responses": {
					"200": {
						"description": "Píxel encontrado",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/TechSingleResponse"
								}
							}
						}
					},
					"404": {
						"description": "No encontrado",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ErrorResponse"
								}
							}
						}
					}
				}
			},
			"put": {
				"summary": "Actualizar Píxel por ID ✏️",
				"description": "Actualiza la información, planes de precios o reglas de detección de un Píxel existente.",
				"tags": [
					"Catálogo de Píxeles"
				],
				"parameters": [
					{
						"name": "id",
						"in": "path",
						"required": true,
						"description": "ID único / slug a actualizar",
						"schema": {
							"type": "string"
						}
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/TechInput"
							}
						}
					}
				},
				"responses": {
					"200": {
						"description": "Píxel actualizado exitosamente",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/TechSingleResponse"
								}
							}
						}
					},
					"404": {
						"description": "No encontrado",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ErrorResponse"
								}
							}
						}
					}
				}
			},
			"delete": {
				"summary": "Eliminar Píxel por ID 🗑️",
				"description": "Elimina del catálogo y del sistema de archivos el expediente del Píxel.",
				"tags": [
					"Catálogo de Píxeles"
				],
				"parameters": [
					{
						"name": "id",
						"in": "path",
						"required": true,
						"description": "ID único / slug a eliminar",
						"schema": {
							"type": "string"
						}
					}
				],
				"responses": {
					"200": {
						"description": "Píxel eliminado exitosamente",
						"content": {
							"application/json": {
								"schema": {
									"type": "object",
									"properties": {
										"success": {
											"type": "boolean",
											"example": true
										},
										"message": {
											"type": "string"
										}
									}
								}
							}
						}
					},
					"404": {
						"description": "No encontrado",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ErrorResponse"
								}
							}
						}
					}
				}
			},
			"patch": {
				"summary": "Actualizar parcialmente pixels por ID (PATCH) ✏️",
				"description": "Actualiza campos específicos, planes de precios o reglas de detección de un elemento en pixels.",
				"tags": [
					"Catálogo de Píxeles"
				],
				"parameters": [
					{
						"name": "id",
						"in": "path",
						"required": true,
						"description": "ID único / slug a actualizar",
						"schema": {
							"type": "string"
						}
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/TechInput"
							}
						}
					}
				},
				"responses": {
					"200": {
						"description": "Píxel actualizado exitosamente",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/TechSingleResponse"
								}
							}
						}
					},
					"404": {
						"description": "No encontrado",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ErrorResponse"
								}
							}
						}
					}
				}
			},
			"summary": "Alias directo para pixels por ID"
		},
		"/api/gateways": {
			"get": {
				"summary": "Listar gateways con paginación y filtro de categoría 📦",
				"description": "Obtiene el listado paginado de gateways registradas en el catálogo del Chismógrafo. Permite filtrar por categoría y definir la cantidad de elementos por página (por defecto 5).",
				"tags": [
					"Catálogo de Pasarelas"
				],
				"parameters": [
					{
						"$ref": "#/components/parameters/CategoryQueryParam"
					},
					{
						"$ref": "#/components/parameters/PageQueryParam"
					},
					{
						"$ref": "#/components/parameters/LimitQueryParam"
					}
				],
				"responses": {
					"200": {
						"description": "Listado de gateways paginado",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/PaginatedTechResponse"
								}
							}
						}
					}
				}
			},
			"post": {
				"summary": "Crear Pasarela de Pago con planes de precios ➕",
				"description": "Registra una nueva tecnología en el catálogo de gateways con identificador único y configuración de planes de precios.",
				"tags": [
					"Catálogo de Pasarelas"
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/TechInput"
							}
						}
					}
				},
				"responses": {
					"201": {
						"description": "Pasarela de Pago creado exitosamente",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/TechSingleResponse"
								}
							}
						}
					},
					"400": {
						"description": "Datos inválidos o ID duplicado",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ErrorResponse"
								}
							}
						}
					}
				}
			},
			"summary": "Alias directo para gateways"
		},
		"/api/gateways/{id}": {
			"get": {
				"summary": "Obtener Pasarela de Pago por ID 🔍",
				"description": "Recupera los datos completos de un expediente de Pasarela de Pago por su identificador único (slug).",
				"tags": [
					"Catálogo de Pasarelas"
				],
				"parameters": [
					{
						"name": "id",
						"in": "path",
						"required": true,
						"description": "ID único / slug de la tecnología (ej. microsoft-clarity)",
						"schema": {
							"type": "string"
						}
					}
				],
				"responses": {
					"200": {
						"description": "Pasarela de Pago encontrado",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/TechSingleResponse"
								}
							}
						}
					},
					"404": {
						"description": "No encontrado",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ErrorResponse"
								}
							}
						}
					}
				}
			},
			"put": {
				"summary": "Actualizar Pasarela de Pago por ID ✏️",
				"description": "Actualiza la información, planes de precios o reglas de detección de un Pasarela de Pago existente.",
				"tags": [
					"Catálogo de Pasarelas"
				],
				"parameters": [
					{
						"name": "id",
						"in": "path",
						"required": true,
						"description": "ID único / slug a actualizar",
						"schema": {
							"type": "string"
						}
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/TechInput"
							}
						}
					}
				},
				"responses": {
					"200": {
						"description": "Pasarela de Pago actualizado exitosamente",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/TechSingleResponse"
								}
							}
						}
					},
					"404": {
						"description": "No encontrado",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ErrorResponse"
								}
							}
						}
					}
				}
			},
			"delete": {
				"summary": "Eliminar Pasarela de Pago por ID 🗑️",
				"description": "Elimina del catálogo y del sistema de archivos el expediente del Pasarela de Pago.",
				"tags": [
					"Catálogo de Pasarelas"
				],
				"parameters": [
					{
						"name": "id",
						"in": "path",
						"required": true,
						"description": "ID único / slug a eliminar",
						"schema": {
							"type": "string"
						}
					}
				],
				"responses": {
					"200": {
						"description": "Pasarela de Pago eliminado exitosamente",
						"content": {
							"application/json": {
								"schema": {
									"type": "object",
									"properties": {
										"success": {
											"type": "boolean",
											"example": true
										},
										"message": {
											"type": "string"
										}
									}
								}
							}
						}
					},
					"404": {
						"description": "No encontrado",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ErrorResponse"
								}
							}
						}
					}
				}
			},
			"patch": {
				"summary": "Actualizar parcialmente gateways por ID (PATCH) ✏️",
				"description": "Actualiza campos específicos, planes de precios o reglas de detección de un elemento en gateways.",
				"tags": [
					"Catálogo de Pasarelas"
				],
				"parameters": [
					{
						"name": "id",
						"in": "path",
						"required": true,
						"description": "ID único / slug a actualizar",
						"schema": {
							"type": "string"
						}
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/TechInput"
							}
						}
					}
				},
				"responses": {
					"200": {
						"description": "Pasarela de Pago actualizado exitosamente",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/TechSingleResponse"
								}
							}
						}
					},
					"404": {
						"description": "No encontrado",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ErrorResponse"
								}
							}
						}
					}
				}
			},
			"summary": "Alias directo para gateways por ID"
		},
		"/api/cms/{id}": {
			"get": {
				"summary": "Obtener CMS por ID 🔍",
				"description": "Recupera los datos completos de un expediente de CMS por su identificador único (slug).",
				"tags": [
					"Catálogo de CMS"
				],
				"parameters": [
					{
						"name": "id",
						"in": "path",
						"required": true,
						"description": "ID único / slug de la tecnología (ej. shopify)",
						"schema": {
							"type": "string"
						}
					}
				],
				"responses": {
					"200": {
						"description": "CMS encontrado",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/TechSingleResponse"
								}
							}
						}
					},
					"404": {
						"description": "No encontrado",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ErrorResponse"
								}
							}
						}
					}
				}
			},
			"put": {
				"summary": "Actualizar CMS por ID ✏️",
				"description": "Actualiza la información, planes de precios o reglas de detección de un CMS existente.",
				"tags": [
					"Catálogo de CMS"
				],
				"parameters": [
					{
						"name": "id",
						"in": "path",
						"required": true,
						"description": "ID único / slug a actualizar",
						"schema": {
							"type": "string"
						}
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/TechInput"
							}
						}
					}
				},
				"responses": {
					"200": {
						"description": "CMS actualizado exitosamente",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/TechSingleResponse"
								}
							}
						}
					},
					"404": {
						"description": "No encontrado",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ErrorResponse"
								}
							}
						}
					}
				}
			},
			"delete": {
				"summary": "Eliminar CMS por ID 🗑️",
				"description": "Elimina del catálogo y del sistema de archivos el expediente del CMS.",
				"tags": [
					"Catálogo de CMS"
				],
				"parameters": [
					{
						"name": "id",
						"in": "path",
						"required": true,
						"description": "ID único / slug a eliminar",
						"schema": {
							"type": "string"
						}
					}
				],
				"responses": {
					"200": {
						"description": "CMS eliminado exitosamente",
						"content": {
							"application/json": {
								"schema": {
									"type": "object",
									"properties": {
										"success": {
											"type": "boolean",
											"example": true
										},
										"message": {
											"type": "string"
										}
									}
								}
							}
						}
					},
					"404": {
						"description": "No encontrado",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ErrorResponse"
								}
							}
						}
					}
				}
			},
			"patch": {
				"summary": "Actualizar parcialmente cms por ID (PATCH) ✏️",
				"description": "Actualiza campos específicos, planes de precios o reglas de detección de un elemento en cms.",
				"tags": [
					"Catálogo de CMS"
				],
				"parameters": [
					{
						"name": "id",
						"in": "path",
						"required": true,
						"description": "ID único / slug a actualizar",
						"schema": {
							"type": "string"
						}
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/TechInput"
							}
						}
					}
				},
				"responses": {
					"200": {
						"description": "CMS actualizado exitosamente",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/TechSingleResponse"
								}
							}
						}
					},
					"404": {
						"description": "No encontrado",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ErrorResponse"
								}
							}
						}
					}
				}
			},
			"summary": "Alias directo para cms por ID"
		}
	},
	"components": {
		"parameters": {
			"UrlQueryParam": {
				"name": "url",
				"in": "query",
				"required": true,
				"description": "La dirección URL de la tienda a auditar",
				"schema": {
					"type": "string",
					"format": "uri",
					"example": "https://tienda-ejemplo.com"
				}
			},
			"CategoryQueryParam": {
				"name": "category",
				"in": "query",
				"required": false,
				"description": "Filtrar por categoría (ej. Analítica, Pasarela de Pago)",
				"schema": {
					"type": "string"
				}
			},
			"PageQueryParam": {
				"name": "page",
				"in": "query",
				"required": false,
				"description": "Número de página a consultar (por defecto 1)",
				"schema": {
					"type": "integer",
					"default": 1,
					"minimum": 1
				}
			},
			"LimitQueryParam": {
				"name": "limit",
				"in": "query",
				"required": false,
				"description": "Cantidad de elementos por página (por defecto 5)",
				"schema": {
					"type": "integer",
					"default": 5,
					"minimum": 1
				}
			},
			"DeviceQueryParam": {
				"name": "device",
				"in": "query",
				"required": false,
				"description": "Dispositivo para la captura (desktop, mobile o omitir para ambas)",
				"schema": {
					"type": "string",
					"enum": [
						"desktop",
						"mobile"
					]
				}
			}
		},
		"schemas": {
			"DetectRequest": {
				"type": "object",
				"required": [
					"url"
				],
				"properties": {
					"url": {
						"type": "string",
						"format": "uri",
						"description": "Dirección URL del sitio web a analizar",
						"example": "https://tienda-ejemplo.com"
					}
				}
			},
			"DetectResponse": {
				"type": "object",
				"properties": {
					"url": {
						"type": "string",
						"example": "https://tienda-ejemplo.com"
					},
					"resolvedUrl": {
						"type": "string",
						"example": "https://tienda-ejemplo.com/"
					},
					"success": {
						"type": "boolean",
						"example": true
					},
					"detected": {
						"type": "boolean",
						"example": true
					},
					"technology": {
						"type": "string",
						"example": "Shopify"
					},
					"confidence": {
						"type": "number",
						"format": "float",
						"example": 1
					},
					"theme": {
						"type": "string",
						"example": "Dawn"
					},
					"plugins": {
						"type": "array",
						"description": "Lista de aplicaciones y plugins detectados",
						"items": {
							"$ref": "#/components/schemas/TechItem"
						}
					},
					"infrastructure": {
						"type": "array",
						"description": "Lista de componentes de infraestructura detectados",
						"items": {
							"$ref": "#/components/schemas/TechItem"
						}
					},
					"pixels": {
						"type": "array",
						"description": "Lista de píxeles de rastreo y etiquetas detectadas",
						"items": {
							"$ref": "#/components/schemas/TechItem"
						}
					},
					"paymentGateways": {
						"type": "array",
						"items": {
							"type": "string",
							"example": "Stripe"
						}
					},
					"location": {
						"$ref": "#/components/schemas/LocationData"
					},
					"latency": {
						"$ref": "#/components/schemas/LatencyData"
					},
					"screenshots": {
						"type": "object",
						"properties": {
							"desktop": {
								"type": "string",
								"description": "URL de captura desktop"
							},
							"mobile": {
								"type": "string",
								"description": "URL de captura móvil"
							}
						}
					}
				}
			},
			"TechItem": {
				"type": "object",
				"required": [
					"id",
					"name"
				],
				"properties": {
					"id": {
						"type": "string",
						"example": "microsoft-clarity"
					},
					"name": {
						"type": "string",
						"example": "Microsoft Clarity: AI Insights"
					},
					"developer": {
						"type": "string",
						"example": "Microsoft Clarity"
					},
					"category": {
						"type": "string",
						"example": "Analítica"
					},
					"compatibleCMS": {
						"type": "array",
						"items": {
							"type": "string"
						},
						"example": [
							"Shopify",
							"WooCommerce"
						]
					},
					"web": {
						"type": "string",
						"format": "uri",
						"example": "https://www.microsoft.com"
					},
					"precios": {
						"type": "array",
						"items": {
							"$ref": "#/components/schemas/PrecioPlan"
						}
					},
					"appStores": {
						"type": "array",
						"items": {
							"type": "object",
							"properties": {
								"cms": {
									"type": "string",
									"example": "Shopify"
								},
								"link": {
									"type": "string",
									"example": "microsoft-clarity"
								}
							}
						}
					},
					"logo": {
						"type": "object",
						"properties": {
							"id": {
								"type": "string",
								"example": "clarity.microsoft.com"
							},
							"provider": {
								"type": "string",
								"example": "brandicons"
							}
						}
					},
					"detectionRules": {
						"type": "array",
						"items": {
							"type": "object",
							"properties": {
								"type": {
									"type": "string",
									"example": "script-src"
								},
								"pattern": {
									"type": "string",
									"example": "clarity\\.ms\\/tag\\/|clarity\\.js"
								},
								"description": {
									"type": "string",
									"example": "Script de Microsoft Clarity detectado"
								}
							}
						}
					}
				}
			},
			"CmsResponse": {
				"type": "object",
				"properties": {
					"success": {
						"type": "boolean"
					},
					"url": {
						"type": "string"
					},
					"technology": {
						"type": "string",
						"example": "Shopify"
					},
					"confidence": {
						"type": "number",
						"example": 1
					},
					"theme": {
						"type": "string",
						"example": "Dawn"
					}
				}
			},
			"AppsResponse": {
				"type": "object",
				"properties": {
					"success": {
						"type": "boolean"
					},
					"url": {
						"type": "string"
					},
					"plugins": {
						"type": "array",
						"items": {
							"$ref": "#/components/schemas/TechItem"
						}
					}
				}
			},
			"InfraResponse": {
				"type": "object",
				"properties": {
					"success": {
						"type": "boolean"
					},
					"url": {
						"type": "string"
					},
					"infrastructure": {
						"type": "array",
						"items": {
							"$ref": "#/components/schemas/TechItem"
						}
					}
				}
			},
			"PaymentGatewaysResponse": {
				"type": "object",
				"properties": {
					"success": {
						"type": "boolean"
					},
					"url": {
						"type": "string"
					},
					"paymentGateways": {
						"type": "array",
						"items": {
							"type": "string",
							"example": "PayPal"
						}
					}
				}
			},
			"LocationData": {
				"type": "object",
				"properties": {
					"success": {
						"type": "boolean"
					},
					"ip": {
						"type": "string",
						"example": "23.227.38.65"
					},
					"country": {
						"type": "string",
						"example": "Canadá"
					},
					"city": {
						"type": "string",
						"example": "Ottawa"
					},
					"ll": {
						"type": "array",
						"items": {
							"type": "number"
						},
						"example": [
							45.42,
							-75.69
						]
					}
				}
			},
			"LocationResponse": {
				"type": "object",
				"properties": {
					"success": {
						"type": "boolean"
					},
					"url": {
						"type": "string"
					},
					"location": {
						"$ref": "#/components/schemas/LocationData"
					}
				}
			},
			"LatencyData": {
				"type": "object",
				"properties": {
					"success": {
						"type": "boolean"
					},
					"latencyMs": {
						"type": "integer",
						"example": 85
					},
					"description": {
						"type": "string",
						"example": "85ms (Rápido)"
					}
				}
			},
			"LatencyResponse": {
				"type": "object",
				"properties": {
					"success": {
						"type": "boolean"
					},
					"url": {
						"type": "string"
					},
					"latency": {
						"$ref": "#/components/schemas/LatencyData"
					}
				}
			},
			"PageSpeedResponse": {
				"type": "object",
				"properties": {
					"success": {
						"type": "boolean"
					},
					"scores": {
						"type": "object",
						"properties": {
							"performance": {
								"type": "integer",
								"example": 74
							},
							"accessibility": {
								"type": "integer",
								"example": 88
							},
							"seo": {
								"type": "integer",
								"example": 95
							}
						}
					},
					"isDemo": {
						"type": "boolean",
						"description": "Indica si los resultados son simulados debido a límites de la API pública"
					},
					"metrics": {
						"type": "object",
						"properties": {
							"fcp": {
								"type": "string",
								"example": "1.7 s"
							},
							"lcp": {
								"type": "string",
								"example": "3.1 s"
							},
							"tbt": {
								"type": "string",
								"example": "180 ms"
							},
							"cls": {
								"type": "string",
								"example": "0.03"
							},
							"speedIndex": {
								"type": "string",
								"example": "2.0 s"
							},
							"interactive": {
								"type": "string",
								"example": "3.3 s"
							}
						}
					}
				}
			},
			"ScreenshotResponse": {
				"type": "object",
				"properties": {
					"success": {
						"type": "boolean"
					},
					"device": {
						"type": "string",
						"example": "desktop"
					},
					"url": {
						"type": "string"
					},
					"screenshotUrl": {
						"type": "string"
					}
				}
			},
			"EmailReportRequest": {
				"type": "object",
				"required": [
					"email",
					"scanData"
				],
				"properties": {
					"email": {
						"type": "string",
						"format": "email",
						"example": "contacto@rifatela.lol"
					},
					"name": {
						"type": "string",
						"example": "César Ayar"
					},
					"scanData": {
						"$ref": "#/components/schemas/DetectResponse"
					}
				}
			},
			"RulesTestRequest": {
				"type": "object",
				"required": [
					"detectionRules"
				],
				"properties": {
					"url": {
						"type": "string",
						"format": "uri",
						"example": "https://shopify.com"
					},
					"html": {
						"type": "string",
						"description": "Código HTML crudo para evaluar las reglas"
					},
					"detectionRules": {
						"type": "array",
						"items": {
							"type": "object",
							"required": [
								"type",
								"pattern"
							],
							"properties": {
								"type": {
									"type": "string",
									"enum": [
										"script-src",
										"script-content",
										"meta",
										"header",
										"dom-element",
										"js-variable"
									]
								},
								"pattern": {
									"type": "string",
									"example": "cdn\\.shopify\\.com"
								},
								"key": {
									"type": "string",
									"example": "generator"
								},
								"description": {
									"type": "string",
									"example": "Firma de script CDN detectada"
								}
							}
						}
					}
				}
			},
			"RulesTestResponse": {
				"type": "object",
				"properties": {
					"success": {
						"type": "boolean"
					},
					"matched": {
						"type": "boolean"
					},
					"score": {
						"type": "number",
						"example": 1
					},
					"results": {
						"type": "array",
						"items": {
							"type": "object",
							"properties": {
								"rule": {
									"type": "object"
								},
								"passed": {
									"type": "boolean"
								},
								"evidence": {
									"type": "string"
								}
							}
						}
					}
				}
			},
			"ErrorResponse": {
				"type": "object",
				"properties": {
					"success": {
						"type": "boolean",
						"example": false
					},
					"error": {
						"type": "string",
						"example": "URL inválida o no proporcionada"
					}
				}
			},
			"PrecioPlan": {
				"type": "object",
				"required": [
					"id",
					"plan",
					"precio",
					"moneda"
				],
				"properties": {
					"id": {
						"type": "number",
						"example": 1
					},
					"plan": {
						"type": "string",
						"example": "Demo"
					},
					"precio": {
						"type": "number",
						"example": 1
					},
					"moneda": {
						"type": "string",
						"example": "USD"
					}
				}
			},
			"TechInput": {
				"type": "object",
				"required": [
					"name"
				],
				"properties": {
					"id": {
						"type": "string",
						"description": "Identificador único en slug kebab-case (opcional, se autogenera si se omite)",
						"example": "mi-app-nueva"
					},
					"name": {
						"type": "string",
						"example": "Mi App Nueva"
					},
					"developer": {
						"type": "string",
						"example": "Desarrollador"
					},
					"category": {
						"type": "string",
						"example": "Analítica"
					},
					"compatibleCMS": {
						"type": "array",
						"items": {
							"type": "string"
						},
						"example": [
							"Shopify"
						]
					},
					"web": {
						"type": "string",
						"format": "uri",
						"example": "https://ejemplo.com"
					},
					"precios": {
						"type": "array",
						"items": {
							"$ref": "#/components/schemas/PrecioPlan"
						}
					},
					"detectionRules": {
						"type": "array",
						"items": {
							"type": "object",
							"required": [
								"type",
								"pattern"
							],
							"properties": {
								"type": {
									"type": "string",
									"example": "script-src"
								},
								"pattern": {
									"type": "string",
									"example": "mi-app\\.js"
								},
								"description": {
									"type": "string",
									"example": "Script detectado"
								}
							}
						}
					}
				}
			},
			"PaginatedTechResponse": {
				"type": "object",
				"properties": {
					"success": {
						"type": "boolean",
						"example": true
					},
					"total": {
						"type": "integer",
						"example": 143
					},
					"page": {
						"type": "integer",
						"example": 1
					},
					"limit": {
						"type": "integer",
						"example": 5
					},
					"totalPages": {
						"type": "integer",
						"example": 29
					},
					"data": {
						"type": "array",
						"items": {
							"$ref": "#/components/schemas/TechItem"
						}
					}
				}
			},
			"TechSingleResponse": {
				"type": "object",
				"properties": {
					"success": {
						"type": "boolean",
						"example": true
					},
					"data": {
						"$ref": "#/components/schemas/TechItem"
					}
				}
			},
			"ScreenshotsFullResponse": {
				"type": "object",
				"properties": {
					"success": {
						"type": "boolean",
						"example": true
					},
					"url": {
						"type": "string",
						"example": "https://shopify.com"
					},
					"device": {
						"type": "string",
						"example": "desktop"
					},
					"screenshot": {
						"type": "string",
						"example": "/screenshots/desktop-shopify.com.png?v=12345"
					},
					"screenshots": {
						"type": "object",
						"properties": {
							"desktop": {
								"type": "string",
								"example": "/screenshots/desktop-shopify.com.png?v=12345"
							},
							"mobile": {
								"type": "string",
								"example": "/screenshots/mobile-shopify.com.png?v=12345"
							}
						}
					}
				}
			},
			"ScreenshotsDeleteResponse": {
				"type": "object",
				"properties": {
					"success": {
						"type": "boolean",
						"example": true
					},
					"message": {
						"type": "string",
						"example": "Se eliminaron 2 capturas para shopify.com."
					},
					"domain": {
						"type": "string",
						"example": "shopify.com"
					},
					"deletedFiles": {
						"type": "array",
						"items": {
							"type": "string"
						},
						"example": [
							"desktop-shopify.com.png",
							"mobile-shopify.com.png"
						]
					}
				}
			}
		}
	}
}
