Holen Sie sich lokale, nationale und internationale Nummern direkt online.
🤖 KI-bereites IVR

IVR-Toolkit

Das IVR-Toolkit ist CallFactory’s Aktionsbibliothek für Entwickler zum Erstellen benutzerdefinierter Anrufflüsse. Jede Aktion — Answer, Play, Dial, Record, StartStream und mehr — gibt Ihnen präzise Kontrolle über das, was während eines Anrufs passiert.

Verwenden Sie es, um Telefonmenüs zu erstellen, Eingaben von Anrufern zu sammeln, Audio an KI-Dienste zu streamen, Anrufer mit Agenten zu verbinden und jeden Grenzfall zu behandeln. Das Toolkit läuft auf derselben IVR-Plattform, die alle CallFactory-Funktionen antreibt.

  • Strukturierte Aktionen mit klaren Signaturen und Beispielen
  • Stream-Audio an KI, STT oder benutzerdefinierte Endpunkte
  • Erstellen Sie komplette Anrufflüsse ohne zusätzliche Hardware
  • Vollständige Dokumentation und Entwicklerunterstützung

Vorteile des IVR-Toolkits

Sehen Sie, wie das IVR-Toolkit Entwicklungsteams beim Erstellen leistungsstarker Anrufflüsse hilft.

🧩

Vollständige Kontrolle über die Anruflogik

Definieren Sie genau, was bei jedem Schritt eines Anrufs passiert. Spielen Sie Eingabeaufforderungen ab, sammeln Sie Eingaben, leiten Sie basierend auf Bedingungen weiter, streamen Sie zu KI und behandeln Sie Fehler — alles mit vorhersehbaren, gut dokumentierten Aktionen.

⚙️

Für Entwickler gemacht

Jede Aktion hat eine klare Signatur, typisierte Rückgabewerte, Fehlerbehandlung und funktionierende Code-Beispiele. Bauen Sie mit Vertrauen mit strukturierten Aktionen, die natürlich in Ihr Backend passen.

🤖

KI-bereites Audio-Streaming

Streamen Sie Live-Call-Audio an jeden WebSocket-Endpoint — einen KI-Assistenten, eine Spracherkennungs-Engine oder Ihren eigenen Analysedienst. StartStream und StopStream geben Ihnen volle Kontrolle über wann und wohin Audio fließt.

🔧

Läuft auf bewährter Infrastruktur

Das Toolkit läuft auf CallFactory's eigener IVR-Plattform — der gleichen Infrastruktur, die alle unsere Telefoniefunktionen antreibt. Keine zusätzliche Hardware, keine Abhängigkeiten von Drittanbietern. Funktioniert mit Ihren bestehenden CallFactory-Nummern.

IVR-Aktions-Toolkit

Klicken Sie auf eine Aktion, um ihre Beschreibung, Signatur und Beispiele anzuzeigen.

Beantwortet einen eingehenden Anruf. Muss vor dem Abspielen von Audio oder dem Sammeln von Eingaben bei eingehenden Anrufen aufgerufen werden.

Description

  • Markiert den Anruf auf der Telefonienseite als beantwortet.
  • Erforderlich vor der Verwendung von Aktionen wie Play, PromptDigit, GatherDigits, Dial, Record usw. bei eingehenden Anrufen.

Throws

  • InvalidOperationException - wenn der Anruf bereits beantwortet wurde.

Signature

void Answer();

Example

protected override async Task 
HandleCallAsync(CancellationToken ct)
{
    // Immer zuerst beantworten bei eingehenden Anrufen
    Answer();

    await Play("welcome.wav", ct);
}

Spielt eine Audiodatei für den Anrufer oder einen ausgehenden Kanal ab.

Description

  • Spielt eine Audiodatei (z.B. .wav) aus dem Audio-Verzeichnis des Servers ab.
  • Kann den eingehenden Anrufer oder einen bestimmten OutboundChannel als Ziel haben.

