{"record":{"id":"c3d7b5f2c7703ae6","repo":"paperclipai/paperclip","slug":"plugin-does-not-have-the-webhooks-receive-capabili","errorCode":null,"errorMessage":"Plugin does not have the webhooks.receive capability","messagePattern":"Plugin does not have the webhooks\\.receive capability","errorType":"http","errorClass":null,"httpStatus":400,"severity":"error","filePath":"server/src/routes/plugins.ts","lineNumber":2724,"sourceCode":"\n    // Step 2: Validate the plugin is in 'ready' state\n    if (plugin.status !== \"ready\") {\n      res.status(400).json({\n        error: `Plugin is not ready (current status: ${plugin.status})`,\n      });\n      return;\n    }\n\n    // Step 3: Validate the plugin has webhooks.receive capability\n    const manifest = plugin.manifestJson;\n    if (!manifest) {\n      res.status(400).json({ error: \"Plugin manifest is missing\" });\n      return;\n    }\n\n    const capabilities = manifest.capabilities ?? [];\n    if (!capabilities.includes(\"webhooks.receive\")) {\n      res.status(400).json({\n        error: \"Plugin does not have the webhooks.receive capability\",\n      });\n      return;\n    }\n\n    // Step 4: Validate the endpointKey exists in the manifest's webhook declarations\n    const declaredWebhooks = manifest.webhooks ?? [];\n    const webhookDecl = declaredWebhooks.find(\n      (w) => w.endpointKey === endpointKey,\n    );\n    if (!webhookDecl) {\n      res.status(404).json({\n        error: `Webhook endpoint '${endpointKey}' is not declared by this plugin`,\n      });\n      return;\n    }\n\n    // Step 5: Extract request data","sourceCodeStart":2706,"sourceCodeEnd":2742,"githubUrl":"https://github.com/paperclipai/paperclip/blob/a7e689b3c35347b529cb9f54c9b9a8575a3dcab6/server/src/routes/plugins.ts#L2706-L2742","documentation":"400 from the plugin webhook ingestion route. Fires when the plugin's manifest exists but its capabilities array lacks 'webhooks.receive' — the plugin never declared webhook reception, so deliveries are refused.","triggerScenarios":"Thrown at server/src/routes/plugins.ts:2702 when the library encounters an invalid state.","commonSituations":"Returned when an inbound webhook targets a plugin that has not declared the webhooks.receive capability in its manifest.","solutions":["Add the webhooks.receive capability to the plugin manifest capabilities and reinstall/upgrade the plugin.","Grant the required capability on the plugin instance if capabilities are approved per-install."],"exampleFix":null,"handlingStrategy":"validation","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"a7e689b3c35347b529cb9f54c9b9a8575a3dcab6","analyzedAt":"2026-08-18T22:49:45.177Z","contentChangedAt":"2026-08-18T22:49:45.177Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}