Tradovate API

Tradovate API: 'Access is denied' bei der Orderplatzierung

Ihre Zugangsdaten funktionieren, Ihr Token ist gültig, und /order/placeOrder lehnt trotzdem jede Order mit Access is denied ab. Es liegt fast nie an einem defekten Schlüssel, sondern an einem von vier banalen, leicht behebbaren Fehlern.

Geprüft vom PickMyTrade Trading Systems Team Zuletzt aktualisiert
· 8 Minuten Lesezeit
Tradovate placeOrder Access is denied-Fehlerantwort in einem REST-Client

Sie verbinden einen Bot mit der Tradovate-REST-API, die erste Live-Order geht raus, und zurück kommt Access is denied. Das fühlt sich wie eine Mauer an. Ihre Zugangsdaten haben funktioniert. Die Authentifizierung hat Ihnen ein Token gegeben. Sie können sogar Ihre Positionen sehen. Trotzdem lehnt /order/placeOrder jede Order mit derselben knappen Meldung ab, mal als 401, mal als HTTP 200 mit {"failureReason":"UnknownReason","failureText":"Access is denied"} im Body. Die gute Nachricht: Das ist fast nie ein Problem mit einem “defekten Schlüssel”. Es ist einer von vier banalen, leicht behebbaren Fehlern: die falsche Account-ID, eine zu knapp bemessene Orders-Berechtigung, der falsche Demo-/Live-Host oder ein falsch gesetztes isAutomated-Flag. Im Folgenden finden Sie die vollständige Checkliste, was der Fehler wirklich bedeutet, jede Ursache mit einer schrittweisen Lösung und wie PickMyTrade diese ganze Fehlerklasse umgeht, damit Ihre TradingView-Alerts ohne JSON-Debugging bei Marktöffnung an Tradovate weitergeleitet werden.

Schnelle Checkliste für "Access is denied"

  • Falsche Account-ID, lesen Sie die numerische id aus /account/list, niemals den Anzeigenamen (wie “DEMO1235”).
  • Orders-Berechtigung zu niedrig, die Orders-Berechtigung des API-Keys muss auf Full Access gesetzt sein, nicht nur lesend.
  • Host-Konflikt, fordern Sie das Token und senden Sie die Order auf demselben Host: demo.tradovateapi.com für Sim, live.tradovateapi.com für Live.
  • isAutomated falsch, geben Sie das Flag an und setzen Sie es für jede Bot- oder algorithmische Order auf true, und achten Sie beim Form-Encoding auf den Datentyp.
  • Veraltetes oder falsches Symbol, verwenden Sie den aktiven Frontmonat-Kontrakt (oder dessen Kontrakt-ID), kein abgelaufenes oder fortlaufendes Symbol.
  • Live-Gerät nicht freigegeben, im Live-Modus wird eine bekannte, stabile deviceId strikt durchgesetzt; im Demo-Modus ist das nachsichtiger.

Was "Access is denied" bedeutet

Access is denied ist Tradovates generische Antwort im Sinne von “diese Anfrage ist dazu nicht berechtigt”. Die Falle dabei: Es ist kein Authentifizierungsfehler im üblichen Sinne, Sie können ein völlig gültiges, nicht abgelaufenes Access Token besitzen und die Meldung trotzdem bekommen. Sie tritt genau dann auf, wenn Tradovate prüft, ob dieses Token berechtigt ist, diese Order auf diesem Account zu platzieren. Jeder Bruch in dieser Kette, eine Account-ID, die dem Token nicht gehört, ein API-Key, dem nie das Recht zur Orderplatzierung erteilt wurde, oder ein Token, das gegen den Demo-Host ausgestellt und dann gegen Live verwendet wird, erscheint als dieselben drei Wörter.

Hier sind zwei Antwortformen relevant. Ein rohes 401 Access Denied deutet meist auf das Token oder den Host hin: Das Token ist abgelaufen, wurde von der falschen Base-URL angefordert, oder (im Live-Modus) das Gerät ist nicht freigegeben. Ein 200 OK, dessen Body {"failureReason":"UnknownReason","failureText":"Access is denied"} enthält, bedeutet, dass die Anfrage authentifiziert wurde, die Order selbst aber auf Berechtigungsebene abgelehnt wurde, klassischerweise wegen einer falschen accountId oder einer fehlenden Orders-Berechtigung.

