===== Fonio API Dokumentation =====
Willkommen bei der Fonio API für ET360. Diese Dokumentation beschreibt, wie Sie als Kunde über Fonio mit unserem Server kommunizieren können.
== Einführung ==
Die Fonio API ermöglicht es Ihnen, als KI-Sprachassistent mit unserem ET360-System zu interagieren. Sie können:
* **Fallinformationen abfragen** - Holen Sie sich Details zu Fahrzeugen über das Kennzeichen
* **Anrufdaten übermitteln** - Senden Sie Transkripte und Kontextdaten von Telefonkonversationen
* **Fallzuordnung durchführen** - Verknüpfen Sie Anrufe mit bestehenden Fällen im System
== Authentifizierung ==
Alle API-Endpunkte verwenden **Basic Authentication**. Sie benötigen einen API-Hash, der Ihnen von ET360 bereitgestellt wurde.
=== Header-Informationen ===
Fügen Sie diesen Header zu allen Ihren API-Anfragen hinzu:
Authorization: Basic
Content-Type: application/json
Der Parametername für die Authentifizierung ist: ''PHONE_FONIO_INCOMING_REQUEST_HASH''
== API-Endpunkte ==
=== 1. Fallinformationen nach Kennzeichen abfragen ===
**Endpunkt:** ''GET /ai/fonio/case-information-by-license-plate/{kennzeichen}''
**Beschreibung:** Rufen Sie Informationen zu einem Fall ab, indem Sie das Fahrzeugkennzeichen angeben.
**URL-Parameter:**
| Parameter | Typ | Beschreibung | Beispiel |
| kennzeichen | String | Das deutsche Kfz-Kennzeichen (mit oder ohne Sonderzeichen) | MTK-C-72, MTK C 72, MTK:C:72 |
**Beispielanfrage:**
GET https://your-server.com/ai/fonio/case-information-by-license-plate/MTK-C-72
**Beispielantwort:**
{
"type": "object",
"properties": {
"LicensePlate": {
"type": "string",
"description": "Nummernschild des Fahrzeuges",
"value": "MTK C 72"
},
"Location": {
"type": "string",
"description": "Standort des Fahrzeugs",
"value": "Frankfurt am Main"
},
"OpeningHours": {
"type": "string",
"description": "Öffnungszeiten der Filiale",
"value": "Mo-Fr 08:00-18:00"
},
"Price": {
"type": "string",
"description": "Preis für den Service",
"value": "€150,00"
},
"DriverName": {
"type": "string",
"description": "Name des zugewiesenen Fahrers",
"value": "Max Mustermann"
},
"DriverETA": {
"type": "string",
"description": "Geschätzte Ankunftszeit des Fahrers",
"value": "15 Minuten"
},
"DriverDistance": {
"type": "string",
"description": "Entfernung des Fahrers zum Fahrzeug",
"value": "5 km"
}
}
}
**Hinweise:**
* Das Kennzeichen kann mit oder ohne Sonderzeichen (-, :, Leerzeichen) übermittelt werden
* Die API normalisiert das Kennzeichen automatisch
* Wenn kein Fall gefunden wird, wird ''null'' zurückgegeben
=== 2. Anrufdaten übermitteln ===
**Endpunkt:** ''PATCH /ai/fonio/cases-by-phonenumber''
**Beschreibung:** Senden Sie Transkripte und Metadaten von Telefonkonversationen. Das System versucht automatisch, den Anruf mit einem bestehenden Fall über die Telefonnummer zu verknüpfen.
**HTTP-Methode:** PATCH
**Content-Type:** application/json
**Anfrage-Body:**
{
"summary": "Kurze Zusammenfassung des Anrufs",
"fromNumber": "+491234567890",
"toNumber": "+499876543210",
"direction": "inbound",
"duration": 120,
"startTimestamp": "2024-01-15T10:30:00Z",
"endTimestamp": "2024-01-15T10:32:00Z",
"audioLink": "https://example.com/audio-recording.mp3",
"transcript": [
{
"id": "msg-001",
"index": 0,
"role": "user",
"content": "Guten Tag, ich benötige Hilfe mit meinem Fahrzeug",
"createdAt": "2024-01-15T10:30:15Z"
},
{
"id": "msg-002",
"index": 1,
"role": "assistant",
"content": "Gerne helfe ich Ihnen. Was ist Ihr Fahrzeugkennzeichen?",
"createdAt": "2024-01-15T10:30:20Z"
},
{
"id": "msg-003",
"index": 2,
"role": "user",
"content": "Das Kennzeichen ist MTK C 72",
"createdAt": "2024-01-15T10:30:35Z"
}
],
"context": {
"Name": "Max Mustermann",
"LicensePlate": "MTK C 72",
"Summary": "Kunde fordert Abschleppservice für beschädigtes Fahrzeug"
},
"disconnectReason": "Call completed successfully"
}
**Feldbeschreibungen:**
| Feld | Typ | Erforderlich | Beschreibung |
| summary | String | Nein | KI-generierte Zusammenfassung des Anrufs |
| fromNumber | String | Ja | Telefonnummer des Anrufers (E.164-Format) |
| toNumber | String | Ja | Telefonnummer des Empfängers (E.164-Format) |
| direction | String | Ja | "inbound" (eingehend) oder "outbound" (ausgehend) |
| duration | Integer | Ja | Anrufdauer in Sekunden |
| startTimestamp | String | Ja | Anrufstartzeit (ISO 8601 Format) |
| endTimestamp | String | Ja | Anrufendzeit (ISO 8601 Format) |
| audioLink | String | Nein | URL zur Audioaufnahme |
| transcript | Array | Ja | Zeitgestempelte Konversationstranskripte |
| transcript[].id | String | Ja | Eindeutige Nachrichten-ID |
| transcript[].index | Integer | Ja | Nachrichten-Sequenznummer |
| transcript[].role | String | Ja | "user" oder "assistant" |
| transcript[].content | String | Ja | Nachrichtentext |
| transcript[].createdAt | String | Ja | Zeitstempel (ISO 8601) |
| context | Object | Nein | Extrahierte strukturierte Daten |
| context.Name | String | Nein | Kundenname |
| context.LicensePlate | String | Nein | Fahrzeugkennzeichen |
| context.Summary | String | Nein | Zusammenfassung |
| disconnectReason | String | Nein | Grund für Anrufbeendigung |
**Beispielantwort:**
Bei erfolgreicher Verarbeitung wird die Anfrage akzeptiert (HTTP 200). Das System:
1. Sucht nach einem passenden Fall basierend auf der Telefonnummer
2. Verknüpft die Anrufdaten mit dem gefundenen Fall
3. Speichert Transkript und Kontextinformationen
**Fehlerantworten:**
| HTTP-Status | Beschreibung |
| 401 | Authentifizierung fehlgeschlagen - Überprüfen Sie Ihren API-Hash |
| 400 | Ungültiges Anfrageformat - Überprüfen Sie die JSON-Struktur |
| 404 | Kein passender Fall gefunden - Die Telefonnummer ist nicht im System |
| 500 | Serverfehler - Bitte kontaktieren Sie den Support |
== Telefonnummern-Formatierung ==
Alle Telefonnummern sollten im **E.164-Format** übermittelt werden:
+491234567890
+49 123 4567890
Das System akzeptiert verschiedene Formate und normalisiert sie automatisch:
* ''+491234567890'' ✓
* ''+49 123 4567890'' ✓
* ''0123 4567890'' ✓ (wird automatisch konvertiert)
== Beispiel-Implementierung ==
=== cURL Beispiel ===
# Fallinformationen abfragen
curl -X GET \
https://your-server.com/ai/fonio/case-information-by-license-plate/MTK-C-72 \
-H "Authorization: Basic your-api-hash" \
-H "Content-Type: application/json"
# Anrufdaten übermitteln
curl -X PATCH \
https://your-server.com/ai/fonio/cases-by-phonenumber \
-H "Authorization: Basic your-api-hash" \
-H "Content-Type: application/json" \
-d '{
"fromNumber": "+491234567890",
"toNumber": "+499876543210",
"direction": "inbound",
"duration": 120,
"startTimestamp": "2024-01-15T10:30:00Z",
"endTimestamp": "2024-01-15T10:32:00Z",
"transcript": [
{
"id": "msg-001",
"index": 0,
"role": "user",
"content": "Ich brauche Hilfe",
"createdAt": "2024-01-15T10:30:15Z"
}
],
"context": {
"Name": "Max Mustermann",
"LicensePlate": "MTK C 72"
}
}'
=== Python Beispiel ===
import requests
import json
# Konfiguration
BASE_URL = "https://your-server.com"
API_HASH = "your-api-hash"
headers = {
"Authorization": f"Basic {API_HASH}",
"Content-Type": "application/json"
}
# Fallinformationen abfragen
def get_case_by_license_plate(license_plate):
url = f"{BASE_URL}/ai/fonio/case-information-by-license-plate/{license_plate}"
response = requests.get(url, headers=headers)
return response.json()
# Anrufdaten übermitteln
def submit_call_data(call_data):
url = f"{BASE_URL}/ai/fonio/cases-by-phonenumber"
response = requests.patch(url, headers=headers, json=call_data)
return response.status_code
# Beispielverwendung
if __name__ == "__main__":
# Fall abfragen
result = get_case_by_license_plate("MTK-C-72")
print(json.dumps(result, indent=2))
# Anrufdaten senden
call_data = {
"fromNumber": "+491234567890",
"toNumber": "+499876543210",
"direction": "inbound",
"duration": 120,
"startTimestamp": "2024-01-15T10:30:00Z",
"endTimestamp": "2024-01-15T10:32:00Z",
"transcript": [
{
"id": "msg-001",
"index": 0,
"role": "user",
"content": "Guten Tag",
"createdAt": "2024-01-15T10:30:15Z"
}
],
"context": {
"Name": "Max Mustermann",
"LicensePlate": "MTK C 72"
}
}
status = submit_call_data(call_data)
print(f"Status: {status}")
=== JavaScript/Node.js Beispiel ===
const axios = require('axios');
const BASE_URL = 'https://your-server.com';
const API_HASH = 'your-api-hash';
const headers = {
'Authorization': `Basic ${API_HASH}`,
'Content-Type': 'application/json'
};
// Fallinformationen abfragen
async function getCaseByLicensePlate(licensePlate) {
const response = await axios.get(
`${BASE_URL}/ai/fonio/case-information-by-license-plate/${licensePlate}`,
{ headers }
);
return response.data;
}
// Anrufdaten übermitteln
async function submitCallData(callData) {
const response = await axios.patch(
`${BASE_URL}/ai/fonio/cases-by-phonenumber`,
callData,
{ headers }
);
return response.status;
}
// Beispielverwendung
(async () => {
try {
// Fall abfragen
const result = await getCaseByLicensePlate('MTK-C-72');
console.log(JSON.stringify(result, null, 2));
// Anrufdaten senden
const callData = {
fromNumber: '+491234567890',
toNumber: '+499876543210',
direction: 'inbound',
duration: 120,
startTimestamp: '2024-01-15T10:30:00Z',
endTimestamp: '2024-01-15T10:32:00Z',
transcript: [
{
id: 'msg-001',
index: 0,
role: 'user',
content: 'Guten Tag',
createdAt: '2024-01-15T10:30:15Z'
}
],
context: {
Name: 'Max Mustermann',
LicensePlate: 'MTK C 72'
}
};
const status = await submitCallData(callData);
console.log(`Status: ${status}`);
} catch (error) {
console.error('Fehler:', error.response?.data || error.message);
}
})();
== Best Practices ==
=== Datenqualität ===
* **Transkripte:** Senden Sie Transkripte so schnell wie möglich nach Anrufende
* **Zeitstempel:** Verwenden Sie immer UTC-Zeit im ISO 8601 Format
* **Telefonnummern:** Formatieren Sie Nummern im E.164-Standard
* **Kontextdaten:** Extrahieren Sie relevante Informationen (Name, Kennzeichen) für bessere Fallzuordnung
=== Fehlerbehandlung ===
* Implementieren Sie Retry-Logik bei HTTP 500 Fehlern
* Protokollieren Sie alle API-Antworten zur Fehleranalyse
* Validieren Sie Ihre Anfragen vor dem Senden
=== Sicherheit ===
* Bewahren Sie Ihren API-Hash sicher auf
* Verwenden Sie HTTPS für alle API-Anfragen
* Rotieren Sie API-Hashes regelmäßig
== Fehlerbehebung ==
=== Häufige Probleme ===
**401 Unauthorized**
* Überprüfen Sie, ob der API-Hash korrekt ist
* Stellen Sie sicher, dass Sie "Basic " vor dem Hash verwenden
**400 Bad Request**
* Validieren Sie Ihre JSON-Struktur
* Stellen Sie sicher, dass alle erforderlichen Felder vorhanden sind
* Überprüfen Sie das Datentypen (Strings, Integers, Arrays)
**404 Not Found**
* Die Telefonnummer existiert nicht im System
* Überprüfen Sie das Telefonnummernformat
* Kontaktieren Sie den Kunden, um die richtige Nummer zu bestätigen
**500 Internal Server Error**
* Temporärer Serverfehler
* Versuchen Sie es später erneut
* Bei anhaltenden Problemen: Kontaktieren Sie den ET360-Support