Retrieve a single thread by ID
[AllowAnonymous]
Public sharing enabled: Authentication optional for public/unlisted threads
Private threads: Authentication required
JWT Claims Extraction (Lines 138-142):
:guid (Line 115)"private", "public", or "unlisted"| Flag | Visibility | Auth | Access |
|---|---|---|---|
| ON | public | No | ✅ Allowed (Line 150-154) |
| ON | unlisted | No | ✅ Allowed (Line 150-154) |
| ON | private | No | ❌ 401 (Line 158-166) |
| ON | private | Yes (owner) | ✅ Allowed (Line 179) |
| ON | private | Yes (other) | ❌ 403 (Line 169-177) |
| OFF | public | No | ❌ 401 (Line 158-166) |
| OFF | public | Yes (owner) | ✅ Allowed (Line 179) |
| OFF | public | Yes (other) | ❌ 403 (Line 169-177) |
| OFF | unlisted | No | ❌ 401 |
| OFF | private | Yes (owner) | ✅ Allowed |
threads table WHERE thread_id = {id}system_settings table WHERE key = 'public_sharing'public_sharing = true): Anyonepublic_sharing = true): Anyone with the linkpublic_sharing = false): Owner onlyprivate: Requires auth + ownershippublic: Visible to all when feature enabledunlisted: Visible to all when feature enabled, but not listed in search/discoveryfalse (default behavior assumed)| Code | HTTP | Cause | Controller Line |
|---|---|---|---|
NOT_FOUND | 404 | Thread doesn’t exist | 123-131 |
UNAUTHORIZED | 401 | Auth required but missing | 158-166 |
FORBIDDEN | 403 | Private thread, wrong user | 169-177 |
THREAD_ERROR | 500 | Service exception | 181-189 |
public_sharing setting controls anonymous access
public_sharing = true: