> ## Documentation Index
> Fetch the complete documentation index at: https://docs.ryvo.so/llms.txt
> Use this file to discover all available pages before exploring further.

# Developers: API keys y webhook desde el portal

> Crear y revocar llaves de API, configurar tu webhook, probarlo con un ping y leer el historial de entregas.

Todo está en **Developers** (menú lateral) y, con más detalle, en **Configuración → Developers**.

## API keys

<Frame caption="Developers: (1) Nueva API key. Abajo, el webhook y el quickstart.">
  <img src="https://mintcdn.com/ryvo-3dab4d1a/9EEXAZ5i3XN2oDZq/images/portal/developers-anotado.png?fit=max&auto=format&n=9EEXAZ5i3XN2oDZq&q=85&s=386f70d1f10dba4266145c90373d5567" alt="Pantalla Developers" width="1600" height="1000" data-path="images/portal/developers-anotado.png" />
</Frame>

Las llaves dan acceso a la [API pública](/api-reference). Requieren plan **Pro o superior**; en planes menores las llaves que ya tuvieras siguen listadas y se pueden revocar, pero no crear nuevas.

* **Crear**: nombre de 1 a 80 caracteres. La llave (`ryvo_live_` + 64 caracteres) **se muestra una sola vez**; después sólo verás su prefijo. Guárdala en tu gestor de secretos.
* **Máximo 5 llaves activas**. Para crear la sexta, revoca una.
* **Revocar**: pide confirmación escribiendo el nombre. Deja de funcionar al instante y cualquier integración que la use empieza a recibir `401`.
* **Sin scopes**: hoy una llave tiene acceso completo a la API. Usa una llave por integración para poder revocarla sin afectar a las demás.

**Configuración → API Keys** añade el **Project ID** de tu cuenta, la fecha de creación y el último uso de cada llave.

## Webhook

Un webhook por cuenta. Disponible en todos los planes.

<Frame caption="Configuración → Webhooks: (1) Crear webhook, con prueba de ping.">
  <img src="https://mintcdn.com/ryvo-3dab4d1a/9EEXAZ5i3XN2oDZq/images/portal/webhooks-anotado.png?fit=max&auto=format&n=9EEXAZ5i3XN2oDZq&q=85&s=7203e1c10b8e0ec56d0a101980c853f7" alt="Configuración → Webhooks" width="1600" height="1000" data-path="images/portal/webhooks-anotado.png" />
</Frame>

<Steps>
  <Step title="Crear">
    Pega una URL **HTTPS pública**. Se rechazan `localhost`, IPs literales y redes privadas.
  </Step>

  <Step title="Guardar el signing secret">
    `whsec_…` se muestra **una sola vez**. Con él verificas la firma `X-Ryvo-Signature` de cada entrega ([cómo verificarla](/webhooks/signature-verification)).
  </Step>

  <Step title="Probar con un ping">
    En **Configuración → Webhooks**, al crear, puedes mandar un evento `webhook.ping` (cabecera `X-Ryvo-Ping: 1`, timeout 5 s) y ver el código HTTP, la latencia y los primeros 500 bytes de tu respuesta.
  </Step>
</Steps>

Después puedes **Editar URL**, **Regenerar secret** (el anterior deja de funcionar de inmediato) o **Eliminar webhook** (confirmación escribiendo la URL).

### Eventos

Desde el portal el webhook se suscribe a `call.initiated`, `call.completed` y `call.failed`. Los eventos `conversation.started`, `conversation.ended` y `analysis.ready` existen pero todavía no se eligen desde la pantalla; pídelos a [soporte@ryvo.so](mailto:soporte@ryvo.so). Payloads y reglas en [Webhooks](/webhooks/overview).

### Historial de entregas

Las últimas 20 entregas con evento, estado (**Entregado · Pendiente · Reintentando · Falló**), intentos, código HTTP y cuándo. Si tu endpoint no responde `2xx` en 10 segundos, Ryvo reintenta a los 5 minutos, 30 minutos y 2 horas; después marca la entrega como agotada.

## Logs de eventos

<Frame caption="Cada evento con el JSON que Ryvo entregaría por webhook.">
  <img src="https://mintcdn.com/ryvo-3dab4d1a/9EEXAZ5i3XN2oDZq/images/portal/logs-eventos.png?fit=max&auto=format&n=9EEXAZ5i3XN2oDZq&q=85&s=767048ecca475f4ecdef1c7f54142729" alt="Logs de eventos" width="1600" height="1000" data-path="images/portal/logs-eventos.png" />
</Frame>

**Configuración → Logs de eventos** lista los eventos `call.*` de tus conversaciones (50 por página, con filtro por tipo y fechas) y, para cada uno, el **JSON exacto que Ryvo entregaría por webhook**. Sirve para escribir tu receptor sin esperar una llamada real y para comparar lo que recibiste con lo que se envió.
