Home → Assistenza

Unexpected token '<' quando chiami un'API compatibile con OpenAI

La tua base URL è sbagliata e il server restituisce una pagina web invece dell'API. Il client prova allora a interpretare l'HTML come JSON e fallisce già al primo carattere.

Cosa vedi

Perché succede

La maggior parte dei gateway compatibili con OpenAI serve sito e API dallo stesso dominio. Quando richiedi un percorso che l'API non riconosce, non ottieni un 404 pulito: ottieni il front-end del sito, con HTTP 200 e Content-Type: text/html.

Dal punto di vista del client è andato tutto bene, quindi procede a interpretare il corpo. L'errore che vedi è un parser JSON che si lamenta del primo carattere di un documento HTML, e non indica nemmeno lontanamente il vero problema.

Significa anche che la chiamata fallita di solito non lascia traccia nei log degli errori del provider: un 200 non è un errore. L'assistenza ti dirà che non vede nulla di strano, e starà dicendo la verità.

Verifica se la causa è questa

Verificalo con un comando. Invia una richiesta e guarda il tipo di contenuto invece del corpo:

curl -s -o /dev/null -w '%{http_code} %{content_type}\n' \
  -X POST 'YOUR_BASE_URL/chat/completions' \
  -H 'Authorization: Bearer YOUR_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"model":"MODEL","messages":[{"role":"user","content":"hi"}]}'

Un endpoint funzionante restituisce application/json: anche con una chiave sbagliata ricevi un JSON che lo dice. Se vedi text/html, il problema è l'URL, non la chiave.

Come risolvere

  1. Controlla se il tuo client aggiunge /v1 da soloTutta la trappola è qui. Gli SDK di OpenAI non aggiungono /v1: devi includerlo nella base URL. L'SDK di Anthropic e Claude Code invece lo aggiungono, quindi dare loro una base URL che termina già con /v1 produce /v1/v1/messages, che fallisce esattamente allo stesso modo.
  2. Attenzione alla barra finaleAlcuni client uniscono i percorsi in modo ingenuo. Una base URL che termina con una barra può produrre una doppia barra nel percorso finale, che alcuni gateway instradano al front-end invece che all'API.
  3. Assicurati di essere sull'host dell'APISe un provider offre un sottodominio dedicato all'API, il dominio principale può servire il sito commerciale sugli stessi percorsi. Stessa forma di URL, gestore completamente diverso.
ClientLa base URL deve
OpenAI SDK (Python, Node, Go)terminare con /v1
Codex, Cherry Studio, Chatbox, LobeChatterminare con /v1
Anthropic SDKnon contenere /v1: l'SDK aggiunge /v1/messages
Claude Codenon contenere /v1: per lo stesso motivo
Su APICLAN la base URL è https://apiclan.us/v1 per i client in stile OpenAI e https://apiclan.us per Claude Code. La configurazione completa di ogni client è nella guida rapida.

Articoli correlati

401 invalid API key: quando la chiave sembra giusta ma continua a fallire404 su /v1/chat/completions quando l'endpoint esiste di sicuro

Ultima verifica: 2026-10-01. Scritto a partire da problemi diagnosticati su un gateway compatibile con OpenAI in produzione, non raccolto da altri siti.