Da beide Varianten dieselbe Meldung ausgeben, verbringt man leicht eine Stunde damit, Passwörter zu überprüfen, obwohl der eigentliche Fehler in einem einzigen Feld des Request-Bodys liegt. Prüfen Sie zuerst den HTTP-Status und arbeiten Sie dann die unten genannten Ursachen der Reihe nach durch.

Top-Ursachen für "Access is denied" beim Place Order

1. Sie senden den Anzeigenamen statt der numerischen Account-ID

Das ist die mit Abstand häufigste Ursache. Ihr Account zeigt einen Namen wie DEMO1235 oder TRAD123456 an, und es ist verlockend, die abschließende Zahl als accountId zu übergeben. Aber accountId ist Tradovates interne Entity-ID, ein separater numerischer Wert, der nichts mit den Ziffern im Anzeigenamen zu tun hat. Übergeben Sie die falsche ID, gehört der Account dem Token nicht “offiziell”, und die Order wird abgelehnt.

Die Lösung besteht darin, beide Kennungen aus /account/list auszulesen. Jedes Account-Objekt liefert eine id (die numerische Entity-ID, die Sie in accountId eintragen) und einen name (die lesbare Bezeichnung, die Sie in accountSpec eintragen). Kurz gesagt: Die Account-ID ist nicht die Zahl, nach der Ihr Account zufällig benannt ist. Codieren Sie sie niemals fest, sondern rufen Sie sie immer ab.

Tradovate account/list-API-Antwort mit Hervorhebung der numerischen Account-ID im Vergleich zum Anzeigenamen

2. Die Orders-Berechtigung des API-Keys ist nicht Full Access

Bei Tradovate lässt sich ein API-Key pro Fähigkeit einschränken. Ein Key kann Positionen lesen, Account-Informationen lesen und die Kontraktbibliothek lesen, während Orders trotzdem auf weniger als Full Access gesetzt ist, was genau ausreicht, um sich zu authentifizieren, Accounts aufzulisten und gesund zu wirken, aber sofort blockiert wird, sobald eine Order platziert werden soll. Die Lösung ist direkt: Gewähren Sie dem Key in Ihren Tradovate-Anwendungs-/API-Einstellungen Orders → Full Access und stellen Sie das Token danach neu aus, damit die neue Berechtigung wirksam wird.

Tradovate-API-Key-Einstellungen mit der auf Full Access gesetzten Orders-Berechtigung

3. Sie haben das Token auf einem Host erstellt und bestellen auf einem anderen

Tradovate betreibt zwei vollständig getrennte Umgebungen mit zwei Base-URLs:

  • Demo / Simulation: https://demo.tradovateapi.com/v1
  • Live: https://live.tradovateapi.com/v1

Ein Token, das vom Demo-Host angefordert wurde, ist nur gegenüber dem Demo-Host gültig. Richten Sie dieses Token auf das Live-/order/placeOrder (oder umgekehrt), erhalten Sie Access is denied. Der klassische Fehler besteht darin, auth/accessTokenRequest mit einer fehlerhaften oder nicht passenden Base-URL aufzurufen und sich dann zu fragen, warum jede folgende Order fehlschlägt. Stellen Sie sicher, dass Ihr Auth-Aufruf und Ihr Order-Aufruf denselben Host-String verwenden, Zeichen für Zeichen, und dass der Host zu dem Account passt, mit dem Sie tatsächlich handeln möchten.

4. isAutomated fehlt oder hat den falschen Typ

Löst ein Bot, ein Algorithmus oder ein anderer unpersönlicher Prozess die Order aus, verlangen die CME-Regeln isAutomated: true; ein Mensch, der auf einen UI-Button klickt, ist false. Neben dem bloßen Angeben des Flags müssen Sie auf den Datentyp achten. Wenn Sie JSON per POST senden, ist isAutomated ein Boolean (true). Wenn Sie den Body aber form-encodieren (data= statt json= in Pythons requests), wird alles in Strings serialisiert, sodass der Wert als String "true" übertragen werden muss. Ein Boolean, der stillschweigend auf False fällt, oder ein Typ, den der Server nicht parsen kann, führt Sie direkt zurück zu Access is denied.

5. Symbolformat und (bei Live) ein nicht freigegebenes Gerät

