About this project

WindsurfAPI is a self-hosted reverse proxy service that converts the 100+ AI models from the Windsurf cloud (formerly Codeium, now Devin Desktop) into multiple standard API interfaces. The project is implemented in pure Node.js, claims zero npm runtime dependencies, and listens on port 3003 by default. ## Provided Interfaces - `POST /v1/chat/completions`: OpenAI Chat compatible, can be used directly with the OpenAI SDK - `POST /v1/completions`: OpenAI legacy Completions (non-streaming) - `POST /v1/responses`: OpenAI Responses compatible, also supports `GET`/`DELETE /v1/responses/{id}` to read and delete stored responses, and can continue context using `previous_response_id` - `POST /v1/messages`: Anthropic compatible, for clients such as Claude Code, Cline, and Cursor to connect - `POST /v1beta/models/*`: Gemini compatible, supports the `x-goog-api-key` header and the `?key=` query parameter ## How It Works The service translates requests from each protocol into Windsurf's internal gRPC protocol and forwards them to the Windsurf cloud via a local Language Server binary; it can also connect directly to the Devin cloud through the `DEVIN_CONNECT` path. It has a built-in account pool with rotation, rate-limit isolation, failover, and circuit breaking; upstream Windsurf identity information is stripped before returning responses. ## Deployment and Usage It provides a one-click `setup.sh` deployment, Docker Compose deployment, and an `update.sh` update script. You need to add Windsurf accounts first: you can log in through the Dashboard using Google/GitHub OAuth or email/password, or use the token obtained from `windsurf.com/show-auth-token` to batch import via the `/auth/login` endpoint. The Dashboard (`/dashboard`) provides panels for overview, login and token retrieval, account management, model allow/deny lists, proxy configuration, real-time logs, and statistical analysis. ## Configuration Highlights Environment variables override the port, API key, default model, max tokens, log level, LS binary path and data directory, LS instance pool and memory guardrails, response storage (TTL, count, byte budget), sticky sessions, proxy host allowlist, and more. An empty `API_KEY` and empty `DASHBOARD_PASSWORD` default to fail-closed (returning 401); opening to the local machine requires explicitly setting the corresponding switches. ## Models and Clients The static model list covers Claude, GPT, Gemini, Grok, Qwen, Kimi, GLM, MiniMax, SWE, Arena, and other series, and merges the model catalog dynamically delivered by the cloud at startup. The documentation explains that the models themselves do not operate on files; file reads and writes are performed locally by clients such as Claude Code and Cline, and the gateway only passes tool_use/tool_result. For Cursor client's allowlist blocking of model names containing `claude`, the README provides an alias mapping table. The project is open source under the MIT License, and the README also includes the author's personal statement regarding commercial use.