Integrations
Connect conversation sources to Nyeti through the direct Analyze API or a signed webhook. Every supported channel becomes the same ordered sequence of message, speaker, and conversation ID values before analysis.
Integration points
Direct API
Send one message at a time to /v1/analyze. Add the same conversation_id and the correct speaker to build context.
Generic webhook
Send a completed conversation from your own system using Nyeti's signed, provider-neutral payload.
ElevenLabs
Point an ElevenLabs post-call transcription webhook at a Nyeti receiver without writing your own payload mapper.
Get an integration endpoint
Nyeti provides a channel-specific receiver URL and signing secret during beta workspace setup:
https://api.bactlabs.africa/v1/webhooks/<receiver-id>Use the beta access form and describe the source you want to connect. The receiver's channel determines its accepted payload and signature header.
Generic webhook
Use this channel when your application can send a completed text conversation. Send the exact JSON body to your receiver URL with a Nyeti-Signature header.
{
"type": "conversation.completed",
"conversation_id": "ticket_123",
"turns": [
{ "speaker": "agent", "message": "Your order is on its way, so this is resolved." },
{ "speaker": "customer", "message": "It is still not here. I have asked three times." }
],
"source_verdict": "resolved"
}typemust beconversation.completed.conversation_idis required and accepts up to 200 printable, non-space characters.turnsis required. Each turn needs a non-emptymessageand aspeakerofcustomeroragent.source_verdictis optional and lets Nyeti compare your system's outcome with its review result.- A delivery can contain up to 200 transcript turns. Additional turns are not processed and the response reports
"truncated": true.
Sign a generic webhook
Set Nyeti-Signature to t=<unix-seconds>,v0=<hex-digest>. Compute the digest with HMAC-SHA256 over <timestamp>.<exact-raw-body> using the endpoint signing secret. Sign the same bytes you send, without parsing or reformatting the body afterward.
import { createHmac } from "node:crypto";
const timestamp = Math.floor(Date.now() / 1000);
const rawBody = JSON.stringify(payload);
const digest = createHmac("sha256", signingSecret)
.update(String(timestamp) + "." + rawBody)
.digest("hex");
await fetch(receiverUrl, {
method: "POST",
headers: {
"Content-Type": "application/json",
"Nyeti-Signature": "t=" + timestamp + ",v0=" + digest,
},
body: rawBody,
});Signatures older or more than 30 minutes in the future are rejected.
ElevenLabs post-call channel
- The channel accepts ElevenLabs
post_call_transcriptionevents. - Use the signing secret from setup in ElevenLabs and send its standard
ElevenLabs-Signatureheader. - Nyeti analyzes transcript text after the call has ended.
- It does not analyze call audio, vocal tone, or prosody.
- It does not intervene during a live call.
Where post-call review helps
Successful calls that still need review
Compare a source's success verdict with Nyeti's review status. A disagreement can move the conversation into a human quality queue.
Problems marked resolved too early
Flag an agent resolution claim when a later customer turn still shows that the issue is unresolved.
Calls that deteriorate over time
Surface a worsening trajectory or sustained negative streak that a final label can hide.
Crisis language that needs a person
Route a completed conversation for trained human review when its text matches a configured crisis-language marker.
Response
{
"status": "processed",
"conversation_id": "ticket_123",
"segment": 1,
"turns_received": 2,
"turns_analysed": 2,
"turns_skipped": 0,
"truncated": false,
"review_status": "needs_review",
"suggested_action": "handoff",
"false_resolution": true,
"source_verdict": "resolved"
}Usage, retries, and repeated IDs
- Each analyzed non-empty turn counts once against the workspace usage allowance.
- Already-processed identical deliveries do not count against the allowance twice and return
"status": "duplicate". 429 rate_limitedresponses includeRetry-After. Send the same delivery again after that interval.429 quota_exceededresponses can be retried after the workspace allowance resets or changes.422 batch_exceeds_limitmeans the delivery cannot fit even after a reset. Reduce its turns or change the workspace allowance before sending it again.- A processing failure returns
500. Nyeti rolls back the delivery before returning, so the same delivery can be sent again. - A reused conversation ID with different payload bytes starts a new segment instead of merging separate conversations.
Signature and data handling
- The receiver URL is not a credential. Every delivery requires the signature header for its configured channel.
- Redaction is enabled by default. Email addresses, phone numbers, and card-number patterns are masked before transcript text is analyzed and stored.
ElevenLabs event handling
post_call_transcription: verified, analyzed, counted, and recorded.post_call_audio: accepted and ignored because it has no transcript to analyze.call_initiation_failure: accepted and ignored because no conversation occurred.- Other event types are accepted as ignored so unsupported events do not trigger a retry loop.
Other channels
Use the generic webhook for completed text conversations from other systems. For each-message analysis, call /v1/analyze directly with a shared conversation_id and the correct speaker.