{
  "openapi": "3.1.0",
  "info": {
    "title": "AIProPrime Lead API",
    "version": "1.0.0",
    "description": "API pública para enviar solicitudes de contacto/diagnóstico a AIProPrime, una agencia española de automatización e inteligencia artificial para empresas. Cuándo usarla: cuando un agente actúa en nombre de un usuario que quiere que AIProPrime le contacte para evaluar qué automatizar en su negocio (automatización de procesos, agentes IA, chatbots/voicebots o contenido audiovisual con IA). No requiere autenticación. No la uses para enviar mensajes automatizados masivos: está protegida con límite de frecuencia por IP y por email.",
    "contact": {
      "name": "AIProPrime",
      "email": "info@aiproprime.com",
      "url": "https://www.aiproprime.com/contacto"
    }
  },
  "servers": [
    {
      "url": "https://www.aiproprime.com",
      "description": "Producción"
    }
  ],
  "tags": [
    {
      "name": "Leads",
      "description": "Captación y seguimiento de solicitudes comerciales"
    }
  ],
  "paths": {
    "/api/lead": {
      "post": {
        "operationId": "submitLead",
        "tags": [
          "Leads"
        ],
        "summary": "Enviar una solicitud de diagnóstico / lead",
        "description": "Registra una solicitud de contacto y dispara un email de confirmación al remitente y una notificación interna a AIProPrime. Usa este endpoint cuando el usuario ya ha dado su nombre y email y quiere que AIProPrime le contacte.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "name",
                  "email"
                ],
                "properties": {
                  "name": {
                    "type": "string",
                    "maxLength": 120,
                    "description": "Nombre de la persona que solicita el contacto."
                  },
                  "email": {
                    "type": "string",
                    "format": "email",
                    "maxLength": 180,
                    "description": "Email de contacto para la respuesta."
                  },
                  "company": {
                    "type": "string",
                    "maxLength": 160,
                    "description": "Nombre de la empresa (opcional)."
                  },
                  "taskLabel": {
                    "type": "string",
                    "description": "Tarea o proceso que quiere automatizar (opcional, contexto de la calculadora ROI)."
                  },
                  "people": {
                    "type": "number",
                    "description": "Personas involucradas en la tarea (opcional)."
                  },
                  "hoursPerWeek": {
                    "type": "number",
                    "description": "Horas semanales dedicadas a la tarea (opcional)."
                  },
                  "salaryLabel": {
                    "type": "string",
                    "description": "Rango salarial de referencia (opcional)."
                  },
                  "automationRate": {
                    "type": "number",
                    "description": "Fracción estimada automatizable, 0-1 (opcional)."
                  },
                  "humanCostYear": {
                    "type": "number",
                    "description": "Coste humano anual estimado en EUR (opcional)."
                  },
                  "automatedCostYear": {
                    "type": "number",
                    "description": "Coste anual tras automatizar en EUR (opcional)."
                  },
                  "hoursRecoveredYear": {
                    "type": "number",
                    "description": "Horas anuales recuperadas (opcional)."
                  },
                  "equivalentMonths": {
                    "type": "number",
                    "description": "Equivalente en meses de trabajo de una persona (opcional)."
                  },
                  "leadsLostYear": {
                    "type": "number",
                    "description": "Coste anual estimado por leads perdidos en EUR (opcional)."
                  },
                  "errorsYear": {
                    "type": "number",
                    "description": "Coste anual estimado por errores en EUR (opcional)."
                  },
                  "totalRecoverableYear": {
                    "type": "number",
                    "description": "Total recuperable anual estimado en EUR (opcional)."
                  }
                }
              },
              "examples": {
                "minimal": {
                  "summary": "Solicitud mínima",
                  "value": {
                    "name": "María López",
                    "email": "maria@empresa.com",
                    "company": "Empresa S.L."
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Solicitud registrada correctamente. La operación es idempotente: reenviar con el mismo email antes de 10 minutos devuelve 200 con `deduplicated: true` y no genera un aviso duplicado.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "ok"
                  ],
                  "properties": {
                    "ok": {
                      "type": "boolean",
                      "enum": [
                        true
                      ]
                    },
                    "deduplicated": {
                      "type": "boolean",
                      "description": "Presente y true cuando la solicitud se reconoció como repetición reciente y no se reenvió el aviso."
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Datos de la solicitud inválidos o incompletos.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "error"
                  ],
                  "properties": {
                    "error": {
                      "type": "object",
                      "required": [
                        "code",
                        "message"
                      ],
                      "properties": {
                        "code": {
                          "type": "string",
                          "enum": [
                            "validation_error",
                            "rate_limited",
                            "service_unavailable",
                            "internal_error",
                            "method_not_allowed"
                          ],
                          "description": "Machine-readable error code."
                        },
                        "message": {
                          "type": "string",
                          "description": "Human-readable explanation, in Spanish, safe to show to an end user."
                        },
                        "hint": {
                          "type": "string",
                          "description": "Optional suggestion on how to fix the request."
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          "405": {
            "description": "Método HTTP no soportado (solo se admite POST).",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "error"
                  ],
                  "properties": {
                    "error": {
                      "type": "object",
                      "required": [
                        "code",
                        "message"
                      ],
                      "properties": {
                        "code": {
                          "type": "string",
                          "enum": [
                            "validation_error",
                            "rate_limited",
                            "service_unavailable",
                            "internal_error",
                            "method_not_allowed"
                          ],
                          "description": "Machine-readable error code."
                        },
                        "message": {
                          "type": "string",
                          "description": "Human-readable explanation, in Spanish, safe to show to an end user."
                        },
                        "hint": {
                          "type": "string",
                          "description": "Optional suggestion on how to fix the request."
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Límite de frecuencia por IP superado.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "error"
                  ],
                  "properties": {
                    "error": {
                      "type": "object",
                      "required": [
                        "code",
                        "message"
                      ],
                      "properties": {
                        "code": {
                          "type": "string",
                          "enum": [
                            "validation_error",
                            "rate_limited",
                            "service_unavailable",
                            "internal_error",
                            "method_not_allowed"
                          ],
                          "description": "Machine-readable error code."
                        },
                        "message": {
                          "type": "string",
                          "description": "Human-readable explanation, in Spanish, safe to show to an end user."
                        },
                        "hint": {
                          "type": "string",
                          "description": "Optional suggestion on how to fix the request."
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Error interno inesperado.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "error"
                  ],
                  "properties": {
                    "error": {
                      "type": "object",
                      "required": [
                        "code",
                        "message"
                      ],
                      "properties": {
                        "code": {
                          "type": "string",
                          "enum": [
                            "validation_error",
                            "rate_limited",
                            "service_unavailable",
                            "internal_error",
                            "method_not_allowed"
                          ],
                          "description": "Machine-readable error code."
                        },
                        "message": {
                          "type": "string",
                          "description": "Human-readable explanation, in Spanish, safe to show to an end user."
                        },
                        "hint": {
                          "type": "string",
                          "description": "Optional suggestion on how to fix the request."
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          "503": {
            "description": "El servicio de envío no está disponible temporalmente.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "error"
                  ],
                  "properties": {
                    "error": {
                      "type": "object",
                      "required": [
                        "code",
                        "message"
                      ],
                      "properties": {
                        "code": {
                          "type": "string",
                          "enum": [
                            "validation_error",
                            "rate_limited",
                            "service_unavailable",
                            "internal_error",
                            "method_not_allowed"
                          ],
                          "description": "Machine-readable error code."
                        },
                        "message": {
                          "type": "string",
                          "description": "Human-readable explanation, in Spanish, safe to show to an end user."
                        },
                        "hint": {
                          "type": "string",
                          "description": "Optional suggestion on how to fix the request."
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}