Parameters

  • audioFile - Dateiname/Pfad relativ zum IVR-Audio-Verzeichnis.
  • channel - (optional) Ausgehender Kanal, an den Audio abgespielt werden soll.
  • ct - Abbruch-Token; wird abgebrochen, wenn der Anrufer oder der Kanal die Verbindung trennt.

Returns

  • PlayResult.Success - Audio vollständig abgespielt.
  • PlayResult.Fail - Wiedergabe fehlgeschlagen (z.B. ungültige Datei).
  • PlayResult.Cancel - Operation abgebrochen (z.B. Anrufer aufgelegt).
  • PlayResult.Error - Unerwarteter Fehler bei der Wiedergabe.

Throws

  • OperationCanceledException - Wenn ct während der Wiedergabe abgebrochen wird.
  • Andere Transport-/IO-Ausnahmen je nach Implementierung.

Signatures

Task<PlayResult> Play(
    string audioFile,
    CancellationToken ct = default);

Task<PlayResult> Play(
    string audioFile,
    OutboundChannel channel,
    CancellationToken ct = default);

Example

protected override async Task HandleCallAsync(CancellationToken ct)
{
    Answer();
    var result = await Play("welcome.wav", ct);

    if (result != PlayResult.Success)
    {
        Logger.LogWarning("Willkommensnachricht konnte nicht abgespielt werden (Ergebnis: {Result})", result); 
        return;
    }

    await Play("next_prompt.wav", ct);
}

Spielt eine Audio-Eingabeaufforderung ab und sammelt eine einzelne DTMF-Ziffer.

Description

  • Spielt eine Menü-Eingabeaufforderung ab (z.B. ‘Drücken Sie 1 für Verkauf, 2 für Support, 3 um eine Nachricht zu hinterlassen.’).
  • Wartet auf eine einzelne DTMF-Ziffer: 0-9, *, oder #.
  • Gedacht für Hauptmenü-Auswahlungen.

Parameters

  • audioFile - Eingabeaufforderungsdatei zum Abspielen.
  • timeoutSeconds - Wie lange auf eine Ziffer gewartet wird (Standard 10).
  • ct - Abbruch-Token; wird abgebrochen, wenn der Anrufer trennt.

Returns

  • MenuResult.Success mit Digit wenn eine Ziffer eingegeben wird.
  • MenuResult.Timeout wenn keine Ziffer innerhalb von timeoutSeconds eingegeben wird.
  • MenuResult.Cancel wenn Operation abgebrochen wird.

Throws

  • OperationCanceledException - Wenn ct abgebrochen wird (z.B. Anrufer legt auf).

Signatures

Task<(MenuResult Result, char? Digit)> PromptDigit(
    string audioFile,
    int timeoutSeconds = 10,
    CancellationToken ct = default);

Example

protected override async Task HandleCallAsync(CancellationToken ct)
{
    Answer();
    await Play("welcome.wav", ct);

    var (menuResult, digit) = await PromptDigit(
        "main_menu.wav",
        timeoutSeconds: 10,
        ct);

    if (menuResult == MenuResult.Success && digit.HasValue)
    {
        switch (digit.Value)
        {
            case '1':
                await HandleSales(ct);
                break;
            case '2':
                await HandleSupport(ct);
                break;
            default:
                await Play("invalid_option.wav", ct);
                await Hangup(ct);
                break;
        }
    }
    else if (menuResult == MenuResult.Timeout)
    {
        await Play("no_input_goodbye.wav", ct);
        await Hangup(ct);
    }
    else
    {
        await Play("system_error.wav", ct);
        await Hangup(ct);
    }
}

Spielt eine Eingabeaufforderung ab und sammelt mehrere DTMF-Ziffern (z.B. Kontonummer, PIN).

