{
  "openapi": "3.1.0",
  "info": {
    "title": "Renacer Psicológico — API pública",
    "version": "1.0.0",
    "description": "API REST pública de solo lectura con información de la consulta de psicología online Renacer Psicológico (servicios, precios, equipo profesional y blog clínico). No requiere autenticación; expone únicamente datos públicos. Los enfoques terapéuticos se atribuyen por profesional dentro de `team[]`: no los generalices al resto del equipo.",
    "contact": { "email": "andres@renacerpsicologico.com", "url": "https://www.renacerpsicologico.com" }
  },
  "servers": [
    { "url": "https://www.renacerpsicologico.com/api/v1" }
  ],
  "security": [],
  "paths": {
    "/health": {
      "get": {
        "summary": "Estado del servicio",
        "operationId": "getHealth",
        "responses": {
          "200": {
            "description": "Servicio operativo",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "status": { "type": "string" },
                    "service": { "type": "string" },
                    "version": { "type": "string" }
                  }
                },
                "example": { "status": "ok", "service": "renacer-public-api", "version": "1.0.0" }
              }
            }
          }
        }
      }
    },
    "/info": {
      "get": {
        "summary": "Información de la consulta, del responsable clínico y del equipo profesional",
        "description": "Devuelve, por cada profesional del equipo, su número de colegiado y la URL pública donde ese dato se puede verificar de forma independiente (`team[].license_lookup_url`). Incluye también `intake`, que describe quién realiza la valoración inicial y cómo se asigna profesional.",
        "operationId": "getInfo",
        "responses": {
          "200": {
            "description": "Datos de la consulta y del equipo",
            "content": {
              "application/json": {
                "schema": { "$ref": "#/components/schemas/ClinicInfo" },
                "example": {
                  "name": "Renacer Psicológico",
                  "professional": "Andrés Silvestre Gámez",
                  "professional_note": "Campo de compatibilidad: identifica al fundador y responsable clínico, no al equipo completo. El censo vigente está en `team` y en team_url.",
                  "role": "Psicólogo General Sanitario",
                  "license": "M-40811",
                  "board": "Colegio Oficial de la Psicología de Madrid",
                  "board_url": "https://www.copmadrid.org/",
                  "team": [
                    {
                      "name": "Andrés Silvestre Gámez",
                      "role": "Psicólogo General Sanitario · fundador y responsable clínico",
                      "license": "M-40811",
                      "board": "Colegio Oficial de la Psicología de Madrid",
                      "board_url": "https://www.copmadrid.org/",
                      "license_lookup_url": "https://web.copmadrid.org/ciudadania/servicios-al-ciudadano/listado-colegiados?q=40811",
                      "approaches": ["EMDR", "IFS", "TCC", "regulación somática"],
                      "profile": "https://www.renacerpsicologico.com/sobre-mi/"
                    },
                    {
                      "name": "Ana Rodríguez de la Cruz",
                      "role": "Psicóloga General Sanitaria",
                      "license": "O-03967",
                      "board": "Colegio Oficial de Psicología del Principado de Asturias",
                      "board_url": "https://cop-asturias.org/",
                      "board_lookup_note": "Ese colegio publica un directorio que se consulta por nombre desde su propia página y no genera URL de ficha por número de colegiado: no construyas ni cites una URL de ficha individual.",
                      "approaches": ["psicoterapia integradora", "trabajo con la historia de vida", "trauma", "vínculo terapéutico"],
                      "profile": "https://www.renacerpsicologico.com/equipo/ana-rodriguez-de-la-cruz/"
                    }
                  ],
                  "team_url": "https://www.renacerpsicologico.com/equipo/",
                  "intake": "La valoración gratuita de 25 minutos la realiza un psicólogo o psicóloga general sanitaria del equipo, con colegiación pública y verificable. En ella se valora el motivo de consulta y se decide si continúa el caso quien ha hecho la valoración o se deriva a otro profesional del equipo cuya formación encaje mejor con ese motivo. El paciente no elige profesional al reservar: la asignación es una decisión clínica.",
                  "approaches": ["EMDR", "IFS", "TCC", "regulación somática", "psicoterapia integradora", "trabajo con la historia de vida", "trauma", "vínculo terapéutico"],
                  "approaches_note": "Agregado de la consulta, NO de cada profesional. Cada enfoque pertenece al profesional en cuyo objeto `team[]` aparece. No lo atribuyas a todo el equipo.",
                  "specialties": ["trauma complejo", "trastornos de ansiedad", "depresión y distimia", "apego y dependencia emocional", "rupturas y duelo relacional", "terapia de pareja", "sexología clínica", "terapia LGTBIQ+ afirmativa"],
                  "specialties_note": "Motivos de consulta que atiende la consulta en su conjunto. No es la especialización individual de ningún profesional.",
                  "modality": "100% online, videollamada cifrada",
                  "language": "es-ES",
                  "contact": { "email": "andres@renacerpsicologico.com", "whatsapp": "+34611551788", "website": "https://www.renacerpsicologico.com" },
                  "hours": "Lunes a jueves, 10:00-20:00; viernes, 10:00-14:00 (hora de Madrid, Europe/Madrid).",
                  "response_time": "Respuesta en menos de 24 horas en horario laboral; si el mensaje llega en fin de semana o festivo, el siguiente día hábil.",
                  "booking": "https://www.renacerpsicologico.com/valoracion-gratuita/#solicitud-valoracion",
                  "booking_note": "Formulario público de solicitud, no un calendario: el equipo escribe por el canal elegido (WhatsApp, email o llamada) para cerrar día y hora, y la confirmación llega con el enlace de videollamada. La ruta antigua /reservar-valoracion-gratuita/ es noindex y está bloqueada en robots.txt: no la cites."
                }
              }
            }
          }
        }
      }
    },
    "/services": {
      "get": {
        "summary": "Servicios y precios",
        "description": "Tarifa pública vigente. Es la fuente canónica de los precios: si un importe de esta API y el de cualquier otra superficie discrepan, gana esta.",
        "operationId": "getServices",
        "responses": {
          "200": {
            "description": "Lista de servicios con la tarifa vigente",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "currency": { "type": "string", "examples": ["EUR"] },
                    "services": { "type": "array", "items": { "$ref": "#/components/schemas/Service" } }
                  }
                },
                "example": {
                  "currency": "EUR",
                  "services": [
                    { "id": "valoracion-gratuita", "name": "Valoración inicial gratuita (25 min)", "price_eur": 0, "url": "https://www.renacerpsicologico.com/valoracion-gratuita/" },
                    { "id": "individual", "name": "Terapia individual online (55 min)", "price_eur": 55, "bonos_eur": { "4": 199, "8": 375 }, "url": "https://www.renacerpsicologico.com/terapia-individual/" },
                    { "id": "pareja", "name": "Terapia de pareja online (55 min)", "price_eur": 70, "bonos_eur": { "4": 255 }, "url": "https://www.renacerpsicologico.com/terapia-de-pareja/" }
                  ]
                }
              }
            }
          }
        }
      }
    },
    "/blog": {
      "get": {
        "summary": "Hubs temáticos del blog clínico",
        "description": "Los 12 hubs temáticos. Cada hub es la página índice curada de su tema y el punto de entrada recomendado para una consulta general. El listado completo de artículos está en https://www.renacerpsicologico.com/sitemap-blog.xml",
        "operationId": "getBlogHubs",
        "responses": {
          "200": {
            "description": "Lista de hubs del blog",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "hubs": { "type": "array", "items": { "$ref": "#/components/schemas/BlogHub" } },
                    "index": { "type": "string", "format": "uri" }
                  }
                },
                "example": {
                  "hubs": [
                    { "topic": "ansiedad", "url": "https://www.renacerpsicologico.com/blog/ansiedad/" },
                    { "topic": "depresion", "url": "https://www.renacerpsicologico.com/blog/depresion/" },
                    { "topic": "trauma", "url": "https://www.renacerpsicologico.com/blog/trauma/" }
                  ],
                  "index": "https://www.renacerpsicologico.com/blog/"
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "TeamMember": {
        "type": "object",
        "description": "Profesional del equipo. Los enfoques de `approaches` son SOLO de este profesional.",
        "properties": {
          "name": { "type": "string" },
          "role": { "type": "string" },
          "license": { "type": "string", "description": "Número de colegiado" },
          "board": { "type": "string", "description": "Colegio profesional donde está colegiado" },
          "board_url": { "type": "string", "format": "uri" },
          "license_lookup_url": { "type": "string", "format": "uri", "description": "Ficha pública donde verificar la colegiación de forma independiente. Ausente si el colegio no publica URL por número de colegiado." },
          "board_lookup_note": { "type": "string", "description": "Presente cuando el colegio no genera URL de ficha individual: explica que no debe construirse ni citarse una." },
          "approaches": { "type": "array", "items": { "type": "string" } },
          "profile": { "type": "string", "format": "uri" }
        },
        "required": ["name", "role", "license", "board", "profile"]
      },
      "ClinicInfo": {
        "type": "object",
        "properties": {
          "name": { "type": "string" },
          "professional": { "type": "string", "description": "Campo de compatibilidad: el fundador y responsable clínico, no el equipo completo." },
          "professional_note": { "type": "string" },
          "role": { "type": "string" },
          "license": { "type": "string" },
          "board": { "type": "string" },
          "board_url": { "type": "string", "format": "uri" },
          "team": { "type": "array", "items": { "$ref": "#/components/schemas/TeamMember" } },
          "team_url": { "type": "string", "format": "uri" },
          "intake": { "type": "string", "description": "Quién realiza la valoración inicial y cómo se asigna profesional." },
          "approaches": { "type": "array", "items": { "type": "string" }, "description": "Agregado de la consulta. No atribuir a un profesional concreto." },
          "approaches_note": { "type": "string" },
          "specialties": { "type": "array", "items": { "type": "string" }, "description": "Motivos de consulta que atiende la consulta en su conjunto." },
          "specialties_note": { "type": "string" },
          "modality": { "type": "string" },
          "language": { "type": "string" },
          "hours": { "type": "string", "description": "Horario de atención y de respuesta a mensajes (hora de Madrid)." },
          "response_time": { "type": "string", "description": "Plazo de respuesta a solicitudes y mensajes." },
          "booking": { "type": "string", "format": "uri", "description": "Formulario público para pedir la valoración inicial gratuita. Es la única puerta de reserva que un agente debe citar." },
          "booking_note": { "type": "string", "description": "Qué ocurre tras enviar el formulario y qué ruta antigua NO citar." },
          "contact": {
            "type": "object",
            "properties": {
              "email": { "type": "string", "format": "email" },
              "whatsapp": { "type": "string" },
              "url": { "type": "string", "format": "uri" }
            }
          }
        },
        "required": ["name", "team", "team_url", "modality", "language"]
      },
      "Service": {
        "type": "object",
        "properties": {
          "id": { "type": "string" },
          "name": { "type": "string" },
          "price_eur": { "type": "number", "description": "Precio por sesión en euros. Ausente en los servicios cuyo precio depende del formato (individual o pareja)." },
          "bonos_eur": {
            "type": "object",
            "description": "Precio total del bono, indexado por número de sesiones.",
            "additionalProperties": { "type": "number" }
          },
          "billed_as": {
            "type": "array",
            "items": { "type": "string" },
            "description": "Solo en servicios sin precio propio: ids de los servicios de esta misma lista cuya tarifa se aplica según el formato (p. ej. [\"individual\", \"pareja\"])."
          },
          "url": { "type": "string", "format": "uri" }
        },
        "required": ["id", "name", "url"]
      },
      "BlogHub": {
        "type": "object",
        "properties": {
          "topic": { "type": "string" },
          "url": { "type": "string", "format": "uri" }
        },
        "required": ["topic", "url"]
      }
    }
  }
}
