# RunReveal Send records to a RunReveal webhook source. This output works with both flavors of RunReveal webhook: - **[Generic Webhook](https://docs.runreveal.com/sources/source-types/generic)** — accepts arbitrary JSON; the entire request body lands in the `logs` table with `sourceType = 'webhook'`. Bearer token is optional. - **[Structured Webhook](https://docs.runreveal.com/sources/source-types/structured-webhooks)** — requires a bearer token **and** each record must match the schema documented at [Structured Webhooks API](https://docs.runreveal.com/sources/source-types/structured-webhooks#structured-webhooks-api). Records that don't match the schema are rejected on the RunReveal side. Monad batches records and `POST`s them as a JSON array to `https://api.runreveal.com/sources/hook/`. ## Prerequisites Create either a **Generic → Webhook** or **Structured → Webhook** source in the RunReveal portal: 1. In the RunReveal portal, go to **Sources → New Source** and pick **Generic Webhook** or **Structured Webhook**. 2. Give the source a name (e.g. `Monad Connector`) and save. 3. Copy the **Webhook ID** — only the ID (last path segment), not the full URL the RunReveal UI displays. 4. Copy the **Bearer Token**. Required for Structured Webhooks; optional for Generic (unless auth is enabled on the source). 5. For **Structured Webhooks**, make sure the records you send match the [Structured Webhooks API schema](https://docs.runreveal.com/sources/source-types/structured-webhooks#structured-webhooks-api). Use a Monad transform upstream if you need to reshape records. ## Caveats :::danger **The RunReveal webhook results in success for essentially every request** - including requests with a wrong/nonexistent webhook ID, empty payloads or wrong payloads. This is undocumented upstream behavior we've observed against live sources. As a result, **Monad's Test Connection check will always pass**, even if the webhook ID is wrong or the token is invalid. A successful test does **not** prove ingestion worked. ::: :::danger **The only reliable way to confirm ingestion is inside the RunReveal portal.** - **Verify a record landed**: run a query in the RunReveal portal against the `logs` table filtering on `sourceType = 'webhook'` (and your source name). - **Check for ingestion errors**: open [https://app.runreveal.com/dash/sources/errors](https://app.runreveal.com/dash/sources/errors), then **select the source type and source name** to view errors for this specific webhook. Structured Webhook schema-mismatch errors show up here. ::: ## Settings | Setting | Type | Required | Default | Description | |---------|------|----------|---------|-------------| | Webhook ID | string | Yes | - | The RunReveal webhook ID. Paste only the ID — not the full URL shown in the RunReveal UI. | | Batch Record Count | int | No | `100` | Max number of records per request. Range: 1–10 000. | | Batch Data Size | int (bytes) | No | `1048576` (1 MiB) | Max payload size per request. Range: 500 KiB – 3 MiB. | | Publish Rate | int (seconds) | No | `5` | Max time to hold records before flushing. Range: 1–60. | ## Secrets | Secret | Type | Required | Description | |--------|------|----------|-------------| | Bearer Token | string | No¹ | Bearer token issued by RunReveal for this webhook source. Sent as `Authorization: Bearer `. **Required for Structured Webhooks**; optional for Generic Webhooks (leave empty if the source has auth disabled). | ¹ Required when the RunReveal source is a Structured Webhook.