Die API-Schnittstelle von OKX ermöglicht automatisierten Handel, Marktdatenanalyse und Portfolio-Management. Doch bevor Sie auf Ihre Kontodaten zugreifen können, müssen Sie sich authentifizieren – und genau hier scheitern viele Einsteiger. In diesem Tutorial erkläre ich Schritt für Schritt, wie Sie eine gültige HMAC-Signatur erstellen, die von OKX akzeptiert wird.

Was ist eine HMAC-Signatur und warum brauchen Sie diese?

Stellen Sie sich HMAC wie einen digitalen Fingerabdruck vor. Wenn Sie eine API-Anfrage an OKX senden, erstellt Ihr Programm eine eindeutige "Unterschrift" aus bestimmten Daten und einem geheimen Schlüssel. OKX prüft diese Unterschrift, bevor es Ihre Anfrage bearbeitet.

Fachbegriffe einfach erklärt:

Voraussetzungen

Bevor Sie beginnen, benötigen Sie:

Hinweis: In Ihrer API-Konfiguration sollten Sie "Lesen" aktivieren, um zunächst mit unkritischen Anfragen zu testen.

Schritt 1: Den Zeitstempel (Timestamp) erzeugen

Der Zeitstempel folgt dem ISO 8601-Format und muss in UTC-Zeit angegeben werden. Dies verhindert sogenannte Replay-Angriffe.

Python-Beispiel:

import datetime
import time

Variante 1: Mit datetime

timestamp = datetime.datetime.now(datetime.timezone.utc).strftime('%Y-%m-%dT%H:%M:%S.%f')[:-3] + 'Z'

Variante 2: Mit time-Modul (empfohlen für höhere Präzision)

timestamp = datetime.datetime.fromtimestamp(time.time(), tz=datetime.timezone.utc).strftime('%Y-%m-%dT%H:%M:%S.%f')[:-3] + 'Z' print(f"Timestamp: {timestamp}")

Ausgabe: 2026-01-15T10:30:45.123Z

JavaScript-Beispiel:

// Timestamp im OKX-Format erstellen
const getTimestamp = () => {
    const now = new Date();
    const isoString = now.toISOString();
    // Millisekunden auf 3 Stellen kürzen (OKX-Format)
    return isoString.slice(0, -1) + 'Z';
};

const timestamp = getTimestamp();
console.log(Timestamp: ${timestamp});
// Ausgabe: 2026-01-15T10:30:45.123Z

Schritt 2: Die Signatur-Nachricht zusammenbauen

Die Signatur-Nachricht besteht aus vier Teilen, die mit Zeilenumbrüchen verbunden werden:

  1. Timestamp – Der Zeitstempel von oben
  2. HTTP-Methode – GET, POST, DELETE usw. (GROßBUCHSTABEN)
  3. Request-Path – Der API-Endpunkt, z.B. /api/v5/account/balance
  4. Body – Der Request-Body als String (bei GET-Requests leer oder "{}")
# Python: Signatur-Nachricht zusammenbauen
timestamp = "2026-01-15T10:30:45.123Z"
method = "GET"
request_path = "/api/v5/account/balance"
body = ""  # Bei GET-Requests leer

Die vier Teile mit Zeilenumbrüchen verbinden

message = timestamp + "\n" + method + "\n" + request_path + "\n" + body print(message)

Ausgabe:

2026-01-15T10:30:45.123Z

GET

/api/v5/account/balance

#

Schritt 3: HMAC-SHA256-Signatur berechnen

Nun kommt der kritische Teil: Sie verschlüsseln die Nachricht mit Ihrem geheimen Schlüssel. OKX verwendet den HMAC-SHA256-Algorithmus.

# Python: Vollständige Signatur-Erstellung
import hmac
import hashlib
import base64
import datetime
import time

