DEV Community

Cover image for Wie ich den 403-Fehler bei der Claude-Code-Installation unter Windows behoben habe (und es mit Crazyrouter verbunden habe)
boluo
boluo

Posted on

Wie ich den 403-Fehler bei der Claude-Code-Installation unter Windows behoben habe (und es mit Crazyrouter verbunden habe)

Wie ich den 403-Fehler bei der Claude-Code-Installation unter Windows behoben habe (und es mit Crazyrouter verbunden habe)

Der frustrierendste Fehler beim Einrichten von Claude Code unter Windows war keine fehlende Abhängigkeit — es war ein 403, der erst auftauchte, als scheinbar alles lief.

claude --version gab eine saubere Versionsnummer aus. Die Binärdatei war installiert. Dann startete ich das Programm und bekam Failed to connect to api.anthropic.com: Status 403. Ich habe npm dreimal neu installiert und Proxy-Einstellungen durchprobiert, bevor ich merkte, dass der eigentliche Fehler eine falsch benannte Umgebungsvariable war. Hier ist die vollständige Analyse und mein exaktes Prüfprotokoll. Alles lief auf Windows 10 mit PowerShell; alle Befehle lassen sich direkt kopieren und ausführen.

Der 403-Screenshot, mit dem alles begann

Die Versionsnummer wird korrekt ausgegeben, beim Start kommt aber trotzdem ein 403 von api.anthropic.com

Das Bild hält die wichtigste Lektion fest: Eine erfolgreiche Installation und ein erfolgreicher Aufruf sind zwei verschiedene Prüfpunkte. Die Versionsnummer beweist nur den ersten.

Teil 1: Claude Code installieren

PowerShell öffnen (achte auf die Eingabeaufforderung PS C:\Users\deinname>). Installationsbefehle gehören nicht in den Claude-Code-Chat, sondern ins Terminal.

Native Installation (bevorzugt, kein Node.js nötig):

irm https://claude.ai/install.ps1 | iex
Enter fullscreen mode Exit fullscreen mode

Danach das Terminal neu öffnen und claude --version ausführen. Eine Versionsnummer bedeutet, dass der lokale Befehl funktioniert. Wenn der Skript-Download fehlschlägt oder die Ausgabe voller HTML- und <script>-Tags ist: aufhören — dann hast du nicht das echte Skript bekommen.

Das offizielle Installationsskript lieferte eine HTML-Seite zurück; iex führte die Webseite als Befehle aus und spuckte JavaScript-Syntaxfehler aus

Wenn PowerShell sich über var oder && beschwert, parst es gerade eine Webseite und nicht deinen Befehl.

npm als Ausweichlösung (benötigt Node.js 22+):

node --version
npm.cmd --version
npm.cmd install -g @anthropic-ai/claude-code
claude.cmd --version
Enter fullscreen mode Exit fullscreen mode

Ich nutze npm.cmd, damit PowerShell nicht npm.ps1 nimmt und an der Execution Policy hängen bleibt. Eine häufige Falle:

Zwei npm-Befehle wurden zusammengeklebt, wodurch der nicht existierende Paketname claude-codenpm entstand

Der Fehler zeigte @anthropic-ai/claude-codenpm — ein verirrtes npm, das am Paketnamen klebte, weil zwei Befehle in einer Zeile verschmolzen waren. Das korrekte Paket heißt immer @anthropic-ai/claude-code. Zeile leeren und einmal sauber ausführen.

Git ist zum Starten nicht nötig; installiere Git für Windows nur, wenn du Repositories oder Git Bash brauchst.

Teil 2: Die Gateway-API anbinden

Ohne einen nutzbaren Modelldienst kannst du keine einzige Frage stellen. Ich habe den Ostasien-Endpunkt verwendet:

https://cn.crazyrouter.com
Enter fullscreen mode Exit fullscreen mode
Zweck Adresse Wo
Konto / Konsole crazyrouter.com Browser
Claude Code Base URL https://cn.crazyrouter.com ANTHROPIC_BASE_URL
Modelle auflisten https://cn.crazyrouter.com/v1/models Prüfung
Messages-Endpunkt https://cn.crazyrouter.com/v1/messages Client

Wichtig: die Wurzeladresse eintragen, nicht /v1/messages. Das ist genau das Gegenteil von OpenAI-kompatiblen Clients. Wer den OpenAI-Stil übernimmt, bekommt einen 404 oder landet bei /v1/v1/messages. UTM-Parameter haben in der API-Konfiguration nichts zu suchen.

Lege in der Konsole einen eigenen API-Key an (nenn ihn claude-code-windows, prüfe Ablaufdatum und Kontingent) und öffne dann die Benutzerkonfiguration:

