DeepSeek Harness account card unavailable: WAF cookie
"Account details temporarily unavailable", while the balance of ¥32.74 right below renders fine — that combination alone rules out an account problem. The profile lookup and the balance lookup hit two different endpoints, and only the former is intermittently stopped by the edge WAF (#11016). Three request comparisons narrow the difference down to a single cookie.
DeepSeek Harness: Experiment 1: same path, different User-Agent
Without a browser UA, the request may be blocked by CloudFront outright.
- Request the profile API with
nodeas the UA:curl -A node https://platform.deepseek.com/auth-api/v0/users/current. - At 15:51Z the reporter saw 403 with CloudFront's "Request blocked" page.
- On the same machine with the same UA, at 16:55Z it became 200 with body
{"code":40002,"msg":"Missing Token"}— the edge behavior itself is changing. - Switch to a browser UA and request again: 202 with
x-amzn-waf-action: challenge. - Conclusion: this step is only "being challenged", not yet passing.
DSH plugin: Experiment 2: the balance endpoint on the same machine
The balance endpoint has no such challenge, which is why it returns normally.
- Request
https://platform.deepseek.com/api/v0/users/get_user_summary. - Even without credentials it returns 200 with body
{"code":40002,"msg":"Missing Token"}. - That means this path does not go through the WAF challenge.
- So "balance fine, profile unavailable" becomes an explainable phenomenon rather than a contradiction.
- This step also rules out guesses such as "the whole site is unreachable".
DeepSeek Harness: Experiment 3: add the WebView's aws-waf-token
The same request with the same headers, plus one WAF cookie, goes from failing to 200.
| Request condition | Result |
|---|---|
| Headers DSH sends | 403, CloudFront HTML block page |
| Add Safari's User-Agent | 202, challenge header, empty body |
Also add the WebView's aws-waf-token | 200, full profile JSON |
- The login dialog completes inside a WebView, after which WebKit's cookie store holds an
aws-waf-tokenfor.deepseek.com. - In other words, the challenge has already been passed and the credential is sitting in the WebView.
- But the host process does not include it when sending requests, so every attempt is challenged again.
- This is the only missing piece in the chain.
- So either "forward this cookie (including expiry and refresh handling)" or "read account info inside the renderer's browser context" makes the profile return reliably.
DSH Plugin: Why the UI looks broken
The failure state and "the profile has no contact" render as the same sentence, and there is no retry entry.
- The state logic is
profile?.contact ?? (details.profile === undefined ? 'loading' : 'profileUnavailable'). - So
{ status: 'failed' }andcontact: nullboth display as "account details temporarily unavailable". lastProfilelives only in memory, so every launch starts with an empty cache.- The result: a placeholder appears at startup, and if the first fetch fails it stays forever.
- The reporter suggests distinguishing "read failed" from "no contact" and adding a retry button.
DeepSeek Harness: Conclusion and recommendations
This is not a restricted account but a host request missing the edge challenge credential; the changeable layers are the request side and the UI side.
- Request side: forward the WebView's existing
aws-waf-tokento host requests and handle expiry and refresh. - Or: read account details inside the renderer's browser context.
- Error classification: classify 403 / 202 as "WAF challenge failed" rather than
network, so users and support can tell. - UI side: give the failure state its own copy and a retry button; make the cache persistent (still bound to the auth token).
- Do not try to bypass WAF on the client — the reporter explicitly did not seek such a solution.
DSH plugin: One-minute test: is this the issue
All three signs together and you can stop: balance fine, profile unavailable, and it recovers by itself after a while.
- Check the balance: if it displays, authorization and network are both working.
- Check the profile: unavailable, but the copy says "temporarily" rather than "not signed in".
- Check the timing: wait ten minutes to an hour and reopen; it may come back.
- Check login: signing in again may restore it briefly, then it returns later.
- Three or more hits and you can stop checking account status.
If you report it
The more specific the information for maintainers, the easier it is to locate the request side.
- Include the profile API's response code and headers, especially
x-amzn-waf-action. - State whether the balance API worked at the same moment.
- State the client version and platform (desktop or web).
- Note whether you signed in inside a WebView and whether the cookie store contains
aws-waf-token. - Do not attach account identifiers, tokens, or any credentials.
Cautions
Check the balance endpoint as a control before suspecting the account.
- Do not treat a working balance as full proof the account is healthy. The two endpoints take different paths.
- Do not rush to reinstall or re-login. The reporter's profile recovered by itself an hour later.
- Login needing several clicks has the same cause.
auth_inithits the 202 challenge too. - Do not treat the WAF cookie as a long-lived credential. It expires and needs refresh logic.
- Include response headers when reporting.
x-amzn-waf-actionexplains more than the error copy.
If your profile card is "always unavailable" rather than intermittent, it is more likely a login-state issue — check the auth token rather than WAF.See Fix "Failed to fetch available models" 401 error in DeepSeek Harness for the related case.
FAQ
No, the account is not banned: in DeepSeek Harness the profile lookup goes to /auth-api/v0/users/current, a path the edge WAF challenges intermittently, while the balance goes to /api/v0/users/get_user_summary, which has no such challenge. That is why the balance renders and the profile does not.
It recovers by itself because the DeepSeek Harness WAF challenge is intermittent. The reporter saw the profile return about an hour later with no restart and no re-login, meaning the request itself got through at some point.
The three DeepSeek Harness comparisons point at the edge WAF: without a cookie and with a node UA it returns 403; with a browser UA it returns 202 plus a challenge header; only with the WebView's aws-waf-token does it return 200. The only difference is the cookie, so the problem is at the edge, not the account or password.
Login sometimes needs several clicks in DeepSeek Harness because auth_init in the login flow hits the same 202 challenge. While the challenge is unmet, the login request gets no result, so it feels like the click did nothing.
No, the DeepSeek Harness UI cannot retry by itself today: the state logic renders 'request failed' and 'profile has no contact' as the same sentence, and there is no retry button on failure, so you can only wait for the next successful fetch or restart.
Related Terms
- aws-waf-token
- aws-waf-token is the credential AWS WAF issues after a challenge passes, stored as a cookie. With it, the same request turns from a challenged state into a normal response.— https://github.com/deepseek-ai/deepseek-harness/discussions/11016
- x-amzn-waf-action
- x-amzn-waf-action is a response header whose value challenge means the request was asked to complete a challenge. It usually appears with 202 and an empty body.— https://github.com/deepseek-ai/deepseek-harness/discussions/11016
- platformClientHeaders()
- platformClientHeaders() is the DeepSeek Harness helper that sets headers before platform requests. It currently writes five x-client-* headers but never sets User-Agent, so the underlying client sends node as the UA.— https://github.com/deepseek-ai/deepseek-harness/discussions/11016
- PlatformAuthError('network')
- PlatformAuthError('network') is the error type thrown when a platform request fails. It currently classifies 403 here too, so a WAF block looks like a network problem in the UI.— https://github.com/deepseek-ai/deepseek-harness/discussions/11016
Sources
- #11016 — Account profile card degrades to "details not available" on a single transient fetch failure· deepseek-ai (GitHub Discussions)
- deepseek-ai/deepseek-harness (source repository)· GitHub