This workflow follows the Execute Workflow Trigger → Google Sheets recipe pattern — see all workflows that pair these two integrations.
The workflow JSON
Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →
{
"name": "11 - Social Source Connector Foundation (Telegram Public Channel Preview)",
"nodes": [
{
"id": "bb110000-0000-0000-0000-0000000000n1",
"name": "Overview Note RU",
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-460,
-340
],
"parameters": {
"content": "## 11 \u2014 Social Source Connector Foundation v0.1 \u2014 Telegram PUBLIC channel preview (DEC-109/110)\n\n\u041f\u0435\u0440\u0432\u044b\u0439 non-Avito \u043a\u043e\u043d\u043d\u0435\u043a\u0442\u043e\u0440 \u043f\u043e Stage 3.4 (DEC-096: \u043e\u0434\u0438\u043d \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u0437\u0430 \u0440\u0430\u0437). \u0412\u044b\u0431\u0440\u0430\u043d **Telegram public-channel preview** (`t.me/s/<channel>`): \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u043d\u043e\u0439 \u0440\u0435\u043a\u043b\u0430\u043c\u043d\u043e\u0439 \u0446\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u043d\u0430 \u0435\u0434\u0438\u043d\u0438\u0446\u0443 \u0440\u0438\u0441\u043a\u0430 \u2014 \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b, \u0431\u0435\u0437 \u043b\u043e\u0433\u0438\u043d\u0430/\u0441\u0435\u0441\u0441\u0438\u0439, \u0431\u0435\u0437 member-\u0434\u0430\u043d\u043d\u044b\u0445.\n\n\u0427\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442 (\u0414\u0415\u0422\u0415\u0420\u041c\u0418\u041d\u0418\u0420\u041e\u0412\u0410\u041d\u041d\u041e, $0, fixture-first):\n1. \u0420\u0443\u0447\u043d\u043e\u0439 \u0441\u0442\u0430\u0440\u0442 \u2192 Set Connector Config (`fixture_mode=true`, `live_mode=false`, allowlist \u043a\u0430\u043d\u0430\u043b\u043e\u0432).\n2. fixture_mode=true \u2192 Build Fixture Telegram Channel Posts (6 \u043f\u043e\u0441\u0442\u043e\u0432: 3 \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u043d\u044b\u0435 \u0440\u0435\u043a\u043b\u0430\u043c\u044b + 1 \u0441\u043b\u0430\u0431\u044b\u0439 \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0439 \u0441\u0438\u0433\u043d\u0430\u043b + 1 hard-negative \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c + 1 \u0434\u0443\u0431\u043b\u044c \u0432 \u0431\u0430\u0442\u0447\u0435). \u041a\u0430\u043d\u0430\u043b\u044b \u043f\u043e\u043c\u0435\u0447\u0435\u043d\u044b `_fixture` \u2014 \u041d\u0415 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0435.\n3. Normalize: \u0432\u0430\u043b\u0438\u0434\u043d\u043e\u0441\u0442\u044c \u2192 business relevance (strong/weak/hard-negative, \u0441\u043b\u043e\u0432\u0430\u0440\u044c v0.1 \u043a\u0430\u043a \u0432 WF09) \u2192 \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0435 \u043a\u043e\u043d\u0442\u0430\u043a\u0442\u044b \u0422\u041e\u041b\u042c\u041a\u041e \u0434\u043e\u0441\u043b\u043e\u0432\u043d\u043e \u0438\u0437 \u0442\u0435\u043a\u0441\u0442\u0430 \u043f\u043e\u0441\u0442\u0430 (evidence = post_url, \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0430 DEC-097/098; contact_channel = \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f: telegram/phone, \u0444\u043e\u0440\u043c\u0430\u0442 \u2014 \u0432 notes, DEC-114) \u2192 dedup_key=`telegram::social_channel::<canonical post_url>`.\n4. \u0414\u0435\u0434\u0443\u043f \u043f\u0440\u043e\u0442\u0438\u0432 market_record_registry + \u0432\u043d\u0443\u0442\u0440\u0438 \u0431\u0430\u0442\u0447\u0430 (\u043f\u0430\u0442\u0442\u0435\u0440\u043d WF09).\n5. \u041f\u0438\u0448\u0435\u0442 \u0422\u041e\u041b\u042c\u041a\u041e: raw_market_records (40) \u2014 unique + duplicate-audit, market_record_registry (15) \u2014 \u0442\u043e\u043b\u044c\u043a\u043e unique, agent_requests (21) \u2014 1 \u0441\u0442\u0440\u043e\u043a\u0430 completed.\n\n\u0427\u0415\u0413\u041e \u041d\u0415 \u0414\u0415\u041b\u0410\u0415\u0422: \u041d\u0415 \u0445\u043e\u0434\u0438\u0442 \u0432 \u0441\u0435\u0442\u044c (HTTP-\u043d\u043e\u0434\u044b \u043d\u0435\u0442 \u0432\u043e\u043e\u0431\u0449\u0435; live-\u0432\u0435\u0442\u043a\u0430 = guard \u0441 \u043e\u0448\u0438\u0431\u043a\u043e\u0439); \u041d\u0415 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 Claude/Apify/Firecrawl; \u041d\u0415 \u0447\u0438\u0442\u0430\u0435\u0442 \u0433\u0440\u0443\u043f\u043f\u044b/\u043f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u0435 \u0447\u0430\u0442\u044b/MTProto; \u041d\u0415 \u0432\u044b\u0434\u0443\u043c\u044b\u0432\u0430\u0435\u0442 \u043a\u043e\u043d\u0442\u0430\u043a\u0442\u044b; \u041d\u0415 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442 outreach; \u041d\u0415\u0422 \u0430\u0432\u0442\u043e-handoff \u0432 WF08; \u041d\u0415 \u043f\u0438\u0448\u0435\u0442 \u0431\u0438\u0437\u043d\u0435\u0441-\u0432\u043a\u043b\u0430\u0434\u043a\u0438. active=false.\n\n**v0.2 (DEC-120):** \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d \u041e\u0425\u0420\u0410\u041d\u042f\u0415\u041c\u042b\u0419 live-\u043f\u0443\u0442\u044c: \u0433\u0435\u0439\u0442 \u043e\u0434\u043e\u0431\u0440\u0435\u043d\u0438\u044f (token) -> \u041e\u0422\u041a\u041b\u042e\u0427\u0401\u041d\u041d\u042b\u0419 HTTP-\u043f\u043b\u0435\u0439\u0441\u0445\u043e\u043b\u0434\u0435\u0440 (t.me/s/<channel> public preview only) -> \u043f\u0430\u0440\u0441\u0435\u0440 (\u0431\u0440\u043e\u0441\u0430\u0435\u0442 \u043e\u0448\u0438\u0431\u043a\u0443 \u0431\u0435\u0437 HTML). \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0432\u0441\u0451 \u0438\u043d\u0435\u0440\u0442\u043d\u043e: live_mode=false, token \u043f\u0443\u0441\u0442, allowlist \u043f\u0443\u0441\u0442, HTTP disabled. \u041d\u0438\u043a\u0430\u043a\u0438\u0445 \u0433\u0440\u0443\u043f\u043f/\u043f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u0445 \u0447\u0430\u0442\u043e\u0432/MTProto/\u0441\u043a\u0440\u044b\u0442\u044b\u0445 \u043a\u043e\u043d\u0442\u0430\u043a\u0442\u043e\u0432/auto-outreach.\n\n**v0.3 (DEC-124/126):** \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u0440\u043e\u0433\u043e\u043d \u043f\u0438\u0448\u0435\u0442 1 \u0441\u0442\u0440\u043e\u043a\u0443 \u0432 live_source_runs (23 \u043a\u043e\u043b\u043e\u043d\u043a\u0438: \u0440\u0435\u0436\u0438\u043c, allowlist, \u0441\u0447\u0451\u0442\u0447\u0438\u043a\u0438, external_calls, \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c, next action). contact_public \u043f\u0438\u0448\u0435\u0442\u0441\u044f Sheets-safe (\u0430\u043f\u043e\u0441\u0442\u0440\u043e\u0444 \u043f\u0435\u0440\u0435\u0434 +/= \u2014 \u0444\u0438\u043a\u0441 #ERROR! \u0434\u043b\u044f \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u043e\u0432). Live-\u043f\u0443\u0442\u044c (DEC-120) \u0431\u0435\u0437 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439: token=I_APPROVE_LIVE_TELEGRAM_PREVIEW + \u043d\u0435\u043f\u0443\u0441\u0442\u043e\u0439 allowlist + \u0412\u041a\u041b\u042e\u0427\u0415\u041d\u0418\u0415 disabled HTTP-\u043d\u043e\u0434\u044b; max_posts<=10; \u0442\u043e\u043b\u044c\u043a\u043e t.me/s/<channel>.\n\n**v0.4 (DEC-132):** \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0439, \u043d\u043e gated live-\u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442 \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u043e\u0433\u043e preview. \u0422\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442 \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f `live_transport`: **firecrawl** (\u043f\u0440\u0435\u0434\u043f\u043e\u0447\u0442\u0438\u0442\u0435\u043b\u044c\u043d\u043e, \u0435\u0441\u043b\u0438 \u0435\u0441\u0442\u044c \u043a\u0440\u0435\u0434\u0435\u043d\u0448\u043b Firecrawl) \u0418\u041b\u0418 **http_get** (fallback, \u0431\u0435\u0437 \u043f\u043e\u0448\u0442\u0443\u0447\u043d\u043e\u0439 \u043f\u043b\u0430\u0442\u044b). \u041e\u0431\u0430 \u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442-\u0443\u0437\u043b\u0430 \u041e\u0422\u041a\u041b\u042e\u0427\u0415\u041d\u042b \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e; \u043c\u0430\u0440\u0448\u0440\u0443\u0442 \u2014 \u043d\u043e\u0434\u0430 `Route Live Transport`. \u0413\u0435\u0439\u0442 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 username \u0418\u041b\u0418 `https://t.me/s/<channel>` / `https://t.me/<channel>`, \u043d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u0432 username \u0438 \u041e\u0422\u041a\u041b\u041e\u041d\u042f\u0415\u0422 `t.me/+`/`joinchat`/`t.me/c`/\u0433\u0440\u0443\u043f\u043f\u044b/\u043f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u0435/\u0447\u0438\u0441\u043b\u043e\u0432\u044b\u0435 id; `max_channels<=2` (\u043f\u0435\u0440\u0432\u044b\u0439 smoke), `max_posts<=10`. \u0421\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0438\u0448\u0435\u0442\u0441\u044f \u0432 agent_requests + live_source_runs: http_get = $0 (\u0431\u0435\u0437 \u043f\u043e\u0448\u0442\u0443\u0447\u043d\u043e\u0439 \u043f\u043b\u0430\u0442\u044b); firecrawl = `cost_not_recovered` (\u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e != \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u043e). \u041f\u0430\u0440\u0441\u0435\u0440 \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u0442 channel/post_url/\u0434\u0430\u0442\u0443/\u0442\u0435\u043a\u0441\u0442/view_count(\u043e\u043f\u0446.)/\u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0439 \u043a\u043e\u043d\u0442\u0430\u043a\u0442 \u0434\u043e\u0441\u043b\u043e\u0432\u043d\u043e. Fixture-\u043f\u0443\u0442\u044c \u0431\u0435\u0437 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439.",
"height": 880,
"width": 640,
"color": 4
}
},
{
"id": "bb110000-0000-0000-0000-0000000000n2",
"name": "Setup and Test Note RU",
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
220,
-340
],
"parameters": {
"content": "## \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0438 \u0442\u0435\u0441\u0442\n\n1. \u041d\u0415 \u0430\u043a\u0442\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u0442\u044c (active=false). \u0412\u043a\u043b\u0430\u0434\u043a\u0438 \u0443\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0442 (agent_requests 21 / raw_market_records 40 / market_record_registry 15 \u2014 \u043a\u0430\u043a \u0443 WF07/WF09).\n2. \u041f\u043e\u0441\u043b\u0435 \u0438\u043c\u043f\u043e\u0440\u0442\u0430 \u043f\u0435\u0440\u0435\u043f\u0440\u0438\u0432\u044f\u0437\u0430\u0442\u044c \u043a\u0440\u0435\u0434\u0435\u043d\u0448\u043b Google Sheets \u043d\u0430 4 sheet-\u043d\u043e\u0434\u0430\u0445 (1 read + 3 append) \u0438 \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c PASTE_SPREADSHEET_ID_HERE \u043d\u0430 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0439 ID.\n3. \u0422\u0435\u0441\u0442 1 (fixture, \u043f\u0435\u0440\u0432\u044b\u0439 \u043f\u0440\u043e\u0433\u043e\u043d, $0): Execute once \u2192 \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u043e: posts_received=6, structurally_valid=6, hard_skipped=1 (\u044e\u0440. \u0430\u0434\u0440\u0435\u0441 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c), business_relevant=5, unique=4, duplicates=1 (\u0434\u0443\u0431\u043b\u044c \u043f\u043e\u0441\u0442\u0430 101 \u0432 \u0431\u0430\u0442\u0447\u0435), raw_market_records +5 (4 unique + 1 duplicate audit), registry +4, agent_requests +1 (completed). \u041a\u043e\u043d\u0442\u0430\u043a\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0443 \u043f\u043e\u0441\u0442\u0430 101 (@kredit_broker_msk_fixture, \u0434\u043e\u0441\u043b\u043e\u0432\u043d\u043e \u0438\u0437 \u0442\u0435\u043a\u0441\u0442\u0430; `contact_channel=telegram` \u2014 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f \u043a\u0430\u043d\u0430\u043b\u0430, \u041d\u0415 \u0444\u043e\u0440\u043c\u0430\u0442 (DEC-114); `contact_format=handle` + `contact_source_url` + `contact_use_policy=manual_review` \u0432 notes).\n4. \u0422\u0435\u0441\u0442 2 (fixture, \u043f\u043e\u0432\u0442\u043e\u0440): \u0432\u0441\u0435 4 \u043a\u043b\u044e\u0447\u0430 \u0443\u0436\u0435 \u0432 registry \u2192 unique=0, duplicates=5, registry +0, raw +5 (duplicate audit), summary next_action: \u041d\u0415 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c WF08.\n5. \u0422\u0435\u0441\u0442 3 (live guard): fixture_mode=false \u2192 \u0432\u043e\u0440\u043a\u0444\u043b\u043e\u0443 \u043f\u0430\u0434\u0430\u0435\u0442 \u043d\u0430 \u043d\u043e\u0434\u0435 LIVE Mode Guard \u0441 \u043f\u043e\u043d\u044f\u0442\u043d\u043e\u0439 \u043e\u0448\u0438\u0431\u043a\u043e\u0439 (live \u043d\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d; \u043d\u0443\u0436\u043d\u044b \u043e\u0434\u043e\u0431\u0440\u0435\u043d\u0438\u0435 + \u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442 + \u043a\u0440\u0435\u0434\u0435\u043d\u0448\u043b). \u0412\u0435\u0440\u043d\u0443\u0442\u044c fixture_mode=true.\n6. WF08 handoff (\u0432\u0440\u0443\u0447\u043d\u0443\u044e, \u043f\u043e\u0441\u043b\u0435 \u043e\u0434\u043e\u0431\u0440\u0435\u043d\u0438\u044f): agent_request_id_filter=<wf11_req_\u2026>, deterministic_first. \u041e\u0436\u0438\u0434\u0430\u0435\u043c\u043e: 3 \u043a\u043e\u043c\u043f\u0435\u0442\u0438\u0442\u043e\u0440\u043d\u044b\u0445 \u043f\u043e\u0441\u0442\u0430 \u2192 monitor_queue, 1 market_signal \u2192 content/review.\n\nLive-\u0440\u0435\u0436\u0438\u043c (\u0431\u0443\u0434\u0443\u0449\u0435\u0435, \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0435 \u043e\u0434\u043e\u0431\u0440\u0435\u043d\u0438\u0435): \u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442 Firecrawl/HTTP GET \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b t.me/s/<channel>; \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u0430\u043d\u0430\u043b\u044b \u0438\u0437 allowlist; \u043d\u0438\u043a\u0430\u043a\u043e\u0433\u043e MTProto. \u0421\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c fixture-\u043f\u0440\u043e\u0433\u043e\u043d\u0430: $0 \u0432\u0441\u0435\u0433\u0434\u0430.\n7. v0.3: live_source_runs +1 \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u0440\u043e\u0433\u043e\u043d (mode=fixture, external_calls=0, cost=0). \u041f\u0435\u0440\u0435\u0434 \u043f\u0435\u0440\u0432\u044b\u043c \u043f\u0440\u043e\u0433\u043e\u043d\u043e\u043c \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0432\u043a\u043b\u0430\u0434\u043a\u0443 live_source_runs (23 \u043a\u043e\u043b\u043e\u043d\u043a\u0438 \u0438\u0437 docs/TABLE_SCHEMA.md).\n\n**v0.4 live (\u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0435 \u043e\u0434\u043e\u0431\u0440\u0435\u043d\u0438\u0435):** 1) `live_mode=true`; 2) `live_approval_token=I_APPROVE_LIVE_TELEGRAM_PREVIEW`; 3) \u043d\u0435\u043f\u0443\u0441\u0442\u043e\u0439 `live_channel_allowlist` (\u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0435 \u043a\u0430\u043d\u0430\u043b\u044b/`t.me/s` URL; \u0411\u0415\u0417 `+`/joinchat/\u0433\u0440\u0443\u043f\u043f/`t.me/c`); 4) `live_transport`= firecrawl (\u043d\u0443\u0436\u0435\u043d Firecrawl \u043a\u0440\u0435\u0434\u0435\u043d\u0448\u043b) \u0438\u043b\u0438 http_get; 5) \u0412\u041a\u041b\u042e\u0427\u0418\u0422\u042c \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u0443\u044e \u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442-\u043d\u043e\u0434\u0443 (Firecrawl/HTTP) \u2014 \u043e\u0431\u0435 disabled \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e; 6) `max_channels<=2`, `max_posts<=10` \u043d\u0430 \u043f\u0435\u0440\u0432\u043e\u043c smoke. \u041f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0433\u043e\u043d\u0430 \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c Firecrawl \u0432 COSTS_AND_LIMITS + live_source_runs (\u0435\u0441\u043b\u0438 \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u0430 \u2014 `cost_not_recovered`). \u041f\u0430\u0440\u0441\u0435\u0440-\u0442\u0435\u0441\u0442 \u0431\u0435\u0437 \u0441\u0435\u0442\u0438: `n8n/fixtures/wf11_tme_s_preview_sample.html`.",
"height": 880,
"width": 600,
"color": 5
}
},
{
"id": "bb110000-0000-0000-0000-000000000001",
"name": "Manual Start",
"type": "n8n-nodes-base.manualTrigger",
"typeVersion": 1,
"position": [
-420,
560
],
"parameters": {}
},
{
"id": "bb110000-0000-0000-0000-0000000000cf",
"name": "Set Connector Config",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
-200,
560
],
"parameters": {
"jsCode": "// WF11 Social Source Connector Foundation config \u2014 Telegram PUBLIC channel preview (t.me/s/<channel>).\n// Deterministic ids; MSK timestamps; NO external calls by default (fixture-first, DEC-110).\nfunction moscowIsoNow(){var m=new Date(Date.now()+10800000);return m.toISOString().replace('Z','+03:00');}\nfunction moscowStamp(){var z=function(n){return String(n).padStart(2,'0');};var m=new Date(Date.now()+10800000);return m.getUTCFullYear()+z(m.getUTCMonth()+1)+z(m.getUTCDate())+'_'+z(m.getUTCHours())+z(m.getUTCMinutes())+z(m.getUTCSeconds());}\nconst now=moscowIsoNow();\nconst stamp=moscowStamp();\nvar base = ({\n fixture_mode:true,\n live_mode:false,\n // --- live v0.4.2 GATE-PROTECTED PATH (DEC-116/120/132/135): real Telegram public preview fetch, inert by default.\n // live_mode=false, approval token empty, tracked-channel list empty -> the LIVE Preview Approval Gate blocks\n // every external call. Transport nodes stay ENABLED but are UNREACHABLE unless the gate passes. Arming live\n // requires ALL of: live_mode=true, exact token, a non-empty validated tracked-channel list, a selected transport.\n // Scope is hard-limited: PUBLIC https://t.me/s/<channel> preview pages only \u2014 no groups, no private chats,\n // no t.me/+ invite links, no joinchat, no t.me/c private channels, no MTProto/sessions, no login,\n // no member extraction, no hidden contacts, no auto-outreach.\n live_transport:'firecrawl', // PREFERRED transport (Firecrawl scrape) if a Firecrawl credential exists\n live_transport_fallback:'http_get', // fallback: plain HTTP GET of the public preview page (no per-call fee)\n live_channel_allowlist:[], // usernames OR https://t.me/s/<channel> / https://t.me/<channel>\n live_max_channels:2, // first-smoke cap (<=2)\n live_max_posts_per_channel:10, // <=10\n live_approval_token:'',\n live_requires_operator_approval:true,\n source_type:'social_channel',\n platform:'telegram',\n requested_by:'operator',\n request_type:'social_source_discovery',\n region:'\u041c\u043e\u0441\u043a\u0432\u0430/\u041c\u041e',\n service_focus:'credit_broker',\n channel_allowlist:[\n 'kredit_broker_msk_fixture',\n 'ipoteka_refinance_fixture',\n 'finance_news_fixture',\n 'biz_uslugi_fixture'\n ],\n preview_url_template:'https://t.me/s/<channel>',\n pipeline_limit:10,\n include_irrelevant_control_fixture:true,\n approval_status_for_unique:'new',\n write_duplicate_audit:true,\n hard_skip_debug_audit:false,\n live_debug_audit:false,\n duplicate_next_action:'monitor_duplicate',\n spreadsheet_id_placeholder:'PASTE_SPREADSHEET_ID',\n agent_request_id:'wf11_req_'+stamp,\n run_id:'wf11_'+stamp,\n created_at:now\n});\n\n// --- Stage 5 agent-called mode: WF20 passes the APPROVED plan bounds. Live runs still pass ONLY through the\n// --- same LIVE Preview Approval Gate; public t.me/s previews only (scope policy unchanged).\nvar __ci=null;try{var __c=$('When Called by Agent').first().json;if(__c&&String(__c.agent_request_id||'').length)__ci=__c;}catch(e){__ci=null;}\nif(__ci){\n var __ch=String(__ci.channels||'').split(/[\\s,;]+/).map(function(s){return s.replace(/^https?:\\/\\/t\\.me\\/(s\\/)?/i,'').replace(/^@/,'').trim();}).filter(Boolean).slice(0,3);\n var __pp=Math.min(Math.max(1,Number(__ci.max_posts)||30),30);\n var __live=String(__ci.data_mode||'fixture').toLowerCase()==='live';\n base.agent_called=true;\n base.requested_by='agent';\n base.agent_request_id=String(__ci.agent_request_id);\n base.run_id=String(__ci.source_run_id||base.run_id);\n base.workflow_run_id=String(__ci.workflow_run_id||'');\n base.data_mode=__live?'live':'fixture';\n base.fixture_mode=!__live;\n base.live_mode=__live;\n base.live_channel_allowlist=__ch;\n base.live_max_channels=Math.min(Math.max(1,__ch.length||1),3);\n base.live_max_posts_per_channel=__pp;\n base.pipeline_limit=Math.min(__pp*(__ch.length||1),90); // TELEGRAM-CAP-001: approved total ceiling (<=90), per-channel cap stays live_max_posts_per_channel\n base.live_transport=String(__ci.transport||'http_get');\n base.live_approval_token=String(__ci.approval_token||'');\n}\nreturn [{ json: base }];\n"
}
},
{
"id": "bb110000-0000-0000-0000-0000000000if",
"name": "IF fixture_mode?",
"type": "n8n-nodes-base.if",
"typeVersion": 2,
"position": [
20,
560
],
"parameters": {
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "loose"
},
"conditions": [
{
"id": "cond-fixture-mode",
"leftValue": "={{ $json.fixture_mode }}",
"rightValue": true,
"operator": {
"type": "boolean",
"operation": "true",
"singleValue": true
}
}
],
"combinator": "and"
}
}
},
{
"id": "bb110000-0000-0000-0000-0000000000fx",
"name": "Build Fixture Telegram Channel Posts",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
240,
440
],
"parameters": {
"jsCode": "// Fixture Telegram PUBLIC channel preview posts (what a t.me/s/<channel> parse would yield). $0, no network.\n// Channel names carry the _fixture suffix on purpose \u2014 they are NOT real channels.\n// Posts model: competitor ad copy (the main value of Telegram channels per Stage 3.4), one weak finance\n// longread (market_signal), one hard-negative control (legal-address ad), one in-batch duplicate.\nconst posts=[\n { channel:'kredit_broker_msk_fixture', channel_title:'\u041a\u0440\u0435\u0434\u0438\u0442\u043d\u044b\u0439 \u0431\u0440\u043e\u043a\u0435\u0440 \u041c\u043e\u0441\u043a\u0432\u0430 (fixture)', post_id:'101',\n post_url:'https://t.me/kredit_broker_msk_fixture/101',\n published_at:'2026-06-11T14:05:00+03:00',\n text:'\u041a\u0440\u0435\u0434\u0438\u0442\u043d\u044b\u0439 \u0431\u0440\u043e\u043a\u0435\u0440. \u041f\u043e\u043c\u043e\u0449\u044c \u0432 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0438 \u043a\u0440\u0435\u0434\u0438\u0442\u0430 \u043f\u043e\u0441\u043b\u0435 \u043e\u0442\u043a\u0430\u0437\u043e\u0432 \u0438 \u0441 \u043f\u043b\u043e\u0445\u043e\u0439 \u043a\u0440\u0435\u0434\u0438\u0442\u043d\u043e\u0439 \u0438\u0441\u0442\u043e\u0440\u0438\u0435\u0439. \u0411\u0435\u0437 \u043f\u0440\u0435\u0434\u043e\u043f\u043b\u0430\u0442\u044b, \u043e\u043f\u043b\u0430\u0442\u0430 \u0437\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442. \u041a\u043e\u043c\u0438\u0441\u0441\u0438\u044f \u043e\u0442 3%. \u041c\u043e\u0441\u043a\u0432\u0430 \u0438 \u041c\u041e. \u0421\u0432\u044f\u0437\u044c: @kredit_broker_msk_fixture' },\n { channel:'kredit_broker_msk_fixture', channel_title:'\u041a\u0440\u0435\u0434\u0438\u0442\u043d\u044b\u0439 \u0431\u0440\u043e\u043a\u0435\u0440 \u041c\u043e\u0441\u043a\u0432\u0430 (fixture)', post_id:'102',\n post_url:'https://t.me/kredit_broker_msk_fixture/102',\n published_at:'2026-06-11T18:40:00+03:00',\n text:'\u041a\u0440\u0435\u0434\u0438\u0442 \u0434\u043b\u044f \u0431\u0438\u0437\u043d\u0435\u0441\u0430 \u0418\u041f \u0438 \u041e\u041e\u041e: \u043e\u0431\u043e\u0440\u043e\u0442\u043d\u044b\u0435 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430, \u0442\u0435\u043d\u0434\u0435\u0440\u043d\u044b\u0435 \u0437\u0430\u0439\u043c\u044b, \u0431\u0430\u043d\u043a\u043e\u0432\u0441\u043a\u0438\u0435 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0438. \u0420\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u043f\u043e \u0434\u043e\u0433\u043e\u0432\u043e\u0440\u0443. \u0420\u0435\u0448\u0435\u043d\u0438\u0435 \u0437\u0430 1 \u0434\u0435\u043d\u044c.' },\n { channel:'ipoteka_refinance_fixture', channel_title:'\u0418\u043f\u043e\u0442\u0435\u043a\u0430 \u0438 \u0440\u0435\u0444\u0438\u043d\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 (fixture)', post_id:'55',\n post_url:'https://t.me/ipoteka_refinance_fixture/55',\n published_at:'2026-06-10T11:20:00+03:00',\n text:'\u0420\u0435\u0444\u0438\u043d\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438\u043f\u043e\u0442\u0435\u043a\u0438: \u0441\u043d\u0438\u0436\u0435\u043d\u0438\u0435 \u0441\u0442\u0430\u0432\u043a\u0438, \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u043a\u0440\u0435\u0434\u0438\u0442\u043e\u0432 \u0432 \u043e\u0434\u0438\u043d \u043f\u043b\u0430\u0442\u0451\u0436. \u0420\u0430\u0441\u0447\u0451\u0442 \u0432\u044b\u0433\u043e\u0434\u044b \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u043e. \u0420\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u043f\u043e \u0434\u043e\u0433\u043e\u0432\u043e\u0440\u0443, \u041c\u043e\u0441\u043a\u0432\u0430.' },\n { channel:'finance_news_fixture', channel_title:'\u0424\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0435 \u043d\u043e\u0432\u043e\u0441\u0442\u0438 (fixture)', post_id:'9001',\n post_url:'https://t.me/finance_news_fixture/9001',\n published_at:'2026-06-09T09:00:00+03:00',\n text:'\u0411\u0430\u043d\u043a\u0438 \u0443\u0436\u0435\u0441\u0442\u043e\u0447\u0438\u043b\u0438 \u0441\u043a\u043e\u0440\u0438\u043d\u0433 \u0432 2026 \u0433\u043e\u0434\u0443: \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043e\u0442\u043a\u0430\u0437\u043e\u0432 \u043f\u043e \u043f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u043c \u043a\u0440\u0435\u0434\u0438\u0442\u0430\u043c \u0432\u044b\u0440\u043e\u0441\u043b\u043e. \u0420\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u043c, \u0447\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u0437\u0430\u0451\u043c\u0449\u0438\u043a\u0443 \u043f\u043e\u0441\u043b\u0435 \u043e\u0442\u043a\u0430\u0437\u0430 \u0431\u0430\u043d\u043a\u0430 \u0438 \u043a\u0430\u043a \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u0438\u0442\u044c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u044b.' },\n { channel:'biz_uslugi_fixture', channel_title:'\u0411\u0438\u0437\u043d\u0435\u0441-\u0443\u0441\u043b\u0443\u0433\u0438 (fixture)', post_id:'77',\n post_url:'https://t.me/biz_uslugi_fixture/77',\n published_at:'2026-06-11T10:00:00+03:00',\n text:'\u042e\u0440\u0438\u0434\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0430\u0434\u0440\u0435\u0441 \u0434\u043b\u044f \u041e\u041e\u041e \u043e\u0442 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u0438\u043a\u0430. \u0420\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044f \u041e\u041e\u041e \u0438 \u0418\u041f \u043f\u043e\u0434 \u043a\u043b\u044e\u0447, \u0431\u0443\u0445\u0433\u0430\u043b\u0442\u0435\u0440\u0441\u043a\u043e\u0435 \u0441\u043e\u043f\u0440\u043e\u0432\u043e\u0436\u0434\u0435\u043d\u0438\u0435. \u041c\u0435\u0442\u0440\u043e \u0422\u0430\u0433\u0430\u043d\u0441\u043a\u0430\u044f.' },\n { channel:'kredit_broker_msk_fixture', channel_title:'\u041a\u0440\u0435\u0434\u0438\u0442\u043d\u044b\u0439 \u0431\u0440\u043e\u043a\u0435\u0440 \u041c\u043e\u0441\u043a\u0432\u0430 (fixture)', post_id:'101',\n post_url:'https://t.me/kredit_broker_msk_fixture/101?single',\n published_at:'2026-06-11T14:05:00+03:00',\n text:'\u041a\u0440\u0435\u0434\u0438\u0442\u043d\u044b\u0439 \u0431\u0440\u043e\u043a\u0435\u0440. \u041f\u043e\u043c\u043e\u0449\u044c \u0432 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0438 \u043a\u0440\u0435\u0434\u0438\u0442\u0430 \u043f\u043e\u0441\u043b\u0435 \u043e\u0442\u043a\u0430\u0437\u043e\u0432 \u0438 \u0441 \u043f\u043b\u043e\u0445\u043e\u0439 \u043a\u0440\u0435\u0434\u0438\u0442\u043d\u043e\u0439 \u0438\u0441\u0442\u043e\u0440\u0438\u0435\u0439. \u0411\u0435\u0437 \u043f\u0440\u0435\u0434\u043e\u043f\u043b\u0430\u0442\u044b, \u043e\u043f\u043b\u0430\u0442\u0430 \u0437\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442. \u041a\u043e\u043c\u0438\u0441\u0441\u0438\u044f \u043e\u0442 3%. \u041c\u043e\u0441\u043a\u0432\u0430 \u0438 \u041c\u041e. \u0421\u0432\u044f\u0437\u044c: @kredit_broker_msk_fixture' }\n];\nreturn posts.map(p=>({json:p}));"
}
},
{
"id": "bb110000-0000-0000-0000-0000000000lg",
"name": "LIVE Preview Approval Gate",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
240,
700
],
"parameters": {
"jsCode": "// LIVE PREVIEW APPROVAL GATE v0.4.2 (DEC-116/120/132/135) \u2014 fires on live_mode=true. INERT BY DEFAULT: throws\n// unless the operator armed the run. This gate is the SINGLE safety boundary for external calls: the transport\n// nodes downstream stay enabled but are unreachable unless this gate passes (exact token + non-empty validated\n// tracked-channel list + selected transport). Same pattern as the other live-capable workflows.\n// Hard scope (CONTACT_AND_OUTREACH_POLICY): PUBLIC https://t.me/s/<channel> preview pages ONLY \u2014 no groups,\n// no private chats, no t.me/+ invites, no joinchat, no t.me/c private channels, no MTProto/sessions,\n// no login scraping, no member extraction, no hidden contacts, no outreach.\nfunction str(v){return v==null?'':String(v).trim();}\nconst cfg=$('Set Connector Config').first().json;\nconst token=str(cfg.live_approval_token);\nconst transport=str(cfg.live_transport)||'firecrawl';\nconst maxPosts=Math.min(Number(cfg.live_max_posts_per_channel)||10,30);\nconst maxChannels=Math.min(Number(cfg.live_max_channels)||2,3);\nif(token!=='I_APPROVE_LIVE_TELEGRAM_PREVIEW'){\n throw new Error('WF11 live gate: operator approval token missing. Live Telegram public-channel preview requires explicit operator approval: set live_approval_token=I_APPROVE_LIVE_TELEGRAM_PREVIEW, fill the tracked-channel list (live_channel_allowlist), choose live_transport (firecrawl|http_get). Transport nodes are enabled but only reachable through this gate. Default run stays fixture-only ($0). See docs/N8N_WORKFLOW_11_SOCIAL_SOURCE_CONNECTOR_FOUNDATION_RU.md and STAGE_3_4 \u00a75.7.');\n}\nif(transport!=='firecrawl'&&transport!=='http_get'){\n throw new Error('WF11 live gate: live_transport must be \"firecrawl\" (preferred) or \"http_get\" (fallback).');\n}\nconst raw=Array.isArray(cfg.live_channel_allowlist)?cfg.live_channel_allowlist.map(c=>str(c)).filter(Boolean):[];\nif(!raw.length){ throw new Error('WF11 live gate: the tracked-channel list (live_channel_allowlist) is empty \u2014 tracked-channels-only operation, no discovery crawling.'); }\n// non-public / non-channel paths that must never be fetched\nconst BLOCK=['joinchat','c','s','+','addstickers','proxy','socks','iv','share','login'];\nfunction normChannel(entry){\n entry=str(entry);\n if(!entry)return null;\n // private invite links / groups: t.me/+<hash>, joinchat, leading +\n if(/joinchat/i.test(entry)||/t\\.me\\/\\+/i.test(entry)||entry.charAt(0)==='+'||entry.indexOf('/+')>=0)return null;\n let c=entry;\n let m=entry.match(/t\\.me\\/s\\/([A-Za-z0-9_]+)/i)||entry.match(/t\\.me\\/([A-Za-z0-9_]+)/i);\n if(m)c=m[1];\n c=c.replace(/^@/,'');\n if(BLOCK.indexOf(c.toLowerCase())>=0)return null; // private/system paths (t.me/c, joinchat, ...)\n if(!/^[A-Za-z0-9_]{4,32}$/.test(c))return null; // public channel username charset only\n if(!/[A-Za-z]/.test(c))return null; // must contain a letter (reject numeric ids)\n return c;\n}\nconst good=[];const bad=[];\nfor(const e of raw){const c=normChannel(e);if(c){if(good.indexOf(c)<0)good.push(c);}else bad.push(e);}\nif(bad.length){ throw new Error('WF11 live gate: rejected non-public-channel entries (groups/invite links/private/joinchat/t.me-c are forbidden): '+bad.join(', ')); }\nconst channels=good.slice(0,maxChannels); // MVP cap (<=3 channels, <=30 posts each)\n// one item per tracked channel; the gate-protected transport node fetches the PUBLIC preview page only.\nreturn channels.map(c=>({ json: { channel:c, fetch_url:'https://t.me/s/'+c, max_posts:maxPosts, live_transport:transport } }));"
}
},
{
"id": "bb110000-0000-0000-0000-0000000000nm",
"name": "Normalize Telegram Posts",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
460,
440
],
"parameters": {
"jsCode": "// Normalize Telegram public-channel preview posts into the WF09-compatible record shape. Deterministic, $0.\n// v0.4.1 (DEC-133): relevance is decided by POST-LEVEL evidence ONLY. Channel title/username/allowlist context\n// may RAISE confidence/metadata but can NEVER by itself make a post business-relevant. Posts with no post-level\n// finance/broker evidence are classed irrelevant_live_false_positive and skipped (NOT written to\n// raw_market_records / market_record_registry by default). Pure market news/digest -> market_signal;\n// competitor_activity REQUIRES post-level offering/competitor evidence (pitch/case/price/CTA/commission/...).\n// Contact policy (DEC-097/098): contact_public copied ONLY when verbatim in the public post text.\nfunction str(v){return v==null?'':String(v).trim();}\nfunction low(v){return str(v).toLowerCase();}\nfunction cut(s,n){s=str(s);return s.length>n?s.slice(0,n):s;}\nfunction hashText(s){s=str(s);let h=5381;for(let i=0;i<s.length;i++){h=((h<<5)+h+s.charCodeAt(i))>>>0;}return ('00000000'+h.toString(16)).slice(-8);}\nfunction canonPostUrl(u){u=str(u);return u.replace(/[?#].*$/,'').replace(/\\/+$/,'');}\nfunction detectSysEvent(t){t=str(t);return /channel name was changed to|\u043a\u0430\u043d\u0430\u043b \u043f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d|(\u0441\u043c\u0435\u043d\u0438\u043b|\u0438\u0437\u043c\u0435\u043d\u0438\u043b|\u043f\u043e\u043c\u0435\u043d\u044f\u043b)\\s+\u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\\s+\u043a\u0430\u043d\u0430\u043b\u0430|(\u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435|\u0438\u043c\u044f)\\s+\u043a\u0430\u043d\u0430\u043b\u0430\\s+(\u0438\u0437\u043c\u0435\u043d\u0435\u043d\u043e|\u0441\u043c\u0435\u043d\u0435\u043d\u043e)|(\u0441\u043c\u0435\u043d\u0438\u043b|\u0438\u0437\u043c\u0435\u043d\u0438\u043b|\u043e\u0431\u043d\u043e\u0432\u0438\u043b|\u0443\u0434\u0430\u043b\u0438\u043b)\\s+\u0444\u043e\u0442\u043e\\s+\u043a\u0430\u043d\u0430\u043b\u0430|(\u0444\u043e\u0442\u043e|\u0430\u0432\u0430\u0442\u0430\u0440)\\s+\u043a\u0430\u043d\u0430\u043b\u0430\\s+(\u0438\u0437\u043c\u0435\u043d\u0435\u043d\u043e|\u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u043e)|channel photo (was )?(changed|updated)|channel (was )?created|\u043a\u0430\u043d\u0430\u043b \u0441\u043e\u0437\u0434\u0430\u043d|(\u0437\u0430\u043a\u0440\u0435\u043f\u0438\u043b|\u043e\u0442\u043a\u0440\u0435\u043f\u0438\u043b)\\s+\u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438/i.test(t);}\nfunction freshnessOf(pub){var p=Date.parse(str(pub));var now=Date.now();if(isNaN(p))return {age_days:null,freshness_bucket:'unknown',within_default_window:false};var age=Math.floor((now-p)/86400000);var b=age>30?'stale':(age>15?'aging':'fresh');return {age_days:age,freshness_bucket:b,within_default_window:age<=30};}\nfunction detectNegQuote(t){t=str(t);var tl=low(t);var scam=/\u043c\u043e\u0448\u0435\u043d\u043d\u0438\u0447\u0435\u0441\u0442\u0432|\u043e\u0431\u043c\u0430\u043d|\u0440\u0430\u0437\u0432\u043e\u0434|\u043e\u0441\u0442\u043e\u0440\u043e\u0436\u043d|\u043d\u0435 \u0432\u0435\u0440\u044c\u0442\u0435|\u043d\u0435 \u0432\u0435\u0434\u0438\u0442\u0435\u0441\u044c|\u043e\u0441\u0442\u0435\u0440\u0435\u0433\u0430\u0439\u0442\u0435\u0441\u044c/.test(tl);var claims=[];var pats=[/\u0443\u0434\u0430\u043b[\u0430-\u044f\u0451]* \u043f\u0440\u043e\u0441\u0440\u043e\u0447\u043a/i,/\u043e\u0447\u0438\u0441\u0442[\u0430-\u044f\u0451]* \u043a\u0440\u0435\u0434\u0438\u0442\u043d/i,/\u0437\u0430 \u043e\u0434\u0438\u043d \u0434\u0435\u043d\u044c/i,/\u0437\u0430 1 \u0434\u0435\u043d\u044c/i,/\u0441\u043e\u0442\u0440[\u0435\u0451]\u043c \u043a\u0440\u0435\u0434\u0438\u0442\u043d/i];for(var i=0;i<pats.length;i++){var m=pats[i].exec(t);if(m)claims.push(m[0]);}var has=scam&&claims.length>0;return {has_quoted_scam:has,quoted_claims:has?claims:[]};}\nvar AFFIL=['\u043f\u0430\u0440\u0442\u043d\u0451\u0440\u0441\u043a','\u043f\u0430\u0440\u0442\u043d\u0435\u0440\u0441\u043a','\u0440\u0435\u0444\u0435\u0440\u0430\u043b\u044c\u043d','\u0440\u0435\u0444\u0435\u0440\u0430\u043b','\u0437\u0430 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0437\u0430\u0451\u043c\u0449\u0438\u043a','\u0437\u0430 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0437\u0430\u0435\u043c\u0449\u0438\u043a','\u0432\u043e\u0437\u043d\u0430\u0433\u0440\u0430\u0436\u0434\u0435\u043d\u0438\u0435 \u0437\u0430','\u0430\u0433\u0435\u043d\u0442\u0441\u043a\u043e\u0435 \u0432\u043e\u0437\u043d\u0430\u0433\u0440\u0430\u0436\u0434\u0435\u043d\u0438\u0435','\u043f\u0435\u0440\u0441\u043e\u043d\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0441\u044b\u043b\u043a\u0430','\u043b\u0438\u0447\u043d\u0430\u044f \u0441\u0441\u044b\u043b\u043a\u0430','\u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0439\u0442\u0435\u0441\u044c \u0438 \u043f\u043e\u043b\u0443\u0447'];\n// term matcher: short tokens (<=3 chars, e.g. \u0438\u043f/\u043a\u0438/\u0446\u0431) require word boundaries (Cyrillic+Latin aware);\n// longer tokens use substring. Applied to POST TEXT ONLY for relevance.\nfunction hasWord(blob,term){return new RegExp('(^|[^a-z\u0430-\u044f\u04510-9])'+term+'([^a-z\u0430-\u044f\u04510-9]|$)','i').test(blob);}\nfunction matchTerms(blob,list){const h=[];for(let i=0;i<list.length;i++){const t=list[i];const ok=(t.length<=3)?hasWord(blob,t):(blob.indexOf(t)>=0);if(ok&&h.indexOf(t)<0)h.push(t);}return h;}\nconst cfg=$('Set Connector Config').first().json;\nconst fixtureMode=(cfg.fixture_mode===true||low(cfg.fixture_mode)==='true');\nconst items=$input.all().map(i=>i.json);\n// POST-LEVEL finance/broker evidence (credit_brokerage niche v0.1; migrates to niche packs, DEC-100).\nconst POSITIVE=['\u043a\u0440\u0435\u0434\u0438\u0442','\u043a\u0440\u0435\u0434\u0438\u0442\u043d','\u043a\u0440\u0435\u0434\u0438\u0442\u043d\u0430\u044f \u0438\u0441\u0442\u043e\u0440\u0438','\u043a\u0440\u0435\u0434\u0438\u0442\u043d\u043e\u0439 \u0438\u0441\u0442\u043e\u0440\u0438','\u043e\u0442\u043a\u0430\u0437','\u043e\u0434\u043e\u0431\u0440\u0435\u043d\u0438','\u0431\u0430\u043d\u043a','\u0438\u043f\u043e\u0442\u0435\u043a','\u0440\u0435\u0444\u0438\u043d\u0430\u043d\u0441','\u0441\u0442\u0430\u0432\u043a','\u043f\u043b\u0430\u0442\u0451\u0436','\u043f\u043b\u0430\u0442\u0435\u0436','\u043f\u0435\u0440\u0435\u043f\u043b\u0430\u0442','\u0437\u0430\u043b\u043e\u0433','\u0434\u043e\u0445\u043e\u0434','\u0431\u0438\u0437\u043d\u0435\u0441','\u043a\u043e\u043c\u0438\u0441\u0441\u0438','\u0431\u0440\u043e\u043a\u0435\u0440','\u043a\u043e\u043d\u0441\u0443\u043b\u044c\u0442\u0430\u0446\u0438','\u0434\u043e\u043b\u0433\u043e\u0432','\u0441\u043a\u043e\u0440\u0438\u043d\u0433','\u0441\u0442\u0440\u0430\u0445\u043e\u0432','\u0441\u0435\u043c\u0435\u0439\u043d\u0430\u044f \u0438\u043f\u043e\u0442\u0435\u043a','\u043b\u044c\u0433\u043e\u0442\u043d','\u0437\u0430\u0439\u043c','\u0437\u0430\u0451\u043c\u0449\u0438\u043a','\u043f\u0440\u043e\u0441\u0440\u043e\u0447\u043a','\u0431\u0430\u043d\u043a\u0440\u043e\u0442','\u043f\u043e\u0434 \u0437\u0430\u043b\u043e\u0433','\u0434\u043b\u044f \u0431\u0438\u0437\u043d\u0435\u0441\u0430'];\nconst SHORT_POSITIVE=['\u0438\u043f','\u043a\u0438','\u0446\u0431','\u043e\u043e\u043e','\u0431\u043a\u0438'];\n// Competitor/offering POST-LEVEL evidence -> competitor_activity (service pitch/case/price/CTA/commission/...).\nconst OFFER=['\u043a\u0440\u0435\u0434\u0438\u0442\u043d\u044b\u0439 \u0431\u0440\u043e\u043a\u0435\u0440','\u0438\u043f\u043e\u0442\u0435\u0447\u043d\u044b\u0439 \u0431\u0440\u043e\u043a\u0435\u0440','\u043f\u043e\u043c\u043e\u0449\u044c \u0432 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0438 \u043a\u0440\u0435\u0434\u0438\u0442','\u043f\u043e\u043c\u043e\u0436\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043a\u0440\u0435\u0434\u0438\u0442','\u043f\u043e\u043c\u043e\u0436\u0435\u043c \u0432\u0437\u044f\u0442\u044c \u043a\u0440\u0435\u0434\u0438\u0442','\u043f\u043e\u043c\u043e\u0436\u0435\u043c \u0441 \u043a\u0440\u0435\u0434\u0438\u0442','\u043f\u043e\u043c\u043e\u0436\u0435\u043c \u0441 \u0438\u043f\u043e\u0442\u0435\u043a','\u043f\u043e\u0434\u0431\u043e\u0440 \u0431\u0430\u043d\u043a\u0430','\u043f\u043e\u0434\u0431\u043e\u0440 \u043a\u0440\u0435\u0434\u0438\u0442','\u043f\u043e\u0434\u0431\u0435\u0440\u0451\u043c \u0431\u0430\u043d\u043a','\u043f\u043e\u0434\u0431\u0435\u0440\u0435\u043c \u0431\u0430\u043d\u043a','\u043f\u043e\u0434\u0431\u0435\u0440\u0451\u043c \u043a\u0440\u0435\u0434\u0438\u0442','\u043f\u043e\u0434\u0431\u0435\u0440\u0435\u043c \u043a\u0440\u0435\u0434\u0438\u0442','\u043f\u043e\u0434\u0431\u0435\u0440\u0451\u043c \u0438\u043f\u043e\u0442\u0435\u043a','\u043f\u043e\u0434\u0431\u0435\u0440\u0435\u043c \u0438\u043f\u043e\u0442\u0435\u043a','\u0431\u0435\u0437 \u043f\u0440\u0435\u0434\u043e\u043f\u043b\u0430\u0442\u044b','\u043e\u043f\u043b\u0430\u0442\u0430 \u0437\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442','\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u043f\u043e \u0434\u043e\u0433\u043e\u0432\u043e\u0440\u0443','\u043e\u0441\u0442\u0430\u0432\u044c\u0442\u0435 \u0437\u0430\u044f\u0432\u043a','\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0439\u0442\u0435 \u0437\u0430\u044f\u0432\u043a','\u043d\u0430\u043f\u0438\u0448\u0438\u0442\u0435 \u0432 \u043b\u0438\u0447\u043a','\u043f\u0438\u0448\u0438\u0442\u0435 \u0432 \u043b\u0438\u0447\u043a','\u0432 \u043b\u0438\u0447\u043a\u0443','\u0441\u0432\u044f\u0436\u0438\u0442\u0435\u0441\u044c \u0441 \u043d\u0430\u043c\u0438','\u0437\u0430\u043f\u0438\u0448\u0438\u0442\u0435\u0441\u044c \u043d\u0430 \u043a\u043e\u043d\u0441\u0443\u043b\u044c\u0442\u0430\u0446\u0438','\u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u0430\u044f \u043a\u043e\u043d\u0441\u0443\u043b\u044c\u0442\u0430\u0446\u0438','\u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u044b\u0439 \u0440\u0430\u0441\u0447\u0451\u0442','\u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u044b\u0439 \u0440\u0430\u0441\u0447\u0435\u0442','\u0440\u0430\u0441\u0447\u0451\u0442 \u0432\u044b\u0433\u043e\u0434\u044b','\u0440\u0430\u0441\u0447\u0451\u0442 \u043f\u043b\u0430\u0442\u0435\u0436\u0430','\u0440\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u0435\u043c \u043f\u043b\u0430\u0442\u0451\u0436','\u0440\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u0435\u043c \u043f\u043b\u0430\u0442\u0435\u0436','\u0441\u043d\u0438\u0436\u0435\u043d\u0438\u0435 \u0441\u0442\u0430\u0432\u043a\u0438','\u0441\u043d\u0438\u0437\u0438\u043c \u0441\u0442\u0430\u0432\u043a\u0443','\u0441\u043d\u0438\u0437\u0438\u0442\u044c \u0441\u0442\u0430\u0432\u043a\u0443','\u043e\u0434\u043e\u0431\u0440\u0435\u043d\u0438\u0435 \u043a\u0440\u0435\u0434\u0438\u0442','\u043e\u0434\u043e\u0431\u0440\u0438\u043c \u043a\u0440\u0435\u0434\u0438\u0442','\u043f\u043e\u043c\u043e\u0436\u0435\u043c \u0441 \u043e\u0434\u043e\u0431\u0440\u0435\u043d\u0438','\u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u0438\u043c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u044b','\u0438\u0441\u043f\u0440\u0430\u0432\u0438\u043c \u043a\u0440\u0435\u0434\u0438\u0442\u043d','\u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u0440\u0435\u0434\u0438\u0442\u043d\u043e\u0439 \u0438\u0441\u0442\u043e\u0440\u0438','\u043a\u0440\u0435\u0434\u0438\u0442 \u043f\u043e\u0434 \u0437\u0430\u043b\u043e\u0433','\u0437\u0430\u0439\u043c \u043f\u043e\u0434 \u0437\u0430\u043b\u043e\u0433','\u043a\u0440\u0435\u0434\u0438\u0442 \u0434\u043b\u044f \u0431\u0438\u0437\u043d\u0435\u0441\u0430','\u043e\u0431\u043e\u0440\u043e\u0442\u043d\u044b\u0435 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430','\u0442\u0435\u043d\u0434\u0435\u0440\u043d\u044b\u0435 \u0437\u0430\u0439\u043c\u044b','\u0431\u0430\u043d\u043a\u043e\u0432\u0441\u043a\u0438\u0435 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0438','\u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0437\u0430 1 \u0434\u0435\u043d\u044c','\u043d\u0430\u0448 \u043a\u043b\u0438\u0435\u043d\u0442','\u043f\u043e\u043c\u043e\u0433\u043b\u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c','\u043f\u043e\u043c\u043e\u0433\u043b\u0438 \u0441\u043d\u0438\u0437\u0438\u0442\u044c','\u043e\u0434\u043e\u0431\u0440\u0438\u043b\u0438 \u043a\u0440\u0435\u0434\u0438\u0442','\u043e\u0434\u043e\u0431\u0440\u0438\u043b\u0438 \u0438\u043f\u043e\u0442\u0435\u043a','\u043a\u0435\u0439\u0441 \u043a\u043b\u0438\u0435\u043d\u0442\u0430','\u043a\u043e\u043c\u0438\u0441\u0441\u0438\u044f \u043e\u0442','\u0440\u0435\u0444\u0438\u043d\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u0440\u0435\u0434\u0438\u0442','\u0440\u0435\u0444\u0438\u043d\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438\u043f\u043e\u0442\u0435\u043a','\u0440\u0435\u0444\u0438\u043d\u0430\u043d\u0441\u0438\u0440 \u0438\u043f\u043e\u0442\u0435\u043a'];\n// STRONG, UNAMBIGUOUS broker/credit-service evidence \u2014 overrides adjacent/hard-negative (a real broker post may also mention property/recruitment).\nconst STRONG_SERVICE=['\u043a\u0440\u0435\u0434\u0438\u0442\u043d\u044b\u0439 \u0431\u0440\u043e\u043a\u0435\u0440','\u0438\u043f\u043e\u0442\u0435\u0447\u043d\u044b\u0439 \u0431\u0440\u043e\u043a\u0435\u0440','\u043f\u043e\u043c\u043e\u0449\u044c \u0432 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0438 \u043a\u0440\u0435\u0434\u0438\u0442','\u043f\u043e\u043c\u043e\u0436\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043a\u0440\u0435\u0434\u0438\u0442','\u043f\u043e\u043c\u043e\u0436\u0435\u043c \u0432\u0437\u044f\u0442\u044c \u043a\u0440\u0435\u0434\u0438\u0442','\u043f\u043e\u0434\u0431\u0435\u0440\u0451\u043c \u0431\u0430\u043d\u043a','\u043f\u043e\u0434\u0431\u0435\u0440\u0435\u043c \u0431\u0430\u043d\u043a','\u043f\u043e\u0434\u0431\u043e\u0440 \u0431\u0430\u043d\u043a\u0430','\u043f\u043e\u0434\u0431\u043e\u0440 \u043a\u0440\u0435\u0434\u0438\u0442','\u043a\u0440\u0435\u0434\u0438\u0442 \u043f\u043e\u0434 \u0437\u0430\u043b\u043e\u0433','\u0437\u0430\u0439\u043c \u043f\u043e\u0434 \u0437\u0430\u043b\u043e\u0433','\u0440\u0435\u0444\u0438\u043d\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u0440\u0435\u0434\u0438\u0442','\u0440\u0435\u0444\u0438\u043d\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438\u043f\u043e\u0442\u0435\u043a','\u043e\u0434\u043e\u0431\u0440\u0435\u043d\u0438\u0435 \u043a\u0440\u0435\u0434\u0438\u0442','\u043e\u0434\u043e\u0431\u0440\u0438\u043c \u043a\u0440\u0435\u0434\u0438\u0442','\u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u0440\u0435\u0434\u0438\u0442\u043d\u043e\u0439 \u0438\u0441\u0442\u043e\u0440\u0438','\u043a\u0440\u0435\u0434\u0438\u0442 \u0434\u043b\u044f \u0431\u0438\u0437\u043d\u0435\u0441\u0430','\u043e\u0431\u043e\u0440\u043e\u0442\u043d\u044b\u0435 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430','\u0442\u0435\u043d\u0434\u0435\u0440\u043d\u044b\u0435 \u0437\u0430\u0439\u043c\u044b','\u0431\u0430\u043d\u043a\u043e\u0432\u0441\u043a\u0438\u0435 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0438','\u043e\u043f\u043b\u0430\u0442\u0430 \u0437\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442','\u0431\u0435\u0437 \u043f\u0440\u0435\u0434\u043e\u043f\u043b\u0430\u0442\u044b'];\n// ADJACENT real-estate object/lot promotion (developer/property marketing) \u2014 credit_brokerage MVP skips by default.\nconst RE_OBJECT=['\u043b\u043e\u0442 \u043d\u0435\u0434\u0435\u043b\u0438','\u043e\u0431\u044a\u0435\u043a\u0442 \u043d\u0435\u0434\u0435\u043b\u0438','\u0436\u043a ','\u043d\u043e\u0432\u043e\u0441\u0442\u0440\u043e\u0439\u043a','\u0437\u0430\u0441\u0442\u0440\u043e\u0439\u0449\u0438\u043a','\u043a\u0432\u0430\u0440\u0442\u0438\u0440','\u0430\u043f\u0430\u0440\u0442\u0430\u043c\u0435\u043d\u0442','\u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u043a','\u0435\u0432\u0440\u043e\u0434\u0432\u0443\u0448\u043a','\u0435\u0432\u0440\u043e\u0442\u0440\u0435\u0448\u043a','\u0435\u0432\u0440\u043e\u0442\u0440\u0451\u0448\u043a','\u0442\u0430\u0443\u043d\u0445\u0430\u0443\u0441','\u043a\u043e\u0442\u0442\u0435\u0434\u0436','\u0443\u0447\u0430\u0441\u0442\u043e\u043a','\u0441\u0434\u0430\u0447\u0430 \u0434\u043e\u043c\u0430','\u0434\u043e\u043c \u0441\u0434\u0430\u043d','\u043f\u0440\u043e\u0434\u0430\u0436\u0430 \u043a\u0432\u0430\u0440\u0442\u0438\u0440','\u043f\u0440\u043e\u0434\u0430\u044e\u0442\u0441\u044f \u043a\u0432\u0430\u0440\u0442\u0438\u0440','\u0440\u0430\u0441\u0441\u0440\u043e\u0447\u043a\u0430 \u043e\u0442 \u0437\u0430\u0441\u0442\u0440\u043e\u0439\u0449\u0438\u043a','\u0438\u043f\u043e\u0442\u0435\u043a\u0430 \u043e\u0442 \u0437\u0430\u0441\u0442\u0440\u043e\u0439\u0449\u0438\u043a','\u0446\u0435\u043d\u0430 \u0437\u0430 \u043c\u0435\u0442\u0440','\u0441\u0432\u043e\u0431\u043e\u0434\u043d\u044b\u0435 \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u043a'];\n// ADJACENT real-estate agent recruitment / hiring \u2014 credit_brokerage MVP skips by default.\nconst RE_RECRUIT=['\u0432 \u043f\u043e\u0438\u0441\u043a\u0430\u0445 \u0430\u0433\u0435\u043d\u0442\u043e\u0432','\u0438\u0449\u0435\u043c \u0430\u0433\u0435\u043d\u0442\u043e\u0432','\u0442\u0440\u0435\u0431\u0443\u044e\u0442\u0441\u044f \u0430\u0433\u0435\u043d\u0442\u044b','\u0442\u0440\u0435\u0431\u0443\u044e\u0442\u0441\u044f \u0440\u0438\u0435\u043b\u0442\u043e\u0440','\u043d\u0443\u0436\u043d\u044b \u0430\u0433\u0435\u043d\u0442\u044b','\u0430\u0433\u0435\u043d\u0442 \u043f\u043e \u043d\u0435\u0434\u0432\u0438\u0436\u0438\u043c\u043e\u0441\u0442\u0438','\u0440\u0438\u0435\u043b\u0442\u043e\u0440','\u0440\u0438\u044d\u043b\u0442\u043e\u0440','\u0432\u0430\u043a\u0430\u043d\u0441\u0438\u044f','\u0432\u0430\u043a\u0430\u043d\u0441\u0438\u0438','\u0432 \u043d\u0430\u0448\u0443 \u043a\u043e\u043c\u0430\u043d\u0434\u0443','\u043f\u0440\u0438\u0441\u043e\u0435\u0434\u0438\u043d\u044f\u0439\u0441\u044f \u043a \u043a\u043e\u043c\u0430\u043d\u0434\u0435','\u043f\u0440\u0438\u0441\u043e\u0435\u0434\u0438\u043d\u044f\u0439\u0442\u0435\u0441\u044c \u043a \u043a\u043e\u043c\u0430\u043d\u0434\u0435','% \u043e\u0442 \u0441\u0434\u0435\u043b\u043a\u0438','% \u043e\u0442 \u043a\u043e\u043c\u0438\u0441\u0441\u0438\u0438','\u043d\u0430\u0431\u0438\u0440\u0430\u0435\u043c \u0430\u0433\u0435\u043d\u0442\u043e\u0432','\u0438\u0449\u0435\u043c \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a','\u043e\u0431\u0443\u0447\u0435\u043d\u0438\u0435 \u0441 \u043d\u0443\u043b\u044f','\u0440\u0430\u0431\u043e\u0442\u0430 \u0432 \u043d\u0435\u0434\u0432\u0438\u0436\u0438\u043c\u043e\u0441\u0442\u0438','\u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440 \u043f\u043e \u043f\u0440\u043e\u0434\u0430\u0436\u0430\u043c \u043d\u0435\u0434\u0432\u0438\u0436\u0438\u043c\u043e\u0441\u0442\u0438'];\n// GREETING / holiday / personal / lifestyle \u2014 irrelevant_live_false_positive unless real finance evidence.\nconst GREETING=['\u0441 \u0434\u043d\u0451\u043c','\u0441 \u0434\u043d\u0435\u043c','\u0441 \u043f\u0440\u0430\u0437\u0434\u043d\u0438\u043a','\u043f\u043e\u0437\u0434\u0440\u0430\u0432\u043b\u044f','\u0441 \u043d\u043e\u0432\u044b\u043c \u0433\u043e\u0434\u043e\u043c','\u0441 8 \u043c\u0430\u0440\u0442\u0430','\u0441 23 \u0444\u0435\u0432\u0440\u0430\u043b\u044f','\u0434\u0435\u043d\u044c \u0440\u043e\u0441\u0441\u0438\u0438','\u0434\u043d\u0451\u043c \u0440\u043e\u0441\u0441\u0438\u0438','\u0434\u043d\u0435\u043c \u0440\u043e\u0441\u0441\u0438\u0438','\u043f\u0440\u0430\u0437\u0434\u043d\u0438\u0447\u043d','\u0445\u043e\u0440\u043e\u0448\u0438\u0445 \u0432\u044b\u0445\u043e\u0434\u043d','\u0445\u043e\u0440\u043e\u0448\u0435\u0439 \u043d\u0435\u0434\u0435\u043b\u0438','\u043e\u0442\u043b\u0438\u0447\u043d\u043e\u0439 \u043d\u0435\u0434\u0435\u043b\u0438','\u0445\u043e\u0440\u043e\u0448\u0435\u0433\u043e \u0434\u043d\u044f','\u0434\u043e\u0431\u0440\u043e\u0435 \u0443\u0442\u0440\u043e','\u0434\u043e\u0431\u0440\u044b\u0439 \u0432\u0435\u0447\u0435\u0440','\u0434\u043e\u0431\u0440\u043e\u0439 \u043d\u043e\u0447\u0438','\u043f\u0440\u0438\u0432\u0435\u0442 \u043a\u043e\u0442\u044f\u0442\u043a','\u043a\u043e\u0442\u044f\u0442\u043a','\u043f\u043e\u044f\u0432\u0438\u043b\u043e\u0441\u044c \u0432\u0434\u043e\u0445\u043d\u043e\u0432\u0435\u043d\u0438','\u0432\u0434\u043e\u0445\u043d\u043e\u0432\u0435\u043d\u0438','\u0432\u044b\u0437\u0434\u043e\u0440\u043e\u0432\u043b\u0435\u043d\u0438','\u0432\u044b\u0437\u0434\u043e\u0440\u0430\u0432\u043b\u0438\u0432\u0430\u0439','\u0431\u0435\u0440\u0435\u0433\u0438\u0442\u0435 \u0441\u0435\u0431\u044f','\u0431\u0435\u0440\u0435\u0433\u0438 \u0441\u0435\u0431\u044f','\u0434\u043b\u044f \u0434\u0443\u0448\u0438','\u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u044f \u0434\u0432\u0443\u0445 \u0447\u0430\u0441\u043e\u0432','\u0447\u0430\u0441\u0430 \u0434\u043b\u044f \u0441\u0435\u0431\u044f','\u0447\u0430\u0441 \u0434\u043b\u044f \u0441\u0435\u0431\u044f','\u043c\u0435\u0434\u0438\u0442\u0430\u0446\u0438','\u0445\u043e\u0440\u043e\u0448\u0435\u0433\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u0438','\u043e\u0442\u043b\u0438\u0447\u043d\u043e\u0433\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u0438','\u0441 \u043f\u044f\u0442\u043d\u0438\u0446\u0435\u0439','\u0441 \u043f\u043e\u043d\u0435\u0434\u0435\u043b\u044c\u043d\u0438\u043a'];\n// Market-signal POST-LEVEL evidence (news/digest/rates/programs) -> market_signal (no direct offer required).\nconst MARKET=['\u0446\u0435\u043d\u0442\u0440\u043e\u0431\u0430\u043d\u043a','\u0446\u0431 \u0440\u0444','\u043a\u043b\u044e\u0447\u0435\u0432\u0430\u044f \u0441\u0442\u0430\u0432\u043a\u0430','\u0440\u0435\u0433\u0443\u043b\u044f\u0442\u043e\u0440','\u0433\u043e\u0441\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a','\u0433\u043e\u0441\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c','\u043b\u044c\u0433\u043e\u0442\u043d\u0430\u044f \u0438\u043f\u043e\u0442\u0435\u043a\u0430','\u0441\u0435\u043c\u0435\u0439\u043d\u0430\u044f \u0438\u043f\u043e\u0442\u0435\u043a\u0430','\u0443\u0436\u0435\u0441\u0442\u043e\u0447','\u0441\u043c\u044f\u0433\u0447','\u0432\u044b\u0440\u043e\u0441\u043b','\u0432\u044b\u0440\u043e\u0441','\u0441\u043d\u0438\u0437\u0438\u043b','\u043f\u0430\u0434\u0435\u043d\u0438','\u0441\u043f\u0440\u043e\u0441','\u0440\u044b\u043d\u043e\u043a','\u0440\u044b\u043d\u043a\u0435','\u0437\u0430\u043a\u043e\u043d','\u043d\u043e\u0432\u043e\u0441\u0442','\u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438','\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430','\u0431\u0430\u043d\u043a\u0438 ','\u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a','\u0442\u0440\u0435\u043d\u0434','\u043f\u0440\u043e\u0433\u043d\u043e\u0437','\u0438\u043d\u0444\u043b\u044f\u0446','\u0432\u044b\u0434\u0430\u0447','\u043e\u0434\u043e\u0431\u0440\u044f\u0435\u043c\u043e\u0441\u0442'];\nconst HARD_NEG=['\u044e\u0440\u0438\u0434\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0430\u0434\u0440\u0435\u0441','\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044f \u043e\u043e\u043e','\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044f \u0438\u043f','\u0431\u0443\u0445\u0433\u0430\u043b\u0442\u0435\u0440','\u044d\u043a\u0432\u0430\u0439\u0440\u0438\u043d\u0433','pos-\u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b','\u043a\u0430\u0441\u0441\u0430','\u043f\u0435\u0447\u0430\u0442\u044c \u0438 \u0448\u0442\u0430\u043c\u043f','\u044d\u0446\u043f','\u0430\u0440\u0435\u043d\u0434\u0430 \u043e\u0444\u0438\u0441\u0430','\u043a\u043e\u0432\u043e\u0440\u043a\u0438\u043d\u0433'];\nconst KW=[['\u043a\u0440\u0435\u0434\u0438\u0442\u043d\u044b\u0439 \u0431\u0440\u043e\u043a\u0435\u0440','\u043a\u0440\u0435\u0434\u0438\u0442\u043d\u044b\u0439 \u0431\u0440\u043e\u043a\u0435\u0440'],['\u043f\u043e\u0441\u043b\u0435 \u043e\u0442\u043a\u0430\u0437\u043e\u0432','\u043f\u043e\u0441\u043b\u0435 \u043e\u0442\u043a\u0430\u0437\u043e\u0432'],['\u043f\u043b\u043e\u0445','\u043f\u043b\u043e\u0445\u0430\u044f \u043a\u0440\u0435\u0434\u0438\u0442\u043d\u0430\u044f \u0438\u0441\u0442\u043e\u0440\u0438\u044f'],['\u0431\u0435\u0437 \u043f\u0440\u0435\u0434\u043e\u043f\u043b\u0430\u0442\u044b','\u0431\u0435\u0437 \u043f\u0440\u0435\u0434\u043e\u043f\u043b\u0430\u0442\u044b'],['\u043e\u043f\u043b\u0430\u0442\u0430 \u0437\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442','\u043e\u043f\u043b\u0430\u0442\u0430 \u0437\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442'],['\u043f\u043e \u0434\u043e\u0433\u043e\u0432\u043e\u0440\u0443','\u0440\u0430\u0431\u043e\u0442\u0430 \u043f\u043e \u0434\u043e\u0433\u043e\u0432\u043e\u0440\u0443'],['\u0434\u043b\u044f \u0431\u0438\u0437\u043d\u0435\u0441\u0430','\u0431\u0438\u0437\u043d\u0435\u0441-\u043a\u0440\u0435\u0434\u0438\u0442'],['\u043e\u0431\u043e\u0440\u043e\u0442\u043d\u044b\u0435','\u043e\u0431\u043e\u0440\u043e\u0442\u043d\u044b\u0435 \u043a\u0440\u0435\u0434\u0438\u0442\u044b'],['\u0442\u0435\u043d\u0434\u0435\u0440\u043d','\u0442\u0435\u043d\u0434\u0435\u0440\u043d\u044b\u0435 \u0437\u0430\u0439\u043c\u044b'],['\u0431\u0430\u043d\u043a\u043e\u0432\u0441\u043a\u0438\u0435 \u0433\u0430\u0440\u0430\u043d\u0442','\u0431\u0430\u043d\u043a\u043e\u0432\u0441\u043a\u0438\u0435 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0438'],['\u0440\u0435\u0444\u0438\u043d\u0430\u043d\u0441\u0438\u0440','\u0440\u0435\u0444\u0438\u043d\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435'],['\u0441\u043d\u0438\u0436\u0435\u043d\u0438\u0435 \u0441\u0442\u0430\u0432\u043a','\u0441\u043d\u0438\u0436\u0435\u043d\u0438\u0435 \u0441\u0442\u0430\u0432\u043a\u0438'],['\u0437\u0430 1 \u0434\u0435\u043d\u044c','\u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c'],['\u043a\u043e\u043c\u0438\u0441\u0441\u0438\u044f \u043e\u0442','\u0446\u0435\u043d\u043e\u0432\u043e\u0439 \u044f\u043a\u043e\u0440\u044c']];\nconst out=[];\nfor(const p of items){\n const channel=str(p.channel);const postId=str(p.post_id);const text=str(p.text);\n const textBlob=low(text); // RELEVANCE source: POST TEXT ONLY\n const channelBlob=low(p.channel_title)+' '+low(channel); // metadata/confidence ONLY (never relevance)\n const valid=!!(channel&&postId&&text.length>=30);\n const posHit=matchTerms(textBlob,POSITIVE).concat(SHORT_POSITIVE.filter(t=>hasWord(textBlob,t)));\n const offerHit=matchTerms(textBlob,OFFER);\n const marketHit=matchTerms(textBlob,MARKET);\n const negHit=matchTerms(textBlob,HARD_NEG);\n const objectHit=matchTerms(textBlob,RE_OBJECT); // real-estate object/lot promo (POST TEXT ONLY)\n const recruitHit=matchTerms(textBlob,RE_RECRUIT); // real-estate agent recruitment (POST TEXT ONLY)\n const greetHit=matchTerms(textBlob,GREETING); // greeting/holiday/personal (POST TEXT ONLY)\n const strongHit=matchTerms(textBlob,STRONG_SERVICE); // unambiguous broker/credit-service evidence\n const affHit=matchTerms(textBlob,AFFIL); // \u00a79.4 partner/referral program\n const hasFinanceEvidence=(posHit.length>0||offerHit.length>0||marketHit.length>0||strongHit.length>0);\n const hasServiceOffer=(offerHit.length>0||strongHit.length>0||affHit.length>0);\n let relevance_class='';let record_type_hint='irrelevant';let predicted_entity_type='irrelevant';\n let
Credentials you'll need
Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.
googleApihttpHeaderAuth
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
11 - Social Source Connector Foundation (Telegram Public Channel Preview). Uses googleSheets, httpRequest, executeWorkflowTrigger. Event-driven trigger; 26 nodes.
Source: https://github.com/CodeVinci8/vinci-ai-pilot/blob/main/n8n/workflows/11_social_source_connector_foundation.json — original creator credit. Request a take-down →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
Deal-Finder. Uses executeWorkflowTrigger, googleSheets, perplexity, httpRequest. Event-driven trigger; 49 nodes.
This workflow provides a complete solution for handling Telegram Stars payments, invoicing and refunds using n8n. It automates the process of sending invoices, managing pre-checkout approvals, recordi
A — Приём и перевод (Челлендж 200 дней). Uses executeWorkflowTrigger, telegram, httpRequest, executeCommand. Event-driven trigger; 32 nodes.
C — Кнопки и публикация (Челлендж 200 дней). Uses executeWorkflowTrigger, telegram, googleSheets, httpRequest. Event-driven trigger; 22 nodes.
P — Публикация: движок (Челлендж 200 дней). Uses executeWorkflowTrigger, googleSheets, telegram, httpRequest. Event-driven trigger; 15 nodes.