%USERPROFILE%\.claude\settings.json
Enter fullscreen mode Exit fullscreen mode

Verzeichnis anlegen und eine vorhandene Datei sichern:

New-Item -ItemType Directory -Path "$env:USERPROFILE\.claude" -Force | Out-Null
$settingsPath = Join-Path $env:USERPROFILE '.claude\settings.json'
if (Test-Path -LiteralPath $settingsPath) {
    Copy-Item -LiteralPath $settingsPath -Destination "$settingsPath.backup-$(Get-Date -Format 'yyyyMMdd-HHmmss')"
}
notepad.exe "$env:USERPROFILE\.claude\settings.json"
Enter fullscreen mode Exit fullscreen mode

Das JSON im Editor schreiben (niemals in PowerShell):

{
  "env": {
    "ANTHROPIC_BASE_URL": "https://cn.crazyrouter.com",
    "ANTHROPIC_AUTH_TOKEN": "YOUR_CRAZYROUTER_API_KEY"
  }
}
Enter fullscreen mode Exit fullscreen mode

Ersetze den Platzhalter durch deinen Key. Verwende englische doppelte Anführungszeichen, kein Komma am Ende, und füge dich in ein bereits vorhandenes env ein, statt ein zweites anzulegen.

Die eine Änderung, die meinen 403 beendet hat

Für einen Anthropic-kompatiblen Endpunkt von Drittanbietern nutzt du ANTHROPIC_AUTH_TOKEN, nicht ANTHROPIC_API_KEY. Die beiden senden unterschiedliche Header:

Variable Gesendeter Header Gedacht für
ANTHROPIC_API_KEY x-api-key: <key> offizielle Anthropic-API
ANTHROPIC_AUTH_TOKEN Authorization: Bearer <token> eigene / kompatible Gateways

Setzt du ANTHROPIC_API_KEY, geht der Client vom offiziellen Kanal aus — ANTHROPIC_BASE_URL kann das nicht überschreiben, die Anfragen laufen weiter gegen api.anthropic.com, und du bekommst den 403. Setze nicht „zur Sicherheit“ beide; das erzwingt nur bei jedem Start eine Rückfrage.

Prüfe, ob die Konfiguration überhaupt parst (das validiert den Key nicht):

$settingsPath = Join-Path $env:USERPROFILE '.claude\settings.json'
$ccSettings = Get-Content -Raw -LiteralPath $settingsPath | ConvertFrom-Json
[pscustomobject]@{
    BaseURL = $ccSettings.env.ANTHROPIC_BASE_URL
    HasAuthToken = -not [string]::IsNullOrWhiteSpace([string]$ccSettings.env.ANTHROPIC_AUTH_TOKEN)
}
Enter fullscreen mode Exit fullscreen mode

Modelle mit dem eigenen Key auflisten:

$crBase = ([string]$ccSettings.env.ANTHROPIC_BASE_URL).TrimEnd('/')
$crHeaders = @{ Authorization = "Bearer $($ccSettings.env.ANTHROPIC_AUTH_TOKEN)" }
(Invoke-RestMethod -Uri "$crBase/v1/models" -Headers $crHeaders -Method Get -TimeoutSec 30).data | Select-Object id
Enter fullscreen mode Exit fullscreen mode

Ein sichtbares Modell ist kein Beweis, dass es über das Messages-Protokoll auch generieren kann — deshalb stellen wir trotzdem eine echte Frage. Kopiere die exakt zurückgegebene ID und ergänze sie:

{
  "env": {
    "ANTHROPIC_BASE_URL": "https://cn.crazyrouter.com",
    "ANTHROPIC_AUTH_TOKEN": "YOUR_CRAZYROUTER_API_KEY"
  },
  "model": "YOUR_MODEL_ID"
}
Enter fullscreen mode Exit fullscreen mode

Speichern und Claude Code neu starten (ebenso das Terminal, wenn du Umgebungsvariablen geändert hast).

Teil 3: Die erste Frage — was „verbunden“ wirklich heißt

Nutze ein Wegwerf-Verzeichnis, kein echtes Projekt:

$demoDir = Join-Path $env:USERPROFILE 'claude-code-first-run'
New-Item -ItemType Directory -Path $demoDir -Force | Out-Null
Set-Location -LiteralPath $demoDir
claude
Enter fullscreen mode Exit fullscreen mode

Im Chatfenster eingeben:

Reply with exactly OK. Do not read files. Do not run commands.
Enter fullscreen mode Exit fullscreen mode

Erwartet wird ein vollständiges OK. Öffne dann das Nutzungsprotokoll der Konsole und verifiziere, dass Zeit, Modell, Status und Verbrauch des Aufrufs übereinstimmen. Ein funktionierender Befehl plus lesbare Konfiguration plus vollständige Antwort plus passender Eintrag im Backend — das ist eine verifizierte Integration.

