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:

  1. MGRS 38T YQ 45123 67890 in Dezimalgrad konvertieren (interne Konvertierung, kein API-Aufruf).
  2. POST /api/cot mit Typ a-h-G (feindlich Boden), konvertierten Koordinaten und systemgeneriertem Rufzeichen mit Präfix AI-HOSTILE-.
  3. GET /api/mission?name=Alpha-Company zur Auflösung der Mission-UID.
  4. POST /api/mission/{uid}/cot zum Verknüpfen des injizierten CoT-Events mit der Mission.
  5. 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 Typprefix b-a (Alarm) wurde empfangen.