Hilfe
abbrechen
Suchergebnisse werden angezeigt für 
Stattdessen suchen nach 
Meintest du: 

Rest API: "Der Header 'x-http-request-info' ist fehlerhaft."

heraklit
Autor ★
7 Beiträge

Liebe alle,

ich habe letzte Woche die API freigeschltet und versuche, mit einem Python Script eine Session zu etablieren und/oder eine mTan zu erhalten. Schritt 1, OAuth2 Authentifikations-Token, klappt. Dann kommt mit dem Script:

import requests
import base64
import json
import uuid

ACCESS_TOKEN = "<MEIN_ACCESS_TOKEN>"

def build_request_info():
req_info = {
"clientRequestId": str(uuid.uuid4())
}
req_info_json = json.dumps(req_info, separators=(',', ':'))
encoded = base64.b64encode(req_info_json.encode('utf-8')).decode('ascii')
return encoded

url = "https://api.comdirect.de/api/banking/v1/accounts"

headers = {
"Authorization": f"Bearer {ACCESS_TOKEN}",
"Accept": "application/json",
"Content-Type": "application/json",
"x-http-request-info": build_request_info()
}

resp = requests.get(url, headers=headers)

print("x-http-request-info:", headers["x-http-request-info"])
print("Status:", resp.status_code)
print("Headers:", resp.headers)
print("Body:", resp.text)
---schnapp----
als Antwort:
Fehler beim Abrufen: 400 {"code":"request.header.invalid","messages":[{"key":"request.header.invalid.x-http-request-info","severity":"ERROR","message":"Der Header 'x-http-request-info' ist fehlerhaft."}]}asselbe mit curl:
curl -X GET "https://api.comdirect.de/api/banking/v2/accounts"
-H "Authorization: Bearer <Access Token>"
-H "x-http-request-info: <request_info_encoded, s.o.>"
-H "Accept: application/json"
---schnapp---

Antwort:
{"code":"request.header.invalid","messages":[{"key":"request.header.invalid.x-http-request-info","severity":"ERROR","message":"Der Header 'x-http-request-info' ist fehlerhaft."}]}

Was mache ich falsch?
TIA und viele Grüße
h

9 ANTWORTEN

dg2210
Legende
7.777 Beiträge

@heraklit  schrieb:



Was mache ich falsch?


Das findest am einfachsten heraus, indem du den Vorgang mit Postman durchführst und dann die die Unterschiede zwischen deinen eigenen und den Postman-Requests analysierst.

Bettina Orlopp : „Wir haben kein Erkenntnis-, sondern ein Umsetzungsproblem.“ (Focus online 24.06.2025)

heraklit
Autor ★
7 Beiträge

vielen Dank für den Hinweis. Ich möchte den Vorgang aber gern rein in Python lösen, ohne Postman.
Ich poste noch einmal den korrekt eingerückten Code (habe die code-Formatierung nicht gesehen, sorry) – vielleicht fällt jemandem direkt auf, warum der x-http-request-info-Header als fehlerhaft zurückkommt:

 

import requests
import base64
import json
import uuid

ACCESS_TOKEN = "<MEIN_ACCESS_TOKEN>"

def build_request_info():
    req_info = {
        "clientRequestId": str(uuid.uuid4())
    }
    req_info_json = json.dumps(req_info, separators=(',', ':'))
    encoded = base64.b64encode(req_info_json.encode('utf-8')).decode('ascii')
    return encoded

url = "https://api.comdirect.de/api/banking/v1/accounts"

headers = {
    "Authorization": f"Bearer {ACCESS_TOKEN}",
    "Accept": "application/json",
    "Content-Type": "application/json",
    "x-http-request-info": build_request_info()
}

resp = requests.get(url, headers=headers)

print("x-http-request-info:", headers["x-http-request-info"])
print("Status:", resp.status_code)
print("Headers:", resp.headers)
print("Body:", resp.text)


TIA und Grüße,

heraklit

dg2210
Legende
7.777 Beiträge

@heraklit  schrieb:

vielen Dank für den Hinweis. Ich möchte den Vorgang aber gern rein in Python lösen, ohne Postman.

Niemand hier schreibt dir eine bestimmte Implementierung vor.

 

Meine Prognose ist: solange du nicht bereit bist, an der Diagnose deines Problems mitzuarbeiten, wirst du in dieser Community wenig Chancen auf Hilfe haben.

Bettina Orlopp : „Wir haben kein Erkenntnis-, sondern ein Umsetzungsproblem.“ (Focus online 24.06.2025)

Marten68
Experte
92 Beiträge

 

Chat GTP gibt mir folgender Tip zu deiner Fehlermeldung 400:

 

Laut Comdirect API-Dokumentation (Stand: 2024) muss der x-http-request-info-Header ein Base64-kodiertes JSON mit mehreren Pflichtfeldern enthalten:

 Pflichtfelder:

  • clientRequestId (UUID, eindeutig)

  • clientSystemId (String, z. B. dein App-Name)

  • clientDeviceId (String, z. B. Gerät oder hostname)


 

 

heraklit
Autor ★
7 Beiträge

Hallo,

vielen Dank. ich hae mit ChatGPT auch schon rumgerätselt - eine Comdirect API-Dokumentation (Stand: 2024) finde ich nirgendwo und in version 2020 steht nichts davon. Anyway, habe, mit ChatGPT-Hilfe, das Script jetzt so angepasst:

import requests
import base64
import uuid
import json
from urllib.parse import urlencode
import socket

# === Zugangsdaten ===
client_id = "<meine client_id>"
client_secret = "<meine client_secret>"
username = "<mein username>"
password = "<mein Passwort>"

# === Hilfsfunktion: Header bauen ===
def build_api_headers(token, tan=None):
    x_info = {
        "clientRequestId": str(uuid.uuid4()),
        "clientSystemId": "my-python-client",
        "clientDeviceId": "my-device" # hier müssen imho nur beliebige strings hin oder socket.gethostname()
    }
    x_info_encoded = base64.b64encode(json.dumps(x_info).encode()).decode()

    headers = {
        "Authorization": f"Bearer {token}",
        "Accept": "application/json",
        "x-http-request-info": x_info_encoded
    }
    if tan:
        headers["x-once-authentication-info"] = tan
    return headers

# === Allgemeine GET-Funktion mit TAN-Unterstützung ===
def api_get(url, token):
    # Erster Versuch ohne TAN
    resp = requests.get(url, headers=build_api_headers(token))
    
    if resp.status_code == 403:
        print("==> TAN erforderlich! Prüfe SMS oder App.")
        tan = input("> TAN: ")
        resp = requests.get(url, headers=build_api_headers(token, tan=tan))
    
    # JSON oder Text zurückgeben
    try:
        return resp.json()
    except json.JSONDecodeError:
        return resp.text

# === Schritt 1: Access Token holen ===
def get_access_token():
    token_headers = {
        "Content-Type": "application/x-www-form-urlencoded",
        "Accept": "application/json"
    }

    token_data = {
        "client_id": client_id,
        "client_secret": client_secret,
        "grant_type": "password",
        "username": username,
        "password": password
    }

    print("==> Hole Access Token ...")
    resp = requests.post(
        "https://api.comdirect.de/oauth/token",
        headers=token_headers,
        data=urlencode(token_data)
    )
    resp.raise_for_status()

    token = resp.json()["access_token"]
    print("Access Token:", token)
    return token

# === Hauptprogramm ===
if __name__ == "__main__":
    token = get_access_token()
    # Beispielaufruf: Kontenliste holen
    accounts = api_get("https://api.comdirect.de/api/banking/v1/accounts", token)
    print(json.dumps(accounts, indent=2, ensure_ascii=False))

es bleibt dabei:

==> Hole Access Token ...
Access Token: <mein access token>
{
  "code": "request.header.invalid",
  "messages": [
    {
      "key": "request.header.invalid.x-http-request-info",
      "severity": "ERROR",
      "message": "Der Header 'x-http-request-info' ist fehlerhaft."
    }
  ]
}

;-(

javadoc
Autor ★
6 Beiträge

Der Fehler steht doch darin. Vielleicht solltest du wirklich mal postman oder die Doku bemühen um deine requests zu überprüfen.,bvevor du chatgpt nutzt. 

 

Zu deinen Lösungen:

Clientsystemid und Clientdeviceid hat sich chatgpt wohl ausgedacht? Finde keine Hinweise in der Doku...

 

Dafür steht da aber wie die clientrequestsid auszusehen hat. Eine uuid wie du chatgpt daraus macht ist es jedenfalls nicht.

 

Ich hoffe bei den Dingen die du damit machen willst verlässt du dich nicht zu sehr auf chatgpt... Das kann teuer werden. 

 

 

 

FSQuant
Experte ★
162 Beiträge

Pro Tipp, der dir seeeehr viel Arbeit abnehmen wird:

 

- Schau einfach in eines der funktionierenden GitHub Repositories wie bspw.: https://github.com/keisentraut/python-comdirect-api

 

Grüße

FSQuant
Experte ★
162 Beiträge

...mit AI Unterstützung sollte es dann relativ einfach sein:

Am besten nimmst du Claude AI und legst einen workspace an, dann zuerst die Files vom GitHub Repository rein kopieren - und dann deine Datei.

 

FSQuant
Experte ★
162 Beiträge

Ah, und was mir eben noch eingefallen ist:

Damit das Modell auch richtig viel Context hat, kipp einfach das Doku-API-PDF komplett in das Modell!