assasin
06/30/2026, 11:57 PMslackbot toolkit using custom auth config. The tools are executing as expected. Now I tried to create trigger but I am facing issues. I firstly created [webhook_endpoint](https://docs.composio.dev/reference/api-reference/webhook-endpoints/postWebhookEndpoints) for slackbot toolkit slug and correct client id. I pasted that in the Slack App's Event Subscription tab.
I verified that the scopes present in the auth config and the slack dashboard are exactly same - {im:read,channels:history,groups:history,im:history,mpim:history,team:read,users.profile:read,chat:write,im:write}
When i authenticate a new user account, I correctly get these scopes when i try to extract it from connected account data.
But I get error when I try to create trigger for this accountassasin
06/30/2026, 11:57 PMconst result = await composio.triggers.create(userId, triggerSlug, {
connectedAccountId: composioAccountId,
});
I get following error
[2026-07-01 00:43:27.653] ERROR: Failed to create Composio trigger
triggerSlug: "SLACKBOT_CHANNEL_MESSAGE_RECEIVED"
composioAccountId: "ca_rgxnX6sumkem"
userId: "1d44ce66-342f-4074-8a72-b9aea168d111"
error: {
"status": 400,
"headers": {},
"error": {
"error": {
"message": "Invalid webhook configuration for trigger \"SLACKBOT_CHANNEL_MESSAGE_RECEIVED\": Failed to get team info: {'ok': False, 'error': 'missing_scope', 'needed': 'team:read', 'provided': 'identify,channels:history,groups:history,im:history,mpim:history,channels:read,files:read,groups:read,im:read,mpim:read,reactions:read,search:read,users:read,users:read.email,users.profile:read,search:read.public'}",
"code": 1212,
"slug": "TriggerInstance_WebhookConfigInvalid",
"status": 400,
"request_id": "5a7b3bc5-3c86-45fe-ad08-b664f30f58d0",
"suggested_fix": "Verify the trigger configuration is valid and the connected account has the required permissions. Check the error details above."
}
},
"errorId": "d5fba2a9-4eaf-4c7b-b489-0f22975f173c"
}
The error is quite weird because the provided scopes doesn't match what I get from composio or the slack / composio dashboard.assasin
07/01/2026, 12:09 AMassasin
07/01/2026, 12:27 AMassasin
07/01/2026, 1:14 AMassasin
07/01/2026, 1:22 AMtriggerConfig as well, and that is also fine. There seems to be some issue from your endAbhishek
07/01/2026, 1:50 AMAbhishek
07/01/2026, 2:43 AMassasin
07/01/2026, 3:37 AMBrendan O'Leary
07/01/2026, 6:38 AMteam.info, and Slack runs that check against your user token, not the bot token. A Slackbot auth config has two separate scope buckets: bot scopes and user token scopes. The single scope list you passed was stored as bot scopes, so your user token only got our default user scopes, which do not include team:read. That is exactly the provided list in the error (defaults plus identify), which is why team:read looked "missing" even though it is on the bot side.
Since you are on a custom auth config, you can fix this yourself:
• Update (or recreate) your custom Slackbot auth config and set a separate user_scopes list that includes team:read (plus the other user-token read scopes you need).
• Re-connect the account so a fresh user token is issued with team:read.
• Retry composio.triggers.create for that account.
If it still returns missing_scope after re-authenticating, reply here with the auth config id and connected account id and we'll dig in.
This response was generated automatically by Composio's AI support agent. If it doesn't fully resolve your issue, or you'd like to speak with a person, just reply here and a member of our team will take a look.Abhishek
07/01/2026, 8:21 AMteam:read from the Dashboard can still put it in the bot scope bucket, which does not fix this trigger setup path.
Until we fix the UI/default-scope gap, please update the auth config through the API and explicitly add team:read to credentials.user_scopes. Keep the rest of the user-token scopes you already need in that same list, because an explicit user_scopes value is treated as the user-token scope list for the next OAuth connection:
bash
curl --request PATCH "https://backend.composio.dev/api/v3/auth_configs/<auth_config_id>" \
--header "x-api-key: <your_api_key>" \
--header "content-type: application/json" \
--data '{
"type": "custom",
"credentials": {
"user_scopes": [
"search:read",
"search:read.public",
"channels:read",
"groups:read",
"im:read",
"mpim:read",
"channels:history",
"groups:history",
"im:history",
"mpim:history",
"users:read",
"users:read.email",
"files:read",
"reactions:read",
"users.profile:read",
"team:read"
]
}
}'
apologize for the bad DX here, we'll work on fixing it ASAP & add a gotcha on our docs. Feel free to ping me here incase you have any more questions or need help with. Dropping my calendly incase you to get on a call to resolve this - https://calendly.com/d/dvzx-t4m-xqtassasin
07/01/2026, 2:15 PMassasin
07/01/2026, 2:20 PMcomposio.connected_account.expired webhook? I have created the webhook endpoint in the UI. What else do I need to do? The other integration (gmail) gave me the expired webhook.Abhishek
07/01/2026, 2:22 PMassasin
07/01/2026, 2:23 PMBrendan O'Leary
07/01/2026, 3:00 PMassasin
07/01/2026, 3:13 PMcomposio.trigger.message webhook, but not the composio.connected_account.expired webhookAbhishek
07/01/2026, 3:22 PMcomposio.connected_account.expired webhook is emitted only when the connected account actually transitions to the expired state, not on the first refresh failure. In this case, the connection had not crossed that retry threshold yet. If the refresh keeps failing across retries and the connection is marked expired, that is when the expired webhook will be delivered.assasin
07/01/2026, 3:23 PMAbhishek
07/01/2026, 3:31 PMassasin
07/01/2026, 3:37 PMAbhishek
07/01/2026, 3:44 PMassasin
07/01/2026, 3:48 PMAbhishek
07/01/2026, 4:09 PMassasin
07/01/2026, 4:39 PM