Zum Inhalt springen
Entwickler

anicall.io API v2 und MCP-Server

Die REST-API v2 von anicall.io unter https://api.anicall.io/api/v2 steuert Agenten, Wissensbasis, Anrufe und Anruf-Aufträge; signierte Webhooks melden Ereignisse, und der MCP-Server unter https://api.anicall.io/mcp macht alles für KI-Agenten wie Claude nutzbar.

Mehr zu anicall.io

Stand: November 2026

Auf einen Blick

Anmeldung
Authorization: Bearer anc_live_…

Authentifizierung

Jede Anfrage an API v2 und MCP-Server trägt einen Schlüssel im Header Authorization: Bearer anc_live_….

Schlüssel legst du im Dashboard unter Einstellungen → Integrationen an. anicall speichert nur einen SHA-256-Hash, den Klartext siehst du einmal beim Anlegen. Feldnamen sind camelCase, Fehler kommen als JSON {"error": "…", "message": "…"}.

curl https://api.anicall.io/api/v2/agents \
  -H "Authorization: Bearer anc_live_…"

Rechte (Scopes)

Jeder Schlüssel bekommt nur die Rechte, die du vergibst; das Freigeben von Anruf-Aufträgen (dial_jobs:approve) ist ein eigenes Recht.

RechtBedeutung
agents:readAgenten und ihre Konfiguration lesen
agents:writeAgenten konfigurieren (Wissensgrenze, Kalender, Aktiv-Status)
knowledge:readWissensquellen, Wissenslücken und Wissenssuche lesen
knowledge:writeWissensquellen anlegen, Antworten freigeben
calls:readAnrufe, Transkripte und Ergebnisse lesen
calls:writeEinzelne Outbound-Anrufe starten
dial_jobs:writeAnruf-Aufträge anlegen und pausieren
dial_jobs:approveAnruf-Aufträge freigeben (Mensch im Freigabe-Tor)
phone_numbers:readRufnummern lesen
phone_numbers:writeRufnummern Agenten zuweisen
calendars:readKalenderverbindungen lesen
calendars:writeKalender (Calendly) verbinden
stats:readKennzahlen lesen
webhooks:manageWebhook-Abos verwalten

Endpunkte

API v2 hat Endpunkte für Konto, Agenten, Wissensbasis, Wissenslücken, Rufnummern, Kalender, Anrufe, Anruf-Aufträge, Kennzahlen und Webhooks.

MethodePfadRechtBedeutung
GET/api/v2/meagents:readKonto, Tarif, verfügbare Rechte und Ereignistypen
GET/api/v2/agentsagents:readAgenten auflisten
GET/api/v2/agents/{agentId}agents:readEinen Agenten abrufen
PATCH/api/v2/agents/{agentId}agents:writeAgent konfigurieren: Wissensgrenze, Kalender, Aktiv-Status
GET/api/v2/agents/{agentId}/knowledgeknowledge:readWissensquellen eines Agenten
POST/api/v2/agents/{agentId}/knowledgeknowledge:writeWissensquelle hinzufügen (z. B. Website)
POST/api/v2/agents/{agentId}/knowledge/searchknowledge:readWissensbasis durchsuchen
GET/api/v2/agents/{agentId}/knowledge-gapsknowledge:readOffene Wissenslücken
POST/api/v2/agents/{agentId}/knowledge-gaps/{gapId}/answerknowledge:writeWissenslücke beantworten (geht in den Antwortkatalog)
POST/api/v2/agents/{agentId}/knowledge-gaps/{gapId}/dismissknowledge:writeWissenslücke verwerfen
POST/api/v2/agents/{agentId}/answersknowledge:writeAntwort direkt im Antwortkatalog anlegen
GET/api/v2/phone-numbersphone_numbers:readRufnummern auflisten
PATCH/api/v2/phone-numbers/{numberId}phone_numbers:writeRufnummer einem Agenten zuweisen
GET/api/v2/calendarscalendars:readKalenderverbindungen auflisten
POST/api/v2/calendars/calendlycalendars:writeCalendly verbinden
GET/api/v2/callscalls:readAnrufe mit Ergebnis und Nachprüfung
GET/api/v2/calls/{callId}calls:readEin Anruf mit Transkript und Zusammenfassung
POST/api/v2/callscalls:writeEinzelanruf starten (Kontaktgrundlage Pflicht)
POST/api/v2/dial-jobsdial_jobs:writeAnruf-Auftrag anlegen (wartet auf Freigabe)
GET/api/v2/dial-jobs/{jobId}dial_jobs:writeStatus eines Anruf-Auftrags
POST/api/v2/dial-jobs/{jobId}/approvedial_jobs:approveAnruf-Auftrag freigeben
POST/api/v2/dial-jobs/{jobId}/pausedial_jobs:writeAnruf-Auftrag pausieren
GET/api/v2/statsstats:readKennzahlen: Anrufe, Minuten, Ergebnisse, Ampel
GET/api/v2/webhookswebhooks:manageWebhook-Abos auflisten
POST/api/v2/webhookswebhooks:manageWebhook-Abo anlegen
DELETE/api/v2/webhooks/{webhookId}webhooks:manageWebhook-Abo löschen
POST/api/v2/webhooks/{webhookId}/testwebhooks:manageTest-Ereignis senden

