Tradovate API

Tradovate user/syncrequest WS 401 Access Denied beheben

Sie öffnen einen Socket, feuern user/syncrequest ab und erhalten glatt ein 401 Access is denied zurück. Der Socket wurde nie autorisiert, hier ist genau der Handshake, der das behebt.

Geprüft vom PickMyTrade Trading Systems Team Zuletzt aktualisiert
· 7 Minuten Lesezeit
Tradovate WebSocket-Frame-Log mit user/syncrequest, das eine 401 Access is denied-Antwort zurückgibt

Sie haben einen WebSocket geöffnet, user/syncrequest abgefeuert, und anstelle eines Streams aus Konto- und Orderdaten erhielten Sie glatt ein 401 mit “Access is denied.” An Ihrem Login ist nichts falsch, und am Konto ist nichts kaputt. Der Socket wurde schlicht nie autorisiert, sodass der Server jede Anfrage darauf als anonym behandelt. Die Lösung ist eine bestimmte Reihenfolge der Operationen: Holen Sie sich ein Access-Token vom REST-Auth-Endpunkt, übergeben Sie es dem Socket in einem authorize-Frame, warten Sie auf die Erfolgsantwort, und erst dann senden Sie user/syncrequest. Bekommen Sie diese Reihenfolge richtig hin, verschwindet der 401.

Das hier bringt fast jeden zu Fall, der den Tradovate-Socket zum ersten Mal von Hand verdrahtet, meist weil er versucht, so zu authentifizieren, wie REST funktioniert. WebSockets funktionieren hier nicht so. Gehen wir genau durch, was passiert, und den sauberen Ausweg.

So sieht der Fehler tatsächlich aus

In Ihrem Frame-Log sehen Sie den Verbindungsaufbau des Sockets, das Eintreffen des Open-Frames, dann kommt Ihr user/syncrequest direkt mit einer Ablehnung zurück. Es sieht in etwa so aus:

<-- o
--> user/syncrequest
1

<-- a[{"i":1,"s":401,"d":"Access is denied"}]

Der Verräter ist der Status 401 gepaart mit Access is denied auf dem Anfrage-Frame. Wenn Sie zuvor nie eine Status-200-Antwort auf einen authorize-Frame gesehen haben, ist das Ihre Antwort: Der Socket ist nicht authentifiziert.

Warum der Socket einen 401 wirft

Es gibt eigentlich nur eine Handvoll Grundursachen, und sie stapeln sich in vorhersehbarer Reihenfolge.

1. Der Socket wurde nie autorisiert

Das ist der große Fall. Eine rohe WebSocket-Verbindung zu Tradovate ist unauthentifiziert. Sie zu öffnen und sofort user/syncrequest zu senden, ist, als würde man in einen Mitgliederclub gehen und ein Getränk bestellen, ohne den Ausweis zu zeigen. Sie müssen genau einen authorize-Frame pro Verbindung senden, der ein gültiges Access-Token trägt, bevor irgendetwas anderes durchgeht.

2. Sie haben versucht, das Token über den Socket zu holen

Ein häufiger Fehltritt ist der Versuch, accessTokenRequest über den WebSocket selbst aufzurufen. Dieser Endpunkt liegt auf der REST-Seite. Das Token wird über HTTPS geprägt und dann dem Socket vorgelegt. Der Socket stellt niemals Token aus.

3. Ein environment-Parameter in der Token-Anfrage

Wenn Sie einen Anfrage-Body irgendwoher kopiert haben und er "environment": "demo" (oder "live") enthält, entfernen Sie es. Dieses Feld wird von accessTokenRequest nicht akzeptiert und kann die gesamte Anfrage aus der Bahn werfen. Die Umgebung wird durch den Host bestimmt, den Sie aufrufen, nicht durch einen Parameter.

4. Ein Live-Konto ohne deviceId oder ein nicht genehmigtes Gerät

Demo ist nachsichtig. Live ist es nicht. Bei einem finanzierten/Live-Konto müssen Sie bei der Token-Anfrage eine stabile deviceId senden, und das Gerät muss über den Bestätigungsablauf genehmigt werden, den Tradovate für die Zwei-Faktor-Sicherheit durchführt. Verpassen Sie das, wird das Live-Token, das Sie zurückerhalten, den Live-Socket nicht autorisieren.

5. Das Token ist abgelaufen

Wenn zuvor alles funktionierte und dann aus dem Nichts 401 zurückgegeben wurde, ist das Token abgelaufen. Access-Token sind zeitlich begrenzt, sodass ein langlebiger Socket irgendwann einen 401 sieht, als wäre er nie autorisiert worden. Das ist ein Erneuerungsproblem, kein Einrichtungsproblem.

Die Lösung, Schritt für Schritt

1

Ein Access-Token von REST holen

Senden Sie Ihre Zugangsdaten per POST an den Auth-Endpunkt über HTTPS. Verwenden Sie den Host, der zu dem gewünschten Konto passt:

POST https://demo.tradovateapi.com/v1/auth/accessTokenRequest   (simuliert)
POST https://live.tradovateapi.com/v1/auth/accessTokenRequest   (finanziert)

Content-Type: application/json
{
  "name": "your-username",
  "password": "your-password",
  "appId": "YourAppName",
  "appVersion": "1.0",
  "cid": 0000,
  "sec": "your-api-secret",
  "deviceId": "a-stable-unique-id"
}


Die Antwort übergibt Ihnen eine accessToken-Zeichenkette (plus einen Ablaufzeitstempel). Dieses Token ist es, was der Socket möchte. Beachten Sie, dass in diesem Body kein environment-Feld steht, der Demo-Host gibt Ihnen ein Demo-Token, der Live-Host gibt Ihnen ein Live-Token.

2

Den Socket öffnen und auf den Open-Frame warten

Verbinden Sie sich mit der WebSocket-URL, die zur Umgebung Ihres Tokens passt:

wss://demo.tradovateapi.com/v1/websocket   (simuliert)
wss://live.tradovateapi.com/v1/websocket   (finanziert)


Sobald die Verbindung steht, sendet der Server einen einzelnen-Zeichen-Open-Frame: o. Senden Sie nichts, bevor Sie ihn gesehen haben. Ein Demo-Token auf dem Live-Socket (oder umgekehrt) ist eine eigene stille Art, sich einen 401 einzuhandeln, halten Sie also das Paar zusammenpassend.

3

Den authorize-Frame senden

Frames auf diesem Socket sind Klartext: ein Endpunkt, eine Anfrage-ID, eine Leerzeile für den Query-String, dann der Body, jeweils durch einen Zeilenumbruch getrennt. Der authorize-Frame legt das Token in den Body:

authorize
0

YOUR_ACCESS_TOKEN


Als einzelne Zeichenkette geschrieben ist das authorize\n0\n\nYOUR_ACCESS_TOKEN. Der Server antwortet mit einem Datenframe und einem Status, der Sie tatsächlich interessiert:

a[{"i":0,"s":200}]

Status 200 bedeutet, dass der Socket nun für die Lebensdauer der Verbindung authentifiziert ist. Erhalten Sie hier etwas anderes als 200, stoppen Sie, das Token ist das Problem, und das Syncing wird sich weiter unten nicht von selbst reparieren.

4

Jetzt user/syncrequest senden

Mit autorisiertem Socket geht derselbe Aufruf, der zuvor fehlschlug, jetzt problemlos durch. Senden Sie ihn mit der nächsten Anfrage-ID und leerem Body, um alles zu synchronisieren, worauf der Nutzer Zugriff hat:

user/syncrequest
1



Das ist user/syncrequest\n1\n\n. Sie erhalten den anfänglichen Snapshot der Konten, Positionen, Orders, Fills und Barguthaben zurück, und von da an streamt der Socket inkrementelle Updates, sobald sie sich ändern. user/syncrequest ist ausschließlich per WebSocket verfügbar, es gibt kein REST-Äquivalent, genau deshalb muss der Socket zuerst autorisiert werden.

5

Die Verbindung am Leben halten

Senden Sie nach der Autorisierung alle paar Sekunden (etwa alle 2,5 Sekunden) einen Heartbeat-Frame, ein leeres JSON-Array, [], damit der Server Sie nicht trennt. Der Server sendet ebenfalls eigene Heartbeats. Wenn Sie etwa zehn Sekunden lang nichts mehr von ihm hören, behandeln Sie den Socket als tot, verbinden Sie sich neu und führen Sie den Autorisierungsschritt auf der frischen Verbindung erneut aus.

REST-POST an accessTokenRequest, das ein accessToken zurückgibt, ohne environment-Parameter im BodyWebSocket-authorize-Frame mit dem Access-Token, gefolgt von einer Status-200-Erfolgsantwort

Live-Konten: die deviceId- und Berechtigungsprüfung

Wenn Demo einwandfrei funktioniert und Sie den 401 nur bei Live erhalten, liegt die Ursache fast immer auf der Geräte-Genehmigungsseite und nicht in Ihrem Code. Zwei Dinge sind zu prüfen.

Stellen Sie zunächst sicher, dass der API-Zugriff auf dem Konto tatsächlich aktiviert ist und der Schlüssel die Berechtigung hat, das zu tun, was Sie verlangen. In der Tradovate-Web-App liegt das unter den Kontoeinstellungen, im Bereich, der das API-Access-Add-on und die Schlüsselberechtigungen verwaltet. (Bestätigen Sie die genaue Bezeichnung in Ihrer aktuellen Version, Wortlaut und Ort dieses Add-on-Bildschirms werden im Laufe der Zeit angepasst.)

Tradovate Kontoeinstellungen mit dem API-Access-Add-on und den Steuerungen für API-Schlüsselberechtigungen

