{"record":{"id":"222c928ffa1c3912","repo":"langflow-ai/langflow","slug":"flow-not-found-222c92","errorCode":null,"errorMessage":"Flow not found","messagePattern":"Flow not found","errorType":"http","errorClass":"HTTPException","httpStatus":404,"severity":"error","filePath":"src/backend/base/langflow/api/v1/flows.py","lineNumber":321,"sourceCode":"                    result[node.get(\"id\")] = translated\n    return result\n\n\n@router.get(\"/public_flow/{flow_id}\", response_model=FlowRead, status_code=200)\nasync def read_public_flow(\n    *,\n    session: DbSession,\n    flow_id: UUID,\n):\n    \"\"\"Read a public flow without requiring authorization (public means public).\n\n    Because this endpoint is unauthenticated, secret field values (every template\n    field marked ``password``) are stripped before returning so a PUBLIC flow does\n    not leak the owner's stored API keys / credentials to anonymous callers.\n    \"\"\"\n    flow = (await session.exec(select(Flow).where(Flow.id == flow_id))).first()\n    if flow is None:\n        raise HTTPException(status_code=404, detail=\"Flow not found\")\n    if flow.access_type is not AccessTypeEnum.PUBLIC:\n        raise HTTPException(status_code=403, detail=\"Flow is not public\")\n    flow_read = FlowRead.model_validate(flow, from_attributes=True)\n    flow_read.data = strip_secret_field_values(flow_read.data)\n    return flow_read\n\n\n@router.patch(\"/{flow_id}\", response_model=FlowRead, status_code=200)\nasync def update_flow(\n    *,\n    session: DbSession,\n    flow_id: UUID,\n    db_flow: AuthorizedWriteFlow,\n    flow: FlowUpdate,\n    current_user: CurrentActiveUser,\n    storage_service: Annotated[StorageService, Depends(get_storage_service)],\n):\n    \"\"\"Update a flow.\"\"\"","sourceCodeStart":303,"sourceCodeEnd":339,"githubUrl":"https://github.com/langflow-ai/langflow/blob/976ec789d2886a86de109c044d089d68e96c9a35/src/backend/base/langflow/api/v1/flows.py#L303-L339","documentation":"404 from the unauthenticated public-flow read endpoint (GET /api/v1/flows/public/{flow_id} or the read_public_flow handler): no Flow row with that id exists at all — this pre-check runs before the access_type check, so the id is simply unknown. Because the endpoint is anonymous, the 404 deliberately gives no ownership information.","triggerScenarios":"Fetching a public flow URL with a deleted flow's id, a typo'd UUID, or an id from a different environment. Comes before the 403 'Flow is not public', so existence is the only thing that failed.","commonSituations":"Shared/public links outliving their flow (flow deleted or DB reset); published links pointing at a dev id while served by prod; UUID truncation when copy-pasting links.","solutions":["Confirm the flow still exists via an authenticated GET /api/v1/flows/{flow_id}","If it exists but you get 403 instead, the flow is PRIVATE — the owner must flip access_type to PUBLIC","Regenerate/re-share the public link from the live flow"],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":"// If authenticated: cheap existence probe before sharing an anonymous link\nconst exists = await axios.get(`/api/v1/flows/${flowId}`).then(() => true, (e) => e.response?.status !== 404);","typeGuard":null,"tryCatchPattern":"catch (e) {\n  if (e.response?.status === 404) return showLinkExpired();\n  if (e.response?.status === 403) return showNotPublic();\n  throw e;\n}","preventionTips":["Generate public links from the live flow's share dialog rather than hand-assembling URLs","Treat 404 on public links as 'link dead' — offer the owner a re-share path in UX","Avoid truncating UUIDs when copying links"],"tags":["http-404","flows","public-flow","not-found","sharing"],"backgroundTag":null,"analyzedSha":"976ec789d2886a86de109c044d089d68e96c9a35","analyzedAt":"2026-08-14T18:23:12.227Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}