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 bodyWiększość bramek zgodnych z OpenAI serwuje stronę i API z tej samej domeny. Gdy zapytasz o ścieżkę, której API nie zna, nie dostaniesz czystego 404 – dostaniesz frontend strony, z HTTP 200 i Content-Type: text/html.
Z punktu widzenia klienta wszystko się udało, więc parsuje treść odpowiedzi. Błąd, który widzisz, to parser JSON narzekający na pierwszy znak dokumentu HTML – a to nie wskazuje nawet w pobliżu prawdziwego problemu.
Oznacza to też, że nieudane wywołanie zwykle nie zostawia śladu w logach błędów dostawcy – 200 to nie błąd. Wsparcie powie ci, że nie widzi niczego złego, i będzie mówić prawdę.
Potwierdź to jednym poleceniem. Wyślij zapytanie i spójrz na typ treści zamiast na samą treść:
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"}]}'
Działający endpoint zwraca application/json – nawet przy złym kluczu dostaniesz JSON-a, który o tym mówi. Jeśli widzisz text/html, problemem jest adres, nie klucz.
| Klient | Base URL powinien |
|---|---|
| OpenAI SDK (Python, Node, Go) | kończyć się na /v1 |
| Codex, Cherry Studio, Chatbox, LobeChat | kończyć się na /v1 |
| Anthropic SDK | bez /v1 – samo dokleja /v1/messages |
| Claude Code | bez /v1 – z tego samego powodu |
https://apiclan.us/v1 dla klientów w stylu OpenAI i https://apiclan.us dla Claude Code. Pełna konfiguracja każdego klienta jest w szybkim starcie.Ostatnio sprawdzono 2026-10-01. Napisane na podstawie problemów zdiagnozowanych na działającej bramce zgodnej z OpenAI, a nie zebrane z innych stron.