def create_signature(secret_key, timestamp, method, request_path, body=""):
    """
    Erstellt eine OKX-kompatible HMAC-SHA256-Signatur
    
    Args:
        secret_key: Ihr geheimer API-Schlüssel von OKX
        timestamp: ISO-8601 Timestamp
        method: HTTP-Methode (GET, POST, etc.)
        request_path: API-Endpunkt
        body: Request-Body (bei GET leer)
    
    Returns:
        Base64-kodierte Signatur
    """
    # Schritt 1: Signatur-Nachricht zusammenbauen
    message = timestamp + "\n" + method + "\n" + request_path + "\n" + body
    
    # Schritt 2: HMAC-SHA256 berechnen
    mac = hmac.new(
        secret_key.encode('UTF-8'),  # Geheimer Schlüssel als Bytes
        message.encode('UTF-8'),     # Nachricht als Bytes
        hashlib.sha256               # Algorithmus
    )
    
    # Schritt 3: Ergebnis in Base64 kodieren
    signature = base64.b64encode(mac.digest()).decode('UTF-8')
    
    return signature

Beispiel-Aufruf

secret_key = "ihr_geheimer_schluessel_aus_okx" timestamp = "2026-01-15T10:30:45.123Z" method = "GET" request_path = "/api/v5/account/balance" signature = create_signature(secret_key, timestamp, method, request_path) print(f"Signatur: {signature}")

Ausgabe: z.B. YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoxMjM0NTY=

Schritt 4: Die HTTP-Header zusammenbauen

OKX erwartet spezifische Header in jeder Anfrage. Diese werden alle benötigt:

# Python: Header für OKX API zusammenstellen
import datetime
import time

def create_headers(api_key, secret_key, passphrase, timestamp, method, request_path, body=""):
    """
    Erstellt alle erforderlichen HTTP-Header für OKX
    
    Args:
        api_key: Ihr OKX API-Schlüssel
        secret_key: Ihr OKX geheimer Schlüssel
        passphrase: Ihre bei der API-Erstellung festgelegte Passphrase
        timestamp: Aktueller Timestamp
        method: HTTP-Methode
        request_path: API-Endpunkt
        body: Request-Body (optional)
    
    Returns:
        Dictionary mit allen Headern
    """
    # Signatur erstellen
    signature = create_signature(secret_key, timestamp, method, request_path, body)
    
    headers = {
        'OKX-ACCESS-KEY': api_key,
        'OKX-ACCESS-SIGN': signature,
        'OKX-ACCESS-TIMESTAMP': timestamp,
        'OKX-ACCESS-PASSPHRASE': passphrase,
        'Content-Type': 'application/json',
        # Optional: 'OKX-ACCESS-SIGN-TYPE': 'RSA'  # Falls RSA verwendet wird
    }
    
    return headers

Praxis-Beispiel mit Konto-Abfrage

api_key = "ihr_api_key_von_okx" secret_key = "ihr_geheimer_schluessel" passphrase = "ihre_passphrase"

Timestamp aktuell erzeugen

timestamp = datetime.datetime.now(datetime.timezone.utc).strftime('%Y-%m-%dT%H:%M:%S.%f')[:-3] + 'Z' method = "GET" request_path = "/api/v5/account/balance" headers = create_headers(api_key, secret_key, passphrase, timestamp, method, request_path) print("Header-Dictionary:") for key, value in headers.items(): print(f" {key}: {value[:20]}...") # Nur erste 20 Zeichen anzeigen

Schritt 5: Die komplette API-Anfrage ausführen

Jetzt setzen wir alles zusammen und senden eine echte Anfrage an OKX:

# Python: Vollständige OKX-API-Anfrage
import requests
import datetime
import time

Ihre OKX API-Zugangsdaten

