Errore del token OAuth “invalid_client” in Tradovate
Il tuo scambio del token restituisce invalid_client invece di un access token. Ecco perché i tre campi di identità dell'app non coincidono, e come correggere ciascuno.
Hai appena ricevuto un authorization code, avvii lo scambio del token e, invece di un access token, ricevi l'errore [invalid_client] client_id, redirect_uri and client_secret do not match existing setup. Compare come invalid_client, a volte incapsulato in un 400 o 401, e blocca sul nascere la tua integrazione con Tradovate prima che un solo ordine possa essere inviato.
Ecco la parte rassicurante: questo errore quasi mai significa che qualcosa sia rotto lato Tradovate. Significa che i tre valori che identificano la tua app durante lo scambio del token non coincidono con quelli registrati. Correggi la discrepanza e la stessa richiesta che sta fallendo ora andrà a buon fine.
Di seguito trovi ogni motivo per cui si verifica questa discrepanza, nell'ordine in cui è più probabile incontrarli, con i punti esatti da controllare nella tua app OAuth e nel tuo codice.
Checklist rapida per l'errore invalid_client
- client_id errato, copialo di nuovo dalla tua app OAuth registrata; presta attenzione a uno spazio iniziale o un a capo finale.
- client_secret errato, se lo hai rigenerato in passato, il vecchio valore non è più valido; incolla quello attuale ovunque.
- redirect_uri non identico, deve corrispondere byte per byte al valore registrato sia nella fase di autorizzazione sia nello scambio del token.
- Confusione tra live e demo, invia la richiesta del token allo stesso ambiente in cui è stata registrata la tua app.
- Codice di esempio obsoleto, i vecchi repository di esempio contengono URL degli endpoint non aggiornati; verifica i tuoi confrontandoli con la documentazione ufficiale attuale.
- Credenziali nel posto sbagliato, assicurati che grant_type, code, client_id, client_secret e redirect_uri siano effettivamente presenti nel corpo della richiesta.
Cosa significa "[invalid_client] client_id, redirect_uri and client_secret do not match existing setup"
OAuth suddivide la tua integrazione in due identità distinte. Una sei tu, il titolare dell'account, dimostrato tramite nome utente e password. L'altra è la tua app, dimostrata tramite un client_id e un client_secret. L'errore invalid_client riguarda interamente la seconda. È la risposta standard OAuth 2.0 per “client authentication failed,” e Tradovate specifica esattamente quali campi ha controllato: client_id, redirect_uri e client_secret.
Quindi, quando vedi questo errore, l'authorization code appena ricevuto è generalmente valido. Il server è arrivato al punto di confermare l'identità della tua app, ha confrontato i tre valori inviati con il record salvato al momento della registrazione, ha riscontrato una differenza e ha rifiutato di proseguire. Non ti dirà quale dei tre valori non è corretto. Questa è la parte fastidiosa, ed è per questo che la soluzione è un processo per esclusione.
La richiesta che genera l'errore è il tuo scambio del token: un POST verso l'endpoint del token OAuth sull'host del tuo ambiente (live.tradovateapi.com per live, demo.tradovateapi.com per demo) contenente grant_type=authorization_code, il code e i tre campi di identità. In caso di successo, la risposta include un access_token e un expires_in. In caso di errore, la risposta include error e error_description, e in questo caso l'errore è invalid_client.
Le cause principali dell'errore invalid_client
1. Il client_id non corrisponde alla tua app registrata
Questa è la causa più semplice e la più facile da trascurare. Il client_id nella tua richiesta del token deve essere quello assegnato da Tradovate quando hai registrato l'app OAuth. Gli errori più comuni sono piccoli: incollare il nome dell'app invece del suo id, prendere un id da un'app diversa, oppure trascinare uno spazio o un a capo invisibile durante la copia. Gli spazi bianchi sono i più subdoli, perché il valore sembra corretto nel tuo editor. Copia di nuovo l'id direttamente dalla schermata di registrazione e rimuovi eventuali spazi in eccesso.

2. Il client_secret è errato o è stato rigenerato
Il client_secret è la componente segreta, equivalente a una password, dell'identità della tua app, e deve corrispondere esattamente. La trappola classica è la rigenerazione: a un certo punto hai premuto “regenerate secret” per ruotarlo, la piattaforma ne ha emesso uno nuovo e il vecchio valore è ora permanentemente non valido. Se il tuo codice, il file .env o la configurazione di deployment contengono ancora il secret precedente, ogni scambio restituisce invalid_client. Lo stesso accade se non hai mai generato un secret e stai inviando un valore vuoto o segnaposto.
3. Il redirect_uri non corrisponde byte per byte
Questa è la causa che fa perdere più ore, perché gli URI sembrano uguali a colpo d'occhio. Il redirect_uri deve essere identico in tre punti: il valore salvato sulla tua app registrata, il valore nella richiesta di autorizzazione e il valore nello scambio del token. Identico significa carattere per carattere. Tutti questi casi contano come differenti:
- Una barra finale presente in uno ma non nell'altro (
/callbackrispetto a/callback/). -
httpin un punto,httpsin un altro. - Un numero di porta presente qui e assente là (
localhost:3030rispetto alocalhost). - Maiuscole e minuscole diverse in qualsiasi punto del percorso.
-
localhostin un punto e127.0.0.1in un altro.
Anche uno solo di questi casi fa sì che Tradovate lo tratti come un redirect non registrato, includendolo nella risposta invalid_client.

