SyntaxError: Unexpected token '<', "<!doctype "... is not valid JSONjson.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)invalid character '<' looking for beginning of valueError: Invalid JSON response bodyLa 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à.
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.
| Client | La base URL deve |
|---|---|
| OpenAI SDK (Python, Node, Go) | terminare con /v1 |
| Codex, Cherry Studio, Chatbox, LobeChat | terminare con /v1 |
| Anthropic SDK | non contenere /v1: l'SDK aggiunge /v1/messages |
| Claude Code | non contenere /v1: per lo stesso motivo |
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.Ultima verifica: 2026-10-01. Scritto a partire da problemi diagnosticati su un gateway compatibile con OpenAI in produzione, non raccolto da altri siti.