Skip to content

Free-tier Zen 403 for all third-party stacks despite valid session + key (only genuine client passes) #49621

Closed

Description

@GKartist75

Free-tier Zen 403 FreeTierError for all third-party stacks despite valid session + key

Since ~2026-09-19/20, POST https://opencode.ai/zen/v1/responses with
muse-spark-1.3-contributor-free returns 403 FreeTierError: "OpenCode's free tier can only be used from within OpenCode" for every non-opencode-binary
client I can construct, while the genuine opencode 1.18.31 client on the
same machine/account/key succeeds. Setup had worked for days before that.

Elimination matrix (all same session/key/machine)

Client stack Session Result
opencode run / TUI (genuine binary) own fresh ses_… 200
Local opencode serve API (POST /session/:id/message) own fresh ses_… 200 (text; tools execute server-side as designed)
node https, .NET Invoke-WebRequest, Python urllib, Bun 1.4.2, Bun 1.3.14 (exact embedded build), node raw TLS socket old pool ses_…, fresh API-minted ses_…, genuine client's own ses_… 403
Byte-faithful replay of a captured genuine request (full header order, opencode/1.18.31 ai-sdk/provider-utils/4.0.40 runtime/bun/1.3.14 UA, x-opencode-client: desktop, x-opencode-project: global, genuine ses_… + msg_…, prompt_cache_key, include, reasoning, tools, stream:true) over HTTP/1.1 and HTTP/2 genuine 403

Also ruled out: key rotation (env key == key in the working capture),
session expiry (fresh mints fail), session provenance/activity (replaying the
genuine session fails), x-opencode-client value (cli vs desktop),
session-affinity headers, body shape (minimal through full client-shaped),
system-prompt content, IP family (v6 unreachable here; all v4 same egress).

Interpretation

The discriminator is below the HTTP layer (TLS handshake fingerprint of the
official build is the remaining candidate — though even the exact Bun 1.3.14
runtime fails, so it may be build-specific) or an embedded request secret.
Notably the genuine binary's own BUN_CONFIG_VERBOSE_FETCH trace shows the
complete request, so there is nothing left to replicate at the HTTP layer.

Ask

Is third-party (OpenAI-compatible proxy) access to the free tier intentionally
removed, or is this gate overshooting? If intentional, a docs note would save
proxy authors (Empryo/pi custom providers, zen-proxy-likes) a lot of
forensics. If not, happy to provide captures: the failing case reproduces
with any HTTPS stack + any valid ses_….

Environment: Windows x64, opencode 1.18.31, OPENCODE_API_KEY key auth,
muse-spark-1.3-contributor-free, first failing ~2026-09-19/20 after days of
200s with identical requests.

Activity

  1. github-actions commented on Sep 17, 2026

    @github-actions
    Contributor

    This issue might be a duplicate of an existing issue. Please check:

    The root cause may be the same server-side enforcement change. It could be worth tracking this together with #49433.

  2. rekram1-node commented on Sep 18, 2026

    @rekram1-node
    Collaborator

    We've been tightening our logic to fight abuse You cannot use the free tier in other harnesses (this is only a limitation for the free tier nothing else).

  3. joaomj commented on Sep 18, 2026

    @joaomj

    @rekram1-node would be good to document this new policy.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions