Webhooks

Os webhooks permitem que os desenvolvedores registrem URLs que recebem notificações de eventos para os usuários via HTTP. Cada webhook registrado é identificado de forma exclusiva por um ID globalmente único; todas as operações subsequentes utilizam esse ID no caminho do recurso.

Pontos finais externos

Os webhooks devem suportar a método POST e responder com um status HTTP 200 dentro do tempo limite exigido; caso contrário, a entrega será repetida. As notificações de webhooks são repetidas no máximo 5 vezes, com uma pausa de 10 segundos entre cada tentativa, antes que o webhook seja marcado como com falha. Eventos subsequentes não são entregues a webhooks com falha. A renovação de um webhook limpará seu status de “falha” e ele voltará a receber notificações de eventos.

Os endpoints de webhook devem responder em tempo hábil. Nosso sistema deve ser capaz de estabelecer uma conexão com o servidor da URL do webhook em até 3 segundos, e o código de status HTTP 200 deve ser recebido em até 2 segundos para que a entrega do webhook seja considerada bem-sucedida.

Vencimento

Os registros de webhooks expiram após um certo período de tempo (expireAt, normalmente 10 dias), após o que não receberão mais notificações. No entanto, os webhooks vencidos (ou não vencidos) podem ser renovados indefinidamente. Os webhooks vencidos serão eliminados permanentemente em algum momento (purgeAt). Quando um webhook é renovado, o renewedAt e renewedBy as propriedades são definidas com a hora atual, e o expireAt e purgeAt as propriedades são redefinidas com novos valores após renewedAt.

Quando um webhook é renovado, ele zera o indicador de falha, mas não remove nenhuma outra estatística de entrega anterior.

Metadados, assinaturas e deduplicação

Junto com cada evento de notificação de webhook, os metadados sobre o evento do webhook e sua entrega podem ser incluídos no cabeçalho HTTP, no próprio corpo da solicitação ou podem não ser incluídos. O metadataPolicy Essa propriedade controla a forma desejada de entrega dos metadados.

Os metadados do webhook consistem nas seguintes propriedades:

Chave Descrição
signature O valor hash do evento do webhook. Se a política for HEADER, esse valor é enviado como X-VON-Signature
webhookId O identificador exclusivo do webhook. Se a política for HEADER, esse valor é enviado como X-VON-Webhook-Id
deliveryId Um identificador único que identifica a entrega desse evento específico. Se a política for HEADER, esse valor é enviado como X-VON-Delivery-Id
attempt Identifica o número de vezes em que foi tentada a entrega do evento para o mesmo deliveryId. Se a política for HEADER, esse valor é enviado como X-VON-Attempt

Para que esses metadados sejam fornecidos, metadataPolicy deve ser definido como HEADER ou BODY. Além disso, a assinatura só é definida se signingAlgo está definido como HMAC_SHA256 e um que não seja vazio signingKey está definido.

Como o sistema tenta novamente a entrega das entradas de webhook que atingiram o tempo limite, o próprio endpoint precisa saber se várias solicitações POST enviadas a uma URL representam o mesmo evento ou eventos diferentes. O deliveryId e as propriedades de tentativa fornecem ao endpoint as informações necessárias para distinguir entre eventos de notificação distintos e novas tentativas.

Eventos

Os eventos de notificação por webhook têm o seguinte formato, por exemplo:

{
    "event": {
        "accountId": "-1",
        "direction": "OUTBOUND",
        "duration": 0,
        "externalId": "abc1234-288c-40d3-8ec8-3618a3ae7698_123",
        "id": "abc1234a806d07a6ff17ba",
        "internal": false,
        "phoneNumber": "xxxxxxxxxx",
        "startTime": "2020-10-01T16:10:06.000+0000",
        "state": "RINGING",
        "type": "CALL",
        "ucpType": "VBS",
        "userId": "1234"
    },
    "metadata": {
        "attempt": 1,
        "deliveryId": "abc1234-2795-446c-be6b-7cba85c6bba2",
        "signature": "abc1234663a4d0589ec092677b4af18b4a747ac8cfa6198a57b8c6bfec9bf28a",
        "webhookId": "abc1234-c1ad-4a14-a30b-69dd92f57af2"
    }
}

O metadata a propriedade só é incluída se metadataPolicy está definido como BODY. O signature, uma sequência codificada em hexadecimal, é calculada a partir do valor JSON do event propriedade, em que todas as propriedades são classificadas em ordem alfabética, sem espaços entre os nomes das propriedades ou seus valores. Por exemplo, a assinatura no exemplo acima event O corpo seria calculado com base no seguinte JSON:

{"accountId": "-1","direction": "OUTBOUND","duration": 0,"externalId": "abc1234-288c-40d3-8ec8-3618a3ae7698_123","id": "abc1234a806d07a6ff17ba","internal": false,"phoneNumber": "xxxxxxxxxx","startTime": "2020-10-01T16:10:06.000+0000","state": "RINGING","type": "CALL","ucpType": "VBS","userId": "1234"}

E usando a chave secreta mysecretkey teria a seguinte assinatura:

95aafd08cb72b1f9216ccd002b8917b04e41ecb19276ae759241fdc0cbb53fb5.

Política de redirecionamento

Os endpoints de webhook podem retornar os códigos de status HTTP 302 ou 307. O sistema seguirá os redirecionamentos até um determinado limite; após esse limite, o sistema marcará o webhook como com falha. Se o endpoint do webhook retornar um 302, o evento do webhook será entregue como uma chamada HTTP GET para a URL encontrada na resposta Location cabeçalho. Se for retornado um código 307, o evento do webhook é enviado como uma solicitação HTTP POST para a URL indicada na resposta Location cabeçalho.

Estatísticas

O sistema registra o número total de tentativas, sucessos e falhas. Ele também registra a data e a hora do último sucesso e da última falha. No caso das falhas, o código de status HTTP mais recente e a mensagem descritiva também são registrados. Quando um webhook é renovado, apenas o isFailed a propriedade é redefinida para false; todas as demais estatísticas são mantidas apenas para fins informativos.

Um webhook não é considerado nem bem-sucedido nem malsucedido até que todas as tentativas de repetição para uma determinada entrega tenham sido esgotadas. Por exemplo, se o sistema tentar repetir a entrega de um webhook cinco vezes e falhar, isso conta como uma única tentativa adicional e uma única falha.

As estatísticas de webhooks podem ser usadas para identificar eventos que possam ter sido perdidos caso a URL fique temporariamente indisponível (por exemplo, devido a manutenção do sistema). Nesse caso, é possível consultar os eventos perdidos referentes a tudo o que ocorreu após lastSuccess. É recomendável renovar todos os webhooks existentes imediatamente após a restauração do sistema, após a manutenção.