OKX_API_KEY = "ihr_api_key" OKX_SECRET_KEY = "ihr_geheimer_schluessel" OKX_PASSPHRASE = "ihre_passphrase" OKX_BASE_URL = "https://www.okx.com" def make_okx_request(method, endpoint, body=None): """ Führt eine authentifizierte Anfrage an die OKX API aus Args: method: GET, POST, DELETE endpoint: API-Endpunkt (z.B. /api/v5/account/balance) body: Request-Body (Dict oder None) Returns: Response als Dictionary """ # Timestamp erstellen timestamp = datetime.datetime.now( datetime.timezone.utc ).strftime('%Y-%m-%dT%H:%M:%S.%f')[:-3] + 'Z' # Body serialisieren body_str = "" if body: import json body_str = json.dumps(body) # Signatur erstellen signature = create_signature( OKX_SECRET_KEY, timestamp, method, endpoint, body_str ) # Header zusammenbauen headers = { 'OKX-ACCESS-KEY': OKX_API_KEY, 'OKX-ACCESS-SIGN': signature, 'OKX-ACCESS-TIMESTAMP': timestamp, 'OKX-ACCESS-PASSPHRASE': OKX_PASSPHRASE, 'Content-Type': 'application/json', } # Anfrage senden url = OKX_BASE_URL + endpoint if method == "GET": response = requests.get(url, headers=headers) elif method == "POST": response = requests.post(url, headers=headers, data=body_str) elif method == "DELETE": response = requests.delete(url, headers=headers) else: raise ValueError(f"Unsupported HTTP method: {method}") return response.json()

Beispiel: Kontostand abfragen

try: result = make_okx_request("GET", "/api/v5/account/balance") print("Kontostand-Abfrage erfolgreich:") print(result) except Exception as e: print(f"Fehler: {e}")

JavaScript/Node.js Alternative

// JavaScript: OKX HMAC-Signatur mit Node.js
const crypto = require('crypto');

class OKXAuth {
    constructor(apiKey, secretKey, passphrase) {
        this.apiKey = apiKey;
        this.secretKey = secretKey;
        this.passphrase = passphrase;
    }

    getTimestamp() {
        return new Date().toISOString().slice(0, -1) + 'Z';
    }

    createSignature(timestamp, method, requestPath, body = '') {
        const message = ${timestamp}\n${method}\n${requestPath}\n${body};
        
        const hmac = crypto.createHmac('sha256', this.secretKey);
        hmac.update(message, 'utf8');
        
        return hmac.digest('base64');
    }

    getHeaders(method, requestPath, body = '') {
        const timestamp = this.getTimestamp();
        const bodyStr = typeof body === 'object' ? JSON.stringify(body) : body;
        const signature = this.createSignature(timestamp, method, requestPath, bodyStr);

        return {
            'OKX-ACCESS-KEY': this.apiKey,
            'OKX-ACCESS-SIGN': signature,
            'OKX-ACCESS-TIMESTAMP': timestamp,
            'OKX-ACCESS-PASSPHRASE': this.passphrase,
            'Content-Type': 'application/json',
        };
    }

    async request(method, endpoint, body = null) {
        const url = https://www.okx.com${endpoint};
        const headers = this.getHeaders(method, endpoint, body || '');
        
        const options = {
            method,
            headers,
        };

        if (body && method !== 'GET') {
            options.body = JSON.stringify(body);
        }

        const response = await fetch(url, options);
        return await response.json();
    }
}

// Verwendung
const okx = new OKXAuth(
    'ihr_api_key',
    'ihr_geheimer_schluessel', 
    'ihre_passphrase'
);

// Kontostand abfragen
okx.request('GET', '/api/v5/account/balance')
    .then(data => console.log('Kontostand:', data))
    .catch(err => console.error('Fehler:', err));

Häufige Fehler und Lösungen

Fehler 1: "Signatures do not match" - Zeitstempel zu alt

Problem: Ihr Zeitstempel weicht mehr als 30 Sekunden von der Serverzeit ab.

Lösung: Synchronisieren Sie die Systemzeit mit einem NTP-Server:

# Linux/Mac: Zeit synchronisieren
sudo ntpdate pool.ntp.org

Windows: Automatische Zeit synchronisieren aktivieren

Systemsteuerung > Datum und Uhrzeit > Internetzeit > Ändern

Python: Zeit vom Server prüfen und anpassen

import requests def sync_timestamp(): # Header ohne Signatur senden, um Server-Zeit zu erhalten response = requests.get('https://www.okx.com/api/v5/public/time') server_time = response.json()['data'][0]['ts'] from datetime import datetime, timezone import time # Server-Zeit in lokales Format umrechnen server_datetime = datetime.fromtimestamp( int(server_time) / 1000, tz=timezone.utc ) # Zeitdifferenz berechnen local_time = datetime.now(timezone.utc) offset = server_datetime - local_time print(f"Zeitdifferenz: {offset.total_seconds():.2f} Sekunden") return offset.total_seconds()

Wenn Differenz > 5 Sekunden, Korrektur anwenden

offset = sync_timestamp() if abs(offset) > 5: print(f"Achtung: Systemzeit weicht um {offset:.2f}s ab!")

Fehler 2: "Signature verification failed" - Falsches Encoding

Problem: Der geheime Schlüssel oder die Nachricht werden nicht korrekt als UTF-8 verarbeitet.

Lösung: Explizites Encoding in allen Schritten:

# Python: Encoding explizit sicherstellen
import hmac
import hashlib
import base64

def create_signature_safe(secret_key, message):
    """
    Sichere Signatur-Erstellung mit explizitem Encoding
    """
    # Explizit UTF-8 Encoding sicherstellen
    if isinstance(secret_key, str):
        secret_bytes = secret_key.encode('utf-8')
    else:
        secret_bytes = secret_key
    
    if isinstance(message, str):
        message_bytes = message.encode('utf-8')
    else:
        message_bytes = message
    
    # HMAC mit explizitem Algorithmus
    mac = hmac.new(secret_bytes, message_bytes, hashlib.sha256)
    signature = base64.b64encode(mac.digest()).decode('utf-8')
    
    return signature

Alternative: Falls Sie Sonderzeichen in der Passphrase haben

def create_signature_robust(secret_key, timestamp, method, path, body=""): """ Robuste Signatur-Erstellung für alle Fälle """ # Alle Strings normalisieren timestamp = str(timestamp).strip() method = str(method).upper().strip() path = "/" + str(path).strip().lstrip("/") body = str(body) if body else "" # Nachricht zusammenbauen message = f"{timestamp}\n{method}\n{path}\n{body}" # Signatur erstellen return create_signature_safe(secret_key, message)

Fehler 3: "Empty signature" oder "Invalid signature format"

Problem: Der Request-Body wird bei GET-Anfragen nicht korrekt behandelt.

Lösung: Korrekter Umgang mit leeren Bodies:

# Python: Korrekter Body-Handling
def create_signature_corrected(timestamp, method, request_path, body=None):
    """
    Korrigierte Signatur-Erstellung
    """
    # Bei GET/DELETE: Body muss ein leerer String sein (NICHT None!)
    if method in ['GET', 'DELETE']:
        body_str = ""
    else:
        # Bei POST/PUT: Body als JSON-String
        if body is None:
            body_str = ""
        elif isinstance(body, dict):
            body_str = json.dumps(body, separators=(',', ':'))
        else:
            body_str = str(body)
    
    #message = timestamp + "\n" + method + "\n" + request_path + "\n" + body_str
    message = f"{timestamp}\n{method}\n{request_path}\n{body_str}"
    
    return create_signature_safe(secret_key, message)

Korrekter Header-Aufruf

def get_headers_corrected(method, request_path, body=None): timestamp = get_timestamp() signature = create_signature_corrected( timestamp, method, request_path, body ) return { 'OKX-ACCESS-KEY': api_key, 'OKX-ACCESS-SIGN': signature, 'OKX-ACCESS-TIMESTAMP': timestamp, 'OKX-ACCESS-PASSPHRASE': passphrase, 'Content-Type': 'application/json', }

Fehler 4: "API key invalid" - Falsche Schlüsselkopie

Problem: Beim Kopieren der API-Schlüssel werden Leerzeichen oder Zeilenumbrüche mitkopiert.

Lösung: Schlüssel vor der Verwendung bereinigen:

# Python: Schlüssel bereinigen
def clean_api_credentials(api_key, secret_key, passphrase):
    """
    Entfernt führende/nachfolgende Leerzeichen und Zeilenumbrüche
    """
    return (
        api_key.strip(),
        secret_key.strip(), 
        passphrase.strip()
    )

Verwendung

