Cross-posting RSS feeds to Telegram, VK and Max
RSS arrives — Crosslybot publishes. News aggregator without copy-paste.
How to set up
Create a webhook input in Crosslybot
In Channels → Webhook create a new endpoint of type Inbound. Save the Bearer token. Attach to a project with TG/VK/Max targets.
Choose an RSS parser
Options: 1) n8n RSS Feed Trigger (simplest), 2) Cloudflare Worker fetching RSS every N minutes, 3) Python cron script (feedparser library), 4) specialized services — IFTTT, Inoreader API.
Map RSS → Crosslybot payload
Each RSS entry (item) becomes a JSON request. text = title + description, media = enclosure URL (if any), external_id = item GUID (for idempotency). Optionally: add a 'Read more' button with the original article URL.
Deduplication via external_id
RSS GUID is unique per entry. Pass it in external_id or Idempotency-Key — Crosslybot won't create a duplicate if the same RSS entry arrives again (e.g. on parser failure).
Run the automation
Cron every 15 minutes → parser → POST to Crosslybot for each new entry → publishing to TG/VK/Max. Sequential queue ensures posts go in RSS order.
Features
Any RSS / Atom / JSON Feed
Crosslybot accepts already-parsed data — feed format doesn't matter. RSS 1.0, RSS 2.0, Atom, JSON Feed — your parser on the source side handles them.
AI processing for different platforms
VK 15895 chars, TG 4096, Max 4000 — a long article from RSS won't fit equally. Crosslybot AI compresses text under each target's limit (resize setting in the project).
Duplicate spam protection
Plain-text record identifier (RSS GUID) becomes external_id. If the RSS feed contains an updated entry with the same GUID — Crosslybot doesn't create a duplicate post.
'Read more' button
Pass the original article URL via payload buttons: users see preview in TG/VK/Max, click through to the source site for full content.
FAQ
Suitable for high-volume feeds (500+ entries per day)?
Yes, on Maxi (1000 requests/hour) and Business (5000/hour) plans. Sequential queue handles large flows correctly. Mind the post quotas — Pro+ has 1000+ posts per month.
How to handle RSS updates (item changed)?
Crosslybot doesn't edit already-published posts on repeated webhook (Idempotency-Key returns the original response). If you need to update a post, that's a separate scenario not covered by webhook input. Use platform edit APIs through Bot API (if your case allows).
What if an RSS entry has no media, only text?
That's fine, the media field is optional. Crosslybot publishes the text. For Telegram VK Max — text-only post works on all platforms.
Can I filter which entries to publish (by tags, authors)?
Filter on the parser side (RSS read → check conditions → POST only matching entries). Crosslybot doesn't filter RSS — it receives already-selected posts. You can also use Crosslybot's built-in target hashtag_filter.
Can I publish with delay (1 hour after RSS appearance)?
Yes: 1) delay via delay_minutes in Crosslybot target settings, 2) delay on parser side (wait N minutes before sending), 3) Schedule Date in a Notion-style intermediate layer.
RSS — an old but still living standard for content distribution. Any blog, news site, podcast platform provides RSS. If you want to aggregate news from a dozen sources and publish to your channels — an RSS aggregator with Crosslybot as backend is the fast way: you only write the parser, not three social network integrations.
Architecture
┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐
│ Site A │ │ Site B │ │ Site C │ │ Site D │
│ RSS │ │ RSS │ │ RSS │ │ RSS │
└────┬────┘ └────┬────┘ └────┬────┘ └────┬────┘
│ │ │ │
└────────────┴────────────┴────────────┘
│
┌─────▼─────┐
│ RSS │ Cron every 15 min
│ Parser │ (n8n / Worker / cron+python)
└─────┬─────┘
│ HTTP POST with GUID-based dedup
▼
┌─────────────────┐
│ Crosslybot │ AI processing, filters,
│ Webhook Input │ target signature
└────────┬────────┘
│
┌──────────────┼──────────────┐
▼ ▼ ▼
Telegram VK Max
channel community channel
Mapping RSS item → Crosslybot payload
# Pseudocode parser
import feedparser
import requests
feed = feedparser.parse('https://example.com/rss.xml')
for item in feed.entries:
payload = {
'text': f'{item.title}\n\n{item.summary[:500]}',
'external_id': item.id, # RSS GUID
'media': [
{'type': 'photo', 'url': enc.url}
for enc in item.get('enclosures', [])
if enc.type.startswith('image/')
],
'buttons': [[
{'text': 'Read more', 'url': item.link}
]],
'metadata': {'source': feed.feed.title}
}
requests.post(
'https://wh.crosslybot.com/v1/webhooks/{id}',
headers={
'Authorization': 'Bearer crossly_live_...',
'Idempotency-Key': item.id,
},
json=payload,
)
Crosslybot benefits for an RSS aggregator
- One HTTP request instead of three (TG/VK/Max APIs)
- Deduplication — repeated POST with the same external_id is safe
- AI compression of long articles under platform limits
- Ad filter at Crosslybot level — strips ad RSS entries
- Source signature automatically added to each post
- Sequential queue — posts flow in arrival order, RSS feed isn’t reshuffled
Getting started
- Sign up for Crosslybot (Pro+ for webhook input)
- Create a webhook endpoint, attach to a project with TG/VK/Max
- Write an RSS parser (n8n, Cloudflare Worker, Python script)
- Implement item → payload mapping (see example above)
- Configure parser cron / schedule
- Use sandbox to verify format before launch
Webhook input is available on Pro, Maxi and Business plans.
Ready to try?
Connect the bot in 2 minutes. Free plan — no cards, no signup.