Significant-Gravitas/AutoGPT · warning · HTTPException
{e}
Error message
{e} What it means
During webhook ingress, after the webhook row is found, the endpoint loads the credentials attached to the webhook (webhook.credentials_id) via creds_manager.get(). If that credentials record no longer exists, the resulting NotFoundError is caught and converted to HTTP 404 with detail 'Webhook #{webhook_id} not found'. The message is intentionally the same as the not-found case so callers cannot distinguish a dangling-credentials webhook from a missing one.
Source
Thrown at autogpt_platform/backend/backend/api/features/integrations/router.py:709
webhook_id: Annotated[str, Path(title="Our ID for the webhook")],
):
logger.debug(f"Received {provider.value} webhook ingress for ID {webhook_id}")
webhook_manager = get_webhook_manager(provider)
try:
webhook = await get_webhook(webhook_id, include_relations=True)
# Sanity check: `provider` from URL and fetched webhook must match.
# Otherwise the URL provider's verifier runs instead of the webhook's
# own (a no-op for unsigned providers like Compass), bypassing it.
if webhook.provider.value.lower() != provider.value.lower():
logger.warning(
f"Webhook #{webhook_id} provider mismatch: "
f"registered as {webhook.provider.value}, ingress via {provider.value}"
)
# Same as the actual "webhook not found" response to conceal existence
raise NotFoundError(f"Webhook #{webhook_id} not found")
except NotFoundError as e:
logger.warning(f"Webhook payload received for unknown webhook #{webhook_id}")
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail=str(e))
logger.debug(f"Webhook #{webhook_id}: {webhook}")
user_id = webhook.user_id
try:
credentials = (
await creds_manager.get(user_id, webhook.credentials_id)
if webhook.credentials_id
else None
)
except NotFoundError as e:
logger.warning(f"Webhook payload received for unknown webhook #{webhook_id}")
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail=str(e))
# Run provider signature verification (no-op for providers whose protocol
# has no signing scheme). 403 on failure; not 404 — that would leak
# webhook existence.
try:
await webhook_manager.verify_signature(webhook, request)View on GitHub (pinned to 9c8bb5550f)
Solutions
- List webhooks for the user (GET /integrations/webhooks) and check whether the failing webhook's credentials_id still resolves via GET /integrations/{provider}/credentials.
- Re-create or re-attach valid credentials on the provider block that owns the webhook, which re-registers the webhook with a live credentials_id.
- If the credential is gone on purpose, delete/unlink the webhook (DELETE credentials with force, or remove the node webhook binding) so the provider stops delivering to a dead URL.
- Check backend logs: the warning 'Webhook payload received for unknown webhook #{webhook_id}' plus a successful webhook fetch in the debug line above distinguishes the dangling-credentials case from a truly missing webhook.
Defensive patterns
Strategy: validation
Validate before calling
# Before sending traffic, confirm webhook.credentials_id still resolves
wh = await get_webhook_by_id(webhook_id)
if wh.get("credentials_id"):
creds = await client.get(f"/integrations/{provider}/credentials")
if wh["credentials_id"] not in {c["id"] for c in creds.json()}:
re_register_webhook(provider) # dangling credentials reference Prevention
- When deleting credentials, always go through the platform delete flow so linked webhooks are pruned or unlinked.
- Periodically reconcile: list webhooks and verify each credentials_id exists.
- Don't delete credentials out from under agents that use their webhooks.
When it happens
Trigger: The webhook exists but its credentials_id points at a deleted/revoked credentials record — e.g. the user deleted the credential in the credentials UI without the webhook being pruned, or a credential store sync removed the row. Any provider POST to /integrations/{provider}/webhooks/{webhook_id}/webhook for that webhook returns 404.
Common situations: Credential deleted while a webhook registered against it was still linked to a node/preset; multi-instance deployments where one node's credential store write hasn't propagated; manual DB cleanup that removed credentials but not webhooks.
Related errors
- codex_credential_not_found
- Credentials not found
- Webhook #{webhook_id} not found
- Webhook not found
- Credential to upgrade not found
AI-assisted analysis of Significant-Gravitas/AutoGPT@9c8bb5550f (2026-08-14).
Data as JSON: /api/errors/d1adab4e8249becd.
Report an issue: GitHub.