Webhooks

The one URL a platform posts conversations to.

Your platform already knows when a call or a chat ends. Give it this URL and it posts each finished conversation to us. You write no code.

The URL

Connect the platform in the app. It gives you a URL that carries your own token, so the token names both the tenant and the connector it belongs to.

bash

curl -X POST "https://app.evidova.com/ingest/webhooks/{adapter}/{tenant_token}" \
  -H "content-type: application/json" \
  --data @conversation.json

How we know it is really them

Most platforms sign the body they send. Put the signing secret in the connector and we verify every delivery against it. One that does not match gets 401, and we never store what it carried.

We also record the refusal against that connector. Its own screen counts refused deliveries and says when the last one arrived, so a connector turning everything away reads differently from one nobody has posted to yet.

What we send back

We answer 202 as soon as the body is stored. Scoring happens after that, so the platform never waits for it.

202Stored. The body carries the id we filed it under.
400The connector's platform does not accept webhooks.
401The signature did not match the secret for this connector.
404The token is unknown, or the connector is turned off.
413The body is above the size ceiling for this route.
Note: Turn the connector off in the app to stop delivery. A token that resolves to a disabled connector gets the same 404 as one that resolves to nothing.

When a payload is rejected

A body we cannot read still got its 202, because we answer before anything parses it. When a record inside it fails, we keep the raw body and count the loss in a ledger of our own, so the delivery can be run again once the sender is fixed.

Read next

This page as markdown