You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Reddit has rolled out blocks against unauthenticated access to .json API endpoints. From r/modnews:
Deprecating unauthenticated JSON access: We'll also be shutting down unauthenticated .json endpoints. These endpoints can be used to scrape Reddit without accountability. Logged-in and authenticated access won't be impacted. Otherwise, developers who need structured access to Reddit content should use Devvit, which includes various ways to access Reddit data.
(Devvit runs inside Reddit's infrastructure and is not viable for external clients like lurker.)
What we observed (2026-05-28)
Testing from the operator's home IP:
curl -sI to https://www.reddit.com/r/<any>.json with various UAs (Safari 26.0.1, Safari 18.1, Chrome 130, iPhone Safari, Android Chrome) all returned HTTP/2 403 with a theme-beta HTML interstitial
403 also returned with browser-shape headers (Accept, Accept-Language, DNT, Sec-Fetch-*)
403 returned even with Reddit's recommended "honest" UA format <platform>:<app-id>:<version> (by /u/<username>)
HTML routes (/r/<sub>/hot) still returned 301 and worked normally — so reddit.com isn't blocking the IP, just the .json API
A real Safari Mobile from the same IP (operator's phone, home WiFi) succeeded against /r/formula1/.json
The combination implies multi-signal bot detection (TLS fingerprinting / JA3-JA4, HTTP/2 frame ordering, header characteristics) — not just UA-string matching. curl with a spoofed mobile UA gives itself away at the TLS layer.
What this means for lurker
src/geddit.js is built entirely on anonymous .json access — every one of its 20+ async methods is fetch(.../*.json). With anonymous access blocked, every method returns 403 and lurker has no content to render.
Per the modnews quote, authenticated.json access continues to work. So the fix is to add authentication rather than migrate endpoints. Implementation paths in increasing complexity:
Cookie/session passthrough — operator logs into Reddit via browser, copies auth cookies into lurker config. Fragile, single-account, won't scale; useful only as a stopgap.
OAuth application-only flow (grant_type=client_credentials) — register a Reddit OAuth app, send Authorization: Bearer <token> with every request. Works for read-only public content. Token expires hourly; re-auth is one POST. Lurker keeps its existing multi-user model on its own side (lurker users still register locally; Reddit only sees the lurker app identity).
OAuth user flow (per-user Reddit accounts) — each lurker user authenticates with their own Reddit account. Defeats lurker's "no Reddit account necessary to subscribe to subreddits" pitch from readme.md.
Path 2 (application-only OAuth) is the canonical answer and what other Reddit clients use. The friction: manual app-registration + Reddit review process, multi-week approval delay per the Data API Terms, per-deployment friction (each lurker operator who self-hosts must register their own OAuth app), and trademark/branding realignment (the API Terms sections 4.1/4.2 are stricter than the Reddit Brand foundation lurker currently cites in readme).
Related / superseded
Supersedes Automate Safari User-Agent freshness #32 — the UA-refresh assumption was wrong; UA freshness is not the discriminator. UA refresh remains a cosmetic improvement (the "honest" format is more respectful than spoofing a browser) but does nothing for access.
The original lurker concept — lightweight, read-only, low-friction Reddit viewer without a Reddit account — is fundamentally at odds with Reddit's enforced direction. The operator is ruminating on whether to:
Pursue OAuth implementation here and accept the friction
Pivot to a non-Reddit aggregator backend (Lemmy, kbin, Mbin, Piefed) where lurker's view layer, ExtLinks pipeline, preferences, and auth model still apply
Wind the project down
No decision has been made; the project is not archived. If a path forward is chosen, this issue is the entry point for the implementation work.
What changed
Reddit has rolled out blocks against unauthenticated access to
.jsonAPI endpoints. From r/modnews:(Devvit runs inside Reddit's infrastructure and is not viable for external clients like lurker.)
What we observed (2026-05-28)
Testing from the operator's home IP:
curl -sItohttps://www.reddit.com/r/<any>.jsonwith various UAs (Safari 26.0.1, Safari 18.1, Chrome 130, iPhone Safari, Android Chrome) all returnedHTTP/2 403with atheme-betaHTML interstitialAccept,Accept-Language,DNT,Sec-Fetch-*)<platform>:<app-id>:<version> (by /u/<username>)/r/<sub>/hot) still returned301and worked normally — so reddit.com isn't blocking the IP, just the.jsonAPI/r/formula1/.jsonWhat this means for lurker
src/geddit.jsis built entirely on anonymous.jsonaccess — every one of its 20+ async methods isfetch(.../*.json). With anonymous access blocked, every method returns 403 and lurker has no content to render.Per the modnews quote, authenticated
.jsonaccess continues to work. So the fix is to add authentication rather than migrate endpoints. Implementation paths in increasing complexity:grant_type=client_credentials) — register a Reddit OAuth app, sendAuthorization: Bearer <token>with every request. Works for read-only public content. Token expires hourly; re-auth is one POST. Lurker keeps its existing multi-user model on its own side (lurker users still register locally; Reddit only sees the lurker app identity).Path 2 (application-only OAuth) is the canonical answer and what other Reddit clients use. The friction: manual app-registration + Reddit review process, multi-week approval delay per the Data API Terms, per-deployment friction (each lurker operator who self-hosts must register their own OAuth app), and trademark/branding realignment (the API Terms sections 4.1/4.2 are stricter than the Reddit Brand foundation lurker currently cites in readme).
Related / superseded
Status (2026-05-28)
The original lurker concept — lightweight, read-only, low-friction Reddit viewer without a Reddit account — is fundamentally at odds with Reddit's enforced direction. The operator is ruminating on whether to:
No decision has been made; the project is not archived. If a path forward is chosen, this issue is the entry point for the implementation work.