{"record":{"id":"75af4cd404b3aee2","repo":"risingwavelabs/risingwave","slug":"table-is-not-backed-by-a-webhook-source","errorCode":null,"errorMessage":"Table `{}` is not backed by a webhook source","messagePattern":"Table `(.+?)` is not backed by a webhook source","errorType":"http","errorClass":null,"httpStatus":403,"severity":"error","filePath":"src/frontend/src/webhook/mod.rs","lineNumber":263,"sourceCode":"\n            let (columns_to_insert, row_id_index) = table_catalog.columns_to_insert();\n            let payload_schema = PayloadSchema::new(\n                columns_to_insert\n                    .map(|(column, is_pk)| WebhookTableColumnDesc {\n                        is_pk,\n                        name: column.column_desc.name.clone(),\n                        data_type: column.column_desc.data_type.clone(),\n                    })\n                    .collect(),\n            );\n            let row_id_index = row_id_index.map(|row_id_index| row_id_index as u32);\n\n            let webhook_source_info = table_catalog\n                .webhook_info\n                .as_ref()\n                .ok_or_else(|| {\n                    err(\n                        anyhow!(\"Table `{}` is not backed by a webhook source\", table),\n                        StatusCode::FORBIDDEN,\n                    )\n                })?\n                .clone();\n            (\n                webhook_source_info,\n                table_catalog.id(),\n                table_catalog.version_id().expect(\"table must be versioned\"),\n                row_id_index,\n                payload_schema,\n            )\n        };\n\n        let compute_client = choose_fast_insert_client(table_id, frontend_env, request_id)\n            .await\n            .map_err(|e| {\n                err(\n                    anyhow!(e).context(\"Failed to choose a compute node for fast insert\"),","sourceCodeStart":245,"sourceCodeEnd":281,"githubUrl":"https://github.com/risingwavelabs/risingwave/blob/6469eb736d691e8e9b8a419a57edd6429ca77417/src/frontend/src/webhook/mod.rs#L245-L281","documentation":"acquire_table_info looks up the target table's webhook_info in the catalog; if the table has no webhook source backing it, the handler returns HTTP 403 FORBIDDEN with this message. Webhook ingestion only works for tables created with a webhook-compatible source (e.g. via CREATE TABLE ... WITH (webhook) or a webhook connector).","triggerScenarios":"POSTing to /webhook/table/<name> where table_catalog.webhook_info is None: the table was created without webhook support, the webhook source was detached/dropped, or the POST targets the wrong (non-webhook) table name.","commonSituations":"Typos in the table path; attempting webhook writes to a regular MV or plain table; tables created before the webhook feature or migrated catalogs missing webhook_info; using a connection-based webhook against a table without one.","solutions":["Verify the table supports webhooks: CREATE TABLE t (...) WITH (webhook = true) or via the webhook connector; recreate with webhook support if missing.","Check the table name/URL path for typos — the target must be a webhook-backed table.","Inspect rw_catalog.rw_tables / webhook info to confirm webhook_info exists for the table id.","If using webhook connections, ensure the connection is bound to the correct table."],"exampleFix":"-- before\nCREATE TABLE events (id INT); -- no webhook support\nPOST /webhook/table/events ... -- 403\n\n-- after\nCREATE TABLE events (id INT, payload JSONB) WITH (webhook = true);\nPOST /webhook/table/events ...","handlingStrategy":"validation","validationCode":"-- confirm the table is webhook-backed before POSTing\nSELECT name FROM rw_catalog.rw_tables\nWHERE name = 'events' AND webhook_info IS NOT NULL;","typeGuard":null,"tryCatchPattern":"try {\n  await postWebhook(`/table/${tableName}`, payload);\n} catch (e) {\n  if (e.status === 403 && e.message.includes('not backed by a webhook source')) {\n    throw new Error(`configure webhook support on table '${tableName}' first`);\n  } else { throw e; }\n}","preventionTips":["Create webhook tables explicitly with webhook = true (or the webhook connector).","Keep a registry of webhook-enabled table names used by producers.","Verify webhook_info exists in the catalog after any table migration/recreation.","Check the URL table name for typos — 403 here usually means wrong or non-webhook table."],"tags":["webhook","catalog","http-403","permission"],"backgroundTag":"permission-denied","analyzedSha":"6469eb736d691e8e9b8a419a57edd6429ca77417","analyzedAt":"2026-09-11T21:06:21.487Z","contentChangedAt":"2026-09-11T21:06:21.487Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}