langflow-ai/langflow · error · HTTPException
Flow not found
Error message
Flow not found
What it means
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.
Source
Thrown at src/backend/base/langflow/api/v1/flows.py:321
result[node.get("id")] = translated
return result
@router.get("/public_flow/{flow_id}", response_model=FlowRead, status_code=200)
async def read_public_flow(
*,
session: DbSession,
flow_id: UUID,
):
"""Read a public flow without requiring authorization (public means public).
Because this endpoint is unauthenticated, secret field values (every template
field marked ``password``) are stripped before returning so a PUBLIC flow does
not leak the owner's stored API keys / credentials to anonymous callers.
"""
flow = (await session.exec(select(Flow).where(Flow.id == flow_id))).first()
if flow is None:
raise HTTPException(status_code=404, detail="Flow not found")
if flow.access_type is not AccessTypeEnum.PUBLIC:
raise HTTPException(status_code=403, detail="Flow is not public")
flow_read = FlowRead.model_validate(flow, from_attributes=True)
flow_read.data = strip_secret_field_values(flow_read.data)
return flow_read
@router.patch("/{flow_id}", response_model=FlowRead, status_code=200)
async def update_flow(
*,
session: DbSession,
flow_id: UUID,
db_flow: AuthorizedWriteFlow,
flow: FlowUpdate,
current_user: CurrentActiveUser,
storage_service: Annotated[StorageService, Depends(get_storage_service)],
):
"""Update a flow."""View on GitHub (pinned to 976ec789d2)
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
Defensive patterns
Strategy: try-catch
Validate before calling
// If authenticated: cheap existence probe before sharing an anonymous link
const exists = await axios.get(`/api/v1/flows/${flowId}`).then(() => true, (e) => e.response?.status !== 404); Try / catch
catch (e) {
if (e.response?.status === 404) return showLinkExpired();
if (e.response?.status === 403) return showNotPublic();
throw e;
} Prevention
- 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
When it happens
Trigger: 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.
Common situations: 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.
Related errors
AI-assisted analysis of langflow-ai/langflow@976ec789d2 (2026-08-14).
Data as JSON: /api/errors/222c928ffa1c3912.
Report an issue: GitHub.