Inicio → Ayuda

Unexpected token '<' al llamar a una API compatible con OpenAI

Tu base URL es incorrecta y el servidor está devolviendo una página web en lugar de la API. El cliente intenta entonces interpretar HTML como JSON y falla en el primer carácter.

Lo que ves

Por qué ocurre

La 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.

Comprueba si es esta la causa

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.

Cómo solucionarlo

  1. Comprueba si tu cliente añade /v1 por su cuentaEsta es toda la trampa. Los SDK de OpenAI no añaden /v1: tienes que incluirlo en la base URL. El SDK de Anthropic y Claude Code sí lo añaden, así que darles una base URL que ya termina en /v1 produce /v1/v1/messages, que falla exactamente igual.
  2. Cuidado con la barra finalAlgunos clientes unen las rutas de forma ingenua. Una base URL que termina en barra puede producir una doble barra en la ruta final, y algunas pasarelas la envían al front-end en lugar de a la API.
  3. Asegúrate de estar en el host de la APISi un proveedor ofrece un subdominio aparte para la API, el dominio principal puede servir la web comercial en las mismas rutas. Misma forma de URL, un gestor completamente distinto.
ClienteLa base URL debe
OpenAI SDK (Python, Node, Go)terminar en /v1
Codex, Cherry Studio, Chatbox, LobeChatterminar en /v1
Anthropic SDKno llevar /v1: el SDK añade /v1/messages
Claude Codeno llevar /v1: por el mismo motivo
En APICLAN la base URL es 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.

Relacionado

401 invalid API key: cuando la clave parece correcta pero sigue fallando404 en /v1/chat/completions cuando el endpoint claramente existe

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.