{"openapi":"3.1.0","info":{"title":"Crocantísimo — API pública","version":"1.0.0","summary":"Endpoints públicos de Crocantísimo para agentes e integraciones.","description":"Crocantísimo es una plataforma argentina para comer mejor: recetarios en PDF que se descargan gratis y Crocán, un acompañante de alimentación y hábitos con IA. Esta API expone las operaciones públicas: buscar guías del blog, pedir la descarga gratuita de un recetario y suscribirse a la guía de tiempos. Para el resumen navegable del sitio ver /llms.txt.","contact":{"name":"Crocantísimo","email":"hola@crocantisimo.app","url":"https://crocantisimo.app"},"license":{"name":"Uso propietario","url":"https://crocantisimo.app/terminos"}},"servers":[{"url":"https://crocantisimo.app","description":"Producción"}],"externalDocs":{"description":"Documentación para desarrolladores y agentes","url":"https://crocantisimo.app/docs"},"tags":[{"name":"Contenido","description":"Descubrimiento de guías y recetarios."},{"name":"Herramientas","description":"Calculadoras de cocina (asado, fiesta) que devuelven cantidades."},{"name":"Leads","description":"Captura de email y descarga gratuita."}],"paths":{"/api/asado":{"get":{"operationId":"calcularAsado","tags":["Herramientas"],"summary":"Calcular cuánta comida comprar para un asado","description":"Devuelve cuánta carne, chorizos, achuras, pan, ensalada, bebida, carbón e hielo comprar para un asado argentino según los comensales y el apetito. Solo lectura, sin autenticación. Misma lógica que la web /calculadora-asado.","parameters":[{"name":"adultos","in":"query","required":false,"description":"Cantidad de adultos (default 8).","schema":{"type":"integer","minimum":0,"default":8}},{"name":"ninos","in":"query","required":false,"description":"Cantidad de niños (cuentan como medio comensal).","schema":{"type":"integer","minimum":0,"default":0}},{"name":"apetito","in":"query","required":false,"description":"Apetito del grupo.","schema":{"type":"string","enum":["liviano","normal","con ganas"],"default":"normal"}},{"name":"entrada","in":"query","required":false,"description":"Incluir chorizos y morcilla como entrada.","schema":{"type":"boolean","default":true}},{"name":"achuras","in":"query","required":false,"description":"Incluir achuras (mollejas, chinchulines).","schema":{"type":"boolean","default":false}},{"name":"provoleta","in":"query","required":false,"description":"Incluir provoleta a la parrilla.","schema":{"type":"boolean","default":true}}],"responses":{"200":{"description":"Cantidades estimadas para el asado.","content":{"application/json":{"schema":{"type":"object","required":["comensales","carneKg","items"],"properties":{"comensales":{"type":"number","description":"Comensales equivalentes (adulto=1, niño=0,5)."},"carneKg":{"type":"number","description":"Kilos de carne (cortes de parrilla) totales."},"items":{"type":"array","items":{"type":"object","required":["item","cantidad"],"properties":{"item":{"type":"string","description":"Qué comprar (ej. Chorizos)."},"cantidad":{"type":"string","description":"Cantidad formateada (ej. '8 u.', '3,6 kg')."},"nota":{"type":"string","nullable":true}}}},"fuente":{"type":"string"}}}}}}}}},"/api/punto-carne":{"get":{"operationId":"temperaturasCarne","tags":["Herramientas"],"summary":"Temperaturas de la carne (puntos de cocción y seguridad)","description":"Temperatura interna de cada punto de la carne vacuna (jugoso a bien cocido) y temperaturas mínimas de seguridad de pollo, cerdo y carne picada. Solo lectura, sin auth. Responde 'a qué temperatura la carne a punto' y 'temperatura segura del pollo'.","responses":{"200":{"description":"Puntos de cocción y temperaturas de seguridad.","content":{"application/json":{"schema":{"type":"object","required":["puntos","seguridad"],"properties":{"puntos":{"type":"array","items":{"type":"object","properties":{"punto":{"type":"string"},"temperaturaInterna":{"type":"string","description":"Ej. '60–65 °C'."},"comoQueda":{"type":"string"}}}},"seguridad":{"type":"array","items":{"type":"object","properties":{"alimento":{"type":"string"},"temperaturaMinima":{"type":"string"},"nota":{"type":"string"}}}}}}}}}}}},"/api/molde":{"get":{"operationId":"adaptarMolde","tags":["Herramientas"],"summary":"Factor para adaptar una receta a otro molde","description":"Dado el molde original y el que tenés, devuelve el factor por el que multiplicar los ingredientes (escala por relación de áreas, mismo espesor de masa). Solo lectura, sin auth. Formato del molde: 'forma:medida' (redondo:20, cuadrado:22, rectangular:20x30).","parameters":[{"name":"origen","in":"query","required":true,"description":"Molde original, formato forma:medida.","schema":{"type":"string"},"example":"redondo:20"},{"name":"destino","in":"query","required":true,"description":"Molde que tenés, formato forma:medida.","schema":{"type":"string"},"example":"redondo:24"}],"responses":{"200":{"description":"Factor de adaptación entre moldes.","content":{"application/json":{"schema":{"type":"object","required":["origen","destino","factor"],"properties":{"origen":{"type":"string"},"destino":{"type":"string"},"areaOrigenCm2":{"type":"integer"},"areaDestinoCm2":{"type":"integer"},"factor":{"type":"number"},"como":{"type":"string"}}}}}},"400":{"description":"Molde inválido (JSON con error y hint)."}}}},"/api/porciones":{"get":{"operationId":"ajustarPorciones","tags":["Herramientas"],"summary":"Factor para ajustar una receta a otras porciones","description":"Dado las porciones originales y las deseadas, devuelve el factor por el que multiplicar cada ingrediente. Solo lectura, sin auth. Responde 'por cuánto multiplico de 4 a 6 porciones'.","parameters":[{"name":"de","in":"query","required":false,"description":"Porciones originales (default 4).","schema":{"type":"number","minimum":1,"default":4}},{"name":"a","in":"query","required":false,"description":"Porciones deseadas (default 8).","schema":{"type":"number","minimum":1,"default":8}}],"responses":{"200":{"description":"Factor de ajuste.","content":{"application/json":{"schema":{"type":"object","required":["porcionesOriginales","porcionesDeseadas","factor"],"properties":{"porcionesOriginales":{"type":"number"},"porcionesDeseadas":{"type":"number"},"factor":{"type":"number","description":"Multiplicá cada ingrediente por este número."},"como":{"type":"string"}}}}}}}}},"/api/guarniciones":{"get":{"operationId":"calcularGuarniciones","tags":["Herramientas"],"summary":"Cuánta guarnición cocinar por persona","description":"Dado un número de comensales, devuelve cuánto arroz, fideos, papas, polenta, puré y legumbres cocinar (peso seco/crudo). Solo lectura, sin auth. Misma lógica que /calculadora-guarniciones. Responde 'cuánto arroz por persona' y similares.","parameters":[{"name":"comensales","in":"query","required":false,"description":"Cantidad de personas (default 6).","schema":{"type":"integer","minimum":1,"default":6}}],"responses":{"200":{"description":"Cantidades por guarnición para esos comensales.","content":{"application/json":{"schema":{"type":"object","required":["comensales","items"],"properties":{"comensales":{"type":"integer"},"items":{"type":"array","items":{"type":"object","required":["guarnicion","cantidad"],"properties":{"guarnicion":{"type":"string"},"cantidad":{"type":"string","description":"Formateada (ej. '420 g', '1,2 kg')."},"gramos":{"type":"integer"},"nota":{"type":"string"}}}},"fuente":{"type":"string"}}}}}}}}},"/api/fiesta":{"get":{"operationId":"calcularFiesta","tags":["Herramientas"],"summary":"Calcular cuánta comida comprar para una fiesta o cumpleaños","description":"Devuelve cuántas empanadas, pizzas, picada, torta, bebida e hielo comprar para una fiesta o cumpleaños según los invitados y el momento (previa/cumpleaños/cena). Solo lectura, sin auth. Misma lógica que la web /calculadora-fiesta.","parameters":[{"name":"adultos","in":"query","required":false,"description":"Cantidad de adultos (default 15).","schema":{"type":"integer","minimum":0,"default":15}},{"name":"ninos","in":"query","required":false,"description":"Cantidad de niños (cuentan como medio invitado).","schema":{"type":"integer","minimum":0,"default":0}},{"name":"momento","in":"query","required":false,"description":"Tipo de evento.","schema":{"type":"string","enum":["previa","cumple","cena"],"default":"cumple"}},{"name":"empanadas","in":"query","required":false,"schema":{"type":"boolean","default":true}},{"name":"pizza","in":"query","required":false,"schema":{"type":"boolean","default":true}},{"name":"picada","in":"query","required":false,"schema":{"type":"boolean","default":true}},{"name":"torta","in":"query","required":false,"schema":{"type":"boolean","default":true}}],"responses":{"200":{"description":"Cantidades estimadas para la fiesta.","content":{"application/json":{"schema":{"type":"object","required":["invitados","items"],"properties":{"invitados":{"type":"number","description":"Invitados equivalentes (adulto=1, niño=0,5)."},"items":{"type":"array","items":{"type":"object","required":["item","cantidad"],"properties":{"item":{"type":"string"},"cantidad":{"type":"string"},"nota":{"type":"string","nullable":true}}}},"fuente":{"type":"string"}}}}}}}}},"/api/recipes/search":{"get":{"operationId":"searchRecipes","tags":["Contenido"],"summary":"Buscar recetas argentinas por nombre","description":"Busca en el corpus de recetas públicas de Crocantísimo (freidora de aire y demás recetarios), la superficie más citable del sitio. Devuelve nombre, categoría, porciones, tiempo y la URL de cada receta; el contenido completo (ingredientes + pasos) se obtiene pidiendo esa URL con 'Accept: text/markdown'. Solo lectura, sin autenticación.","parameters":[{"name":"q","in":"query","required":true,"description":"Texto de búsqueda por nombre de receta.","schema":{"type":"string"},"example":"milanesa"},{"name":"limit","in":"query","required":false,"description":"Cantidad máxima de resultados (1–40, default 12).","schema":{"type":"integer","minimum":1,"maximum":40,"default":12}}],"responses":{"200":{"description":"Recetas que coinciden con la búsqueda.","content":{"application/json":{"schema":{"type":"object","required":["total","results"],"properties":{"total":{"type":"integer"},"results":{"type":"array","items":{"type":"object","required":["slug","nombre","url"],"properties":{"slug":{"type":"string"},"nombre":{"type":"string"},"emoji":{"type":"string"},"categoria":{"type":"string"},"recetario":{"type":"string","description":"Recetario de origen (ej. Air Fryer)."},"porciones":{"type":"integer"},"tiempoMin":{"type":"integer","description":"Tiempo de preparación en minutos."},"dificultad":{"type":"string"},"url":{"type":"string","description":"URL de la receta (HTML o Markdown vía Accept)."}}}}}}}}}}}},"/api/recipes/pantry":{"get":{"operationId":"recetasConLoQueTengo","tags":["Contenido"],"summary":"Cocinar con lo que tengo (recetas por ingredientes disponibles)","description":"Dado lo que el usuario tiene en la despensa, devuelve recetas rankeadas por cobertura (cuántos de sus ingredientes ya tenés) e indica qué falta. Solo lectura, sin autenticación. Misma lógica que /cocinar-con-lo-que-tengo. Ideal para 'qué puedo cocinar con pollo y papa'.","parameters":[{"name":"tengo","in":"query","required":true,"description":"Ingredientes disponibles, separados por coma.","schema":{"type":"string"},"example":"pollo,papa,huevo"},{"name":"limit","in":"query","required":false,"description":"Cantidad máxima de resultados (1–30, default 10).","schema":{"type":"integer","minimum":1,"maximum":30,"default":10}}],"responses":{"200":{"description":"Recetas ordenadas por cuánto se cubren con la despensa.","content":{"application/json":{"schema":{"type":"object","required":["tengo","total","results"],"properties":{"tengo":{"type":"array","items":{"type":"string"}},"total":{"type":"integer"},"results":{"type":"array","items":{"type":"object","required":["slug","nombre","cobertura","url"],"properties":{"slug":{"type":"string"},"nombre":{"type":"string"},"cobertura":{"type":"integer","description":"% de ingredientes de la receta que ya tenés."},"tenes":{"type":"integer","description":"Ingredientes cubiertos."},"deTotal":{"type":"integer","description":"Ingredientes totales de la receta."},"teFalta":{"type":"array","items":{"type":"string"},"description":"Ingredientes que faltan."},"url":{"type":"string"}}}}}}}}}}}},"/api/blog/search":{"get":{"operationId":"searchBlog","tags":["Contenido"],"summary":"Buscar guías del blog","description":"Busca en el blog de Crocantísimo (guías de cocina en freidora de aire, ideas y trucos, pensadas para Argentina). Devuelve los resultados rankeados por relevancia. Endpoint de solo lectura, sin autenticación.","parameters":[{"name":"q","in":"query","required":false,"description":"Texto de búsqueda (título, categoría, descripción, keywords).","schema":{"type":"string"},"example":"papas fritas"},{"name":"cat","in":"query","required":false,"description":"Slug de categoría para acotar la búsqueda.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Cantidad máxima de resultados (1–60, default 24).","schema":{"type":"integer","minimum":1,"maximum":60,"default":24}},{"name":"offset","in":"query","required":false,"description":"Desplazamiento para paginar.","schema":{"type":"integer","minimum":0,"default":0}}],"responses":{"200":{"description":"Resultados de la búsqueda.","content":{"application/json":{"schema":{"type":"object","required":["total","results"],"properties":{"total":{"type":"integer","description":"Total de coincidencias."},"results":{"type":"array","items":{"type":"object","required":["slug","title"],"properties":{"slug":{"type":"string","description":"Slug del post; la URL es /blog/{slug}."},"title":{"type":"string"},"category":{"type":"string"},"emoji":{"type":"string"},"description":{"type":"string"},"minutes":{"type":"integer","description":"Minutos de lectura."}}}}}}}}}}}},"/api/free-download":{"post":{"operationId":"requestFreeRecetario","tags":["Leads"],"summary":"Descargar gratis un recetario","description":"Solicita la descarga gratuita de un recetario. Otorga el acceso al email indicado y envía por correo el PDF (o el link de descarga). Idempotente por (email, recetario).","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["email","slug"],"properties":{"email":{"type":"string","format":"email","description":"Email de entrega."},"slug":{"type":"string","description":"Identificador del recetario (ver /llms.txt). Ej: air-fryer.","example":"air-fryer"},"name":{"type":"string","description":"Nombre del destinatario (opcional)."}}}}}},"responses":{"200":{"description":"Recetario entregado; se abre sesión automáticamente.","content":{"application/json":{"schema":{"type":"object","required":["ok"],"properties":{"ok":{"type":"boolean","enum":[true]},"accountUrl":{"type":"string","description":"URL de la cuenta del usuario."}}}}}},"400":{"description":"Email inválido o body malformado.","content":{"application/json":{"schema":{"type":"object","required":["ok","error","code","message"],"properties":{"ok":{"type":"boolean","enum":[false]},"error":{"type":"string","description":"Código de error estable (compat).","example":"email_invalido"},"code":{"type":"string","description":"Código de error estable.","example":"email_invalido"},"message":{"type":"string","description":"Mensaje legible del error."},"hint":{"type":"string","description":"Pista concreta para resolver el error."}}}}}},"404":{"description":"Recetario inexistente o no disponible gratis.","content":{"application/json":{"schema":{"type":"object","required":["ok","error","code","message"],"properties":{"ok":{"type":"boolean","enum":[false]},"error":{"type":"string","description":"Código de error estable (compat).","example":"email_invalido"},"code":{"type":"string","description":"Código de error estable.","example":"email_invalido"},"message":{"type":"string","description":"Mensaje legible del error."},"hint":{"type":"string","description":"Pista concreta para resolver el error."}}}}}},"502":{"description":"Fallo transitorio de entrega.","content":{"application/json":{"schema":{"type":"object","required":["ok","error","code","message"],"properties":{"ok":{"type":"boolean","enum":[false]},"error":{"type":"string","description":"Código de error estable (compat).","example":"email_invalido"},"code":{"type":"string","description":"Código de error estable.","example":"email_invalido"},"message":{"type":"string","description":"Mensaje legible del error."},"hint":{"type":"string","description":"Pista concreta para resolver el error."}}}}}}}}},"/api/lead":{"post":{"operationId":"requestTiemposGuide","tags":["Leads"],"summary":"Recibir la guía de tiempos y temperaturas","description":"Captura un email y envía por correo la tabla imprimible de tiempos y temperaturas para freidora de aire (PDF). Sin autenticación.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["email"],"properties":{"email":{"type":"string","format":"email","description":"Email de entrega."}}}}}},"responses":{"200":{"description":"Email enviado.","content":{"application/json":{"schema":{"type":"object","required":["ok"],"properties":{"ok":{"type":"boolean","enum":[true]}}}}}},"400":{"description":"Email inválido.","content":{"application/json":{"schema":{"type":"object","required":["ok","error","code","message"],"properties":{"ok":{"type":"boolean","enum":[false]},"error":{"type":"string","description":"Código de error estable (compat).","example":"email_invalido"},"code":{"type":"string","description":"Código de error estable.","example":"email_invalido"},"message":{"type":"string","description":"Mensaje legible del error."},"hint":{"type":"string","description":"Pista concreta para resolver el error."}}}}}},"502":{"description":"Fallo transitorio de envío.","content":{"application/json":{"schema":{"type":"object","required":["ok","error","code","message"],"properties":{"ok":{"type":"boolean","enum":[false]},"error":{"type":"string","description":"Código de error estable (compat).","example":"email_invalido"},"code":{"type":"string","description":"Código de error estable.","example":"email_invalido"},"message":{"type":"string","description":"Mensaje legible del error."},"hint":{"type":"string","description":"Pista concreta para resolver el error."}}}}}}}}},"/llms.txt":{"get":{"operationId":"getLlmsTxt","tags":["Contenido"],"summary":"Resumen del sitio para LLMs (llmstxt.org)","description":"Devuelve un resumen estructurado en Markdown del sitio (recetarios, guías, cómo funciona, cuándo usar Crocantísimo), pensado para que los asistentes de IA entiendan y citen la plataforma.","responses":{"200":{"description":"Resumen en Markdown.","content":{"text/markdown":{"schema":{"type":"string"}}}}}}}},"components":{"schemas":{"Error":{"type":"object","required":["ok","error","code","message"],"properties":{"ok":{"type":"boolean","enum":[false]},"error":{"type":"string","description":"Código de error estable (compat).","example":"email_invalido"},"code":{"type":"string","description":"Código de error estable.","example":"email_invalido"},"message":{"type":"string","description":"Mensaje legible del error."},"hint":{"type":"string","description":"Pista concreta para resolver el error."}}}}}}