Cross-posting RSS feeds to Telegram, VK and Max

RSS arrives — Crosslybot publishes. News aggregator without copy-paste.

How to set up

1

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.

2

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.

3

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.

4

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).

5

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

  1. Sign up for Crosslybot (Pro+ for webhook input)
  2. Create a webhook endpoint, attach to a project with TG/VK/Max
  3. Write an RSS parser (n8n, Cloudflare Worker, Python script)
  4. Implement item → payload mapping (see example above)
  5. Configure parser cron / schedule
  6. Use sandbox to verify format before launch

Webhook input is available on Pro, Maxi and Business plans.

Free plan

Ready to try?

Connect the bot in 2 minutes. Free plan — no cards, no signup.

More about the bot →