zeroclaw-labs/zeroclaw · error

Composio v3 connect failed: {err}

Error message

Composio v3 connect failed: {err}

What it means

get_connection_url_v3 mints an OAuth redirect URL by POSTing {auth_config_id, user_id} to {v3}/connected_accounts/link; this error means that call returned non-2xx. auth_config_id is either the explicit argument or one resolved from the app name via resolve_auth_config_id (which prefers enabled configs). Raised from action='connect'; the Tool wrapper reports it as 'Failed to get connection URL: Composio v3 connect failed: ...' in ToolResult.error.

Source

Thrown at crates/zeroclaw-tools/src/composio.rs:459

        };

        let url = format!("{COMPOSIO_API_BASE_V3}/connected_accounts/link");
        let body = json!({
            "auth_config_id": auth_config_id,
            "user_id": entity_id,
        });

        let resp = self
            .client()
            .post(&url)
            .header("x-api-key", &self.api_key)
            .json(&body)
            .send()
            .await?;

        if !resp.status().is_success() {
            let err = response_error(resp).await;
            anyhow::bail!("Composio v3 connect failed: {err}");
        }

        let result: serde_json::Value = resp
            .json()
            .await
            .context("Failed to decode Composio v3 connect response")?;
        let redirect_url = extract_redirect_url(&result).ok_or_else(|| {
            ::zeroclaw_log::record!(
                ERROR,
                ::zeroclaw_log::Event::new(module_path!(), ::zeroclaw_log::Action::Fail)
                    .with_outcome(::zeroclaw_log::EventOutcome::Failure),
                "composio: v3 response missing redirect URL"
            );
            anyhow::Error::msg("No redirect URL in Composio v3 response")
        })?;
        Ok(ComposioConnectionLink {
            redirect_url,
            connected_account_id: extract_connected_account_id(&result),

View on GitHub (pinned to 88bb9c8533)

Solutions

  1. Read the HTTP code: 400/404 means the auth_config_id is wrong — retry with app='<toolkit slug>' and let the tool resolve a valid enabled config itself.
  2. Verify the auth config exists, is enabled, and belongs to the same workspace as the API key in the Composio dashboard.
  3. On 401, fix composio.api_key.
  4. On 429/5xx, retry — link generation is idempotent.

Example fix

// before: stale id copied from another workspace
let args = json!({"action": "connect", "auth_config_id": "cfg-from-dev-workspace"});

// after: connect by app so the tool resolves the workspace's own config
let args = json!({"action": "connect", "app": "github", "entity_id": "alice"});
Defensive patterns

Strategy: retry

Validate before calling

// Prefer app-name connects; confirm the app exists first
let actions = tool.list_actions(Some(app)).await?;
if actions.is_empty() {
    anyhow::bail!("unknown Composio app '{app}'");
}
let link = tool.get_connection_url(Some(app), None, entity_id).await?;

Type guard

fn valid_connect_target(app: Option<&str>, auth_config_id: Option<&str>) -> bool {
    match (app, auth_config_id) {
        (Some(a), _) if !a.trim().is_empty() => true,
        (_, Some(id)) if !id.trim().is_empty() => true,
        _ => false,
    }
}

Try / catch

match tool.execute(json!({"action": "connect", "app": app})).await {
    Ok(r) if r.success => { /* open redirect_url */ }
    Ok(r) => {
        let e = r.error.unwrap_or_default();
        if ["HTTP 429", "HTTP 500", "HTTP 502", "HTTP 503", "HTTP 504"].iter().any(|c| e.contains(c)) {
            // retry after backoff; link generation is idempotent
        } else {
            // bad config id or key: fall back to app-name connect / fix the key
        }
    }
    Err(e) => { /* transport error */ }
}

Prevention

When it happens

Trigger: action='connect' with an auth_config_id that is deleted, belongs to another workspace, or is disabled (400/404); invalid x-api-key (401); rate limiting (429); Composio 5xx; a user_id the API rejects.

Common situations: Copying auth_config_id between dev and prod workspaces; attempting connect before the app's credential setup is finished in the Composio dashboard; API key rotated while the old config id is still cached in agent prompts.

Related errors


AI-assisted analysis of zeroclaw-labs/zeroclaw@88bb9c8533 (2026-08-23). Data as JSON: /api/errors/78135cff56edd86b. Report an issue: GitHub.