Any RSS feed, posted to a Slack channel.
You want new releases, advisories or blog posts to show up where your team already looks. Slack's own RSS app is one more thing to configure per feed, and a hand-rolled poller means a seen-items table, a cron entry and the bug where it re-posts everything after a deploy. Point emit at the feed and give it a Slack incoming webhook instead.
One call
curl -X POST https://api.rssemit.com/v1/sinks \
-H "Authorization: Bearer $EMIT_KEY" \
-H "Content-Type: application/json" \
-d '{
"kind": "slack",
"url": "https://hooks.slack.com/services/T000/B000/XXXX",
"feed_url": "https://github.com/nodejs/node/releases.atom"
}'
The feed here is a Node.js releases feed from the developer feed catalog, but any RSS, Atom or JSON Feed URL works — including feeds you don't own, and feeds emit built for you from a page that never had one.
Set up the Slack side
- Create a Slack app for your workspace at api.slack.com/apps (from scratch is fine).
- Turn on Incoming Webhooks in the app's settings.
- Choose Add New Webhook to Workspace and pick the channel the feed should post to.
-
Copy the webhook URL (it starts with
https://hooks.slack.com/services/) intourlabove. Treat it as a secret. -
Send a test with
POST /v1/sinks/{id}/testto confirm it lands in the channel before you wait for the next item.
Or one digest a day
A busy feed doesn't need to ping the channel forty times. Add a schedule and emit holds new items and posts one message at the boundary:
curl -X POST https://api.rssemit.com/v1/sinks \
-H "Authorization: Bearer $EMIT_KEY" \
-H "Content-Type: application/json" \
-d '{
"kind": "slack",
"url": "https://hooks.slack.com/services/T000/B000/XXXX",
"feed_url": "https://github.com/nodejs/node/releases.atom",
"schedule": "daily",
"digest_hour": 9,
"digest_tz": "America/New_York"
}'
Use "schedule": "weekly" with digest_weekday (0 is Monday) for a
weekly roundup. Without a schedule, each item is posted as it arrives.
The parts you were going to get wrong
- No back-catalog blast. The first poll records a silent baseline, so connecting a feed with ten years of history posts nothing.
- Each item once. Items are deduplicated by guid, so republished or reordered entries don't repeat.
- Failures retry. If Slack is down or rejects the post, the item stays queued and is retried on the next cycle. The dashboard shows the last error.
- Gentle on the publisher. Feeds are polled every five minutes with conditional GET, so a quiet feed costs a 304, not a download.
Pricing
250 sink deliveries a month free. Polling feeds costs nothing, and each account gets 250 free sink deliveries per calendar month (UTC) across Slack, Discord, Teams, Telegram, Google Chat and JSON sinks. After that each delivery is 1 credit ($1.60 per 1,000 credits); a daily or weekly digest counts as one delivery however many items it carries, and test sends are free. If the allowance is used and the balance can't cover more, deliveries pause and items are held, not dropped, until you add credits.
This is a chat sink, not a webhook of yours
A Slack sink posts to Slack's incoming-webhook URL. It is separate from the JSON sink, which POSTs a feed's items to your own endpoint, and from the signed account-event webhooks in the API guide, which report things that happened in your emit account.
Other chat destinations
The same call works for other chat apps: change kind and the destination
url. Setup for
Discord, Microsoft Teams, Telegram and Google Chat is in the
API guide, and they share the same allowance, digests and retries.