Description

  • Spielt eine Eingabeaufforderung ab, die den Anrufer auffordert, mehrere Ziffern einzugeben.
  • Stoppt wenn entweder:
    • maxDigits erreicht ist
    • Eine Beendigungsziffer (z.B. #) gedrückt wird
    • Timeout abläuft

Parameters

  • audioFile – Eingabeaufforderung zum Abspielen (z.B. “Bitte geben Sie Ihre Kontonummer gefolgt von # ein”).
  • maxDigits – Maximale Ziffern zum Sammeln vor dem Stopp.
  • terminationDigits – String von Ziffern, die das Sammeln beenden.
  • timeoutSeconds – Maximale Zeit zum Warten auf Eingaben.
  • ct – Abbruch-Token.

Returns

  • Tuple (GatherResult Result, string? Digits):
  • GatherResult.Success und Digits gesetzt wenn Eingabe erfasst wird.
  • GatherResult.Timeout wenn keine Eingabe empfangen wird.
  • GatherResult.Cancel wenn Operation abgebrochen wird.
  • GatherResult.Error bei unerwartetem Fehler.

Throws

  • OperationCanceledException - Wenn ct abgebrochen wird (Anrufer legt auf).

Signatures

Task<(GatherResult Result, string? Digits)> GatherDigits(
    string audioFile,
    int maxDigits = 20,
    string terminationDigits = "#",
    int timeoutSeconds = 30,
    CancellationToken ct = default);

Example

protected override async Task 
HandleCallAsync(CancellationToken ct)
{
    Answer();
    await Play("welcome.wav", ct);

    var (result, digits) = await GatherDigits(
        "enter_account.wav",
        maxDigits: 10,
        terminationDigits: "#",
        timeoutSeconds: 30,
        ct);

    if (result == GatherResult.Success && !string.IsNullOrEmpty(digits))
    {
        await ProcessAccountNumber(digits, ct);
    }
    else if (result == GatherResult.Timeout)
    {
        await Play("no_input_goodbye.wav", ct);
        await Hangup(ct);
    }
    else
    {
        await Play("system_error.wav", ct);
        await Hangup(ct);
    }
}

Wählt eine oder mehrere ausgehende Telefonnummern und gibt einen OutboundChannel bei Antwort zurück.

Description

  • Leitet einen ausgehenden Anruf zu einem einzelnen Ziel oder zu mehreren Zielen parallel ein.
  • Bei mehreren Zielen gewinnt der erste, der antwortet; alle anderen werden abgebrochen.

Parameters

  • destination / destinations – Telefonnummer(n) zum Wählen.
  • callerId – Nummer zur Anzeige als Anrufer-ID.
  • ringTimeoutSeconds – Maximale Zeit zum Klingeln vor dem Aufgeben.
  • ct – Abbruch-Token.

Returns

  • Einzelnes Ziel:
  • (DialerResult Result, OutboundChannel? Channel)
  • Mehrere Ziele:
  • (DialerResult Result, string? AnsweredDestination, OutboundChannel? Channel)
  • DialerResult kann sein: Init, Ringing, Answered, Busy, Rejected, NoAnswer, Failed, Cancel.

Throws

  • OperationCanceledException – Wenn die Operation während des Wählens abgebrochen wird.

Signatures

Task<(DialerResult Result, OutboundChannel? Channel)> Dial(
    string destination,
    string callerId,
    int ringTimeoutSeconds = 60,
    CancellationToken ct = default);

Task<(DialerResult Result, string? AnsweredDestination,
OutboundChannel? Channel)> Dial(
    string[] destinations,
    string callerId,
    int ringTimeoutSeconds = 40,
    CancellationToken ct = default);

Beispiel (einzelnes Ziel)

private async Task TransferToSupport(CancellationToken ct)
{
    var (dialResult, channel) = await Dial(
        destination: "18885554444",
        callerId: Context.Ani,
        ringTimeoutSeconds: 30,
        ct);

    if (dialResult == DialerResult.Answered && channel != null)
    {
        await Play("connecting_to_support.wav", ct);
        await Connect(channel, ct);
    }
    else
    {
        await Play("support_unavailable.wav", ct);
        await HandleVoicemail(ct);
    }
}

Beispiel (mehrere Ziele)

private async Task TransferToSalesHuntGroup(CancellationToken ct)
{
    var salesTeam = new[]
    {
        "18885551111",
        "18885552222",
        "18885553333"
    };

    var (result, answeredNumber, channel) = await Dial(
        destinations: salesTeam,
        callerId: Context.Ani,
        ringTimeoutSeconds: 40,
        ct);

    if (result == DialerResult.Answered && channel != null)
    {
        Logger.LogInformation("Connected to sales agent {Number}", answeredNumber);
        await Connect(channel, ct);
    }
    else
    {
        await Play("sales_unavailable.wav", ct);
        await HandleVoicemail(ct);
    }
}

Verbindet Audio zwischen zwei Kanälen.

Description

  • Für eingehende Flüsse: verbindet den eingehenden Anrufer mit einem ausgehenden Kanal.
  • Für reine ausgehende Szenarien: verbindet zwei ausgehende Kanäle miteinander.
  • Blockiert, bis eine Seite auflegt oder die Verbindung anderwie beendet wird.

Parameters

  • channel – Ausgehender Kanal zum Verbinden mit dem eingehenden Anruf.
  • primary, secondary – Zwei ausgehende Kanäle zum Überbrücken.
  • ct – Abbruch-Token.

Returns

  • ConnectResult.Success – Verbindung normal beendet (Anruf beendet).
  • ConnectResult.Error – Verbindung konnte nicht hergestellt oder fehlgeschlagen.

Throws

  • OperationCanceledException – Wenn ct während der Verbindung abgebrochen wird.

Signatures

Task<ConnectResult> Connect(
    OutboundChannel channel,
    CancellationToken ct = default);

Task<ConnectResult> Connect(
    OutboundChannel primary,
    OutboundChannel secondary,
    CancellationToken ct = default);

Example

protected override async Task HandleCallAsync(CancellationToken ct)
{
    Answer();

    await Play("connecting_you_now.wav", ct);

    var (dialResult, channel) = await Dial(
        destination: "18885550000",
        callerId: Context.Ani,
        ringTimeoutSeconds: 30,
        ct);

    if (dialResult == DialerResult.Answered && channel != null)
    {
        var connectResult = await Connect(channel, ct);
        Logger.LogInformation("Connection ended with result: {Result}", connectResult);
    }
    else
    {
        await Play("agent_unavailable.wav", ct);
    }

    await Hangup(ct);
}

Zeichnet Audio vom Anrufer oder einem ausgehenden Kanal auf.

Description

  • Startet die Aufzeichnung vom eingehenden Anrufer oder einem bestimmten ausgehenden Kanal.
  • Endet wenn:
    • timeLimitSeconds erreicht wird
    • Eine Beendigungsziffer gedrückt wird (falls konfiguriert)
    • Anrufer oder Kanal auflegt

Parameters

  • timeLimitSeconds – Maximale Aufzeichnungslänge.
  • fileName – Optionaler benutzerdefinierter Dateiname (auto-generiert wenn null).
  • terminationDigits – DTMF-Ziffern, die die Aufzeichnung stoppen.
  • playBeep – Ob ein Beep vor der Aufzeichnung abgespielt werden soll.
  • channel – Optionaler ausgehender Kanal.
  • ct – Abbruch-Token.

Returns

  • Tuple (RecordResult Result, string? FilePath):
  • RecordResult.Success mit FilePath wird gespeichert.
  • RecordResult.Timeout, MaxDurationReached, TerminationDigit, Cancel, Error.

Throws

  • OperationCanceledException wenn abgebrochen.

Signatures

Task<(RecordResult Result, string? FilePath)> Record(
    int timeLimitSeconds = 120,
    string? fileName = null,
    string? terminationDigits = null,
    bool playBeep = true,
    CancellationToken ct = default);

Task<(RecordResult Result, string? FilePath)> Record(
    OutboundChannel channel,
    int timeLimitSeconds = 120,
    string? fileName = null,
    string? terminationDigits = null,
    bool playBeep = true,
    CancellationToken ct = default);

Example

private async Task HandleVoicemail(CancellationToken ct)
{
    await Play("leave_message_after_beep.wav", ct);

    var (recordResult, filePath) = await Record(
        timeLimitSeconds: 180,
        fileName: null,
        terminationDigits: "#",
        playBeep: true,
        ct: ct);

    if (recordResult == RecordResult.Success && !string.IsNullOrEmpty(filePath))
    {
        Logger.LogInformation("Voicemail saved at {Path}", filePath);
        await Play("thank_you_message_received.wav", ct);
    }
    else
    {
        Logger.LogWarning("Recording failed: {Result}", recordResult);
        await Play("recording_failed.wav", ct);
    }

    await Hangup(ct);
}

Lehnt einen eingehenden Anruf mit einem SIP-Grund-Code ab und beendet den Anruf.

Description

  • Verwendet für Anruf-Screening, Blockierung und Verhalten außerhalb der Geschäftszeiten.
  • Gibt einen SIP-Fehlercode an den Upstream-Carrier zurück.

Parameters

  • reasonRejectReason.Busy, .TemporarilyUnavailable, .Declined.
  • ct – Abbruch-Token.

Returns

  • RejectResult.Success – Anruf abgelehnt.
  • RejectResult.AlreadyAnswered – Anruf bereits beantwortet.
  • RejectResult.Error – Fehler beim Ablehnen.

Throws

  • OperationCanceledException wenn abgebrochen.

Signatures

Task<RejectResult> Reject(
    RejectReason reason = RejectReason.Busy,
    CancellationToken ct = default);

Example

protected override async Task HandleCallAsync(CancellationToken ct)
{
    if (IsBlockedNumber(Context.Ani))
    {
        await Reject(RejectReason.Declined, ct);
        return;
    }

    if (!IsWithinBusinessHours(DateTime.UtcNow))
    {
        await Reject(RejectReason.TemporarilyUnavailable, ct);
        return;
    }

    // Normaler Ablauf
    Answer();
    await Play("welcome.wav", ct);
}

Beendet sauber den aktiven Anruf.

Description

  • Beendet den Anruf von der IVR-Seite.

Returns

  • HangupResult.Success – Anruf erfolgreich beendet.
  • HangupResult.NotAnswered – Nie beantwortet.
  • HangupResult.AlreadyDisconnected – Anrufer hat aufgelegt.
  • HangupResult.Error – Hangup fehlgeschlagen.

Throws

  • OperationCanceledException wenn abgebrochen.

Signature

Task<HangupResult> Hangup(CancellationToken ct = default);

Example

protected override async Task HandleCallAsync(CancellationToken ct)
{
    Answer();

    await Play("goodbye.wav", ct);

    var result = await Hangup(ct);
    Logger.LogInformation("Hangup result: {Result}", result);
}

Pausiert die Ausführung für eine bestimmte Anzahl von Sekunden.

Description

  • Wartet durationSeconds, während der Anruf offen bleibt.
  • Kann durch DTMF-Eingabe unterbrochen werden, abhängig von der Implementierung.

Parameters

  • durationSeconds – Dauer in Sekunden.
  • ct – Abbruch-Token.

Returns

  • PauseResult.Success – Pause normal abgeschlossen.
  • PauseResult.Interrupted – Anrufer hat während der Pause eine Taste gedrückt (falls unterstützt).
  • PauseResult.Cancel – Operation abgebrochen.
  • PauseResult.Error – Pause fehlgeschlagen.

Throws

  • OperationCanceledException – Wenn ct abgebrochen wird.

Signatures

Task<PauseResult> Pause(
    int durationSeconds,
    CancellationToken ct = default
);

Example

protected override async Task HandleCallAsync(CancellationToken ct)
{
    Answer();

    await Play("please_wait.wav", ct);

    var result = await Pause(3, ct);

    if (result == PauseResult.Interrupted)
    {
        await Play("you_pressed_a_key.wav", ct);
    }
    else
    {
        await Play("thank_you_for_waiting.wav", ct);
    }

    await Hangup(ct);
}

Sendet einen Besetztton an den Anrufer und beendet den Anruf.

Description

  • Präsentiert einen standardmäßigen Besetztton.
  • Wird häufig verwendet, wenn alle Agenten/Leitungen belegt sind.

Returns

  • BusyResult.Success – Besetztton gesendet und Anruf beendet.
  • BusyResult.Cancel – Operation abgebrochen.
  • BusyResult.Error – Fehler beim Senden des Besetzttons oder Beenden des Anrufs.

Throws

  • OperationCanceledException – Wenn ct abgebrochen wird.

Signature

Task<BusyResult> Busy(CancellationToken ct = default);

Example

protected override async Task HandleCallAsync(CancellationToken ct)
{
    if (AllAgentsBusy())
    {
        var result = await Busy(ct);
        Logger.LogInformation("Busy result: {Result}", result);
        return;
    }

    // Andernfalls mit normalem Fluss fortfahren
    Answer();
    await Play("welcome.wav", ct);
}

Beginnt mit dem Streamen des Live-Audio des Anrufs zu einem externen Endpunkt (z.B. KI oder STT-Engine).

Description

  • Öffnet einen Real-Time-Medien-Stream vom Anruf zur angegebenen URL (z.B. WebSocket-Endpunkt).
  • Wird typischerweise verwendet, um Audio zu senden an:
    • einen KI-Assistenten,
    • eine Spracherkennungs-Engine,
    • einen benutzerdefinierten Analyse-/Überwachungsdienst.
  • Es wird nur ein aktiver Stream pro Anruf empfohlen.

Parameters

  • url – Ziel-Streaming-Endpunkt (z.B. wss://ai.callfactory.nl/voice-stream).
  • options – Optionale Streaming-Konfiguration (Richtung, Metadaten, Name).
  • ct – Abbruch-Token. Wenn abgebrochen, wird der Stream geschlossen.

Throws

  • OperationCanceledException – Wenn ct während des Setups abgebrochen wird.
  • Verbindungs-/Transport-Ausnahmen je nach Implementierung.

Signaturen

Task<StreamResult> StartStream(
    string url,
    StreamOptions? options = null,
    CancellationToken ct = default
);

Parameter

public class StreamOptions
{
    public string? Name { get; set; }                           //
Optionaler Stream-Name
    public StreamDirection Direction { get; set; } =
        StreamDirection.Both;
    public Dictionary<string, string>? Metadata { get; set; }
}

public enum StreamDirection
{
    Inbound,   // Vom Anrufer zur KI
    Outbound,  // Vom Agent/System zur KI
    Both
}

Rückgaben

public enum StreamResult
{
    Started,        // Stream erfolgreich gestartet
    Stopped,        // Stream erfolgreich gestoppt (für StopStream)
    AlreadyStarted, // Ein Stream ist bereits aktiv
    NotActive,      // Kein aktiver Stream (für StopStream)
    Error           // Fehler beim Starten/Stoppen
}

Example

protected override async Task
HandleCallAsync(CancellationToken ct)
{
    Answer();

    // Starten Sie das Streaming des Anrufer-Audio zur KI
    var streamResult = await StartStream(
        url: "wss://ai.callfactory.nl/voice-stream",
        options: new StreamOptions
        {
            Name = "support-ai",
            Direction = StreamDirection.Inbound,
            Metadata = new Dictionary<string, string>
            {
                ["caller"] = Context.Ani,
                ["dnis"] = Context.Dnis
            }
        },
        ct
    );

    if (streamResult != StreamResult.Started)
    {
        Logger.LogWarning("Failed to start AI stream:
{Result}", streamResult);
        await Play("ai_unavailable.wav", ct);
        await Hangup(ct);
        return;
    }

    await Play("connected_to_ai.wav", ct);

    // Fortgesetzt IVR-Logik während der Streaming...
    var (menuResult, digit) = await
PromptDigit("ai_menu.wav", 30, ct);

    if (menuResult == MenuResult.Success && digit == '0')
    {
        // Anrufer möchte einen menschlichen Agenten
        await StopStream(ct);
        await Play("transferring_to_human_agent.wav", ct);
        await TransferToHuman(ct);
    }
    else
    {
        await Play("thank_you_goodbye.wav", ct);
        await StopStream(ct);
        await Hangup(ct);
    }
}

Stoppt einen aktiven Audio-Stream, der zuvor mit StartStream gestartet wurde.

Description

  • Herunterfahren des aktiven Medien-Streams sauber.
  • Hängt den Anruf nicht auf — stoppt nur das Audio-Senden.
  • Sicher zu rufen, auch wenn kein Stream aktiv ist (gibt NotActive zurück).

Parameters

  • ct – Abbruch-Token.

Returns

  • StreamResult.Stopped – Stream erfolgreich gestoppt.
  • StreamResult.NotActive – Kein aktiver Stream gefunden.
  • StreamResult.Error – Fehler beim Stoppen des Streams.

Throws

  • OperationCanceledException – Wenn ct abgebrochen wird.

Signatures

Task<StreamResult> StopStream(
    CancellationToken ct = default);

Example

private async Task TransferToHuman(CancellationToken ct)
{
    // Stoppen Sie das KI-Streaming vor dem Transfer zum menschlichen Agenten
    var stopResult = await StopStream(ct);
    Logger.LogInformation("StopStream result: {Result}",
stopResult);

    await Play("transferring_to_agent.wav", ct);

    var (dialResult, channel) = await Dial(
        destination: "18005550000",
        callerId: Context.Ani,
        ringTimeoutSeconds: 30,
        ct
    );

    if (dialResult == DialerResult.Answered && channel !=
null)
    {
        await Connect(channel, ct);
    }
    else
    {
        await Play("agent_unavailable.wav", ct);
        await Hangup(ct);
    }
}

Wie das IVR-Toolkit funktioniert

Das IVR-Toolkit ist eine Aktionsbibliothek, die Ihr Code während eines Live-Anrufs aufruft. Wenn ein Anruf eingeht, empfängt Ihre Anwendung ihn und entscheidet, was zu tun ist — Schritt für Schritt — mit diesen Aktionen.

Ein typischer Fluss beginnt mit Answer(), spielt dann eine Willkommensnachricht mit Play() ab, sammelt Eingaben mit PromptDigit() oder GatherDigits() und leitet den Anrufer mit Dial() und Connect() weiter. Jede Aktion gibt ein typisiertes Ergebnis zurück, so dass Ihr Code immer weiß, was passiert ist und jeden Ausgang handhaben kann.

Audio-Streaming für KI und Spracherkennung

Die StartStream und StopStream Aktionen ermöglichen es Ihnen, Live-Call-Audio in Echtzeit an jeden WebSocket-Endpunkt zu streamen. Auf diese Weise verbinden Sie einen Anruf mit einem KI-Assistenten, einer Spracherkennungs-Engine oder einem benutzerdefinierten Analysedienst.

Sie kontrollieren, wenn das Streaming startet, in welche Richtung das Audio fließt (Anrufer zu KI, Agent zu KI oder beide) und wann es stoppt. Der Stream läuft parallel zu Ihren anderen IVR-Aktionen — sodass Sie weiterhin Eingabeaufforderungen abspielen, Eingaben sammeln oder den Anruf übertragen können, während die KI das Audio im Hintergrund verarbeitet.

Wer verwendet das IVR-Toolkit

Das Toolkit wurde für Entwicklungsteams entworfen, die vollständige Kontrolle über das Anrufverhalten benötigen. SaaS-Plattformen, die ihrem Produkt Sprachfunktionen hinzufügen. Callcenter, die benutzerdefinierte Routing-Logik erstellen. Unternehmen, die Telefonie mit ihrem CRM, ERP oder internen Tools integrieren.

Wenn Ihr Team Entwickler hat, die Backend-Code schreiben können, gibt das IVR-Toolkit ihnen alles, was sie brauchen, um professionelle Anrufflüsse zu erstellen — von einfachen Menüs bis zu komplexen KI-gesteuerten Gesprächen. Dokumentation, Code-Beispiele und Entwicklerunterstützung sind enthalten.

Das Verhältnis zwischen Toolkit und Plattformfunktionen

Jede CallFactory-Funktion — Telefonmenüs, Anrufwarteschlangen, Voicemail, Voicebots — ist auf den gleichen IVR-Aktionen aufgebaut, die in diesem Toolkit dokumentiert sind. Das Toolkit gibt Ihnen direkten Zugang zu den gleichen Bausteinen.

Das bedeutet, alles, was CallFactory kann, kann Ihr Entwicklungsteam auch — und mehr. Sie können Standard-Funktionen mit benutzerdefinerter Logik kombinieren, Integrationen hinzufügen, die nicht als Standard-Funktionen existieren, und Anrufflüsse erstellen, die völlig einzigartig für Ihr Unternehmen sind.

Erste Schritte

Kontaktieren Sie uns, um Ihre Anforderungen zu besprechen. Wir bieten Ihrem Team Zugriff auf die Toolkit-Dokumentation, Code-Beispiele und eine Entwicklungsumgebung. Wenn Sie Hilfe beim Entwerfen Ihres ersten Anrufflusses benötigen, kann unser Team Sie in Bezug auf Architektur und Best Practices beraten.

Für Unternehmen, die maximale Kapazität und Isolierung benötigen, ist der natürliche Upgrade-Pfad dedizierte IVR-Server — eine vollständig private Umgebung, in der Ihre benutzerdefinierten Anrufflüsse auf einer exklusiv für Sie reservierten Infrastruktur ausgeführt werden.

Erfahren Sie mehr über andere Funktionen

Finden Sie weitere Informationen über unsere Funktionen, die Ihre Geschäftskommunikation verbessern.

IVR-Toolkit - Häufig gestellte Fragen

Erhalten Sie klare Antworten zum IVR-Toolkit und wie es für Ihr Unternehmen funktioniert.

Ja. Das Toolkit wurde für Entwicklungsteams entworfen, die Backend-Code schreiben. Jede Aktion hat eine klare Signatur und typisierte Rückgabewerte. Wenn Sie keine Entwickler haben, erwägen Sie stattdessen unsere individuelle Telefonie oder Voicebot-Optionen.

Das Toolkit verwendet C# (.NET) als primäre Sprache. Alle Aktionen, Signaturen und Beispiele in der Dokumentation sind in C#.

Ja. Die StartStream-Aktion öffnet eine Real-Time-WebSocket-Verbindung zu jedem Endpunkt — einen KI-Assistenten, eine Spracherkennungs-Engine oder Ihren eigenen Dienst. Sie kontrollieren die Audio-Richtung und können den Stream jederzeit stoppen.

Ja. Alle IVR-Aktionen funktionieren mit Ihren bestehenden CallFactory-Nummern und Weiterleitung. Es sind keine Änderungen an Ihrem Telefon-Setup erforderlich.

Ja. Das Toolkit verwendet die gleichen Bausteine wie alle CallFactory-Funktionen. Sie können Standard-Funktionen wie Telefonmenüs und Anrufwarteschlangen neben Ihrer benutzerdefinierten Logik verwenden.

Jede Aktion unterstützt Abbruch-Tokens. Wenn der Anrufer auflegt, wird das Token abgebrochen und Ihr Code erhält ein klares Signal zum Stoppen. Keine verwaisten Verbindungen oder ungeklärten Zustände.

Ja. Unser Team kann Sie in Bezug auf Architektur beraten, Ihr Fluss-Design überprüfen und Sie bei komplexeren Integrationen unterstützen. Für vollständig verwaltete Lösungen siehe unsere Dienste für individuelle Telefonie und Voicebots.

Das Toolkit selbst ist für CallFactory-Kunden verfügbar. Je nach Komplexität Ihrer Implementierung und Hosting-Anforderungen können zusätzliche Gebühren anfallen. Wir besprechen die Preisgestaltung, bevor mit irgendeiner Arbeit begonnen wird.

Zufriedene Callfactory-Kunden:

SignDirect logo
Bosch logo
Trigion logo
ANWB logo
UWV logo
Sogeti logo
Dille & Kamille logo
Nationale Ombudsman logo
KRO-NCRV logo
Swiss Sense logo