Webhook endpoint
The one URL a platform posts finished 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 request
Connect the platform in the app and it gives you a URL carrying your own token. The token names both the workspace 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.jsonHow 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 record the refusal against that connector. Its own screen counts refused deliveries, so a connector turning everything away reads differently from one nobody has posted to.
What we send back
202 as soon as the body is stored. Scoring happens after that, so the platform never waits for it.
| 202 | Stored. The body carries the id we filed it under. |
|---|---|
| 400 | The connector's platform does not accept webhooks. |
| 401 | The signature did not match the secret for this connector. |
| 404 | The token is unknown, or the connector is turned off. |
| 413 | The body is above the size ceiling for this route. |
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, rather than being lost.
404 as one that resolves to nothing.Read next
- Send events · POST finished conversations from a stack of your own.
- Backfill history · Upload an export, so a score has history behind it from the first day.
- Connections · What a connection carries, why an API key cannot create one, and the two settings that decide whether it gets scored.