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.
NDA Import. Uses httpRequest, googleSheets, jira, executeWorkflowTrigger. Event-driven trigger; 30 nodes.
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