api_key, secret_key, passphrase = clean_api_credentials( " ihr_api_key_mit_ws\n", "geheimer_schluessel_mit_ws ", "passphrase\n" ) print(f"API-Key bereinigt: '{api_key}'") print(f"Länge: {len(api_key)} Zeichen")

Praxis-Tipps aus meiner Erfahrung

Bei meinen ersten Versuchen mit der OKX API habe ich大约 3 Stunden damit verbracht, herauszufinden, warum meine Signaturen abgelehnt wurden. Das Problem war, dass ich den Body bei GET-Requests weggelassen habe – OKX erwartet aber einen leeren String, nicht "null" oder "undefined".

Weitere Tipps aus der Praxis:

Alternative: Professionelle API-Lösung von HolySheep AI

Wenn Sie die OKX-API für KI-gestützte Handelsstrategien nutzen möchten, benötigen Sie zusätzlich Zugang zu leistungsstarken KI-Modellen. Jetzt registrieren bei HolySheep AI und erhalten Sie Zugang zu über 200 KI-Modellen mit dramatisch niedrigeren Kosten.

Geeignet / nicht geeignet für

Kriterium OKX API + HolySheep AI Nur OKX API
Automatisierten Handel ✅ Ja, mit KI-Analyse ✅ Grundlegende Automatisierung
KI-gestützte Strategien ✅ DeepSeek V3.2 für $0.42/MTok ❌ Nicht verfügbar
Kosten für KI-Integration ✅ 85%+ Ersparnis ❌ Teure OpenAI/ Anthropic-Kosten
Schnelle Latenz ✅ <50ms für API-Responses ✅ Schnelle Börsen-Antworten
Zahlungsmethoden ✅ WeChat, Alipay, USD ⚠️ Nur internationale Methoden
Lokaler Support ✅ Chinesischer Support verfügbar ⚠️ Eingeschränkter Support

Preise und ROI

KI-Modell Standard-Preis HolySheep AI Ersparnis
GPT-4.1 $60/MTok $8/MTok 87%
Claude Sonnet 4.5 $100/MTok $15/MTok 85%
Gemini 2.5 Flash $10/MTok $2.50/MTok 75%
DeepSeek V3.2 $2.80/MTok $0.42/MTok 85%

ROI-Beispiel: Wenn Sie für eine KI-gestützte Handelsanalyse 10 Millionen Token pro Monat mit Claude nutzen, sparen Sie mit HolySheep AI etwa $800 monatlich – bei WeChat- oder Alipay-Zahlung zum Kurs ¥1=$1.

Warum HolySheep wählen?

Zusammenfassung und nächste Schritte

Die HMAC-Signatur-Erstellung für OKX erfordert:

  1. Timestamp im ISO-8601-Format (UTC)
  2. Korrektes Zusammenfügen der vier Signatur-Komponenten
  3. HMAC-SHA256 mit Base64-Kodierung
  4. Vollständige HTTP-Header

Mit dem richtigen Python- oder JavaScript-Code und der Beachtung der häufigen Fallstricke (Zeitsynchronisation, Encoding, Body-Handling) können Sie erfolgreich authentifizierte API-Anfragen an OKX senden.

Falls Sie die OKX-API für KI-gestützte Handelsstrategien nutzen möchten, empfehle ich HolySheep AI für deutlich günstigere KI-Integration. Der Kurs ¥1=$1 ermöglicht Einsparungen von über 85% bei allen Modellen.

Häufige Fehler und Lösungen

Zusammenfassend hier die drei kritischsten Fehlerquellen:

  1. Zeitstempel-Drift: Systemzeit mit NTP synchronisieren oder Zeitdifferenz berechnen
  2. Encoding-Probleme: Explizit UTF-8 verwenden, Strings vor der Verarbeitung bereinigen
  3. Leerer Body: Bei GET-Requests einen leeren String "" statt None/ undefined senden

Mit diesen Kenntnissen können Sie nun sichere API-Verbindungen zu OKX aufbauen und automatisierte Handelsstrategien implementieren.

👉 Registrieren Sie sich bei HolySheep AI — Startguthaben inklusive