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": "09 - Avito Classifieds Listing Connector",
"nodes": [
{
"id": "a9000000-0000-0000-0000-0000000000n1",
"name": "Overview Note RU",
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-480,
-260
],
"parameters": {
"content": "## 09 \u2014 Avito/Classifieds Listing Connector \u2014 Stage 3.3\n\n\u041f\u0415\u0420\u0412\u042b\u0419 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u043d\u043d\u0435\u043a\u0442\u043e\u0440-\u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u043f\u043e\u0441\u043b\u0435 \u0440\u0443\u0447\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u0451\u043c\u0430 (Workflow 07). \u041d\u0415 \u0430\u043d\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440 \u0438 \u041d\u0415 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0430\u0442\u043e\u0440.\n\n\u0427\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442:\n1. \u0420\u0443\u0447\u043d\u043e\u0439 \u0441\u0442\u0430\u0440\u0442 \u2192 Set Avito Connector Config (fixture_mode=true \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e).\n2. IF fixture_mode=true \u2192 Build Fixture Avito Listings (\u0431\u0435\u0437 Apify, $0). \u0418\u043d\u0430\u0447\u0435 \u2192 Apify Avito/Classifieds Actor Request (live, \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438 fixture_mode=false).\n3. Normalize Avito Listings \u2192 \u0434\u0435\u0442\u0435\u0440\u043c\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u043d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0432 shape raw_market_records (\u0431\u0435\u0437 LLM): record_type_hint, touchpoint_type, semantic_keywords, ad_channel_hint, competitor_name, dedup_key, text_hash, \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0439 \u043c\u0430\u0440\u0448\u0440\u0443\u0442/entity.\n4. Read market_record_registry \u2192 Deduplicate Listings (\u043f\u043e dedup_key).\n5. Build raw_market_records Rows (40 \u043a\u043e\u043b\u043e\u043d\u043e\u043a) \u2014 \u0432\u0441\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 (\u0430\u0443\u0434\u0438\u0442) \u043f\u0440\u0438 write_duplicate_audit=true.\n6. Build market_record_registry Rows (15 \u043a\u043e\u043b\u043e\u043d\u043e\u043a) \u2014 \u0422\u041e\u041b\u042c\u041a\u041e \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0435.\n7. Build agent_requests Row (21 \u043a\u043e\u043b\u043e\u043d\u043a\u0430, status=completed).\n8. Append: agent_requests, raw_market_records, market_record_registry (\u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0435).\n9. Final Summary.\n\n\u041a\u041e\u041c\u041f\u0415\u0422\u0415\u041d\u0422\u041d\u041e\u0421\u0422\u042c: Competitor Ad Intelligence / Semantic Intelligence \u2014 \u043e\u0444\u0444\u0435\u0440/\u0446\u0435\u043d\u0430/\u0443\u0441\u043b\u043e\u0432\u0438\u044f/\u0441\u0435\u043c\u0430\u043d\u0442\u0438\u043a\u0430/\u043f\u043e\u0437\u0438\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u0430 \u0438\u0437 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0439.\n\n\u0427\u0415\u0413\u041e \u041d\u0415 \u0414\u0415\u041b\u0410\u0415\u0422:\n- \u041d\u0415 \u043f\u0438\u0448\u0435\u0442 \u0432 \u0431\u0438\u0437\u043d\u0435\u0441-\u0432\u043a\u043b\u0430\u0434\u043a\u0438 (results/review_queue/monitor_queue/content_queue/skipped_log/technical_errors) \u2014 \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442 Workflow 08.\n- \u041d\u0415 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 Apify \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e (fixture_mode=true), \u041d\u0415 Firecrawl, \u041d\u0415 Claude.\n- \u041d\u0415 \u0430\u0432\u0442\u043e-\u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 Workflow 08. \u0425\u044d\u043d\u0434\u043e\u0444\u0444 \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u0440\u0443\u0447\u043d\u0443\u044e.\n- \u041d\u0415 Telegram/Instagram/VK/Dzen \u043f\u0430\u0440\u0441\u0435\u0440, \u041d\u0415 Telegram-\u0431\u043e\u0442, \u041d\u0415 \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u0435. active=false.\n\n\u0424\u0418\u041b\u042c\u0422\u0420 \u0411\u0418\u0417\u041d\u0415\u0421-\u0420\u0415\u041b\u0415\u0412\u0410\u041d\u0422\u041d\u041e\u0421\u0422\u0418 (DEC-095): \u0440\u0435\u043b\u0435\u0432\u0430\u043d\u0442\u043d\u043e\u0441\u0442\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u0422\u041e\u041b\u042c\u041a\u041e \u043f\u043e evidence \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u044f (title + description + \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 slug URL + category). \u041f\u043e\u0438\u0441\u043a\u043e\u0432\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \u0441\u0430\u043c \u043f\u043e \u0441\u0435\u0431\u0435 \u041d\u0418\u041a\u041e\u0413\u0414\u0410 \u043d\u0435 \u0434\u0435\u043b\u0430\u0435\u0442 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u0440\u0435\u043b\u0435\u0432\u0430\u043d\u0442\u043d\u044b\u043c. Live: hard-negative (\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 \u041e\u041e\u041e / \u0431\u0443\u0445\u0433\u0430\u043b\u0442\u0435\u0440\u0438\u044f / \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 / \u042d\u0426\u041f / \u0430\u0440\u0435\u043d\u0434\u0430 \u043e\u0444\u0438\u0441\u0430\u2026) \u0431\u0435\u0437 \u0441\u0438\u043b\u044c\u043d\u043e\u0433\u043e \u043a\u0440\u0435\u0434\u0438\u0442\u043d\u043e\u0433\u043e evidence \u2192 hard_skipped \u2014 \u041d\u0415 \u043f\u0438\u0448\u0435\u0442\u0441\u044f \u0432 raw_market_records \u0438 market_record_registry \u0438 \u041d\u0415 \u0440\u0430\u0441\u0445\u043e\u0434\u0443\u0435\u0442 pipeline_limit. pipeline_limit=10 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043a \u043f\u0440\u0438\u043d\u044f\u0442\u044b\u043c \u0431\u0438\u0437\u043d\u0435\u0441-\u0440\u0435\u043b\u0435\u0432\u0430\u043d\u0442\u043d\u044b\u043c \u0437\u0430\u043f\u0438\u0441\u044f\u043c. Fixture-\u043f\u0443\u0442\u044c \u043d\u0435 \u0438\u0437\u043c\u0435\u043d\u0451\u043d (6 \u0437\u0430\u043f\u0438\u0441\u0435\u0439, POS-\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c \u2192 skipped_log).",
"height": 720,
"width": 600,
"color": 4
}
},
{
"id": "a9000000-0000-0000-0000-0000000000n2",
"name": "Setup and Test Note RU",
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
160,
-260
],
"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).\n2. \u0412\u043a\u043b\u0430\u0434\u043a\u0438 \u0443\u0436\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u044b (Stage 3.1): agent_requests (21), raw_market_records (40), market_record_registry (15).\n3. \u041f\u041e\u0421\u041b\u0415 \u0418\u041c\u041f\u041e\u0420\u0422\u0410 \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 \u043d\u043e\u0434\u0430\u0445 (Read market_record_registry, Append agent_requests, Append raw_market_records, Append market_record_registry) \u2192 Google Sheets - Marketing Scout Service Account.\n4. \u0417\u0430\u043c\u0435\u043d\u0438\u0442\u044c PASTE_SPREADSHEET_ID_HERE \u043d\u0430 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0439 Spreadsheet ID \u043d\u0430 \u0432\u0441\u0435\u0445 Google Sheets \u043d\u043e\u0434\u0430\u0445.\n5. Apify \u043d\u043e\u0434\u0430 \u041d\u0415 \u043d\u0443\u0436\u043d\u0430 \u0434\u043b\u044f fixture-\u0442\u0435\u0441\u0442\u0430 \u0438 \u041d\u0415 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u0438 fixture_mode=true. \u0414\u043b\u044f live: \u0437\u0430\u0434\u0430\u0442\u044c apify_actor_id, \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u0442\u044c Apify \u043a\u0440\u0435\u0434\u0435\u043d\u0448\u043b (\u0438\u043b\u0438 \u0442\u043e\u043a\u0435\u043d), \u0438 \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c fixture_mode=false + live_mode=true.\n\n\u0422\u0435\u0441\u0442 1 (fixture, \u043f\u0443\u0441\u0442\u043e\u0439 \u0440\u0435\u0435\u0441\u0442\u0440):\n- fixture_mode=true. Execute once.\n- \u041e\u0436\u0438\u0434\u0430\u0435\u043c\u043e: 6 \u0441\u0442\u0440\u043e\u043a \u0432 raw_market_records; 6 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u0432 market_record_registry; 1 agent_requests (status=completed); 5 competitor (monitor_queue \u043f\u0440\u043e\u0433\u043d\u043e\u0437) + 1 irrelevant (skipped_log \u043f\u0440\u043e\u0433\u043d\u043e\u0437).\n\n\u0422\u0435\u0441\u0442 2 (fixture, \u043f\u043e\u0432\u0442\u043e\u0440):\n- Execute \u0441\u043d\u043e\u0432\u0430 \u2192 \u0432\u0441\u0435 6 dedup_status=duplicate_in_registry, approval_status=duplicate; raw +6 (\u0430\u0443\u0434\u0438\u0442 \u043f\u0440\u0438 write_duplicate_audit=true); \u0440\u0435\u0435\u0441\u0442\u0440 +0.\n\n\u0422\u0435\u0441\u0442 3 (\u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e, live Apify, max_items=5):\n- fixture_mode=false, live_mode=true, apify_actor_id \u0437\u0430\u0434\u0430\u043d. \u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c Apify. 0 Firecrawl/Claude.\n\n\u0422\u0435\u0441\u0442 4 (\u0445\u044d\u043d\u0434\u043e\u0444\u0444):\n- \u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c Workflow 08 \u0412\u0420\u0423\u0427\u041d\u0423\u042e \u043d\u0430 \u0441\u043e\u0431\u0440\u0430\u043d\u043d\u044b\u0445 raw_market_records. \u0410\u0432\u0442\u043e-\u0445\u044d\u043d\u0434\u043e\u0444\u0444\u0430 \u043d\u0435\u0442.\n\n\u0421\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c: fixture = $0. live = \u0442\u043e\u043b\u044c\u043a\u043e Apify actor. \u0410\u043d\u0430\u043b\u0438\u0437\u0430 \u0437\u0434\u0435\u0441\u044c \u043d\u0435\u0442 ($0).\n\nLIVE SMOKE (DEC-095): actor_limit=10 (\u0432 Apify), pipeline_limit=10 (\u0431\u0438\u0437\u043d\u0435\u0441-\u0440\u0435\u043b\u0435\u0432\u0430\u043d\u0442\u043d\u044b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438). Hard-negative live false positives (\u044e\u0440. \u0430\u0434\u0440\u0435\u0441, POS-\u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b \u0438 \u0442.\u043f.) \u0441\u0447\u0438\u0442\u0430\u044e\u0442\u0441\u044f \u0432 hard_skipped_items \u0438 \u043d\u0435 \u043f\u0438\u0448\u0443\u0442\u0441\u044f. result_summary: actor_items_received / structurally_valid_items / invalid_items / business_relevant_items / hard_skipped_items / unique / duplicates / over_pipeline_limit.",
"height": 720,
"width": 600,
"color": 4
}
},
{
"id": "a9000000-0000-0000-0000-0000000000ap",
"name": "Apify Note RU",
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
800,
-260
],
"parameters": {
"content": "## Apify Avito/Classifieds Actor Request (live only)\n\n\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0422\u041e\u041b\u042c\u041a\u041e \u043a\u043e\u0433\u0434\u0430 fixture_mode=false (\u0432\u0435\u0442\u043a\u0430 ELSE \u0438\u0437 IF). \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u041d\u0415 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f.\n\n- URL: https://api.apify.com/v2/acts/PASTE_AVITO_ACTOR_ID/run-sync-get-dataset-items\n- \u041c\u0435\u0442\u043e\u0434: POST, \u0442\u0435\u043b\u043e JSON \u0441\u043e search_queries + maxItems \u0438\u0437 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438.\n- \u0410\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f: \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u0442\u044c Apify \u043a\u0440\u0435\u0434\u0435\u043d\u0448\u043b (HTTP Header Auth) \u0418\u041b\u0418 \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0442\u043e\u043a\u0435\u043d \u0432 query (?token=...). \u0412 \u0444\u0430\u0439\u043b\u0435 \u041d\u0415\u0422 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0442\u043e\u043a\u0435\u043d\u0430/\u043a\u043b\u044e\u0447\u0430.\n- onError=continueRegularOutput: \u043f\u0440\u0438 \u0441\u0431\u043e\u0435 actor \u043d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u043e\u043b\u0443\u0447\u0438\u0442 \u043f\u0443\u0441\u0442\u043e, \u043f\u0440\u043e\u0433\u043e\u043d \u043d\u0435 \u0443\u043f\u0430\u0434\u0451\u0442.\n\n\u0411\u0415\u0417\u041e\u041f\u0410\u0421\u041d\u041e\u0421\u0422\u042c: \u043d\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c live \u0431\u0435\u0437 \u044f\u0432\u043d\u043e\u0433\u043e \u043e\u0434\u043e\u0431\u0440\u0435\u043d\u0438\u044f \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430 \u0438 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0433\u043e actor. \u041d\u0435 \u0441\u043a\u0440\u0435\u0439\u043f\u0438\u0442\u044c Avito \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e. \u0421\u043e\u0431\u043b\u044e\u0434\u0430\u0442\u044c ToS \u043f\u043b\u043e\u0449\u0430\u0434\u043a\u0438.",
"height": 320,
"width": 440,
"color": 5
}
},
{
"id": "a9000000-0000-0000-0000-000000000002",
"name": "Manual Start",
"type": "n8n-nodes-base.manualTrigger",
"typeVersion": 1,
"position": [
120,
520
],
"parameters": {}
},
{
"id": "a9000000-0000-0000-0000-0000000000cf",
"name": "Set Avito Connector Config",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
340,
520
],
"parameters": {
"jsCode": "// Avito/Classifieds connector config. Deterministic ids; MSK timestamps; no external calls.\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();\n// --- S3-D24 multi-query planner: declared search_queries MUST drive actor discovery, not a single URL.\nconst SEARCH_QUERIES=['\u043a\u0440\u0435\u0434\u0438\u0442\u043d\u044b\u0439 \u0431\u0440\u043e\u043a\u0435\u0440 \u041c\u043e\u0441\u043a\u0432\u0430','\u043f\u043e\u043c\u043e\u0449\u044c \u0432 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0438 \u043a\u0440\u0435\u0434\u0438\u0442\u0430 \u041c\u043e\u0441\u043a\u0432\u0430','\u043a\u0440\u0435\u0434\u0438\u0442 \u043f\u043e\u0441\u043b\u0435 \u043e\u0442\u043a\u0430\u0437\u043e\u0432 \u041c\u043e\u0441\u043a\u0432\u0430','\u043a\u0440\u0435\u0434\u0438\u0442\u043d\u044b\u0439 \u0431\u0440\u043e\u043a\u0435\u0440 \u0434\u043b\u044f \u0431\u0438\u0437\u043d\u0435\u0441\u0430 \u041c\u043e\u0441\u043a\u0432\u0430','\u043f\u043e\u043c\u043e\u0449\u044c \u0441 \u043a\u0440\u0435\u0434\u0438\u0442\u043e\u043c \u0418\u041f'];\nconst REGION='\u041c\u043e\u0441\u043a\u0432\u0430/\u041c\u041e';\nconst ACTOR_LIMIT=10; // overall batch limit across ALL queries\nfunction _slug(r){r=String(r||'').toLowerCase();return (r.indexOf('\u043c\u043e\u0441\u043a\u0432\u0430')>=0)?'moskva':'moskva';}\nconst _overall=ACTOR_LIMIT;\nconst _n=Math.max(1,Math.min(SEARCH_QUERIES.length,_overall)); // never plan more queries than the overall cap\nconst _base=Math.floor(_overall/_n);let _rem=_overall-_base*_n;\nconst _plan=SEARCH_QUERIES.slice(0,_n).map(function(q,i){var a=_base+(_rem>0?1:0);if(_rem>0)_rem--;return {query_index:i+1,search_query:q,source_search_url:'https://www.avito.ru/'+_slug(REGION)+'/predlozheniya_uslug?q='+encodeURIComponent(q),allocation:Math.max(1,a)};});\nconst _startUrls=_plan.map(function(p){return p.source_search_url;});\n// Patch 5: actor_start_urls (url+userData) is kept ONLY for internal mapping/tests. The live Apify actor\n// (fatihtahta~avito-russia-scraper) receives plain string start_urls; per-record query origin is recovered in\n// Normalize from the actor parentSourceUrl matched against query_plan (NOT from these userData objects).\nconst _actorStartUrls=_plan.map(function(p){return {url:p.source_search_url,userData:{search_query:p.search_query,source_search_url:p.source_search_url,query_index:p.query_index}};});\nvar base = ({\n fixture_mode:true,\n live_mode:false, // \u00a78.1 live Apify requires fixture_mode=false AND live_mode=true AND approval token AND budget\n data_mode:'fixture', // fixture | live | manual_test \u2014 set with the mode you actually run (\u00a713)\n require_approval_token:true, // \u00a78.1 paid live path is BLOCKED unless approval_token === expected_approval_token\n approval_token:'', // operator pastes the one-time token here ONLY for an approved live run (value never logged)\n expected_approval_token:'AVITO_LIVE_APPROVED', // guard compares against this; logs approval_token_used=yes/no only\n max_budget_usd:0.50, // \u00a78.1 hard cost guard for a live run\n source_type:'classified',\n platform:'avito',\n requested_by:'operator',\n request_type:'classified_competitor_discovery',\n region:REGION,\n service_focus:'credit_broker',\n search_queries:SEARCH_QUERIES,\n start_urls:_startUrls,\n actor_start_urls:_actorStartUrls,\n query_plan:_plan,\n query_count:_plan.length,\n overall_max_items:_overall,\n per_query_allocation:Math.max(1,_base),\n max_items:6,\n actor_limit:_overall,\n pipeline_limit:10,\n live_max_items: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 duplicate_next_action:'monitor_duplicate',\n apify_actor_id:'fatihtahta~avito-russia-scraper',\n proxy_config:{useApifyProxy:true,apifyProxyGroups:['RESIDENTIAL']}, // AVITO-PROXY-001: Avito anti-bot -> residential proxy\n detail_enrichment_enabled:false, // \u00a78.4 detail transport is STAGED/DISABLED; degraded discovery cards are preserved, not invented\n detail_transport:'apify_detail_actor', // documented transport name; no live call without approval\n apify_token_placeholder:'PASTE_APIFY_TOKEN_OR_USE_CREDENTIAL',\n spreadsheet_id_placeholder:'PASTE_SPREADSHEET_ID',\n agent_request_id:'avito_req_'+stamp,\n run_id:'avito_'+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 Apify Safety Gate (fixture stays the default when data_mode!=='live').\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 __qs=String(__ci.search_queries||'').split(/[;|]/).map(function(s){return s.trim();}).filter(Boolean).slice(0,3);\n if(!__qs.length)__qs=base.search_queries.slice(0,3);\n var __per=Math.min(Math.max(1,Number(__ci.max_items)||30),30);\n var __overall=Math.min(__per*__qs.length,90);\n var __mk=function(q){return 'https://www.avito.ru/moskva/predlozheniya_uslug?q='+encodeURIComponent(q);};\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.approval_token=String(__ci.approval_token||'');\n base.max_budget_usd=Math.min((Number(__ci.max_budget_usd)>0?Number(__ci.max_budget_usd):base.max_budget_usd),1);\n base.search_queries=__qs;\n base.query_plan=__qs.map(function(q,i){return {query_index:i+1,search_query:q,source_search_url:__mk(q),allocation:__per};});\n base.start_urls=base.query_plan.map(function(pp){return pp.source_search_url;});\n base.actor_start_urls=base.query_plan.map(function(pp){return {url:pp.source_search_url,userData:{search_query:pp.search_query,source_search_url:pp.source_search_url,query_index:pp.query_index}};});\n base.query_count=__qs.length;\n base.per_query_allocation=__per;\n base.max_items=__per;\n base.live_max_items=__overall;\n base.actor_limit=__overall;\n base.overall_max_items=__overall;\n base.pipeline_limit=__overall;\n}\nreturn [{ json: base }];\n"
}
},
{
"id": "a9000000-0000-0000-0000-0000000000if",
"name": "IF fixture_mode?",
"type": "n8n-nodes-base.if",
"typeVersion": 2,
"position": [
560,
520
],
"parameters": {
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "loose",
"version": 2
},
"conditions": [
{
"id": "cond-fixture-mode",
"leftValue": "={{ $json.fixture_mode }}",
"rightValue": "",
"operator": {
"type": "boolean",
"operation": "true",
"singleValue": true
}
}
],
"combinator": "and"
},
"options": {}
}
},
{
"id": "a9000000-0000-0000-0000-0000000000bf",
"name": "Build Fixture Avito Listings",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
820,
400
],
"parameters": {
"jsCode": "// Avito/classified listing fixtures. No external calls. In fixture mode max_items = total emitted records\n// (competitor listings + the optional irrelevant control record). DEC-092.\nconst cfg=$('Set Avito Connector Config').first().json;\nconst maxItems=Number(cfg.max_items)||6;\nconst includeControl=(cfg.include_irrelevant_control_fixture!==false);\nconst competitors=[\n { listing_id:'4379480780', title:'\u041f\u043e\u043c\u043e\u0449\u044c \u0432 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0438 \u043a\u0440\u0435\u0434\u0438\u0442\u0430. \u041a\u0440\u0435\u0434\u0438\u0442\u043d\u044b\u0439 \u0431\u0440\u043e\u043a\u0435\u0440', description:'\u041f\u043e\u043c\u043e\u0436\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043a\u0440\u0435\u0434\u0438\u0442 \u0444\u0438\u0437\u043b\u0438\u0446\u0430\u043c \u0438 \u0431\u0438\u0437\u043d\u0435\u0441\u0443. \u0420\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u043f\u043e \u0434\u043e\u0433\u043e\u0432\u043e\u0440\u0443, \u043e\u043f\u043b\u0430\u0442\u0430 \u0437\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442. \u0421\u043b\u043e\u0436\u043d\u044b\u0435 \u0441\u043b\u0443\u0447\u0430\u0438, \u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u0441\u0443\u043c\u043c\u044b.', url:'https://www.avito.ru/moskva/predlozheniya_uslug/pomosch_v_poluchenii_kredita_kreditnyy_broker_4379480780', price:'\u043e\u0442 30 000 \u20bd', location:'\u041c\u043e\u0441\u043a\u0432\u0430', seller_name:'\u0424\u0438\u043d\u0430\u043d\u0441 \u0413\u0440\u0443\u043f\u043f', seller_url:'https://www.avito.ru/user/abc12300/profile', category:'\u041f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0443\u0441\u043b\u0443\u0433', published_at:'', query:'\u043a\u0440\u0435\u0434\u0438\u0442\u043d\u044b\u0439 \u0431\u0440\u043e\u043a\u0435\u0440 \u041c\u043e\u0441\u043a\u0432\u0430' },\n { listing_id:'7961833832', title:'\u041a\u0440\u0435\u0434\u0438\u0442\u043d\u044b\u0439 \u0431\u0440\u043e\u043a\u0435\u0440. \u0420\u0435\u0430\u043b\u044c\u043d\u0430\u044f \u043f\u043e\u043c\u043e\u0449\u044c \u0441 \u043a\u0440\u0435\u0434\u0438\u0442\u0430\u043c\u0438', description:'\u0420\u0435\u0430\u043b\u044c\u043d\u0430\u044f \u043f\u043e\u043c\u043e\u0449\u044c \u0441 \u043a\u0440\u0435\u0434\u0438\u0442\u0430\u043c\u0438 \u043f\u0440\u0438 \u043e\u0442\u043a\u0430\u0437\u0430\u0445 \u0431\u0430\u043d\u043a\u043e\u0432. \u041a\u043e\u043d\u0441\u0443\u043b\u044c\u0442\u0430\u0446\u0438\u044f \u043e\u0442 500 \u20bd. \u041c\u043e\u0441\u043a\u0432\u0430 \u0438 \u043e\u0431\u043b\u0430\u0441\u0442\u044c, \u0431\u0435\u0437 \u043f\u0440\u0435\u0434\u043e\u043f\u043b\u0430\u0442\u044b.', url:'https://www.avito.ru/moskva/predlozheniya_uslug/kreditnyy_broker_realnaya_pomosch_7961833832', price:'\u043e\u0442 500 \u20bd', location:'\u041c\u043e\u0441\u043a\u0432\u0430', seller_name:'\u041a\u0440\u0435\u0434\u0438\u0442\u042d\u043a\u0441\u043f\u0435\u0440\u0442', seller_url:'https://www.avito.ru/user/def45600/profile', category:'\u041f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0443\u0441\u043b\u0443\u0433', published_at:'', query:'\u043f\u043e\u043c\u043e\u0449\u044c \u0432 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0438 \u043a\u0440\u0435\u0434\u0438\u0442\u0430 \u041c\u043e\u0441\u043a\u0432\u0430' },\n { listing_id:'5521099004', title:'\u041a\u0440\u0435\u0434\u0438\u0442 \u0434\u043b\u044f \u0431\u0438\u0437\u043d\u0435\u0441\u0430, \u0418\u041f \u0438 \u041e\u041e\u041e. \u041a\u0440\u0435\u0434\u0438\u0442\u043d\u044b\u0439 \u0431\u0440\u043e\u043a\u0435\u0440', description:'\u041f\u0440\u0438\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u0444\u0438\u043d\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u043b\u044f \u0418\u041f \u0438 \u041e\u041e\u041e: \u043e\u0431\u043e\u0440\u043e\u0442\u043d\u044b\u0435 \u043a\u0440\u0435\u0434\u0438\u0442\u044b, \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. \u041f\u043e\u043c\u043e\u0436\u0435\u043c \u0441 \u043f\u0430\u043a\u0435\u0442\u043e\u043c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432.', url:'https://www.avito.ru/moskva/predlozheniya_uslug/kredit_dlya_biznesa_ip_ooo_5521099004', price:'\u043e\u0442 15 000 \u20bd', location:'\u041c\u043e\u0441\u043a\u0432\u0430', seller_name:'\u0411\u0438\u0437\u043d\u0435\u0441\u0424\u0438\u043d\u0430\u043d\u0441 \u041a\u043e\u043d\u0441\u0430\u043b\u0442', seller_url:'https://www.avito.ru/user/ghi78900/profile', category:'\u041f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0443\u0441\u043b\u0443\u0433', published_at:'', query:'\u043a\u0440\u0435\u0434\u0438\u0442\u043d\u044b\u0439 \u0431\u0440\u043e\u043a\u0435\u0440 \u0434\u043b\u044f \u0431\u0438\u0437\u043d\u0435\u0441\u0430 \u041c\u043e\u0441\u043a\u0432\u0430' },\n { listing_id:'6610233771', title:'\u041a\u0440\u0435\u0434\u0438\u0442 \u043f\u043e\u0441\u043b\u0435 \u043e\u0442\u043a\u0430\u0437\u043e\u0432 \u0431\u0430\u043d\u043a\u043e\u0432. \u041f\u043e\u043c\u043e\u0436\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c', description:'\u041f\u043e\u043c\u043e\u0436\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043a\u0440\u0435\u0434\u0438\u0442 \u043f\u043e\u0441\u043b\u0435 \u043e\u0442\u043a\u0430\u0437\u043e\u0432, \u0441 \u043f\u0440\u043e\u0441\u0440\u043e\u0447\u043a\u0430\u043c\u0438 \u0438 \u043f\u043b\u043e\u0445\u043e\u0439 \u043a\u0440\u0435\u0434\u0438\u0442\u043d\u043e\u0439 \u0438\u0441\u0442\u043e\u0440\u0438\u0435\u0439. \u0418\u043d\u0434\u0438\u0432\u0438\u0434\u0443\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u043e\u0434\u0431\u043e\u0440 \u0431\u0430\u043d\u043a\u0430.', url:'https://www.avito.ru/moskva/predlozheniya_uslug/kredit_posle_otkazov_bankov_6610233771', price:'', location:'\u041c\u043e\u0441\u043a\u0432\u0430', seller_name:'\u041e\u0434\u043e\u0431\u0440\u0435\u043d\u0438\u043524', seller_url:'https://www.avito.ru/user/jkl01200/profile', category:'\u041f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0443\u0441\u043b\u0443\u0433', published_at:'', query:'\u043a\u0440\u0435\u0434\u0438\u0442 \u043f\u043e\u0441\u043b\u0435 \u043e\u0442\u043a\u0430\u0437\u043e\u0432 \u041c\u043e\u0441\u043a\u0432\u0430' },\n { listing_id:'7188450923', title:'\u0418\u043f\u043e\u0442\u0435\u0447\u043d\u044b\u0439 \u0431\u0440\u043e\u043a\u0435\u0440. \u0420\u0435\u0444\u0438\u043d\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438\u043f\u043e\u0442\u0435\u043a\u0438', description:'\u041f\u043e\u0434\u0431\u043e\u0440 \u0438 \u043e\u0434\u043e\u0431\u0440\u0435\u043d\u0438\u0435 \u0438\u043f\u043e\u0442\u0435\u043a\u0438, \u0440\u0435\u0444\u0438\u043d\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u043a\u0440\u0435\u0434\u0438\u0442\u043e\u0432, \u0441\u043d\u0438\u0436\u0435\u043d\u0438\u0435 \u0441\u0442\u0430\u0432\u043a\u0438. \u0420\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u0441 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e\u043c \u0431\u0430\u043d\u043a\u043e\u0432.', url:'https://www.avito.ru/moskva/predlozheniya_uslug/ipotechnyy_broker_refinansirovanie_7188450923', price:'\u043e\u0442 10 000 \u20bd', location:'\u041c\u043e\u0441\u043a\u0432\u0430', seller_name:'\u0418\u043f\u043e\u0442\u0435\u043a\u0430 \u041f\u0440\u043e\u0441\u0442\u043e', seller_url:'https://www.avito.ru/user/mno34500/profile', category:'\u041f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0443\u0441\u043b\u0443\u0433', published_at:'', query:'\u0438\u043f\u043e\u0442\u0435\u0447\u043d\u044b\u0439 \u0431\u0440\u043e\u043a\u0435\u0440 \u0440\u0435\u0444\u0438\u043d\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u041c\u043e\u0441\u043a\u0432\u0430' }\n];\nconst control={ listing_id:'3300771199', title:'\u041f\u0440\u043e\u0434\u0430\u043c POS-\u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b \u0434\u043b\u044f \u044d\u043a\u0432\u0430\u0439\u0440\u0438\u043d\u0433\u0430, \u0431/\u0443', description:'\u041f\u0440\u043e\u0434\u0430\u0451\u0442\u0441\u044f \u0431/\u0443 POS-\u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b \u0434\u043b\u044f \u043f\u0440\u0438\u0451\u043c\u0430 \u043a\u0430\u0440\u0442. \u0420\u0430\u0431\u043e\u0447\u0438\u0439, \u0432 \u043a\u043e\u043c\u043f\u043b\u0435\u043a\u0442\u0435 \u0431\u043b\u043e\u043a \u043f\u0438\u0442\u0430\u043d\u0438\u044f. \u0421\u0430\u043c\u043e\u0432\u044b\u0432\u043e\u0437, \u041c\u043e\u0441\u043a\u0432\u0430.', url:'https://www.avito.ru/moskva/oborudovanie_dlya_biznesa/pos-terminal_dlya_ekvayringa_3300771199', price:'4 500 \u20bd', location:'\u041c\u043e\u0441\u043a\u0432\u0430', seller_name:'\u0427\u0430\u0441\u0442\u043d\u043e\u0435 \u043b\u0438\u0446\u043e', seller_url:'https://www.avito.ru/user/pqr67800/profile', category:'\u041e\u0431\u043e\u0440\u0443\u0434\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u043b\u044f \u0431\u0438\u0437\u043d\u0435\u0441\u0430', published_at:'', query:'\u043a\u0440\u0435\u0434\u0438\u0442\u043d\u044b\u0439 \u0431\u0440\u043e\u043a\u0435\u0440 \u041c\u043e\u0441\u043a\u0432\u0430' };\nlet chosen;\nif(includeControl){ chosen=competitors.slice(0,Math.max(0,maxItems-1)); if(chosen.length<maxItems) chosen=chosen.concat([control]); }\nelse { chosen=competitors.slice(0,maxItems); }\nreturn chosen.map((r,i)=>({ json: Object.assign({ _index:i+1, _source:'fixture' }, r) }));"
}
},
{
"id": "a9000000-0000-0000-0000-0000000000aq0",
"name": "Apify Avito Classifieds Actor Request",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [
820,
640
],
"alwaysOutputData": true,
"onError": "continueRegularOutput",
"parameters": {
"method": "POST",
"url": "=https://api.apify.com/v2/acts/{{ $json.apify_actor_id }}/run-sync-get-dataset-items",
"sendBody": true,
"specifyBody": "json",
"jsonBody": "={\n \"limit\": {{ $json.actor_limit || 10 }},\n \"startUrls\": {{ JSON.stringify($json.start_urls) }},\n \"proxyConfiguration\": {{ JSON.stringify($json.proxy_config || {\"useApifyProxy\":true}) }}\n}",
"options": {},
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth"
},
"credentials": {
"httpHeaderAuth": {
"name": "<your credential>"
}
}
},
{
"id": "a9000000-0000-0000-0000-0000000000nz",
"name": "Normalize Avito Listings",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
1100,
520
],
"parameters": {
"jsCode": "// Deterministic normalization of Avito/classified listings into raw_market_records shape. No LLM, no external calls.\n// DEC-092: richer service_hint + concrete keyword phrases. DEC-094: strict valid-listing guard.\n// DEC-095: live BUSINESS RELEVANCE FILTER \u2014 relevance is judged ONLY on listing evidence\n// (title + description + decoded URL slug + category). The search query alone NEVER makes a listing\n// relevant; query-only / hard-negative live items are marked hard_skip and are not written downstream.\nfunction str(v){return v==null?'':String(v).trim();}\nfunction low(v){return str(v).toLowerCase();}\nfunction any(b,arr){for(const w of arr){if(b.indexOf(w)>=0)return true;}return false;}\nfunction hits(b,arr){const out=[];for(const w of arr){if(b.indexOf(w)>=0)out.push(w);}return out;}\n// Sandbox-safe URL helpers (DEC-103): pure regex/string, no URL-constructor dependency \u2014 the n8n Code-node\n// sandbox may not expose the URL global; the old try/catch fallback silently kept tracking query params\n// (?context=...) in live runs and blanked the decoded-slug relevance evidence.\nfunction normUrl(u){u=str(u);if(!u)return '';u=u.split('#')[0];var m=u.match(/^(https?):\\/\\/([^\\/?]+)([^?]*)(\\?.*)?$/i);if(!m)return u.toLowerCase();var path=m[3]||'/';if(path.length>1&&path.slice(-1)==='/')path=path.slice(0,-1);return m[1].toLowerCase()+'://'+m[2].toLowerCase()+(path||'/')+(m[4]||'');}\n// Canonical Avito listing URL: strip query/hash ONLY when the path carries a listing id (safe).\nfunction canonUrl(u){u=str(u);if(!u)return '';var base=u.split('#')[0].split('?')[0];if(base.length>1&&base.slice(-1)==='/')base=base.slice(0,-1);var path=base.replace(/^https?:\\/\\/[^\\/]+/i,'');if(/_(\\d{6,})$/.test(path)||/\\/(\\d{7,})$/.test(path)){return base;}return u;}\n// Decoded URL slug (\"yuridicheskiy_adres_dlya_ooo_\u2026\" -> \"yuridicheskiy adres dlya ooo \u2026\") as relevance evidence.\nfunction slugText(u){u=str(u);if(!u)return '';var path=u.split('#')[0].split('?')[0].replace(/^https?:\\/\\/[^\\/]+/i,'');var segs=path.split('/').filter(Boolean);var s=segs.length?segs[segs.length-1]:'';s=s.replace(/_\\d{6,}$/,'');return s.replace(/[_-]+/g,' ').toLowerCase();}\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 cut(s,n){s=str(s);return s.length>n?s.slice(0,n):s;}\nfunction detectPlaceholderTitle(t){t=str(t);if(!t)return false;if(/\u0435\u0449[\u0435\u0451]\\s*\\d+\\s*\u0444\u043e\u0442\u043e/i.test(t))return true;if(/^\\s*\\+?\\d+\\s*\u0444\u043e\u0442\u043e\\s*$/i.test(t))return true;if(/^\\s*\\d+\\s*(\u0444\u043e\u0442\u043e|photos?|images?)\\s*$/i.test(t))return true;return false;}\nfunction kwHit(blob,tok){ if(tok.length<=3){ return new RegExp('(^|[^\u0430-\u044f\u0451a-z0-9])'+tok+'([^\u0430-\u044f\u0451a-z0-9]|$)','i').test(blob);} return blob.indexOf(tok)>=0; }\n// [match token, display label]\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'],['\u0438\u043f\u043e\u0442\u0435\u0447\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','\u043f\u043e\u043c\u043e\u0449\u044c \u0432 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0438 \u043a\u0440\u0435\u0434\u0438\u0442\u0430'],['\u043f\u043e\u043c\u043e\u0449\u044c \u0441 \u043a\u0440\u0435\u0434\u0438\u0442','\u043f\u043e\u043c\u043e\u0449\u044c \u0441 \u043a\u0440\u0435\u0434\u0438\u0442\u043e\u043c'],['\u043f\u043e\u0441\u043b\u0435 \u043e\u0442\u043a\u0430\u0437\u043e\u0432','\u043f\u043e\u0441\u043b\u0435 \u043e\u0442\u043a\u0430\u0437\u043e\u0432'],['\u043e\u0442\u043a\u0430\u0437\u0430\u0445 \u0431\u0430\u043d\u043a','\u043e\u0442\u043a\u0430\u0437\u044b \u0431\u0430\u043d\u043a\u043e\u0432'],['\u043f\u043b\u043e\u0445\u043e\u0439 \u043a\u0440\u0435\u0434\u0438\u0442\u043d','\u043f\u043b\u043e\u0445\u0430\u044f \u043a\u0440\u0435\u0434\u0438\u0442\u043d\u0430\u044f \u0438\u0441\u0442\u043e\u0440\u0438\u044f'],['\u043f\u043b\u043e\u0445\u0430\u044f \u043a\u0440\u0435\u0434\u0438\u0442\u043d','\u043f\u043b\u043e\u0445\u0430\u044f \u043a\u0440\u0435\u0434\u0438\u0442\u043d\u0430\u044f \u0438\u0441\u0442\u043e\u0440\u0438\u044f'],['\u043f\u0440\u043e\u0441\u0440\u043e\u0447\u043a','\u043f\u0440\u043e\u0441\u0440\u043e\u0447\u043a\u0438'],['\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'],['\u043a\u043e\u043d\u0441\u0443\u043b\u044c\u0442\u0430\u0446\u0438','\u043a\u043e\u043d\u0441\u0443\u043b\u044c\u0442\u0430\u0446\u0438\u044f'],['\u043f\u043e\u0434\u0431\u043e\u0440 \u0431\u0430\u043d\u043a','\u043f\u043e\u0434\u0431\u043e\u0440 \u0431\u0430\u043d\u043a\u0430'],['\u043e\u0434\u043e\u0431\u0440\u0435\u043d\u0438\u0435','\u043e\u0434\u043e\u0431\u0440\u0435\u043d\u0438\u0435 \u043a\u0440\u0435\u0434\u0438\u0442\u0430'],['\u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u0441\u0443\u043c\u043c\u044b','\u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u0441\u0443\u043c\u043c\u044b'],['\u0438\u043f','\u0418\u041f'],['\u043e\u043e\u043e','\u041e\u041e\u041e'],['\u0431\u0438\u0437\u043d\u0435\u0441-\u043a\u0440\u0435\u0434\u0438\u0442','\u0431\u0438\u0437\u043d\u0435\u0441-\u043a\u0440\u0435\u0434\u0438\u0442'],['\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','\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','\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'],['\u0431\u0435\u0437 \u043f\u043e\u0440\u0443\u0447\u0438\u0442\u0435\u043b','\u0431\u0435\u0437 \u043f\u043e\u0440\u0443\u0447\u0438\u0442\u0435\u043b\u0435\u0439'],['\u0431\u0435\u0437 \u0441\u043f\u0440\u0430\u0432\u043e\u043a','\u0431\u0435\u0437 \u0441\u043f\u0440\u0430\u0432\u043e\u043a']];\nfunction extractKeywords(blob){ const seen={}; const out=[]; for(const pair of KW){ if(kwHit(blob,pair[0]) && !seen[pair[1]]){ seen[pair[1]]=1; out.push(pair[1]); } } return out.join(', '); }\n// ---- DEC-095 relevance term sets (Cyrillic + transliterated forms for decoded Avito slugs) ----\nconst STRONG_POS=['\u043a\u0440\u0435\u0434\u0438\u0442\u043d\u044b\u0439 \u0431\u0440\u043e\u043a\u0435\u0440','\u043a\u0440\u0435\u0434\u0438\u0442\u043d\u044b\u0435 \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','\u043f\u043e\u043c\u043e\u0449\u044c \u0441 \u043a\u0440\u0435\u0434\u0438\u0442','\u043a\u0440\u0435\u0434\u0438\u0442 \u043f\u043e\u0441\u043b\u0435 \u043e\u0442\u043a\u0430\u0437\u043e\u0432','\u043a\u0440\u0435\u0434\u0438\u0442\u044b \u043f\u043e\u0441\u043b\u0435 \u043e\u0442\u043a\u0430\u0437\u043e\u0432','\u0440\u0435\u0444\u0438\u043d\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438\u043f\u043e\u0442\u0435\u043a','\u043a\u0440\u0435\u0434\u0438\u0442 \u0434\u043b\u044f \u0431\u0438\u0437\u043d\u0435\u0441\u0430','\u043a\u0440\u0435\u0434\u0438\u0442\u044b \u0434\u043b\u044f \u0431\u0438\u0437\u043d\u0435\u0441\u0430','\u0431\u0430\u043d\u043a\u043e\u0432\u0441\u043a\u0438\u0435 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0438','\u0431\u0430\u043d\u043a\u043e\u0432\u0441\u043a\u0430\u044f \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u044f','kreditnyy broker','kreditnii broker','kreditny broker','ipotechnyy broker','ipotechnii broker','pomosch v poluchenii','pomoshch v poluchenii','pomosch s kreditom','kredit posle otkazov','refinansirovanie ipotek','kredit dlya biznesa','bankovskie garantii','bankovskaya garantiya'];\nconst WEAK_POS=['\u043a\u0440\u0435\u0434\u0438\u0442','\u0437\u0430\u0439\u043c','\u0437\u0430\u0439\u043c\u044b','\u0438\u043f\u043e\u0442\u0435\u043a','\u0440\u0435\u0444\u0438\u043d\u0430\u043d\u0441\u0438\u0440','\u043e\u0442\u043a\u0430\u0437\u043e\u0432 \u0431\u0430\u043d\u043a\u043e\u0432','\u043e\u0442\u043a\u0430\u0437\u044b \u0431\u0430\u043d\u043a\u043e\u0432','\u043f\u043b\u043e\u0445\u0430\u044f \u043a\u0440\u0435\u0434\u0438\u0442\u043d','\u043f\u043b\u043e\u0445\u043e\u0439 \u043a\u0440\u0435\u0434\u0438\u0442\u043d','\u043f\u0440\u043e\u0441\u0440\u043e\u0447\u043a','\u043e\u0434\u043e\u0431\u0440\u0435\u043d\u0438\u0435 \u043a\u0440\u0435\u0434\u0438\u0442','\u043f\u043e\u0434\u0431\u043e\u0440 \u0431\u0430\u043d\u043a','\u0431\u0438\u0437\u043d\u0435\u0441-\u043a\u0440\u0435\u0434\u0438\u0442','\u043e\u0431\u043e\u0440\u043e\u0442\u043d\u044b\u0435 \u043a\u0440\u0435\u0434\u0438\u0442','\u043e\u0431\u043e\u0440\u043e\u0442\u043d\u044b\u0439 \u043a\u0440\u0435\u0434\u0438\u0442','\u0442\u0435\u043d\u0434\u0435\u0440\u043d\u044b\u0435 \u0437\u0430\u0439\u043c','\u0442\u0435\u043d\u0434\u0435\u0440\u043d\u044b\u0439 \u0437\u0430\u0439\u043c','\u0444\u0438\u043d\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0431\u0438\u0437\u043d\u0435\u0441','\u043a\u0440\u0435\u0434\u0438\u0442\u043e\u0432\u0430\u043d','kredit','zaym','zaim','ipotek','refinansir','otkaz','prosrochk','odobrenie kredit','podbor banka','finansirovanie'];\nconst HARD_NEG=['\u044e\u0440\u0438\u0434\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0430\u0434\u0440\u0435\u0441','\u044e\u0440\u0438\u0434\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0430\u0434\u0440\u0435\u0441','\u044e\u0440 \u0430\u0434\u0440\u0435\u0441','\u044e\u0440. \u0430\u0434\u0440\u0435\u0441','\u0430\u0434\u0440\u0435\u0441 \u0434\u043b\u044f \u043e\u043e\u043e','\u0430\u0434\u0440\u0435\u0441 \u0434\u043b\u044f \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438','\u043d\u0435\u043c\u0430\u0441\u0441\u043e\u0432\u044b\u0439','\u043d\u0435 \u043c\u0430\u0441\u0441\u043e\u0432\u044b\u0439','\u043c\u0430\u0441\u0441\u043e\u0432\u044b\u0439 \u0430\u0434\u0440\u0435\u0441','\u043c\u0430\u0441\u0441\u043e\u0432\u044b\u0439 \u044e\u0440\u0438\u0434\u0438\u0447\u0435\u0441\u043a','\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','\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u043e\u043e\u043e','\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u0438\u043f','\u0431\u0443\u0445\u0433\u0430\u043b\u0442\u0435\u0440\u0441\u043a','\u0431\u0443\u0445\u0433\u0430\u043b\u0442\u0435\u0440\u0438','\u044d\u043a\u0432\u0430\u0439\u0440\u0438\u043d\u0433','pos-\u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b','pos \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b','\u043f\u043e\u0441-\u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b','\u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b','\u043e\u043d\u043b\u0430\u0439\u043d-\u043a\u0430\u0441\u0441','\u043a\u0430\u0441\u0441\u0430','\u043a\u0430\u0441\u0441\u0443','\u043a\u0430\u0441\u0441\u044b','\u043f\u0435\u0447\u0430\u0442\u044c','\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','\u044e\u0440\u0438\u0434\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0443\u0441\u043b\u0443\u0433\u0438','\u043e\u0431\u043e\u0440\u0443\u0434\u043e\u0432\u0430\u043d\u0438\u0435','yuridicheskiy adres','yuridichesky adres','yuridicheskii adres','adres dlya ooo','nemassovyy','ne massovyy','massovyy adres','massovyy yuridicheskiy','registratsiya ooo','registratsiya ip','buhgalter','bukhgalter','ekvayring','ekvairing','pos terminal','pos-terminal','terminal','kassa','onlayn kassa','pechat','shtamp','arenda ofisa','kovorking','yuridicheskie uslugi','oborudovanie'];\nfunction scoreRelevance(blob){\n const sp=hits(blob,STRONG_POS);\n const hn=hits(blob,HARD_NEG);\n const wp=hits(blob,WEAK_POS);\n if(sp.length)return {level:'strong_positive',matched:sp,hard_neg:hn};\n if(hn.length)return {level:'hard_negative',matched:hn,hard_neg:hn};\n if(wp.length)return {level:'weak_positive',matched:wp,hard_neg:[]};\n return {level:'none',matched:[],hard_neg:[]};\n}\nconst cfg=$('Set Avito Connector Config').first().json;\nconst fixtureMode=(cfg.fixture_mode===true||low(cfg.fixture_mode)==='true');\nconst defFocus=low(cfg.service_focus)||'credit_broker';\nconst region=str(cfg.region)||'\u041c\u043e\u0441\u043a\u0432\u0430/\u041c\u041e';\nconst items=$input.all().map(i=>i.json).filter(Boolean);\nconst out=[];\nfor(const r of items){\n // Field aliases: fixture fields OR varied live actor (fatihtahta~avito-russia-scraper) shapes. Do not invent data.\n const title=str(r.title||r.name||r.heading);\n const description=cut(str(r.description||r.text),800);\n const price=str(r.priceText||r.price||r.price_text);\n const location=str(r.location||r.address)||region;\n const seller_name=str(r.sellerName||r.seller||r.seller_name||r.userName);\n const seller_url=normUrl(r.seller_url||r.sellerUrl||r.profileUrl);\n const category=str(r.category);\n const urlRaw=str(r.url||r.sourceUrl||r.source_url||r.listingUrl||r.adUrl||r.link);\n const url=canonUrl(normUrl(urlRaw));\n const parentSourceUrl=str(r.parentSourceUrl);\n // \u00a78.2 query separation: search_query = human phrase; source_search_url = encoded URL. The encoded URL must\n // NEVER land in interest_topic/probable_need/semantic_keywords/offer text.\n let search_query_human=str(r.query)||str(r.search_query)||(r.userData?str(r.userData.search_query):'');\n let source_search_url=parentSourceUrl||(r.userData?str(r.userData.source_search_url):'');\n if(parentSourceUrl){\n const _pn=normUrl(parentSourceUrl);\n const _plan=Array.isArray(cfg.query_plan)?cfg.query_plan:[];\n for(const _p of _plan){ if(normUrl(str(_p.source_search_url))===_pn){ if(search_query_human==='')search_query_human=str(_p.search_query); if(source_search_url==='')source_search_url=str(_p.source_search_url); break; } }\n }\n // Patch 5 (Obj5): if the origin query is known but its URL is not, recover source_search_url from the\n // matching query_plan entry (its specific search URL) \u2014 never start_urls[0] / the concatenated query list.\n if(source_search_url===''&&search_query_human!==''){ const _plan2=Array.isArray(cfg.query_plan)?cfg.query_plan:[]; for(const _q of _plan2){ if(str(_q.search_query)===search_query_human){ source_search_url=str(_q.source_search_url); break; } } }\n if(/^https?:\\/\\//i.test(search_query_human)){ if(!source_search_url)source_search_url=search_query_human; search_query_human=''; }\n const query=search_query_human;\n // Obj2: exported origin is the SPECIFIC per-record query, else 'unknown' \u2014 never the concatenated query list.\n const search_query_origin=(str(search_query_human)!=='')?search_query_human:'unknown';\n const lidMatch=urlRaw.match(/_(\\d{6,})(?:[/?#]|$)/)||urlRaw.match(/\\/(\\d{7,})(?:[/?#]|$)/);\n const listing_id=str(r.listing_id||(lidMatch?lidMatch[1]:''));\n const published_at=str(r.validFrom||r.published_at);\n // DEC-094: strict valid-listing guard (live actor may return empty/search-only items).\n const startSet=new Set((Array.isArray(cfg.start_urls)?cfg.start_urls:[]).map(function(u){return normUrl(u);}));\n function looksLikeAvitoListing(u){\n if(!u)return false;\n if(!/^https?:\\/\\/(www\\.)?avito\\.ru\\//i.test(u))return false;\n if(startSet.has(u))return false;\n if(/[?&]q=/i.test(u))return false;\n if(!/_(\\d{6,})(?:[/?#]|$)/.test(u) && !/\\/(\\d{7,})(?:[/?#]|$)/.test(u))return false;\n return true;\n }\n const hasContent=(title!=='')||(description!=='')||(price!=='');\n const is_valid_listing=looksLikeAvitoListing(url)&&hasContent;\n let invalid_reason='';\n if(!is_valid_listing){\n if(!url)invalid_reason='no_listing_url';\n else if(!/^https?:\\/\\/(www\\.)?avito\\.ru\\//i.test(url))invalid_reason='not_avito_url';\n else if(startSet.has(url)||/[?&]q=/i.test(url))invalid_reason='search_or_start_url_not_a_listing';\n else if(!/_(\\d{6,})(?:[/?#]|$)/.test(url)&&!/\\/(\\d{7,})(?:[/?#]|$)/.test(url))invalid_reason='no_listing_id_in_url';\n else invalid_reason='no_title_price_or_description';\n }\n const classBlob=(title+' '+description+' '+category).toLowerCase();\n const kwBlob=(title+' '+description+' '+query).toLowerCase();\n // DEC-095: relevance evidence = title + description + decoded slug + category. Query is EXCLUDED on purpose.\n const slug=slugText(urlRaw);\n const evidenceBlob=(title+' '+description+' '+slug+' '+category).toLowerCase();\n const rel=scoreRelevance(evidenceBlob);\n let record_type_hint, touchpoint_type, predicted_route, predicted_entity_type, next_action, lead_temperature, confidence_score;\n let hard_skip=false, relevance_reason='';\n if(rel.level==='strong_positive'){\n record_type_hint='competitor_activity'; touchpoint_type='competitor_listing'; predicted_route='monitor_queue'; predicted_entity_type='competitor'; next_action='monitor'; lead_temperature='cold'; confidence_score=price?82:74;\n relevance_reason='strong credit/broker evidence: '+rel.matched.slice(0,4).join(', ')+(rel.hard_neg.length?(' (hard-neg terms also present: '+rel.hard_neg.slice(0,3).join(', ')+')'):'');\n } else if(rel.level==='hard_negative'){\n relevance_reason='hard-negative evidence without strong credit/broker evidence: '+rel.matched.slice(0,4).join(', ');\n touchpoint_type='irrelevant_source'; predicted_route='skipped_log'; predicted_entity_type='irrelevant'; next_action='ignore'; lead_temperature='none';\n if(fixtureMode){ record_type_hint='irrelevant'; confidence_score=40; }\n else { record_type_hint='irrelevant_live_false_positive'; confidence_score=30; hard_skip=true; }\n } else if(rel.level==='weak_positive'){\n record_type_hint='market_signal'; touchpoint_type='classified_offer'; predicted_route='content_queue'; predicted_entity_type='content_idea'; next_action='create_content'; lead_temperature='cold'; confidence_score=60;\n relevance_reason='weak finance evidence in title/description/slug/category: '+rel.matched.slice(0,4).join(', ');\n } else {\n relevance_reason='no listing-evidence relevance (query-only context rejected)';\n touchpoint_type='irrelevant_source'; predicted_route='skipped_log'; predicted_entity_type='irrelevant'; next_action='ignore'; lead_temperature='none';\n if(fixtureMode){ record_type_hint='irrelevant'; confidence_score=40; }\n else { record_type_hint='irrelevant_live_false_positive'; confidence_score=30; hard_skip=true; }\n }\n // \u00a78.2/\u00a78.3 search-card & placeholder quarantine: an Apify search card (isDetail=false) or an '\u0415\u0449\u0451 N \u0444\u043e\u0442\u043e'\n // placeholder is NOT a full listing. Mark it source_candidate + detail_fetch_required; never a competitor offer.\n const placeholder_title=detectPlaceholderTitle(title);\n const _isDetailRaw=(r.isDetail!==undefined?r.isDetail:(r.is_detail!==undefined?r.is_detail:undefined));\n const is_detail=(_isDetailRaw===true||low(_isDetailRaw)==='true');\n const _explicitNotDetail=(_isDetailRaw===false||low(_isDetailRaw)==='false');\n const search_card=_explicitNotDetail||((placeholder_title||description==='')&&(seller_name===''||published_at===''));\n const detail_fetch_required=placeholder_title||search_card;\n if(detail_fetch_required){\n record_type_hint='source_candidate'; touchpoint_type='search_card'; predicted_route='review_queue';\n predicted_entity_type='source_candidate'; next_action='enrich_detail'; lead_temperature='none';\n confidence_score=placeholder_title?20:30; hard_skip=false;\n relevance_reason='search_card_no_detail (isDetail=false / placeholder title); detail_fetch_required';\n }\n const isIrrelevant=(record_type_hint==='irrelevant'||record_type_hint==='irrelevant_live_false_positive');\n const competitor_related=(record_type_hint==='competitor_activity');\n const competitor_name=competitor_related?seller_name:'';\n // service_hint (DEC-092): business_credit only when \u0418\u041f/\u041e\u041e\u041e/business financing is EXPLICIT (not bare '\u0431\u0438\u0437\u043d\u0435\u0441\u0443').\n let service_hint=defFocus;\n if(isIrrelevant)service_hint='unknown';\n else if(any(classBlob,['\u0438\u043f\u043e\u0442\u0435\u043a','\u0440\u0435\u0444\u0438\u043d\u0430\u043d\u0441\u0438\u0440','\u0441\u043d\u0438\u0436\u0435\u043d\u0438\u0435 \u0441\u0442\u0430\u0432\u043a']))service_hint='mortgage_refinance';\n else if(any(classBlob,['\u0434\u043b\u044f \u0431\u0438\u0437\u043d\u0435\u0441\u0430','\u0438\u043f \u0438 \u043e\u043e\u043e','\u043e\u0431\u043e\u0440\u043e\u0442\u043d','\u0442\u0435\u043d\u0434\u0435\u0440\u043d','\u0431\u0430\u043d\u043a\u043e\u0432\u0441\u043a','\u0431\u0438\u0437\u043d\u0435\u0441-\u043a\u0440\u0435\u0434\u0438\u0442']))service_hint='business_credit';\n else if(any(classBlob,['\u043f\u043e\u0441\u043b\u0435 \u043e\u0442\u043a\u0430\u0437\u043e\u0432','\u043e\u0442\u043a\u0430\u0437\u0430\u0445 \u0431\u0430\u043d\u043a','\u043f\u0440\u043e\u0441\u0440\u043e\u0447\u043a','\u043f\u043b\u043e\u0445\u043e\u0439 \u043a\u0440\u0435\u0434\u0438\u0442\u043d','\u043f\u043b\u043e\u0445\u0430\u044f \u043a\u0440\u0435\u0434\u0438\u0442\u043d']))service_hint='credit_after_refusals';\n else service_hint='credit_broker';\n let probable_need='';\n if(!isIrrelevant){\n if(service_hint==='credit_after_refusals')probable_need='\u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043a\u0440\u0435\u0434\u0438\u0442 \u043f\u043e\u0441\u043b\u0435 \u043e\u0442\u043a\u0430\u0437\u043e\u0432 / \u0441 \u043f\u043b\u043e\u0445\u043e\u0439 \u041a\u0418';\n else if(service_hint==='business_credit')probable_need='\u0444\u0438\u043d\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u043b\u044f \u0431\u0438\u0437\u043d\u0435\u0441\u0430 (\u0418\u041f/\u041e\u041e\u041e)';\n else if(service_hint==='mortgage_refinance')probable_need='\u0438\u043f\u043e\u0442\u0435\u043a\u0430 / \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\u0438';\n else probable_need='\u043f\u043e\u043c\u043e\u0449\u044c \u0432 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0438 \u043a\u0440\u0435\u0434\u0438\u0442\u0430';\n }\n const semantic_keywords=isIrrelevant?'':extractKeywords(kwBlob);\n const offer_short=cut(title+(price?(' \u2014 '+price):''),140);\n const _isCard=(record_type_hint==='source_candidate');\n // \u00a713/Obj2 explicit per-record observability for WF16 classification.\n var _qf=[];\n if(detail_fetch_required){_qf.push('search_card');_qf.push('no_detail_record');}\n if(placeholder_title)_qf.push('placeholder_title');\n if(seller_name==='')_qf.push('missing_seller_identity');\n if(description==='')_qf.push('missing_description');\n if(published_at==='')_qf.push('missing_published_at');\n if(hard_skip)_qf.push('hard_skip_irrelevant');\n if(isIrrelevant)_qf.push('irrelevant');\n const quality_flags=_qf.join('; ');\n const activity_subtype=_isCard?'classified_search_card':(competitor_related?'classified_direct_offer':(record_type_hint==='market_signal'?'classified_market_signal':(isIrrelevant?'irrelevant_listing':'classified_offer')));\n const skip_reason=_isCard?'detail_enrichment_required':(hard_skip?'irrelevant_no_listing_evidence':(record_type_hint==='irrelevant'?'irrelevant_control':''));\n const manager_note=isIrrelevant\n ? ('Avito/classified: \u043d\u0435\u0440\u0435\u043b\u0435\u0432\u0430\u043d\u0442\u043d\u043e\u0435 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0435 ('+relevance_reason+'), \u043f\u0440\u043e\u043f\u0443\u0441\u043a.')\n : (_isCard\n ? ('Avito search card (isDetail=false/placeholder) \u2014 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f detail-enrichment \u043f\u0435\u0440\u0435\u0434 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u043e\u043c \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u0430; offer \u043d\u0435 \u0441\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d.')\n : '\u041e\u0444\u0444\u0435\u0440 \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u0430: '+offer_short+(price?(' | \u0446\u0435\u043d\u0430: '+price):' | \u0446\u0435\u043d\u0430: \u043d\u0435 \u0443\u043a\u0430\u0437\u0430\u043d\u0430')+' | \u0443\u0441\u043b\u043e\u0432\u0438\u044f/\u0441\u0435\u043c\u0430\u043d\u0442\u0438\u043a\u0430: '+(semantic_keywords||'\u2014')+' | \u043f\u043b\u043e\u0449\u0430\u0434\u043a\u0430/\u043a\u0430\u043d\u0430\u043b: Avito (classifieds).');\n const text_context=cut('Avito \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0435: '+title+(price?(' | \u0446\u0435\u043d\u0430: '+price):'')+' | '+location+(seller_name?(' | \u043f\u0440\u043e\u0434\u0430\u0432\u0435\u0446: '+seller_name):'')+(description?(' | '+description):'')+' | \u0437\u0430\u043f\u0440\u043e\u0441: '+query, 1200);\n const text_hash=hashText(low(title)+'||'+low(description)+'||'+low(price));\n let basekey;\n if(listing_id)basekey='avito_listing_'+listing_id;\n else basekey='avito_url_'+hashText(url||text_context);\n const dedup_key=low(cfg.platform||'avito')+'::'+low(cfg.source_type||'classified')+'::'+basekey;\n out.push({ json: {\n source_type:low(cfg.source_type)||'classified',\n platform:low(cfg.platform)||'avito',\n source_url:url,\n post_url:url,\n profile_url:seller_url,\n profile_name:seller_name,\n author_handle:'',\n seller_name:seller_name,
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
09 - Avito Classifieds Listing Connector. Uses httpRequest, googleSheets, executeWorkflowTrigger. Event-driven trigger; 24 nodes.
Source: https://github.com/CodeVinci8/vinci-ai-pilot/blob/main/n8n/workflows/09_avito_classifieds_listing_connector.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.
12 - Market Intelligence Report Builder (Stakeholder v0.3). Uses googleSheets, httpRequest, executeWorkflowTrigger. Event-driven trigger; 27 nodes.
Google Maps Email Scraper Template. Uses removeDuplicates, splitInBatches, httpRequest, splitOut. Event-driven trigger; 26 nodes.
Email Scapper. Uses httpRequest, googleSheets, executeWorkflowTrigger. Event-driven trigger; 26 nodes.
This workflow takes a list of Google Maps search queries, extracts candidate business website URLs from the search results, visits each site, scrapes email addresses from the page content, and appends
ITHome比賽進程. Uses httpRequest, googleSheets, executeWorkflowTrigger, n8n. Event-driven trigger; 25 nodes.