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 mayoría de las pasarelas compatibles con OpenAI sirven su web y su API desde el mismo dominio. Cuando pides una ruta que la API no reconoce, no obtienes un 404 limpio: obtienes el front-end de la web, con HTTP 200 y Content-Type: text/html.
Desde el punto de vista del cliente todo salió bien, así que procede a interpretar el cuerpo. El error que ves es un parser de JSON quejándose del primer carácter de un documento HTML, lo que no apunta ni de lejos al problema real.
Esto también significa que la llamada fallida normalmente no deja rastro en los registros de errores del proveedor: un 200 no es un error. El soporte te dirá que no ve nada raro, y estará diciendo la verdad.
Confírmalo con un comando. Envía una petición y mira el tipo de contenido en lugar del cuerpo:
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 que funciona devuelve application/json: incluso con una clave incorrecta recibes un JSON que lo dice. Si ves text/html, el problema es la URL, no la clave.
| Cliente | La base URL debe |
|---|---|
| OpenAI SDK (Python, Node, Go) | terminar en /v1 |
| Codex, Cherry Studio, Chatbox, LobeChat | terminar en /v1 |
| Anthropic SDK | no llevar /v1: el SDK añade /v1/messages |
| Claude Code | no llevar /v1: por el mismo motivo |
https://apiclan.us/v1 para clientes estilo OpenAI y https://apiclan.us para Claude Code. La configuración completa de cada cliente está en el inicio rápido.Revisado por última vez el 2026-10-01. Escrito a partir de problemas diagnosticados en una pasarela compatible con OpenAI en producción, no recopilado de otras webs.