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.
Stand: November 2026
Auf einen Blick
- Basis-URL
- https://api.anicall.io/api/v2
- OpenAPI-Spezifikation
- https://api.anicall.io/api/v2/openapi.json
- MCP-Server
- https://api.anicall.io/mcp
- 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.
| Recht | Bedeutung |
|---|---|
agents:read | Agenten und ihre Konfiguration lesen |
agents:write | Agenten konfigurieren (Wissensgrenze, Kalender, Aktiv-Status) |
knowledge:read | Wissensquellen, Wissenslücken und Wissenssuche lesen |
knowledge:write | Wissensquellen anlegen, Antworten freigeben |
calls:read | Anrufe, Transkripte und Ergebnisse lesen |
calls:write | Einzelne Outbound-Anrufe starten |
dial_jobs:write | Anruf-Aufträge anlegen und pausieren |
dial_jobs:approve | Anruf-Aufträge freigeben (Mensch im Freigabe-Tor) |
phone_numbers:read | Rufnummern lesen |
phone_numbers:write | Rufnummern Agenten zuweisen |
calendars:read | Kalenderverbindungen lesen |
calendars:write | Kalender (Calendly) verbinden |
stats:read | Kennzahlen lesen |
webhooks:manage | Webhook-Abos verwalten |
Endpunkte
API v2 hat Endpunkte für Konto, Agenten, Wissensbasis, Wissenslücken, Rufnummern, Kalender, Anrufe, Anruf-Aufträge, Kennzahlen und Webhooks.
| Methode | Pfad | Recht | Bedeutung |
|---|---|---|---|
GET | /api/v2/me | agents:read | Konto, Tarif, verfügbare Rechte und Ereignistypen |
GET | /api/v2/agents | agents:read | Agenten auflisten |
GET | /api/v2/agents/{agentId} | agents:read | Einen Agenten abrufen |
PATCH | /api/v2/agents/{agentId} | agents:write | Agent konfigurieren: Wissensgrenze, Kalender, Aktiv-Status |
GET | /api/v2/agents/{agentId}/knowledge | knowledge:read | Wissensquellen eines Agenten |
POST | /api/v2/agents/{agentId}/knowledge | knowledge:write | Wissensquelle hinzufügen (z. B. Website) |
POST | /api/v2/agents/{agentId}/knowledge/search | knowledge:read | Wissensbasis durchsuchen |
GET | /api/v2/agents/{agentId}/knowledge-gaps | knowledge:read | Offene Wissenslücken |
POST | /api/v2/agents/{agentId}/knowledge-gaps/{gapId}/answer | knowledge:write | Wissenslücke beantworten (geht in den Antwortkatalog) |
POST | /api/v2/agents/{agentId}/knowledge-gaps/{gapId}/dismiss | knowledge:write | Wissenslücke verwerfen |
POST | /api/v2/agents/{agentId}/answers | knowledge:write | Antwort direkt im Antwortkatalog anlegen |
GET | /api/v2/phone-numbers | phone_numbers:read | Rufnummern auflisten |
PATCH | /api/v2/phone-numbers/{numberId} | phone_numbers:write | Rufnummer einem Agenten zuweisen |
GET | /api/v2/calendars | calendars:read | Kalenderverbindungen auflisten |
POST | /api/v2/calendars/calendly | calendars:write | Calendly verbinden |
GET | /api/v2/calls | calls:read | Anrufe mit Ergebnis und Nachprüfung |
GET | /api/v2/calls/{callId} | calls:read | Ein Anruf mit Transkript und Zusammenfassung |
POST | /api/v2/calls | calls:write | Einzelanruf starten (Kontaktgrundlage Pflicht) |
POST | /api/v2/dial-jobs | dial_jobs:write | Anruf-Auftrag anlegen (wartet auf Freigabe) |
GET | /api/v2/dial-jobs/{jobId} | dial_jobs:write | Status eines Anruf-Auftrags |
POST | /api/v2/dial-jobs/{jobId}/approve | dial_jobs:approve | Anruf-Auftrag freigeben |
POST | /api/v2/dial-jobs/{jobId}/pause | dial_jobs:write | Anruf-Auftrag pausieren |
GET | /api/v2/stats | stats:read | Kennzahlen: Anrufe, Minuten, Ergebnisse, Ampel |
GET | /api/v2/webhooks | webhooks:manage | Webhook-Abos auflisten |
POST | /api/v2/webhooks | webhooks:manage | Webhook-Abo anlegen |
DELETE | /api/v2/webhooks/{webhookId} | webhooks:manage | Webhook-Abo löschen |
POST | /api/v2/webhooks/{webhookId}/test | webhooks:manage | Test-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.
| Ereignis | Bedeutung |
|---|---|
call.started | Ein Anruf hat begonnen (inbound oder outbound). |
call.completed | Ein Anruf ist beendet; Transkript, Zusammenfassung und Ergebnis liegen vor. |
call.reviewed | Die Nachprüfung der Wissensgrenze ist fertig (Ampel ok/warn/fail). |
appointment.booked | Der Agent hat einen Termin gebucht. |
callback.requested | Der Anrufer wünscht einen Rückruf durch einen Menschen. |
knowledge.gap | Eine Sachfrage konnte nicht aus der Wissensbasis beantwortet werden. |
lead.updated | Ein Lead hat einen neuen Status oder ein neues Ergebnis. |
lead.dnc | Ein Kontakt hat widersprochen und ist gesperrt. |
dial_job.approval_required | Ein Anruf-Auftrag wartet auf menschliche Freigabe. |
dial_job.completed | Ein Anruf-Auftrag ist vollständig abgearbeitet. |
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
| Werkzeug | Bedeutung |
|---|---|
list_agents | Agenten auflisten |
get_agent | Konfiguration eines Agenten |
set_agent_strictness | Wissensgrenze eines Agenten setzen |
search_knowledge | Wissensbasis durchsuchen |
add_knowledge_source | Wissensquelle hinzufügen |
list_knowledge_gaps | Wissenslücken auflisten |
answer_knowledge_gap | Wissenslücke beantworten |
list_calls | Anrufe mit Ergebnis und Ampel |
get_call | Anruf mit Transkript und Nachprüfung |
start_call | Einzelanruf starten (destruktiv) |
create_dial_job | Anruf-Auftrag anlegen (destruktiv) |
approve_dial_job | Anruf-Auftrag freigeben (destruktiv) |
get_dial_job | Status eines Anruf-Auftrags |
get_stats | Kennzahlen |
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.
