tinyhumansai/openhuman · error · BackendApiError::MessageNotFound

message not found on {provider}: {message_id}

Error message

message not found on {provider}: {message_id}

What it means

For tagged channel-message calls, a 404 is classified as the message no longer existing on the provider (deleted or inaccessible) and surfaced as the typed BackendApiError::MessageNotFound; logged at info because it is an expected eventual-consistency outcome, not a bug.

Source

Thrown at src/api/rest.rs:736

                    return Err(anyhow::Error::new(
                        BackendApiError::ChannelEditUnsupported {
                            provider,
                            message_id,
                        },
                    ));
                }

                if let Some((provider, message_id)) = channel_message {
                    tracing::info!(
                        domain = "backend_api",
                        operation = "authed_json",
                        provider = provider,
                        message_id = message_id,
                        "[backend_api] message-not-found 404 on {} {} — surfacing typed error",
                        method.as_str(),
                        url.path(),
                    );
                    return Err(anyhow::Error::new(BackendApiError::MessageNotFound {
                        provider: provider.to_string(),
                        message_id: message_id.to_string(),
                    }));
                }
                // Defense-in-depth: DELETE 404s on any channel-message path that
                // parse_message_path could not parse (e.g. exotic URL variant with extra
                // segments). Still an expected backend state — suppress the Sentry event
                // without propagating a typed error. Targets OPENHUMAN-TAURI-R7.
                // PATCH is handled above and returns the typed
                // `ChannelEditUnsupported` for both the parsed and unparsed shapes.
                if method == Method::DELETE
                    && url.path().contains("/channels/")
                    && url.path().contains("/messages/")
                {
                    tracing::debug!(
                        domain = "backend_api",
                        operation = "authed_json",
                        "[backend_api] channel-message 404 on {} {} — path not matched by \

View on GitHub (pinned to 7491200858)

Solutions

  1. Handle MessageNotFound by dropping stale references to that message
  2. Re-fetch the conversation state before retrying edits
Defensive patterns

Strategy: fallback

When it happens

Trigger: Thrown at src/api/rest.rs:736 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of tinyhumansai/openhuman@7491200858 (2026-08-17). Data as JSON: /api/errors/ae8a6f2c3c536e2c. Report an issue: GitHub.