ErrLookup › Background articles › 'Something went wrong' / 'Request failed (500)' / 'HTTP error! status: 404' — what failed HTTP requests actually mean and how to find the real cause
'Something went wrong' / 'Request failed (500)' / 'HTTP error! status: 404' — what failed HTTP requests actually mean and how to find the real cause
'Something went wrong', 'Request failed (500)' and 'HTTP error! status: 404' are the visible faces of one error family: an HTTP request that either came back with a non-2xx status or never completed at the transport layer. A developer meets it whenever library code wraps fetch/reqwest responses — an expired session answering 401, a throttled endpoint answering 429, a server-side 500, a misconfigured base URL, or a DNS/TLS/proxy failure that produced no status at all — and the generic message often hides which one fired. This article maps the family across 28 repositories: how each library surfaces (or discards) the underlying status and cause, the causes in order of frequency, and the fixes that hold everywhere.
Distilled from 96 documented records across 28 repositories.
Background
This family sits at the HTTP client layer, at the moment a wrapper gives up on a request. Two distinct mechanisms produce it. In the first, the server answers but with a non-2xx status: Gumroad's request wrapper throws ResponseError whenever response.ok is false, Octopress's gist plugin raises RuntimeError when the final status after redirects is not 200, anything-llm throws 'HTTP error! status: ${response.status}' in executeApiCall. In the second, the transport never completes and fetch itself rejects: Chroma rethrows non-offline fetch errors as a connection error, Siyuan's SSRF-safe Go client fails at DNS, TCP dial, TLS handshake, or its fixed 30-second deadline, and GitNexus raises HttpEmbeddingError after its retry budget is exhausted. Which sub-family you are in determines whether an HTTP status exists at all, and therefore what the message can tell you.
From the caller's side, the experience splits sharply by how much detail the wrapper preserves. Some messages interpolate the status — Gumroad's 'Request failed (${response.status})' in the beneficial-owners handler, anything-llm's status-only error, Octopress's gist status code, ruflo's status-plus-response-body text — so a screenshot is diagnosable. Many others collapse every failure into a fixed string: Gumroad's 'Something went wrong.' default and 'Sorry, something went wrong. Please try again.', forem's 'An error occurred, please try again later', anything-llm's 'An error occurred while deleting the model'. Passthrough of a server-provided error message is library-specific: several Gumroad handlers show error_message verbatim when the server sent one, the tax-report handler never reads the body at all, and forem deliberately refuses to parse HTML error bodies, so 401, 429, and 500 all look identical to the user.
The transport sub-family varies just as widely in what it exposes and what it does next. Siyuan appends the raw Go error text (DNS, x509 chain problems, 'context deadline exceeded', proxy CONNECT failures). Chroma classifies fetch rejections into offline heuristics (TypeError, 'fetch failed', ENOTFOUND) versus everything else — TLS problems, undici connect timeouts, proxy CONNECT refusals. GitNexus sanitizes the reason and redacts the URL before throwing; mise caches the failure per-URL for the lifetime of the process, so every later call for the same URL returns the identical cached error; gws's events subscribe loop swallows poll timeouts but terminates the session on any other reqwest error, and its cleanup path deletes the Pub/Sub topic and subscription on the way out.
What happens after the throw is equally library-specific, and it changes the blast radius of the same family-level failure. Gumroad's section-reorder handler keeps the optimistic UI with no rollback, so the displayed order silently diverges from the server until reload. Airi's chat-sync enqueues a tombstone before the DELETE and keeps retrying it on reconnect, turning a failed request into an eventual-consistency mechanism. Paperclip's onboarding wizard logs the failure and continues, because the hired agent still runs with adapter defaults. So the same 'request failed' can mean a lost save, a guaranteed retry, or a silently skipped step.
Common causes
- Expired session or invalid credentials. 401/403/419 answers dominate the records: Gumroad settings endpoints fail on expired sessions and CSRF tokens when a tab sits open, LitBucket prompt loads fail on expired or under-scoped tokens, airi chat deletes fail on stale auth. The fix is re-authentication or a token refresh, not a code change.
- Server-side failure (5xx). Rails exceptions behind PgHero's queries endpoint (missing pg_stat_statements, bad database url), image-provider outages behind forem's AI generation, cold starts on ruflo's Cloud Function. Usually transient and retryable with backoff.
- Misconfigured endpoint or URL. Wrong basePath or LEMONADE_LLM_BASE_PATH in anything-llm; IPFS_API_URL pointing at the gateway port 8080 instead of the RPC port 5001; typos, wrong scheme, or wrong port in GITNEXUS_EMBEDDING_URL; uninterpolated {{variable}} left in a flow URL. The client is healthy but talking to the wrong place.
- Transport-level failure. DNS resolution errors, TLS certificate failures, connection refused, proxy rejection — the request never completes and no HTTP status exists. Chroma, Siyuan, GitNexus, and gws all surface these as distinct from HTTP-status errors; mise caches whichever transport error came first.
- Dead, sunset, or retired upstream service. web3.storage's classic upload API has been deprecated, so old tokens now get non-200s; Octopress hardcodes the retired gist /raw/<id>/<file> scheme. The endpoint itself no longer accepts the request your code builds.
- Rate limiting (429). Forem instances throttle AI image generation; Gumroad's confirmation-email resend endpoint is throttled, and its generic catch flattens the 429 and its retry-after into a fixed 'something went wrong' string that misdescribes waiting as a malfunction.
- Client timeout exceeded. Siyuan's client has a fixed, non-configurable 30-second cap; ruflo's rating fetch aborts at 10 seconds; worldmonitor's abort budget adds waitFor on top of the extract timeout for slow-hydrating storefronts. A slow response surfaces as the same family error as a refused one.
- Stale or vanished target. 404s from a permalink renamed in another tab (Gumroad section saves and file lists), a deleted or secret gist (Octopress), a deleted session that can never refresh (airi), deleting an unknown model id (anything-llm). Retrying cannot fix a target that no longer exists.
What usually fixes it
- Read the actual status and response body before debugging application code. The wrapper message often discards them — anything-llm's error carries only the status, forem refuses to parse HTML error bodies, Gumroad's tax-report handler never reads the body. Open the network tab, or reproduce the exact request with curl using the same method, headers, and body.
- Treat auth failures as a re-authentication problem, not a retry problem. Reload to refresh the session and CSRF token on 401/419, re-login so the client sends a fresh token, and rotate dead or sunset credentials (regenerate WEB3_STORAGE_TOKEN, refresh the BitBucket token). Blind retries on 401/403 never succeed.
- Retry only the retryable classes: 429 (respect Retry-After), 5xx, and timeouts, with capped backoff. Treat other 4xx responses as configuration bugs — wrong URL, wrong header, invalid payload — and fix the request instead. Some libraries already do this for you (GitNexus's resilientFetch budget, airi's tombstone retries); others have no retry at all (anything-llm's flow blocks).
- Preserve the status code and the server's error text in messages. Interpolating the status, as Gumroad's 'Request failed (${response.status})' does, makes failures diagnosable from a screenshot; returning error_message in JSON failure responses keeps the generic fallback from masking the cause. Where a fallback must exist, make it the last resort, and keep contract-violation and network exceptions out of user-facing toasts (Gumroad's assertResponseError pattern).
- Verify endpoint configuration and reachability before starting work: correct scheme, host, and port (RPC 5001 not gateway 8080; /embeddings appended by the client, so pass only the base URL), a one-line curl pre-flight or health check at startup, exactly one daemon per repo, and proxy variables set in the environment that launches the client.
- Design the failure path for safe recovery: roll back optimistic UI on failed saves so the display does not diverge from the server, make retried operations idempotent (enqueue-style report requests, tombstone-driven deletes), and let non-critical steps fail gracefully when a default exists, as paperclip's onboarding does with seeded instructions.
Go deeper
- Authentication and authorization failures — expired tokens, bad credentials, and missing scopes.
- Connection failures: ECONNREFUSED, ECONNRESET, and friends — why connections get refused, reset, or dropped.
- DNS resolution errors: ENOTFOUND and getaddrinfo failures — how hostname lookups fail and how to debug them.
- HTTP status errors: handling 4xx and 5xx responses — how to handle 4xx and 5xx responses properly.
- SSL/TLS and certificate errors — how TLS handshakes and certificate validation fail.
- Timeouts: ETIMEDOUT, deadlines, and hung requests — what actually expires when a request times out.
Documented occurrences
- Sorry, something went wrong. Please try again. (antiwork/gumroad)
- Gist replied with #{data.code} for #{gist_url} (imathis/octopress)
- Something went wrong. (antiwork/gumroad)
- Request failed (${response.status}) (antiwork/gumroad)
- Something went wrong. (antiwork/gumroad)
- Something went wrong. (antiwork/gumroad)
- Sorry, something went wrong. Please try again. (antiwork/gumroad)
- Sorry, something went wrong. Please try again. (antiwork/gumroad)
- failed to resolve latest stable release from {url} (Hmbown/CodeWhale)
- Sorry, something went wrong. Please try again. (antiwork/gumroad)
- Web3.storage upload failed: ${response.status} ${error} (ruvnet/ruflo)
- Local IPFS upload failed: ${response.status} ${error} (ruvnet/ruflo)
- Firecrawl extract failed: HTTP ${resp.status} (koala73/worldmonitor)
- An error occurred while deleting the model (Mintplex-Labs/anything-llm)
- failed to fetch {description} from {url} (Hmbown/CodeWhale)
- Embedding request failed (${safeUrl(url)}, batch ${batchIndex}): ${reason} (abhigyanpatwari/GitNexus)
- failed to download {url} (Hmbown/CodeWhale)
- response.statusText (ankane/pghero)
- [context-bridge] Failed to refresh completed remote stream: (moeru-ai/airi)
- {} (jdx/mise)
…and 76 more across the corpus — use search.
Honest provenance: generated on 2026-08-22 from AI-assisted analysis of the linked records. See how records are made.