Senden Sie zweitens eine deviceId, die über mehrere Durchläufe hinweg gleich bleibt, und genehmigen Sie sie. Live erzwingt gerätebasierte Zwei-Faktor-Sicherheit; eine brandneue oder fehlende deviceId löst einen Genehmigungsschritt aus, der das Token bis zur Klärung außerstande lässt, den Live-Socket zu autorisieren. Erzeugen Sie eine stabile Kennung für Ihre App, verwenden Sie sie jedes Mal wieder und bestätigen Sie sie über die E-Mail, die Tradovate sendet.

Immer noch 401? Diese Checkliste durchgehen

Prüfung Was zu bestätigen ist
Authorize kam zuerstSie haben einen authorize-Frame gesendet und s:200 gesehen, bevor irgendeine andere Anfrage erfolgte.
Token-QuelleDas Token stammte von REST /auth/accessTokenRequest, nicht vom Socket.
Kein environment-FeldDer Body der Token-Anfrage enthält keinen environment-Parameter.
Host passt zum TokenDemo-Token auf dem Demo-Socket, Live-Token auf dem Live-Socket, nie vermischt.
deviceId (Live)Eine stabile deviceId wurde gesendet und das Gerät ist genehmigt.
Token-AktualitätDas Token ist seit dem Abruf nicht abgelaufen.
SchlüsselberechtigungenDer API-Zugriff ist aktiviert und der Schlüssel darf auf diesem Konto lesen/routen.

Wenn es funktionierte und dann mitten in der Sitzung kaputtging, springen Sie direkt zur Token-Lebensdauer. Access-Token halten nicht ewig, und ein Socket, der eine Weile offen war, beginnt 401 zu werfen, sobald das dahinterstehende Token abläuft. Erneuern Sie es vor Ablauf, statt auf die Fehler zu warten. Und wenn schon die allererste Token-Anfrage fehlschlägt, gehen Sie zurück und stellen sicher, dass API-Zugriff besteht und ein Schlüssel erzeugt wurde, bevor Sie den Socket überhaupt anfassen.

Die Socket-Installationsarbeit ganz überspringen

Den Auth-Handshake, Heartbeats, die Gerätegenehmigung und die Token-Erneuerung von Hand zu bauen, ist eine Menge beweglicher Teile, nur um eine Order zu routen. Wenn Sie Tradovate mit TradingView-Alerts oder einer Strategie verdrahten, übernimmt PickMyTrade die gesamte Verbindungsebene für Sie, autorisierte Sitzungen, Live-Gerätebehandlung und Token-Erneuerung inklusive, sodass Sie ein Signal senden und es wird gehandelt.

Überspringen Sie die Socket-Installationsarbeit

PickMyTrade übernimmt die gesamte Verbindungsebene für Sie, autorisierte Sitzungen, Live-Gerätebehandlung und Token-Erneuerung inklusive, sodass Sie ein Signal senden und es wird gehandelt.

Starten Sie Ihre kostenlose 5-Tage-Testphase

Häufig gestellte Fragen

Weil die WebSocket-Verbindung nie autorisiert wurde. user/syncrequest läuft nur über einen autorisierten Socket. Senden Sie zuerst einen authorize-Frame mit einem gültigen Access-Token, warten Sie auf die Status-200-Antwort, senden Sie dann syncrequest.

Vom REST-Endpunkt /auth/accessTokenRequest, nicht vom Socket. Senden Sie Ihre Zugangsdaten per POST über HTTPS, lesen Sie accessToken aus der JSON-Antwort aus und übergeben Sie das Token dem Socket im authorize-Frame.

Nein. environment ist kein gültiges Feld für diese Anfrage und kann sie zum Scheitern bringen. Demo versus Live wird durch den aufgerufenen Host bestimmt, den Demo-Host für das simulierte Konto, den Live-Host für das finanzierte.

Live erzwingt eine Gerätegenehmigung, die Demo überspringt. Senden Sie eine stabile deviceId, wenn Sie das Live-Token anfordern, genehmigen Sie das Gerät über die Bestätigung, die Tradovate Ihnen per E-Mail sendet, und stellen Sie sicher, dass Sie den Live-Socket mit einem Live-Token autorisieren.

Das Token ist abgelaufen. Token sind zeitlich begrenzt, sodass ein lange laufender Socket irgendwann einen 401 sieht, als wäre er nie autorisiert worden. Erneuern Sie das Token, bevor es abläuft, und autorisieren Sie erneut auf einer frischen Sitzung.

Dieser Leitfaden dient ausschließlich Bildungs- und Informationszwecken und stellt keine Finanz-, Anlage- oder Handelsberatung dar. Der Handel mit Futures und anderen gehebelten Produkten birgt ein erhebliches Verlustrisiko und ist nicht für jeden Anleger geeignet. PickMyTrade ist eine unabhängige Drittanbieter-Automatisierungsplattform und steht in keiner Verbindung zu Tradovate, Inc. oder Bookmap und wird von diesen weder unterstützt noch gesponsert. Alle zugehörigen Namen, Logos und Marken sind Eigentum ihrer jeweiligen Inhaber. Plattformfunktionen und -schritte ändern sich im Laufe der Zeit, bestätigen Sie den aktuellen Ablauf daher immer in der offiziellen Plattformdokumentation, bevor Sie handeln.