plandex-ai/plandex · warning
Invite not found:
Error message
Invite not found:
What it means
DeleteInviteHandler returns 404 'Invite not found: <inviteId>' when db.GetInvite returns nil or the invite belongs to a different org than the authenticated user. The handler intentionally does not distinguish 'never existed' from 'exists but not yours' to avoid leaking information.
Source
Thrown at app/server/handlers/invites.go:382
Msg: "Trial user can't delete invites",
})
return
}
vars := mux.Vars(r)
inviteId := vars["inviteId"]
invite, err := db.GetInvite(inviteId)
if err != nil {
log.Printf("Error getting invite: %v\n", err)
http.Error(w, "Error getting invite: "+err.Error(), http.StatusInternalServerError)
return
}
if invite == nil || invite.OrgId != auth.OrgId {
log.Printf("Invite not found: %v\n", inviteId)
http.Error(w, "Invite not found: "+inviteId, http.StatusNotFound)
return
}
// ensure current user can remove target invite
removePermission := shared.Permission(strings.Join([]string{string(shared.PermissionRemoveUser), invite.OrgRoleId}, "|"))
invitePermission := shared.Permission(strings.Join([]string{string(shared.PermissionInviteUser), invite.OrgRoleId}, "|"))
if !(auth.HasPermission(removePermission) ||
(auth.User.Id == invite.InviterId && auth.HasPermission(invitePermission))) {
log.Printf("User does not have permission to remove invite with role: %v\n", invite.OrgRoleId)
http.Error(w, "User does not have permission to remove invite with role: "+invite.OrgRoleId, http.StatusForbidden)
return
}
err = db.DeleteInvite(inviteId, nil)
if err != nil {View on GitHub (pinned to e2d772072e)
Solutions
- Confirm the inviteId is correct and belongs to your current org
- Refresh the invite list — the invite may already be deleted or accepted
- Retry with a valid invite ID from a fresh GET of the org's invites
Defensive patterns
Strategy: validation
Validate before calling
const invites = await listInvites(orgId)
const invite = invites.find(i => i.id === inviteId)
if (!invite) throw new Error(`Invite ${inviteId} not found in org — refresh list before deleting`) Try / catch
try {
await client.deleteInvite(inviteId)
} catch (e) {
if (e.status === 404) { refreshInviteList(); return } // already gone
throw e
} Prevention
- Always fetch the current invite list before deleting; never reuse stored IDs
- Check the invite belongs to the org you're authenticated against
- Treat 404 on delete as idempotent success and refresh local state
When it happens
Trigger: DELETE /invites/{inviteId} with an invite ID that was already deleted/accepted, a typo'd or fabricated ID, or a valid invite belonging to another org the user is not an admin of.
Common situations: Client retries deleting an invite that a prior request already removed; user copies an invite ID from the wrong org; stale UI listing an invite that was resolved moments ago.
Understand the failure class
Background: 'Could not be found', 'does not exist', 'not found in database': the resource-not-found family when an ID, slug, key, or URI lookup comes back empty — this error's family across 20 libraries.
Related errors
AI-assisted analysis of plandex-ai/plandex@e2d772072e (2026-09-05).
Data as JSON: /api/errors/3f44c131e8a28f50.
Report an issue: GitHub.