4. Hai effettuato la registrazione su un ambiente e stai chiamando l'altro
Un'app OAuth è vincolata a un unico ambiente. Se la registri su demo, il suo client_id e client_secret esistono solo lato demo. Se il tuo URL di autorizzazione o il tuo scambio del token puntano all'host live mentre l'app si trova su demo, o viceversa, le credenziali semplicemente non vengono trovate lì e ottieni invalid_client. Verifica su quale ambiente hai effettuato la registrazione, quindi assicurati che sia la fase di autorizzazione sia l'endpoint del token puntino allo stesso ambiente.
5. Stai utilizzando codice di esempio obsoleto
Gli esempi OAuth diventano obsoleti nel tempo. Un progetto di esempio più vecchio può contenere URL degli endpoint, un redirect_uri hard-coded, o una struttura della richiesta che non corrisponde più a un'app appena registrata. Se hai clonato un tutorial e “semplicemente non funziona,” non dare per scontato che le tue credenziali siano sbagliate: verifica che gli endpoint e il corpo della richiesta in quel codice corrispondano ancora alla documentazione ufficiale attuale di Tradovate prima di passare un'ora a fare debug del tuo secret.
6. Le credenziali mancano o si trovano nella parte sbagliata della richiesta
Ogni campo controllato dal server deve effettivamente arrivare, nel posto giusto e nel formato giusto. Il tuo POST del token richiede grant_type=authorization_code, il code, client_id, client_secret e redirect_uri, inviati nel corpo così come specificato dalla documentazione attuale. Se ometti uno dei tre campi di identità, o invii il corpo in un formato non atteso dall'endpoint, l'app non può essere autenticata, il che si manifesta come invalid_client.
Come risolvere l'errore invalid_client: passo dopo passo
Copia di nuovo il client_id e il client_secret
Apri la schermata di registrazione della tua app OAuth (nell'area API Access delle tue impostazioni). Copia di nuovo il client_id e incollalo nella tua configurazione, quindi elimina eventuali spazi bianchi iniziali o finali residui. Fai lo stesso per il client_secret; se non sei sicuro che quello attuale corrisponda al tuo codice, rigeneralo, aggiorna ogni punto in cui è memorizzato ed esegui un nuovo deployment.
Annota il redirect_uri registrato
Annota il redirect_uri esatto salvato sull'app, così potrai confrontarlo con il tuo codice nel passaggio successivo.
Fissa il redirect_uri in un'unica costante
Definisci un'unica costante REDIRECT_URI per ambiente nel tuo codice. Usa esattamente quella costante per costruire sia l'URL di autorizzazione sia il corpo dello scambio del token, senza mai riscriverla. Confrontala con il valore registrato, prestando attenzione a barre, schema, porta e maiuscole/minuscole, e correggi il lato sbagliato in modo che tutte e tre le copie siano identiche.
Conferma l'ambiente e gli endpoint
Stabilisci in quale ambiente è registrata l'app, live o demo. Indirizza la richiesta di autorizzazione a https://trader.tradovate.com/oauth con response_type=code, il tuo client_id e il redirect_uri corrispondente. Invia lo scambio del token all'endpoint del token OAuth sull'host dello stesso ambiente, live.tradovateapi.com o demo.tradovateapi.com, utilizzando il percorso esatto indicato nel riferimento API attuale.
Esegui di nuovo l'intero flusso
Richiedi un authorization code completamente nuovo, quindi scambialo immediatamente. I codici sono a uso singolo, quindi non riutilizzare quello già fallito.

Tabella di risoluzione dei problemi
| Errore | Significato | Soluzione |
|---|---|---|
[invalid_client] client_id, redirect_uri and client_secret do not match existing setup | Uno o più dei tre campi di identità dell'app non corrispondono all'app OAuth registrata. | Copia di nuovo client_id e client_secret; rendi redirect_uri identico in tutti e tre i punti. |
invalid_client (nessun dettaglio) | Autenticazione del client non riuscita, l'app non è stata identificata. | Verifica che client_id/secret siano corretti e inviati nel corpo della richiesta, non lasciati vuoti. |
invalid_grant | L'authorization code è scaduto, già utilizzato o associato a un redirect_uri diverso. | Richiedi un nuovo codice e scambialo immediatamente con il redirect_uri corrispondente. |
redirect_uri_mismatch | Il redirect_uri non corrisponde a quello registrato sull'app. | Allinea schema, host, porta, percorso e barra finale byte per byte. |
unsupported_grant_type | Il valore di grant_type manca o è scritto in modo errato. | Invia esattamente grant_type=authorization_code. |
| Credenziali valide su demo, non funzionanti su live | App registrata in un ambiente, richiesta inviata all'altro. | Indirizza l'URL di autorizzazione e l'endpoint del token verso l'ambiente proprio dell'app. |
Evita questo problema con PickMyTrade
L'intero handshake OAuth esiste per permettere a un software di operare sul tuo account al posto tuo. Se quel software è PickMyTrade, non devi mai toccare un client_secret né fare debug di un redirect_uri: colleghi il tuo account Tradovate una sola volta e da lì instradi i tuoi alert di TradingView verso ordini live.
- Connessione dell'account guidata, collega Tradovate tramite un flusso guidato invece di costruire manualmente uno scambio del token.
- Sessioni gestite, il ciclo di vita del token e i rinnovi avvengono dietro le quinte, quindi non c'è nessun auth code che devi mantenere attivo.
- Instradamento consapevole dell'ambiente, demo e live restano separati, così le credenziali non si mescolano mai.
- Sincronizzazione multi-account, replica lo stesso alert su più account senza dover configurare OAuth per ciascuno.
Salta l'handshake OAuth
Collega Tradovate a PickMyTrade una sola volta e instrada i tuoi alert di TradingView verso ordini live, senza alcun client_secret o redirect_uri da debuggare.
Inizia la tua prova gratuita di 5 giorniDomande frequenti
Significa che Tradovate non è riuscito ad autenticare la tua applicazione durante lo scambio del token. Il messaggio completo, [invalid_client] client_id, redirect_uri and client_secret do not match existing setup, ti sta dicendo che almeno uno di questi tre valori nel tuo POST non corrisponde al record memorizzato per la tua app OAuth registrata. L'authorization code era corretto; a fallire è stata l'identità dell'app.
Il tuo login web utilizza nome utente e password. Lo scambio del token OAuth utilizza un insieme separato di credenziali, client_id e client_secret, che appartengono all'app registrata, non al tuo account di trading. Un login web perfettamente riuscito non dice nulla sulla correttezza di quelle credenziali dell'app, quindi i due processi hanno esiti indipendenti.
Byte per byte. Sia il redirect_uri nella richiesta di autorizzazione sia quello nello scambio del token devono corrispondere carattere per carattere al valore salvato sull'app. Una barra finale, http rispetto a https, una porta diversa o un cambio di maiuscole/minuscole contano tutti come discrepanze. Definisci un'unica costante e riutilizzala ovunque.
Sì. Un'app OAuth viene registrata rispetto a un unico ambiente. Se hai effettuato la registrazione su demo ma invii la richiesta del token all'host live, o viceversa, le credenziali non vengono trovate e ottieni invalid_client. Indirizza l'URL di autorizzazione e l'endpoint del token verso lo stesso ambiente in cui è stata creata la tua app.
Rigenerare un secret invalida immediatamente quello vecchio. Se il tuo codice, il file di ambiente o il deployment inviano ancora il valore precedente, ogni scambio fallisce. Copia il nuovo secret in ogni punto in cui è memorizzato, esegui un nuovo deployment e cancella eventuali configurazioni in cache, in modo che nulla continui a inviare la stringa ormai ritirata.
No, e la differenza ti indica il problema reale. invalid_client riguarda l'identità dell'app: un client_id errato, un client_secret errato o un redirect_uri non corrispondente. invalid_grant riguarda l'authorization code: è scaduto, è già stato utilizzato oppure è stato emesso per un redirect_uri diverso. Se vedi invalid_grant, richiedi un nuovo codice invece di ricontrollare il tuo secret.
OAuth con client_id e client_secret è una delle strade possibili, ed è quella che genera invalid_client. Tradovate supporta anche una richiesta diretta di access token utilizzando un app id e un API secret. Se stai automatizzando il tuo stesso account e non hai bisogno di far passare altri utenti attraverso una schermata di consenso, la richiesta diretta del token è spesso più semplice e salta del tutto l'handshake OAuth.
Apri l'area applicazioni o impostazioni del tuo account, vai alla sezione API Access e trova la registrazione OAuth che hai creato. Lì si trovano il client_id e il client_secret, insieme al redirect_uri salvato. Le etichette cambiano nel tempo, quindi se non vedi una scheda API Access, controlla il layout attuale delle impostazioni o la documentazione ufficiale per individuare la schermata equivalente.
Questa guida ha uno scopo esclusivamente educativo e informativo e non costituisce consulenza finanziaria, di investimento o di trading. Il trading di futures e altri prodotti a leva comporta un rischio di perdita significativo e non è adatto a tutti gli investitori. PickMyTrade è una piattaforma di automazione indipendente di terze parti e non è affiliata, approvata o sponsorizzata da Tradovate, Inc. Tutti i nomi, i loghi e i marchi correlati sono di proprietà dei rispettivi titolari. Le funzionalità e i passaggi della piattaforma cambiano nel tempo, quindi verifica sempre la procedura attuale nella documentazione ufficiale della piattaforma prima di agire.