Webhooks und Signatur

anicall signiert jede Webhook-Zustellung mit HMAC-SHA256 über Zeitstempel und Rohdaten des Bodys.

X-Anicall-Signature: t=<unix ts>,v1=<hex HMAC-SHA256(secret, "<ts>.<body>")>

Jede Zustellung trägt die Header X-Anicall-Event, X-Anicall-Delivery und X-Anicall-Signature. Prüfe die Signatur gegen den Roh-Body und verwirf Zeitstempel, die älter als 5 Minuten sind.

Scheitert eine Zustellung, versucht anicall es nach 1, 5 und 30 Minuten sowie nach 2 und 6 Stunden erneut. Mit POST /webhooks/{id}/test schickst du ein Test-Ereignis.

EreignisBedeutung
call.startedEin Anruf hat begonnen (inbound oder outbound).
call.completedEin Anruf ist beendet; Transkript, Zusammenfassung und Ergebnis liegen vor.
call.reviewedDie Nachprüfung der Wissensgrenze ist fertig (Ampel ok/warn/fail).
appointment.bookedDer Agent hat einen Termin gebucht.
callback.requestedDer Anrufer wünscht einen Rückruf durch einen Menschen.
knowledge.gapEine Sachfrage konnte nicht aus der Wissensbasis beantwortet werden.
lead.updatedEin Lead hat einen neuen Status oder ein neues Ergebnis.
lead.dncEin Kontakt hat widersprochen und ist gesperrt.
dial_job.approval_requiredEin Anruf-Auftrag wartet auf menschliche Freigabe.
dial_job.completedEin Anruf-Auftrag ist vollständig abgearbeitet.
Signatur prüfen (Node.js)
import crypto from 'node:crypto'

// header = X-Anicall-Signature, rawBody = unveränderter Request-Body (String)
export function verifyAnicallSignature(secret, rawBody, header, toleranceSec = 300) {
  const parts = Object.fromEntries(header.split(',').map((p) => p.split('=')))
  const t = Number(parts.t)
  if (!t || Math.abs(Date.now() / 1000 - t) > toleranceSec) return false
  const expected = crypto.createHmac('sha256', secret).update(`${t}.${rawBody}`).digest('hex')
  const a = Buffer.from(expected)
  const b = Buffer.from(parts.v1 ?? '')
  return a.length === b.length && crypto.timingSafeEqual(a, b)
}

MCP-Server für KI-Agenten

Der MCP-Server von anicall spricht Streamable HTTP (zustandslos) unter POST https://api.anicall.io/mcp und nutzt denselben Schlüssel und dieselben Rechte wie API v2.

Einrichten in Claude Code

Füge den Server mit deinem Schlüssel als Header hinzu. Andere MCP-Clients, die Streamable HTTP mit Authorization-Header unterstützen, richtest du genauso ein.

claude mcp add --transport http anicall https://api.anicall.io/mcp \
  --header "Authorization: Bearer anc_live_…"

Werkzeuge, die echte Anrufe auslösen, sind als destruktiv markiert. Anruf-Aufträge starten erst nach approve_dial_job durch einen Menschen.

Werkzeuge

WerkzeugBedeutung
list_agentsAgenten auflisten
get_agentKonfiguration eines Agenten
set_agent_strictnessWissensgrenze eines Agenten setzen
search_knowledgeWissensbasis durchsuchen
add_knowledge_sourceWissensquelle hinzufügen
list_knowledge_gapsWissenslücken auflisten
answer_knowledge_gapWissenslücke beantworten
list_callsAnrufe mit Ergebnis und Ampel
get_callAnruf mit Transkript und Nachprüfung
start_callEinzelanruf starten (destruktiv)
create_dial_jobAnruf-Auftrag anlegen (destruktiv)
approve_dial_jobAnruf-Auftrag freigeben (destruktiv)
get_dial_jobStatus eines Anruf-Auftrags
get_statsKennzahlen

Häufige Fragen

Wo finde ich die OpenAPI-Spezifikation?

Unter https://api.anicall.io/api/v2/openapi.json. Sie enthält alle Endpunkte von API v2 und eignet sich für Codegeneratoren und KI-Agenten.

Kann ein KI-Agent über MCP selbst Anrufe starten?

Einzelanrufe nur mit dem Recht calls:write und einer Kontaktgrundlage. Anruf-Listen legt ein Agent als Auftrag an; sie starten erst, wenn ein Mensch sie mit approve_dial_job oder im Dashboard freigibt.

Wie prüfe ich, ob ein Webhook echt von anicall kommt?

Berechne HMAC-SHA256 mit deinem Webhook-Secret über "<t>.<roher Body>" und vergleiche das Ergebnis zeitkonstant mit v1 aus dem Header X-Anicall-Signature. Verwirf Zeitstempel, die älter als 5 Minuten sind.

Erstelle deinen ersten API-Schlüssel

Im Dashboard unter Einstellungen → Integrationen – mit genau den Rechten, die deine Integration braucht.