Zwei seltenere Ursachen runden die Liste ab. Erstens das Symbolformat: Ein abgelaufener oder fehlerhafter Kontrakt, ein alter Verfallscode oder ein fortlaufendes/Rollover-Symbol, das die API nicht routen kann, kann als Ablehnung erscheinen statt als eindeutiger “ungültiges Symbol”-Fehler. Der Wechsel zum aktiven Frontmonat-Kontrakt (oder dessen Kontrakt-ID) behebt das. Zweitens die Geräte-ID im Live-Modus: Live wird strikt durchgesetzt, dass Orders von einer bekannten, freigegebenen deviceId kommen, die bei auth/accessTokenRequest übergeben wurde, während Demo dies weitgehend ignoriert. Wenn Ihr Code im Demo-Modus Orders platziert, aber nur im Live-Modus abgelehnt wird, ist das der Hinweis.

So beheben Sie "Access is denied": Schritt für Schritt

1

Die Account-ID korrigieren

Authentifizieren Sie sich und holen Sie sich Ihr Access Token vom richtigen Host. Rufen Sie GET /account/list auf demselben Host auf. Suchen Sie in der Antwort Ihr Account-Objekt. Kopieren Sie den Wert von id, diese numerische Entity-ID ist Ihre accountId. Kopieren Sie den Wert von name (in der Regel Ihr Tradovate-Benutzername oder die Account-Bezeichnung), das ist Ihre accountSpec. Tragen Sie beides in den Order-Body ein. Verwenden Sie nicht erneut die Ziffern aus dem Anzeigenamen.

2

Orders auf Full Access setzen und das Token neu ausstellen

Öffnen Sie Ihre Tradovate-Anwendungs-/API-Key-Einstellungen, in denen die Berechtigungen pro Fähigkeit aufgelistet sind. Setzen Sie die Orders-Berechtigung auf Full Access (Lesezugriffe nach Bedarf belassen). Speichern Sie, und fordern Sie dann ein neues Access Token an, Berechtigungsänderungen wirken sich nur auf danach ausgestellte Tokens aus. Prüfen Sie zur Sicherheit mit einem Lese-Call wie GET /position/list, bevor Sie die Order erneut versuchen.

3

Demo-/Live-Host abgleichen

Entscheiden Sie, in welcher Umgebung sich der Account befindet (Sim vs. Live). Verwenden Sie demo.tradovateapi.com/v1 für Sim und live.tradovateapi.com/v1 für Live, für sowohl den Auth-Call als auch den Order-Call. Wenn Sie die Umgebung wechseln, authentifizieren Sie sich erneut; übertragen Sie niemals ein Demo-Token auf Live. Denken Sie daran, dass Tokens kurzlebig sind (rund 90 Minuten). Wenn ein zuvor funktionierendes Skript mitten in der Session plötzlich fehlschlägt, erneuern Sie das Token, statt erneut die Berechtigungen zu prüfen.

4

isAutomated korrekt übergeben

Geben Sie isAutomated immer im Order-Body an. Setzen Sie es für Bot-/algorithmische Orders auf true, auf false nur für echte, von einem Menschen ausgelöste UI-Aktionen. Wenn Sie JSON senden, lassen Sie es einen Boolean. Wenn Sie form-encodieren, senden Sie den String "true". Senden Sie die Order erneut und prüfen Sie, ob die Antwort eine echte Order-ID enthält, keinen failureText.

Tradovate placeOrder-Request-Body mit korrekten Feldern für numerische accountId, accountSpec und isAutomated

Troubleshooting-Tabelle

Fehler Bedeutung Lösung
401 Access DeniedToken ungültig, abgelaufen oder auf dem falschen Host erstelltErneut auf dem passenden Demo-/Live-Host authentifizieren; vor Ablauf der ca. 90 Minuten erneuern
200 + {"failureText":"Access is denied"}Authentifiziert, aber die Order wurde auf Berechtigungsebene abgelehntDie numerische accountId aus /account/list verwenden und Orders auf Full Access setzen
Access is denied trotz erteilter Orders-BerechtigungaccountId ist die Zahl aus dem Anzeigenamen, nicht die Entity-IDDas Feld id aus /account/list auslesen
Funktioniert in Demo, abgelehnt in LiveGeräte-ID im Live-Modus nicht freigegebenEine stabile deviceId beim Auth-Call senden und das Gerät freigeben
Access is denied bei korrektem AccountisAutomated fehlt oder hat den falschen DatentypisAutomated angeben; true für Bots; korrekter Typ für JSON vs. form-encoded
Ablehnung bei scheinbar gültigem SymbolAbgelaufener, fortlaufender oder fehlerhafter KontraktDen aktiven Frontmonat-Kontrakt oder dessen Kontrakt-ID verwenden

