Any JSON webhook
Anything we haven't built a translator for - Linear, custom scripts.

The catch-all inbound endpoint - paste into any service's webhook field and Chirp's normalizer makes a best-effort attempt to extract a title and body for a push notification. Recognizes the common shapes: top-level `title` / `text` / `message` / `body`, GitHub-style nested `event.action`, Slack-style `attachments[0].title`, and a handful of others. Falls back to a sensible default if nothing matches.
When the dedicated translators (@stripe, @github, @sentry, @grafana) don't exist for a tool you use - Linear, Notion, Pipedream, your homegrown internal tool - drop the inbound URL in. Test it once with a real payload from the source; if the title/body extraction looks wrong, file an issue with a payload sample and Chirp will add a translator.
Prerequisites
- A Chirp inspector / webhook URL.
- A third-party service that fires JSON webhooks.
Setup
- 1
Grab the inbound URL
chirpapp.dev/dashboard → Webhook URLs card → "Generic Inbound". The URL is
https://api.chirpapp.dev/v1/webhooks/inbound?key=.... - 2
Paste into the third party's webhook field
Whatever the service calls it: "Webhook URL", "Payload URL", "Endpoint", "POST URL". Set content type to
application/jsonif the service offers a choice. - 3
Trigger an event + verify the format
Most services have a "Send test event" button. Trigger one and check the Chirp inspector's recent-events log. The log shows the raw payload received and the extracted title/body. If the extraction is wrong, see the override options below.
- 4
(Optional) Promote to a Live Activity
Append
&mode=activity&schema=@alertto fire a persistent card instead of a one-shot push. Useful for incident-style alerts that should stay visible until acked.shell# One-shot push (default): https://api.chirpapp.dev/v1/webhooks/inbound?key=YOUR_KEY # Persistent Live Activity: https://api.chirpapp.dev/v1/webhooks/inbound?key=YOUR_KEY&mode=activity&schema=@alert
What you’ll see
One-shot mode: notification with the extracted title + body, source service name in the action label. Activity mode: a persistent yellow @alert card with the title, body, and timestamp; closes only on explicit dismissal or another inbound event with `?action=end`.
Troubleshooting
- Notification body is empty or generic.
- Auto-extraction couldn't find a recognizable field in the payload (it tries top-level
title/text/message/bodyand a few common nested shapes). Check the inspector's recent-events log to see the raw payload - if your service uses a non-standard shape, file an issue with a sample and we'll add a translator (or use a dedicated /v1/webhooks/<provider> endpoint if one exists). - Source service requires HMAC-signed webhooks.
- The generic inbound endpoint trusts the inspector key in the URL as the shared secret - no per-payload signature verification. If your source service requires you to provide a signing secret to enable webhooks, paste the inspector URL anyway and let the service generate its own secret (we just won't validate it). For dedicated HMAC verification, use a provider-specific endpoint (
/v1/webhooks/stripe,/v1/webhooks/github, etc.) that handles the provider's signature scheme. - I want different sources to fire different schemas.
- Generate one inspector per source - the URL is the routing key. Linear → /inbound?key=A&schema=@alert; internal-tool → /inbound?key=B&schema=@deploy.