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

# Webhooks de llamadas

> Configurá la entrega y diagnosticá eventos pendientes o fallidos.

export const Availability = ({lang = 'es', plan, addon, permission, route, status}) => {
  const L = lang === 'en' ? {
    plan: 'Plan',
    addon: 'Add-on',
    permission: 'Permission',
    route: 'Where',
    status: 'Status',
    addonNote: 'enabled on request',
    allPlans: 'All plans',
    beta: 'Beta',
    nuevo: 'New',
    soon: 'Coming soon'
  } : {
    plan: 'Plan',
    addon: 'Add-on',
    permission: 'Permiso',
    route: 'Dónde',
    status: 'Estado',
    addonNote: 'se activa a pedido',
    allPlans: 'Todos los planes',
    beta: 'Beta',
    nuevo: 'Nuevo',
    soon: 'Próximamente'
  };
  const items = [];
  if (plan) items.push([L.plan, plan]);
  if (addon) items.push([L.addon, `${addon} · ${L.addonNote}`]);
  if (permission) items.push([L.permission, permission]);
  if (route) items.push([L.route, route]);
  if (status) items.push([L.status, L[status] || status]);
  return <div style={{
    display: 'flex',
    flexWrap: 'wrap',
    gap: '6px 22px',
    padding: '12px 16px',
    margin: '4px 0 24px',
    border: '1px solid rgba(2, 82, 255, 0.28)',
    borderLeft: '3px solid #0252ff',
    borderRadius: '8px',
    background: 'rgba(2, 82, 255, 0.05)',
    fontSize: '13.5px',
    lineHeight: '1.5'
  }}>
      {items.map(([k, v]) => <div key={k} style={{
    display: 'flex',
    gap: '6px',
    alignItems: 'baseline'
  }}>
          <span style={{
    fontSize: '10.5px',
    fontWeight: 600,
    letterSpacing: '0.07em',
    textTransform: 'uppercase',
    opacity: 0.65
  }}>{k}</span>
          <span style={{
    fontWeight: 500
  }}>{v}</span>
        </div>)}
    </div>;
};

<Availability lang="es" route="Llamadas → Webhooks" permission="calls.read" />

Un webhook envía datos de una llamada a tu sistema mediante una solicitud **POST**. La llamada puede terminar correctamente aunque tu endpoint no reciba el evento.

## Configurar y probar

1. Abrí el agente de voz y entrá a **Avanzado → Post llamada**.
2. Configurá la URL del webhook de salida. El webhook de entrada sirve para aportar contexto al agente y cumple otra función.
3. Guardá y publicá la configuración del agente.
4. Hacé una llamada controlada desde **Probar agente** y esperá el análisis.
5. Revisá el cuerpo recibido y la respuesta HTTP en tu receptor y en **Llamadas → Webhooks**.

El editor actual no ofrece un botón de prueba con un payload de ejemplo. Las pruebas de llamada pueden disparar acciones reales en tu receptor.

## Diagnosticar la entrega

En **Llamadas → Webhooks**, abrí un evento para consultar su URL, estado, intentos, respuesta HTTP, datos crudos y llamada asociada.

| Estado    | Qué hacer                                                                                                 |
| --------- | --------------------------------------------------------------------------------------------------------- |
| Entregado | Comprobá que tu aplicación procesó el contenido, además de responder al envío.                            |
| Pendiente | Revisá de nuevo antes de disparar una recuperación manual.                                                |
| Fallido   | Leé el código y el mensaje de respuesta, corregí el receptor y usá **Reintentar** cuando esté disponible. |

Guardá el ID de evento junto con el ID de llamada en tus registros. Hacé que tu receptor tolere entregas repetidas: un reintento no debe crear dos tickets ni duplicar una operación.

No confundas estos envíos con los webhooks de canales de mensajes, las automatizaciones del inbox o los eventos del enrutamiento. Tienen configuración y contenido propios.

## Preguntas frecuentes

<AccordionGroup>
  <Accordion title="¿Reintentar vuelve a llamar?">
    No. Reintenta la entrega del evento. Tu receptor puede ejecutar acciones otra vez si no controla duplicados.
  </Accordion>

  <Accordion title="¿El webhook de entrada es el mismo?">
    No. El de entrada obtiene contexto antes de conversar; el de salida entrega información de la llamada.
  </Accordion>

  <Accordion title="¿Qué envío a soporte?">
    ID de evento, ID de llamada, fecha y respuesta HTTP, sin secretos del receptor.
  </Accordion>
</AccordionGroup>

## Ver también

* [Registro de llamadas](/es/llamadas/registro)
* [Post llamada](/es/agentes-de-voz/post-llamada)
