ErrLookupBackground articles › "Not Found" / HTTP 404 Errors: What They Mean and How to Fix Them Across Libraries

"Not Found" / HTTP 404 Errors: What They Mean and How to Fix Them Across Libraries

"Not found" errors are HTTP 404 responses and typed NotFound exceptions raised when a resource — a conversation, package, tag, pipeline, document version, or credential — does not exist or is not visible to the caller. Developers meet this family when an ID in a request is stale, deleted, mistyped, belongs to another tenant, or is hidden by an access policy, and the library deliberately answers 404 instead of a server error.

Distilled from 159 documented records across 6 repositories.

Background

The NotFound family is not one code path but a convention: every library in this set translates an empty lookup result into an HTTP 404 or a typed NotFound exception. At the lowest layer sits the same pattern — a controller or service looks up a resource by some identifier, gets nothing back (an undefined value, an empty array, a zero count, or a falsy row), and raises NotFound so the caller receives a deliberate, machine-readable 'not found' state rather than a crash or an empty 200. Dify wraps service-layer errors like ConversationNotExistsError into Flask/werkzeug NotFound responses; badges/shields throws its own NotFound class inside badge services; payloadcms/payload and nocodb throw typed NotFound errors with 404 semantics.

A recurring and important quirk across the family is that upstream APIs often signal absence with HTTP 200 rather than 404, forcing the library layer to invent the 404. The AUR RPC API returns 200 with resultcount: 0; the JetBrains plugin repository returns 200 with an empty plugin-repository XML body; Docker Hub returns a listing with count: 0 for nonexistent repos; NuGet's search returns an empty data array; GitHub returns an empty commit array. Shields' services explicitly validate these payloads and throw NotFound so the badge renders a clean 'not found' state. This means a 404 from the library does not necessarily correspond to a 404 on the wire — it can mean 'the transport succeeded but the result set was empty.'

Several libraries also use 404 as a security measure. NocoDB deliberately returns NcError.notFound instead of 403 for resources a user lacks permission to see, to avoid confirming existence to unauthorized callers. Payload distinguishes the two cases: a plain boolean access policy yields a 404 for missing documents, while a where-based access policy that excludes the document yields Forbidden (403) instead. Dify scopes lookups by tenant_id, so a binding or credential belonging to another tenant simply 'does not exist.' In these systems, a 404 means 'you cannot have this or it is not there,' and the caller should not retry.

The distinguishing trait of the family is that 404s here are terminal, not transient. Whether it is a conversation_id pointing at a deleted conversation in Dify, a dist-tag missing from an npm package, a pipeline definition with no completed builds in Azure DevOps, or a document id that was hard-deleted in Payload, the resource the request names is gone or never was. The correct client behavior, echoed across nearly every record, is to refresh the listing, re-authorize, or start fresh — not to retry.

Common causes

What usually fixes it

Go deeper

Documented occurrences

…and 139 more across the corpus — use search.

Honest provenance: generated on 2026-08-30 from AI-assisted analysis of the linked records. See how records are made.