WR
Webhook Router

Turn FDA events into Slack/Teams alerts — in minutes

Webhook Router ingests JSON, applies sensible templates for FDA guidance & recalls, and delivers to Slack, Microsoft Teams, Discord, or a generic webhook.

Hosted on Fly.io • Own API key • Optional HMAC signing • Postgres-backed

# Send an event
BODY='{"title":"Guidance XYZ","url":"https://www.fda.gov/...","center":"CDER","date":"2025-08-11","summary":"..."}'
SIG=$(printf '%s' "$BODY" | openssl dgst -sha256 -hmac "$SIGNING_SECRET" -r | awk '{print $1}')

curl -s -X POST https://api.yourdomain.com/ingest/fda.guidance \
  -H "X-Api-Key: $API_KEY" \
  -H "X-Signature: $SIG" \
  -H "Content-Type: application/json" \
  -d "$BODY"

Multi-destination

Slack incoming webhooks, Teams connector cards, Discord, or generic HTTP.

FDA-aware templates

Auto-formats guidance & recalls: title, center, date, reason, links.

Secure by default

Per-project API keys + optional HMAC SHA-256 signatures.

How it works

  1. Step 1

    Create a project

    We generate or accept your API key and optional signing secret.

  2. Step 2

    Add routes

    Map topics like fda.guidance to Slack/Teams/Discord/webhook endpoints.

  3. Step 3

    POST events

    Send JSON to /ingest/{topic}. We queue, retry with backoff, and deliver.

Quickstart

1) Create a project (admin only)

curl -s -X POST https://api.yourdomain.com/v1/projects \
  -H "X-Admin-Key: <ADMIN_BOOTSTRAP_KEY>" \
  -H "Content-Type: application/json" \
  -d '{
    "name":"acme-prod",
    "api_key":"<SAVE_THIS_KEY>",
    "signing_secret":"<SAVE_THIS_HMAC>",
    "plan":"basic"
  }'

2) Add a Slack route

curl -s -X POST https://api.yourdomain.com/v1/routes \
  -H "X-Api-Key: <SAVE_THIS_KEY>" \
  -H "Content-Type: application/json" \
  -d '{
    "topic":"fda.guidance",
    "kind":"slack_webhook",
    "endpoint":"https://hooks.slack.com/services/XXX/YYY/ZZZ",
    "template_key":"guidance"
  }'

3) Send an event (with HMAC)

BODY='{"title":"Guidance XYZ","url":"https://www.fda.gov/...","center":"CDER","date":"2025-08-11","summary":"Short summary."}'
SIG=$(printf '%s' "$BODY" | openssl dgst -sha256 -hmac "<SAVE_THIS_HMAC>" -r | awk '{print $1}')

curl -s -X POST https://api.yourdomain.com/ingest/fda.guidance \
  -H "X-Api-Key: <SAVE_THIS_KEY>" \
  -H "X-Signature: $SIG" \
  -H "Content-Type: application/json" \
  -d "$BODY"

No-code setup

Create a project, add a route, and send a test — all in the browser.

Open setup
// 1) Open the setup page
// 2) Paste your Slack/Teams/Discord webhook URL
// 3) Click “Send test”

API Reference

Auth

All requests must include X-Api-Key. For ingestion, add X-Signature (hex SHA-256 HMAC of the raw body with your signing secret) if the project or global secret is set.

POST /v1/projects (admin)

Create a project (API key + optional signing secret).

Headers: X-Admin-Key, Content-Type: application/json
Body: {
  name: string,
  api_key: string (min 12 chars),
  signing_secret?: string,
  plan?: "free" | "basic" | "pro"
}
Response: { id, name, plan }

POST /v1/routes

Create a route bound to a topic.

Headers: X-Api-Key, Content-Type: application/json
Body: {
  topic: string,                       // e.g. "fda.guidance"
  kind: "slack_webhook" | "teams_webhook" | "discord_webhook" | "http_webhook",
  endpoint: string,                    // destination webhook URL
  template_key?: "auto" | "guidance" | "device_recall" | "drug_recall",
  enabled?: boolean
}
Response: { id, topic, kind, endpoint, template_key, enabled }

GET /v1/routes

List your routes.

Headers: X-Api-Key
Response: Route[]

POST /ingest/{topic}

Ingest an event payload for a topic. Routes with a matching topic will receive formatted messages.

Headers: X-Api-Key, X-Signature (optional/required if signing is configured)
Body: raw JSON
Response: { status: "accepted", event_id: number, routes: number[], soft_limit: boolean }
Errors: 401 (auth), 404 (no route), 429 (plan hard limit)

Pricing

Free

1 project • 1 route • 1,000 events/mo

$0

Start

Basic

3 projects • 10 routes • 10k events/mo

$9/mo

Pro

Unlimited projects/routes • 100k events/mo

$29/mo

Need higher limits or on-prem? Contact us.

FAQ

Do you store my payloads?

We store a minimal event record for delivery status and metering. No multi-tenant data sharing. You can request deletion anytime.

What about retries?

We retry up to 5 times with exponential backoff when destination returns a non-2xx.

How do I prevent spoofed requests?

Enable HMAC. Include X-Signature with hex SHA-256 of the raw body using your signing secret.

Can I use non-FDA topics?

Yes. Use any topic string you want. The auto template falls back to a generic message format.