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
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
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.
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
Ich nutze npm.cmd, damit PowerShell nicht npm.ps1 nimmt und an der Execution Policy hängen bleibt. Eine häufige Falle:
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
| 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
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"
Das JSON im Editor schreiben (niemals in PowerShell):
{
"env": {
"ANTHROPIC_BASE_URL": "https://cn.crazyrouter.com",
"ANTHROPIC_AUTH_TOKEN": "YOUR_CRAZYROUTER_API_KEY"
}
}
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)
}
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
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"
}
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
Im Chatfenster eingeben:
Reply with exactly OK. Do not read files. Do not run commands.
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:
-
403heißt: Die Anfrage wurde gesendet und beantwortet — der Server hat sie abgelehnt. Ein Netzwerkausfall zeigt einen Timeout, keinen Statuscode. -
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. - 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." }
]
}
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
- Offizielle Setup-Dokumentation zu Claude Code
- Claude-Code-Einstellungen und Priorität
- Crazyrouter-Dokumentation
- Node.js herunterladen
- Git für Windows
- Crazyrouter-Konsole — API-Key erstellen
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)