Die REST API von CloudTAK verwandelt einen TAK-Server von einem passiven Relay in einen aktiven Integrations-Hub. Statt jede Datenquelle zur Unterstützung von nativem CoT über TCP/TLS zu zwingen — dem einzigen Pfad in den Legacy-TAK-Server — bietet CloudTAK eine vollständige HTTP- und WebSocket-Oberfläche, die jedes moderne System aufrufen kann: Sensor-Arrays, Logistikplattformen, KI-Inferenz-Pipelines, SIGINT-Feeds und benutzerdefinierte Dashboards. Dieser Leitfaden deckt alle wichtigen API-Oberflächen im Detail ab: Authentifizierung, CoT-Injektion, Echtzeit-Track-Streaming, Missionsverwaltung, Datenpaket-Upload, Gruppenverwaltung, Webhooks und den TAKpilot KI-Copiloten als Integrationsbeispiel. Falls Sie zuerst einen CloudTAK-Server aufsetzen müssen, lesen Sie unseren Begleitleitfaden zum CloudTAK-Server-Deployment.
Authentifizierung: JWT-Tokens, API-Schlüssel und Scopes
Die CloudTAK REST API erzwingt Authentifizierung auf jedem Endpunkt außer der Gesundheitsprüfung (GET /api/health). Zwei Credential-Typen werden unterstützt, beide als HTTP-Header Authorization: Bearer <token> übergeben.
JWT-Tokens
JWT-Tokens sind kurzlebig und werden pro Benutzersitzung ausgestellt. Erhalten Sie eines, indem Sie Anmeldedaten an den Login-Endpunkt senden:
curl -s -X POST https://tak.yourdomain.com:8443/api/login \
-H "Content-Type: application/json" \
-d '{"username": "operator01", "password": "s3cur3p@ss"}' \
| jq -r '.token'
Die Standard-TTL beträgt 86400 Sekunden (24 Stunden); konfigurierbar über CLOUDTAK_JWT_TTL. JWTs tragen die Rolle des Benutzers und Gruppenmitgliedschaften als Claims, sodass Berechtigungsprüfungen zustandslos sind.
API-Schlüssel
API-Schlüssel sind langlebige Tokens für automatisierte Service-zu-Service-Integrationen. Generieren Sie sie über die Admin-API:
curl -s -X POST https://tak.yourdomain.com:8443/api/token \
-H "Authorization: Bearer $ADMIN_JWT" \
-H "Content-Type: application/json" \
-d '{
"name": "sensor-array-east",
"scopes": ["cot:write"],
"rateLimit": 500
}' | jq -r '.token'
Unterstützte Scopes und was sie freischalten:
| Scope | Gewährt Zugriff auf |
|---|---|
cot:write |
CoT-Events über POST /api/cot injizieren |
cot:read |
Historische Tracks über GET /api/cot abfragen |
events:subscribe |
Mit dem WebSocket-Stream bei /api/ws verbinden |
mission:write |
Missionen erstellen, aktualisieren und löschen |
package:write |
Datenpakete und Anhänge hochladen |
group:write |
Gruppen erstellen und Mitgliedschaft verwalten |
admin |
Alle Scopes plus Benutzerverwaltung und Server-Konfiguration |
Widerrufen Sie einen Schlüssel jederzeit: DELETE /api/token/{id}. Aktive Schlüssel auflisten: GET /api/token.
Basis-URL und Rate-Limits
Alle REST-Endpunkte werden unter https://<host>:8443/api/ bereitgestellt. Das Standard-Globale Rate-Limit beträgt 100 Anfragen pro Sekunde pro API-Schlüssel. HTTP-429-Antworten enthalten einen Retry-After-Header. Die OpenAPI-Spezifikation ist unter GET /api/docs verfügbar.
CoT-Injektion: POST /api/cot
Der CoT-Injektions-Endpunkt ist der primäre Pfad zum Einspeisung von Positionsberichten, Kontaktmarkierungen, Alerts und beliebigen anderen CoT-Events aus externen Systemen in das taktische Lagebild.
XML-Payload
Für Systeme, die bereits natives CoT XML erzeugen, senden Sie den rohen Envelope direkt:
curl -s -X POST https://tak.yourdomain.com:8443/api/cot \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/xml" \
-d '<?xml version="1.0" encoding="UTF-8"?>
<event version="2.0"
uid="sensor-east-001"
type="a-f-G-U-C"
how="m-g"
time="2026-05-29T14:32:00Z"
start="2026-05-29T14:32:00Z"
stale="2026-05-29T14:37:00Z">
<point lat="50.4501" lon="30.5234" hae="145.0" ce="10.0" le="5.0"/>
<detail>
<contact callsign="SENSOR-EAST-01"/>
<remarks>Bodenradar-Kontakt, Geschwindigkeit 12 km/h, Kurs 045</remarks>
<group name="Surveillance" role="Team Member"/>
</detail>
</event>'
JSON-Payload
Für Integrationen auf modernen Stacks ohne CoT-XML-Bibliotheken verwenden Sie das JSON-Format:
curl -s -X POST https://tak.yourdomain.com:8443/api/cot \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"uid": "logistics-truck-07",
"type": "a-f-G-U-C",
"callsign": "LOG-07",
"lat": 50.4610,
"lon": 30.5190,
"hae": 138.0,
"ce": 5.0,
"le": 3.0,
"staleSeconds": 300,
"remarks": "Nachschubkonvoi, voraussichtliche Ankunft Checkpoint 14:45Z",
"group": "Logistics",
"role": "Team Member"
}'
CloudTAK serialisiert diesen JSON intern zu einem vollständigen CoT-XML-Envelope. Eine erfolgreiche Injektion gibt HTTP 201 zurück. Das Event wird sofort an alle abonnierten Clients und den WebSocket-Stream propagiert.
Track-Streaming: WebSocket /api/ws
Für die Echtzeit-Konsumierung des taktischen Lagebilds bietet der WebSocket-Endpunkt einen kontinuierlichen, latenzsarmen Stream von CoT-Events.
Verbinden und abonnieren
// Node.js-Beispiel mit der 'ws'-Bibliothek
const WebSocket = require('ws');
const ws = new WebSocket('wss://tak.yourdomain.com:8443/api/ws', {
headers: { 'Authorization': `Bearer ${process.env.CLOUDTAK_API_KEY}` }
});
ws.on('open', () => {
ws.send(JSON.stringify({
type: 'subscribe',
filter: {
groups: ['Surveillance', 'Logistics'],
bbox: [29.5, 50.0, 31.5, 51.0],
types: ['a-f-G', 'a-h-G', 'a-u-G']
}
}));
});
ws.on('message', (data) => {
const event = JSON.parse(data);
if (event.type === 'cot') {
console.log(`Track: ${event.payload.uid} bei ${event.payload.lat},${event.payload.lon}`);
} else if (event.type === 'ping') {
ws.send(JSON.stringify({ type: 'pong' }));
}
});
Der Server sendet alle 30 Sekunden eine ping-Nachricht. Clients müssen innerhalb von 10 Sekunden mit pong antworten, sonst wird die Verbindung geschlossen.
Filter auf einer aktiven Verbindung aktualisieren
Senden Sie jederzeit eine neue subscribe-Nachricht, um den aktuellen Filter zu ersetzen — ohne Trennung oder Neuverbindung.
Missions-API: erstellen, aktualisieren, löschen und zuweisen
Missionen in CloudTAK sind benannte operative Kontexte, die Tracks, Datenpakete und Benutzer gruppieren. Die Missions-API ermöglicht externen Systemen die programmatische Erstellung von Missionen.
Eine Mission erstellen
curl -s -X POST https://tak.yourdomain.com:8443/api/mission \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "OPERATION CLEARWATER",
"description": "Checkpoint-Einnahme, Phase 1",
"classification": "UNCLASSIFIED",
"bbox": [30.10, 50.35, 30.25, 50.45],
"groups": ["Alpha-Company", "ISR-Detachment"]
}' | jq '{uid: .uid, name: .name}'
Die Antwort enthält die Mission-uid (eine UUID). Aktualisieren Sie Missions-Metadaten mit PATCH /api/mission/{uid}. Löschen Sie eine Mission mit DELETE /api/mission/{uid}.
Datenpaket-API: MBTiles, KMZ, GeoJSON und Versionierung
An Missionen angehängte Datenpakete verteilen Kartenebenen und Referenzdaten an Feldgeräte. CloudTAK akzeptiert drei Formate: MBTiles, KMZ und GeoJSON:
# MBTiles-Layer für Offline-Kartenkopie hochladen
curl -s -X POST \
https://tak.yourdomain.com:8443/api/mission/${MISSION_UID}/attachment \
-H "Authorization: Bearer $API_KEY" \
-F "file=@/data/aoi-sector-north.mbtiles" \
-F "name=Sektor Nord Basiskarte" \
-F "contentType=application/vnd.mbtiles" \
| jq '{attachmentId: .id, version: .version}'
Alle Versionen eines Anhangs auflisten:
GET /api/mission/{missionUid}/attachment/{attachmentId}/versions
Eigenständige Kartenebenen werden über POST /api/layer hochgeladen. Für Offline-Einsätze: MBTiles und PMTiles für Offline-Karten.
Gruppen und Kanäle: Sichtbarkeitsfilterung und Track-Zugangskontrolle
CloudTAK-Gruppen implementieren Track-Sichtbarkeitssegregation. Ein Track mit einem Gruppen-Tag ist nur für verbundene Clients sichtbar, die Mitglieder dieser Gruppe sind. Dies ermöglicht Need-to-know-Trennung innerhalb eines gemeinsamen TAK-Servers.
Eine Gruppe erstellen und Benutzer zuweisen
# Gruppe erstellen
curl -s -X POST https://tak.yourdomain.com:8443/api/group \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{"name": "ISR-Detachment", "description": "Aufklärungszelle"}' \
| jq '.id'
# Benutzer zur Gruppe hinzufügen
curl -s -X POST https://tak.yourdomain.com:8443/api/group/ISR-Detachment/user \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{"username": "isr-analyst-01"}'
Ein Client kann gleichzeitig mehreren Gruppen angehören — er erhält die Vereinigung aller Track-Sets über seine Gruppen. Tracks ohne Gruppen-Tag sind für alle Benutzer auf dem Server sichtbar.
TAKpilot als Integrationsbeispiel
TAKpilot ist Corvus Intelligences KI-Copilot für TAK-basierte Operationen. Es ist ein konkretes Beispiel für eine tiefe CloudTAK-API-Integration: TAKpilot abonniert den WebSocket-Track-Stream, verarbeitet natürlichsprachliche Befehle von Operatoren und führt sie als CloudTAK-API-Aufrufe aus.
Ein natürlichsprachlicher Befehl wie "Gitter 38T YQ 45123 67890 als feindlichen Kontakt markieren, Alpha-Company-Mission zuweisen" löst folgende API-Sequenz in TAKpilot aus:
- MGRS
38T YQ 45123 67890in Dezimalgrad konvertieren (interne Konvertierung, kein API-Aufruf). POST /api/cotmit Typa-h-G(feindlich Boden), konvertierten Koordinaten und systemgeneriertem Rufzeichen mit PräfixAI-HOSTILE-.GET /api/mission?name=Alpha-Companyzur Auflösung der Mission-UID.POST /api/mission/{uid}/cotzum Verknüpfen des injizierten CoT-Events mit der Mission.- Antwort an den Operator über die TAKpilot-Chat-Schnittstelle mit Bestätigung der Aktion.
TAKpilot nutzt den WebSocket-Stream auch reaktiv: Wenn ein neuer feindlicher Track (Typ a-h) in einem überwachten Begrenzungsrahmen erscheint, kann automatisch eine Bedrohungsanalyse ausgelöst werden.
Webhooks: Events abonnieren und an externe Systeme weiterleiten
Webhooks ermöglichen CloudTAK, Events an externe Systeme zu pushen, anstatt dass diese Systeme die REST API abfragen oder eine persistente WebSocket-Verbindung aufrechterhalten müssen.
Einen Webhook registrieren
curl -s -X POST https://tak.yourdomain.com:8443/api/webhook \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "kafka-bridge",
"url": "https://integration.yourdomain.com/cloudtak-events",
"events": ["new_track", "mission_update", "user_join"],
"secret": "hmac_signing_secret_32chars_min",
"active": true
}' | jq '{id: .id, status: .status}'
CloudTAK signiert jede Webhook-Lieferung mit einer HMAC-SHA256-Signatur, die im Header X-CloudTAK-Signature geliefert wird. Überprüfen Sie die Signatur auf Ihrer Empfängerseite:
// Express.js Webhook-Empfänger mit Signaturprüfung
const crypto = require('crypto');
app.post('/cloudtak-events', express.raw({type: 'application/json'}), (req, res) => {
const sig = req.headers['x-cloudtak-signature'];
const expected = 'sha256=' + crypto
.createHmac('sha256', process.env.WEBHOOK_SECRET)
.update(req.body)
.digest('hex');
if (!crypto.timingSafeEqual(Buffer.from(sig), Buffer.from(expected))) {
return res.status(401).send('Signatur-Mismatch');
}
const event = JSON.parse(req.body);
// An Kafka, Slack, SIEM etc. weiterleiten
kafkaProducer.send({ topic: 'tak-events', messages: [{ value: req.body }] });
res.status(200).send('OK');
});
Lieferfehler lösen Wiederholungsversuche mit exponentiellem Backoff aus: 1, 2, 4, 8, 16 Sekunden. Lieferhistorie anzeigen: GET /api/webhook/{id}/deliveries.
Unterstützte Webhook-Event-Typen
new_track— eine neue UID erscheint erstmals auf dem Lagebild.track_stale— der Stale-Zeitstempel eines Tracks ist ohne Aktualisierung abgelaufen.mission_update— eine Mission wurde erstellt, geändert, archiviert oder gelöscht.user_join— ein neuer Client hat sich verbunden und authentifiziert.user_leave— ein Client hat die Verbindung getrennt oder die Sitzung ist abgelaufen.cot_alert— ein CoT-Event mit dem Typprefixb-a(Alarm) wurde empfangen.