Teil 4: Den 403 lesen

Mein Fehler war Failed to connect to api.anthropic.com: Status 403. Drei Ebenen:

  1. 403 heißt: Die Anfrage wurde gesendet und beantwortet — der Server hat sie abgelehnt. Ein Netzwerkausfall zeigt einen Timeout, keinen Statuscode.
  2. Der Host ist api.anthropic.com — das ist das wertvolle Detail. Du hast das Gateway konfiguriert, trotzdem geht die Anfrage an die offizielle Domain, der Client hat deine Konfiguration also nie verwendet.
  3. Zusammen mit „Versionsnummer wurde sauber ausgegeben“ heißt das: Das Problem liegt beim Routing und bei den Zugangsdaten, nicht bei der Installation.

Also: erst klären, wohin die Anfrage ging, dann diskutieren, warum sie abgelehnt wurde. Zeigt die Anfrage noch woanders hin, prüfe in dieser Reihenfolge: Konfiguration im richtigen Windows-Benutzerverzeichnis, settings.json parst mit korrekter Base URL, CLAUDE_CONFIG_DIR unverändert, Neustart erfolgt, keine projektlokale .claude/settings.local.json überschreibt etwas, und kein Startargument, keine Umgebungsvariable und kein Login-Status hat den Auth-Pfad verändert. Kommt der 403 direkt vom Gateway, lies den Response-Body, prüfe Key-Gültigkeit, Kontingent und Logs — und notiere dir die Request-ID.

Teil 5: Mein tatsächliches Prüfprotokoll

Erfasst am 2026-09-28:

Prüfung Ergebnis
OS / Terminal Windows 10 / Windows PowerShell
Node.js / npm v22.22.2 / 10.9.7
Claude Code 2.1.281
Base URL https://cn.crazyrouter.com
Konfiguration parst; ANTHROPIC_AUTH_TOKEN gesetzt; kein ANTHROPIC_API_KEY beigemischt
GET /v1/models HTTP 200, 161 Modell-IDs, gewähltes Modell enthalten
POST /v1/messages HTTP 200, Body OK, stop_reason end_turn
Response-ID msg_011CfVJqbN2DVuqoYqgLcdNE
Tokens Input 18, Output 4
Round-Trip (direkt) 11569 ms
Client-Aufruf Exit 0, is_error=false, subtype=success, OK
Client-Dauer 5103 ms
Session-ID a7a76f08-fa36-4a36-8787-3f2b24dad626

Der Minimaltest verwendete diesen Body (die Modell-ID war zum Abfragezeitpunkt gültig und kann bei dir abweichen):

{
  "model": "claude-fable-5-1",
  "max_tokens": 32,
  "messages": [
    { "role": "user", "content": "Reply with exactly OK." }
  ]
}
Enter fullscreen mode Exit fullscreen mode

Das beweist, dass eine minimale Anfrage erfolgreich war — nicht die langfristige Stabilität und auch nicht, dass jedes Modell funktioniert. Modell-IDs und Preise ändern sich; verlass dich auf dein eigenes /v1/models und deine Konsole.

Fazit

Zerlege die Einrichtung in Prüfpunkte: Version wird ausgegeben → Key liegt vor → JSON parst → kompatibles Modell → vollständige Antwort → Log stimmt überein. Scheitert einer der früheren Punkte, repariere genau diesen Schritt. Installiere npm nicht wegen eines 403 neu, gib dem Key nicht die Schuld an einem ConnectionRefused, und nenne „der Bildschirm ist aufgegangen“ nicht Erfolg.

Was war die seltsamste Falle, in die du beim Anbinden von Claude Code (oder irgendeinem KI-Coding-Tool) unter Windows getappt bist? Schreib deine Leidensgeschichte in die Kommentare — ich vergleiche gern Notizen und erspare vielleicht der nächsten Person ein paar Neuinstallationen.

Tags: claude, windows, api, tutorial

Referenzen

Haftungsausschluss: Dieser Artikel ist ein persönlicher Erfahrungsbericht und keine offizielle Dokumentation. Dienste von Drittanbietern, Modellnamen, Preise und verfügbare Modelle können sich jederzeit ändern — prüfe sie immer auf den offiziellen Seiten und in deiner eigenen Konsole. API-Endpunkte und Konfigurationspfade solltest du der offiziellen Dokumentation entnehmen, die du zum jeweiligen Zeitpunkt heranziehst. Dieser Artikel enthält keine Affiliate-, Provisions- oder Sponsoring-Inhalte.

Top comments (0)