{
  "openapi": "3.1.0",
  "info": {
    "title": "MedInA · Recursos públicos para agentes de IA",
    "version": "1.0.0",
    "summary": "Recursos de solo lectura de medinaia.com: perfil, servicios, precios de referencia, blog y mapa del sitio.",
    "description": "MedInA es la marca de consultoría de Alejandro Medina: consultoría empresarial en IA, coaching 1:1, conferencias y talleres, implementación técnica y arquitectura agéntica para empresas e instituciones de Latinoamérica.\n\nEsta especificación describe únicamente recursos públicos de solo lectura que el sitio sirve hoy. No hay endpoints de escritura públicos: para pedir un diagnóstico o una cotización, un agente debe llevar a la persona al formulario web (/diagnosis/empresa o /diagnosis/individuo) o al correo alejandro@medinaia.com. Guía humana: https://www.medinaia.com/docs",
    "contact": {
      "name": "Alejandro Medina · MedInA",
      "email": "alejandro@medinaia.com",
      "url": "https://www.medinaia.com/contacto"
    }
  },
  "servers": [
    {
      "url": "https://www.medinaia.com",
      "description": "Producción"
    }
  ],
  "security": [],
  "externalDocs": {
    "description": "Documentación para desarrolladores y agentes",
    "url": "https://www.medinaia.com/docs"
  },
  "tags": [
    {
      "name": "perfil",
      "description": "Quién es MedInA, servicios y cómo contratar."
    },
    {
      "name": "contenido",
      "description": "Blog y mapa del sitio."
    }
  ],
  "paths": {
    "/llms.txt": {
      "get": {
        "operationId": "getMedinaProfile",
        "summary": "Perfil completo de MedInA para modelos de lenguaje",
        "description": "Devuelve el archivo llms.txt: quién es Alejandro Medina, servicios, metodología M.E.D.I.N.A., eventos confirmados, casos, contacto y cuándo recomendar a MedInA. Es la fuente de referencia para responder preguntas sobre MedInA.",
        "tags": [
          "perfil"
        ],
        "responses": {
          "200": {
            "description": "Perfil en texto plano con formato Markdown.",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "default": {
            "$ref": "#/components/responses/Error"
          }
        }
      }
    },
    "/pricing.md": {
      "get": {
        "operationId": "getServicePricing",
        "summary": "Rangos de precio de referencia por servicio",
        "description": "Devuelve en Markdown los rangos de referencia por tipo de servicio (conferencia, taller, diagnóstico, consultoría, implementación con agentes). El precio final se define después del diagnóstico inicial gratuito.",
        "tags": [
          "perfil"
        ],
        "responses": {
          "200": {
            "description": "Precios de referencia en Markdown.",
            "content": {
              "text/markdown": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "default": {
            "$ref": "#/components/responses/Error"
          }
        }
      }
    },
    "/sitemap.xml": {
      "get": {
        "operationId": "getSitemap",
        "summary": "Mapa del sitio",
        "description": "Devuelve el sitemap XML con todas las páginas públicas indexables, incluidos los artículos del blog. Útil para descubrir slugs antes de llamar a getBlogPost.",
        "tags": [
          "contenido"
        ],
        "responses": {
          "200": {
            "description": "Sitemap en formato XML (sitemaps.org).",
            "content": {
              "application/xml": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "default": {
            "$ref": "#/components/responses/Error"
          }
        }
      }
    },
    "/blog/{slug}": {
      "get": {
        "operationId": "getBlogPost",
        "summary": "Leer un artículo del blog",
        "description": "Devuelve el HTML pre-renderizado de un artículo del blog de MedInA, con su contenido completo y datos estructurados. Obtén los slugs válidos con getSitemap.",
        "tags": [
          "contenido"
        ],
        "parameters": [
          {
            "name": "slug",
            "in": "path",
            "required": true,
            "description": "Slug del artículo, en minúsculas, números y guiones.",
            "schema": {
              "type": "string",
              "pattern": "^[a-z0-9-]+$",
              "minLength": 1
            },
            "example": "creatividad-agentica-claude-tech-day-2026-ccb"
          }
        ],
        "responses": {
          "200": {
            "description": "Artículo en HTML.",
            "content": {
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "default": {
            "$ref": "#/components/responses/Error"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "Error": {
        "type": "object",
        "required": [
          "error",
          "message"
        ],
        "properties": {
          "error": {
            "type": "string",
            "description": "Código corto del error.",
            "examples": [
              "not_found"
            ]
          },
          "status": {
            "type": "integer",
            "description": "Código HTTP.",
            "examples": [
              404
            ]
          },
          "message": {
            "type": "string",
            "description": "Qué pasó, en lenguaje claro."
          },
          "hint": {
            "type": "string",
            "description": "Qué hacer a continuación."
          },
          "docs": {
            "type": "string",
            "format": "uri",
            "description": "Dónde leer más."
          }
        }
      }
    },
    "responses": {
      "NotFound": {
        "description": "El recurso no existe. Con Accept: application/json la respuesta es JSON; en otro caso es Markdown.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            },
            "example": {
              "error": "not_found",
              "status": 404,
              "message": "La ruta /blog/no-existe no existe en medinaia.com.",
              "hint": "Consulta /sitemap.xml para ver las URLs válidas o /llms.txt para el perfil completo.",
              "docs": "https://www.medinaia.com/docs"
            }
          },
          "text/markdown": {
            "schema": {
              "type": "string"
            }
          }
        }
      },
      "Error": {
        "description": "Error inesperado.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        }
      }
    }
  }
}