Wo PickMyTrade ansetzt

Die meisten “Access is denied”-Tickets entstehen dadurch, dass die Auth- und Order-Logik selbst gebaut wird. PickMyTrade entfernt diese gesamte Fehlerfläche, indem es die Tradovate-Verbindung für Sie vermittelt:

  • Verwaltete Authentifizierung & Host-Routing, der richtige Demo-/Live-Host und ein aktuelles, gültiges Token werden automatisch verwaltet, sodass eine abgelaufene Session nie als Berechtigungsfehler erscheint.
  • Account- & Berechtigungsauflösung, die richtige numerische Account-ID und die Orders-Berechtigung werden aus Ihrem verknüpften Account ermittelt, nicht aus einem Anzeigenamen geraten.
  • Regelkonforme isAutomated-Behandlung, automatisierte Orders werden jedes Mal korrekt gemäß den Börsenregeln gekennzeichnet, ohne Boolean-vs.-String-Fallstricke.
  • Symbol- & Kontraktvalidierung, Alerts werden einem gültigen, aktiven Kontrakt zugeordnet, bevor überhaupt eine Order gesendet wird, was die Fehlerklasse “Ablehnung wegen ungültigem Symbol” eliminiert.

Ablehnungsfrei handeln

Starten Sie Ihre kostenlose 5-tägige Testphase, verknüpfen Sie Ihre Alerts noch heute und handeln Sie ohne Ablehnungen.

Kostenlose 5-Tage-Testphase starten

Häufig gestellte Fragen

Die Berechtigung ist nur die halbe Prüfung. Die häufigste verbleibende Ursache ist eine falsche accountId, Sie senden die Zahl aus dem Anzeigenamen statt der numerischen Entity-ID aus /account/list. Ein Host-Konflikt, etwa die Verwendung eines Demo-Tokens gegen Live, erzeugt dieselbe Meldung.

Rufen Sie GET /account/list auf demselben Host auf, gegen den Sie sich authentifiziert haben. Verwenden Sie das id-Feld des Objekts (die numerische Entity-ID) für accountId und das name-Feld für accountSpec. Leiten Sie die ID niemals aus dem Anzeigenamen des Accounts ab.

accountSpec ist die lesbare Zeichenkette (in der Regel Ihr Benutzername oder die Account-Bezeichnung). accountId ist die numerische interne ID. Beide sind im Order-Body erforderlich und beide stammen aus /account/list.

Nein. Es ist eine generische Ablehnung. Prüfen Sie zuerst Orders → Full Access, aber wenn das bereits gesetzt ist, gehen Sie weiter zur Account-ID, zum Host und zum isAutomated-Typ, bevor Sie annehmen, dass der Key selbst defekt ist.

Live erzwingt strikt eine freigegebene deviceId sowie den eigenen Host, während Demo nachsichtiger ist. Geben Sie bei der Authentifizierung eine stabile Geräte-ID an und geben Sie das Gerät frei, um das Problem zu beheben.

true für jede Order, die von einem Bot, Skript oder Algorithmus platziert wird (eine Börsenanforderung); false nur, wenn ein Mensch sie physisch über eine UI auslöst.

Ja. Tradovate gibt manchmal 200 OK mit {"failureReason":"UnknownReason","failureText":"Access is denied"} im Body zurück. Prüfen Sie immer den Body, nicht nur den Statuscode.

Das kann sein. Manche Prop-Firmen schränken die direkte API-Automatisierung auf Evaluierungs-Accounts ein oder verbieten sie, und der Daten-/Berechtigungsstatus variiert je nach Firma und Accountgröße, prüfen Sie vor der Automatisierung die aktuellen Regeln Ihrer Firma.

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. und wird von diesem weder unterstützt noch gesponsert. Alle zugehörigen Namen, Logos und Marken sind Eigentum ihrer jeweiligen Inhaber. Funktionen und Abläufe der Plattform ändern sich im Laufe der Zeit, bestätigen Sie den aktuellen Prozess daher stets in der offiziellen Tradovate-Plattform und -Dokumentation, bevor Sie handeln.