INTEGRATIONS

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:

Text
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.

JSON
{
  "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"
}
  • type must be conversation.completed.
  • conversation_id is required and accepts up to 200 printable, non-space characters.
  • turns is required. Each turn needs a non-empty message and a speaker of customer or agent.
  • source_verdict is 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.

JavaScript
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_transcription events.
  • Use the signing secret from setup in ElevenLabs and send its standard ElevenLabs-Signature header.
  • 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

JSON
{
  "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_limited responses include Retry-After. Send the same delivery again after that interval.
  • 429 quota_exceeded responses can be retried after the workspace allowance resets or changes.
  • 422 batch_exceeds_limit means 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.