Drop-in for SillyTavern, JanitorAI, Cline, or any OpenAI-compatible app. Paste the Base URL as the custom endpoint, then pick a model from the Models tab.
404 with an empty body — which looks exactly like the model being retired. Image models have a separate allowance and keep working, which makes it look even more like a per-model fault. If everything 404s at once, it is quota: wait for the daily reset.Add more accounts on the Accounts tab to raise the ceiling — the pool rotates least-recently-used.
Tap a model id to copy it, or tap a suffix chip to copy that variant. Thinking is off by default — add -think, or a depth like -max. See Docs.
Spotted a model on chat.together.ai that is not listed above? Upstream accepts only the UUID — a plain name like moonshotai/Kimi-K3 is rejected — so paste its modelId here and it works immediately, no redeploy.
Get it from DevTools → Network → send a message on the site → open the chat-completion request → copy modelId from the body.
Each send spends one call from the daily quota.
This proxy has ADMIN_PASSWORD set, so account management is protected. Unlock to view and manage accounts.
Paste a cURL copied from a clerk.chat.together.ai request. That host carries the __client cookie, which is the only one that restores a logged-in session — a cURL copied from chat.together.ai will not contain it.
DevTools → Network → filter clerk → right-click any request → Copy as cURL (bash).
Each account runs its own Chromium profile: __session is a 60-second JWT and every call needs a freshly minted Turnstile token, so the credentials cannot simply be replayed.
Point any OpenAI-compatible client at /v1. The API key is only enforced when TOGETHER2API_KEYS is set; otherwise any value works.
Thinking is off by default, so a bare model id answers directly. Two independent controls exist upstream and the proxy drives both:
kimi-k3 takes max/high/low, while gpt-oss-* takes low/medium/high. A depth a model does not list is dropped rather than sent, so it degrades to plain thinking instead of erroring.Some frontends send only a model name with no way to add body fields, so the same controls live on the id:
-think — thinking on-nothink — thinking off (the default)-low / -medium / -high / -max — thinking on at that depthChain them in any order; on a conflicting pair the last one wins, so kimi-k3-max-nothink ends with thinking off. A suffix beats the request body, being the more deliberate signal.
If your client can set body fields, these work too:
"enable_thinking": true | false"reasoning_effort": "low" | "medium" | "high" | "max" | "none""include_reasoning": false — strip reasoning from a non-streaming replyUpstream accepts only a UUID in modelId; a plain name is rejected. Any UUID you send is passed straight through, so you can use a model the catalogue has never seen without a redeploy. Suffixes still apply — <uuid>-max works.
Streaming is a raw passthrough of Together's own OpenAI-format chunks, so whatever upstream emits reaches your client untouched. Models disagree on the field name — GLM-5.2 uses reasoning, Kimi K3 uses reasoning_content — so non-streaming replies expose both. Note that K3 often folds its reasoning into the normal content rather than a separate field.
Roughly 90 text calls per day on a free account. Once spent, every text model returns 404 with an empty body, indistinguishable from a retired model, while image models keep working on their own allowance. If everything 404s at once, it is quota.
POST /v1/chat/completions — streaming & non-streamingGET /v1/models — add ?variants=0 for base ids onlyGET /health, GET /statusChecks the live page behind the pool: whether it is signed in, and whether the Turnstile wrapper is armed to mint x-is-human tokens.