{
  "openapi": "3.1.0",
  "info": {
    "title": "API de contenido de Maykolt Hernández",
    "version": "1.0.0",
    "summary": "Perfil, servicios, casos, notas y contacto de mykeweb.com en JSON.",
    "description": "API pública de solo lectura con el contenido del sitio mykeweb.com.\n\nDevuelve exactamente la misma información que ve una persona en la web:\nquién es Maykolt Hernández, qué servicios presta, qué proyectos ha entregado,\nqué ha escrito y cómo contactarlo.\n\nSin autenticación, sin límite de uso declarado y con CORS abierto: no hay\ndatos privados. Es contenido estático, así que las respuestas son inmediatas\ny no hay efectos secundarios.\n\nPara consumir el contenido como texto en vez de JSON, cada página admite\n`Accept: text/markdown`, y hay un resumen completo en /llms.txt",
    "contact": {
      "name": "Maykolt Hernández",
      "email": "hola@mykeweb.com",
      "url": "https://mykeweb.com/contacto/"
    },
    "license": {
      "name": "Contenido del sitio, uso con atribución",
      "url": "https://mykeweb.com/privacidad/"
    }
  },
  "servers": [
    {
      "url": "https://mykeweb.com",
      "description": "Producción"
    }
  ],
  "externalDocs": {
    "description": "Documentación de la API",
    "url": "https://mykeweb.com/docs/"
  },
  "tags": [
    {
      "name": "perfil",
      "description": "Quién es y a qué se dedica."
    },
    {
      "name": "servicios",
      "description": "Qué trabajos hace."
    },
    {
      "name": "casos",
      "description": "Proyectos entregados, con detalle técnico."
    },
    {
      "name": "notas",
      "description": "Artículos publicados."
    },
    {
      "name": "contacto",
      "description": "Cómo iniciar una conversación."
    }
  ],
  "paths": {
    "/api/index.json": {
      "get": {
        "operationId": "obtenerIndiceApi",
        "summary": "Índice de recursos",
        "description": "Lista todos los recursos disponibles en esta API y los enlaces a la especificación y la documentación. Útil como punto de entrada.",
        "tags": [
          "perfil"
        ],
        "responses": {
          "200": {
            "description": "Índice de recursos.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Indice"
                }
              }
            }
          }
        }
      }
    },
    "/api/perfil.json": {
      "get": {
        "operationId": "obtenerPerfil",
        "summary": "Perfil profesional",
        "description": "Datos de identidad y posicionamiento: rol, ubicación, zona de trabajo, años de experiencia, partners oficiales y métricas de trayectoria. Úsalo para responder quién es Maykolt Hernández o si atiende una zona concreta.",
        "tags": [
          "perfil"
        ],
        "responses": {
          "200": {
            "description": "Perfil profesional.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Perfil"
                }
              }
            }
          }
        }
      }
    },
    "/api/servicios.json": {
      "get": {
        "operationId": "listarServicios",
        "summary": "Servicios que presta",
        "description": "Los cuatro frentes de trabajo con el detalle de lo que incluye cada uno. Úsalo para saber si un problema concreto entra dentro de lo que hace.",
        "tags": [
          "servicios"
        ],
        "responses": {
          "200": {
            "description": "Lista de servicios.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Servicio"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/casos.json": {
      "get": {
        "operationId": "listarCasos",
        "summary": "Proyectos entregados",
        "description": "Listado de casos reales con cliente, sector, resumen y tecnologías. Úsalo para comprobar si tiene experiencia previa en un sector o con una tecnología.",
        "tags": [
          "casos"
        ],
        "responses": {
          "200": {
            "description": "Lista de casos.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ListaCasos"
                }
              }
            }
          }
        }
      }
    },
    "/api/casos/{id}.json": {
      "get": {
        "operationId": "obtenerCaso",
        "summary": "Detalle de un caso",
        "description": "Ficha completa de un proyecto: el reto de partida, qué se construyó punto por punto, las tecnologías empleadas y el artículo completo.",
        "tags": [
          "casos"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Identificador del caso.",
            "schema": {
              "type": "string",
              "enum": [
                "crm-parkland",
                "hosteria-del-parque",
                "angela-mediqal",
                "academia-niif-opportune",
                "mifex"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Detalle del caso.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CasoDetalle"
                }
              }
            }
          },
          "404": {
            "description": "El recurso no existe.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/notas.json": {
      "get": {
        "operationId": "listarNotas",
        "summary": "Artículos publicados",
        "description": "Listado de artículos con título, descripción, grupo temático, fecha y tiempo de lectura.",
        "tags": [
          "notas"
        ],
        "responses": {
          "200": {
            "description": "Lista de notas.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ListaNotas"
                }
              }
            }
          }
        }
      }
    },
    "/api/notas/{id}.json": {
      "get": {
        "operationId": "obtenerNota",
        "summary": "Detalle de un artículo",
        "description": "Artículo completo en markdown, con sus preguntas frecuentes. Úsalo cuando necesites el contenido íntegro para responder una duda técnica.",
        "tags": [
          "notas"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Identificador del artículo.",
            "schema": {
              "type": "string",
              "enum": [
                "que-es-un-crm",
                "automatizacion-de-procesos",
                "por-que-fracasa-la-implementacion-de-un-crm",
                "tipos-de-crm",
                "whatsapp-business-api"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Detalle del artículo.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotaDetalle"
                }
              }
            }
          },
          "404": {
            "description": "El recurso no existe.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/productos.json": {
      "get": {
        "operationId": "listarProductos",
        "summary": "Software propio",
        "description": "Los productos que ha construido y mantiene en producción, con su estado y su sitio.",
        "tags": [
          "servicios"
        ],
        "responses": {
          "200": {
            "description": "Lista de productos.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Producto"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/testimonios.json": {
      "get": {
        "operationId": "listarTestimonios",
        "summary": "Testimonios de clientes",
        "description": "Citas de clientes con nombre y organización.",
        "tags": [
          "perfil"
        ],
        "responses": {
          "200": {
            "description": "Lista de testimonios.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Testimonio"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/contacto.json": {
      "get": {
        "operationId": "obtenerContacto",
        "summary": "Cómo contactarlo",
        "description": "Canales de contacto y qué esperar de la primera conversación. El canal principal es WhatsApp y el enlace admite un mensaje inicial en el parámetro text. No hay formularios en el sitio.",
        "tags": [
          "contacto"
        ],
        "responses": {
          "200": {
            "description": "Datos de contacto.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Contacto"
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "Indice": {
        "type": "object",
        "required": [
          "nombre",
          "version",
          "recursos"
        ],
        "properties": {
          "nombre": {
            "type": "string"
          },
          "version": {
            "type": "string"
          },
          "descripcion": {
            "type": "string"
          },
          "openapi": {
            "type": "string",
            "format": "uri"
          },
          "documentacion": {
            "type": "string",
            "format": "uri"
          },
          "llms": {
            "type": "string",
            "format": "uri"
          },
          "recursos": {
            "type": "object",
            "additionalProperties": {
              "type": "string",
              "format": "uri"
            }
          }
        }
      },
      "Perfil": {
        "type": "object",
        "required": [
          "nombre",
          "rol",
          "ubicacion"
        ],
        "properties": {
          "nombre": {
            "type": "string",
            "examples": [
              "Maykolt Hernández"
            ]
          },
          "alias": {
            "type": "string"
          },
          "titular": {
            "type": "string"
          },
          "rol": {
            "type": "string"
          },
          "descripcion": {
            "type": "string"
          },
          "criterio": {
            "type": "string",
            "description": "Criterio con el que prioriza un proyecto."
          },
          "ubicacion": {
            "type": "object",
            "properties": {
              "ciudad": {
                "type": "string"
              },
              "region": {
                "type": "string"
              },
              "pais": {
                "type": "string",
                "description": "Código ISO 3166-1 alfa-2."
              }
            }
          },
          "zonaDeTrabajo": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "idiomas": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "experienciaAnios": {
            "type": "integer"
          },
          "cargoActual": {
            "type": "string"
          },
          "partners": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "metricas": {
            "type": "object",
            "additionalProperties": {
              "type": "integer"
            }
          },
          "web": {
            "type": "string",
            "format": "uri"
          },
          "actualizado": {
            "type": "string",
            "format": "date"
          }
        }
      },
      "Servicio": {
        "type": "object",
        "required": [
          "id",
          "nombre",
          "resumen"
        ],
        "properties": {
          "id": {
            "type": "string",
            "examples": [
              "crm"
            ]
          },
          "nombre": {
            "type": "string"
          },
          "resumen": {
            "type": "string"
          },
          "incluye": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "web": {
            "type": "string",
            "format": "uri"
          }
        }
      },
      "CasoResumen": {
        "type": "object",
        "required": [
          "id",
          "cliente",
          "titulo"
        ],
        "properties": {
          "id": {
            "type": "string"
          },
          "cliente": {
            "type": "string"
          },
          "titulo": {
            "type": "string"
          },
          "sector": {
            "type": "string"
          },
          "resumen": {
            "type": "string"
          },
          "stack": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "web": {
            "type": "string",
            "format": "uri"
          },
          "api": {
            "type": "string",
            "format": "uri"
          }
        }
      },
      "CasoDetalle": {
        "allOf": [
          {
            "$ref": "#/components/schemas/CasoResumen"
          },
          {
            "type": "object",
            "properties": {
              "reto": {
                "type": "string"
              },
              "construido": {
                "type": "array",
                "items": {
                  "type": "string"
                }
              },
              "contenido": {
                "type": "string",
                "description": "Artículo completo en markdown."
              },
              "markdown": {
                "type": "string",
                "format": "uri"
              }
            }
          }
        ]
      },
      "ListaCasos": {
        "type": "object",
        "required": [
          "total",
          "datos"
        ],
        "properties": {
          "total": {
            "type": "integer"
          },
          "datos": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/CasoResumen"
            }
          }
        }
      },
      "NotaResumen": {
        "type": "object",
        "required": [
          "id",
          "titulo"
        ],
        "properties": {
          "id": {
            "type": "string"
          },
          "titulo": {
            "type": "string"
          },
          "descripcion": {
            "type": "string"
          },
          "grupo": {
            "type": "string",
            "enum": [
              "crm",
              "whatsapp",
              "venta"
            ]
          },
          "publicado": {
            "type": "string",
            "format": "date"
          },
          "lecturaMinutos": {
            "type": "integer"
          },
          "web": {
            "type": "string",
            "format": "uri"
          },
          "api": {
            "type": "string",
            "format": "uri"
          }
        }
      },
      "NotaDetalle": {
        "allOf": [
          {
            "$ref": "#/components/schemas/NotaResumen"
          },
          {
            "type": "object",
            "properties": {
              "contenido": {
                "type": "string",
                "description": "Artículo completo en markdown."
              },
              "faq": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "q": {
                      "type": "string"
                    },
                    "a": {
                      "type": "string"
                    }
                  }
                }
              },
              "markdown": {
                "type": "string",
                "format": "uri"
              }
            }
          }
        ]
      },
      "ListaNotas": {
        "type": "object",
        "required": [
          "total",
          "datos"
        ],
        "properties": {
          "total": {
            "type": "integer"
          },
          "datos": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/NotaResumen"
            }
          }
        }
      },
      "Producto": {
        "type": "object",
        "required": [
          "id",
          "nombre"
        ],
        "properties": {
          "id": {
            "type": "string"
          },
          "nombre": {
            "type": "string"
          },
          "estado": {
            "type": "string",
            "examples": [
              "en producción"
            ]
          },
          "resumen": {
            "type": "string"
          },
          "descripcion": {
            "type": "string"
          },
          "web": {
            "type": "string",
            "format": "uri"
          }
        }
      },
      "Testimonio": {
        "type": "object",
        "properties": {
          "cita": {
            "type": "string"
          },
          "nombre": {
            "type": "string"
          },
          "organizacion": {
            "type": "string"
          }
        }
      },
      "Contacto": {
        "type": "object",
        "properties": {
          "canalPrincipal": {
            "type": "string",
            "enum": [
              "whatsapp"
            ]
          },
          "whatsapp": {
            "type": "object",
            "properties": {
              "numero": {
                "type": "string"
              },
              "enlace": {
                "type": "string",
                "format": "uri"
              },
              "nota": {
                "type": "string"
              }
            }
          },
          "email": {
            "type": "string",
            "format": "email"
          },
          "redes": {
            "type": "object",
            "additionalProperties": {
              "type": "string",
              "format": "uri"
            }
          },
          "formularios": {
            "type": "boolean",
            "description": "El sitio no usa formularios."
          },
          "primeraConversacion": {
            "type": "object",
            "properties": {
              "tipo": {
                "type": "string"
              },
              "duracionMinutos": {
                "type": "integer"
              },
              "costo": {
                "type": "number"
              },
              "compromiso": {
                "type": "boolean"
              },
              "descripcion": {
                "type": "string"
              }
            }
          },
          "horario": {
            "type": "object",
            "properties": {
              "dias": {
                "type": "string"
              },
              "zona": {
                "type": "string"
              },
              "utc": {
                "type": "string"
              }
            }
          }
        }
      },
      "Error": {
        "type": "object",
        "required": [
          "error"
        ],
        "properties": {
          "error": {
            "type": "object",
            "required": [
              "codigo",
              "estado",
              "mensaje"
            ],
            "properties": {
              "codigo": {
                "type": "string",
                "examples": [
                  "recurso_no_encontrado"
                ]
              },
              "estado": {
                "type": "integer",
                "examples": [
                  404
                ]
              },
              "mensaje": {
                "type": "string"
              },
              "solucion": {
                "type": "string",
                "description": "Qué hacer para resolverlo."
              },
              "indice": {
                "type": "string",
                "format": "uri"
              },
              "openapi": {
                "type": "string",
                "format": "uri"
              },
              "documentacion": {
                "type": "string",
                "format": "uri"
              }
            }
          }
        }
      }
    }
  }
}