{"record":{"id":"7d8af086dc07ae85","repo":"BerriAI/litellm","slug":"push-notification-url-must-be-a-string","errorCode":null,"errorMessage":"Push notification URL must be a string","messagePattern":"Push notification URL must be a string","errorType":"http","errorClass":"HTTPException","httpStatus":400,"severity":"error","filePath":"litellm/proxy/agent_endpoints/a2a_endpoints.py","lineNumber":891,"sourceCode":"            if isinstance(params, dict):\n                params = normalize_request_params(params, served_version, method=method)\n            if method == \"tasks/pushNotificationConfig/set\":\n                if not isinstance(params, dict):\n                    raise HTTPException(\n                        status_code=400,\n                        detail=\"params must be an object\",\n                    )\n                push_config: Final = params.get(\"pushNotificationConfig\", {})\n                if \"pushNotificationConfig\" in params and not isinstance(push_config, dict):\n                    raise HTTPException(\n                        status_code=400,\n                        detail=\"pushNotificationConfig must be an object\",\n                    )\n                for callback_url in (params.get(\"url\"), push_config.get(\"url\")):\n                    if not callback_url:\n                        continue\n                    if not isinstance(callback_url, str):\n                        raise HTTPException(\n                            status_code=400,\n                            detail=\"Push notification URL must be a string\",\n                        )\n                    _validate_push_notification_url(callback_url)\n            forward_body: dict[str, object] = {\n                \"jsonrpc\": \"2.0\",\n                \"id\": request_id,\n                \"method\": method,\n                \"params\": params,\n            }\n            caller_headers: Final = _forwarding_headers(\n                user_api_key_dict=user_api_key_dict,\n                request_data=data,\n                agent_extra_headers=agent_extra_headers,\n            )\n            result = await _forward_jsonrpc(agent_url, forward_body, extra_headers=caller_headers)\n            if method == \"agent/getAuthenticatedExtendedCard\":\n                if isinstance(result.get(\"result\"), dict):","sourceCodeStart":873,"sourceCodeEnd":909,"githubUrl":"https://github.com/BerriAI/litellm/blob/77b7c6c40c0c5aa5fbcb1d6a1825ac39ca8829b8/litellm/proxy/agent_endpoints/a2a_endpoints.py#L873-L909","documentation":"Raised in the A2A tasks/pushNotificationConfig/set handler after pushNotificationConfig was confirmed to be a dict, when its 'url' member exists but is not a string (the HTTPS-scheme check happens separately). The URL must be a string to be stored and later called as a webhook, so a non-string value is rejected with HTTP 400 before forwarding to the agent.","triggerScenarios":"Thrown at litellm/proxy/agent_endpoints/a2a_endpoints.py:891 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Send the push notification URL as a string."],"exampleFix":"url='https://hooks.example.com/x'","handlingStrategy":"type-guard","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"77b7c6c40c0c5aa5fbcb1d6a1825ac39ca8829b8","analyzedAt":"2026-08-18T11:44:31.656Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}