{"record":{"id":"a28d7e709ff43dd4","repo":"tinyhumansai/openhuman","slug":"composio-authorize-extra-params-must-be-a-json-ob","errorCode":null,"errorMessage":"composio.authorize: extra_params must be a JSON object","messagePattern":"composio\\.authorize: extra_params must be a JSON object","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/openhuman/integrations/composio/client.rs","lineNumber":97,"sourceCode":"    /// `extra_params` is an optional JSON object whose key/value pairs are\n    /// merged into the request body. Some toolkits (e.g. `whatsapp`) require\n    /// additional fields (e.g. `waba_id`) that Composio will reject the\n    /// authorization without.\n    pub async fn authorize(\n        &self,\n        toolkit: &str,\n        extra_params: Option<serde_json::Value>,\n    ) -> Result<ComposioAuthorizeResponse> {\n        let toolkit = toolkit.trim();\n        if toolkit.is_empty() {\n            anyhow::bail!(\"composio.authorize: toolkit must not be empty\");\n        }\n        tracing::debug!(toolkit = %toolkit, has_extra_params = extra_params.is_some(), \"[composio] authorize\");\n        let mut body = serde_json::json!({ \"toolkit\": toolkit });\n        if let Some(extra) = extra_params {\n            const RESERVED: &[&str] = &[\"toolkit\", \"toolkit_version\", \"auth\", \"client_id\"];\n            let extra_obj = extra.as_object().ok_or_else(|| {\n                anyhow::anyhow!(\"composio.authorize: extra_params must be a JSON object\")\n            })?;\n            let obj = body.as_object_mut().ok_or_else(|| {\n                anyhow::anyhow!(\"composio.authorize: internal payload must be an object\")\n            })?;\n            for (k, v) in extra_obj {\n                if RESERVED.contains(&k.as_str()) {\n                    anyhow::bail!(\n                        \"composio.authorize: extra_params cannot override reserved key '{k}'\"\n                    );\n                }\n                obj.insert(k.clone(), v.clone());\n            }\n        }\n        merge_required_oauth_scopes(&mut body, toolkit)?;\n        self.inner\n            .post::<ComposioAuthorizeResponse>(\"/agent-integrations/composio/authorize\", &body)\n            .await\n    }","sourceCodeStart":79,"sourceCodeEnd":115,"githubUrl":"https://github.com/tinyhumansai/openhuman/blob/749120085864ce16e0f273c7b86fac7740b39c5b/src/openhuman/integrations/composio/client.rs#L79-L115","documentation":"Guard inside ComposioClient::authorize: extra_params was supplied but is not a JSON object. extra_params must be an object so its key/value pairs can be merged into the authorize request body (some toolkits like whatsapp require extra fields such as waba_id).","triggerScenarios":"Thrown at src/openhuman/integrations/composio/client.rs:97 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Pass extra_params as a JSON object, e.g. {\"waba_id\": \"123\"}","Omit extra_params entirely when the toolkit needs no additional fields"],"exampleFix":null,"handlingStrategy":"validation","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"749120085864ce16e0f273c7b86fac7740b39c5b","analyzedAt":"2026-08-17T21:21:45.363Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}