{"openapi":"3.0.0","paths":{"/v1/keys":{"post":{"description":"Genera una API key de plan FREE para probar el resto de la API. La clave completa solo se muestra en esta respuesta.","operationId":"KeysController_create_v1","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateKeyDto"}}}},"responses":{"201":{"description":""}},"summary":"Crear una API key (demo)","tags":["API Keys"]}},"/v1/keys/me":{"get":{"description":"Devuelve los metadatos de la API key usada en la petición.","operationId":"KeysController_me_v1","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Información de la API key actual","tags":["API Keys"]}},"/v1/links":{"post":{"operationId":"LinksController_create_v1","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateLinkDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Crear un enlace corto","tags":["Links"]},"get":{"operationId":"LinksController_list_v1","parameters":[{"name":"cursor","required":false,"in":"query","description":"Cursor de paginación (id del último elemento de la página previa).","schema":{"type":"string"}},{"name":"limit","required":false,"in":"query","description":"Cantidad de elementos por página (1-100).","schema":{"minimum":1,"maximum":100,"default":20,"allOf":[{"$ref":"#/components/schemas/Object"}]}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Listar mis enlaces (paginación por cursor)","tags":["Links"]}},"/v1/links/{code}/stats":{"get":{"description":"Clics totales, desglose por dispositivo, navegador, país, top referrers y timeline diaria.","operationId":"LinksController_stats_v1","parameters":[{"name":"code","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Analytics de un enlace","tags":["Links"]}},"/v1/links/{code}/qr":{"get":{"description":"Genera un código QR que apunta al shortUrl del enlace.","operationId":"LinksController_qrCode_v1","parameters":[{"name":"code","required":true,"in":"path","schema":{"type":"string"}},{"name":"format","required":false,"in":"query","schema":{"default":"png","type":"string","enum":["png","svg"]}},{"name":"size","required":false,"in":"query","schema":{"minimum":64,"maximum":1024,"default":256,"allOf":[{"$ref":"#/components/schemas/Object"}]}},{"name":"margin","required":false,"in":"query","schema":{"minimum":0,"maximum":10,"default":2,"allOf":[{"$ref":"#/components/schemas/Object"}]}},{"name":"dark","required":false,"in":"query","schema":{"default":"#000000","allOf":[{"$ref":"#/components/schemas/Object"}]}},{"name":"light","required":false,"in":"query","schema":{"default":"#FFFFFF","allOf":[{"$ref":"#/components/schemas/Object"}]}},{"name":"ecLevel","required":false,"in":"query","schema":{"default":"M","type":"string","enum":["L","M","Q","H"]}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"QR del enlace corto","tags":["Links"]}},"/v1/qr":{"post":{"description":"Devuelve la imagen del QR (PNG por defecto, o SVG).","operationId":"QrController_create_v1","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateQrDto"}}}},"responses":{"200":{"description":"Imagen del QR","content":{"image/png":{"schema":{"type":"string","format":"binary"}},"image/svg+xml":{"schema":{"type":"string"}}}}},"security":[{"bearer":[]}],"summary":"Generar un código QR","tags":["QR"]}},"/v1/mock/users":{"get":{"description":"Datos de prueba realistas. Usa `seed` para resultados reproducibles.","operationId":"MockController_users_v1","parameters":[{"name":"count","required":false,"in":"query","description":"Cantidad de usuarios a generar (1-100).","schema":{"minimum":1,"maximum":100,"default":10,"allOf":[{"$ref":"#/components/schemas/Object"}]}},{"name":"locale","required":false,"in":"query","description":"Locale de los datos.","schema":{"default":"en","type":"string","enum":["en","es"]}},{"name":"seed","required":false,"in":"query","description":"Semilla para resultados reproducibles (mismo seed → mismos datos).","schema":{"example":42,"type":"number"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Generar usuarios fake","tags":["Toolbox"]}},"/v1/tools/uuid":{"get":{"operationId":"ToolsController_uuid_v1","parameters":[{"name":"count","required":false,"in":"query","description":"Cantidad de UUID v4 a generar (1-100).","schema":{"minimum":1,"maximum":100,"default":1,"allOf":[{"$ref":"#/components/schemas/Object"}]}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Generar UUID v4","tags":["Toolbox"]}},"/v1/tools/slugify":{"post":{"operationId":"ToolsController_slugify_v1","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SlugifyDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Convertir texto en slug URL-safe","tags":["Toolbox"]}},"/v1/tools/password":{"get":{"description":"Contraseñas aleatorias con crypto. Configura longitud, conjuntos de caracteres, exclusión de confundibles y cantidad. Devuelve entropía y fuerza.","operationId":"ToolsController_password_v1","parameters":[{"name":"length","required":false,"in":"query","description":"Longitud de cada contraseña.","schema":{"minimum":8,"maximum":128,"default":16,"allOf":[{"$ref":"#/components/schemas/Object"}]}},{"name":"uppercase","required":false,"in":"query","description":"Incluir mayúsculas (A-Z).","schema":{"default":true,"allOf":[{"$ref":"#/components/schemas/Object"}]}},{"name":"lowercase","required":false,"in":"query","description":"Incluir minúsculas (a-z).","schema":{"default":true,"allOf":[{"$ref":"#/components/schemas/Object"}]}},{"name":"numbers","required":false,"in":"query","description":"Incluir números (0-9).","schema":{"default":true,"allOf":[{"$ref":"#/components/schemas/Object"}]}},{"name":"symbols","required":false,"in":"query","description":"Incluir símbolos (!@#$…).","schema":{"default":true,"allOf":[{"$ref":"#/components/schemas/Object"}]}},{"name":"excludeSimilar","required":false,"in":"query","description":"Excluir caracteres confundibles (i, l, 1, L, o, 0, O).","schema":{"default":false,"allOf":[{"$ref":"#/components/schemas/Object"}]}},{"name":"count","required":false,"in":"query","description":"Cantidad de contraseñas a generar.","schema":{"minimum":1,"maximum":50,"default":1,"allOf":[{"$ref":"#/components/schemas/Object"}]}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Generar contraseñas seguras","tags":["Toolbox"]}},"/v1/validate/credit-card":{"post":{"description":"Comprueba el número con el algoritmo de Luhn e identifica la marca (visa, mastercard, amex, discover, diners, jcb).","operationId":"ValidateController_creditCard_v1","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreditCardDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Validar tarjeta (Luhn) y detectar marca","tags":["Toolbox"]}},"/v1/convert/units":{"get":{"description":"Longitud, masa, volumen, área, velocidad, tiempo, almacenamiento digital y temperatura.","operationId":"ConvertController_units_v1","parameters":[{"name":"value","required":true,"in":"query","description":"Valor a convertir.","schema":{"example":100,"type":"number"}},{"name":"from","required":true,"in":"query","description":"Unidad origen. Categorías: length (m,km,cm,mm,mi,yd,ft,in,nmi), mass (g,kg,mg,t,lb,oz,st), volume (l,ml,m3,gal,qt,pt,cup,floz), area (m2,km2,cm2,ha,acre,ft2,mi2), speed (m/s,km/h,mph,kn,ft/s), time (s,ms,min,h,d,wk), data (B,KB,MB,GB,TB,bit,Kb,Mb,Gb), temperature (C,F,K).","schema":{"example":"km","type":"string"}},{"name":"to","required":true,"in":"query","description":"Unidad destino (misma categoría que el origen).","schema":{"example":"mi","type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Convertir unidades","tags":["Conversiones"]}},"/v1/convert/currency":{"get":{"description":"Tasas de cambio en vivo (~160 divisas), cacheadas hasta la próxima actualización.","operationId":"ConvertController_currency_v1","parameters":[{"name":"amount","required":true,"in":"query","description":"Importe a convertir.","schema":{"example":100,"type":"number"}},{"name":"from","required":true,"in":"query","description":"Moneda origen (código ISO 4217).","schema":{"example":"USD","type":"string"}},{"name":"to","required":true,"in":"query","description":"Moneda destino (código ISO 4217).","schema":{"example":"EUR","type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Convertir monedas","tags":["Conversiones"]}},"/health":{"get":{"operationId":"HealthController_check","parameters":[],"responses":{"200":{"description":""}},"summary":"Estado del servicio","tags":["Health"]}}},"info":{"title":"KolisKit API","description":"Toolbox de utilidades para desarrolladores: enlaces cortos con analytics, QR y más. Crea una API key en `POST /v1/keys` y úsala como `Authorization: Bearer <key>`.","version":"1.0","contact":{}},"tags":[],"servers":[],"components":{"securitySchemes":{"bearer":{"scheme":"bearer","bearerFormat":"JWT","type":"http","description":"Tu API key de KolisKit"}},"schemas":{"CreateKeyDto":{"type":"object","properties":{"name":{"type":"string","description":"Nombre descriptivo para identificar la API key.","example":"Mi app de prueba","minLength":2,"maxLength":60}},"required":["name"]},"CreateLinkDto":{"type":"object","properties":{"targetUrl":{"type":"string","description":"URL de destino a la que apuntará el enlace corto.","example":"https://docs.koliskit.dev/getting-started"},"code":{"type":"string","description":"Código personalizado (3-32 caracteres alfanuméricos, \"-\" o \"_\"). Si se omite, se genera uno automáticamente.","example":"mi-enlace"},"expiresAt":{"type":"string","description":"Fecha de expiración en formato ISO 8601 (opcional).","example":"2026-12-31T23:59:59.000Z"}},"required":["targetUrl"]},"Object":{"type":"object","properties":{}},"CreateQrDto":{"type":"object","properties":{"data":{"type":"string","description":"Texto o URL a codificar en el QR.","example":"https://koliskit.dev"},"format":{"type":"string","description":"Formato de salida.","enum":["png","svg"],"default":"png"},"size":{"type":"object","description":"Lado de la imagen en píxeles (solo PNG).","minimum":64,"maximum":1024,"default":256},"margin":{"type":"object","description":"Margen (módulos) alrededor del QR.","minimum":0,"maximum":10,"default":2},"dark":{"type":"object","description":"Color de los módulos (hex).","default":"#000000"},"light":{"type":"object","description":"Color de fondo (hex).","default":"#FFFFFF"},"ecLevel":{"type":"string","description":"Nivel de corrección de errores.","enum":["L","M","Q","H"],"default":"M"}},"required":["data"]},"SlugifyDto":{"type":"object","properties":{"text":{"type":"string","description":"Texto a convertir en slug.","example":"Canción del Ñandú: ¡Hola Mundo!"},"separator":{"type":"string","description":"Separador entre palabras.","enum":["-","_"],"default":"-"}},"required":["text"]},"CreditCardDto":{"type":"object","properties":{"number":{"type":"string","description":"Número de tarjeta (se aceptan espacios y guiones).","example":"4242 4242 4242 4242"}},"required":["number"]}}}}